@almoamendev/ngx-md3 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, booleanAttribute, effect, Directive, inject, signal, computed,
|
|
2
|
+
import { input, booleanAttribute, effect, Directive, inject, signal, computed, Injectable, untracked, InjectionToken, viewChild, NgZone, ElementRef, Component, ViewChild, isDevMode, ViewContainerRef, Injector, numberAttribute, HostListener, model, contentChild, contentChildren, PLATFORM_ID, afterNextRender, output, HostBinding, TemplateRef } from '@angular/core';
|
|
3
3
|
import { DOCUMENT, isPlatformBrowser, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
4
4
|
import { BreakpointObserver } from '@angular/cdk/layout';
|
|
5
5
|
import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
6
|
+
import { fromEvent, startWith, map, filter, Subscription, Subject, take, takeUntil, merge } from 'rxjs';
|
|
6
7
|
import * as i1 from '@angular/router';
|
|
7
8
|
import { Router, NavigationEnd, RouterLinkActive } from '@angular/router';
|
|
8
|
-
import { fromEvent, startWith, map, filter, Subscription, Subject, take, takeUntil, merge } from 'rxjs';
|
|
9
9
|
import { CdkPortalOutlet, ComponentPortal } from '@angular/cdk/portal';
|
|
10
10
|
import { CdkDialogContainer, Dialog as Dialog$1 } from '@angular/cdk/dialog';
|
|
11
11
|
import { Overlay, OverlayContainer, OverlayConfig } from '@angular/cdk/overlay';
|
|
@@ -220,12 +220,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
220
220
|
}]
|
|
221
221
|
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], emphasized: [{ type: i0.Input, args: [{ isSignal: true, alias: "emphasized", required: false }] }] } });
|
|
222
222
|
|
|
223
|
-
|
|
223
|
+
/**
|
|
224
|
+
* The state of the window and of the document, for the whole application.
|
|
225
|
+
*
|
|
226
|
+
* This service is a singleton on purpose. A layout region can appear more than once — a page
|
|
227
|
+
* scaffold, and a contained layout inside a full screen dialog — and each one keeps its own
|
|
228
|
+
* scroll and inset state in its own {@link LayoutService}. The window size, the breakpoints,
|
|
229
|
+
* the reading direction and the color scheme belong to the document, so they live here and
|
|
230
|
+
* every layout reads the same values.
|
|
231
|
+
*/
|
|
232
|
+
class ViewportService {
|
|
224
233
|
document = inject(DOCUMENT);
|
|
225
234
|
breakpointObserver = inject(BreakpointObserver);
|
|
226
|
-
// Optional — LayoutService (and anything built on Scaffold) shouldn't
|
|
227
|
-
// hard-require the Router, only benefit from it when it's present.
|
|
228
|
-
router = inject(Router, { optional: true });
|
|
229
235
|
widthQueries = {
|
|
230
236
|
'compact': '(max-width: 37.499em)', // < 600
|
|
231
237
|
'medium': '(min-width: 37.5em) and (max-width: 52.499em)', // 600-839
|
|
@@ -238,53 +244,6 @@ class LayoutService {
|
|
|
238
244
|
'medium': '(min-height: 30em) and (max-height: 56.249em)',
|
|
239
245
|
'expanded': '(min-height: 56.25em)'
|
|
240
246
|
};
|
|
241
|
-
mainPaneSub;
|
|
242
|
-
mainPaneEl;
|
|
243
|
-
panesContainerResizeObserver;
|
|
244
|
-
panesContainerResizeListener;
|
|
245
|
-
/** Floating bars currently registered, keyed by the measured element. */
|
|
246
|
-
floatingBars = new Map();
|
|
247
|
-
/** How far the main pane must move before the scroll direction flips. Stops jitter. */
|
|
248
|
-
static scrollDirectionThreshold = 64;
|
|
249
|
-
scrollPosition = 0;
|
|
250
|
-
mainScrollTop = signal(0, /* @ts-ignore */
|
|
251
|
-
...(ngDevMode ? [{ debugName: "mainScrollTop" }] : /* istanbul ignore next */ []));
|
|
252
|
-
mainIsScrolled = computed(() => this.mainScrollTop() > 0, /* @ts-ignore */
|
|
253
|
-
...(ngDevMode ? [{ debugName: "mainIsScrolled" }] : /* istanbul ignore next */ []));
|
|
254
|
-
/**
|
|
255
|
-
* True while the main pane moves down, false while it moves up. A small threshold keeps
|
|
256
|
-
* a jitter from flipping the value. Components that react to scrolling — the app bar and
|
|
257
|
-
* the toolbar — read this, so they can never disagree.
|
|
258
|
-
*/
|
|
259
|
-
isScrollingDown = signal(false, /* @ts-ignore */
|
|
260
|
-
...(ngDevMode ? [{ debugName: "isScrollingDown" }] : /* istanbul ignore next */ []));
|
|
261
|
-
/**
|
|
262
|
-
* Distance, in pixels, between the viewport bottom and the bottom edge of
|
|
263
|
-
* the scaffold's .md3-panes-container — i.e. whatever the bottom scaffold
|
|
264
|
-
* bar (nav bar) currently reserves, or 0 when there is none. Overlay-based
|
|
265
|
-
* components anchored to the viewport bottom (like Snackbar) read this so
|
|
266
|
-
* they never render lower than the panes container.
|
|
267
|
-
*/
|
|
268
|
-
bottomInset = signal(0, /* @ts-ignore */
|
|
269
|
-
...(ngDevMode ? [{ debugName: "bottomInset" }] : /* istanbul ignore next */ []));
|
|
270
|
-
/**
|
|
271
|
-
* Space a floating scaffold bar covers but does not reserve, per logical block side.
|
|
272
|
-
*
|
|
273
|
-
* A floating toolbar in a bar region leaves the layout flow, so its grid track collapses
|
|
274
|
-
* and the content flows under it. This signal reports what it covers, so the scaffold can
|
|
275
|
-
* pad the main pane and overlays can stay clear of it.
|
|
276
|
-
*
|
|
277
|
-
* A floating toolbar in a *rail* region stays in the flow and reserves its own space, so
|
|
278
|
-
* it never appears here.
|
|
279
|
-
*/
|
|
280
|
-
floatingInset = signal({ blockStart: 0, blockEnd: 0 }, /* @ts-ignore */
|
|
281
|
-
...(ngDevMode ? [{ debugName: "floatingInset" }] : /* istanbul ignore next */ []));
|
|
282
|
-
/**
|
|
283
|
-
* The distance from the viewport bottom that a viewport-anchored overlay must keep clear.
|
|
284
|
-
* It covers both the reserved bottom bar and any floating bottom bar over it.
|
|
285
|
-
*/
|
|
286
|
-
bottomSafeInset = computed(() => this.bottomInset() + this.floatingInset().blockEnd, /* @ts-ignore */
|
|
287
|
-
...(ngDevMode ? [{ debugName: "bottomSafeInset" }] : /* istanbul ignore next */ []));
|
|
288
247
|
viewport = toSignal(fromEvent(window, 'resize').pipe(startWith(null), map(() => ({
|
|
289
248
|
width: window.innerWidth,
|
|
290
249
|
height: window.innerHeight
|
|
@@ -353,27 +312,120 @@ class LayoutService {
|
|
|
353
312
|
darkMode = signal(true, /* @ts-ignore */
|
|
354
313
|
...(ngDevMode ? [{ debugName: "darkMode" }] : /* istanbul ignore next */ []));
|
|
355
314
|
constructor() {
|
|
356
|
-
// Keep the scroll direction in step with the position. Anything that writes
|
|
357
|
-
// mainScrollTop drives it, so the app bar and the toolbar always agree.
|
|
358
|
-
effect(() => {
|
|
359
|
-
this.updateScrollDirection(this.mainScrollTop());
|
|
360
|
-
});
|
|
361
315
|
effect(() => {
|
|
362
316
|
const darkMode = this.darkMode();
|
|
363
317
|
this.document.body.classList.toggle('md-scheme-dark', darkMode);
|
|
364
318
|
this.document.body.classList.toggle('md-scheme-light', !darkMode);
|
|
365
319
|
});
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
320
|
+
}
|
|
321
|
+
setDirection(direction) {
|
|
322
|
+
this.document.documentElement.dir = direction;
|
|
323
|
+
this.direction.set(direction);
|
|
324
|
+
}
|
|
325
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ViewportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
326
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ViewportService, providedIn: 'root' });
|
|
327
|
+
}
|
|
328
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ViewportService, decorators: [{
|
|
329
|
+
type: Injectable,
|
|
330
|
+
args: [{
|
|
331
|
+
providedIn: 'root'
|
|
332
|
+
}]
|
|
333
|
+
}], ctorParameters: () => [] });
|
|
334
|
+
|
|
335
|
+
/**
|
|
336
|
+
* The state of one layout container: what its main pane scrolls, and what its floating bars
|
|
337
|
+
* cover.
|
|
338
|
+
*
|
|
339
|
+
* The service is provided at the root, and the page scaffold uses that root instance. A
|
|
340
|
+
* contained layout — `md3-layout`, the one a full screen dialog holds — provides its own
|
|
341
|
+
* instance instead, so a toolbar inside it reads the scroll and the insets of that layout and
|
|
342
|
+
* never of the page behind it.
|
|
343
|
+
*
|
|
344
|
+
* The window size, the breakpoints, the reading direction and the color scheme belong to the
|
|
345
|
+
* document, not to a container. They live in {@link ViewportService}, and every instance of
|
|
346
|
+
* this service exposes the same signals, so an instance stays a complete view of the layout.
|
|
347
|
+
*/
|
|
348
|
+
class LayoutService {
|
|
349
|
+
viewportService = inject(ViewportService);
|
|
350
|
+
// Optional — LayoutService (and anything built on Scaffold) shouldn't
|
|
351
|
+
// hard-require the Router, only benefit from it when it's present.
|
|
352
|
+
router = inject(Router, { optional: true });
|
|
353
|
+
mainPaneSub;
|
|
354
|
+
mainPaneEl;
|
|
355
|
+
panesContainerResizeObserver;
|
|
356
|
+
panesContainerResizeListener;
|
|
357
|
+
/** Floating bars currently registered, keyed by the measured element. */
|
|
358
|
+
floatingBars = new Map();
|
|
359
|
+
/** How far the main pane must move before the scroll direction flips. Stops jitter. */
|
|
360
|
+
static scrollDirectionThreshold = 64;
|
|
361
|
+
scrollPosition = 0;
|
|
362
|
+
mainScrollTop = signal(0, /* @ts-ignore */
|
|
363
|
+
...(ngDevMode ? [{ debugName: "mainScrollTop" }] : /* istanbul ignore next */ []));
|
|
364
|
+
mainIsScrolled = computed(() => this.mainScrollTop() > 0, /* @ts-ignore */
|
|
365
|
+
...(ngDevMode ? [{ debugName: "mainIsScrolled" }] : /* istanbul ignore next */ []));
|
|
366
|
+
/**
|
|
367
|
+
* True while the main pane moves down, false while it moves up. A small threshold keeps
|
|
368
|
+
* a jitter from flipping the value. Components that react to scrolling — the app bar and
|
|
369
|
+
* the toolbar — read this, so they can never disagree.
|
|
370
|
+
*/
|
|
371
|
+
isScrollingDown = signal(false, /* @ts-ignore */
|
|
372
|
+
...(ngDevMode ? [{ debugName: "isScrollingDown" }] : /* istanbul ignore next */ []));
|
|
373
|
+
/**
|
|
374
|
+
* Distance, in pixels, between the bottom of the container and the bottom edge of
|
|
375
|
+
* the .md3-panes-container — i.e. whatever the bottom bar currently reserves, or 0 when
|
|
376
|
+
* there is none. Overlay-based components anchored to the bottom (like Snackbar) read
|
|
377
|
+
* this so they never render lower than the panes container.
|
|
378
|
+
*/
|
|
379
|
+
bottomInset = signal(0, /* @ts-ignore */
|
|
380
|
+
...(ngDevMode ? [{ debugName: "bottomInset" }] : /* istanbul ignore next */ []));
|
|
381
|
+
/**
|
|
382
|
+
* Space a floating bar covers but does not reserve, per logical block side.
|
|
383
|
+
*
|
|
384
|
+
* A floating toolbar in a bar region leaves the layout flow, so its grid track collapses
|
|
385
|
+
* and the content flows under it. This signal reports what it covers, so the layout can
|
|
386
|
+
* pad the main pane and overlays can stay clear of it.
|
|
387
|
+
*
|
|
388
|
+
* A floating toolbar in a *rail* region stays in the flow and reserves its own space, so
|
|
389
|
+
* it never appears here.
|
|
390
|
+
*/
|
|
391
|
+
floatingInset = signal({ blockStart: 0, blockEnd: 0 }, /* @ts-ignore */
|
|
392
|
+
...(ngDevMode ? [{ debugName: "floatingInset" }] : /* istanbul ignore next */ []));
|
|
393
|
+
/**
|
|
394
|
+
* The distance from the bottom that an anchored overlay must keep clear. It covers both
|
|
395
|
+
* the reserved bottom bar and any floating bottom bar over it.
|
|
396
|
+
*/
|
|
397
|
+
bottomSafeInset = computed(() => this.bottomInset() + this.floatingInset().blockEnd, /* @ts-ignore */
|
|
398
|
+
...(ngDevMode ? [{ debugName: "bottomSafeInset" }] : /* istanbul ignore next */ []));
|
|
399
|
+
// The state of the window and of the document. It is shared by every layout, so these are
|
|
400
|
+
// the same signals on every instance of this service.
|
|
401
|
+
viewport = this.viewportService.viewport;
|
|
402
|
+
widthClass = this.viewportService.widthClass;
|
|
403
|
+
heightClass = this.viewportService.heightClass;
|
|
404
|
+
direction = this.viewportService.direction;
|
|
405
|
+
isCompact = this.viewportService.isCompact;
|
|
406
|
+
isMedium = this.viewportService.isMedium;
|
|
407
|
+
isExpanded = this.viewportService.isExpanded;
|
|
408
|
+
isLarge = this.viewportService.isLarge;
|
|
409
|
+
isExtraLarge = this.viewportService.isExtraLarge;
|
|
410
|
+
isPortrait = this.viewportService.isPortrait;
|
|
411
|
+
isLandscape = this.viewportService.isLandscape;
|
|
412
|
+
preferredNavigationMode = this.viewportService.preferredNavigationMode;
|
|
413
|
+
darkMode = this.viewportService.darkMode;
|
|
414
|
+
constructor() {
|
|
415
|
+
// Keep the scroll direction in step with the position. Anything that writes
|
|
416
|
+
// mainScrollTop drives it, so the app bar and the toolbar always agree.
|
|
417
|
+
effect(() => {
|
|
418
|
+
this.updateScrollDirection(this.mainScrollTop());
|
|
419
|
+
});
|
|
420
|
+
// Reset the main pane to the top after every completed navigation — otherwise a
|
|
421
|
+
// scrolled-down list page leaves the next page's content scrolled down too, since the
|
|
422
|
+
// pane itself never remounts on route change.
|
|
370
423
|
this.router?.events
|
|
371
424
|
.pipe(filter((event) => event instanceof NavigationEnd), takeUntilDestroyed())
|
|
372
425
|
.subscribe(() => this.scrollMainPaneToTop());
|
|
373
426
|
}
|
|
374
427
|
setDirection(direction) {
|
|
375
|
-
this.
|
|
376
|
-
this.direction.set(direction);
|
|
428
|
+
this.viewportService.setDirection(direction);
|
|
377
429
|
}
|
|
378
430
|
scrollMainPaneToTop() {
|
|
379
431
|
this.mainPaneEl?.scrollTo({ top: 0 });
|
|
@@ -422,7 +474,8 @@ class LayoutService {
|
|
|
422
474
|
this.unregisterPanesContainer();
|
|
423
475
|
const update = () => {
|
|
424
476
|
const rect = element.getBoundingClientRect();
|
|
425
|
-
|
|
477
|
+
const bottom = element.ownerDocument.defaultView?.innerHeight ?? 0;
|
|
478
|
+
this.bottomInset.set(Math.max(0, Math.round(bottom - rect.bottom)));
|
|
426
479
|
};
|
|
427
480
|
update();
|
|
428
481
|
this.panesContainerResizeObserver = new ResizeObserver(update);
|
|
@@ -431,10 +484,10 @@ class LayoutService {
|
|
|
431
484
|
window.addEventListener('resize', update, { passive: true });
|
|
432
485
|
}
|
|
433
486
|
/**
|
|
434
|
-
* Register a floating bar so the
|
|
487
|
+
* Register a floating bar so the layout and the overlays know what it covers.
|
|
435
488
|
*
|
|
436
|
-
* Call this for a floating toolbar in a
|
|
437
|
-
*
|
|
489
|
+
* Call this for a floating toolbar in a *bar* region only. A rail region keeps the toolbar
|
|
490
|
+
* in the layout flow, so it reserves its space and needs no inset.
|
|
438
491
|
*/
|
|
439
492
|
registerFloatingBar(element, side) {
|
|
440
493
|
this.unregisterFloatingBar(element);
|
|
@@ -2006,15 +2059,54 @@ class Scaffold {
|
|
|
2006
2059
|
this.layout.unregisterPanesContainer();
|
|
2007
2060
|
}
|
|
2008
2061
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Scaffold, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2009
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: Scaffold, isStandalone: true, selector: "md3-scaffold", viewQueries: [{ propertyName: "startOutlet", first: true, predicate: ["startOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "endOutlet", first: true, predicate: ["endOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "bottomOutlet", first: true, predicate: ["bottomOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "panesContainer", first: true, predicate: ["panesContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{
|
|
2062
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: Scaffold, isStandalone: true, selector: "md3-scaffold", viewQueries: [{ propertyName: "startOutlet", first: true, predicate: ["startOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "endOutlet", first: true, predicate: ["endOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "bottomOutlet", first: true, predicate: ["bottomOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "panesContainer", first: true, predicate: ["panesContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{width:100%;height:100dvh;display:grid;min-height:0em;overflow:hidden;grid-template-areas:\"top top top\" \"start content end\" \"start sheet end\" \"bottom bottom bottom\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto minmax(0,1fr) auto auto}:host .md3-bar-region{display:flex;flex-direction:column;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:visible;z-index:2}:host .md3-bar-region.md3-bar-region-top{grid-area:top}:host .md3-bar-region.md3-bar-region-bottom{grid-area:bottom}:host ::ng-deep [md3-scaffold-bar=top],:host ::ng-deep [md3-scaffold-bar=bottom]{min-width:0em;min-height:0em;overflow:hidden}:host ::ng-deep [md3-scaffold-rail=leading]{grid-area:start;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-rail=trailing]{grid-area:end;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-bar].md3-floating-region,:host ::ng-deep [md3-scaffold-rail].md3-floating-region{overflow:visible}:host .md3-bottom-sheet-region{grid-area:sheet;justify-self:stretch;min-width:0em;height:0em;position:relative;overflow:visible;z-index:4}:host .md3-panes-container{--background-color: rgb(var(--md-scheme-surface));--foreground-color: rgb(var(--md-scheme-on-surface));grid-area:content;min-width:0em;min-height:0em;overflow:hidden;background-color:var(--background-color);color:var(--foreground-color);display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
|
|
2010
2063
|
}
|
|
2011
2064
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Scaffold, decorators: [{
|
|
2012
2065
|
type: Component,
|
|
2013
2066
|
args: [{ selector: 'md3-scaffold', imports: [
|
|
2014
2067
|
CdkPortalOutlet,
|
|
2015
|
-
], template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{
|
|
2068
|
+
], template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{width:100%;height:100dvh;display:grid;min-height:0em;overflow:hidden;grid-template-areas:\"top top top\" \"start content end\" \"start sheet end\" \"bottom bottom bottom\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto minmax(0,1fr) auto auto}:host .md3-bar-region{display:flex;flex-direction:column;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:visible;z-index:2}:host .md3-bar-region.md3-bar-region-top{grid-area:top}:host .md3-bar-region.md3-bar-region-bottom{grid-area:bottom}:host ::ng-deep [md3-scaffold-bar=top],:host ::ng-deep [md3-scaffold-bar=bottom]{min-width:0em;min-height:0em;overflow:hidden}:host ::ng-deep [md3-scaffold-rail=leading]{grid-area:start;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-rail=trailing]{grid-area:end;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-bar].md3-floating-region,:host ::ng-deep [md3-scaffold-rail].md3-floating-region{overflow:visible}:host .md3-bottom-sheet-region{grid-area:sheet;justify-self:stretch;min-width:0em;height:0em;position:relative;overflow:visible;z-index:4}:host .md3-panes-container{--background-color: rgb(var(--md-scheme-surface));--foreground-color: rgb(var(--md-scheme-on-surface));grid-area:content;min-width:0em;min-height:0em;overflow:hidden;background-color:var(--background-color);color:var(--foreground-color);display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"] }]
|
|
2016
2069
|
}], ctorParameters: () => [], propDecorators: { startOutlet: [{ type: i0.ViewChild, args: ['startOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }], endOutlet: [{ type: i0.ViewChild, args: ['endOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }], bottomOutlet: [{ type: i0.ViewChild, args: ['bottomOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }], panesContainer: [{ type: i0.ViewChild, args: ['panesContainer', { isSignal: true }] }] } });
|
|
2017
2070
|
|
|
2071
|
+
/**
|
|
2072
|
+
* A layout region shell that fills its parent instead of the window.
|
|
2073
|
+
*
|
|
2074
|
+
* It places the same regions as `md3-scaffold` — the bar rows, the rail columns and the three
|
|
2075
|
+
* panes — so the same region attributes work inside it:
|
|
2076
|
+
*
|
|
2077
|
+
* ```html
|
|
2078
|
+
* <md3-layout>
|
|
2079
|
+
* <md3-toolbar md3-scaffold-bar="bottom" toolbar-type="floating">...</md3-toolbar>
|
|
2080
|
+
*
|
|
2081
|
+
* <div md3-scaffold-pane="main">...</div>
|
|
2082
|
+
* </md3-layout>
|
|
2083
|
+
* ```
|
|
2084
|
+
*
|
|
2085
|
+
* Use it wherever a page-sized scaffold does not fit: the content of a full screen dialog, a
|
|
2086
|
+
* card, a preview pane. A full screen dialog is the common one, because a toolbar needs a bar
|
|
2087
|
+
* or a rail region and the dialog shell has none of its own.
|
|
2088
|
+
*
|
|
2089
|
+
* The layout provides its own {@link LayoutService}, so everything inside it reads the scroll
|
|
2090
|
+
* position and the floating insets of *this* container. A floating toolbar therefore pads the
|
|
2091
|
+
* main pane of the layout, and `scroll-action` follows the pane of the layout — never the page
|
|
2092
|
+
* behind it. The window size, the breakpoints, the reading direction and the color scheme stay
|
|
2093
|
+
* shared with the rest of the application.
|
|
2094
|
+
*/
|
|
2095
|
+
class Layout extends Scaffold {
|
|
2096
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Layout, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
2097
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: Layout, isStandalone: true, selector: "md3-layout", providers: [
|
|
2098
|
+
LayoutService,
|
|
2099
|
+
], usesInheritance: true, ngImport: i0, template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{width:100%;height:100%;display:grid;min-height:0em;overflow:hidden;grid-template-areas:\"top top top\" \"start content end\" \"start sheet end\" \"bottom bottom bottom\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto minmax(0,1fr) auto auto}:host .md3-bar-region{display:flex;flex-direction:column;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:visible;z-index:2}:host .md3-bar-region.md3-bar-region-top{grid-area:top}:host .md3-bar-region.md3-bar-region-bottom{grid-area:bottom}:host ::ng-deep [md3-scaffold-bar=top],:host ::ng-deep [md3-scaffold-bar=bottom]{min-width:0em;min-height:0em;overflow:hidden}:host ::ng-deep [md3-scaffold-rail=leading]{grid-area:start;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-rail=trailing]{grid-area:end;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-bar].md3-floating-region,:host ::ng-deep [md3-scaffold-rail].md3-floating-region{overflow:visible}:host .md3-bottom-sheet-region{grid-area:sheet;justify-self:stretch;min-width:0em;height:0em;position:relative;overflow:visible;z-index:4}:host .md3-panes-container{--background-color: rgb(var(--md-scheme-surface));--foreground-color: rgb(var(--md-scheme-on-surface));grid-area:content;min-width:0em;min-height:0em;overflow:hidden;background-color:var(--background-color);color:var(--foreground-color);display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
|
|
2100
|
+
}
|
|
2101
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Layout, decorators: [{
|
|
2102
|
+
type: Component,
|
|
2103
|
+
args: [{ selector: 'md3-layout', imports: [
|
|
2104
|
+
CdkPortalOutlet,
|
|
2105
|
+
], providers: [
|
|
2106
|
+
LayoutService,
|
|
2107
|
+
], template: "<div class=\"md3-bar-region md3-bar-region-top\">\n <ng-content select=\"[md3-scaffold-bar=top]\"></ng-content>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=leading]\"></ng-content>\n\n<div class=\"md3-panes-container\" #panesContainer>\n <div class=\"md3-pane md3-pane-start\">\n <ng-content select=\"[md3-scaffold-pane=start]\"></ng-content>\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-main\">\n <ng-content select=\"[md3-scaffold-pane=main]\"></ng-content>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-content select=\"[md3-scaffold-pane=end]\"></ng-content>\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n</div>\n\n<!-- Standard bottom sheets dock here, between the content and the bottom bar. The region\n measures zero until one opens, so it reserves nothing the rest of the time. -->\n<div class=\"md3-bottom-sheet-region\">\n <ng-template #bottomOutlet cdkPortalOutlet></ng-template>\n</div>\n\n<ng-content select=\"[md3-scaffold-rail=trailing]\"></ng-content>\n\n<div class=\"md3-bar-region md3-bar-region-bottom\">\n <ng-content select=\"[md3-scaffold-bar=bottom]\"></ng-content>\n</div>", styles: [":host{width:100%;height:100%;display:grid;min-height:0em;overflow:hidden;grid-template-areas:\"top top top\" \"start content end\" \"start sheet end\" \"bottom bottom bottom\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:auto minmax(0,1fr) auto auto}:host .md3-bar-region{display:flex;flex-direction:column;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:visible;z-index:2}:host .md3-bar-region.md3-bar-region-top{grid-area:top}:host .md3-bar-region.md3-bar-region-bottom{grid-area:bottom}:host ::ng-deep [md3-scaffold-bar=top],:host ::ng-deep [md3-scaffold-bar=bottom]{min-width:0em;min-height:0em;overflow:hidden}:host ::ng-deep [md3-scaffold-rail=leading]{grid-area:start;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-rail=trailing]{grid-area:end;justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;overflow:hidden;z-index:3}:host ::ng-deep [md3-scaffold-bar].md3-floating-region,:host ::ng-deep [md3-scaffold-rail].md3-floating-region{overflow:visible}:host .md3-bottom-sheet-region{grid-area:sheet;justify-self:stretch;min-width:0em;height:0em;position:relative;overflow:visible;z-index:4}:host .md3-panes-container{--background-color: rgb(var(--md-scheme-surface));--foreground-color: rgb(var(--md-scheme-on-surface));grid-area:content;min-width:0em;min-height:0em;overflow:hidden;background-color:var(--background-color);color:var(--foreground-color);display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0em;min-height:0em;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"] }]
|
|
2108
|
+
}] });
|
|
2109
|
+
|
|
2018
2110
|
class ScaffoldBar {
|
|
2019
2111
|
region = input.required({ ...(ngDevMode ? { debugName: "region" } : /* istanbul ignore next */ {}), alias: 'md3-scaffold-bar' });
|
|
2020
2112
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: ScaffoldBar, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
@@ -4832,69 +4924,275 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
4832
4924
|
args: [{ selector: 'md3-circular-progress-indicator', imports: [], template: "<div class=\"md3-indicator-container\" [class.md3-thickness-8dp]=\"thickness() == 8\" [class.md3-indeterminate]=\"indeterminate()\" [style.--progress]=\"progressValue()\">\n <svg class=\"md3-circlar-indicator\">\n <circle class=\"md3-track\" pathLength=\"100\"></circle>\n <circle class=\"md3-active-indicator\" pathLength=\"100\"></circle>\n </svg>\n</div>", styles: [":host{display:inline-flex}:host .md3-indicator-container{font-size:.25rem;--gap: 7;--progress: 0}:host .md3-indicator-container.md3-thickness-8dp{font-size:.5rem;--gap: 10}:host .md3-indicator-container{--indicator-color: rgb(var(--md-scheme-primary));--track-color: rgb(var(--md-scheme-primary-container));--size: calc(2.25rem + 1em) ;--stroke: 1em;--center: calc(var(--size) / 2);--radius: calc(var(--size) / 2 - var(--stroke) / 2);--track-arc: calc(100 - var(--progress));display:inline-block;width:var(--size);height:var(--size)}:host .md3-indicator-container .md3-circlar-indicator{display:block;width:var(--size);height:var(--size);shape-rendering:geometricprecision}:host .md3-indicator-container .md3-track,:host .md3-indicator-container .md3-active-indicator{fill:none;stroke-width:var(--stroke);stroke-linecap:round;cx:var(--center);cy:var(--center);r:var(--radius);transform-origin:center;transform:rotate(-90deg);transition:stroke-dasharray var(--md-motion-standard-fast-effects-duration) var(--md-motion-standard-fast-effects-easing),stroke-dashoffset var(--md-motion-standard-fast-effects-duration) var(--md-motion-standard-fast-effects-easing)}:host .md3-indicator-container .md3-track{--track-length: calc(var(--track-arc) - var(--gap) * 2);stroke:var(--track-color);stroke-dasharray:var(--track-length) calc(100 - var(--track-length));stroke-dashoffset:calc(var(--track-arc) - var(--gap))}:host .md3-indicator-container .md3-active-indicator{stroke:var(--indicator-color);stroke-dasharray:var(--progress) calc(100 - var(--progress))}:host .md3-indicator-container.md3-indeterminate{animation:container-rotate calc(var(--md-motion-standard-slow-effects-duration) * 5) linear infinite}:host .md3-indicator-container.md3-indeterminate .md3-circlar-indicator{animation:indicator-track-rotate calc(var(--md-motion-standard-slow-effects-duration) * 8) var(--md-motion-standard-slow-effects-easing) infinite}:host .md3-indicator-container.md3-indeterminate .md3-circlar-indicator .md3-track{stroke-dashoffset:92;animation:track-fill calc(var(--md-motion-standard-slow-effects-duration) * 8) var(--md-motion-standard-slow-effects-easing) infinite}:host .md3-indicator-container.md3-indeterminate .md3-circlar-indicator .md3-active-indicator{stroke-dashoffset:0;animation:indicator-fill calc(var(--md-motion-standard-slow-effects-duration) * 8) var(--md-motion-standard-slow-effects-easing) infinite}:host .md3-indicator-container.md3-indeterminate.md3-thickness-8dp .md3-circlar-indicator .md3-track{stroke-dashoffset:90;animation:track-fill-8dp calc(var(--md-motion-standard-slow-effects-duration) * 8) var(--md-motion-standard-slow-effects-easing) infinite}@keyframes container-rotate{to{transform:rotate(360deg)}}@keyframes indicator-track-rotate{0%{transform:rotate(0)}30%{transform:rotate(0)}50%{transform:rotate(180deg)}80%{transform:rotate(180deg)}to{transform:rotate(360deg)}}@keyframes track-fill{0%{stroke-dasharray:84 16;stroke-dashoffset:92}30%{stroke-dasharray:34 66;stroke-dashoffset:42}50%{stroke-dasharray:84 24;stroke-dashoffset:100}80%{stroke-dasharray:34 66;stroke-dashoffset:42}to{stroke-dasharray:84 16;stroke-dashoffset:92}}@keyframes track-fill-8dp{0%{stroke-dasharray:80 20;stroke-dashoffset:90}30%{stroke-dasharray:30 70;stroke-dashoffset:40}50%{stroke-dasharray:80 20;stroke-dashoffset:90}80%{stroke-dasharray:30 70;stroke-dashoffset:40}to{stroke-dasharray:80 20;stroke-dashoffset:90}}@keyframes indicator-fill{0%{stroke-dasharray:0 100}30%{stroke-dasharray:50 50}50%{stroke-dasharray:0 100}80%{stroke-dasharray:50 50}to{stroke-dasharray:0 100}}\n"] }]
|
|
4833
4925
|
}], ctorParameters: () => [], propDecorators: { indeterminate: [{ type: i0.Input, args: [{ isSignal: true, alias: "indeterminate", required: false }] }], thickness: [{ type: i0.Input, args: [{ isSignal: true, alias: "thickness", required: false }] }], progress: [{ type: i0.Input, args: [{ isSignal: true, alias: "progress", required: false }] }] } });
|
|
4834
4926
|
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
4850
|
-
|
|
4851
|
-
|
|
4852
|
-
|
|
4853
|
-
|
|
4854
|
-
|
|
4855
|
-
|
|
4856
|
-
|
|
4857
|
-
|
|
4858
|
-
|
|
4859
|
-
|
|
4860
|
-
|
|
4861
|
-
|
|
4862
|
-
|
|
4863
|
-
|
|
4864
|
-
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
4927
|
+
const DIALOG_DATA = new InjectionToken('MD3_DIALOG_DATA');
|
|
4928
|
+
const DIALOG_CONFIG = new InjectionToken('MD3_DIALOG_CONFIG');
|
|
4929
|
+
const DIALOG_COMPONENT = new InjectionToken('MD3_DIALOG_COMPONENT');
|
|
4930
|
+
const DIALOG_EXIT_ANIMATION_FALLBACK_MS = 300;
|
|
4931
|
+
const HIDDEN_CLASS = 'md3-dialog-hidden';
|
|
4932
|
+
class DialogRef {
|
|
4933
|
+
cdkRef;
|
|
4934
|
+
isFullScreen;
|
|
4935
|
+
closed = new Subject();
|
|
4936
|
+
closing = new Subject();
|
|
4937
|
+
hiddenChanges = new Subject();
|
|
4938
|
+
closePromise = null;
|
|
4939
|
+
closeStarted = false;
|
|
4940
|
+
closeSettled = false;
|
|
4941
|
+
hidden = false;
|
|
4942
|
+
/** Shell hosting the dialog: the regular dialog or the full screen one. */
|
|
4943
|
+
dialogInstance;
|
|
4944
|
+
/**
|
|
4945
|
+
* Filled by DialogService after the user component is attached. Keeping the
|
|
4946
|
+
* instance here lets callers imperatively update inputs when that is useful.
|
|
4947
|
+
*/
|
|
4948
|
+
componentInstance;
|
|
4949
|
+
/** Overlay hosting the dialog, useful to reach the panel and the scrim. */
|
|
4950
|
+
get overlayRef() {
|
|
4951
|
+
return this.cdkRef.overlayRef;
|
|
4952
|
+
}
|
|
4953
|
+
/** Whether the dialog started closing. Such a dialog cannot be hidden or shown anymore. */
|
|
4954
|
+
get isClosing() {
|
|
4955
|
+
return this.closeStarted;
|
|
4956
|
+
}
|
|
4957
|
+
/** Whether the dialog is currently hidden, on request or behind another dialog. */
|
|
4958
|
+
get isHidden() {
|
|
4959
|
+
return this.hidden;
|
|
4960
|
+
}
|
|
4961
|
+
constructor(cdkRef, disableCloseEvents,
|
|
4962
|
+
/** Whether this reference belongs to a full screen dialog. */
|
|
4963
|
+
isFullScreen = false) {
|
|
4964
|
+
this.cdkRef = cdkRef;
|
|
4965
|
+
this.isFullScreen = isFullScreen;
|
|
4966
|
+
// Closing always goes through this reference so the exit animation can
|
|
4967
|
+
// run before the CDK disposes the overlay. Detachments triggered from
|
|
4968
|
+
// the outside (navigation, scroll strategy) still settle this ref.
|
|
4969
|
+
this.cdkRef.closed.pipe(take(1)).subscribe((result) => this.settle(result));
|
|
4970
|
+
if (!disableCloseEvents) {
|
|
4971
|
+
this.connectCloseEvents();
|
|
4875
4972
|
}
|
|
4876
|
-
|
|
4877
|
-
|
|
4878
|
-
|
|
4879
|
-
if (
|
|
4880
|
-
return
|
|
4973
|
+
}
|
|
4974
|
+
/** Closes the dialog. The promise resolves once the exit animation is done. */
|
|
4975
|
+
close(result) {
|
|
4976
|
+
if (this.closePromise) {
|
|
4977
|
+
return this.closePromise;
|
|
4881
4978
|
}
|
|
4882
|
-
|
|
4883
|
-
|
|
4884
|
-
|
|
4885
|
-
|
|
4886
|
-
|
|
4887
|
-
|
|
4888
|
-
|
|
4979
|
+
this.startClosing();
|
|
4980
|
+
this.closePromise = this.startCloseAnimation().then(() => this.cdkRef.close(result));
|
|
4981
|
+
return this.closePromise;
|
|
4982
|
+
}
|
|
4983
|
+
/**
|
|
4984
|
+
* Hides the dialog with the closing animation while keeping it alive, so
|
|
4985
|
+
* its content, form state and subscriptions survive until show() is called.
|
|
4986
|
+
* The page underneath becomes usable again while the dialog waits behind it.
|
|
4987
|
+
* The promise resolves once the dialog is out of sight.
|
|
4988
|
+
*/
|
|
4989
|
+
hide() {
|
|
4990
|
+
if (this.hidden || this.closeStarted) {
|
|
4991
|
+
return Promise.resolve();
|
|
4889
4992
|
}
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
|
|
4893
|
-
|
|
4894
|
-
|
|
4895
|
-
|
|
4896
|
-
|
|
4897
|
-
|
|
4993
|
+
this.hidden = true;
|
|
4994
|
+
this.toggleHiddenState(true);
|
|
4995
|
+
this.dialogInstance?.setActive(false);
|
|
4996
|
+
this.hiddenChanges.next(true);
|
|
4997
|
+
return this.waitForSurfaceAnimation();
|
|
4998
|
+
}
|
|
4999
|
+
/**
|
|
5000
|
+
* Brings a hidden dialog back with the opening animation. Focus moves back
|
|
5001
|
+
* into the dialog even when it was never hidden, which is what makes it
|
|
5002
|
+
* usable again once the dialog above it closes.
|
|
5003
|
+
*/
|
|
5004
|
+
show() {
|
|
5005
|
+
if (this.closeStarted) {
|
|
5006
|
+
return;
|
|
5007
|
+
}
|
|
5008
|
+
if (this.hidden) {
|
|
5009
|
+
this.hidden = false;
|
|
5010
|
+
this.toggleHiddenState(false);
|
|
5011
|
+
this.dialogInstance?.setActive(true);
|
|
5012
|
+
this.hiddenChanges.next(false);
|
|
5013
|
+
}
|
|
5014
|
+
this.dialogInstance?.recaptureFocus();
|
|
5015
|
+
}
|
|
5016
|
+
/** Emits when the dialog starts closing, before the exit animation runs. */
|
|
5017
|
+
beforeClosed() {
|
|
5018
|
+
return this.closing.asObservable();
|
|
5019
|
+
}
|
|
5020
|
+
/** Emits the new value of `isHidden` every time the dialog is hidden or shown. */
|
|
5021
|
+
hiddenChanged() {
|
|
5022
|
+
return this.hiddenChanges.asObservable();
|
|
5023
|
+
}
|
|
5024
|
+
afterClosed() {
|
|
5025
|
+
return this.closed.asObservable();
|
|
5026
|
+
}
|
|
5027
|
+
connectCloseEvents() {
|
|
5028
|
+
// The CDK config keeps `disableClose` on, so the scrim and Escape key
|
|
5029
|
+
// are handled here instead and the dialog can animate out.
|
|
5030
|
+
this.cdkRef.backdropClick.pipe(take(1)).subscribe(() => {
|
|
5031
|
+
this.cdkRef.containerInstance._closeInteractionType = 'mouse';
|
|
5032
|
+
this.close();
|
|
5033
|
+
});
|
|
5034
|
+
// A hidden dialog is not the one the Escape key is meant for, even
|
|
5035
|
+
// though the overlay it sits in is still the one receiving the event.
|
|
5036
|
+
this.cdkRef.keydownEvents.pipe(filter((event) => !this.hidden && event.key === 'Escape' && !hasModifierKey(event)), take(1)).subscribe((event) => {
|
|
5037
|
+
event.preventDefault();
|
|
5038
|
+
this.cdkRef.containerInstance._closeInteractionType = 'keyboard';
|
|
5039
|
+
this.close();
|
|
5040
|
+
});
|
|
5041
|
+
}
|
|
5042
|
+
toggleHiddenState(isHidden) {
|
|
5043
|
+
const overlayRef = this.cdkRef.overlayRef;
|
|
5044
|
+
const panel = overlayRef.overlayElement;
|
|
5045
|
+
const backdrop = overlayRef.backdropElement;
|
|
5046
|
+
panel.classList.toggle(HIDDEN_CLASS, isHidden);
|
|
5047
|
+
backdrop?.classList.toggle(HIDDEN_CLASS, isHidden);
|
|
5048
|
+
// `inert` keeps a hidden dialog out of the tab order and away from
|
|
5049
|
+
// assistive technology without removing it from the DOM.
|
|
5050
|
+
if (isHidden) {
|
|
5051
|
+
panel.setAttribute('inert', '');
|
|
5052
|
+
}
|
|
5053
|
+
else {
|
|
5054
|
+
panel.removeAttribute('inert');
|
|
5055
|
+
}
|
|
5056
|
+
}
|
|
5057
|
+
startClosing() {
|
|
5058
|
+
if (this.closeStarted) {
|
|
5059
|
+
return;
|
|
5060
|
+
}
|
|
5061
|
+
this.closeStarted = true;
|
|
5062
|
+
this.closing.next();
|
|
5063
|
+
this.closing.complete();
|
|
5064
|
+
}
|
|
5065
|
+
startCloseAnimation() {
|
|
5066
|
+
const overlayRef = this.cdkRef.overlayRef;
|
|
5067
|
+
const wasVisible = !this.hidden;
|
|
5068
|
+
overlayRef.overlayElement.classList.add('md3-dialog-closing');
|
|
5069
|
+
overlayRef.backdropElement?.classList.add('md3-dialog-closing');
|
|
5070
|
+
this.dialogInstance?.setActive(false);
|
|
5071
|
+
// A hidden dialog already played the exit animation, so there is
|
|
5072
|
+
// nothing left to transition and it can be disposed right away.
|
|
5073
|
+
return wasVisible ? this.waitForSurfaceAnimation() : Promise.resolve();
|
|
5074
|
+
}
|
|
5075
|
+
/** Resolves when the surface finished animating, with a timeout as a safety net. */
|
|
5076
|
+
waitForSurfaceAnimation() {
|
|
5077
|
+
const panel = this.cdkRef.overlayRef.overlayElement;
|
|
5078
|
+
const surface = this.dialogInstance?.surfaceElement ?? panel;
|
|
5079
|
+
return new Promise((resolve) => {
|
|
5080
|
+
let isResolved = false;
|
|
5081
|
+
let timeoutId = setTimeout(done, DIALOG_EXIT_ANIMATION_FALLBACK_MS);
|
|
5082
|
+
function done() {
|
|
5083
|
+
if (isResolved) {
|
|
5084
|
+
return;
|
|
5085
|
+
}
|
|
5086
|
+
isResolved = true;
|
|
5087
|
+
clearTimeout(timeoutId);
|
|
5088
|
+
surface.removeEventListener('transitionend', onTransitionEnd);
|
|
5089
|
+
resolve();
|
|
5090
|
+
}
|
|
5091
|
+
function onTransitionEnd(event) {
|
|
5092
|
+
if (event.target === surface) {
|
|
5093
|
+
done();
|
|
5094
|
+
}
|
|
5095
|
+
}
|
|
5096
|
+
surface.addEventListener('transitionend', onTransitionEnd);
|
|
5097
|
+
});
|
|
5098
|
+
}
|
|
5099
|
+
/** Emits the result once the CDK reference is closed. Focus is restored by the container. */
|
|
5100
|
+
settle(result) {
|
|
5101
|
+
if (this.closeSettled) {
|
|
5102
|
+
return;
|
|
5103
|
+
}
|
|
5104
|
+
// Covers detachments that did not go through close(), so anything
|
|
5105
|
+
// waiting on beforeClosed() is still notified.
|
|
5106
|
+
this.startClosing();
|
|
5107
|
+
this.closeSettled = true;
|
|
5108
|
+
this.hiddenChanges.complete();
|
|
5109
|
+
this.closed.next(result);
|
|
5110
|
+
this.closed.complete();
|
|
5111
|
+
}
|
|
5112
|
+
}
|
|
5113
|
+
|
|
5114
|
+
class AppBarLogo {
|
|
5115
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: AppBarLogo, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
5116
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.1.0", type: AppBarLogo, isStandalone: true, selector: "[md3-app-bar-logo]", ngImport: i0 });
|
|
5117
|
+
}
|
|
5118
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: AppBarLogo, decorators: [{
|
|
5119
|
+
type: Directive,
|
|
5120
|
+
args: [{
|
|
5121
|
+
selector: '[md3-app-bar-logo]',
|
|
5122
|
+
}]
|
|
5123
|
+
}] });
|
|
5124
|
+
|
|
5125
|
+
class AppBar {
|
|
5126
|
+
el;
|
|
5127
|
+
layoutService;
|
|
5128
|
+
// A dialog provides its configuration to everything it holds, so this is how the bar knows
|
|
5129
|
+
// it is not the banner of the document.
|
|
5130
|
+
inDialog = !!inject(DIALOG_CONFIG, { optional: true });
|
|
5131
|
+
/**
|
|
5132
|
+
* The landmark role of the bar.
|
|
5133
|
+
*
|
|
5134
|
+
* A page has one banner, and the app bar of the page is it. A bar inside a dialog is not
|
|
5135
|
+
* the banner of the document — a banner nested in a dialog misleads a screen reader — so a
|
|
5136
|
+
* bar that finds itself in one carries no role. Set this input to force either value.
|
|
5137
|
+
*/
|
|
5138
|
+
barRole = input(null, { ...(ngDevMode ? { debugName: "barRole" } : /* istanbul ignore next */ {}), alias: 'bar-role' });
|
|
5139
|
+
resolvedRole = computed(() => {
|
|
5140
|
+
const role = this.barRole();
|
|
5141
|
+
if (role !== null) {
|
|
5142
|
+
return role === 'none' ? null : role;
|
|
5143
|
+
}
|
|
5144
|
+
return this.inDialog ? null : 'banner';
|
|
5145
|
+
}, /* @ts-ignore */
|
|
5146
|
+
...(ngDevMode ? [{ debugName: "resolvedRole" }] : /* istanbul ignore next */ []));
|
|
5147
|
+
title = input(null, { ...(ngDevMode ? { debugName: "title" } : /* istanbul ignore next */ {}), alias: 'bar-title' });
|
|
5148
|
+
subtitle = input(null, { ...(ngDevMode ? { debugName: "subtitle" } : /* istanbul ignore next */ {}), alias: 'bar-subtitle' });
|
|
5149
|
+
appBarType = input('small', { ...(ngDevMode ? { debugName: "appBarType" } : /* istanbul ignore next */ {}), alias: 'bar-type' });
|
|
5150
|
+
appBarScrollingStyle = input('elevate', { ...(ngDevMode ? { debugName: "appBarScrollingStyle" } : /* istanbul ignore next */ {}), alias: 'scroll-style' });
|
|
5151
|
+
autoHide = input(false, { ...(ngDevMode ? { debugName: "autoHide" } : /* istanbul ignore next */ {}), alias: 'auto-hide',
|
|
5152
|
+
transform: booleanAttribute });
|
|
5153
|
+
centerAligned = input(false, { ...(ngDevMode ? { debugName: "centerAligned" } : /* istanbul ignore next */ {}), alias: 'center-aligned',
|
|
5154
|
+
transform: booleanAttribute });
|
|
5155
|
+
logo = contentChild(AppBarLogo, /* @ts-ignore */
|
|
5156
|
+
...(ngDevMode ? [{ debugName: "logo" }] : /* istanbul ignore next */ []));
|
|
5157
|
+
avatar = contentChild(Avatar, /* @ts-ignore */
|
|
5158
|
+
...(ngDevMode ? [{ debugName: "avatar" }] : /* istanbul ignore next */ []));
|
|
5159
|
+
hasLogo = computed(() => !!this.logo(), /* @ts-ignore */
|
|
5160
|
+
...(ngDevMode ? [{ debugName: "hasLogo" }] : /* istanbul ignore next */ []));
|
|
5161
|
+
hasAvatar = computed(() => !!this.avatar(), /* @ts-ignore */
|
|
5162
|
+
...(ngDevMode ? [{ debugName: "hasAvatar" }] : /* istanbul ignore next */ []));
|
|
5163
|
+
mainIsScrolled = computed(() => this.layoutService.mainIsScrolled(), /* @ts-ignore */
|
|
5164
|
+
...(ngDevMode ? [{ debugName: "mainIsScrolled" }] : /* istanbul ignore next */ []));
|
|
5165
|
+
// One source of truth. The toolbar reads the same signal, so the two bars can never
|
|
5166
|
+
// disagree about which way the main pane is moving.
|
|
5167
|
+
isScrollingDown = computed(() => this.layoutService.isScrollingDown(), /* @ts-ignore */
|
|
5168
|
+
...(ngDevMode ? [{ debugName: "isScrollingDown" }] : /* istanbul ignore next */ []));
|
|
5169
|
+
bottomExpandedHeight = computed(() => {
|
|
5170
|
+
const type = this.appBarType();
|
|
5171
|
+
if (!this.hasCollapsibleBottom(type)) {
|
|
5172
|
+
return 0;
|
|
5173
|
+
}
|
|
5174
|
+
this.layoutService.viewport();
|
|
5175
|
+
const fontSize = this.getHostFontSize();
|
|
5176
|
+
const hasSubtitle = !!this.subtitle()?.length;
|
|
5177
|
+
if (type === 'medium') {
|
|
5178
|
+
return (hasSubtitle ? 4.5 : 3) * fontSize;
|
|
5179
|
+
}
|
|
5180
|
+
return (hasSubtitle ? 5.5 : 3.5) * fontSize;
|
|
5181
|
+
}, /* @ts-ignore */
|
|
5182
|
+
...(ngDevMode ? [{ debugName: "bottomExpandedHeight" }] : /* istanbul ignore next */ []));
|
|
5183
|
+
bottomCollapse = computed(() => {
|
|
5184
|
+
const expandedHeight = this.bottomExpandedHeight();
|
|
5185
|
+
if (!expandedHeight) {
|
|
5186
|
+
return 0;
|
|
5187
|
+
}
|
|
5188
|
+
return Math.min(expandedHeight, Math.max(0, this.layoutService.mainScrollTop()));
|
|
5189
|
+
}, /* @ts-ignore */
|
|
5190
|
+
...(ngDevMode ? [{ debugName: "bottomCollapse" }] : /* istanbul ignore next */ []));
|
|
5191
|
+
// button context
|
|
5192
|
+
buttonContextSize = signal('small', /* @ts-ignore */
|
|
5193
|
+
...(ngDevMode ? [{ debugName: "buttonContextSize" }] : /* istanbul ignore next */ []));
|
|
5194
|
+
constructor(el, layoutService) {
|
|
5195
|
+
this.el = el;
|
|
4898
5196
|
this.layoutService = layoutService;
|
|
4899
5197
|
effect((onCleanup) => {
|
|
4900
5198
|
const type = 'md3-' + this.appBarType();
|
|
@@ -4948,7 +5246,7 @@ class AppBar {
|
|
|
4948
5246
|
return Number.parseFloat(getComputedStyle(this.element).fontSize) || 16;
|
|
4949
5247
|
}
|
|
4950
5248
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: AppBar, deps: [{ token: i0.ElementRef }, { token: LayoutService }], target: i0.ɵɵFactoryTarget.Component });
|
|
4951
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: AppBar, isStandalone: true, selector: "md3-app-bar", inputs: { title: { classPropertyName: "title", publicName: "bar-title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "bar-subtitle", isSignal: true, isRequired: false, transformFunction: null }, appBarType: { classPropertyName: "appBarType", publicName: "bar-type", isSignal: true, isRequired: false, transformFunction: null }, appBarScrollingStyle: { classPropertyName: "appBarScrollingStyle", publicName: "scroll-style", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "auto-hide", isSignal: true, isRequired: false, transformFunction: null }, centerAligned: { classPropertyName: "centerAligned", publicName: "center-aligned", isSignal: true, isRequired: false, transformFunction: null } }, host: {
|
|
5249
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.0", type: AppBar, isStandalone: true, selector: "md3-app-bar", inputs: { barRole: { classPropertyName: "barRole", publicName: "bar-role", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "bar-title", isSignal: true, isRequired: false, transformFunction: null }, subtitle: { classPropertyName: "subtitle", publicName: "bar-subtitle", isSignal: true, isRequired: false, transformFunction: null }, appBarType: { classPropertyName: "appBarType", publicName: "bar-type", isSignal: true, isRequired: false, transformFunction: null }, appBarScrollingStyle: { classPropertyName: "appBarScrollingStyle", publicName: "scroll-style", isSignal: true, isRequired: false, transformFunction: null }, autoHide: { classPropertyName: "autoHide", publicName: "auto-hide", isSignal: true, isRequired: false, transformFunction: null }, centerAligned: { classPropertyName: "centerAligned", publicName: "center-aligned", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.role": "resolvedRole()", "class.md3-scrolled": "mainIsScrolled()", "class.md3-auto-hide": "autoHide()", "class.md3-scrolling-down": "isScrollingDown()" } }, providers: [
|
|
4952
5250
|
{
|
|
4953
5251
|
provide: MD3_BUTTON_CONTEXT,
|
|
4954
5252
|
useExisting: AppBar,
|
|
@@ -4967,12 +5265,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
4967
5265
|
useExisting: AppBar,
|
|
4968
5266
|
},
|
|
4969
5267
|
], host: {
|
|
4970
|
-
role: '
|
|
5268
|
+
'[attr.role]': 'resolvedRole()',
|
|
4971
5269
|
'[class.md3-scrolled]': 'mainIsScrolled()',
|
|
4972
5270
|
'[class.md3-auto-hide]': 'autoHide()',
|
|
4973
5271
|
'[class.md3-scrolling-down]': 'isScrollingDown()',
|
|
4974
5272
|
}, template: "<div class=\"md3-app-bar-container\">\n <div class=\"md3-app-bar-leading\">\n <ng-content select=\"[md3-app-bar-leading]\"></ng-content>\n </div>\n\n @if (appBarType() == 'search') {\n <div class=\"md3-app-bar-search\" [class.md3-center]=\"centerAligned()\">\n <div class=\"md3-search-container\">\n <div class=\"md3-leading-buttons\">\n <ng-content select=\"[md3-search-leading]\"></ng-content>\n </div>\n <ng-content select=\"[md3-input-element]\"></ng-content>\n <div class=\"md3-trailing-buttons\">\n <ng-content select=\"[md3-search-trailing]\"></ng-content>\n </div>\n </div>\n </div>\n } @else if (hasLogo()) {\n <div class=\"md3-app-bar-logo\" [class.md3-center]=\"centerAligned()\">\n <ng-content select=\"[md3-app-bar-logo]\"></ng-content>\n </div>\n } @else if (title() || subtitle()) {\n <div class=\"md3-app-bar-title\" [class.md3-center]=\"centerAligned()\">\n @if (title()?.length) {\n <div md3-type-title size=\"large\">{{ title() }}</div>\n }\n @if (subtitle()?.length) {\n <div md3-type-body size=\"small\" emphasized>{{ subtitle() }}</div>\n }\n </div>\n }\n\n <div class=\"md3-app-bar-trailing\">\n <ng-content select=\"[md3-app-bar-trailing]\"></ng-content>\n @if (hasAvatar()) {\n <div class=\"md3-app-bar-avatar\">\n <ng-content select=\"[md3-avatar]\"></ng-content>\n </div>\n }\n </div>\n\n @if ((appBarType() == 'medium' || appBarType() == 'large') && (title() || subtitle())) {\n <div class=\"md3-app-bar-bottom\" [class.md3-center]=\"centerAligned()\">\n <div class=\"md3-app-bar-bottom-content\">\n @if (appBarType() == 'medium') {\n @if (title()?.length) {\n <div md3-type-headline size=\"medium\">{{ title() }}</div>\n }\n @if (subtitle()?.length) {\n <div md3-type-title size=\"small\">{{ subtitle() }}</div>\n }\n }\n @if (appBarType() == 'large') {\n @if (title()?.length) {\n <div md3-type-display size=\"small\">{{ title() }}</div>\n }\n @if (subtitle()?.length) {\n <div md3-type-title size=\"medium\">{{ subtitle() }}</div>\n }\n }\n </div>\n </div>\n }\n</div>\n", styles: [":host{--background-color: rgb(var(--md-scheme-surface));--foreground-color: rgb(var(--md-scheme-on-surface));--search-background-color: rgb(var(--md-scheme-surface-container));--search-foreground-color: rgb(var(--md-scheme-on-surface));--foreground-secondary: rgb(var(--md-scheme-on-surface-variant));--elevation: var(--md-shadow-0dp);--app-bar-bottom-collapse: 0px;--app-bar-bottom-opacity: 1;display:block;min-height:0em;max-height:9.5em;overflow:hidden;background-color:var(--background-color);color:var(--foreground-color);box-shadow:var(--elevation);transition:all var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing)}:host .md3-app-bar-container{display:grid;grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:4em auto auto;min-height:4em;width:100%;background-color:inherit;color:inherit;transition:opacity var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing)}:host .md3-app-bar-container .md3-app-bar-leading,:host .md3-app-bar-container .md3-app-bar-trailing{grid-row:1;z-index:1;display:inline-flex;align-items:center;gap:.25em;min-inline-size:0;block-size:4em}:host .md3-app-bar-container .md3-app-bar-leading:empty,:host .md3-app-bar-container .md3-app-bar-trailing:empty{display:none}:host .md3-app-bar-container .md3-app-bar-leading .md3-app-bar-avatar,:host .md3-app-bar-container .md3-app-bar-leading ::ng-deep [md3-app-bar-leading],:host .md3-app-bar-container .md3-app-bar-leading ::ng-deep [md3-app-bar-trailing],:host .md3-app-bar-container .md3-app-bar-trailing .md3-app-bar-avatar,:host .md3-app-bar-container .md3-app-bar-trailing ::ng-deep [md3-app-bar-leading],:host .md3-app-bar-container .md3-app-bar-trailing ::ng-deep [md3-app-bar-trailing]{flex:0 0 auto;height:3em;min-width:3em;display:inline-flex;align-items:center;justify-content:center}:host .md3-app-bar-container .md3-app-bar-leading{grid-column:1;justify-self:start;padding-inline-start:.25em;padding-inline-end:.5em;min-width:1em}:host .md3-app-bar-container .md3-app-bar-leading:empty{display:inline-flex}:host .md3-app-bar-container .md3-app-bar-leading ::ng-deep [md3-app-bar-leading]{color:var(--foreground-color)}:host .md3-app-bar-container .md3-app-bar-leading ::ng-deep [md3-app-bar-leading] .md3-standard[md3-icon-button]{--foreground-color: var(--foreground-color)}:host .md3-app-bar-container .md3-app-bar-trailing{grid-column:3;justify-self:end;padding-inline-end:.25em}:host .md3-app-bar-container .md3-app-bar-trailing ::ng-deep [md3-app-bar-trailing]{color:var(--foreground-secondary)}:host .md3-app-bar-container .md3-app-bar-trailing ::ng-deep [md3-app-bar-trailing] .md3-standard[md3-icon-button]{--foreground-color: var(--foreground-secondary)}:host .md3-app-bar-container .md3-app-bar-trailing ::ng-deep .md3-avatar{flex:0 0 2em}:host .md3-app-bar-container .md3-app-bar-search{grid-column:1/-1;grid-row:1;align-self:center;display:flex;justify-content:center;min-inline-size:0;height:3em;padding:0 .5em}:host .md3-app-bar-container .md3-app-bar-search .md3-search-container{display:inline-flex;align-items:center;justify-content:center;width:50%;max-width:100%;border-radius:1.5em;background-color:var(--search-background-color);color:var(--search-foreground-color);transition:all var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing)}:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-leading-buttons,:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-trailing-buttons{flex:0 0 1.5em;pointer-events:none;display:inline-flex;gap:.25em;padding:0 .25em}:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-leading-buttons:empty,:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-trailing-buttons:empty{padding:0}:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-leading-buttons ::ng-deep [md3-search-leading],:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-leading-buttons ::ng-deep [md3-search-trailing],:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-trailing-buttons ::ng-deep [md3-search-leading],:host .md3-app-bar-container .md3-app-bar-search .md3-search-container .md3-trailing-buttons ::ng-deep [md3-search-trailing]{pointer-events:all}:host .md3-app-bar-container .md3-app-bar-search .md3-search-container ::ng-deep [md3-input-element]{flex:1 1 auto;background-color:transparent;color:var(--search-foreground-color);font-size:1em;height:100%;min-width:0em;border:none;padding:0 1.5em;margin:0 -1.5em}:host .md3-app-bar-container .md3-app-bar-search.md3-center .md3-search-container ::ng-deep [md3-input-element]{text-align:center}:host .md3-app-bar-container .md3-app-bar-logo{grid-column:2;grid-row:1;align-self:center;display:flex;justify-content:start;min-inline-size:0;overflow:hidden;height:3em}:host .md3-app-bar-container .md3-app-bar-logo.md3-center{grid-column:1/-1;justify-self:stretch;text-align:center;justify-content:center}:host .md3-app-bar-container .md3-app-bar-logo ::ng-deep a[md3-app-bar-logo],:host .md3-app-bar-container .md3-app-bar-logo ::ng-deep button[md3-app-bar-logo]{cursor:pointer}:host .md3-app-bar-container .md3-app-bar-logo ::ng-deep [md3-app-bar-logo]{flex:0 1 auto;max-height:100%;max-width:100%;display:block;border:none;background:transparent;font-size:1em;text-decoration:none;padding:0;margin:0}:host .md3-app-bar-container .md3-app-bar-logo ::ng-deep [md3-app-bar-logo]>*{display:inline-block;max-height:100%;max-width:100%;width:100%;height:100%;object-fit:contain}:host .md3-app-bar-container .md3-app-bar-title{grid-column:2;grid-row:1;align-self:center;min-inline-size:0;color:inherit;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:none;transition:all var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing);transform:scale(0);opacity:0}:host .md3-app-bar-container .md3-app-bar-title:dir(ltr){transform-origin:bottom left}:host .md3-app-bar-container .md3-app-bar-title:dir(rtl){transform-origin:bottom right}:host .md3-app-bar-container .md3-app-bar-title.md3-center{grid-column:1/-1;justify-self:stretch;text-align:center;transform-origin:bottom center}:host .md3-app-bar-container .md3-app-bar-title ::ng-deep [md3-app-bar-title]{overflow:hidden;white-space:nowrap;text-overflow:ellipsis;pointer-events:all}:host .md3-app-bar-container .md3-app-bar-bottom{--app-bar-bottom-expanded-block-size: auto;grid-column:1/-1;grid-row:2;min-inline-size:0;min-block-size:0;overflow:hidden;transition:all var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing)}:host .md3-app-bar-container .md3-app-bar-bottom:empty{display:none}:host .md3-app-bar-container .md3-app-bar-bottom .md3-app-bar-bottom-content{padding-bottom:.75em;padding-inline-start:1em;padding-inline-end:.25em;opacity:var(--app-bar-bottom-opacity);transition:all var(--md-motion-standard-default-effects-duration) var(--md-motion-standard-default-effects-easing)}:host .md3-app-bar-container .md3-app-bar-bottom.md3-center .md3-app-bar-bottom-content{text-align:center;padding-inline:1em}:host.md3-scrolled.md3-scroll-style-elevate{--background-color: rgb(var(--md-scheme-surface-container));--search-background-color: rgb(var(--md-scheme-surface-container-highest));--elevation: var(--md-shadow-3dp)}:host.md3-scrolled.md3-scroll-style-transparent{--background-color: transparent}:host.md3-layout-medium .md3-app-bar-container .md3-app-bar-search{grid-column:2}:host.md3-layout-medium .md3-app-bar-container .md3-app-bar-search .md3-search-container{width:19.5em}:host.md3-layout-compact .md3-app-bar-container .md3-app-bar-search{grid-column:2}:host.md3-layout-compact .md3-app-bar-container .md3-app-bar-search .md3-search-container{width:100%}:host.md3-small .md3-app-bar-container .md3-app-bar-title,:host.md3-collapsed .md3-app-bar-container .md3-app-bar-title{transform:scale(1);opacity:1}:host.md3-medium .md3-app-bar-container .md3-app-bar-bottom{--app-bar-bottom-expanded-block-size: 3em;block-size:max(0px,var(--app-bar-bottom-expanded-block-size) - var(--app-bar-bottom-collapse))}:host.md3-medium .md3-app-bar-container .md3-app-bar-bottom:has(.md3-text-title.md3-text-small){--app-bar-bottom-expanded-block-size: 4.5em}:host.md3-medium .md3-app-bar-container .md3-app-bar-bottom .md3-app-bar-bottom-content .md3-text-title.md3-text-small{margin-top:.285715em}:host.md3-large .md3-app-bar-container .md3-app-bar-bottom{--app-bar-bottom-expanded-block-size: 3.5em;block-size:max(0px,var(--app-bar-bottom-expanded-block-size) - var(--app-bar-bottom-collapse))}:host.md3-large .md3-app-bar-container .md3-app-bar-bottom:has(.md3-text-title.md3-text-medium){--app-bar-bottom-expanded-block-size: 5.5em}:host.md3-large .md3-app-bar-container .md3-app-bar-bottom .md3-app-bar-bottom-content .md3-text-title.md3-text-medium{margin-top:.5em}:host.md3-scrolling-down.md3-auto-hide{max-height:0}:host.md3-scrolling-down.md3-auto-hide .md3-app-bar-container{opacity:0}\n"] }]
|
|
4975
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: LayoutService }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-subtitle", required: false }] }], appBarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-type", required: false }] }], appBarScrollingStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "scroll-style", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "auto-hide", required: false }] }], centerAligned: [{ type: i0.Input, args: [{ isSignal: true, alias: "center-aligned", required: false }] }], logo: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AppBarLogo), { isSignal: true }] }], avatar: [{ type: i0.ContentChild, args: [i0.forwardRef(() => Avatar), { isSignal: true }] }] } });
|
|
5273
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: LayoutService }], propDecorators: { barRole: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-role", required: false }] }], title: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-title", required: false }] }], subtitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-subtitle", required: false }] }], appBarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "bar-type", required: false }] }], appBarScrollingStyle: [{ type: i0.Input, args: [{ isSignal: true, alias: "scroll-style", required: false }] }], autoHide: [{ type: i0.Input, args: [{ isSignal: true, alias: "auto-hide", required: false }] }], centerAligned: [{ type: i0.Input, args: [{ isSignal: true, alias: "center-aligned", required: false }] }], logo: [{ type: i0.ContentChild, args: [i0.forwardRef(() => AppBarLogo), { isSignal: true }] }], avatar: [{ type: i0.ContentChild, args: [i0.forwardRef(() => Avatar), { isSignal: true }] }] } });
|
|
4976
5274
|
|
|
4977
5275
|
/**
|
|
4978
5276
|
* Material 3 toolbar.
|
|
@@ -5341,7 +5639,7 @@ class Toolbar {
|
|
|
5341
5639
|
provide: MD3_BUTTON_CONTEXT,
|
|
5342
5640
|
useExisting: Toolbar,
|
|
5343
5641
|
},
|
|
5344
|
-
], queries: [{ propertyName: "fab", first: true, predicate: FloatingActionButton, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "layoutElement", first: true, predicate: ["layout"], descendants: true, isSignal: true }, { propertyName: "containerElement", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "slotsElement", first: true, predicate: ["slots"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"md3-toolbar-layout\" #layout>\n @if (isFloating()) {\n <ng-content select=\"[md3-fab]\"></ng-content>\n }\n \n <div class=\"md3-toolbar-container\" #container>\n <div class=\"md3-toolbar-slots\" #slots>\n <ng-content select=\"md3-toolbar-item\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{--md-toolbar-size: 4em;--md-toolbar-padding: .
|
|
5642
|
+
], queries: [{ propertyName: "fab", first: true, predicate: FloatingActionButton, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "layoutElement", first: true, predicate: ["layout"], descendants: true, isSignal: true }, { propertyName: "containerElement", first: true, predicate: ["container"], descendants: true, isSignal: true }, { propertyName: "slotsElement", first: true, predicate: ["slots"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"md3-toolbar-layout\" #layout>\n @if (isFloating()) {\n <ng-content select=\"[md3-fab]\"></ng-content>\n }\n \n <div class=\"md3-toolbar-container\" #container>\n <div class=\"md3-toolbar-slots\" #slots>\n <ng-content select=\"md3-toolbar-item\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{--md-toolbar-size: 4em;--md-toolbar-padding: .75em;--md-toolbar-radius: var(--md-toolbar-size);--md-toolbar-shadow: var(--md-shadow-3dp);--md-toolbar-item-max-size: 20em;--md-toolbar-gap-min: .25em;--md-toolbar-gap-max: 2em;--md-toolbar-gap: clamp(var(--md-toolbar-gap-min), var(--md-toolbar-gap-free, 0px), var(--md-toolbar-gap-max));--md-toolbar-duration: var(--md-motion-expressive-default-spatial-duration);--md-toolbar-easing: var(--md-motion-expressive-default-spatial-easing);--md-toolbar-effect-duration: var(--md-motion-expressive-fast-effects-duration);--background-color: rgb(var(--md-scheme-surface-container));--foreground-color: rgb(var(--md-scheme-on-surface));display:block;position:relative;min-width:0em;min-height:0em;transition:max-height var(--md-toolbar-duration) var(--md-toolbar-easing),max-width var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-duration) var(--md-toolbar-easing)}:host .md3-toolbar-layout{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--md-toolbar-padding);width:100%;height:100%;min-width:0em;min-height:0em;transition:transform var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-duration) var(--md-toolbar-easing)}:host .md3-toolbar-layout .md3-toolbar-container{display:flex;flex-direction:row;align-items:center;min-width:0em;min-height:0em;max-width:100%;max-height:100%;border-radius:var(--md-toolbar-radius);background-color:var(--background-color);color:var(--foreground-color);box-shadow:var(--md-toolbar-shadow);overflow:hidden;pointer-events:auto;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),box-shadow var(--md-toolbar-effect-duration) linear,opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear}:host .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots{display:flex;flex:0 1 auto;flex-direction:row;align-items:center;min-width:0em;min-height:0em}:host .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),margin var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear}:host.md3-fab-start ::ng-deep [md3-fab]{order:-1}:host.md3-fab-end ::ng-deep [md3-fab]{order:1}:host.md3-docked{--md-toolbar-radius: var(--md-border-radius-none);--md-toolbar-shadow: var(--md-shadow-0dp);background-color:var(--background-color)}:host.md3-docked.md3-align-start .md3-toolbar-layout .md3-toolbar-container{justify-content:start}:host.md3-docked.md3-align-center .md3-toolbar-layout .md3-toolbar-container{justify-content:center}:host.md3-docked.md3-align-end .md3-toolbar-layout .md3-toolbar-container{justify-content:end}:host.md3-docked .md3-toolbar-layout{width:100%;height:100%}:host.md3-docked .md3-toolbar-layout .md3-toolbar-container{background-color:transparent}:host.md3-floating.md3-align-start .md3-toolbar-layout{justify-content:start}:host.md3-floating.md3-align-center .md3-toolbar-layout{justify-content:center}:host.md3-floating.md3-align-end .md3-toolbar-layout{justify-content:end}:host.md3-floating .md3-toolbar-layout{position:absolute;inset:0;pointer-events:none}:host.md3-floating .md3-toolbar-layout .md3-toolbar-container{pointer-events:auto}:host.md3-floating .md3-toolbar-layout ::ng-deep [md3-fab]{pointer-events:auto}:host.md3-horizontal{max-height:var(--md-toolbar-size)}:host.md3-horizontal .md3-toolbar-layout{height:var(--md-toolbar-size);padding:0 1em}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container{height:var(--md-toolbar-size)}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{max-width:var(--md-toolbar-item-max-size)}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item+md3-toolbar-item{margin-inline-start:var(--md-toolbar-gap)}:host.md3-horizontal.md3-docked .md3-toolbar-layout .md3-toolbar-container{width:100%}:host.md3-horizontal.md3-floating{height:0}:host.md3-horizontal.md3-floating .md3-toolbar-layout .md3-toolbar-container{padding:0 var(--md-toolbar-padding)}:host.md3-horizontal.md3-floating.md3-region-block-end .md3-toolbar-layout{inset-block-start:auto;inset-block-end:1em}:host.md3-horizontal.md3-floating.md3-region-block-start .md3-toolbar-layout{inset-block-end:auto;inset-block-start:1em}:host.md3-vertical{max-width:var(--md-toolbar-size)}:host.md3-vertical .md3-toolbar-layout{flex-direction:column;width:var(--md-toolbar-size);padding:1em 0}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container{flex-direction:column;width:var(--md-toolbar-size)}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots{flex-direction:column;width:100%;height:auto}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{max-height:var(--md-toolbar-item-max-size);min-height:3em}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item+md3-toolbar-item{margin-block-start:var(--md-toolbar-gap)}:host.md3-vertical.md3-docked .md3-toolbar-layout .md3-toolbar-container{height:100%}:host.md3-vertical.md3-floating{width:0}:host.md3-vertical.md3-floating .md3-toolbar-layout .md3-toolbar-container{padding:var(--md-toolbar-padding) 0}:host.md3-vertical.md3-floating.md3-region-inline-end .md3-toolbar-layout{inset-inline-start:auto;inset-inline-end:1em}:host.md3-vertical.md3-floating.md3-region-inline-start .md3-toolbar-layout{inset-inline-end:auto;inset-inline-start:1em}:host.md3-hidden{opacity:0;pointer-events:none}:host.md3-hidden.md3-horizontal{max-height:0em}:host.md3-hidden.md3-vertical{max-width:0em}:host.md3-hidden .md3-toolbar-layout{transform:scaleY(0)}:host.md3-collapsed{--md-toolbar-gap: 0em}:host.md3-collapsed .md3-toolbar-container .md3-toolbar-slots>::ng-deep md3-toolbar-item:not([md3-toolbar-persistent]){max-width:0em!important;max-height:0em!important;min-width:0em!important;min-height:0em!important;margin:0;padding-inline:0em;border-width:0em;opacity:0;visibility:hidden;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),max-height var(--md-toolbar-duration) var(--md-toolbar-easing),margin var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear var(--md-toolbar-duration)}:host.md3-collapsed.md3-collapse-to-fab{--md-toolbar-padding: 0}:host.md3-collapsed.md3-collapse-to-fab .md3-toolbar-container{max-width:0em;opacity:0;visibility:hidden;pointer-events:none;box-shadow:var(--md-shadow-0dp);transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),box-shadow var(--md-toolbar-effect-duration) linear,opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear var(--md-toolbar-duration)}:host.md3-color-vibrant{--background-color: rgb(var(--md-scheme-primary-container));--foreground-color: rgb(var(--md-scheme-on-primary-container))}:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-standard,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-outlined,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-text,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-outlined{--foreground-color: rgb(var(--md-scheme-on-primary-container))}:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-tonal,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-tonal{--background-color: rgb(var(--md-scheme-surface-container));--foreground-color: rgb(var(--md-scheme-on-surface))}\n"] });
|
|
5345
5643
|
}
|
|
5346
5644
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: Toolbar, decorators: [{
|
|
5347
5645
|
type: Component,
|
|
@@ -5361,7 +5659,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
5361
5659
|
'[class.md3-collapse-to-fab]': 'isCollapsedToFab()',
|
|
5362
5660
|
'(focusin)': 'onFocusIn()',
|
|
5363
5661
|
'(focusout)': 'onFocusOut($event)',
|
|
5364
|
-
}, template: "<div class=\"md3-toolbar-layout\" #layout>\n @if (isFloating()) {\n <ng-content select=\"[md3-fab]\"></ng-content>\n }\n \n <div class=\"md3-toolbar-container\" #container>\n <div class=\"md3-toolbar-slots\" #slots>\n <ng-content select=\"md3-toolbar-item\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{--md-toolbar-size: 4em;--md-toolbar-padding: .
|
|
5662
|
+
}, template: "<div class=\"md3-toolbar-layout\" #layout>\n @if (isFloating()) {\n <ng-content select=\"[md3-fab]\"></ng-content>\n }\n \n <div class=\"md3-toolbar-container\" #container>\n <div class=\"md3-toolbar-slots\" #slots>\n <ng-content select=\"md3-toolbar-item\"></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{--md-toolbar-size: 4em;--md-toolbar-padding: .75em;--md-toolbar-radius: var(--md-toolbar-size);--md-toolbar-shadow: var(--md-shadow-3dp);--md-toolbar-item-max-size: 20em;--md-toolbar-gap-min: .25em;--md-toolbar-gap-max: 2em;--md-toolbar-gap: clamp(var(--md-toolbar-gap-min), var(--md-toolbar-gap-free, 0px), var(--md-toolbar-gap-max));--md-toolbar-duration: var(--md-motion-expressive-default-spatial-duration);--md-toolbar-easing: var(--md-motion-expressive-default-spatial-easing);--md-toolbar-effect-duration: var(--md-motion-expressive-fast-effects-duration);--background-color: rgb(var(--md-scheme-surface-container));--foreground-color: rgb(var(--md-scheme-on-surface));display:block;position:relative;min-width:0em;min-height:0em;transition:max-height var(--md-toolbar-duration) var(--md-toolbar-easing),max-width var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-duration) var(--md-toolbar-easing)}:host .md3-toolbar-layout{display:flex;flex-direction:row;align-items:center;justify-content:center;gap:var(--md-toolbar-padding);width:100%;height:100%;min-width:0em;min-height:0em;transition:transform var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-duration) var(--md-toolbar-easing)}:host .md3-toolbar-layout .md3-toolbar-container{display:flex;flex-direction:row;align-items:center;min-width:0em;min-height:0em;max-width:100%;max-height:100%;border-radius:var(--md-toolbar-radius);background-color:var(--background-color);color:var(--foreground-color);box-shadow:var(--md-toolbar-shadow);overflow:hidden;pointer-events:auto;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),box-shadow var(--md-toolbar-effect-duration) linear,opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear}:host .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots{display:flex;flex:0 1 auto;flex-direction:row;align-items:center;min-width:0em;min-height:0em}:host .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),margin var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear}:host.md3-fab-start ::ng-deep [md3-fab]{order:-1}:host.md3-fab-end ::ng-deep [md3-fab]{order:1}:host.md3-docked{--md-toolbar-radius: var(--md-border-radius-none);--md-toolbar-shadow: var(--md-shadow-0dp);background-color:var(--background-color)}:host.md3-docked.md3-align-start .md3-toolbar-layout .md3-toolbar-container{justify-content:start}:host.md3-docked.md3-align-center .md3-toolbar-layout .md3-toolbar-container{justify-content:center}:host.md3-docked.md3-align-end .md3-toolbar-layout .md3-toolbar-container{justify-content:end}:host.md3-docked .md3-toolbar-layout{width:100%;height:100%}:host.md3-docked .md3-toolbar-layout .md3-toolbar-container{background-color:transparent}:host.md3-floating.md3-align-start .md3-toolbar-layout{justify-content:start}:host.md3-floating.md3-align-center .md3-toolbar-layout{justify-content:center}:host.md3-floating.md3-align-end .md3-toolbar-layout{justify-content:end}:host.md3-floating .md3-toolbar-layout{position:absolute;inset:0;pointer-events:none}:host.md3-floating .md3-toolbar-layout .md3-toolbar-container{pointer-events:auto}:host.md3-floating .md3-toolbar-layout ::ng-deep [md3-fab]{pointer-events:auto}:host.md3-horizontal{max-height:var(--md-toolbar-size)}:host.md3-horizontal .md3-toolbar-layout{height:var(--md-toolbar-size);padding:0 1em}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container{height:var(--md-toolbar-size)}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{max-width:var(--md-toolbar-item-max-size)}:host.md3-horizontal .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item+md3-toolbar-item{margin-inline-start:var(--md-toolbar-gap)}:host.md3-horizontal.md3-docked .md3-toolbar-layout .md3-toolbar-container{width:100%}:host.md3-horizontal.md3-floating{height:0}:host.md3-horizontal.md3-floating .md3-toolbar-layout .md3-toolbar-container{padding:0 var(--md-toolbar-padding)}:host.md3-horizontal.md3-floating.md3-region-block-end .md3-toolbar-layout{inset-block-start:auto;inset-block-end:1em}:host.md3-horizontal.md3-floating.md3-region-block-start .md3-toolbar-layout{inset-block-end:auto;inset-block-start:1em}:host.md3-vertical{max-width:var(--md-toolbar-size)}:host.md3-vertical .md3-toolbar-layout{flex-direction:column;width:var(--md-toolbar-size);padding:1em 0}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container{flex-direction:column;width:var(--md-toolbar-size)}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots{flex-direction:column;width:100%;height:auto}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item{max-height:var(--md-toolbar-item-max-size);min-height:3em}:host.md3-vertical .md3-toolbar-layout .md3-toolbar-container .md3-toolbar-slots ::ng-deep>md3-toolbar-item+md3-toolbar-item{margin-block-start:var(--md-toolbar-gap)}:host.md3-vertical.md3-docked .md3-toolbar-layout .md3-toolbar-container{height:100%}:host.md3-vertical.md3-floating{width:0}:host.md3-vertical.md3-floating .md3-toolbar-layout .md3-toolbar-container{padding:var(--md-toolbar-padding) 0}:host.md3-vertical.md3-floating.md3-region-inline-end .md3-toolbar-layout{inset-inline-start:auto;inset-inline-end:1em}:host.md3-vertical.md3-floating.md3-region-inline-start .md3-toolbar-layout{inset-inline-end:auto;inset-inline-start:1em}:host.md3-hidden{opacity:0;pointer-events:none}:host.md3-hidden.md3-horizontal{max-height:0em}:host.md3-hidden.md3-vertical{max-width:0em}:host.md3-hidden .md3-toolbar-layout{transform:scaleY(0)}:host.md3-collapsed{--md-toolbar-gap: 0em}:host.md3-collapsed .md3-toolbar-container .md3-toolbar-slots>::ng-deep md3-toolbar-item:not([md3-toolbar-persistent]){max-width:0em!important;max-height:0em!important;min-width:0em!important;min-height:0em!important;margin:0;padding-inline:0em;border-width:0em;opacity:0;visibility:hidden;transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),max-height var(--md-toolbar-duration) var(--md-toolbar-easing),margin var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear var(--md-toolbar-duration)}:host.md3-collapsed.md3-collapse-to-fab{--md-toolbar-padding: 0}:host.md3-collapsed.md3-collapse-to-fab .md3-toolbar-container{max-width:0em;opacity:0;visibility:hidden;pointer-events:none;box-shadow:var(--md-shadow-0dp);transition:max-width var(--md-toolbar-duration) var(--md-toolbar-easing),padding var(--md-toolbar-duration) var(--md-toolbar-easing),box-shadow var(--md-toolbar-effect-duration) linear,opacity var(--md-toolbar-effect-duration) linear,visibility 0s linear var(--md-toolbar-duration)}:host.md3-color-vibrant{--background-color: rgb(var(--md-scheme-primary-container));--foreground-color: rgb(var(--md-scheme-on-primary-container))}:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-standard,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-outlined,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-text,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-outlined{--foreground-color: rgb(var(--md-scheme-on-primary-container))}:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-icon-button].md3-tonal,:host.md3-color-vibrant ::ng-deep .md3-toolbar-slots md3-toolbar-item [md3-button].md3-tonal{--background-color: rgb(var(--md-scheme-surface-container));--foreground-color: rgb(var(--md-scheme-on-surface))}\n"] }]
|
|
5365
5663
|
}], ctorParameters: () => [], propDecorators: { toolbarType: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbar-type", required: false }] }], toolbarColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbar-color", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], alignment: [{ type: i0.Input, args: [{ isSignal: true, alias: "alignment", required: false }] }], scrollAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "scroll-action", required: false }] }], fabPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "fab-position", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }, { type: i0.Output, args: ["expandedChange"] }], layoutElement: [{ type: i0.ViewChild, args: ['layout', { isSignal: true }] }], containerElement: [{ type: i0.ViewChild, args: ['container', { isSignal: true }] }], slotsElement: [{ type: i0.ViewChild, args: ['slots', { isSignal: true }] }], fab: [{ type: i0.ContentChild, args: [i0.forwardRef(() => FloatingActionButton), { isSignal: true }] }] } });
|
|
5366
5664
|
|
|
5367
5665
|
class ToolbarItem {
|
|
@@ -5746,193 +6044,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
5746
6044
|
}]
|
|
5747
6045
|
}] });
|
|
5748
6046
|
|
|
5749
|
-
const DIALOG_DATA = new InjectionToken('MD3_DIALOG_DATA');
|
|
5750
|
-
const DIALOG_CONFIG = new InjectionToken('MD3_DIALOG_CONFIG');
|
|
5751
|
-
const DIALOG_COMPONENT = new InjectionToken('MD3_DIALOG_COMPONENT');
|
|
5752
|
-
const DIALOG_EXIT_ANIMATION_FALLBACK_MS = 300;
|
|
5753
|
-
const HIDDEN_CLASS = 'md3-dialog-hidden';
|
|
5754
|
-
class DialogRef {
|
|
5755
|
-
cdkRef;
|
|
5756
|
-
isFullScreen;
|
|
5757
|
-
closed = new Subject();
|
|
5758
|
-
closing = new Subject();
|
|
5759
|
-
hiddenChanges = new Subject();
|
|
5760
|
-
closePromise = null;
|
|
5761
|
-
closeStarted = false;
|
|
5762
|
-
closeSettled = false;
|
|
5763
|
-
hidden = false;
|
|
5764
|
-
/** Shell hosting the dialog: the regular dialog or the full screen one. */
|
|
5765
|
-
dialogInstance;
|
|
5766
|
-
/**
|
|
5767
|
-
* Filled by DialogService after the user component is attached. Keeping the
|
|
5768
|
-
* instance here lets callers imperatively update inputs when that is useful.
|
|
5769
|
-
*/
|
|
5770
|
-
componentInstance;
|
|
5771
|
-
/** Overlay hosting the dialog, useful to reach the panel and the scrim. */
|
|
5772
|
-
get overlayRef() {
|
|
5773
|
-
return this.cdkRef.overlayRef;
|
|
5774
|
-
}
|
|
5775
|
-
/** Whether the dialog started closing. Such a dialog cannot be hidden or shown anymore. */
|
|
5776
|
-
get isClosing() {
|
|
5777
|
-
return this.closeStarted;
|
|
5778
|
-
}
|
|
5779
|
-
/** Whether the dialog is currently hidden, on request or behind another dialog. */
|
|
5780
|
-
get isHidden() {
|
|
5781
|
-
return this.hidden;
|
|
5782
|
-
}
|
|
5783
|
-
constructor(cdkRef, disableCloseEvents,
|
|
5784
|
-
/** Whether this reference belongs to a full screen dialog. */
|
|
5785
|
-
isFullScreen = false) {
|
|
5786
|
-
this.cdkRef = cdkRef;
|
|
5787
|
-
this.isFullScreen = isFullScreen;
|
|
5788
|
-
// Closing always goes through this reference so the exit animation can
|
|
5789
|
-
// run before the CDK disposes the overlay. Detachments triggered from
|
|
5790
|
-
// the outside (navigation, scroll strategy) still settle this ref.
|
|
5791
|
-
this.cdkRef.closed.pipe(take(1)).subscribe((result) => this.settle(result));
|
|
5792
|
-
if (!disableCloseEvents) {
|
|
5793
|
-
this.connectCloseEvents();
|
|
5794
|
-
}
|
|
5795
|
-
}
|
|
5796
|
-
/** Closes the dialog. The promise resolves once the exit animation is done. */
|
|
5797
|
-
close(result) {
|
|
5798
|
-
if (this.closePromise) {
|
|
5799
|
-
return this.closePromise;
|
|
5800
|
-
}
|
|
5801
|
-
this.startClosing();
|
|
5802
|
-
this.closePromise = this.startCloseAnimation().then(() => this.cdkRef.close(result));
|
|
5803
|
-
return this.closePromise;
|
|
5804
|
-
}
|
|
5805
|
-
/**
|
|
5806
|
-
* Hides the dialog with the closing animation while keeping it alive, so
|
|
5807
|
-
* its content, form state and subscriptions survive until show() is called.
|
|
5808
|
-
* The page underneath becomes usable again while the dialog waits behind it.
|
|
5809
|
-
* The promise resolves once the dialog is out of sight.
|
|
5810
|
-
*/
|
|
5811
|
-
hide() {
|
|
5812
|
-
if (this.hidden || this.closeStarted) {
|
|
5813
|
-
return Promise.resolve();
|
|
5814
|
-
}
|
|
5815
|
-
this.hidden = true;
|
|
5816
|
-
this.toggleHiddenState(true);
|
|
5817
|
-
this.dialogInstance?.setActive(false);
|
|
5818
|
-
this.hiddenChanges.next(true);
|
|
5819
|
-
return this.waitForSurfaceAnimation();
|
|
5820
|
-
}
|
|
5821
|
-
/**
|
|
5822
|
-
* Brings a hidden dialog back with the opening animation. Focus moves back
|
|
5823
|
-
* into the dialog even when it was never hidden, which is what makes it
|
|
5824
|
-
* usable again once the dialog above it closes.
|
|
5825
|
-
*/
|
|
5826
|
-
show() {
|
|
5827
|
-
if (this.closeStarted) {
|
|
5828
|
-
return;
|
|
5829
|
-
}
|
|
5830
|
-
if (this.hidden) {
|
|
5831
|
-
this.hidden = false;
|
|
5832
|
-
this.toggleHiddenState(false);
|
|
5833
|
-
this.dialogInstance?.setActive(true);
|
|
5834
|
-
this.hiddenChanges.next(false);
|
|
5835
|
-
}
|
|
5836
|
-
this.dialogInstance?.recaptureFocus();
|
|
5837
|
-
}
|
|
5838
|
-
/** Emits when the dialog starts closing, before the exit animation runs. */
|
|
5839
|
-
beforeClosed() {
|
|
5840
|
-
return this.closing.asObservable();
|
|
5841
|
-
}
|
|
5842
|
-
/** Emits the new value of `isHidden` every time the dialog is hidden or shown. */
|
|
5843
|
-
hiddenChanged() {
|
|
5844
|
-
return this.hiddenChanges.asObservable();
|
|
5845
|
-
}
|
|
5846
|
-
afterClosed() {
|
|
5847
|
-
return this.closed.asObservable();
|
|
5848
|
-
}
|
|
5849
|
-
connectCloseEvents() {
|
|
5850
|
-
// The CDK config keeps `disableClose` on, so the scrim and Escape key
|
|
5851
|
-
// are handled here instead and the dialog can animate out.
|
|
5852
|
-
this.cdkRef.backdropClick.pipe(take(1)).subscribe(() => {
|
|
5853
|
-
this.cdkRef.containerInstance._closeInteractionType = 'mouse';
|
|
5854
|
-
this.close();
|
|
5855
|
-
});
|
|
5856
|
-
// A hidden dialog is not the one the Escape key is meant for, even
|
|
5857
|
-
// though the overlay it sits in is still the one receiving the event.
|
|
5858
|
-
this.cdkRef.keydownEvents.pipe(filter((event) => !this.hidden && event.key === 'Escape' && !hasModifierKey(event)), take(1)).subscribe((event) => {
|
|
5859
|
-
event.preventDefault();
|
|
5860
|
-
this.cdkRef.containerInstance._closeInteractionType = 'keyboard';
|
|
5861
|
-
this.close();
|
|
5862
|
-
});
|
|
5863
|
-
}
|
|
5864
|
-
toggleHiddenState(isHidden) {
|
|
5865
|
-
const overlayRef = this.cdkRef.overlayRef;
|
|
5866
|
-
const panel = overlayRef.overlayElement;
|
|
5867
|
-
const backdrop = overlayRef.backdropElement;
|
|
5868
|
-
panel.classList.toggle(HIDDEN_CLASS, isHidden);
|
|
5869
|
-
backdrop?.classList.toggle(HIDDEN_CLASS, isHidden);
|
|
5870
|
-
// `inert` keeps a hidden dialog out of the tab order and away from
|
|
5871
|
-
// assistive technology without removing it from the DOM.
|
|
5872
|
-
if (isHidden) {
|
|
5873
|
-
panel.setAttribute('inert', '');
|
|
5874
|
-
}
|
|
5875
|
-
else {
|
|
5876
|
-
panel.removeAttribute('inert');
|
|
5877
|
-
}
|
|
5878
|
-
}
|
|
5879
|
-
startClosing() {
|
|
5880
|
-
if (this.closeStarted) {
|
|
5881
|
-
return;
|
|
5882
|
-
}
|
|
5883
|
-
this.closeStarted = true;
|
|
5884
|
-
this.closing.next();
|
|
5885
|
-
this.closing.complete();
|
|
5886
|
-
}
|
|
5887
|
-
startCloseAnimation() {
|
|
5888
|
-
const overlayRef = this.cdkRef.overlayRef;
|
|
5889
|
-
const wasVisible = !this.hidden;
|
|
5890
|
-
overlayRef.overlayElement.classList.add('md3-dialog-closing');
|
|
5891
|
-
overlayRef.backdropElement?.classList.add('md3-dialog-closing');
|
|
5892
|
-
this.dialogInstance?.setActive(false);
|
|
5893
|
-
// A hidden dialog already played the exit animation, so there is
|
|
5894
|
-
// nothing left to transition and it can be disposed right away.
|
|
5895
|
-
return wasVisible ? this.waitForSurfaceAnimation() : Promise.resolve();
|
|
5896
|
-
}
|
|
5897
|
-
/** Resolves when the surface finished animating, with a timeout as a safety net. */
|
|
5898
|
-
waitForSurfaceAnimation() {
|
|
5899
|
-
const panel = this.cdkRef.overlayRef.overlayElement;
|
|
5900
|
-
const surface = this.dialogInstance?.surfaceElement ?? panel;
|
|
5901
|
-
return new Promise((resolve) => {
|
|
5902
|
-
let isResolved = false;
|
|
5903
|
-
let timeoutId = setTimeout(done, DIALOG_EXIT_ANIMATION_FALLBACK_MS);
|
|
5904
|
-
function done() {
|
|
5905
|
-
if (isResolved) {
|
|
5906
|
-
return;
|
|
5907
|
-
}
|
|
5908
|
-
isResolved = true;
|
|
5909
|
-
clearTimeout(timeoutId);
|
|
5910
|
-
surface.removeEventListener('transitionend', onTransitionEnd);
|
|
5911
|
-
resolve();
|
|
5912
|
-
}
|
|
5913
|
-
function onTransitionEnd(event) {
|
|
5914
|
-
if (event.target === surface) {
|
|
5915
|
-
done();
|
|
5916
|
-
}
|
|
5917
|
-
}
|
|
5918
|
-
surface.addEventListener('transitionend', onTransitionEnd);
|
|
5919
|
-
});
|
|
5920
|
-
}
|
|
5921
|
-
/** Emits the result once the CDK reference is closed. Focus is restored by the container. */
|
|
5922
|
-
settle(result) {
|
|
5923
|
-
if (this.closeSettled) {
|
|
5924
|
-
return;
|
|
5925
|
-
}
|
|
5926
|
-
// Covers detachments that did not go through close(), so anything
|
|
5927
|
-
// waiting on beforeClosed() is still notified.
|
|
5928
|
-
this.startClosing();
|
|
5929
|
-
this.closeSettled = true;
|
|
5930
|
-
this.hiddenChanges.complete();
|
|
5931
|
-
this.closed.next(result);
|
|
5932
|
-
this.closed.complete();
|
|
5933
|
-
}
|
|
5934
|
-
}
|
|
5935
|
-
|
|
5936
6047
|
/**
|
|
5937
6048
|
* Material 3 dialog shell. It extends the CDK dialog container, so focus
|
|
5938
6049
|
* trapping, focus restoration and the ARIA attributes are handled by the CDK
|
|
@@ -5974,17 +6085,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
5974
6085
|
}], propDecorators: { surface: [{ type: i0.ViewChild, args: ['surface', { isSignal: true }] }] } });
|
|
5975
6086
|
|
|
5976
6087
|
/**
|
|
5977
|
-
* Material 3 full screen dialog shell. It covers the viewport and
|
|
5978
|
-
*
|
|
5979
|
-
*
|
|
5980
|
-
*
|
|
6088
|
+
* Material 3 full screen dialog shell. It covers the viewport and holds the content.
|
|
6089
|
+
*
|
|
6090
|
+
* The content is an `md3-layout`. The layout places the regions — the bar rows for an app bar
|
|
6091
|
+
* or a toolbar, the rail columns, and the panes where side sheets open — so the dialog itself
|
|
6092
|
+
* places nothing but the content. A content root that is not a layout gets a warning in
|
|
6093
|
+
* development mode, and the shell falls back to panes of its own, so a side sheet never opens
|
|
6094
|
+
* behind the dialog where nobody can see it.
|
|
5981
6095
|
*/
|
|
5982
6096
|
class FullScreenDialog extends CdkDialogContainer {
|
|
5983
6097
|
surface = viewChild('surface', /* @ts-ignore */
|
|
5984
6098
|
...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
|
|
6099
|
+
mainPane = viewChild('mainPane', /* @ts-ignore */
|
|
6100
|
+
...(ngDevMode ? [{ debugName: "mainPane" }] : /* istanbul ignore next */ []));
|
|
5985
6101
|
startOutlet = viewChild('startOutlet', { ...(ngDevMode ? { debugName: "startOutlet" } : /* istanbul ignore next */ {}), read: CdkPortalOutlet });
|
|
5986
6102
|
endOutlet = viewChild('endOutlet', { ...(ngDevMode ? { debugName: "endOutlet" } : /* istanbul ignore next */ {}), read: CdkPortalOutlet });
|
|
5987
6103
|
sheets = inject(SheetsService);
|
|
6104
|
+
/** True while the shell holds the side sheet outlets, which happens without a layout only. */
|
|
6105
|
+
ownsSideSheetOutlets = false;
|
|
5988
6106
|
isActive = signal(false, /* @ts-ignore */
|
|
5989
6107
|
...(ngDevMode ? [{ debugName: "isActive" }] : /* istanbul ignore next */ []));
|
|
5990
6108
|
config = inject(DIALOG_CONFIG, { optional: true }) ?? {};
|
|
@@ -5992,28 +6110,66 @@ class FullScreenDialog extends CdkDialogContainer {
|
|
|
5992
6110
|
return this.surface()?.nativeElement ?? null;
|
|
5993
6111
|
}
|
|
5994
6112
|
ngAfterViewInit() {
|
|
6113
|
+
// The content is attached by now, so the layout it brings has already taken the
|
|
6114
|
+
// outlets. Its panes sit under the bar regions, which is where a side sheet belongs.
|
|
6115
|
+
const layout = this.findContentLayout();
|
|
6116
|
+
if (typeof ngDevMode === 'undefined' || ngDevMode) {
|
|
6117
|
+
this.checkContentLayout(layout);
|
|
6118
|
+
}
|
|
6119
|
+
if (layout) {
|
|
6120
|
+
return;
|
|
6121
|
+
}
|
|
6122
|
+
// No layout, so the shell keeps the dialog self-sufficient. Without this the next side
|
|
6123
|
+
// sheet would open in the outlet underneath — the page scaffold, behind the dialog.
|
|
5995
6124
|
const startOutlet = this.startOutlet();
|
|
5996
6125
|
const endOutlet = this.endOutlet();
|
|
5997
|
-
// Taking the outlets over is what sends the next side sheet inside the
|
|
5998
|
-
// dialog. The scaffold gets them back when this dialog is destroyed.
|
|
5999
6126
|
if (startOutlet) {
|
|
6000
6127
|
this.sheets.registerSideSheetOutlet('start', startOutlet);
|
|
6001
6128
|
}
|
|
6002
6129
|
if (endOutlet) {
|
|
6003
6130
|
this.sheets.registerSideSheetOutlet('end', endOutlet);
|
|
6004
6131
|
}
|
|
6132
|
+
this.ownsSideSheetOutlets = !!startOutlet || !!endOutlet;
|
|
6005
6133
|
}
|
|
6006
6134
|
ngOnDestroy() {
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6012
|
-
|
|
6013
|
-
|
|
6135
|
+
if (this.ownsSideSheetOutlets) {
|
|
6136
|
+
const startOutlet = this.startOutlet();
|
|
6137
|
+
const endOutlet = this.endOutlet();
|
|
6138
|
+
if (startOutlet) {
|
|
6139
|
+
this.sheets.unregisterSideSheetOutlet('start', startOutlet);
|
|
6140
|
+
}
|
|
6141
|
+
if (endOutlet) {
|
|
6142
|
+
this.sheets.unregisterSideSheetOutlet('end', endOutlet);
|
|
6143
|
+
}
|
|
6144
|
+
this.ownsSideSheetOutlets = false;
|
|
6014
6145
|
}
|
|
6015
6146
|
super.ngOnDestroy();
|
|
6016
6147
|
}
|
|
6148
|
+
/**
|
|
6149
|
+
* The layout at the root of the content, if the content brought one.
|
|
6150
|
+
*
|
|
6151
|
+
* The root is either the layout itself, or the component that holds it — a dialog is
|
|
6152
|
+
* normally opened with a component whose own template starts with `md3-layout`.
|
|
6153
|
+
*/
|
|
6154
|
+
findContentLayout() {
|
|
6155
|
+
const content = this.mainPane()?.nativeElement.firstElementChild;
|
|
6156
|
+
if (!content) {
|
|
6157
|
+
return null;
|
|
6158
|
+
}
|
|
6159
|
+
if (content.tagName === 'MD3-LAYOUT') {
|
|
6160
|
+
return content;
|
|
6161
|
+
}
|
|
6162
|
+
const root = content.firstElementChild;
|
|
6163
|
+
return root?.tagName === 'MD3-LAYOUT' ? root : null;
|
|
6164
|
+
}
|
|
6165
|
+
checkContentLayout(layout) {
|
|
6166
|
+
if (layout) {
|
|
6167
|
+
return;
|
|
6168
|
+
}
|
|
6169
|
+
console.warn('[md3-fullscreen-dialog] the content of a full screen dialog should start with '
|
|
6170
|
+
+ 'md3-layout. Without it the dialog has no bar and no rail region, so an app bar or '
|
|
6171
|
+
+ 'a toolbar has nowhere to go, and the content does not scroll on its own.');
|
|
6172
|
+
}
|
|
6017
6173
|
startEnterAnimation() {
|
|
6018
6174
|
requestAnimationFrame(() => {
|
|
6019
6175
|
this.isActive.set(true);
|
|
@@ -6026,14 +6182,14 @@ class FullScreenDialog extends CdkDialogContainer {
|
|
|
6026
6182
|
this._recaptureFocus();
|
|
6027
6183
|
}
|
|
6028
6184
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: FullScreenDialog, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
6029
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: FullScreenDialog, isStandalone: true, selector: "md3-fullscreen-dialog", viewQueries: [{ propertyName: "surface", first: true, predicate: ["surface"], descendants: true, isSignal: true }, { propertyName: "startOutlet", first: true, predicate: ["startOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "endOutlet", first: true, predicate: ["endOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- The role and aria attributes live on the host element, applied by the CDK dialog container. -->\n<div\n #surface\n class=\"md3-fullscreen-dialog-container\"\n [class.md3-active]=\"isActive()\"\n [class.md-scheme-dark]=\"config.scheme == 'dark'\"\n [class.md-scheme-light]=\"config.scheme == 'light'\"\n [attr.dir]=\"config.direction ?? null\">\n <div class=\"md3-panes-container md3-scrollable\">\n <!--\n The CDK attaches the dialog content to the first portal outlet of\n this template, so the main pane has to come first. The panes are\n placed by grid area, which makes the DOM order irrelevant visually.\n -->\n <div class=\"md3-pane md3-pane-main\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-start\">\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n </div>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container{position:fixed;z-index:1000;inset:0;pointer-events:none;font-size:1rem}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper{position:absolute;display:flex;inset:0;pointer-events:none;overflow:hidden}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper:has(>.md3-fullscreen-dialog-panel){padding:0}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel{width:100%;height:100%;max-width:none;pointer-events:auto}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-closing,::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-hidden{pointer-events:none}:host{display:block;height:100%;width:100%;outline:0}:host .md3-fullscreen-dialog-container{display:grid;grid-template-rows:minmax(0,1fr);height:100%;min-height:0;overflow:hidden;color:rgb(var(--md-scheme-on-surface));background-color:rgb(var(--md-scheme-surface));transition:all var(--md-motion-expressive-default-spatial-duration) var(--md-motion-expressive-default-spatial-easing);opacity:0;transform:translateY(1.5em)}:host .md3-fullscreen-dialog-container.md3-active{opacity:1;transform:none}:host .md3-panes-container{display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;overflow:hidden}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0;min-height:0;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1;display:grid;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane.md3-pane-main>::ng-deep *{
|
|
6185
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.0", type: FullScreenDialog, isStandalone: true, selector: "md3-fullscreen-dialog", viewQueries: [{ propertyName: "surface", first: true, predicate: ["surface"], descendants: true, isSignal: true }, { propertyName: "mainPane", first: true, predicate: ["mainPane"], descendants: true, isSignal: true }, { propertyName: "startOutlet", first: true, predicate: ["startOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }, { propertyName: "endOutlet", first: true, predicate: ["endOutlet"], descendants: true, read: CdkPortalOutlet, isSignal: true }], usesInheritance: true, ngImport: i0, template: "<!-- The role and aria attributes live on the host element, applied by the CDK dialog container. -->\n<div\n #surface\n class=\"md3-fullscreen-dialog-container\"\n [class.md3-active]=\"isActive()\"\n [class.md-scheme-dark]=\"config.scheme == 'dark'\"\n [class.md-scheme-light]=\"config.scheme == 'light'\"\n [attr.dir]=\"config.direction ?? null\">\n <div class=\"md3-panes-container md3-scrollable\">\n <!--\n The CDK attaches the dialog content to the first portal outlet of\n this template, so the main pane has to come first. The panes are\n placed by grid area, which makes the DOM order irrelevant visually.\n -->\n <div class=\"md3-pane md3-pane-main\" #mainPane>\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-start\">\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n </div>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container{position:fixed;z-index:1000;inset:0;pointer-events:none;font-size:1rem}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper{position:absolute;display:flex;inset:0;pointer-events:none;overflow:hidden}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper:has(>.md3-fullscreen-dialog-panel){padding:0}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel{width:100%;height:100%;max-width:none;pointer-events:auto}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-closing,::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-hidden{pointer-events:none}:host{display:block;height:100%;width:100%;outline:0}:host .md3-fullscreen-dialog-container{display:grid;grid-template-rows:minmax(0,1fr);height:100%;min-height:0;overflow:hidden;color:rgb(var(--md-scheme-on-surface));background-color:rgb(var(--md-scheme-surface));transition:all var(--md-motion-expressive-default-spatial-duration) var(--md-motion-expressive-default-spatial-easing);opacity:0;transform:translateY(1.5em)}:host .md3-fullscreen-dialog-container.md3-active{opacity:1;transform:none}:host .md3-panes-container{display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;overflow:hidden}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0;min-height:0;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1;display:grid;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,1fr)}:host .md3-panes-container .md3-pane.md3-pane-main>::ng-deep *{min-width:0;min-height:0;height:100%;max-height:100dvh;max-width:100dvw}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"], dependencies: [{ kind: "directive", type: CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }] });
|
|
6030
6186
|
}
|
|
6031
6187
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: FullScreenDialog, decorators: [{
|
|
6032
6188
|
type: Component,
|
|
6033
6189
|
args: [{ selector: 'md3-fullscreen-dialog', imports: [
|
|
6034
6190
|
CdkPortalOutlet,
|
|
6035
|
-
], template: "<!-- The role and aria attributes live on the host element, applied by the CDK dialog container. -->\n<div\n #surface\n class=\"md3-fullscreen-dialog-container\"\n [class.md3-active]=\"isActive()\"\n [class.md-scheme-dark]=\"config.scheme == 'dark'\"\n [class.md-scheme-light]=\"config.scheme == 'light'\"\n [attr.dir]=\"config.direction ?? null\">\n <div class=\"md3-panes-container md3-scrollable\">\n <!--\n The CDK attaches the dialog content to the first portal outlet of\n this template, so the main pane has to come first. The panes are\n placed by grid area, which makes the DOM order irrelevant visually.\n -->\n <div class=\"md3-pane md3-pane-main\">\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-start\">\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n </div>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container{position:fixed;z-index:1000;inset:0;pointer-events:none;font-size:1rem}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper{position:absolute;display:flex;inset:0;pointer-events:none;overflow:hidden}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper:has(>.md3-fullscreen-dialog-panel){padding:0}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel{width:100%;height:100%;max-width:none;pointer-events:auto}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-closing,::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-hidden{pointer-events:none}:host{display:block;height:100%;width:100%;outline:0}:host .md3-fullscreen-dialog-container{display:grid;grid-template-rows:minmax(0,1fr);height:100%;min-height:0;overflow:hidden;color:rgb(var(--md-scheme-on-surface));background-color:rgb(var(--md-scheme-surface));transition:all var(--md-motion-expressive-default-spatial-duration) var(--md-motion-expressive-default-spatial-easing);opacity:0;transform:translateY(1.5em)}:host .md3-fullscreen-dialog-container.md3-active{opacity:1;transform:none}:host .md3-panes-container{display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;overflow:hidden}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0;min-height:0;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1;display:grid;grid-template-rows:minmax(0,1fr)}:host .md3-panes-container .md3-pane.md3-pane-main>::ng-deep *{
|
|
6036
|
-
}], propDecorators: { surface: [{ type: i0.ViewChild, args: ['surface', { isSignal: true }] }], startOutlet: [{ type: i0.ViewChild, args: ['startOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }], endOutlet: [{ type: i0.ViewChild, args: ['endOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }] } });
|
|
6191
|
+
], template: "<!-- The role and aria attributes live on the host element, applied by the CDK dialog container. -->\n<div\n #surface\n class=\"md3-fullscreen-dialog-container\"\n [class.md3-active]=\"isActive()\"\n [class.md-scheme-dark]=\"config.scheme == 'dark'\"\n [class.md-scheme-light]=\"config.scheme == 'light'\"\n [attr.dir]=\"config.direction ?? null\">\n <div class=\"md3-panes-container md3-scrollable\">\n <!--\n The CDK attaches the dialog content to the first portal outlet of\n this template, so the main pane has to come first. The panes are\n placed by grid area, which makes the DOM order irrelevant visually.\n -->\n <div class=\"md3-pane md3-pane-main\" #mainPane>\n <ng-template cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-start\">\n <ng-template #startOutlet cdkPortalOutlet></ng-template>\n </div>\n <div class=\"md3-pane md3-pane-end\">\n <ng-template #endOutlet cdkPortalOutlet></ng-template>\n </div>\n </div>\n</div>\n", styles: ["::ng-deep .cdk-overlay-container{position:fixed;z-index:1000;inset:0;pointer-events:none;font-size:1rem}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper{position:absolute;display:flex;inset:0;pointer-events:none;overflow:hidden}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper:has(>.md3-fullscreen-dialog-panel){padding:0}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel{width:100%;height:100%;max-width:none;pointer-events:auto}::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-closing,::ng-deep .cdk-overlay-container .cdk-global-overlay-wrapper .md3-fullscreen-dialog-panel.md3-dialog-hidden{pointer-events:none}:host{display:block;height:100%;width:100%;outline:0}:host .md3-fullscreen-dialog-container{display:grid;grid-template-rows:minmax(0,1fr);height:100%;min-height:0;overflow:hidden;color:rgb(var(--md-scheme-on-surface));background-color:rgb(var(--md-scheme-surface));transition:all var(--md-motion-expressive-default-spatial-duration) var(--md-motion-expressive-default-spatial-easing);opacity:0;transform:translateY(1.5em)}:host .md3-fullscreen-dialog-container.md3-active{opacity:1;transform:none}:host .md3-panes-container{display:grid;grid-template-areas:\"start main end\";grid-template-columns:auto minmax(0,1fr) auto;grid-template-rows:minmax(0,1fr);min-width:0;min-height:0;overflow:hidden}:host .md3-panes-container .md3-pane{justify-self:stretch;align-self:stretch;min-width:0;min-height:0;height:100%;overflow:hidden}:host .md3-panes-container .md3-pane.md3-pane-start{grid-area:start}:host .md3-panes-container .md3-pane.md3-pane-main{position:relative;grid-area:main;z-index:1;display:grid;grid-template-rows:minmax(0,1fr);grid-template-columns:minmax(0,1fr)}:host .md3-panes-container .md3-pane.md3-pane-main>::ng-deep *{min-width:0;min-height:0;height:100%;max-height:100dvh;max-width:100dvw}:host .md3-panes-container .md3-pane.md3-pane-end{grid-area:end}\n"] }]
|
|
6192
|
+
}], propDecorators: { surface: [{ type: i0.ViewChild, args: ['surface', { isSignal: true }] }], mainPane: [{ type: i0.ViewChild, args: ['mainPane', { isSignal: true }] }], startOutlet: [{ type: i0.ViewChild, args: ['startOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }], endOutlet: [{ type: i0.ViewChild, args: ['endOutlet', { ...{ read: CdkPortalOutlet }, isSignal: true }] }] } });
|
|
6037
6193
|
|
|
6038
6194
|
const PANEL_CLASS = 'md3-dialog-panel';
|
|
6039
6195
|
const FULL_SCREEN_PANEL_CLASS = 'md3-fullscreen-dialog-panel';
|
|
@@ -6539,35 +6695,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
6539
6695
|
args: [{ selector: 'md3-dialog-actions', imports: [], template: "<div class=\"md3-actions\">\n <ng-content></ng-content>\n</div>", styles: [":host{display:block;margin:1.5em}:host .md3-actions{display:flex;gap:1em;flex-direction:row-reverse}\n"] }]
|
|
6540
6696
|
}] });
|
|
6541
6697
|
|
|
6542
|
-
/**
|
|
6543
|
-
* Header of a full screen dialog: a leading icon button to leave the dialog,
|
|
6544
|
-
* the headline, and a trailing action. It sticks to the top of the dialog while
|
|
6545
|
-
* the content scrolls underneath.
|
|
6546
|
-
*/
|
|
6547
|
-
class FullScreenDialogHeader {
|
|
6548
|
-
// context values
|
|
6549
|
-
buttonContextSize = signal('small', /* @ts-ignore */
|
|
6550
|
-
...(ngDevMode ? [{ debugName: "buttonContextSize" }] : /* istanbul ignore next */ []));
|
|
6551
|
-
buttonContextWidth = signal('default', /* @ts-ignore */
|
|
6552
|
-
...(ngDevMode ? [{ debugName: "buttonContextWidth" }] : /* istanbul ignore next */ []));
|
|
6553
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: FullScreenDialogHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6554
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.0", type: FullScreenDialogHeader, isStandalone: true, selector: "md3-fullscreen-dialog-header", providers: [
|
|
6555
|
-
{
|
|
6556
|
-
provide: MD3_BUTTON_CONTEXT,
|
|
6557
|
-
useExisting: FullScreenDialogHeader,
|
|
6558
|
-
},
|
|
6559
|
-
], ngImport: i0, template: "<ng-content select=\"[md3-icon-button][md3-header-leading]\"></ng-content>\n<div class=\"md3-title-container\">\n <ng-content></ng-content>\n</div>\n<div class=\"md3-actions-container\">\n <ng-content select=\"[md3-header-trailing]\"></ng-content>\n</div>\n", styles: [":host{--foreground-color: rgb(var(--md-scheme-on-surface));position:sticky;top:0;z-index:3;grid-area:header;display:flex;align-items:center;gap:.5em;height:4em;padding:0 1em;color:var(--foreground-color);background-color:rgb(var(--md-scheme-surface))}:host ::ng-deep [md3-header-leading]:first-child{margin-inline-start:-.5em}:host .md3-title-container{flex:1 1 auto;min-width:0;color:inherit}:host .md3-title-container:first-child{padding-inline-start:.5em}:host .md3-actions-container{display:flex;flex:0 0 auto;align-items:center;gap:.5em}\n"] });
|
|
6560
|
-
}
|
|
6561
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImport: i0, type: FullScreenDialogHeader, decorators: [{
|
|
6562
|
-
type: Component,
|
|
6563
|
-
args: [{ selector: 'md3-fullscreen-dialog-header', imports: [], providers: [
|
|
6564
|
-
{
|
|
6565
|
-
provide: MD3_BUTTON_CONTEXT,
|
|
6566
|
-
useExisting: FullScreenDialogHeader,
|
|
6567
|
-
},
|
|
6568
|
-
], template: "<ng-content select=\"[md3-icon-button][md3-header-leading]\"></ng-content>\n<div class=\"md3-title-container\">\n <ng-content></ng-content>\n</div>\n<div class=\"md3-actions-container\">\n <ng-content select=\"[md3-header-trailing]\"></ng-content>\n</div>\n", styles: [":host{--foreground-color: rgb(var(--md-scheme-on-surface));position:sticky;top:0;z-index:3;grid-area:header;display:flex;align-items:center;gap:.5em;height:4em;padding:0 1em;color:var(--foreground-color);background-color:rgb(var(--md-scheme-surface))}:host ::ng-deep [md3-header-leading]:first-child{margin-inline-start:-.5em}:host .md3-title-container{flex:1 1 auto;min-width:0;color:inherit}:host .md3-title-container:first-child{padding-inline-start:.5em}:host .md3-actions-container{display:flex;flex:0 0 auto;align-items:center;gap:.5em}\n"] }]
|
|
6569
|
-
}] });
|
|
6570
|
-
|
|
6571
6698
|
const MENU_DATA = new InjectionToken('MD3_MENU_DATA');
|
|
6572
6699
|
const MENU_CONFIG = new InjectionToken('MD3_MENU_CONFIG');
|
|
6573
6700
|
const MENU_COMPONENT = new InjectionToken('MD3_MENU_COMPONENT');
|
|
@@ -7598,5 +7725,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.0", ngImpor
|
|
|
7598
7725
|
* Generated bundle index. Do not edit.
|
|
7599
7726
|
*/
|
|
7600
7727
|
|
|
7601
|
-
export { AppBar, AppBarLogo, Avatar, BOTTOM_SHEET_COMPONENT, BOTTOM_SHEET_CONFIG, BOTTOM_SHEET_DATA, Badge, BottomSheetRef, BottomSheetService, Button, ButtonGroup, CAROUSEL_STRATEGIES, Card, Carousel, CarouselItem, Checkbox, ChipAvatar, Chips, CircularProgressIndicator, DIALOG_COMPONENT, DIALOG_CONFIG, DIALOG_DATA, Dialog, DialogActions, DialogBody, DialogHeader, DialogRef, DialogService, Divider, FloatingActionButton, FullScreenDialog,
|
|
7728
|
+
export { AppBar, AppBarLogo, Avatar, BOTTOM_SHEET_COMPONENT, BOTTOM_SHEET_CONFIG, BOTTOM_SHEET_DATA, Badge, BottomSheetRef, BottomSheetService, Button, ButtonGroup, CAROUSEL_STRATEGIES, Card, Carousel, CarouselItem, Checkbox, ChipAvatar, Chips, CircularProgressIndicator, DIALOG_COMPONENT, DIALOG_CONFIG, DIALOG_DATA, Dialog, DialogActions, DialogBody, DialogHeader, DialogRef, DialogService, Divider, FloatingActionButton, FullScreenDialog, Grid, GridItem, IconButton, IconElement, InputElement, Layout, LayoutService, LinearProgressIndicator, List, ListItem, ListItemPrimaryAction, ListLeading, ListSlot, LoadingIndicator, MENU_COMPONENT, MENU_CONFIG, MENU_DATA, MaterialIcon, Menu, MenuGroup, MenuItem, MenuRef, MenuService, ModalBottomSheetRef, NavigationBar, NavigationGroup, NavigationItem, NavigationRail, RadioButton, SIDE_SHEET_COMPONENT, SIDE_SHEET_CONFIG, SIDE_SHEET_DATA, SNACKBAR_ACTION_LABEL, SNACKBAR_CONFIG, SNACKBAR_MESSAGE, Scaffold, ScaffoldBar, ScaffoldPane, ScaffoldRail, SheetsService, SideSheetActions, SideSheetBody, SideSheetHeader, SideSheetRef, Slider, Snackbar, SnackbarRef, SnackbarService, SplitButton, StandardBottomSheetRef, StateComponent, SupportingText, Switch, TextField, Toolbar, ToolbarItem, TypeBody, TypeDisplay, TypeHeadline, TypeLabel, TypeTitle, ViewportService, buildGeometry, clampIndex, indexForScrollOffset, multiBrowseStrategy, parseCarouselAspectRatio, resolveItemGeometry, resolveState, scrollOffsetForIndex, sizeBandFor };
|
|
7602
7729
|
//# sourceMappingURL=almoamendev-ngx-md3.mjs.map
|