gcp-material-ui 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/.agents/skills/charts/SKILL.MD +103 -0
  2. package/.agents/skills/creating-common-components/SKILL.MD +121 -0
  3. package/.agents/skills/creating-pages/SKILL.MD +205 -0
  4. package/.agents/skills/sidebar/SKILL.MD +63 -0
  5. package/.agents/skills/workflow-graph/SKILL.MD +160 -0
  6. package/.dockerignore +4 -0
  7. package/.editorconfig +17 -0
  8. package/.prettierrc +12 -0
  9. package/Dockerfile +14 -0
  10. package/PUBLISH_GUIDE.md +33 -0
  11. package/README.md +48 -0
  12. package/angular.json +79 -0
  13. package/deploy.sh +47 -0
  14. package/nginx.conf +15 -0
  15. package/package.json +48 -0
  16. package/public/favicon.ico +0 -0
  17. package/public/google-cloud-combined.svg +1 -0
  18. package/publish.sh +14 -0
  19. package/src/_variables.scss +183 -0
  20. package/src/app/app.config.ts +19 -0
  21. package/src/app/app.html +1 -0
  22. package/src/app/app.routes.ts +65 -0
  23. package/src/app/app.scss +0 -0
  24. package/src/app/app.spec.ts +23 -0
  25. package/src/app/app.ts +12 -0
  26. package/src/app/auth/auth.guard.ts +7 -0
  27. package/src/app/auth/auth.service.ts +50 -0
  28. package/src/app/components/page/page.html +20 -0
  29. package/src/app/components/page/page.scss +41 -0
  30. package/src/app/components/page/page.ts +15 -0
  31. package/src/app/dashboard/dashboard.html +287 -0
  32. package/src/app/dashboard/dashboard.scss +196 -0
  33. package/src/app/dashboard/dashboard.ts +24 -0
  34. package/src/app/demo-components/buttons/buttons-demo.html +92 -0
  35. package/src/app/demo-components/buttons/buttons-demo.scss +38 -0
  36. package/src/app/demo-components/buttons/buttons-demo.ts +23 -0
  37. package/src/app/demo-components/card/card-demo.html +52 -0
  38. package/src/app/demo-components/card/card-demo.scss +47 -0
  39. package/src/app/demo-components/card/card-demo.ts +21 -0
  40. package/src/app/demo-components/charts/charts-demo.html +88 -0
  41. package/src/app/demo-components/charts/charts-demo.scss +50 -0
  42. package/src/app/demo-components/charts/charts-demo.ts +201 -0
  43. package/src/app/demo-components/chips/chips-demo.html +87 -0
  44. package/src/app/demo-components/chips/chips-demo.scss +6 -0
  45. package/src/app/demo-components/chips/chips-demo.ts +57 -0
  46. package/src/app/demo-components/code-snippet/code-snippet-demo.html +52 -0
  47. package/src/app/demo-components/code-snippet/code-snippet-demo.scss +20 -0
  48. package/src/app/demo-components/code-snippet/code-snippet-demo.ts +31 -0
  49. package/src/app/demo-components/dialog/dialog-demo.html +47 -0
  50. package/src/app/demo-components/dialog/dialog-demo.ts +90 -0
  51. package/src/app/demo-components/dialog/dialog-examples.ts +126 -0
  52. package/src/app/demo-components/expand-button/expand-button-demo.html +28 -0
  53. package/src/app/demo-components/expand-button/expand-button-demo.scss +45 -0
  54. package/src/app/demo-components/expand-button/expand-button-demo.ts +28 -0
  55. package/src/app/demo-components/expansion/expansion-demo.html +105 -0
  56. package/src/app/demo-components/expansion/expansion-demo.scss +11 -0
  57. package/src/app/demo-components/expansion/expansion-demo.ts +49 -0
  58. package/src/app/demo-components/forms/forms-demo.html +114 -0
  59. package/src/app/demo-components/forms/forms-demo.scss +43 -0
  60. package/src/app/demo-components/forms/forms-demo.ts +57 -0
  61. package/src/app/demo-components/message/message-demo.html +47 -0
  62. package/src/app/demo-components/message/message-demo.ts +33 -0
  63. package/src/app/demo-components/message/message.html +15 -0
  64. package/src/app/demo-components/message/message.scss +115 -0
  65. package/src/app/demo-components/message/message.ts +39 -0
  66. package/src/app/demo-components/sidebar/sidebar-demo.html +46 -0
  67. package/src/app/demo-components/sidebar/sidebar-demo.scss +47 -0
  68. package/src/app/demo-components/sidebar/sidebar-demo.ts +27 -0
  69. package/src/app/demo-components/sidebar/sidebar.html +15 -0
  70. package/src/app/demo-components/sidebar/sidebar.scss +25 -0
  71. package/src/app/demo-components/sidebar/sidebar.ts +87 -0
  72. package/src/app/demo-components/slide-toggle/slide-toggle-demo.html +110 -0
  73. package/src/app/demo-components/slide-toggle/slide-toggle-demo.scss +45 -0
  74. package/src/app/demo-components/slide-toggle/slide-toggle-demo.ts +39 -0
  75. package/src/app/demo-components/stepper/stepper-demo.html +99 -0
  76. package/src/app/demo-components/stepper/stepper-demo.ts +84 -0
  77. package/src/app/demo-components/tables/clean_tables_scss.py +16 -0
  78. package/src/app/demo-components/tables/tables-demo.html +64 -0
  79. package/src/app/demo-components/tables/tables-demo.scss +18 -0
  80. package/src/app/demo-components/tables/tables-demo.ts +89 -0
  81. package/src/app/demo-components/tabs/tabs-demo.html +168 -0
  82. package/src/app/demo-components/tabs/tabs-demo.scss +22 -0
  83. package/src/app/demo-components/tabs/tabs-demo.ts +76 -0
  84. package/src/app/demo-components/toolbars/toolbars-demo.html +50 -0
  85. package/src/app/demo-components/toolbars/toolbars-demo.scss +29 -0
  86. package/src/app/demo-components/toolbars/toolbars-demo.ts +25 -0
  87. package/src/app/demo-components/tooltip/tooltip-demo.html +80 -0
  88. package/src/app/demo-components/tooltip/tooltip-demo.scss +30 -0
  89. package/src/app/demo-components/tooltip/tooltip-demo.ts +27 -0
  90. package/src/app/demo-components/typography/typography-demo.html +23 -0
  91. package/src/app/demo-components/typography/typography-demo.scss +49 -0
  92. package/src/app/demo-components/typography/typography-demo.ts +72 -0
  93. package/src/app/demo-components/workflow-graph/workflow-graph-demo.html +25 -0
  94. package/src/app/demo-components/workflow-graph/workflow-graph-demo.scss +48 -0
  95. package/src/app/demo-components/workflow-graph/workflow-graph-demo.ts +133 -0
  96. package/src/app/layout/layout.html +12 -0
  97. package/src/app/layout/layout.scss +21 -0
  98. package/src/app/layout/layout.ts +19 -0
  99. package/src/app/layout/side-menu/side-menu.html +32 -0
  100. package/src/app/layout/side-menu/side-menu.scss +52 -0
  101. package/src/app/layout/side-menu/side-menu.ts +70 -0
  102. package/src/app/layout/top-action-bar/top-action-bar.html +41 -0
  103. package/src/app/layout/top-action-bar/top-action-bar.scss +98 -0
  104. package/src/app/layout/top-action-bar/top-action-bar.ts +68 -0
  105. package/src/app/page-templates/complex-form/complex-form.html +103 -0
  106. package/src/app/page-templates/complex-form/complex-form.scss +110 -0
  107. package/src/app/page-templates/complex-form/complex-form.ts +66 -0
  108. package/src/app/page-templates/firewall-add/firewall-add.html +78 -0
  109. package/src/app/page-templates/firewall-add/firewall-add.scss +1 -0
  110. package/src/app/page-templates/firewall-add/firewall-add.ts +94 -0
  111. package/src/app/page-templates/firewall-details/firewall-details.html +115 -0
  112. package/src/app/page-templates/firewall-details/firewall-details.scss +21 -0
  113. package/src/app/page-templates/firewall-details/firewall-details.ts +91 -0
  114. package/src/app/page-templates/firewall-list/firewall-list.html +99 -0
  115. package/src/app/page-templates/firewall-list/firewall-list.scss +21 -0
  116. package/src/app/page-templates/firewall-list/firewall-list.ts +85 -0
  117. package/src/app/page-templates/firewall.service.ts +84 -0
  118. package/src/app/services/project.service.ts +24 -0
  119. package/src/index.html +17 -0
  120. package/src/main.ts +6 -0
  121. package/src/styles.scss +739 -0
  122. package/start_server.sh +4 -0
  123. package/tsconfig.app.json +15 -0
  124. package/tsconfig.json +33 -0
  125. package/tsconfig.spec.json +15 -0
@@ -0,0 +1,18 @@
1
+ .table-card {
2
+ margin: 0 auto;
3
+ .mat-mdc-card-content {
4
+ padding: 0 !important;
5
+ /* Edge-to-Edge layout supports full width */
6
+ }
7
+
8
+ mat-card-subtitle {
9
+ margin-bottom: 10px;
10
+ }
11
+ }
12
+
13
+ .mat-column-position {
14
+ width: 80px;
15
+ }
16
+ .mat-column-symbol {
17
+ width: 100px;
18
+ }
@@ -0,0 +1,89 @@
1
+ import { Component, OnInit, AfterViewInit, ViewChild } from '@angular/core';
2
+ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
3
+ import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
4
+ import { MatSort, MatSortModule } from '@angular/material/sort';
5
+ import { MatFormFieldModule } from '@angular/material/form-field';
6
+ import { MatInputModule } from '@angular/material/input';
7
+ import { MatButtonModule } from '@angular/material/button';
8
+ import { MatCardModule } from '@angular/material/card';
9
+ import { PageComponent } from '../../components/page/page';
10
+ import { MatIconModule } from '@angular/material/icon';
11
+ import { SelectionModel } from '@angular/cdk/collections';
12
+ import { MatCheckboxModule } from '@angular/material/checkbox';
13
+
14
+ export interface PeriodicElement {
15
+ name: string;
16
+ position: number;
17
+ weight: number;
18
+ symbol: string;
19
+ }
20
+
21
+ const ELEMENT_DATA: PeriodicElement[] = [
22
+ {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
23
+ {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
24
+ {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
25
+ {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'},
26
+ {position: 5, name: 'Boron', weight: 10.811, symbol: 'B'},
27
+ {position: 6, name: 'Carbon', weight: 12.0107, symbol: 'C'},
28
+ {position: 7, name: 'Nitrogen', weight: 14.0067, symbol: 'N'},
29
+ {position: 8, name: 'Oxygen', weight: 15.9994, symbol: 'O'},
30
+ {position: 9, name: 'Fluorine', weight: 18.9984, symbol: 'F'},
31
+ {position: 10, name: 'Neon', weight: 20.1797, symbol: 'Ne'},
32
+ ];
33
+
34
+ @Component({
35
+ selector: 'app-tables-demo',
36
+ standalone: true,
37
+ imports: [
38
+ MatTableModule,
39
+ MatPaginatorModule,
40
+ MatSortModule,
41
+ MatFormFieldModule,
42
+ MatInputModule,
43
+ MatButtonModule,
44
+ MatCardModule,
45
+ PageComponent,
46
+ MatIconModule,
47
+ MatCheckboxModule
48
+ ],
49
+ templateUrl: './tables-demo.html',
50
+ styleUrl: './tables-demo.scss'
51
+ })
52
+ export class TablesDemoComponent implements OnInit, AfterViewInit {
53
+ displayedColumns: string[] = ['select', 'position', 'name', 'weight', 'symbol'];
54
+ dataSource = new MatTableDataSource(ELEMENT_DATA);
55
+ selection = new SelectionModel<PeriodicElement>(true, []);
56
+
57
+ @ViewChild(MatPaginator) paginator!: MatPaginator;
58
+ @ViewChild(MatSort) sort!: MatSort;
59
+
60
+ isAllSelected() {
61
+ const numSelected = this.selection.selected.length;
62
+ const numRows = this.dataSource.data.length;
63
+ return numSelected === numRows;
64
+ }
65
+
66
+ toggleAllRows() {
67
+ if (this.isAllSelected()) {
68
+ this.selection.clear();
69
+ return;
70
+ }
71
+ this.selection.select(...this.dataSource.data);
72
+ }
73
+
74
+ ngOnInit() {}
75
+
76
+ ngAfterViewInit() {
77
+ this.dataSource.paginator = this.paginator;
78
+ this.dataSource.sort = this.sort;
79
+ }
80
+
81
+ applyFilter(event: Event) {
82
+ const filterValue = (event.target as HTMLInputElement).value;
83
+ this.dataSource.filter = filterValue.trim().toLowerCase();
84
+
85
+ if (this.dataSource.paginator) {
86
+ this.dataSource.paginator.firstPage();
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,168 @@
1
+ <app-page title="Tabs Showcase">
2
+ <div class="showcase-container default-container-padding">
3
+ <!-- Basic Tabs -->
4
+ <mat-card class="showcase-card">
5
+ <mat-card-header>
6
+ <mat-card-title>Basic Tabs</mat-card-title>
7
+ <mat-card-subtitle
8
+ >Standard navigation with default Angular Material styles</mat-card-subtitle
9
+ >
10
+ </mat-card-header>
11
+ <mat-card-content class="showcase-grid">
12
+ <mat-tab-group
13
+ animationDuration="0ms"
14
+ mat-stretch-tabs="false"
15
+ mat-align-tabs="start"
16
+ style="width: 100%"
17
+ >
18
+ <mat-tab label="Overview">
19
+ <div class="tab-content">
20
+ <h3>Overview Content</h3>
21
+ <p>
22
+ This is the overview tab content. Standard behavior with default thematic colors and
23
+ elevations.
24
+ </p>
25
+ </div>
26
+ </mat-tab>
27
+ <mat-tab label="Details">
28
+ <div class="tab-content">
29
+ <h3>Details Content</h3>
30
+ <p>Detailed analysis of resource item components setup.</p>
31
+ </div>
32
+ </mat-tab>
33
+ <mat-tab label="Logs" disabled>
34
+ <div class="tab-content">
35
+ <h3>Logs</h3>
36
+ <p>Logs content is disabled.</p>
37
+ </div>
38
+ </mat-tab>
39
+ </mat-tab-group>
40
+ </mat-card-content>
41
+ </mat-card>
42
+
43
+ <!-- Tabs with Icons -->
44
+ <mat-card class="showcase-card">
45
+ <mat-card-header>
46
+ <mat-card-title>Tabs with Icons</mat-card-title>
47
+ <mat-card-subtitle>Using templates for rich header content</mat-card-subtitle>
48
+ </mat-card-header>
49
+ <mat-card-content class="showcase-grid">
50
+ <mat-tab-group
51
+ animationDuration="0ms"
52
+ mat-stretch-tabs="false"
53
+ mat-align-tabs="start"
54
+ style="width: 100%"
55
+ >
56
+ <mat-tab>
57
+ <ng-template mat-tab-label>
58
+ <mat-icon class="tab-icon">home</mat-icon>
59
+ <span>Dashboard</span>
60
+ </ng-template>
61
+ <div class="tab-content">
62
+ <h3>Dashboard</h3>
63
+ <p>Main dashboard statistics and summaries.</p>
64
+ </div>
65
+ </mat-tab>
66
+ <mat-tab>
67
+ <ng-template mat-tab-label>
68
+ <mat-icon class="tab-icon">settings</mat-icon>
69
+ <span>Settings</span>
70
+ </ng-template>
71
+ <div class="tab-content">
72
+ <h3>Settings</h3>
73
+ <p>Configuration panel options.</p>
74
+ </div>
75
+ </mat-tab>
76
+ </mat-tab-group>
77
+ </mat-card-content>
78
+ </mat-card>
79
+
80
+ <!-- Complex Content Tabs -->
81
+ <mat-card class="showcase-card">
82
+ <mat-card-header>
83
+ <mat-card-title>Complex Content Showcase</mat-card-title>
84
+ <mat-card-subtitle>Displaying richer layouts inside individual content wrappers</mat-card-subtitle>
85
+ </mat-card-header>
86
+ <mat-card-content class="showcase-grid">
87
+ <mat-tab-group animationDuration="0ms" mat-stretch-tabs="false" mat-align-tabs="start" style="width: 100%;">
88
+
89
+ <!-- Form Tab -->
90
+ <mat-tab label="Account Details">
91
+ <div style="padding: 20px 0; max-width: 400px; display: flex; flex-direction: column; gap: 12px;">
92
+ <form [formGroup]="simpleForm" (ngSubmit)="onSubmit()" style="display: flex; flex-direction: column; gap: 12px;">
93
+ <mat-form-field appearance="outline">
94
+ <mat-label>Name</mat-label>
95
+ <input matInput formControlName="name" placeholder="John Doe">
96
+ </mat-form-field>
97
+
98
+ <mat-form-field appearance="outline">
99
+ <mat-label>Email</mat-label>
100
+ <input matInput formControlName="email" type="email" placeholder="john.doe@example.com">
101
+ </mat-form-field>
102
+
103
+ <mat-form-field appearance="outline">
104
+ <mat-label>Category</mat-label>
105
+ <mat-select formControlName="category">
106
+ <mat-option value="tech">Technology</mat-option>
107
+ <mat-option value="finance">Finance</mat-option>
108
+ </mat-select>
109
+ </mat-form-field>
110
+
111
+ <div style="display: flex; gap: 8px;">
112
+ <button mat-flat-button color="primary" type="submit" [disabled]="simpleForm.invalid">Submit</button>
113
+ <button mat-button type="button">Cancel</button>
114
+ </div>
115
+ </form>
116
+ </div>
117
+ </mat-tab>
118
+
119
+ <!-- Table Tab -->
120
+ <mat-tab label="System Overview">
121
+ <div style="padding: 20px 0; width: 100%;">
122
+
123
+ <div class="filter-container">
124
+ <mat-icon>filter_list</mat-icon>
125
+ <span class="filter-title">Filter</span>
126
+ <input class="filter-input" (keyup)="applyFilter($event)" placeholder="Filter items">
127
+ </div>
128
+
129
+ <div class="table-container">
130
+ <table mat-table [dataSource]="dataSource" class="mat-elevation" style="width: 100%;">
131
+
132
+ <!-- Position Column -->
133
+ <ng-container matColumnDef="position">
134
+ <th mat-header-cell *matHeaderCellDef> Id </th>
135
+ <td mat-cell *matCellDef="let element"> {{element.position}} </td>
136
+ </ng-container>
137
+
138
+ <!-- Name Column -->
139
+ <ng-container matColumnDef="name">
140
+ <th mat-header-cell *matHeaderCellDef> Primary String </th>
141
+ <td mat-cell *matCellDef="let element"> {{element.name}} </td>
142
+ </ng-container>
143
+
144
+ <!-- Weight Column -->
145
+ <ng-container matColumnDef="weight">
146
+ <th mat-header-cell *matHeaderCellDef> Oddness </th>
147
+ <td mat-cell *matCellDef="let element"> {{element.weight}} </td>
148
+ </ng-container>
149
+
150
+ <!-- Symbol Column -->
151
+ <ng-container matColumnDef="symbol">
152
+ <th mat-header-cell *matHeaderCellDef> Color </th>
153
+ <td mat-cell *matCellDef="let element"> {{element.symbol}} </td>
154
+ </ng-container>
155
+
156
+ <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
157
+ <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
158
+ </table>
159
+ </div>
160
+
161
+ </div>
162
+ </mat-tab>
163
+
164
+ </mat-tab-group>
165
+ </mat-card-content>
166
+ </mat-card>
167
+ </div>
168
+ </app-page>
@@ -0,0 +1,22 @@
1
+ @use '@angular/material' as mat;
2
+ @use '../../../_variables' as theme; // From components/src/app/components/tabs/
3
+
4
+ .showcase-container {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 24px;
8
+ max-width: 1000px;
9
+ margin: 0 auto;
10
+ }
11
+
12
+ .showcase-card {
13
+ margin-bottom: 8px;
14
+ }
15
+
16
+ .showcase-grid {
17
+ display: flex;
18
+ flex-wrap: wrap;
19
+ gap: 16px;
20
+ padding-top: 16px;
21
+ align-items: center;
22
+ }
@@ -0,0 +1,76 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatTabsModule } from '@angular/material/tabs';
4
+ import { MatCardModule } from '@angular/material/card';
5
+ import { MatIconModule } from '@angular/material/icon';
6
+ import { MatButtonModule } from '@angular/material/button';
7
+ import { PageComponent } from '../../components/page/page';
8
+ import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
9
+ import { MatFormFieldModule } from '@angular/material/form-field';
10
+ import { MatInputModule } from '@angular/material/input';
11
+ import { MatSelectModule } from '@angular/material/select';
12
+ import { MatTableDataSource, MatTableModule } from '@angular/material/table';
13
+
14
+ export interface PeriodicElement {
15
+ name: string;
16
+ position: number;
17
+ weight: number;
18
+ symbol: string;
19
+ }
20
+
21
+ const ELEMENT_DATA: PeriodicElement[] = [
22
+ {position: 1, name: 'Hydrogen', weight: 1.0079, symbol: 'H'},
23
+ {position: 2, name: 'Helium', weight: 4.0026, symbol: 'He'},
24
+ {position: 3, name: 'Lithium', weight: 6.941, symbol: 'Li'},
25
+ {position: 4, name: 'Beryllium', weight: 9.0122, symbol: 'Be'}
26
+ ];
27
+
28
+ @Component({
29
+ selector: 'app-tabs-demo',
30
+ standalone: true,
31
+ imports: [
32
+ CommonModule,
33
+ MatTabsModule,
34
+ MatCardModule,
35
+ MatIconModule,
36
+ MatButtonModule,
37
+ PageComponent,
38
+ ReactiveFormsModule,
39
+ MatFormFieldModule,
40
+ MatInputModule,
41
+ MatSelectModule,
42
+ MatTableModule
43
+ ],
44
+ templateUrl: './tabs-demo.html',
45
+ styleUrls: ['./tabs-demo.scss']
46
+ })
47
+ export class TabsDemoComponent {
48
+ simpleForm: FormGroup;
49
+ displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
50
+ dataSource = new MatTableDataSource(ELEMENT_DATA);
51
+
52
+ constructor(private fb: FormBuilder) {
53
+ this.simpleForm = this.fb.group({
54
+ name: ['', Validators.required],
55
+ email: ['', [Validators.required, Validators.email]],
56
+ category: ['tech']
57
+ });
58
+ }
59
+
60
+ onSubmit() {
61
+ if (this.simpleForm.valid) {
62
+ console.log('Form Submitted inside Tabs', this.simpleForm.value);
63
+ }
64
+ }
65
+
66
+ applyFilter(event: Event) {
67
+ const filterValue = (event.target as HTMLInputElement).value;
68
+ this.dataSource.filter = filterValue.trim().toLowerCase();
69
+ }
70
+
71
+ tabs = [
72
+ { label: 'Dynamic One', content: 'This is dynamically loaded Content 1' },
73
+ { label: 'Dynamic Two', content: 'This is dynamically loaded Content 2' },
74
+ { label: 'Dynamic Three', content: 'This is dynamically loaded Content 3' }
75
+ ];
76
+ }
@@ -0,0 +1,50 @@
1
+ <app-page title="Toolbars Showcase">
2
+ <div class="showcase-container default-container-padding">
3
+ <mat-card class="showcase-card">
4
+ <mat-card-header>
5
+ <mat-card-title>Basic Toolbar</mat-card-title>
6
+ <mat-card-subtitle>Standard top bar navigation style</mat-card-subtitle>
7
+ </mat-card-header>
8
+ <mat-card-content class="showcase-content">
9
+ <mat-toolbar>
10
+ <span>My Application</span>
11
+ </mat-toolbar>
12
+ </mat-card-content>
13
+ </mat-card>
14
+
15
+ <mat-card class="showcase-card">
16
+ <mat-card-header>
17
+ <mat-card-title>Toolbar with Actions</mat-card-title>
18
+ <mat-card-subtitle>Adding items using `.spacer` helper structure to separate flex layouts</mat-card-subtitle>
19
+ </mat-card-header>
20
+ <mat-card-content class="showcase-content">
21
+ <mat-toolbar>
22
+ <span>My App</span>
23
+ <span class="spacer"></span>
24
+ <button mat-button color="primary">Favorite</button>
25
+ <button mat-button color="warn">
26
+ <mat-icon>delete_forever</mat-icon>
27
+ <span>Remove Item</span>
28
+ </button>
29
+ </mat-toolbar>
30
+ </mat-card-content>
31
+ </mat-card>
32
+
33
+ <mat-card class="showcase-card">
34
+ <mat-card-header>
35
+ <mat-card-title>Toolbar with Text Buttons</mat-card-title>
36
+ <mat-card-subtitle>Using `mat-button` on opposing sides of toolbar</mat-card-subtitle>
37
+ </mat-card-header>
38
+ <mat-card-content class="showcase-content">
39
+ <mat-toolbar>
40
+ <span>My App</span>
41
+ <button mat-button color="primary">Home</button>
42
+ <button mat-button color="primary">About</button>
43
+ <span class="spacer"></span>
44
+ <button mat-button color="primary">Login</button>
45
+ <button mat-button color="primary">Register</button>
46
+ </mat-toolbar>
47
+ </mat-card-content>
48
+ </mat-card>
49
+ </div>
50
+ </app-page>
@@ -0,0 +1,29 @@
1
+ .showcase-container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 24px;
5
+ max-width: 1000px;
6
+ margin: 0 auto;
7
+ }
8
+
9
+ .showcase-card {
10
+ margin-bottom: 8px;
11
+ }
12
+
13
+ .showcase-content {
14
+ padding-top: 16px;
15
+ }
16
+
17
+ .spacer {
18
+ flex: 1 1 auto;
19
+ }
20
+
21
+ .toolbar-list {
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: 16px;
25
+ }
26
+
27
+ .example-icon {
28
+ padding: 0 14px;
29
+ }
@@ -0,0 +1,25 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatToolbarModule } from '@angular/material/toolbar';
4
+ import { MatButtonModule } from '@angular/material/button';
5
+ import { MatIconModule } from '@angular/material/icon';
6
+ import { MatMenuModule } from '@angular/material/menu';
7
+ import { MatCardModule } from '@angular/material/card';
8
+ import { PageComponent } from '../../components/page/page';
9
+
10
+ @Component({
11
+ selector: 'app-toolbars-demo',
12
+ standalone: true,
13
+ imports: [
14
+ CommonModule,
15
+ MatToolbarModule,
16
+ MatButtonModule,
17
+ MatIconModule,
18
+ MatMenuModule,
19
+ MatCardModule,
20
+ PageComponent
21
+ ],
22
+ templateUrl: './toolbars-demo.html',
23
+ styleUrls: ['./toolbars-demo.scss']
24
+ })
25
+ export class ToolbarsDemoComponent {}
@@ -0,0 +1,80 @@
1
+ <app-page title="Tooltip Showcase">
2
+ <div class="showcase-container default-container-padding">
3
+
4
+ <!-- Basic Tooltip -->
5
+ <mat-card class="showcase-card">
6
+ <mat-card-header>
7
+ <mat-card-title>Basic Tooltip</mat-card-title>
8
+ <mat-card-subtitle>Simple text tooltip on hover</mat-card-subtitle>
9
+ </mat-card-header>
10
+ <mat-card-content class="showcase-grid">
11
+ <button mat-flat-button color="primary" matTooltip="This is a simple tooltip">
12
+ Hover me
13
+ </button>
14
+ </mat-card-content>
15
+ </mat-card>
16
+
17
+ <!-- Position -->
18
+ <mat-card class="showcase-card">
19
+ <mat-card-header>
20
+ <mat-card-title>Position</mat-card-title>
21
+ <mat-card-subtitle>Explicitly set tooltip position</mat-card-subtitle>
22
+ </mat-card-header>
23
+ <mat-card-content class="showcase-grid" style="display: flex; gap: 16px; flex-wrap: wrap;">
24
+ <button mat-button matTooltip="Positioned above" matTooltipPosition="above">Above</button>
25
+ <button mat-button matTooltip="Positioned below" matTooltipPosition="below">Below</button>
26
+ <button mat-button matTooltip="Positioned left" matTooltipPosition="left">Left</button>
27
+ <button mat-button matTooltip="Positioned right" matTooltipPosition="right">Right</button>
28
+ </mat-card-content>
29
+ </mat-card>
30
+
31
+ <!-- Delay -->
32
+ <mat-card class="showcase-card">
33
+ <mat-card-header>
34
+ <mat-card-title>Delay</mat-card-title>
35
+ <mat-card-subtitle>Show and hide delays (ms)</mat-card-subtitle>
36
+ </mat-card-header>
37
+ <mat-card-content class="showcase-grid">
38
+ <button mat-flat-button color="accent"
39
+ matTooltip="I take 1s to appear and 2s to disappear"
40
+ [matTooltipShowDelay]="1000"
41
+ [matTooltipHideDelay]="2000">
42
+ Delayed Tooltip (Show: 1s, Hide: 2s)
43
+ </button>
44
+ </mat-card-content>
45
+ </mat-card>
46
+
47
+ <!-- Custom Class -->
48
+ <mat-card class="showcase-card">
49
+ <mat-card-header>
50
+ <mat-card-title>Custom Class</mat-card-title>
51
+ <mat-card-subtitle>Apply custom styles using matTooltipClass</mat-card-subtitle>
52
+ </mat-card-header>
53
+ <mat-card-content class="showcase-grid">
54
+ <button mat-button matTooltip="Custom styled tooltip" matTooltipClass="my-custom-tooltip">
55
+ Hover for custom style
56
+ </button>
57
+ </mat-card-content>
58
+ </mat-card>
59
+
60
+ <!-- Disabled State -->
61
+ <mat-card class="showcase-card">
62
+ <mat-card-header>
63
+ <mat-card-title>Disabled State</mat-card-title>
64
+ <mat-card-subtitle>Conditionally disable tooltip</mat-card-subtitle>
65
+ </mat-card-header>
66
+ <mat-card-content class="showcase-grid" style="flex-direction: column; align-items: flex-start;">
67
+ <button mat-flat-button color="primary"
68
+ [matTooltip]="'I am active tooltip'"
69
+ [matTooltipDisabled]="isTooltipDisabled">
70
+ Tooltip Target
71
+ </button>
72
+ <br>
73
+ <button mat-button (click)="toggleTooltip()">
74
+ Toggle Disabled (Current: {{ isTooltipDisabled }})
75
+ </button>
76
+ </mat-card-content>
77
+ </mat-card>
78
+
79
+ </div>
80
+ </app-page>
@@ -0,0 +1,30 @@
1
+ .showcase-container {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 24px;
5
+ max-width: 1000px;
6
+ margin: 0 auto;
7
+ }
8
+
9
+ .showcase-card {
10
+ margin-bottom: 8px;
11
+ }
12
+
13
+ .showcase-grid {
14
+ display: flex;
15
+ flex-direction: row;
16
+ gap: 16px;
17
+ padding: 16px;
18
+ align-items: center;
19
+ flex-wrap: wrap;
20
+ }
21
+
22
+ // Custom tooltip class definition (requires ViewEncapsulation.None or global styles)
23
+ // We define it here assuming ViewEncapsulation.None is used or it's placed in a style block that bypasses encapsulation.
24
+ :host ::ng-deep .my-custom-tooltip .mat-mdc-tooltip-surface {
25
+ background-color: var(--mat-sys-tertiary);
26
+ color: var(--mat-sys-on-tertiary);
27
+ border-radius: 8px;
28
+ font-size: 14px;
29
+ padding: 8px 12px;
30
+ }
@@ -0,0 +1,27 @@
1
+ import { Component } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { MatCardModule } from '@angular/material/card';
4
+ import { MatTooltipModule } from '@angular/material/tooltip';
5
+ import { MatButtonModule } from '@angular/material/button';
6
+ import { PageComponent } from '../../components/page/page';
7
+
8
+ @Component({
9
+ selector: 'app-tooltip-demo',
10
+ standalone: true,
11
+ imports: [
12
+ CommonModule,
13
+ MatCardModule,
14
+ MatTooltipModule,
15
+ MatButtonModule,
16
+ PageComponent
17
+ ],
18
+ templateUrl: './tooltip-demo.html',
19
+ styleUrls: ['./tooltip-demo.scss']
20
+ })
21
+ export class TooltipDemoComponent {
22
+ isTooltipDisabled = false;
23
+
24
+ toggleTooltip() {
25
+ this.isTooltipDisabled = !this.isTooltipDisabled;
26
+ }
27
+ }
@@ -0,0 +1,23 @@
1
+ <app-page title="Typography Showcase">
2
+ <div class="showcase-container default-container-padding">
3
+ <mat-card class="showcase-card" *ngFor="let group of typographyGroups">
4
+ <mat-card-header>
5
+ <mat-card-title>{{ group.name }}</mat-card-title>
6
+ <mat-card-subtitle>{{ group.description }}</mat-card-subtitle>
7
+ </mat-card-header>
8
+ <mat-card-content>
9
+ <div class="typography-list">
10
+ <div class="typography-item" *ngFor="let item of group.classes">
11
+ <div class="item-info">
12
+ <span class="item-label">{{ item.label }}</span>
13
+ <span class="item-class"><code>.{{ item.class }}</code></span>
14
+ </div>
15
+ <div class="item-sample" [ngClass]="item.class">
16
+ The quick brown fox jumps over the lazy dog.
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </mat-card-content>
21
+ </mat-card>
22
+ </div>
23
+ </app-page>