Skip to content

Commit 48ce8a2

Browse files
committed
feat: add new M3 UI components and their corresponding Angular application pages.
1 parent 50b1fce commit 48ce8a2

File tree

90 files changed

+3464
-100
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+3464
-100
lines changed

apps/angular-app/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,17 @@
2222
"@angular/platform-server": "^20.3.7",
2323
"@angular/router": "^20.3.7",
2424
"@angular/ssr": "^20.3.7",
25+
"@banegasn/m3-badge": "workspace:*",
2526
"@banegasn/m3-button": "workspace:*",
2627
"@banegasn/m3-card": "workspace:*",
28+
"@banegasn/m3-checkbox": "workspace:*",
29+
"@banegasn/m3-chip": "workspace:*",
30+
"@banegasn/m3-dialog": "workspace:*",
31+
"@banegasn/m3-progress": "workspace:*",
32+
"@banegasn/m3-slider": "workspace:*",
33+
"@banegasn/m3-tabs": "workspace:*",
34+
"@banegasn/m3-text-field": "workspace:*",
35+
"@banegasn/m3-tooltip": "workspace:*",
2736
"@banegasn/m3-fab-menu": "workspace:^",
2837
"@banegasn/m3-loading-indicator": "workspace:^",
2938
"@banegasn/m3-menu": "workspace:^",

apps/angular-app/src/app/app.component.html

Lines changed: 35 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -4,61 +4,50 @@
44
<m3-navigation-rail-toggle></m3-navigation-rail-toggle>
55

66
<app-seo-link href="home">
7-
<m3-navigation-rail-item label="Home"
8-
[active]="currentRoute() === '/home'">
7+
<m3-navigation-rail-item label="Home" [active]="currentRoute() === '/home'">
98
<span slot="icon" class="material-symbols-outlined">home</span>
109
</m3-navigation-rail-item>
1110
</app-seo-link>
1211

1312
<app-seo-link href="quick-start">
14-
<m3-navigation-rail-item label="Quick Start"
15-
[active]="currentRoute() === '/quick-start'">
13+
<m3-navigation-rail-item label="Quick Start" [active]="currentRoute() === '/quick-start'">
1614
<span slot="icon" class="material-symbols-outlined">rocket_launch</span>
1715
</m3-navigation-rail-item>
1816
</app-seo-link>
1917

20-
<div class="desktop-components-trigger"
21-
(mouseenter)="onDesktopComponentsMouseEnter()"
22-
(mouseleave)="onDesktopComponentsMouseLeave()"
23-
(menu-item-select)="onComponentsMenuItemSelect($event)">
18+
<div class="desktop-components-trigger" (mouseenter)="onDesktopComponentsMouseEnter()"
19+
(mouseleave)="onDesktopComponentsMouseLeave()" (menu-item-select)="onComponentsMenuItemSelect($event)">
2420
<app-seo-link href="components">
25-
<m3-navigation-rail-item label="Components"
26-
[active]="isComponentsRoute()">
21+
<m3-navigation-rail-item label="Components" [active]="isComponentsRoute()">
2722
<span slot="icon" class="material-symbols-outlined">browse</span>
2823
</m3-navigation-rail-item>
2924
</app-seo-link>
3025

31-
<m3-menu
32-
placement="right-start"
33-
[offset]="railExpanded() ? 24 : 8"
34-
[open]="componentsMenuOpen()"
35-
(mouseenter)="onDesktopComponentsMouseEnter()"
36-
(mouseleave)="onDesktopComponentsMouseLeave()"
37-
(menu-dismiss)="onComponentsMenuDismiss($event)"
38-
style="--md-menu-max-height: calc(100vh - 200px);">
26+
<m3-menu placement="right-start" [offset]="railExpanded() ? 24 : 8" [open]="componentsMenuOpen()"
27+
(mouseenter)="onDesktopComponentsMouseEnter()" (mouseleave)="onDesktopComponentsMouseLeave()"
28+
(menu-dismiss)="onComponentsMenuDismiss($event)" style="--md-menu-max-height: calc(100vh - 400px);">
3929
@for (item of componentMenuItems; track item.path) {
40-
<app-seo-link [href]="item.path.substring(1)">
41-
<m3-menu-item [value]="item.path">
42-
<span slot="leading-icon" class="material-symbols-outlined">{{ item.icon }}</span>
43-
{{ item.label }}
44-
</m3-menu-item>
45-
</app-seo-link>
30+
<app-seo-link [href]="item.path.substring(1)">
31+
<m3-menu-item [value]="item.path">
32+
<span slot="leading-icon" class="material-symbols-outlined">{{ item.icon }}</span>
33+
{{ item.label }}
34+
</m3-menu-item>
35+
</app-seo-link>
4636
}
4737
</m3-menu>
4838
</div>
4939

5040
<app-seo-link href="contact">
51-
<m3-navigation-rail-item label="Contact"
52-
[active]="currentRoute() === '/contact'">
41+
<m3-navigation-rail-item label="Contact" [active]="currentRoute() === '/contact'">
5342
<span slot="icon" class="material-symbols-outlined">person</span>
5443
</m3-navigation-rail-item>
5544
</app-seo-link>
5645

5746
<m3-navigation-rail-item label="Theme" slot="bottom" (item-click)="toggleTheme()">
5847
@if(currentTheme !== 'dark') {
59-
<span slot="icon" class="material-symbols-outlined">dark_mode</span>
48+
<span slot="icon" class="material-symbols-outlined">dark_mode</span>
6049
} @else {
61-
<span slot="icon" class="material-symbols-outlined">light_mode</span>
50+
<span slot="icon" class="material-symbols-outlined">light_mode</span>
6251
}
6352
</m3-navigation-rail-item>
6453

@@ -67,7 +56,8 @@
6756
</m3-navigation-rail-item>
6857

6958
<m3-navigation-rail-item label="GitHub" slot="bottom" (item-click)="openGitHub()">
70-
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor">
59+
<svg slot="icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
60+
fill="currentColor">
7161
<path
7262
d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
7363
</svg>
@@ -81,66 +71,49 @@
8171
</div>
8272
</div>
8373

84-
<div class="mobile-nav-shell"
85-
(menu-item-select)="onComponentsMenuItemSelect($event)">
74+
<div class="mobile-nav-shell" (menu-item-select)="onComponentsMenuItemSelect($event)">
8675
<div class="mobile-components-anchor">
87-
<m3-menu
88-
placement="top-center"
89-
[offset]="12"
90-
[open]="componentsMenuOpen()"
91-
(menu-dismiss)="onComponentsMenuDismiss($event)"
92-
style="--md-menu-max-height: calc(100dvh - 120px);">
76+
<m3-menu placement="top-center" [offset]="12" [open]="componentsMenuOpen()"
77+
(menu-dismiss)="onComponentsMenuDismiss($event)" style="--md-menu-max-height: calc(100dvh - 200px);">
9378
@for (item of componentMenuItems; track item.path) {
94-
<app-seo-link [href]="item.path.substring(1)">
95-
<m3-menu-item [value]="item.path">
96-
<span slot="leading-icon" class="material-symbols-outlined">{{ item.icon }}</span>
97-
{{ item.label }}
98-
</m3-menu-item>
99-
</app-seo-link>
79+
<app-seo-link [href]="item.path.substring(1)">
80+
<m3-menu-item [value]="item.path">
81+
<span slot="leading-icon" class="material-symbols-outlined">{{ item.icon }}</span>
82+
{{ item.label }}
83+
</m3-menu-item>
84+
</app-seo-link>
10085
}
10186
</m3-menu>
10287
</div>
10388

10489
<m3-navigation-bar class="mobile-nav" auto-layout>
10590
<app-seo-link href="home">
106-
<m3-navigation-bar-item
107-
label="Home"
108-
[active]="currentRoute() === '/home'">
91+
<m3-navigation-bar-item label="Home" [active]="currentRoute() === '/home'">
10992
<span slot="icon" class="material-symbols-outlined">home</span>
11093
</m3-navigation-bar-item>
11194
</app-seo-link>
11295

11396
<app-seo-link href="quick-start">
114-
<m3-navigation-bar-item
115-
label="Quick Start"
116-
[active]="currentRoute() === '/quick-start'">
97+
<m3-navigation-bar-item label="Quick Start" [active]="currentRoute() === '/quick-start'">
11798
<span slot="icon" class="material-symbols-outlined">rocket_launch</span>
11899
</m3-navigation-bar-item>
119100
</app-seo-link>
120101

121102
<app-seo-link href="components">
122-
<m3-navigation-bar-item
123-
id="mobile-components-trigger"
124-
label="Components"
125-
[active]="isComponentsRoute()"
126-
(pointerdown)="onMobileComponentsPointerDown($event)"
127-
(pointerup)="onMobileComponentsPointerUp($event)"
128-
(pointercancel)="onMobileComponentsPointerCancel($event)"
129-
(contextmenu)="onMobileComponentsContextMenu($event)">
103+
<m3-navigation-bar-item id="mobile-components-trigger" label="Components" [active]="isComponentsRoute()"
104+
(pointerdown)="onMobileComponentsPointerDown($event)" (pointerup)="onMobileComponentsPointerUp($event)"
105+
(pointercancel)="onMobileComponentsPointerCancel($event)" (contextmenu)="onMobileComponentsContextMenu($event)">
130106
<span slot="icon" class="material-symbols-outlined">browse</span>
131107
</m3-navigation-bar-item>
132108
</app-seo-link>
133109

134110
<app-seo-link href="contact">
135-
<m3-navigation-bar-item
136-
label="Contact"
137-
[active]="currentRoute() === '/contact'">
111+
<m3-navigation-bar-item label="Contact" [active]="currentRoute() === '/contact'">
138112
<span slot="icon" class="material-symbols-outlined">person</span>
139113
</m3-navigation-bar-item>
140114
</app-seo-link>
141115

142-
<m3-navigation-bar-item label="Settings"
143-
(item-click)="openSettings()">
116+
<m3-navigation-bar-item label="Settings" (item-click)="openSettings()">
144117
<span slot="icon" class="material-symbols-outlined">settings</span>
145118
</m3-navigation-bar-item>
146119
</m3-navigation-bar>

apps/angular-app/src/app/app.component.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,15 @@ export class AppComponent implements OnInit, OnDestroy {
5151
{ path: '/navigation-bar', label: 'Navigation Bar', icon: 'bottom_navigation' },
5252
{ path: '/switches', label: 'Switches', icon: 'toggle_on' },
5353
{ path: '/radio-buttons', label: 'Radio Buttons', icon: 'radio_button_checked' },
54+
{ path: '/checkboxes', label: 'Checkboxes', icon: 'check_box' },
55+
{ path: '/sliders', label: 'Sliders', icon: 'linear_scale' },
56+
{ path: '/text-fields', label: 'Text Fields', icon: 'text_fields' },
57+
{ path: '/chips', label: 'Chips', icon: 'label' },
58+
{ path: '/dialog', label: 'Dialog', icon: 'chat_bubble' },
59+
{ path: '/tooltip', label: 'Tooltip', icon: 'info' },
60+
{ path: '/badge', label: 'Badge', icon: 'badge' },
61+
{ path: '/progress', label: 'Progress', icon: 'hourglass_empty' },
62+
{ path: '/tabs', label: 'Tabs', icon: 'tab' },
5463
{ path: '/search-bar', label: 'Search Bar', icon: 'search' },
5564
{ path: '/split-button', label: 'Split Button', icon: 'arrow_split' },
5665
{ path: '/menu', label: 'Menu', icon: 'menu' },

apps/angular-app/src/app/app.routes.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,15 @@ import { LoadingIndicatorComponent } from '../pages/loading-indicator/loading-in
1414
import { FabMenuComponent } from '../pages/fab-menu/fab-menu.component';
1515
import { MenuComponent } from '../pages/menu/menu.component';
1616
import { QuickStartComponent } from '../pages/quick-start/quick-start.component';
17+
import { CheckboxComponent } from '../pages/checkbox/checkbox.component';
18+
import { SliderComponent } from '../pages/slider/slider.component';
19+
import { TextFieldComponent } from '../pages/text-field/text-field.component';
20+
import { DialogComponent } from '../pages/dialog/dialog.component';
21+
import { ChipsComponent } from '../pages/chips/chips.component';
22+
import { TooltipComponent } from '../pages/tooltip/tooltip.component';
23+
import { BadgeComponent } from '../pages/badge/badge.component';
24+
import { ProgressComponent } from '../pages/progress/progress.component';
25+
import { TabsComponent } from '../pages/tabs/tabs.component';
1726

1827
export const routes: Routes = [
1928
{ path: '', redirectTo: 'home', pathMatch: 'full' },
@@ -85,6 +94,78 @@ export const routes: Routes = [
8594
description: 'Material 3 Expressive Radio Button components for selecting a single option from a list.'
8695
}
8796
},
97+
{
98+
path: 'checkboxes',
99+
component: CheckboxComponent,
100+
title: 'Checkboxes',
101+
data: {
102+
description: 'Material 3 Expressive Checkbox components for selecting multiple options.'
103+
}
104+
},
105+
{
106+
path: 'sliders',
107+
component: SliderComponent,
108+
title: 'Sliders',
109+
data: {
110+
description: 'Material 3 Expressive Slider components for selecting from a range of values.'
111+
}
112+
},
113+
{
114+
path: 'text-fields',
115+
component: TextFieldComponent,
116+
title: 'Text Fields',
117+
data: {
118+
description: 'Material 3 Expressive Text Field components for entering text.'
119+
}
120+
},
121+
{
122+
path: 'chips',
123+
component: ChipsComponent,
124+
title: 'Chips',
125+
data: {
126+
description: 'Material 3 Expressive Chip components for entering information, making selections, filtering content, or triggering actions.'
127+
}
128+
},
129+
{
130+
path: 'dialog',
131+
component: DialogComponent,
132+
title: 'Dialog',
133+
data: {
134+
description: 'Material 3 Expressive Dialog component for important prompts in a user flow.'
135+
}
136+
},
137+
{
138+
path: 'tooltip',
139+
component: TooltipComponent,
140+
title: 'Tooltip',
141+
data: {
142+
description: 'Material 3 Expressive Tooltip component for informative text on hover or focus.'
143+
}
144+
},
145+
{
146+
path: 'badge',
147+
component: BadgeComponent,
148+
title: 'Badge',
149+
data: {
150+
description: 'Material 3 Expressive Badge component for conveying dynamic information like counts or status.'
151+
}
152+
},
153+
{
154+
path: 'progress',
155+
component: ProgressComponent,
156+
title: 'Progress Indicator',
157+
data: {
158+
description: 'Material 3 Expressive Linear Progress Indicator for displaying operation status.'
159+
}
160+
},
161+
{
162+
path: 'tabs',
163+
component: TabsComponent,
164+
title: 'Tabs',
165+
data: {
166+
description: 'Material 3 Expressive Tabs component for organizing content across screens.'
167+
}
168+
},
88169
{
89170
path: 'search-bar',
90171
component: SearchBarComponent,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.demo-row {
2+
display: flex;
3+
align-items: center;
4+
flex-wrap: wrap;
5+
gap: 16px;
6+
margin-top: 1rem;
7+
}
8+
9+
.page-container {
10+
max-width: 1200px;
11+
margin: 0 auto;
12+
padding: 2rem;
13+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<div class="page-container docs-page">
2+
<header class="page-header">
3+
<h1>Badge</h1>
4+
<p class="subtitle">Badges convey dynamic information, such as a count or status.</p>
5+
</header>
6+
7+
<section class="demo-section">
8+
<h2>Dot Badge</h2>
9+
<div class="interactive-demo">
10+
<div class="demo-row" style="gap: 32px;">
11+
<m3-badge><span class="material-symbols-outlined" style="font-size:32px; color: var(--md-sys-color-on-surface)">mail</span></m3-badge>
12+
<m3-badge><span class="material-symbols-outlined" style="font-size:32px; color: var(--md-sys-color-on-surface)">notifications</span></m3-badge>
13+
</div>
14+
<app-code-block [code]="dotExample" language="html" variant="sample"></app-code-block>
15+
</div>
16+
</section>
17+
18+
<section class="demo-section">
19+
<h2>Labeled Badge</h2>
20+
<div class="interactive-demo">
21+
<div class="demo-row" style="gap: 48px;">
22+
<m3-badge label="3"><span class="material-symbols-outlined" style="font-size:32px; color: var(--md-sys-color-on-surface)">mail</span></m3-badge>
23+
<m3-badge label="99+"><span class="material-symbols-outlined" style="font-size:32px; color: var(--md-sys-color-on-surface)">notifications</span></m3-badge>
24+
</div>
25+
<app-code-block [code]="labelExample" language="html" variant="sample"></app-code-block>
26+
</div>
27+
</section>
28+
</div>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Component, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA } from "@angular/core";
2+
import { CodeBlockComponent } from "../../app/components/code-block/code-block.component";
3+
import '@banegasn/m3-badge';
4+
import '@banegasn/m3-button';
5+
6+
@Component({ selector: 'app-badge', schemas: [CUSTOM_ELEMENTS_SCHEMA], changeDetection: ChangeDetectionStrategy.OnPush, templateUrl: './badge.component.html', styleUrls: ['./badge.component.css'], imports: [CodeBlockComponent] })
7+
export class BadgeComponent {
8+
readonly dotExample = `<m3-badge><span class="material-symbols-outlined">mail</span></m3-badge>`;
9+
readonly labelExample = `<m3-badge label="3"><span class="material-symbols-outlined">notifications</span></m3-badge>`;
10+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.demo-row {
2+
display: flex;
3+
align-items: center;
4+
flex-wrap: wrap;
5+
gap: 16px;
6+
margin-top: 1rem;
7+
}
8+
9+
.page-container {
10+
max-width: 1200px;
11+
margin: 0 auto;
12+
padding: 2rem;
13+
}

0 commit comments

Comments
 (0)