md-navigation-rail spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
Top-level destinations on a large screen. A vertical rail of 3–7
destinations that can expand into a labelled drawer, host a FAB and a logo, and
optionally behave modally. It owns the active index, the expansion state and
roving focus across its
md-navigation-rail-tab children.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Click the menu button to expand the rail.
</main>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '404px', inlineSize: '100%', maxInlineSize: '460px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail expandable label="Main navigation" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<main style={{ flex: '1', padding: '20px', background: 'var(--md-sys-color-surface-container-low)', color: 'var(--md-sys-color-on-surface)', font: '14px/1.6 system-ui' }}>
Click the menu button to expand the rail.
</main>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Click the menu button to expand the rail.
</main>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Click the menu button to expand the rail.
</main>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Click the menu button to expand the rail.
</main>
</div>
Already installed? See the
Installation guide for one-time package setup
(core + tokens, fonts). Each tab below shows two patterns for using
md-navigation-rail in your project: Option A registers every AWC UI
component at once (simplest), Option B imports only this component for
tree-shake-friendly bundles.
<!-- ─── Option A: global registration (all components) ─── -->
<script type="module">
import '@awc-ui/core/define';
</script>
<!-- ─── Option B: single import (tree-shake only md-navigation-rail) ─── -->
<script type="module">
import '@awc-ui/core/components/md-navigation-rail';
</script>
<md-navigation-rail></md-navigation-rail>// ─── Option A: typed React wrapper (registers all components) ───
// Importing from '@awc-ui/react' calls defineCustomElements() as a
// side effect, so every md-* element becomes available in the browser.
import { MdNavigationRail } from '@awc-ui/react';
export function Example() {
return <MdNavigationRail></MdNavigationRail>;
}
// ─── Option B: single import (tree-shake to only md-navigation-rail) ───
// Skip the wrapper and use the raw custom element. Smallest bundle,
// but you lose typed props/events on JSX.
import '@awc-ui/core/components/md-navigation-rail';
export function ExampleTreeShaken() {
return <md-navigation-rail></md-navigation-rail>;
}// ─── Option A: schema module (any md-* element accepted) ───
// Pair with `defineCustomElements(window)` in main.ts.
import { Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
template: `<md-navigation-rail></md-navigation-rail>`,
})
export class ExampleComponent {}
// ─── Option B: typed directive (tree-shake friendly) ───
// Pair with `import '@awc-ui/core/components/md-navigation-rail'` in main.ts.
import { Component } from '@angular/core';
import { MdNavigationRail } from '@awc-ui/angular';
@Component({
standalone: true,
imports: [MdNavigationRail],
template: `<md-navigation-rail></md-navigation-rail>`,
})
export class ExampleTreeShakenComponent {}<!-- ─── Option A: typed Vue wrapper (registers all components) ─── -->
<script setup lang="ts">
import { MdNavigationRail } from '@awc-ui/vue';
</script>
<template>
<MdNavigationRail></MdNavigationRail>
</template>
<!-- ─── Option B: single import (tree-shake to only md-navigation-rail) ─── -->
<script setup lang="ts">
import '@awc-ui/core/components/md-navigation-rail';
</script>
<template>
<md-navigation-rail></md-navigation-rail>
</template><!-- ─── Option A: global registration (done once in main entry) ─── -->
<!-- main.ts: -->
<!-- import { defineCustomElements } from '@awc-ui/svelte'; -->
<!-- defineCustomElements(window); -->
<md-navigation-rail></md-navigation-rail>
<!-- ─── Option B: single import (tree-shake to only md-navigation-rail) ─── -->
<script lang="ts">
import '@awc-ui/core/components/md-navigation-rail';
</script>
<md-navigation-rail></md-navigation-rail>| Situation | Use instead |
|---|---|
| Compact / mobile layouts, or bottom navigation | md-navigation-bar — the rail’s own orientation="horizontal" is a top-of-page bar for wide layouts, not a substitute |
| Sibling views inside one screen | md-tabs |
| A temporary set of actions | md-menu |
| Supplementary panel content | md-side-sheet |
| A linear flow | md-stepper |
| Need | Setting |
|---|---|
| Icons only, labels underneath | variant="standard" (default) |
| Icons beside labels, wider | variant="expanded" |
| A user-driven toggle between them | expandable |
| Overlay on a scrim (styling only — no focus trap) | modal |
| Where destinations sit vertically | alignment="top" / "middle" / "bottom" |
| Brand mark, primary action, account | logo / fab / footer slots |
| Real links instead of buttons | href on the tab |
standard is the spec’s collapsed rail: 80px wide, icon over label.
expanded puts the icon and label inline in a 220–360px drawer.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="standard" label="Standard rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="expanded" label="Expanded rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail variant="standard" label="Standard rail" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail variant="expanded" label="Expanded rail" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="standard" label="Standard rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="expanded" label="Expanded rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="standard" label="Standard rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="expanded" label="Expanded rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="standard" label="Standard rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail variant="expanded" label="Expanded rail" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>expandable renders a built-in leading menu button that toggles between the two
variants; its glyph animates from menu to menu_open. Give it a localized
toggle-label. If you would rather supply your own control, leave expandable
off and put a button in the header slot wired to expand() / collapse() /
toggle().
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable toggle-label="Toggle navigation" label="Mail" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '384px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail expandable toggleLabel="Toggle navigation" label="Mail" activeIndex="0">
<MdNavigationRailTab icon="inbox" label="Inbox" value="inbox" badgeValue="3"></MdNavigationRailTab>
<MdNavigationRailTab icon="send" label="Sent" value="sent"></MdNavigationRailTab>
<MdNavigationRailTab icon="drafts" label="Drafts" value="drafts"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable toggle-label="Toggle navigation" label="Mail" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable toggle-label="Toggle navigation" label="Mail" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable toggle-label="Toggle navigation" label="Mail" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
</md-navigation-rail>
</div>The FAB goes in the fab slot at the top of the rail — M3 is explicit that
it must not sit below the destinations. Two logo slots let you swap a mark
(logo) for a wordmark (logo-expanded) across the transition. header holds
a leading control, footer holds utilities or an account destination.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 584px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Acme" active-index="0">
<span slot="logo" class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span slot="logo-expanded" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-fab slot="fab" icon="edit" label="Compose" aria-label="Compose"></md-fab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="schedule" label="Scheduled" value="scheduled"></md-navigation-rail-tab>
<md-icon-button slot="footer" icon="help" aria-label="Help"></md-icon-button>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdFab, MdIconButton, MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '584px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail expandable label="Acme" activeIndex="0">
<span slot="logo" className="material-symbols-outlined" style={{ fontSize: '28px', color: 'var(--md-sys-color-primary)' }}>hexagon</span>
<span slot="logo-expanded" style={{ display: 'inline-flex', alignItems: 'center', gap: '8px', fontWeight: '600' }}>
<span className="material-symbols-outlined" style={{ fontSize: '28px', color: 'var(--md-sys-color-primary)' }}>hexagon</span>
<span>Acme</span>
</span>
<MdFab slot="fab" icon="edit" label="Compose" aria-label="Compose"></MdFab>
<MdNavigationRailTab icon="inbox" label="Inbox" value="inbox"></MdNavigationRailTab>
<MdNavigationRailTab icon="send" label="Sent" value="sent"></MdNavigationRailTab>
<MdNavigationRailTab icon="schedule" label="Scheduled" value="scheduled"></MdNavigationRailTab>
<MdIconButton slot="footer" icon="help" aria-label="Help"></MdIconButton>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 584px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Acme" active-index="0">
<span slot="logo" class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span slot="logo-expanded" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-fab slot="fab" icon="edit" label="Compose" aria-label="Compose"></md-fab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="schedule" label="Scheduled" value="scheduled"></md-navigation-rail-tab>
<md-icon-button slot="footer" icon="help" aria-label="Help"></md-icon-button>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 584px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Acme" active-index="0">
<span slot="logo" class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span slot="logo-expanded" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-fab slot="fab" icon="edit" label="Compose" aria-label="Compose"></md-fab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="schedule" label="Scheduled" value="scheduled"></md-navigation-rail-tab>
<md-icon-button slot="footer" icon="help" aria-label="Help"></md-icon-button>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 584px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail expandable label="Acme" active-index="0">
<span slot="logo" class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span slot="logo-expanded" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-fab slot="fab" icon="edit" label="Compose" aria-label="Compose"></md-fab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="send" label="Sent" value="sent"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="schedule" label="Scheduled" value="scheduled"></md-navigation-rail-tab>
<md-icon-button slot="footer" icon="help" aria-label="Help"></md-icon-button>
</md-navigation-rail>
</div>alignment pushes the destination group to the top (default), middle or
bottom of the rail.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="top" label="Top aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="middle" label="Middle aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="bottom" label="Bottom aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail alignment="top" label="Top aligned" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail alignment="middle" label="Middle aligned" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail alignment="bottom" label="Bottom aligned" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="top" label="Top aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="middle" label="Middle aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="bottom" label="Bottom aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="top" label="Top aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="middle" label="Middle aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="bottom" label="Bottom aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="top" label="Top aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="middle" label="Middle aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail alignment="bottom" label="Bottom aligned" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
</md-navigation-rail>
</div>label-visibility is all by default, which is what M3 recommends for 3–7
destinations. selected paints only the active label; none is icon-only. In
every mode the tab’s label prop remains the accessible name, so never drop it.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="all" label="Labels all" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="selected" label="Labels selected" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="none" label="Icons only" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail labelVisibility="all" label="Labels all" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail labelVisibility="selected" label="Labels selected" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail labelVisibility="none" label="Icons only" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="search" label="Search" value="search"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="all" label="Labels all" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="selected" label="Labels selected" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="none" label="Icons only" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="all" label="Labels all" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="selected" label="Labels selected" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="none" label="Icons only" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="all" label="Labels all" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="selected" label="Labels selected" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display: flex; block-size: 344px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label-visibility="none" label="Icons only" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="search" label="Search" value="search"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>badge switches on the dot; badge-value renders the pill. disabled removes
the destination from the tab order.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Badges and states" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="12"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="notifications" label="Alerts" value="alerts" badge></md-navigation-rail-tab>
<md-navigation-rail-tab icon="archive" label="Archive" value="archive"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="delete" label="Trash" value="trash" disabled></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '384px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Badges and states" activeIndex="0">
<MdNavigationRailTab icon="inbox" label="Inbox" value="inbox" badgeValue="12"></MdNavigationRailTab>
<MdNavigationRailTab icon="notifications" label="Alerts" value="alerts" badge></MdNavigationRailTab>
<MdNavigationRailTab icon="archive" label="Archive" value="archive"></MdNavigationRailTab>
<MdNavigationRailTab icon="delete" label="Trash" value="trash" disabled></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Badges and states" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="12"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="notifications" label="Alerts" value="alerts" badge></md-navigation-rail-tab>
<md-navigation-rail-tab icon="archive" label="Archive" value="archive"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="delete" label="Trash" value="trash" disabled></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Badges and states" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="12"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="notifications" label="Alerts" value="alerts" badge></md-navigation-rail-tab>
<md-navigation-rail-tab icon="archive" label="Archive" value="archive"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="delete" label="Trash" value="trash" disabled></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Badges and states" active-index="0">
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox" badge-value="12"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="notifications" label="Alerts" value="alerts" badge></md-navigation-rail-tab>
<md-navigation-rail-tab icon="archive" label="Archive" value="archive"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="delete" label="Trash" value="trash" disabled></md-navigation-rail-tab>
</md-navigation-rail>
</div>icon is also a slot, for artwork the Material Symbols names cannot
express. Slot an <svg> (or an <img>) with slot="icon" in place of the
icon prop — the destination sizes and colours it exactly like a symbol.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Slotted icons" active-index="0">
<md-navigation-rail-tab label="Home" value="home">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 3l9 8h-3v10h-5v-6h-2v6H6V11H3z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab label="Starred" value="star">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Slotted icons" activeIndex="0">
<MdNavigationRailTab label="Home" value="home">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 3l9 8h-3v10h-5v-6h-2v6H6V11H3z"/></svg>
</MdNavigationRailTab>
<MdNavigationRailTab label="Starred" value="star">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>
</MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '16px', opacity: '.6', fontSize: '.85rem' }}>content</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Slotted icons" active-index="0">
<md-navigation-rail-tab label="Home" value="home">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 3l9 8h-3v10h-5v-6h-2v6H6V11H3z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab label="Starred" value="star">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Slotted icons" active-index="0">
<md-navigation-rail-tab label="Home" value="home">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 3l9 8h-3v10h-5v-6h-2v6H6V11H3z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab label="Starred" value="star">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Slotted icons" active-index="0">
<md-navigation-rail-tab label="Home" value="home">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 3l9 8h-3v10h-5v-6h-2v6H6V11H3z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab label="Starred" value="star">
<svg slot="icon" viewBox="0 0 24 24" width="24" height="24" fill="currentColor"><path d="M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01z"/></svg>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>Three opt-in additions take the rail past a fixed vertical column. None of them change the default rail.
The same parts laid out as a top-of-page bar — logo leading, destinations in a row, FAB and footer trailing — for wide layouts where a side rail would spend width the content wants.
expandable is ignored: a bar has nowhere to expand into, so the toggle
is not rendered.aria-orientation reports horizontal, and the arrow keys follow the
inline axis, mirrored under dir="rtl".Reports in the bar below is a menu trigger — and its dropdown nests one
level further via md-sub-menu-item:
<md-navigation-rail id="main-nav" orientation="horizontal" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="groups" label="Team" value="team"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports">
<md-menu variant="vibrant" id="reports-menu" slot="submenu">
<md-menu-item headline="Usage"><span slot="leading-icon" class="material-symbols-outlined">insights</span></md-menu-item>
<md-menu-item headline="Revenue"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<script type="module">
const nav = document.getElementById('main-nav');
// The rail owns the highlight — you only route. Fires for a plain
// destination *and* when a Reports row is chosen, which activates Reports.
nav.addEventListener('mdTabChange', (event) => {
const { index, value } = event.detail;
console.log('navigate to', value, '(index', index + ')');
});
// Which dropdown row was picked. md-menu-item's mdClick bubbles, so one
// listener on the menu covers every row.
document.getElementById('reports-menu').addEventListener('mdClick', (event) => {
const row = event.target.closest('md-menu-item');
console.log('open report:', row.getAttribute('headline'));
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useState } from 'react';
import { MdMenu, MdMenuItem, MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
// Destination order drives activeIndex, so keep it in one place.
const DESTINATIONS = ['home', 'files', 'starred', 'team', 'reports', 'inbox', 'settings'];
export function TopBarNav() {
const [current, setCurrent] = useState('home');
const [report, setReport] = useState(null);
return (
<MdNavigationRail
orientation="horizontal"
label="Main navigation"
activeIndex={DESTINATIONS.indexOf(current)}
onMdTabChange={(event) => setCurrent(event.detail.value)}
>
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="star" label="Starred" value="starred"></MdNavigationRailTab>
<MdNavigationRailTab icon="groups" label="Team" value="team"></MdNavigationRailTab>
{/* A destination with a submenu is a disclosure: clicking it opens the
dropdown. Choosing a row is what activates the destination. */}
<MdNavigationRailTab icon="bar_chart" label="Reports" value="reports">
<MdMenu variant="vibrant" slot="submenu">
<MdMenuItem headline="Usage" onMdClick={() => setReport('usage')}>
<span slot="leading-icon" className="material-symbols-outlined">insights</span>
</MdMenuItem>
<MdMenuItem headline="Revenue" onMdClick={() => setReport('revenue')}>
<span slot="leading-icon" className="material-symbols-outlined">payments</span>
</MdMenuItem>
</MdMenu>
</MdNavigationRailTab>
<MdNavigationRailTab icon="inbox" label="Inbox" value="inbox"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
);
}import { Component } from '@angular/core';
@Component({
selector: 'app-top-nav',
template: `
<md-navigation-rail
orientation="horizontal"
label="Main navigation"
[attr.active-index]="activeIndex"
(mdTabChange)="onTabChange($event)"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="groups" label="Team" value="team"></md-navigation-rail-tab>
<!-- A destination with a submenu is a disclosure: clicking it opens the
dropdown. Choosing a row is what activates the destination. -->
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Usage" (mdClick)="report = 'usage'"><span slot="leading-icon" class="material-symbols-outlined">insights</span></md-menu-item>
<md-menu-item headline="Revenue" (mdClick)="report = 'revenue'"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
`,
})
export class TopNavComponent {
readonly destinations = ['home', 'files', 'starred', 'team', 'reports', 'inbox', 'settings'];
current = 'home';
report: string | null = null;
get activeIndex(): number {
return this.destinations.indexOf(this.current);
}
onTabChange(e: Event): void {
this.current = (e as CustomEvent<{ index: number; value: string }>).detail.value;
}
}<script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { computed, ref } from 'vue';
import '@awc-ui/core/define';
const DESTINATIONS = ['home', 'files', 'starred', 'team', 'reports', 'inbox', 'settings'];
const current = ref('home');
const report = ref(null);
const activeIndex = computed(() => DESTINATIONS.indexOf(current.value));
</script>
<template>
<md-navigation-rail
orientation="horizontal"
label="Main navigation"
:active-index="activeIndex"
@mdTabChange="current = $event.detail.value"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="groups" label="Team" value="team"></md-navigation-rail-tab>
<!-- A destination with a submenu is a disclosure: clicking it opens the
dropdown. Choosing a row is what activates the destination. -->
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Usage" @mdClick="report = 'usage'"><span slot="leading-icon" class="material-symbols-outlined">insights</span></md-menu-item>
<md-menu-item headline="Revenue" @mdClick="report = 'revenue'"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
const DESTINATIONS = ['home', 'files', 'starred', 'team', 'reports', 'inbox', 'settings'];
let current = 'home';
let report = null;
$: activeIndex = DESTINATIONS.indexOf(current);
</script>
<md-navigation-rail
orientation="horizontal"
label="Main navigation"
active-index={activeIndex}
on:mdTabChange={(event) => (current = event.detail.value)}
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="groups" label="Team" value="team"></md-navigation-rail-tab>
<!-- A destination with a submenu is a disclosure: clicking it opens the
dropdown. Choosing a row is what activates the destination. -->
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Usage" on:mdClick={() => (report = 'usage')}><span slot="leading-icon" class="material-symbols-outlined">insights</span></md-menu-item>
<md-menu-item headline="Revenue" on:mdClick={() => (report = 'revenue')}><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="inbox" label="Inbox" value="inbox"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>A destination in the bar can own a dropdown too — and that dropdown can itself
nest, using md-sub-menu-item for a second
level:
<md-navigation-rail id="product-nav" orientation="horizontal" label="Product navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" id="products-menu" slot="submenu">
<md-menu-item headline="Overview"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<md-sub-menu-item headline="Integrations" supporting-text="Browse by type"><span slot="leading-icon" class="material-symbols-outlined">extension</span>
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Analytics"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
<md-menu-item headline="Payments"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
<md-menu-item headline="Messaging"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="description" label="Docs" value="docs"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="support" label="Support" value="support"></md-navigation-rail-tab>
</md-navigation-rail>
<script type="module">
const nav = document.getElementById('product-nav');
// The rail owns the highlight and guarantees exactly one active destination:
// activating Docs clears whatever row the Products dropdown had chosen.
nav.addEventListener('mdTabChange', (event) => {
const { index, value } = event.detail;
console.log('navigate to', value, '(index', index + ')');
});
// mdClick bubbles out of md-menu-item, so this one listener also catches the
// rows nested inside the Integrations sub-menu.
document.getElementById('products-menu').addEventListener('mdClick', (event) => {
const row = event.target.closest('md-menu-item');
const parent = row.closest('md-sub-menu-item');
console.log('open', parent ? parent.getAttribute('headline') + ' / ' : '', row.getAttribute('headline'));
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useState } from 'react';
import {
MdMenu,
MdMenuItem,
MdNavigationRail,
MdNavigationRailTab,
MdSubMenuItem,
} from '@awc-ui/react';
const DESTINATIONS = ['home', 'products', 'docs', 'support'];
export function ProductNav() {
const [current, setCurrent] = useState('home');
const [section, setSection] = useState(null);
return (
<MdNavigationRail
orientation="horizontal"
label="Product navigation"
activeIndex={DESTINATIONS.indexOf(current)}
onMdTabChange={(event) => setCurrent(event.detail.value)}
>
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
{/* Clicking Products opens its dropdown; choosing a row is what
activates the destination and moves the rail highlight here. */}
<MdNavigationRailTab icon="category" label="Products" value="products">
<MdMenu variant="vibrant" slot="submenu">
<MdMenuItem headline="Overview" onMdClick={() => setSection('overview')}>
<span slot="leading-icon" className="material-symbols-outlined">dashboard</span>
</MdMenuItem>
<MdMenuItem headline="Pricing" onMdClick={() => setSection('pricing')}>
<span slot="leading-icon" className="material-symbols-outlined">sell</span>
</MdMenuItem>
{/* A branch row only discloses its own level — it never selects. */}
<MdSubMenuItem headline="Integrations" supportingText="Browse by type">
<span slot="leading-icon" className="material-symbols-outlined">extension</span>
<MdMenu variant="vibrant" slot="submenu">
<MdMenuItem headline="Analytics" onMdClick={() => setSection('integrations/analytics')}>
<span slot="leading-icon" className="material-symbols-outlined">analytics</span>
</MdMenuItem>
<MdMenuItem headline="Payments" onMdClick={() => setSection('integrations/payments')}>
<span slot="leading-icon" className="material-symbols-outlined">payments</span>
</MdMenuItem>
<MdMenuItem headline="Messaging" onMdClick={() => setSection('integrations/messaging')}>
<span slot="leading-icon" className="material-symbols-outlined">chat</span>
</MdMenuItem>
</MdMenu>
</MdSubMenuItem>
</MdMenu>
</MdNavigationRailTab>
<MdNavigationRailTab icon="description" label="Docs" value="docs"></MdNavigationRailTab>
<MdNavigationRailTab icon="support" label="Support" value="support"></MdNavigationRailTab>
</MdNavigationRail>
);
}import { Component } from '@angular/core';
@Component({
selector: 'app-product-nav',
template: `
<md-navigation-rail
orientation="horizontal"
label="Product navigation"
[attr.active-index]="activeIndex"
(mdTabChange)="onTabChange($event)"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<!-- Clicking Products opens its dropdown; choosing a row is what activates
the destination and moves the rail highlight here. -->
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview" (mdClick)="section = 'overview'"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing" (mdClick)="section = 'pricing'"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<!-- A branch row only discloses its own level — it never selects. -->
<md-sub-menu-item headline="Integrations" supporting-text="Browse by type"><span slot="leading-icon" class="material-symbols-outlined">extension</span>
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Analytics" (mdClick)="section = 'integrations/analytics'"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
<md-menu-item headline="Payments" (mdClick)="section = 'integrations/payments'"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
<md-menu-item headline="Messaging" (mdClick)="section = 'integrations/messaging'"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="description" label="Docs" value="docs"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="support" label="Support" value="support"></md-navigation-rail-tab>
</md-navigation-rail>
`,
})
export class ProductNavComponent {
readonly destinations = ['home', 'products', 'docs', 'support'];
current = 'home';
section: string | null = null;
get activeIndex(): number {
return this.destinations.indexOf(this.current);
}
onTabChange(e: Event): void {
this.current = (e as CustomEvent<{ index: number; value: string }>).detail.value;
}
}<script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { computed, ref } from 'vue';
import '@awc-ui/core/define';
const DESTINATIONS = ['home', 'products', 'docs', 'support'];
const current = ref('home');
const section = ref(null);
const activeIndex = computed(() => DESTINATIONS.indexOf(current.value));
</script>
<template>
<md-navigation-rail
orientation="horizontal"
label="Product navigation"
:active-index="activeIndex"
@mdTabChange="current = $event.detail.value"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<!-- Clicking Products opens its dropdown; choosing a row is what activates
the destination and moves the rail highlight here. -->
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview" @mdClick="section = 'overview'"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing" @mdClick="section = 'pricing'"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<!-- A branch row only discloses its own level — it never selects. -->
<md-sub-menu-item headline="Integrations" supporting-text="Browse by type"><span slot="leading-icon" class="material-symbols-outlined">extension</span>
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Analytics" @mdClick="section = 'integrations/analytics'"><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
<md-menu-item headline="Payments" @mdClick="section = 'integrations/payments'"><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
<md-menu-item headline="Messaging" @mdClick="section = 'integrations/messaging'"><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="description" label="Docs" value="docs"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="support" label="Support" value="support"></md-navigation-rail-tab>
</md-navigation-rail>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
const DESTINATIONS = ['home', 'products', 'docs', 'support'];
let current = 'home';
let section = null;
$: activeIndex = DESTINATIONS.indexOf(current);
</script>
<md-navigation-rail
orientation="horizontal"
label="Product navigation"
active-index={activeIndex}
on:mdTabChange={(event) => (current = event.detail.value)}
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<!-- Clicking Products opens its dropdown; choosing a row is what activates
the destination and moves the rail highlight here. -->
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview" on:mdClick={() => (section = 'overview')}><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing" on:mdClick={() => (section = 'pricing')}><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<!-- A branch row only discloses its own level — it never selects. -->
<md-sub-menu-item headline="Integrations" supporting-text="Browse by type"><span slot="leading-icon" class="material-symbols-outlined">extension</span>
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Analytics" on:mdClick={() => (section = 'integrations/analytics')}><span slot="leading-icon" class="material-symbols-outlined">analytics</span></md-menu-item>
<md-menu-item headline="Payments" on:mdClick={() => (section = 'integrations/payments')}><span slot="leading-icon" class="material-symbols-outlined">payments</span></md-menu-item>
<md-menu-item headline="Messaging" on:mdClick={() => (section = 'integrations/messaging')}><span slot="leading-icon" class="material-symbols-outlined">chat</span></md-menu-item>
</md-menu>
</md-sub-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="description" label="Docs" value="docs"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="support" label="Support" value="support"></md-navigation-rail-tab>
</md-navigation-rail>The bar’s three slots give the classic web-app header in one component: the
logo slot leads, the destinations take the space between, and the footer
slot trails — put the signed-in user’s avatar there and hang an
md-menu off it. The destinations region grows to fill
whatever the brand and account leave behind, so the items stay centred as the
bar widens.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<span slot="logo" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="dashboard" label="Dashboard" value="dashboard"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Projects" value="projects"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports"></md-navigation-rail-tab>
<div slot="footer">
<md-icon-button id="account-trigger" size="md" aria-haspopup="menu" aria-label="Account — Ada Lovelace">
<md-avatar name="Ada Lovelace" initials="AL" size="40px"></md-avatar>
</md-icon-button>
<md-menu variant="vibrant" id="account-menu" anchor="account-trigger" placement="bottom-end">
<md-menu-item headline="Ada Lovelace" supporting-text="ada@acme.example"><span slot="leading-icon" class="material-symbols-outlined">account_circle</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Profile"><span slot="leading-icon" class="material-symbols-outlined">person</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Sign out"><span slot="leading-icon" class="material-symbols-outlined">logout</span></md-menu-item>
</md-menu>
</div>
</md-navigation-rail>
<script type="module">
document.getElementById('account-trigger').addEventListener('click', () => {
document.getElementById('account-menu').show();
});
</script>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { useRef } from 'react';
import { MdAvatar, MdDivider, MdIconButton, MdMenu, MdMenuItem, MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
const accountMenuRef = useRef(null);
return (
<>
<MdNavigationRail orientation="horizontal" label="Main navigation" activeIndex="0">
<span slot="logo" style={{ display: 'inline-flex', alignItems: 'center', gap: '8px', fontWeight: '600' }}>
<span className="material-symbols-outlined" style={{ fontSize: '28px', color: 'var(--md-sys-color-primary)' }}>hexagon</span>
<span>Acme</span>
</span>
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="dashboard" label="Dashboard" value="dashboard"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Projects" value="projects"></MdNavigationRailTab>
<MdNavigationRailTab icon="bar_chart" label="Reports" value="reports"></MdNavigationRailTab>
<div slot="footer">
<MdIconButton id="account-trigger" size="md" aria-haspopup="menu" aria-label="Account — Ada Lovelace" onClick={() => accountMenuRef.current?.show()}>
<MdAvatar name="Ada Lovelace" initials="AL" size="40px"></MdAvatar>
</MdIconButton>
<MdMenu variant="vibrant" id="account-menu" ref={accountMenuRef} anchor="account-trigger" placement="bottom-end">
<MdMenuItem headline="Ada Lovelace" supportingText="ada@acme.example"><span slot="leading-icon" className="material-symbols-outlined">account_circle</span></MdMenuItem>
<MdDivider></MdDivider>
<MdMenuItem headline="Profile"><span slot="leading-icon" className="material-symbols-outlined">person</span></MdMenuItem>
<MdMenuItem headline="Settings"><span slot="leading-icon" className="material-symbols-outlined">settings</span></MdMenuItem>
<MdDivider></MdDivider>
<MdMenuItem headline="Sign out"><span slot="leading-icon" className="material-symbols-outlined">logout</span></MdMenuItem>
</MdMenu>
</div>
</MdNavigationRail>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<span slot="logo" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="dashboard" label="Dashboard" value="dashboard"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Projects" value="projects"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports"></md-navigation-rail-tab>
<div slot="footer">
<md-icon-button id="account-trigger" size="md" aria-haspopup="menu" aria-label="Account — Ada Lovelace" (click)="accountMenu.show()">
<md-avatar name="Ada Lovelace" initials="AL" size="40px"></md-avatar>
</md-icon-button>
<md-menu variant="vibrant" id="account-menu" #accountMenu anchor="account-trigger" placement="bottom-end">
<md-menu-item headline="Ada Lovelace" supporting-text="ada@acme.example"><span slot="leading-icon" class="material-symbols-outlined">account_circle</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Profile"><span slot="leading-icon" class="material-symbols-outlined">person</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Sign out"><span slot="leading-icon" class="material-symbols-outlined">logout</span></md-menu-item>
</md-menu>
</div>
</md-navigation-rail><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { ref } from 'vue';
import '@awc-ui/core/define';
const accountMenu = ref(null);
</script>
<template>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<span slot="logo" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="dashboard" label="Dashboard" value="dashboard"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Projects" value="projects"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports"></md-navigation-rail-tab>
<div slot="footer">
<md-icon-button id="account-trigger" size="md" aria-haspopup="menu" aria-label="Account — Ada Lovelace" @click="accountMenu?.show()">
<md-avatar name="Ada Lovelace" initials="AL" size="40px"></md-avatar>
</md-icon-button>
<md-menu variant="vibrant" id="account-menu" ref="accountMenu" anchor="account-trigger" placement="bottom-end">
<md-menu-item headline="Ada Lovelace" supporting-text="ada@acme.example"><span slot="leading-icon" class="material-symbols-outlined">account_circle</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Profile"><span slot="leading-icon" class="material-symbols-outlined">person</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Sign out"><span slot="leading-icon" class="material-symbols-outlined">logout</span></md-menu-item>
</md-menu>
</div>
</md-navigation-rail>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
let accountMenu;
</script>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<span slot="logo" style="display: inline-flex; align-items: center; gap: 8px; font-weight: 600;">
<span class="material-symbols-outlined" style="font-size: 28px; color: var(--md-sys-color-primary);">hexagon</span>
<span>Acme</span>
</span>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="dashboard" label="Dashboard" value="dashboard"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Projects" value="projects"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="bar_chart" label="Reports" value="reports"></md-navigation-rail-tab>
<div slot="footer">
<md-icon-button id="account-trigger" size="md" aria-haspopup="menu" aria-label="Account — Ada Lovelace" on:click={() => accountMenu?.show()}>
<md-avatar name="Ada Lovelace" initials="AL" size="40px"></md-avatar>
</md-icon-button>
<md-menu variant="vibrant" id="account-menu" bind:this={accountMenu} anchor="account-trigger" placement="bottom-end">
<md-menu-item headline="Ada Lovelace" supporting-text="ada@acme.example"><span slot="leading-icon" class="material-symbols-outlined">account_circle</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Profile"><span slot="leading-icon" class="material-symbols-outlined">person</span></md-menu-item>
<md-menu-item headline="Settings"><span slot="leading-icon" class="material-symbols-outlined">settings</span></md-menu-item>
<md-divider></md-divider>
<md-menu-item headline="Sign out"><span slot="leading-icon" class="material-symbols-outlined">logout</span></md-menu-item>
</md-menu>
</div>
</md-navigation-rail>max-visible keeps N destinations in the rail and collapses the rest into an
overflow trigger. Choosing one activates that destination, so the collapsed
items stay first-class.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 380px;">
<md-navigation-rail label="With overflow" active-index="0" max-visible="3">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '380px' }}>
<MdNavigationRail label="With overflow" activeIndex="0" maxVisible="3">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="star" label="Starred" value="starred"></MdNavigationRailTab>
<MdNavigationRailTab icon="drafts" label="Drafts" value="drafts"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 380px;">
<md-navigation-rail label="With overflow" active-index="0" max-visible="3">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 380px;">
<md-navigation-rail label="With overflow" active-index="0" max-visible="3">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 380px;">
<md-navigation-rail label="With overflow" active-index="0" max-visible="3">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="star" label="Starred" value="starred"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="drafts" label="Drafts" value="drafts"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>Slot an md-menu into a destination’s submenu slot and it becomes a
disclosure: activating it opens the dropdown rather than navigating, and the
destination reports aria-haspopup="menu" / aria-expanded. The menu is
anchored to the destination automatically.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 320px;">
<md-navigation-rail label="With a dropdown" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<md-menu-item headline="Changelog"><span slot="leading-icon" class="material-symbols-outlined">history</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdMenu, MdMenuItem, MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '320px' }}>
<MdNavigationRail label="With a dropdown" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="category" label="Products" value="products">
<MdMenu variant="vibrant" slot="submenu">
<MdMenuItem headline="Overview"><span slot="leading-icon" className="material-symbols-outlined">dashboard</span></MdMenuItem>
<MdMenuItem headline="Pricing"><span slot="leading-icon" className="material-symbols-outlined">sell</span></MdMenuItem>
<MdMenuItem headline="Changelog"><span slot="leading-icon" className="material-symbols-outlined">history</span></MdMenuItem>
</MdMenu>
</MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 320px;">
<md-navigation-rail label="With a dropdown" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<md-menu-item headline="Changelog"><span slot="leading-icon" class="material-symbols-outlined">history</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 320px;">
<md-navigation-rail label="With a dropdown" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<md-menu-item headline="Changelog"><span slot="leading-icon" class="material-symbols-outlined">history</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 320px;">
<md-navigation-rail label="With a dropdown" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="category" label="Products" value="products">
<md-menu variant="vibrant" slot="submenu">
<md-menu-item headline="Overview"><span slot="leading-icon" class="material-symbols-outlined">dashboard</span></md-menu-item>
<md-menu-item headline="Pricing"><span slot="leading-icon" class="material-symbols-outlined">sell</span></md-menu-item>
<md-menu-item headline="Changelog"><span slot="leading-icon" class="material-symbols-outlined">history</span></md-menu-item>
</md-menu>
</md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>modal restyles the expanded rail as a floating overlay with a scrim — it
has no effect while collapsed, and positioning is the host app’s responsibility.
It does not trap focus; the rail only collapses on Escape or a scrim
click, returning focus to its toggle. full-height stretches the rail to
100dvh instead of filling its parent; use it when the rail is the app’s
top-level side navigation.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden; position: relative;">
<md-navigation-rail modal expandable label="Modal rail" toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Expand the rail — it floats over this content behind a scrim instead of pushing it.
</main>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '404px', inlineSize: '100%', maxInlineSize: '460px', borderRadius: '16px', overflow: 'hidden', position: 'relative' }}>
<MdNavigationRail modal expandable label="Modal rail" toggleLabel="Toggle navigation" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<main style={{ flex: '1', padding: '20px', background: 'var(--md-sys-color-surface-container-low)', color: 'var(--md-sys-color-on-surface)', font: '14px/1.6 system-ui' }}>
Expand the rail — it floats over this content behind a scrim instead of pushing it.
</main>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden; position: relative;">
<md-navigation-rail modal expandable label="Modal rail" toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Expand the rail — it floats over this content behind a scrim instead of pushing it.
</main>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden; position: relative;">
<md-navigation-rail modal expandable label="Modal rail" toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Expand the rail — it floats over this content behind a scrim instead of pushing it.
</main>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 404px; inline-size: 100%; max-inline-size: 460px; border-radius: 16px; overflow: hidden; position: relative;">
<md-navigation-rail modal expandable label="Modal rail" toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<main style="flex: 1; padding: 20px; background: var(--md-sys-color-surface-container-low); color: var(--md-sys-color-on-surface); font: 14px/1.6 system-ui;">
Expand the rail — it floats over this content behind a scrim instead of pushing it.
</main>
</div>| Event | Cancelable | Detail | Fires |
|---|---|---|---|
mdTabChange | no | { index, value } | The user selected a destination |
mdExpand | no | void | Collapsed → expanded |
mdCollapse | no | void | Expanded → collapsed |
All three events bubble and are composed, so one delegated listener
above the rail catches every one of them. Pick a destination, then work the
toggle — mdTabChange fires only when the active index actually moves, so
re-picking the current destination logs nothing:
<md-navigation-rail id="rail" expandable toggle-label="Toggle navigation" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<script type="module">
const rail = document.getElementById('rail');
// Route on detail.value — it survives destinations being reordered.
rail.addEventListener('mdTabChange', (e) => {
console.log('navigate to', e.detail.value, 'at index', e.detail.index);
});
rail.addEventListener('mdExpand', () => console.log('expanded'));
rail.addEventListener('mdCollapse', () => console.log('collapsed'));
</script>import { useState } from 'react';
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
const DESTINATIONS = ['home', 'files', 'settings'];
export function SideNav() {
const [current, setCurrent] = useState('home');
const [expanded, setExpanded] = useState(false);
return (
<MdNavigationRail
expandable
toggleLabel="Toggle navigation"
label="Main navigation"
activeIndex={DESTINATIONS.indexOf(current)}
onMdTabChange={(e) => setCurrent(e.detail.value)}
onMdExpand={() => setExpanded(true)}
onMdCollapse={() => setExpanded(false)}
>
<MdNavigationRailTab icon="home" label="Home" value="home" />
<MdNavigationRailTab icon="folder" label="Files" value="files" />
<MdNavigationRailTab icon="settings" label="Settings" value="settings" />
</MdNavigationRail>
);
}import { Component } from '@angular/core';
@Component({
selector: 'app-side-nav',
template: `
<md-navigation-rail
expandable
toggle-label="Toggle navigation"
label="Main navigation"
[attr.active-index]="activeIndex"
(mdTabChange)="onTabChange($event)"
(mdExpand)="expanded = true"
(mdCollapse)="expanded = false"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
`,
})
export class SideNavComponent {
readonly destinations = ['home', 'files', 'settings'];
current = 'home';
expanded = false;
get activeIndex(): number {
return this.destinations.indexOf(this.current);
}
onTabChange(e: Event): void {
this.current = (e as CustomEvent<{ index: number; value: string }>).detail.value;
}
}<script setup lang="ts">
import { computed, ref } from 'vue';
const DESTINATIONS = ['home', 'files', 'settings'];
const current = ref('home');
const expanded = ref(false);
const activeIndex = computed(() => DESTINATIONS.indexOf(current.value));
</script>
<template>
<md-navigation-rail
expandable
toggle-label="Toggle navigation"
label="Main navigation"
:active-index="activeIndex"
@mdTabChange="current = $event.detail.value"
@mdExpand="expanded = true"
@mdCollapse="expanded = false"
>
<md-navigation-rail-tab icon="home" label="Home" value="home" />
<md-navigation-rail-tab icon="folder" label="Files" value="files" />
<md-navigation-rail-tab icon="settings" label="Settings" value="settings" />
</md-navigation-rail>
</template><script lang="ts">
const DESTINATIONS = ['home', 'files', 'settings'];
let current = 'home';
let expanded = false;
$: activeIndex = DESTINATIONS.indexOf(current);
</script>
<md-navigation-rail
expandable
toggle-label="Toggle navigation"
label="Main navigation"
active-index={activeIndex}
on:mdTabChange={(e) => (current = e.detail.value)}
on:mdExpand={() => (expanded = true)}
on:mdCollapse={() => (expanded = false)}
>
<md-navigation-rail-tab icon="home" label="Home" value="home" />
<md-navigation-rail-tab icon="folder" label="Files" value="files" />
<md-navigation-rail-tab icon="settings" label="Settings" value="settings" />
</md-navigation-rail>One step further: hand mdTabChange to your router and persist the expansion
state, so the rail comes back the way the user left it:
<md-navigation-rail id="rail" expandable full-height active-index="0" label="Main navigation">
<md-fab slot="fab" icon="add" label="Create"></md-fab>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<script type="module">
const rail = document.getElementById('rail');
rail.addEventListener('mdTabChange', (e) => router.go(e.detail.value));
rail.addEventListener('mdExpand', () => localStorage.setItem('railExpanded', '1'));
rail.addEventListener('mdCollapse', () => localStorage.removeItem('railExpanded'));
if (localStorage.getItem('railExpanded')) rail.expand();
</script>import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
import { useNavigate } from 'react-router-dom';
export function SideNav({ index }: { index: number }) {
const navigate = useNavigate();
return (
<MdNavigationRail
expandable
fullHeight
label="Main navigation"
activeIndex={index}
onMdTabChange={(e) => navigate('/' + e.detail.value)}
>
<MdNavigationRailTab icon="home" label="Home" value="home" />
<MdNavigationRailTab icon="folder" label="Files" value="files" />
<MdNavigationRailTab icon="settings" label="Settings" value="settings" />
</MdNavigationRail>
);
}import { Component } from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'app-side-nav',
template: `
<md-navigation-rail
expandable
full-height
label="Main navigation"
[attr.active-index]="index"
(mdTabChange)="onChange($event)"
>
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
`,
})
export class SideNavComponent {
index = 0;
constructor(private router: Router) {}
onChange(e: CustomEvent<{ index: number; value: string }>) {
this.index = e.detail.index;
this.router.navigateByUrl('/' + e.detail.value);
}
}<script setup lang="ts">
import { ref } from 'vue';
import { useRouter } from 'vue-router';
const index = ref(0);
const router = useRouter();
function onChange(e: CustomEvent) {
index.value = e.detail.index;
router.push('/' + e.detail.value);
}
</script>
<template>
<md-navigation-rail
expandable
full-height
label="Main navigation"
:active-index="index"
@mdTabChange="onChange"
>
<md-navigation-rail-tab icon="home" label="Home" value="home" />
<md-navigation-rail-tab icon="folder" label="Files" value="files" />
<md-navigation-rail-tab icon="settings" label="Settings" value="settings" />
</md-navigation-rail>
</template><script lang="ts">
import { goto } from '$app/navigation';
let index = 0;
function onChange(e: CustomEvent) {
index = e.detail.index;
goto('/' + e.detail.value);
}
</script>
<md-navigation-rail
expandable
full-height
label="Main navigation"
active-index={index}
on:mdTabChange={onChange}
>
<md-navigation-rail-tab icon="home" label="Home" value="home" />
<md-navigation-rail-tab icon="folder" label="Files" value="files" />
<md-navigation-rail-tab icon="settings" label="Settings" value="settings" />
</md-navigation-rail>| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
variant | variant | 'standard' | 'expanded' | 'standard' | Yes |
modal | modal | boolean | false | Yes |
fullHeight | full-height | boolean | false | Yes |
alignment | alignment | 'top' | 'middle' | 'bottom' | 'top' | Yes |
expandable | expandable | boolean | false | Yes |
toggleLabel | toggle-label | string | 'Toggle navigation' | — |
labelVisibility | label-visibility | 'all' | 'selected' | 'none' | 'all' | Yes |
activeIndex | active-index | number | -1 | Yes |
label | label | string | 'Navigation' | — |
disableFocusManagement | disable-focus-management | boolean | false | — |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
orientation | orientation | 'vertical' | 'horizontal' | 'vertical' | Yes |
maxVisible | max-visible | number | — | — |
overflowLabel | overflow-label | string | 'More' | — |
overflowIcon | overflow-icon | string | 'more_horiz' | — |
| Method | Parameters |
|---|---|
expand() | none |
collapse() | none |
toggle() | none |
focusTab() | index: number |
| Slot | Description |
|---|---|
(default) | — |
logo | Optional brand/logo at the very top |
logo-expanded | — |
header | Optional top group (menu button, etc.) |
fab | Optional FAB above the destinations |
footer | Optional bottom group — settings, account / user menu, etc. |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-navigation-rail-container-color | Rail background |
--md-navigation-rail-container-width | Width when collapsed (default 80px, |
--md-navigation-rail-expanded-width | Width when expanded (default 220px, |
--md-navigation-rail-expanded-max-width | Expanded width cap (default 360px) |
--md-navigation-rail-container-shape | Border-radius |
--md-navigation-rail-container-elevation | Box-shadow when free-floating |
--md-navigation-rail-padding-block | Top/bottom padding (default 44px top space) |
--md-navigation-rail-padding-inline | Start/end padding |
--md-navigation-rail-gap | Gap between rail sections |
--md-navigation-rail-header-space | Min space between header/FAB group and |
--md-navigation-rail-destinations-gap | Gap between destinations (default 4px) |
--md-navigation-rail-content-color | Default foreground color |
--md-navigation-rail-logo-icon-size | Brand glyph footprint in the logo |
--md-navigation-rail-horizontal-padding-block | — |
--md-navigation-rail-horizontal-padding-inline | — |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
scrim | — |
container | The flex column wrapping every section |
logo | Logo/brand slot wrapper (topmost) |
logo-contracted | — |
logo-expanded | — |
toggle | — |
header | Header slot wrapper (top group) |
fab | FAB slot wrapper |
destinations | The role=tablist that holds destinations |
overflow | — |
overflow-trigger | — |
footer | Footer slot wrapper (bottom group) |
The rail is composed from one sub-component, documented here rather than on its
own page: it means nothing outside md-navigation-rail, which owns the active
state, the expand transition and label visibility.
md-navigation-rail-tabOne destination in the rail — an icon, a label, the MD3 active-indicator
pill, an optional badge, and a stable value used for routing.
active, expanded and label-visibility are rail-managed. Setting them
by hand fights the parent — especially expanded, which the rail toggles
during its expand/collapse transition.value is the routing key. The rail’s mdTabChange reports it, and it is
stabler than an index when destinations are added, removed or reordered.md-navigation-tab
there is no active-icon — the active state is conveyed by the indicator
pill and colour, not a glyph swap.badge is the boolean switch for the dot; badge-value renders the large
badge.href the tab renders as an anchor (the anchor part) and uses
aria-current="page" while active — don’t wrap it in an <a>.mdTabClick { value } is the internal signal the rail listens to.
Application code should listen for the rail’s mdTabChange.| Property | Attribute | Type | Default | Reflects |
|---|---|---|---|---|
icon | icon | string | '' | — |
label | label | string | '' | — |
active | active | boolean | false | Yes |
disabled | disabled | boolean | false | Yes |
badge | badge | boolean | false | — |
badgeValue | badge-value | string | '' | — |
href | href | string | '' | — |
target | target | string | '' | — |
value | value | string | '' | — |
labelVisibility | label-visibility | 'all' | 'selected' | 'none' | 'all' | Yes |
expanded | expanded | boolean | false | Yes |
density | density | 0 | -1 | -2 | -3 | -4 | 0 | Yes |
| Method | Parameters |
|---|---|
clearSubmenuSelection() | none |
| Slot | Description |
|---|---|
icon | Replace prop-based icon with custom SVG/font/component |
submenu | — |
Override on the host element for per-instance theming:
| Property | Description |
|---|---|
--md-navigation-rail-tab-icon-color | Icon color (inactive) |
--md-navigation-rail-tab-active-icon-color | Icon color when active |
--md-navigation-rail-tab-label-color | Label color (inactive) |
--md-navigation-rail-tab-active-label-color | Label color when active |
--md-navigation-rail-tab-indicator-color | Active-indicator pill color |
--md-navigation-rail-tab-indicator-shape | Indicator border-radius |
--md-navigation-rail-tab-indicator-width | Indicator pill width (default 56px) |
--md-navigation-rail-tab-indicator-height | Indicator pill height (default 32px) |
--md-navigation-rail-tab-icon-size | Icon size (default 24px) |
--md-navigation-rail-tab-min-height | Tap target min height (default 56px) |
--md-navigation-rail-tab-label-typography | Composite font shorthand for label |
--md-navigation-rail-tab-badge-color | Badge background |
--md-navigation-rail-tab-badge-content-color | Badge text color |
--md-navigation-rail-tab-focus-ring-color | Focus outline color |
--md-navigation-rail-tab-state-layer-color | Hover/press state-layer color (on-secondary-container) |
--md-navigation-rail-tab-focus-state-layer-opacity | Focused state-layer opacity (default 0.10 per spec) |
--md-navigation-rail-tab-press-state-layer-opacity | Pressed state-layer opacity (default 0.10 per spec) |
--md-navigation-rail-tab-caret-duration | — |
Style internal elements through shadow DOM with ::part():
| Part | Description |
|---|---|
icon | The Material Symbols icon |
indicator | Active-indicator pill |
state-layer | Hover/press overlay |
icon-wrapper | Wrapper holding the icon and badge |
label | Label text |
caret | — |
anchor | The internal <a> element when `href` is set |
label names the navigation landmark. Set something meaningful — “Main
navigation” — for screen-reader users (WAI-ARIA APG / WCAG 2.4.1).disable-focus-management, in which case it is entirely your responsibility.modal closes on Escape and on a scrim click, returning focus to the
toggle — but it does not trap focus. Contain focus yourself (inert on
the rest of the page between mdExpand and mdCollapse) if you need a true
modal.href also gets aria-current="page" while active.toggle-label.alt; a meaningful one needs real text.| Key | Action |
|---|---|
Tab | One stop for the destination group, plus the toggle, FAB and footer controls |
↑ / ↓ | Move between destinations, wrapping at the ends |
Home / End | First / last destination |
Enter / Space | Activate the focused destination |
Escape | Closes a modal rail and returns focus to its trigger |
Tab into the rail below: the whole destination group is one stop, and the
arrows move within it. Home and End jump to the ends, and the toggle button
is its own separate stop.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Main navigation" expandable toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">Tab in, then arrow between destinations.</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '384px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Main navigation" expandable toggleLabel="Toggle navigation" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files" badgeValue="3"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '16px', opacity: '.6', fontSize: '.85rem' }}>Tab in, then arrow between destinations.</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Main navigation" expandable toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">Tab in, then arrow between destinations.</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Main navigation" expandable toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">Tab in, then arrow between destinations.</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 384px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Main navigation" expandable toggle-label="Toggle navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">Tab in, then arrow between destinations.</div>
</div>RTL — every box metric is logical, so the rail moves to the leading edge —
the right — and its logo, indicator pill, labels and badges mirror with it
under dir="rtl". Nothing is re-authored; only dir changes. See
RTL.
<div dir="rtl"> <md-navigation-rail label="التنقل" active-index="0"> <md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab> </md-navigation-rail></div><!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Main" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">content</div>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">المحتوى</div>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gridTemplateColumns: 'auto 1fr', gap: '14px 16px', alignItems: 'center' }}>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>ltr</span>
<div dir="ltr" style={{ display: 'flex', blockSize: '324px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Main" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '12px', opacity: '.6', fontSize: '.8rem' }}>content</div>
</div>
<span style={{ inlineSize: '3.5rem', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>rtl</span>
<div dir="rtl" style={{ display: 'flex', blockSize: '324px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="التنقل" activeIndex="0">
<MdNavigationRailTab icon="home" label="الرئيسية" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="الملفات" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="الإعدادات" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '12px', opacity: '.6', fontSize: '.8rem' }}>المحتوى</div>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Main" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">content</div>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">المحتوى</div>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Main" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">content</div>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">المحتوى</div>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display:grid;grid-template-columns:auto 1fr;gap:14px 16px;align-items:center;">
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">ltr</span>
<div dir="ltr" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Main" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">content</div>
</div>
<span style="inline-size:3.5rem;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">rtl</span>
<div dir="rtl" style="display:flex;block-size:324px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">المحتوى</div>
</div>
</div>A vertical rail always reads on the block axis, so ↑ / ↓ are unaffected by
dir. A horizontal rail reads on the inline axis, so the rail resolves
the nearest explicit dir and mirrors the keys itself: under dir="rtl",
ArrowRight moves toward the start of the bar and ArrowLeft toward the
end. aria-orientation reports horizontal in both directions.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:grid;gap:20px;">
<div dir="ltr">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=ltr</span>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div dir="rtl">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=rtl</span>
<md-navigation-rail orientation="horizontal" label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'grid', gap: '20px' }}>
<div dir="ltr">
<span style={{ display: 'block', marginBlockEnd: '8px', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>dir=ltr</span>
<MdNavigationRail orientation="horizontal" label="Main navigation" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div dir="rtl">
<span style={{ display: 'block', marginBlockEnd: '8px', opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>dir=rtl</span>
<MdNavigationRail orientation="horizontal" label="التنقل" activeIndex="0">
<MdNavigationRailTab icon="home" label="الرئيسية" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="الملفات" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="الإعدادات" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:grid;gap:20px;">
<div dir="ltr">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=ltr</span>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div dir="rtl">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=rtl</span>
<md-navigation-rail orientation="horizontal" label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display:grid;gap:20px;">
<div dir="ltr">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=ltr</span>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div dir="rtl">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=rtl</span>
<md-navigation-rail orientation="horizontal" label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display:grid;gap:20px;">
<div dir="ltr">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=ltr</span>
<md-navigation-rail orientation="horizontal" label="Main navigation" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div dir="rtl">
<span style="display:block;margin-block-end:8px;opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">dir=rtl</span>
<md-navigation-rail orientation="horizontal" label="التنقل" active-index="0">
<md-navigation-rail-tab icon="home" label="الرئيسية" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="الملفات" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="الإعدادات" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>density="-1…-4" is a local override of the inherited data-density rung. It
tapers the rail’s width (80px → 64px), its block padding, the gap between
destinations and the glyph size, all in one signal. All five rungs, same rail:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;">
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="0" label="Density 0" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-1" label="Density -1" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-2" label="Density -2" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-3" label="Density -3" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-4" label="Density -4" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '16px', alignItems: 'flex-start', flexWrap: 'wrap' }}>
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
<span style={{ opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>0</span>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail density="0" label="Density 0" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
<span style={{ opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-1</span>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail density="-1" label="Density -1" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
<span style={{ opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-2</span>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail density="-2" label="Density -2" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
<span style={{ opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-3</span>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail density="-3" label="Density -3" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
<div style={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
<span style={{ opacity: '.65', fontSize: '.75rem', fontFamily: 'ui-monospace,monospace' }}>-4</span>
<div style={{ display: 'flex', blockSize: '344px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail density="-4" label="Density -4" activeIndex="0">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;">
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="0" label="Density 0" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-1" label="Density -1" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-2" label="Density -2" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-3" label="Density -3" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-4" label="Density -4" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;">
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="0" label="Density 0" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-1" label="Density -1" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-2" label="Density -2" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-3" label="Density -3" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-4" label="Density -4" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap;">
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">0</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="0" label="Density 0" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-1</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-1" label="Density -1" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-2</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-2" label="Density -2" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-3</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-3" label="Density -3" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
<div style="display:flex;flex-direction:column;gap:8px;">
<span style="opacity:.65;font-size:.75rem;font-family:ui-monospace,monospace;">-4</span>
<div style="display:flex;block-size:344px;border-radius:16px;overflow:hidden;">
<md-navigation-rail density="-4" label="Density -4" active-index="0">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</div>Translation is where the expanded width actually gets tested — German compounds run far longer than their English source. M3 lets a long label wrap to two lines but forbids truncation, so check the widest locale you ship:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail variant="expanded" label="Hauptnavigation" toggle-label="Navigation umschalten" active-index="0">
<md-navigation-rail-tab icon="home" label="Startseite" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Dateiverwaltung" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Einstellungen" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">Inhalt</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail variant="expanded" label="Hauptnavigation" toggleLabel="Navigation umschalten" activeIndex="0">
<MdNavigationRailTab icon="home" label="Startseite" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Dateiverwaltung" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Einstellungen" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '12px', opacity: '.6', fontSize: '.8rem' }}>Inhalt</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail variant="expanded" label="Hauptnavigation" toggle-label="Navigation umschalten" active-index="0">
<md-navigation-rail-tab icon="home" label="Startseite" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Dateiverwaltung" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Einstellungen" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">Inhalt</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail variant="expanded" label="Hauptnavigation" toggle-label="Navigation umschalten" active-index="0">
<md-navigation-rail-tab icon="home" label="Startseite" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Dateiverwaltung" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Einstellungen" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">Inhalt</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail variant="expanded" label="Hauptnavigation" toggle-label="Navigation umschalten" active-index="0">
<md-navigation-rail-tab icon="home" label="Startseite" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Dateiverwaltung" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Einstellungen" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:12px;opacity:.6;font-size:.8rem;">Inhalt</div>
</div>Density — density="-1…-4" locally overrides the inherited data-density
rung, and composes with direction without any extra wiring: a data-density
ancestor and a dir="rtl" ancestor both just inherit in. See
Density.
i18n — translate destination labels, label and toggle-label; lang and
dir are inherited from any ancestor. Keep each tab’s value untranslated —
it’s the routing key.
| Custom property | Purpose | Default |
|---|---|---|
--md-navigation-rail-container-color | Rail background | surface |
--md-navigation-rail-container-width | Collapsed width | 80px (density-aware) |
--md-navigation-rail-expanded-width / -expanded-max-width | Expanded width | 220px / 360px |
--md-navigation-rail-container-shape / -container-elevation | Surface shape and shadow | 0px / none |
--md-navigation-rail-padding-block / -padding-inline / -gap | Spacing | 44px / 0px / 12px |
--md-navigation-rail-destinations-gap | Gap between destinations | 8px (density-aware) |
--md-navigation-rail-header-space | Space under the header/FAB group | 40px |
--md-navigation-rail-content-color | Default foreground | on-surface-variant |
--md-navigation-rail-logo-icon-size | Brand glyph footprint in the logo slots | 24px |
--md-navigation-rail-horizontal-padding-block / -horizontal-padding-inline | Bar insets under orientation="horizontal" | 0px / 12px |
Destination appearance is themed with the --md-navigation-rail-tab-*
properties — see
md-navigation-rail-tab.
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Themed rail" active-index="0" style="--md-navigation-rail-container-color: var(--md-sys-color-surface-container-highest); --md-navigation-rail-container-shape: 24px; --md-navigation-rail-destinations-gap: 16px;">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Themed rail" activeIndex="0" style={{ '--md-navigation-rail-container-color': 'var(--md-sys-color-surface-container-highest)', '--md-navigation-rail-container-shape': '24px', '--md-navigation-rail-destinations-gap': '16px' }}>
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Themed rail" active-index="0" style="--md-navigation-rail-container-color: var(--md-sys-color-surface-container-highest); --md-navigation-rail-container-shape: 24px; --md-navigation-rail-destinations-gap: 16px;">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Themed rail" active-index="0" style="--md-navigation-rail-container-color: var(--md-sys-color-surface-container-highest); --md-navigation-rail-container-shape: 24px; --md-navigation-rail-destinations-gap: 16px;">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Themed rail" active-index="0" style="--md-navigation-rail-container-color: var(--md-sys-color-surface-container-highest); --md-navigation-rail-container-shape: 24px; --md-navigation-rail-destinations-gap: 16px;">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
</div>Every default resolves through an md-sys-color role, so a rail that sets no
custom properties follows the theme on its own:
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Untouched defaults" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Untouched defaults" activeIndex="1">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files" badgeValue="3"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '16px', opacity: '.6', fontSize: '.85rem' }}>content</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Untouched defaults" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Untouched defaults" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail label="Untouched defaults" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files" badge-value="3"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>| Custom property | Purpose |
|---|---|
--md-navigation-rail-tab-icon-color / -active-icon-color | Glyph colour |
--md-navigation-rail-tab-label-color / -active-label-color | Label colour |
--md-navigation-rail-tab-indicator-color | The pill behind the active glyph |
--md-navigation-rail-tab-indicator-width / -height / -shape | Indicator box |
--md-navigation-rail-tab-icon-size | Glyph size |
--md-navigation-rail-tab-label-typography | Label type |
--md-navigation-rail-tab-min-height | Destination height |
--md-navigation-rail-tab-badge-color / -badge-content-color | Badge fill / text |
--md-navigation-rail-tab-state-layer-color | Hover / focus / press overlay |
--md-navigation-rail-tab-focus-ring-color | Focus ring |
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:16px;block-size:384px;">
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Tonal" active-index="1" style="--md-navigation-rail-tab-indicator-color: var(--md-sys-color-tertiary-container); --md-navigation-rail-tab-active-icon-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-active-label-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-indicator-shape: 8px;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Branded" active-index="1" style="--md-navigation-rail-container-color: #f3e9ff; --md-navigation-rail-container-shape: 28px; --md-navigation-rail-tab-indicator-color: #7c4dff; --md-navigation-rail-tab-active-icon-color: #ffffff; --md-navigation-rail-tab-active-label-color: #311b92; --md-navigation-rail-tab-badge-color: #7c4dff;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f" badge-value="5"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<div style={{ display: 'flex', gap: '16px', blockSize: '384px' }}>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Tonal" activeIndex="1" style={{ '--md-navigation-rail-tab-indicator-color': 'var(--md-sys-color-tertiary-container)', '--md-navigation-rail-tab-active-icon-color': 'var(--md-sys-color-on-tertiary-container)', '--md-navigation-rail-tab-active-label-color': 'var(--md-sys-color-on-tertiary-container)', '--md-navigation-rail-tab-indicator-shape': '8px' }}>
<MdNavigationRailTab icon="home" label="Home" value="h"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="f"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="s"></MdNavigationRailTab>
</MdNavigationRail>
</div>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail label="Branded" activeIndex="1" style={{ '--md-navigation-rail-container-color': '#f3e9ff', '--md-navigation-rail-container-shape': '28px', '--md-navigation-rail-tab-indicator-color': '#7c4dff', '--md-navigation-rail-tab-active-icon-color': '#ffffff', '--md-navigation-rail-tab-active-label-color': '#311b92', '--md-navigation-rail-tab-badge-color': '#7c4dff' }}>
<MdNavigationRailTab icon="home" label="Home" value="h"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="f" badgeValue="5"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="s"></MdNavigationRailTab>
</MdNavigationRail>
</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<div style="display:flex;gap:16px;block-size:384px;">
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Tonal" active-index="1" style="--md-navigation-rail-tab-indicator-color: var(--md-sys-color-tertiary-container); --md-navigation-rail-tab-active-icon-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-active-label-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-indicator-shape: 8px;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Branded" active-index="1" style="--md-navigation-rail-container-color: #f3e9ff; --md-navigation-rail-container-shape: 28px; --md-navigation-rail-tab-indicator-color: #7c4dff; --md-navigation-rail-tab-active-icon-color: #ffffff; --md-navigation-rail-tab-active-label-color: #311b92; --md-navigation-rail-tab-badge-color: #7c4dff;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f" badge-value="5"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<div style="display:flex;gap:16px;block-size:384px;">
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Tonal" active-index="1" style="--md-navigation-rail-tab-indicator-color: var(--md-sys-color-tertiary-container); --md-navigation-rail-tab-active-icon-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-active-label-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-indicator-shape: 8px;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Branded" active-index="1" style="--md-navigation-rail-container-color: #f3e9ff; --md-navigation-rail-container-shape: 28px; --md-navigation-rail-tab-indicator-color: #7c4dff; --md-navigation-rail-tab-active-icon-color: #ffffff; --md-navigation-rail-tab-active-label-color: #311b92; --md-navigation-rail-tab-badge-color: #7c4dff;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f" badge-value="5"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<div style="display:flex;gap:16px;block-size:384px;">
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Tonal" active-index="1" style="--md-navigation-rail-tab-indicator-color: var(--md-sys-color-tertiary-container); --md-navigation-rail-tab-active-icon-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-active-label-color: var(--md-sys-color-on-tertiary-container); --md-navigation-rail-tab-indicator-shape: 8px;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
<div style="display:flex;block-size:364px;border-radius:16px;overflow:hidden;">
<md-navigation-rail label="Branded" active-index="1" style="--md-navigation-rail-container-color: #f3e9ff; --md-navigation-rail-container-shape: 28px; --md-navigation-rail-tab-indicator-color: #7c4dff; --md-navigation-rail-tab-active-icon-color: #ffffff; --md-navigation-rail-tab-active-label-color: #311b92; --md-navigation-rail-tab-badge-color: #7c4dff;">
<md-navigation-rail-tab icon="home" label="Home" value="h"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="f" badge-value="5"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="s"></md-navigation-rail-tab>
</md-navigation-rail>
</div>
</div>| Part | On | Element |
|---|---|---|
container | md-navigation-rail | The rail surface |
scrim | md-navigation-rail | The modal backdrop |
logo / logo-contracted / logo-expanded | md-navigation-rail | Brand-mark wrappers per state |
toggle | md-navigation-rail | The expand / collapse control |
header / fab / footer | md-navigation-rail | Slot wrappers |
destinations | md-navigation-rail | The destination group |
overflow / overflow-trigger | md-navigation-rail | The max-visible trigger and its wrapper |
anchor | md-navigation-rail-tab | The <a> / button box |
icon-wrapper / icon | md-navigation-rail-tab | Glyph wrapper / glyph |
indicator | md-navigation-rail-tab | The active pill |
label | md-navigation-rail-tab | Label text |
caret | md-navigation-rail-tab | The disclosure chevron on a submenu destination |
state-layer | md-navigation-rail-tab | Hover / focus / press overlay |
<!-- index.html <head> — the icon font the components draw from -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200&display=swap">
<!-- index.html — register the AWC UI elements once -->
<script type="module">
import '@awc-ui/core/define';
</script>
<style>
.parts-rail::part(container) { border-inline-end: 2px solid var(--md-sys-color-primary); }
.parts-rail::part(destinations) { gap: 18px; }
.parts-rail md-navigation-rail-tab::part(label) { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; }
.parts-rail md-navigation-rail-tab::part(indicator) { border-radius: 6px; }
</style>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail class="parts-rail" label="Styled parts" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>// Icons need the Material Symbols stylesheet in index.html — see Installation.
import { MdNavigationRail, MdNavigationRailTab } from '@awc-ui/react';
export function Demo() {
return (
<>
<style>
.parts-rail::part(container) { border-inline-end: 2px solid var(--md-sys-color-primary); }
.parts-rail::part(destinations) { gap: 18px; }
.parts-rail md-navigation-rail-tab::part(label) { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; }
.parts-rail md-navigation-rail-tab::part(indicator) { border-radius: 6px; }
</style>
<div style={{ display: 'flex', blockSize: '364px', borderRadius: '16px', overflow: 'hidden' }}>
<MdNavigationRail className="parts-rail" label="Styled parts" activeIndex="1">
<MdNavigationRailTab icon="home" label="Home" value="home"></MdNavigationRailTab>
<MdNavigationRailTab icon="folder" label="Files" value="files"></MdNavigationRailTab>
<MdNavigationRailTab icon="settings" label="Settings" value="settings"></MdNavigationRailTab>
</MdNavigationRail>
<div style={{ flex: '1', padding: '16px', opacity: '.6', fontSize: '.85rem' }}>content</div>
</div>
</>
);
}// Icons need the Material Symbols stylesheet in index.html — see Installation.
// app.module.ts — register the AWC UI elements once
import { CUSTOM_ELEMENTS_SCHEMA, NgModule } from '@angular/core';
import { AwcUiModule } from '@awc-ui/angular';
@NgModule({
imports: [AwcUiModule],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
export class AppModule {}
<!-- app.component.html -->
<style>
.parts-rail::part(container) { border-inline-end: 2px solid var(--md-sys-color-primary); }
.parts-rail::part(destinations) { gap: 18px; }
.parts-rail md-navigation-rail-tab::part(label) { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; }
.parts-rail md-navigation-rail-tab::part(indicator) { border-radius: 6px; }
</style>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail class="parts-rail" label="Styled parts" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div><script setup>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<template>
<style>
.parts-rail::part(container) { border-inline-end: 2px solid var(--md-sys-color-primary); }
.parts-rail::part(destinations) { gap: 18px; }
.parts-rail md-navigation-rail-tab::part(label) { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; }
.parts-rail md-navigation-rail-tab::part(indicator) { border-radius: 6px; }
</style>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail class="parts-rail" label="Styled parts" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>
</template><script>
// Icons need the Material Symbols stylesheet in index.html — see Installation.
import '@awc-ui/core/define';
</script>
<style>
.parts-rail::part(container) { border-inline-end: 2px solid var(--md-sys-color-primary); }
.parts-rail::part(destinations) { gap: 18px; }
.parts-rail md-navigation-rail-tab::part(label) { text-transform: uppercase; letter-spacing: .08em; font-size: 10px; }
.parts-rail md-navigation-rail-tab::part(indicator) { border-radius: 6px; }
</style>
<div style="display: flex; block-size: 364px; border-radius: 16px; overflow: hidden;">
<md-navigation-rail class="parts-rail" label="Styled parts" active-index="1">
<md-navigation-rail-tab icon="home" label="Home" value="home"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="folder" label="Files" value="files"></md-navigation-rail-tab>
<md-navigation-rail-tab icon="settings" label="Settings" value="settings"></md-navigation-rail-tab>
</md-navigation-rail>
<div style="flex:1;padding:16px;opacity:.6;font-size:.85rem;">content</div>
</div>md-navigation-rail::part(destinations) { gap: 12px;}md-navigation-rail-tab ·
md-navigation-bar ·
md-tabs ·
md-fab ·
md-side-sheet ·
md-app-bar ·
md-icon-button
md-navigation-railTwo artefacts to give your AI agent so it generates correct UI with this component. The per-component spec answers "how do I use this exact tag?". The main-llm spec answers "which tag should I pick in the first place?".
md-navigation-rail spec card
Identity · when to use / when NOT · decision cues · behavioural contract · do/don't · anti-patterns · full API. Paste into your agent when you're implementing with this component.
System-prompt preamble · decision matrix · token reference · page recipes · anti-patterns. Paste into the system prompt at the start of a piece of work.