@almoamendev/ngx-md3 0.5.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almoamendev/ngx-md3",
3
- "version": "0.5.5",
3
+ "version": "0.7.0",
4
4
  "description": "MD3-style Angular components & style library",
5
5
  "author": "Murtadha (Hussain) Almoamen",
6
6
  "license": "MIT",
@@ -510,6 +510,14 @@ md3-badge {
510
510
  height: 100%;
511
511
  overflow-x: hidden;
512
512
  overflow-y: auto;
513
+
514
+ // A floating toolbar in a scaffold bar covers content that it does not reserve. The
515
+ // scaffold publishes how much, and the fallback is 0, so a layout without one is
516
+ // unchanged. Set these to 0 on a page that needs full-bleed content.
517
+ padding-block-start: var(--md-scaffold-floating-inset-block-start, 0em);
518
+ padding-block-end: var(--md-scaffold-floating-inset-block-end, 0em);
519
+ scroll-padding-block-start: var(--md-scaffold-floating-inset-block-start, 0em);
520
+ scroll-padding-block-end: var(--md-scaffold-floating-inset-block-end, 0em);
513
521
  }
514
522
  }
515
523
 
@@ -53,6 +53,62 @@ type ListLeadingSize = 'image' | 'small-video' | 'large-video';
53
53
  */
54
54
  type CarouselLayout = 'multi-browse';
55
55
 
56
+ /**
57
+ * The toolbar container style.
58
+ *
59
+ * `floating` draws a rounded, elevated container with an outside margin. In a scaffold bar
60
+ * region it leaves the layout flow, so the content passes behind it. In a scaffold rail
61
+ * region it stays in the flow and reserves its own space.
62
+ *
63
+ * `docked` fills its region, has square corners and no elevation. The Material 3
64
+ * specification allows it in a bar region only, because it spans the full window width.
65
+ */
66
+ type ToolbarType = 'floating' | 'docked';
67
+
68
+ /**
69
+ * The toolbar color configuration.
70
+ *
71
+ * `standard` uses a surface container. `vibrant` uses a primary container, and remaps the
72
+ * colors of the buttons inside it, as the Material 3 specification describes.
73
+ */
74
+ type ToolbarColor = 'standard' | 'vibrant';
75
+
76
+ /**
77
+ * The axis the toolbar items follow.
78
+ *
79
+ * The value is optional on the component. When it is not set, a toolbar in a scaffold rail
80
+ * region becomes `vertical`, and every other toolbar becomes `horizontal`.
81
+ */
82
+ type ToolbarOrientation = 'horizontal' | 'vertical';
83
+
84
+ /**
85
+ * Where the toolbar sits along its main axis.
86
+ *
87
+ * A docked toolbar fills its region, so the value moves the item row inside the container. A
88
+ * floating toolbar is as wide as its content, so the value moves the container itself, and the
89
+ * FAB with it, inside the region.
90
+ */
91
+ type ToolbarAlignment = 'start' | 'center' | 'end';
92
+
93
+ /**
94
+ * What the toolbar does when the scaffold main pane scrolls down.
95
+ *
96
+ * `none` does nothing. `hide` moves the toolbar out of the region. `collapse` hides every
97
+ * item that does not carry the `md3-toolbar-persistent` attribute, and keeps the FAB.
98
+ *
99
+ * A vertical toolbar ignores this input.
100
+ */
101
+ type ToolbarScrollAction = 'none' | 'hide' | 'collapse';
102
+
103
+ /**
104
+ * The scaffold region a toolbar sits in, named by its logical side.
105
+ *
106
+ * `blockStart` and `blockEnd` are the top and bottom scaffold bars. `inlineStart` and
107
+ * `inlineEnd` are the leading and trailing scaffold rails. The names are logical, so they
108
+ * follow the document direction.
109
+ */
110
+ type ToolbarRegion = 'blockStart' | 'blockEnd' | 'inlineStart' | 'inlineEnd';
111
+
56
112
  /**
57
113
  * Where the focal (large) items sit within the carousel container.
58
114
  */
@@ -569,26 +625,107 @@ type ViewportWidth = 'compact' | 'medium' | 'expanded' | 'large' | 'extra-large'
569
625
  type ViewportHeight = 'compact' | 'medium' | 'expanded';
570
626
 
571
627
  type Md3NavigationMode = 'none' | 'navigation-bar' | 'navigation-rail' | 'standard-drawer' | 'modal-drawer';
572
- declare class LayoutService {
628
+ /**
629
+ * The state of the window and of the document, for the whole application.
630
+ *
631
+ * This service is a singleton on purpose. A layout region can appear more than once — a page
632
+ * scaffold, and a contained layout inside a full screen dialog — and each one keeps its own
633
+ * scroll and inset state in its own {@link LayoutService}. The window size, the breakpoints,
634
+ * the reading direction and the color scheme belong to the document, so they live here and
635
+ * every layout reads the same values.
636
+ */
637
+ declare class ViewportService {
573
638
  private readonly document;
574
639
  private readonly breakpointObserver;
575
- private readonly router;
576
640
  private readonly widthQueries;
577
641
  private readonly heightQueries;
642
+ readonly viewport: _angular_core.Signal<{
643
+ width: number;
644
+ height: number;
645
+ } | {
646
+ readonly width: number;
647
+ readonly height: number;
648
+ }>;
649
+ readonly widthClass: _angular_core.Signal<ViewportWidth>;
650
+ readonly heightClass: _angular_core.Signal<ViewportHeight>;
651
+ readonly direction: _angular_core.WritableSignal<"ltr" | "rtl">;
652
+ readonly isCompact: _angular_core.Signal<boolean>;
653
+ readonly isMedium: _angular_core.Signal<boolean>;
654
+ readonly isExpanded: _angular_core.Signal<boolean>;
655
+ readonly isLarge: _angular_core.Signal<boolean>;
656
+ readonly isExtraLarge: _angular_core.Signal<boolean>;
657
+ readonly isPortrait: _angular_core.Signal<boolean>;
658
+ readonly isLandscape: _angular_core.Signal<boolean>;
659
+ readonly preferredNavigationMode: _angular_core.Signal<"navigation-bar" | "navigation-rail" | "standard-drawer">;
660
+ darkMode: _angular_core.WritableSignal<boolean>;
661
+ constructor();
662
+ setDirection(direction: 'ltr' | 'rtl'): void;
663
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ViewportService, never>;
664
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ViewportService>;
665
+ }
666
+
667
+ type FloatingBarSide = 'blockStart' | 'blockEnd';
668
+ interface FloatingInset {
669
+ blockStart: number;
670
+ blockEnd: number;
671
+ }
672
+
673
+ /**
674
+ * The state of one layout container: what its main pane scrolls, and what its floating bars
675
+ * cover.
676
+ *
677
+ * The service is provided at the root, and the page scaffold uses that root instance. A
678
+ * contained layout — `md3-layout`, the one a full screen dialog holds — provides its own
679
+ * instance instead, so a toolbar inside it reads the scroll and the insets of that layout and
680
+ * never of the page behind it.
681
+ *
682
+ * The window size, the breakpoints, the reading direction and the color scheme belong to the
683
+ * document, not to a container. They live in {@link ViewportService}, and every instance of
684
+ * this service exposes the same signals, so an instance stays a complete view of the layout.
685
+ */
686
+ declare class LayoutService {
687
+ private readonly viewportService;
688
+ private readonly router;
578
689
  private mainPaneSub?;
579
690
  private mainPaneEl?;
580
691
  private panesContainerResizeObserver?;
581
692
  private panesContainerResizeListener?;
693
+ /** Floating bars currently registered, keyed by the measured element. */
694
+ private readonly floatingBars;
695
+ /** How far the main pane must move before the scroll direction flips. Stops jitter. */
696
+ private static readonly scrollDirectionThreshold;
697
+ private scrollPosition;
582
698
  readonly mainScrollTop: _angular_core.WritableSignal<number>;
583
699
  readonly mainIsScrolled: _angular_core.Signal<boolean>;
584
700
  /**
585
- * Distance, in pixels, between the viewport bottom and the bottom edge of
586
- * the scaffold's .md3-panes-container i.e. whatever the bottom scaffold
587
- * bar (nav bar) currently reserves, or 0 when there is none. Overlay-based
588
- * components anchored to the viewport bottom (like Snackbar) read this so
589
- * they never render lower than the panes container.
701
+ * True while the main pane moves down, false while it moves up. A small threshold keeps
702
+ * a jitter from flipping the value. Components that react to scrolling — the app bar and
703
+ * the toolbar read this, so they can never disagree.
704
+ */
705
+ readonly isScrollingDown: _angular_core.WritableSignal<boolean>;
706
+ /**
707
+ * Distance, in pixels, between the bottom of the container and the bottom edge of
708
+ * the .md3-panes-container — i.e. whatever the bottom bar currently reserves, or 0 when
709
+ * there is none. Overlay-based components anchored to the bottom (like Snackbar) read
710
+ * this so they never render lower than the panes container.
590
711
  */
591
712
  readonly bottomInset: _angular_core.WritableSignal<number>;
713
+ /**
714
+ * Space a floating bar covers but does not reserve, per logical block side.
715
+ *
716
+ * A floating toolbar in a bar region leaves the layout flow, so its grid track collapses
717
+ * and the content flows under it. This signal reports what it covers, so the layout can
718
+ * pad the main pane and overlays can stay clear of it.
719
+ *
720
+ * A floating toolbar in a *rail* region stays in the flow and reserves its own space, so
721
+ * it never appears here.
722
+ */
723
+ readonly floatingInset: _angular_core.WritableSignal<FloatingInset>;
724
+ /**
725
+ * The distance from the bottom that an anchored overlay must keep clear. It covers both
726
+ * the reserved bottom bar and any floating bottom bar over it.
727
+ */
728
+ readonly bottomSafeInset: _angular_core.Signal<number>;
592
729
  readonly viewport: _angular_core.Signal<{
593
730
  width: number;
594
731
  height: number;
@@ -613,7 +750,24 @@ declare class LayoutService {
613
750
  private scrollMainPaneToTop;
614
751
  registerMainPane(element: HTMLElement): void;
615
752
  unregisterMainPane(element: HTMLElement): void;
753
+ private resetScrollDirection;
754
+ private updateScrollDirection;
616
755
  registerPanesContainer(element: HTMLElement): void;
756
+ /**
757
+ * Register a floating bar so the layout and the overlays know what it covers.
758
+ *
759
+ * Call this for a floating toolbar in a *bar* region only. A rail region keeps the toolbar
760
+ * in the layout flow, so it reserves its space and needs no inset.
761
+ */
762
+ registerFloatingBar(element: HTMLElement, side: FloatingBarSide): void;
763
+ unregisterFloatingBar(element: HTMLElement): void;
764
+ private measureFloatingBars;
765
+ /**
766
+ * `offsetHeight` ignores transforms. So a toolbar that scrolling has hidden or collapsed
767
+ * still reports its expanded size, and the content padding never moves while the user
768
+ * scrolls.
769
+ */
770
+ private measureBlockSize;
617
771
  unregisterPanesContainer(): void;
618
772
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutService, never>;
619
773
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<LayoutService>;
@@ -627,12 +781,43 @@ declare class Scaffold implements AfterViewInit, OnDestroy {
627
781
  private sheets;
628
782
  private bottomSheets;
629
783
  private layout;
784
+ private el;
785
+ constructor();
630
786
  ngAfterViewInit(): void;
631
787
  ngOnDestroy(): void;
632
788
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<Scaffold, never>;
633
789
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<Scaffold, "md3-scaffold", never, {}, {}, never, ["[md3-scaffold-bar=top]", "[md3-scaffold-rail=leading]", "[md3-scaffold-pane=start]", "[md3-scaffold-pane=main]", "[md3-scaffold-pane=end]", "[md3-scaffold-rail=trailing]", "[md3-scaffold-bar=bottom]"], true, never>;
634
790
  }
635
791
 
792
+ /**
793
+ * A layout region shell that fills its parent instead of the window.
794
+ *
795
+ * It places the same regions as `md3-scaffold` — the bar rows, the rail columns and the three
796
+ * panes — so the same region attributes work inside it:
797
+ *
798
+ * ```html
799
+ * <md3-layout>
800
+ * <md3-toolbar md3-scaffold-bar="bottom" toolbar-type="floating">...</md3-toolbar>
801
+ *
802
+ * <div md3-scaffold-pane="main">...</div>
803
+ * </md3-layout>
804
+ * ```
805
+ *
806
+ * Use it wherever a page-sized scaffold does not fit: the content of a full screen dialog, a
807
+ * card, a preview pane. A full screen dialog is the common one, because a toolbar needs a bar
808
+ * or a rail region and the dialog shell has none of its own.
809
+ *
810
+ * The layout provides its own {@link LayoutService}, so everything inside it reads the scroll
811
+ * position and the floating insets of *this* container. A floating toolbar therefore pads the
812
+ * main pane of the layout, and `scroll-action` follows the pane of the layout — never the page
813
+ * behind it. The window size, the breakpoints, the reading direction and the color scheme stay
814
+ * shared with the rest of the application.
815
+ */
816
+ declare class Layout extends Scaffold {
817
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Layout, never>;
818
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Layout, "md3-layout", never, {}, {}, never, ["[md3-scaffold-bar=top]", "[md3-scaffold-rail=leading]", "[md3-scaffold-pane=start]", "[md3-scaffold-pane=main]", "[md3-scaffold-pane=end]", "[md3-scaffold-rail=trailing]", "[md3-scaffold-bar=bottom]"], true, never>;
819
+ }
820
+
636
821
  declare class ScaffoldBar {
637
822
  region: _angular_core.InputSignal<"top" | "bottom">;
638
823
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ScaffoldBar, never>;
@@ -1343,6 +1528,16 @@ type AppBarScrollingStyle = 'none' | 'transparent' | 'elevate';
1343
1528
  declare class AppBar implements ButtonContext {
1344
1529
  private el;
1345
1530
  private layoutService;
1531
+ private readonly inDialog;
1532
+ /**
1533
+ * The landmark role of the bar.
1534
+ *
1535
+ * A page has one banner, and the app bar of the page is it. A bar inside a dialog is not
1536
+ * the banner of the document — a banner nested in a dialog misleads a screen reader — so a
1537
+ * bar that finds itself in one carries no role. Set this input to force either value.
1538
+ */
1539
+ barRole: _angular_core.InputSignal<"none" | "banner" | null>;
1540
+ protected readonly resolvedRole: Signal<string | null>;
1346
1541
  title: _angular_core.InputSignal<string | null>;
1347
1542
  subtitle: _angular_core.InputSignal<string | null>;
1348
1543
  appBarType: _angular_core.InputSignal<AppBarType>;
@@ -1354,8 +1549,7 @@ declare class AppBar implements ButtonContext {
1354
1549
  hasLogo: Signal<boolean>;
1355
1550
  hasAvatar: Signal<boolean>;
1356
1551
  mainIsScrolled: Signal<boolean>;
1357
- isScrollingDown: _angular_core.WritableSignal<boolean>;
1358
- private scrollPosition;
1552
+ isScrollingDown: Signal<boolean>;
1359
1553
  private bottomExpandedHeight;
1360
1554
  private bottomCollapse;
1361
1555
  buttonContextSize: Signal<ButtonSize>;
@@ -1363,11 +1557,10 @@ declare class AppBar implements ButtonContext {
1363
1557
  get element(): HTMLElement;
1364
1558
  private getBottomOpacity;
1365
1559
  private isBottomCollapsed;
1366
- private updateScrollDirection;
1367
1560
  private hasCollapsibleBottom;
1368
1561
  private getHostFontSize;
1369
1562
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<AppBar, never>;
1370
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppBar, "md3-app-bar", never, { "title": { "alias": "bar-title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "bar-subtitle"; "required": false; "isSignal": true; }; "appBarType": { "alias": "bar-type"; "required": false; "isSignal": true; }; "appBarScrollingStyle": { "alias": "scroll-style"; "required": false; "isSignal": true; }; "autoHide": { "alias": "auto-hide"; "required": false; "isSignal": true; }; "centerAligned": { "alias": "center-aligned"; "required": false; "isSignal": true; }; }, {}, ["logo", "avatar"], ["[md3-app-bar-leading]", "[md3-search-leading]", "[md3-input-element]", "[md3-search-trailing]", "[md3-app-bar-logo]", "[md3-app-bar-trailing]", "[md3-avatar]"], true, never>;
1563
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<AppBar, "md3-app-bar", never, { "barRole": { "alias": "bar-role"; "required": false; "isSignal": true; }; "title": { "alias": "bar-title"; "required": false; "isSignal": true; }; "subtitle": { "alias": "bar-subtitle"; "required": false; "isSignal": true; }; "appBarType": { "alias": "bar-type"; "required": false; "isSignal": true; }; "appBarScrollingStyle": { "alias": "scroll-style"; "required": false; "isSignal": true; }; "autoHide": { "alias": "auto-hide"; "required": false; "isSignal": true; }; "centerAligned": { "alias": "center-aligned"; "required": false; "isSignal": true; }; }, {}, ["logo", "avatar"], ["[md3-app-bar-leading]", "[md3-search-leading]", "[md3-input-element]", "[md3-search-trailing]", "[md3-app-bar-logo]", "[md3-app-bar-trailing]", "[md3-avatar]"], true, never>;
1371
1564
  }
1372
1565
 
1373
1566
  declare class AppBarLogo {
@@ -1375,6 +1568,119 @@ declare class AppBarLogo {
1375
1568
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<AppBarLogo, "[md3-app-bar-logo]", never, {}, {}, never, never, true, never>;
1376
1569
  }
1377
1570
 
1571
+ /**
1572
+ * Material 3 toolbar.
1573
+ *
1574
+ * The toolbar holds the actions of the current page. Put it in a scaffold region, and the
1575
+ * region decides where it goes:
1576
+ *
1577
+ * ```html
1578
+ * <md3-toolbar md3-scaffold-bar="bottom" toolbar-type="floating" scroll-action="collapse">
1579
+ * <md3-toolbar-item><button md3-icon-button>...</button></md3-toolbar-item>
1580
+ * <md3-toolbar-item md3-toolbar-persistent><button md3-icon-button>...</button></md3-toolbar-item>
1581
+ * <button md3-fab>...</button>
1582
+ * </md3-toolbar>
1583
+ * ```
1584
+ *
1585
+ * Every action goes inside an `md3-toolbar-item`. The toolbar projects that element only. A FAB is
1586
+ * the one exception: it sits beside the container, and a floating toolbar takes it.
1587
+ *
1588
+ * A **floating** toolbar in a *bar* region leaves the layout flow, so the content passes
1589
+ * behind it. The scaffold pads the main pane by the height it covers. In a *rail* region it
1590
+ * stays in the flow and reserves its own space, so no padding is necessary.
1591
+ *
1592
+ * A **docked** toolbar fills its region. The specification allows it in a bar region only.
1593
+ *
1594
+ * Group actions with `md3-button-group`. The toolbar has one slots region, and it keeps the
1595
+ * authored order. The space between the items follows the free space of the container, between
1596
+ * `--md-toolbar-gap-min` and `--md-toolbar-gap-max`.
1597
+ */
1598
+ declare class Toolbar implements ButtonContext, OnDestroy {
1599
+ private readonly el;
1600
+ private readonly layout;
1601
+ private readonly scaffoldBar;
1602
+ private readonly scaffoldRail;
1603
+ toolbarType: _angular_core.InputSignal<ToolbarType>;
1604
+ toolbarColor: _angular_core.InputSignal<ToolbarColor>;
1605
+ /**
1606
+ * Leave this unset to follow the region. A rail region gives `vertical`, and every other
1607
+ * placement gives `horizontal`. Read `effectiveOrientation` for the resolved value.
1608
+ */
1609
+ orientation: _angular_core.InputSignal<ToolbarOrientation | null>;
1610
+ alignment: _angular_core.InputSignal<ToolbarAlignment>;
1611
+ scrollAction: _angular_core.InputSignal<ToolbarScrollAction>;
1612
+ fabPosition: _angular_core.InputSignal<"start" | "end">;
1613
+ /** The collapse state. Scrolling writes to it, and you can read or set it yourself. */
1614
+ expanded: _angular_core.ModelSignal<boolean>;
1615
+ private readonly layoutElement;
1616
+ private readonly containerElement;
1617
+ private readonly slotsElement;
1618
+ private readonly fab;
1619
+ /** Set from the DOM, because `md3-toolbar-persistent` is a plain attribute, not a directive. */
1620
+ private readonly hasPersistentItem;
1621
+ private readonly hasFocusWithin;
1622
+ private persistentObserver?;
1623
+ private readonly isBrowser;
1624
+ /** The last published free space, to keep an unchanged measurement from writing to the DOM. */
1625
+ private lastGap;
1626
+ readonly isFloating: Signal<boolean>;
1627
+ readonly effectiveOrientation: Signal<ToolbarOrientation>;
1628
+ /** The logical side of the scaffold region, or null outside a scaffold. */
1629
+ readonly region: Signal<ToolbarRegion | null>;
1630
+ protected readonly isBarRegion: Signal<boolean>;
1631
+ protected readonly isRailRegion: Signal<boolean>;
1632
+ /** A floating toolbar inside a scaffold region needs the region to stop clipping it. */
1633
+ protected readonly isFloatingRegion: Signal<boolean>;
1634
+ /** Only a floating bar covers content it does not reserve. Everything else reserves its space. */
1635
+ private readonly coversContent;
1636
+ /** Something must survive a collapse, or a collapse is just a hide. */
1637
+ private readonly canCollapse;
1638
+ /** With a FAB and no marked item, a collapse takes the container away and the FAB stays alone. */
1639
+ protected readonly collapsesToFab: Signal<boolean>;
1640
+ /** A vertical toolbar never reacts to scrolling, and a docked one never collapses. */
1641
+ readonly resolvedScrollAction: Signal<ToolbarScrollAction>;
1642
+ readonly isHidden: _angular_core.WritableSignal<boolean>;
1643
+ readonly isCollapsed: Signal<boolean>;
1644
+ /**
1645
+ * The collapsed state in which the FAB stays alone.
1646
+ *
1647
+ * This is the state, not the capability. A FAB by itself must never take the container
1648
+ * away, because a toolbar that does not collapse keeps its items at all times.
1649
+ */
1650
+ protected readonly isCollapsedToFab: Signal<boolean>;
1651
+ buttonContextSize: Signal<ButtonSize>;
1652
+ constructor();
1653
+ ngOnDestroy(): void;
1654
+ get element(): HTMLElement;
1655
+ protected onFocusIn(): void;
1656
+ protected onFocusOut(event: FocusEvent): void;
1657
+ private updateScrollState;
1658
+ /**
1659
+ * Divide the free space of the container between the gaps.
1660
+ *
1661
+ * The measurement starts from the host, because the host holds the space the region gives
1662
+ * the toolbar. A floating container is only as wide as its content, so reading the container
1663
+ * itself would feed the gap back into the measurement and the value would never settle.
1664
+ */
1665
+ private measureGap;
1666
+ private publishGap;
1667
+ private extent;
1668
+ private contentExtent;
1669
+ private paddingExtent;
1670
+ /** What the other children of the layout take, the flex gap that separates them included. */
1671
+ private siblingExtent;
1672
+ private watchPersistentItems;
1673
+ private checkConfiguration;
1674
+ private warn;
1675
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<Toolbar, never>;
1676
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<Toolbar, "md3-toolbar", never, { "toolbarType": { "alias": "toolbar-type"; "required": false; "isSignal": true; }; "toolbarColor": { "alias": "toolbar-color"; "required": false; "isSignal": true; }; "orientation": { "alias": "orientation"; "required": false; "isSignal": true; }; "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; "scrollAction": { "alias": "scroll-action"; "required": false; "isSignal": true; }; "fabPosition": { "alias": "fab-position"; "required": false; "isSignal": true; }; "expanded": { "alias": "expanded"; "required": false; "isSignal": true; }; }, { "expanded": "expandedChange"; }, ["fab"], ["[md3-fab]", "md3-toolbar-item"], true, never>;
1677
+ }
1678
+
1679
+ declare class ToolbarItem {
1680
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ToolbarItem, never>;
1681
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ToolbarItem, "md3-toolbar-item", never, {}, {}, never, never, true, never>;
1682
+ }
1683
+
1378
1684
  declare class NavigationItem {
1379
1685
  private readonly el;
1380
1686
  private routerLinkActive;
@@ -1680,21 +1986,35 @@ declare class DialogActions {
1680
1986
  }
1681
1987
 
1682
1988
  /**
1683
- * Material 3 full screen dialog shell. It covers the viewport and lays its
1684
- * content out like the scaffold does, with a main pane and a side sheet outlet
1685
- * on each side, so side sheets opened while it is up land inside the dialog
1686
- * instead of behind it.
1989
+ * Material 3 full screen dialog shell. It covers the viewport and holds the content.
1990
+ *
1991
+ * The content is an `md3-layout`. The layout places the regions the bar rows for an app bar
1992
+ * or a toolbar, the rail columns, and the panes where side sheets open — so the dialog itself
1993
+ * places nothing but the content. A content root that is not a layout gets a warning in
1994
+ * development mode, and the shell falls back to panes of its own, so a side sheet never opens
1995
+ * behind the dialog where nobody can see it.
1687
1996
  */
1688
1997
  declare class FullScreenDialog extends CdkDialogContainer implements DialogContainer, AfterViewInit {
1689
1998
  private readonly surface;
1999
+ private readonly mainPane;
1690
2000
  private readonly startOutlet;
1691
2001
  private readonly endOutlet;
1692
2002
  private readonly sheets;
2003
+ /** True while the shell holds the side sheet outlets, which happens without a layout only. */
2004
+ private ownsSideSheetOutlets;
1693
2005
  isActive: _angular_core.WritableSignal<boolean>;
1694
2006
  protected readonly config: DialogConfig<unknown>;
1695
2007
  get surfaceElement(): HTMLElement | null;
1696
2008
  ngAfterViewInit(): void;
1697
2009
  ngOnDestroy(): void;
2010
+ /**
2011
+ * The layout at the root of the content, if the content brought one.
2012
+ *
2013
+ * The root is either the layout itself, or the component that holds it — a dialog is
2014
+ * normally opened with a component whose own template starts with `md3-layout`.
2015
+ */
2016
+ private findContentLayout;
2017
+ private checkContentLayout;
1698
2018
  startEnterAnimation(): void;
1699
2019
  setActive(value: boolean): void;
1700
2020
  recaptureFocus(): void;
@@ -1702,18 +2022,6 @@ declare class FullScreenDialog extends CdkDialogContainer implements DialogConta
1702
2022
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<FullScreenDialog, "md3-fullscreen-dialog", never, {}, {}, never, never, true, never>;
1703
2023
  }
1704
2024
 
1705
- /**
1706
- * Header of a full screen dialog: a leading icon button to leave the dialog,
1707
- * the headline, and a trailing action. It sticks to the top of the dialog while
1708
- * the content scrolls underneath.
1709
- */
1710
- declare class FullScreenDialogHeader implements ButtonContext {
1711
- buttonContextSize: Signal<ButtonSize>;
1712
- buttonContextWidth: Signal<IconButtonWidth>;
1713
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<FullScreenDialogHeader, never>;
1714
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FullScreenDialogHeader, "md3-fullscreen-dialog-header", never, {}, {}, never, ["[md3-icon-button][md3-header-leading]", "*", "[md3-header-trailing]"], true, never>;
1715
- }
1716
-
1717
2025
  declare class Menu implements AfterContentInit {
1718
2026
  private el;
1719
2027
  private readonly portalOutlet;
@@ -2148,5 +2456,5 @@ declare class SnackbarService {
2148
2456
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<SnackbarService>;
2149
2457
  }
2150
2458
 
2151
- 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, FullScreenDialogHeader, Grid, GridItem, IconButton, IconElement, InputElement, 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, TypeBody, TypeDisplay, TypeHeadline, TypeLabel, TypeTitle, buildGeometry, clampIndex, indexForScrollOffset, multiBrowseStrategy, parseCarouselAspectRatio, resolveItemGeometry, resolveState, scrollOffsetForIndex, sizeBandFor };
2152
- export type { AppBarScrollingStyle, AppBarType, BottomSheetConfig, BottomSheetContainer, BottomSheetState, BottomSheetSurfaceHost, BottomSheetType, ButtonGroupSelection, ButtonGroupType, ButtonSize, ButtonType, CardType, CarouselAlignment, CarouselArrangement, CarouselGeometry, CarouselItemGeometry, CarouselItemSize, CarouselKeyline, CarouselKeylineState, CarouselLayout, CarouselOrientation, CarouselStrategy, CarouselStrategyContext, ChipStyle, ChipType, DialogConfig, DialogContainer, DialogRole, FabSize, FabType, FullScreenDialogConfig, IconButtonType, IconButtonWidth, ListLeadingSize, ListLeadingType, Md3NavigationMode, MenuConfig, MenuPositionOrigin, MenuPositionX, MenuPositionY, MenuScrollStrategy, PreviousDialog, SideSheetConfig, SideSheetContainer, SideSheetSide, SideSheetType, SliderSize, SnackbarConfig, SnackbarDismiss, SnackbarDismissReason, SnackbarPoliteness, SplitButtonType, StandardBottomSheetHost, TextColor, TextSize };
2459
+ 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 };
2460
+ export type { AppBarScrollingStyle, AppBarType, BottomSheetConfig, BottomSheetContainer, BottomSheetState, BottomSheetSurfaceHost, BottomSheetType, ButtonGroupSelection, ButtonGroupType, ButtonSize, ButtonType, CardType, CarouselAlignment, CarouselArrangement, CarouselGeometry, CarouselItemGeometry, CarouselItemSize, CarouselKeyline, CarouselKeylineState, CarouselLayout, CarouselOrientation, CarouselStrategy, CarouselStrategyContext, ChipStyle, ChipType, DialogConfig, DialogContainer, DialogRole, FabSize, FabType, FloatingBarSide, FloatingInset, FullScreenDialogConfig, IconButtonType, IconButtonWidth, ListLeadingSize, ListLeadingType, Md3NavigationMode, MenuConfig, MenuPositionOrigin, MenuPositionX, MenuPositionY, MenuScrollStrategy, PreviousDialog, SideSheetConfig, SideSheetContainer, SideSheetSide, SideSheetType, SliderSize, SnackbarConfig, SnackbarDismiss, SnackbarDismissReason, SnackbarPoliteness, SplitButtonType, StandardBottomSheetHost, TextColor, TextSize, ToolbarAlignment, ToolbarColor, ToolbarOrientation, ToolbarRegion, ToolbarScrollAction, ToolbarType };