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.
- package/.agents/skills/charts/SKILL.MD +103 -0
- package/.agents/skills/creating-common-components/SKILL.MD +121 -0
- package/.agents/skills/creating-pages/SKILL.MD +205 -0
- package/.agents/skills/sidebar/SKILL.MD +63 -0
- package/.agents/skills/workflow-graph/SKILL.MD +160 -0
- package/.dockerignore +4 -0
- package/.editorconfig +17 -0
- package/.prettierrc +12 -0
- package/Dockerfile +14 -0
- package/PUBLISH_GUIDE.md +33 -0
- package/README.md +48 -0
- package/angular.json +79 -0
- package/deploy.sh +47 -0
- package/nginx.conf +15 -0
- package/package.json +48 -0
- package/public/favicon.ico +0 -0
- package/public/google-cloud-combined.svg +1 -0
- package/publish.sh +14 -0
- package/src/_variables.scss +183 -0
- package/src/app/app.config.ts +19 -0
- package/src/app/app.html +1 -0
- package/src/app/app.routes.ts +65 -0
- package/src/app/app.scss +0 -0
- package/src/app/app.spec.ts +23 -0
- package/src/app/app.ts +12 -0
- package/src/app/auth/auth.guard.ts +7 -0
- package/src/app/auth/auth.service.ts +50 -0
- package/src/app/components/page/page.html +20 -0
- package/src/app/components/page/page.scss +41 -0
- package/src/app/components/page/page.ts +15 -0
- package/src/app/dashboard/dashboard.html +287 -0
- package/src/app/dashboard/dashboard.scss +196 -0
- package/src/app/dashboard/dashboard.ts +24 -0
- package/src/app/demo-components/buttons/buttons-demo.html +92 -0
- package/src/app/demo-components/buttons/buttons-demo.scss +38 -0
- package/src/app/demo-components/buttons/buttons-demo.ts +23 -0
- package/src/app/demo-components/card/card-demo.html +52 -0
- package/src/app/demo-components/card/card-demo.scss +47 -0
- package/src/app/demo-components/card/card-demo.ts +21 -0
- package/src/app/demo-components/charts/charts-demo.html +88 -0
- package/src/app/demo-components/charts/charts-demo.scss +50 -0
- package/src/app/demo-components/charts/charts-demo.ts +201 -0
- package/src/app/demo-components/chips/chips-demo.html +87 -0
- package/src/app/demo-components/chips/chips-demo.scss +6 -0
- package/src/app/demo-components/chips/chips-demo.ts +57 -0
- package/src/app/demo-components/code-snippet/code-snippet-demo.html +52 -0
- package/src/app/demo-components/code-snippet/code-snippet-demo.scss +20 -0
- package/src/app/demo-components/code-snippet/code-snippet-demo.ts +31 -0
- package/src/app/demo-components/dialog/dialog-demo.html +47 -0
- package/src/app/demo-components/dialog/dialog-demo.ts +90 -0
- package/src/app/demo-components/dialog/dialog-examples.ts +126 -0
- package/src/app/demo-components/expand-button/expand-button-demo.html +28 -0
- package/src/app/demo-components/expand-button/expand-button-demo.scss +45 -0
- package/src/app/demo-components/expand-button/expand-button-demo.ts +28 -0
- package/src/app/demo-components/expansion/expansion-demo.html +105 -0
- package/src/app/demo-components/expansion/expansion-demo.scss +11 -0
- package/src/app/demo-components/expansion/expansion-demo.ts +49 -0
- package/src/app/demo-components/forms/forms-demo.html +114 -0
- package/src/app/demo-components/forms/forms-demo.scss +43 -0
- package/src/app/demo-components/forms/forms-demo.ts +57 -0
- package/src/app/demo-components/message/message-demo.html +47 -0
- package/src/app/demo-components/message/message-demo.ts +33 -0
- package/src/app/demo-components/message/message.html +15 -0
- package/src/app/demo-components/message/message.scss +115 -0
- package/src/app/demo-components/message/message.ts +39 -0
- package/src/app/demo-components/sidebar/sidebar-demo.html +46 -0
- package/src/app/demo-components/sidebar/sidebar-demo.scss +47 -0
- package/src/app/demo-components/sidebar/sidebar-demo.ts +27 -0
- package/src/app/demo-components/sidebar/sidebar.html +15 -0
- package/src/app/demo-components/sidebar/sidebar.scss +25 -0
- package/src/app/demo-components/sidebar/sidebar.ts +87 -0
- package/src/app/demo-components/slide-toggle/slide-toggle-demo.html +110 -0
- package/src/app/demo-components/slide-toggle/slide-toggle-demo.scss +45 -0
- package/src/app/demo-components/slide-toggle/slide-toggle-demo.ts +39 -0
- package/src/app/demo-components/stepper/stepper-demo.html +99 -0
- package/src/app/demo-components/stepper/stepper-demo.ts +84 -0
- package/src/app/demo-components/tables/clean_tables_scss.py +16 -0
- package/src/app/demo-components/tables/tables-demo.html +64 -0
- package/src/app/demo-components/tables/tables-demo.scss +18 -0
- package/src/app/demo-components/tables/tables-demo.ts +89 -0
- package/src/app/demo-components/tabs/tabs-demo.html +168 -0
- package/src/app/demo-components/tabs/tabs-demo.scss +22 -0
- package/src/app/demo-components/tabs/tabs-demo.ts +76 -0
- package/src/app/demo-components/toolbars/toolbars-demo.html +50 -0
- package/src/app/demo-components/toolbars/toolbars-demo.scss +29 -0
- package/src/app/demo-components/toolbars/toolbars-demo.ts +25 -0
- package/src/app/demo-components/tooltip/tooltip-demo.html +80 -0
- package/src/app/demo-components/tooltip/tooltip-demo.scss +30 -0
- package/src/app/demo-components/tooltip/tooltip-demo.ts +27 -0
- package/src/app/demo-components/typography/typography-demo.html +23 -0
- package/src/app/demo-components/typography/typography-demo.scss +49 -0
- package/src/app/demo-components/typography/typography-demo.ts +72 -0
- package/src/app/demo-components/workflow-graph/workflow-graph-demo.html +25 -0
- package/src/app/demo-components/workflow-graph/workflow-graph-demo.scss +48 -0
- package/src/app/demo-components/workflow-graph/workflow-graph-demo.ts +133 -0
- package/src/app/layout/layout.html +12 -0
- package/src/app/layout/layout.scss +21 -0
- package/src/app/layout/layout.ts +19 -0
- package/src/app/layout/side-menu/side-menu.html +32 -0
- package/src/app/layout/side-menu/side-menu.scss +52 -0
- package/src/app/layout/side-menu/side-menu.ts +70 -0
- package/src/app/layout/top-action-bar/top-action-bar.html +41 -0
- package/src/app/layout/top-action-bar/top-action-bar.scss +98 -0
- package/src/app/layout/top-action-bar/top-action-bar.ts +68 -0
- package/src/app/page-templates/complex-form/complex-form.html +103 -0
- package/src/app/page-templates/complex-form/complex-form.scss +110 -0
- package/src/app/page-templates/complex-form/complex-form.ts +66 -0
- package/src/app/page-templates/firewall-add/firewall-add.html +78 -0
- package/src/app/page-templates/firewall-add/firewall-add.scss +1 -0
- package/src/app/page-templates/firewall-add/firewall-add.ts +94 -0
- package/src/app/page-templates/firewall-details/firewall-details.html +115 -0
- package/src/app/page-templates/firewall-details/firewall-details.scss +21 -0
- package/src/app/page-templates/firewall-details/firewall-details.ts +91 -0
- package/src/app/page-templates/firewall-list/firewall-list.html +99 -0
- package/src/app/page-templates/firewall-list/firewall-list.scss +21 -0
- package/src/app/page-templates/firewall-list/firewall-list.ts +85 -0
- package/src/app/page-templates/firewall.service.ts +84 -0
- package/src/app/services/project.service.ts +24 -0
- package/src/index.html +17 -0
- package/src/main.ts +6 -0
- package/src/styles.scss +739 -0
- package/start_server.sh +4 -0
- package/tsconfig.app.json +15 -0
- package/tsconfig.json +33 -0
- package/tsconfig.spec.json +15 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
<app-page title="Expansion Panel Showcase">
|
|
2
|
+
<div class="default-container-padding" style="display: flex; flex-direction: column; gap: 24px;">
|
|
3
|
+
|
|
4
|
+
<!-- Basic Expansion Panel -->
|
|
5
|
+
<mat-card>
|
|
6
|
+
<mat-card-header>
|
|
7
|
+
<mat-card-title>Basic Expansion Panel</mat-card-title>
|
|
8
|
+
<mat-card-subtitle>Simple expand/collapse with header labels</mat-card-subtitle>
|
|
9
|
+
</mat-card-header>
|
|
10
|
+
<mat-card-content style="padding: 16px;">
|
|
11
|
+
<mat-expansion-panel (opened)="panelOpenState = true"
|
|
12
|
+
(closed)="panelOpenState = false">
|
|
13
|
+
<mat-expansion-panel-header>
|
|
14
|
+
<mat-panel-title>
|
|
15
|
+
Personal data
|
|
16
|
+
</mat-panel-title>
|
|
17
|
+
<mat-panel-description>
|
|
18
|
+
Currently I am {{panelOpenState ? 'open' : 'closed'}}
|
|
19
|
+
</mat-panel-description>
|
|
20
|
+
</mat-expansion-panel-header>
|
|
21
|
+
<p>This is the expansion panel content. You can put any HTML here.</p>
|
|
22
|
+
</mat-expansion-panel>
|
|
23
|
+
</mat-card-content>
|
|
24
|
+
</mat-card>
|
|
25
|
+
|
|
26
|
+
<!-- Accordion with Action Buttons -->
|
|
27
|
+
<mat-card>
|
|
28
|
+
<mat-card-header>
|
|
29
|
+
<mat-card-title>Accordion with Action Buttons</mat-card-title>
|
|
30
|
+
<mat-card-subtitle>Using action rows for navigation</mat-card-subtitle>
|
|
31
|
+
</mat-card-header>
|
|
32
|
+
<mat-card-content style="padding: 16px;">
|
|
33
|
+
<mat-accordion class="example-headers-align">
|
|
34
|
+
<mat-expansion-panel [expanded]="step === 0" (opened)="setStep(0)" hideToggle>
|
|
35
|
+
<mat-expansion-panel-header>
|
|
36
|
+
<mat-panel-title>
|
|
37
|
+
Personal info
|
|
38
|
+
</mat-panel-title>
|
|
39
|
+
<mat-panel-description>
|
|
40
|
+
Type your name and age
|
|
41
|
+
<mat-icon>account_circle</mat-icon>
|
|
42
|
+
</mat-panel-description>
|
|
43
|
+
</mat-expansion-panel-header>
|
|
44
|
+
|
|
45
|
+
<mat-form-field appearance="outline" style="width: 100%;">
|
|
46
|
+
<mat-label>First name</mat-label>
|
|
47
|
+
<input matInput>
|
|
48
|
+
</mat-form-field>
|
|
49
|
+
|
|
50
|
+
<mat-action-row>
|
|
51
|
+
<button mat-button color="primary" (click)="nextStep()">Next</button>
|
|
52
|
+
</mat-action-row>
|
|
53
|
+
</mat-expansion-panel>
|
|
54
|
+
|
|
55
|
+
<mat-expansion-panel [expanded]="step === 1" (opened)="setStep(1)" hideToggle>
|
|
56
|
+
<mat-expansion-panel-header>
|
|
57
|
+
<mat-panel-title>
|
|
58
|
+
Destination
|
|
59
|
+
</mat-panel-title>
|
|
60
|
+
<mat-panel-description>
|
|
61
|
+
Type the country name
|
|
62
|
+
<mat-icon>map</mat-icon>
|
|
63
|
+
</mat-panel-description>
|
|
64
|
+
</mat-expansion-panel-header>
|
|
65
|
+
|
|
66
|
+
<mat-form-field appearance="outline" style="width: 100%;">
|
|
67
|
+
<mat-label>Country</mat-label>
|
|
68
|
+
<input matInput>
|
|
69
|
+
</mat-form-field>
|
|
70
|
+
|
|
71
|
+
<mat-action-row>
|
|
72
|
+
<button mat-button color="warn" (click)="prevStep()">Previous</button>
|
|
73
|
+
<button mat-button color="primary" (click)="nextStep()">Next</button>
|
|
74
|
+
</mat-action-row>
|
|
75
|
+
</mat-expansion-panel>
|
|
76
|
+
|
|
77
|
+
<mat-expansion-panel [expanded]="step === 2" (opened)="setStep(2)" hideToggle>
|
|
78
|
+
<mat-expansion-panel-header>
|
|
79
|
+
<mat-panel-title>
|
|
80
|
+
Day of the trip
|
|
81
|
+
</mat-panel-title>
|
|
82
|
+
<mat-panel-description>
|
|
83
|
+
Inform the date of the trip
|
|
84
|
+
<mat-icon>date_range</mat-icon>
|
|
85
|
+
</mat-panel-description>
|
|
86
|
+
</mat-expansion-panel-header>
|
|
87
|
+
|
|
88
|
+
<mat-form-field appearance="outline" style="width: 100%;">
|
|
89
|
+
<mat-label>Date</mat-label>
|
|
90
|
+
<input matInput [matDatepicker]="picker">
|
|
91
|
+
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
|
|
92
|
+
<mat-datepicker #picker></mat-datepicker>
|
|
93
|
+
</mat-form-field>
|
|
94
|
+
|
|
95
|
+
<mat-action-row>
|
|
96
|
+
<button mat-button color="warn" (click)="prevStep()">Previous</button>
|
|
97
|
+
<button mat-button color="primary" (click)="setStep(0)">End</button>
|
|
98
|
+
</mat-action-row>
|
|
99
|
+
</mat-expansion-panel>
|
|
100
|
+
</mat-accordion>
|
|
101
|
+
</mat-card-content>
|
|
102
|
+
</mat-card>
|
|
103
|
+
|
|
104
|
+
</div>
|
|
105
|
+
</app-page>
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { PageComponent } from '../../components/page/page';
|
|
4
|
+
import { MatCardModule } from '@angular/material/card';
|
|
5
|
+
import { MatExpansionModule } from '@angular/material/expansion';
|
|
6
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
7
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
8
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
9
|
+
import { MatInputModule } from '@angular/material/input';
|
|
10
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
11
|
+
import { MatNativeDateModule } from '@angular/material/core';
|
|
12
|
+
import { FormsModule } from '@angular/forms';
|
|
13
|
+
|
|
14
|
+
@Component({
|
|
15
|
+
selector: 'app-expansion-demo',
|
|
16
|
+
standalone: true,
|
|
17
|
+
imports: [
|
|
18
|
+
CommonModule,
|
|
19
|
+
PageComponent,
|
|
20
|
+
MatCardModule,
|
|
21
|
+
MatExpansionModule,
|
|
22
|
+
MatIconModule,
|
|
23
|
+
MatButtonModule,
|
|
24
|
+
MatFormFieldModule,
|
|
25
|
+
MatInputModule,
|
|
26
|
+
MatDatepickerModule,
|
|
27
|
+
MatNativeDateModule,
|
|
28
|
+
FormsModule
|
|
29
|
+
],
|
|
30
|
+
templateUrl: './expansion-demo.html',
|
|
31
|
+
styleUrl: './expansion-demo.scss'
|
|
32
|
+
})
|
|
33
|
+
export class ExpansionDemoComponent {
|
|
34
|
+
panelOpenState = false;
|
|
35
|
+
|
|
36
|
+
step = 0;
|
|
37
|
+
|
|
38
|
+
setStep(index: number) {
|
|
39
|
+
this.step = index;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
nextStep() {
|
|
43
|
+
this.step++;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
prevStep() {
|
|
47
|
+
this.step--;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<app-page title="Forms Demo">
|
|
2
|
+
|
|
3
|
+
<form [formGroup]="form" (ngSubmit)="onSubmit()" class="form-container default-container-padding">
|
|
4
|
+
<p>This is a sample form to demonstrate the use of Material form components.</p>
|
|
5
|
+
<div class="row">
|
|
6
|
+
<mat-form-field appearance="outline">
|
|
7
|
+
<mat-label>First Name</mat-label>
|
|
8
|
+
<input matInput formControlName="firstName" placeholder="John">
|
|
9
|
+
<mat-hint>Letters, numbers and underscores only</mat-hint>
|
|
10
|
+
@if (form.get('firstName')?.hasError('required')) {
|
|
11
|
+
<mat-error>First Name is required</mat-error>
|
|
12
|
+
}
|
|
13
|
+
</mat-form-field>
|
|
14
|
+
|
|
15
|
+
<mat-form-field appearance="outline">
|
|
16
|
+
<mat-label>Last Name</mat-label>
|
|
17
|
+
<input matInput formControlName="lastName" placeholder="Doe">
|
|
18
|
+
@if (form.get('lastName')?.hasError('required')) {
|
|
19
|
+
<mat-error>Last Name is required</mat-error>
|
|
20
|
+
}
|
|
21
|
+
</mat-form-field>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<mat-form-field appearance="outline">
|
|
25
|
+
<mat-label>Email</mat-label>
|
|
26
|
+
<input matInput formControlName="email" type="email" placeholder="john.doe@example.com">
|
|
27
|
+
@if (form.get('email')?.hasError('required')) {
|
|
28
|
+
<mat-error>Email is required</mat-error>
|
|
29
|
+
}
|
|
30
|
+
@if (form.get('email')?.hasError('email')) {
|
|
31
|
+
<mat-error>Invalid email address</mat-error>
|
|
32
|
+
}
|
|
33
|
+
</mat-form-field>
|
|
34
|
+
|
|
35
|
+
<mat-form-field appearance="outline">
|
|
36
|
+
<mat-label>Category</mat-label>
|
|
37
|
+
<mat-select formControlName="category">
|
|
38
|
+
<mat-option value="tech">Technology</mat-option>
|
|
39
|
+
<mat-option value="finance">Finance</mat-option>
|
|
40
|
+
<mat-option value="health">Healthcare</mat-option>
|
|
41
|
+
</mat-select>
|
|
42
|
+
</mat-form-field>
|
|
43
|
+
|
|
44
|
+
<div class="row">
|
|
45
|
+
<mat-form-field appearance="outline">
|
|
46
|
+
<mat-label>Start Date</mat-label>
|
|
47
|
+
<input matInput [matDatepicker]="picker" formControlName="startDate">
|
|
48
|
+
<mat-datepicker-toggle matIconSuffix [for]="picker"></mat-datepicker-toggle>
|
|
49
|
+
<mat-datepicker #picker></mat-datepicker>
|
|
50
|
+
</mat-form-field>
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
<mat-form-field appearance="outline">
|
|
54
|
+
<mat-label>Comments</mat-label>
|
|
55
|
+
<textarea matInput formControlName="comments" placeholder="Enter your comments here..." rows="2"></textarea>
|
|
56
|
+
</mat-form-field>
|
|
57
|
+
|
|
58
|
+
<div class="checkbox-row">
|
|
59
|
+
<mat-checkbox formControlName="notifications">Enable Notifications</mat-checkbox>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<div class="radio-group">
|
|
63
|
+
<label>Priority:</label>
|
|
64
|
+
<mat-radio-group formControlName="priority">
|
|
65
|
+
<mat-radio-button value="low">Low</mat-radio-button>
|
|
66
|
+
<mat-radio-button value="medium">Medium</mat-radio-button>
|
|
67
|
+
<mat-radio-button value="high">High</mat-radio-button>
|
|
68
|
+
</mat-radio-group>
|
|
69
|
+
</div>
|
|
70
|
+
|
|
71
|
+
<h2>More Input Variations</h2>
|
|
72
|
+
<div class="form-container">
|
|
73
|
+
<div class="row">
|
|
74
|
+
<!-- Prefix Icon -->
|
|
75
|
+
<mat-form-field appearance="outline">
|
|
76
|
+
<mat-label>Website</mat-label>
|
|
77
|
+
<mat-icon matPrefix>language</mat-icon>
|
|
78
|
+
<input matInput placeholder="example.com">
|
|
79
|
+
</mat-form-field>
|
|
80
|
+
|
|
81
|
+
<!-- Suffix Icon Button -->
|
|
82
|
+
<mat-form-field appearance="outline">
|
|
83
|
+
<mat-label>Password</mat-label>
|
|
84
|
+
<input matInput [type]="hide ? 'password' : 'text'" placeholder="Enter Password">
|
|
85
|
+
<button type="button" mat-icon-button matSuffix (click)="hide = !hide" [attr.aria-label]="'Hide password'"
|
|
86
|
+
[attr.aria-pressed]="hide">
|
|
87
|
+
<mat-icon>{{hide ? 'visibility_off' : 'visibility'}}</mat-icon>
|
|
88
|
+
</button>
|
|
89
|
+
</mat-form-field>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<div class="row">
|
|
93
|
+
<!-- Prefix Text -->
|
|
94
|
+
<mat-form-field appearance="outline">
|
|
95
|
+
<mat-label>Amount</mat-label>
|
|
96
|
+
<span matPrefix>$ </span>
|
|
97
|
+
<input matInput type="number" placeholder="0.00">
|
|
98
|
+
<span matSuffix>.00</span>
|
|
99
|
+
</mat-form-field>
|
|
100
|
+
|
|
101
|
+
<!-- Hint text -->
|
|
102
|
+
<mat-form-field appearance="outline">
|
|
103
|
+
<mat-label>Username</mat-label>
|
|
104
|
+
<input matInput placeholder="john_doe">
|
|
105
|
+
<mat-hint>Letters, numbers and underscores only</mat-hint>
|
|
106
|
+
</mat-form-field>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
<div class="actions">
|
|
110
|
+
<button mat-flat-button color="primary" type="submit" [disabled]="form.invalid">Submit</button>
|
|
111
|
+
<button mat-button>Cancel</button>
|
|
112
|
+
</div>
|
|
113
|
+
</form>
|
|
114
|
+
</app-page>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
.form-container {
|
|
2
|
+
max-width: 600px;
|
|
3
|
+
|
|
4
|
+
}
|
|
5
|
+
.form-container {
|
|
6
|
+
display: flex;
|
|
7
|
+
flex-direction: column;
|
|
8
|
+
gap: 10px;
|
|
9
|
+
padding-top: 16px;
|
|
10
|
+
}
|
|
11
|
+
.row {
|
|
12
|
+
display: flex;
|
|
13
|
+
gap: 16px;
|
|
14
|
+
@media (max-width: 600px) {
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
mat-form-field {
|
|
19
|
+
width: 100%;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.radio-group {
|
|
23
|
+
display: flex;
|
|
24
|
+
flex-direction: column;
|
|
25
|
+
align-items: flex-start;
|
|
26
|
+
gap: 8px;
|
|
27
|
+
margin: 12px 0;
|
|
28
|
+
|
|
29
|
+
label {
|
|
30
|
+
font: 500 0.875rem/1.25rem "Google Sans",sans-serif;
|
|
31
|
+
color: #5f6368; /* Light slate grey labels setup */
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
mat-radio-group {
|
|
35
|
+
display: flex;
|
|
36
|
+
gap: 16px;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
.actions {
|
|
40
|
+
display: flex;
|
|
41
|
+
justify-content: flex-start;
|
|
42
|
+
margin-top: 16px;
|
|
43
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { FormBuilder, FormGroup, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
4
|
+
import { MatInputModule } from '@angular/material/input';
|
|
5
|
+
import { MatSelectModule } from '@angular/material/select';
|
|
6
|
+
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
7
|
+
import { MatRadioModule } from '@angular/material/radio';
|
|
8
|
+
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
9
|
+
import { MatNativeDateModule } from '@angular/material/core';
|
|
10
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
11
|
+
import { MatCardModule } from '@angular/material/card';
|
|
12
|
+
import { PageComponent } from '../../components/page/page';
|
|
13
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
14
|
+
|
|
15
|
+
@Component({
|
|
16
|
+
selector: 'app-forms-demo',
|
|
17
|
+
standalone: true,
|
|
18
|
+
imports: [
|
|
19
|
+
ReactiveFormsModule,
|
|
20
|
+
MatFormFieldModule,
|
|
21
|
+
MatInputModule,
|
|
22
|
+
MatSelectModule,
|
|
23
|
+
MatCheckboxModule,
|
|
24
|
+
MatRadioModule,
|
|
25
|
+
MatDatepickerModule,
|
|
26
|
+
MatNativeDateModule,
|
|
27
|
+
MatButtonModule,
|
|
28
|
+
MatCardModule,
|
|
29
|
+
PageComponent,
|
|
30
|
+
MatIconModule
|
|
31
|
+
],
|
|
32
|
+
templateUrl: './forms-demo.html',
|
|
33
|
+
styleUrl: './forms-demo.scss'
|
|
34
|
+
})
|
|
35
|
+
export class FormsDemoComponent {
|
|
36
|
+
form: FormGroup;
|
|
37
|
+
hide = true; /* Password visibility toggle */
|
|
38
|
+
|
|
39
|
+
constructor(private fb: FormBuilder) {
|
|
40
|
+
this.form = this.fb.group({
|
|
41
|
+
firstName: ['', Validators.required],
|
|
42
|
+
lastName: ['', Validators.required],
|
|
43
|
+
email: ['', [Validators.required, Validators.email]],
|
|
44
|
+
category: [''],
|
|
45
|
+
notifications: [false],
|
|
46
|
+
priority: ['medium'],
|
|
47
|
+
startDate: [null],
|
|
48
|
+
comments: ['']
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
onSubmit() {
|
|
53
|
+
if (this.form.valid) {
|
|
54
|
+
console.log('Form Submitted', this.form.value);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<app-page title="Message">
|
|
2
|
+
<div class="demo-container default-container-padding">
|
|
3
|
+
|
|
4
|
+
<!-- Basic Demo Section -->
|
|
5
|
+
<div class="example-section">
|
|
6
|
+
<h3>Basic Demo</h3>
|
|
7
|
+
<p>Standard message formats displaying status notifications actions neatness.</p>
|
|
8
|
+
|
|
9
|
+
<app-message type="info">Informational.</app-message>
|
|
10
|
+
<app-message type="assist">Active Assist.</app-message>
|
|
11
|
+
<app-message type="success">Success.</app-message>
|
|
12
|
+
<app-message type="warning">Warning.</app-message>
|
|
13
|
+
<app-message type="error">Error.</app-message>
|
|
14
|
+
<app-message type="destructive">Destructive.</app-message>
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
<!-- Dismiss Demo Section -->
|
|
18
|
+
<div class="example-section">
|
|
19
|
+
<h3>Dismiss Demo</h3>
|
|
20
|
+
<p>Messages configured with user dismissal toggle trigger setups accurately.</p>
|
|
21
|
+
|
|
22
|
+
<app-message type="assist" [dismissible]="true">
|
|
23
|
+
Once fully on GM2 (not in the transitional MD1 to GM2 phase), use `mat-flat-button` and non-primary `mat-stroked-button` inside `cfc-message-actions`.
|
|
24
|
+
</app-message>
|
|
25
|
+
|
|
26
|
+
<app-message type="info" [dismissible]="true">
|
|
27
|
+
Dismissable message text.
|
|
28
|
+
</app-message>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
<!-- Rich Demo Section -->
|
|
32
|
+
<div class="example-section">
|
|
33
|
+
<h3>Rich Demo</h3>
|
|
34
|
+
<p>Messages carrying formatted layouts links anchors and control triggers actions neatly.</p>
|
|
35
|
+
|
|
36
|
+
<app-message type="info">
|
|
37
|
+
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam facilisis ante eget nunc accumsan, sed viverra magna aliquam. <a href="https://google.com" target="_blank">Visit google.com</a>
|
|
38
|
+
|
|
39
|
+
<div actions>
|
|
40
|
+
<button mat-button class="mat-small">Go to link</button>
|
|
41
|
+
<button mat-button class="mat-small">Do primary action</button>
|
|
42
|
+
</div>
|
|
43
|
+
</app-message>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
</div>
|
|
47
|
+
</app-page>
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MessageComponent } from './message';
|
|
4
|
+
import { PageComponent } from '../../components/page/page';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { MatCardModule } from '@angular/material/card';
|
|
7
|
+
|
|
8
|
+
@Component({
|
|
9
|
+
selector: 'app-message-demo',
|
|
10
|
+
standalone: true,
|
|
11
|
+
imports: [CommonModule, MessageComponent, PageComponent, MatButtonModule, MatCardModule],
|
|
12
|
+
templateUrl: './message-demo.html',
|
|
13
|
+
styles: [`
|
|
14
|
+
.demo-container {
|
|
15
|
+
display: flex;
|
|
16
|
+
flex-direction: column;
|
|
17
|
+
gap: 32px;
|
|
18
|
+
padding: 16px;
|
|
19
|
+
}
|
|
20
|
+
.example-section {
|
|
21
|
+
border: 1px solid var(--mat-divider-color, #e0e0e0);
|
|
22
|
+
border-radius: 8px;
|
|
23
|
+
padding: 24px;
|
|
24
|
+
background-color: #fff;
|
|
25
|
+
}
|
|
26
|
+
.example-section h3 {
|
|
27
|
+
margin-top: 0;
|
|
28
|
+
margin-bottom: 24px;
|
|
29
|
+
color: #333;
|
|
30
|
+
}
|
|
31
|
+
`]
|
|
32
|
+
})
|
|
33
|
+
export class MessageDemoComponent {}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<div class="message-container" [ngClass]="type" *ngIf="!isDismissed">
|
|
2
|
+
<div class="message-content">
|
|
3
|
+
<mat-icon class="message-icon">{{ iconName }}</mat-icon>
|
|
4
|
+
<div class="message-body">
|
|
5
|
+
<ng-content></ng-content>
|
|
6
|
+
<div class="message-actions-rich">
|
|
7
|
+
<ng-content select="[actions]"></ng-content>
|
|
8
|
+
</div>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<div class="message-actions" *ngIf="dismissible">
|
|
13
|
+
<button mat-button class="dismiss-btn" (click)="onDismiss()">Dismiss</button>
|
|
14
|
+
</div>
|
|
15
|
+
</div>
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
@use '@angular/material' as mat;
|
|
2
|
+
@use '../../../_variables' as theme;
|
|
3
|
+
|
|
4
|
+
.message-container {
|
|
5
|
+
display: flex;
|
|
6
|
+
align-items: center;
|
|
7
|
+
justify-content: space-between;
|
|
8
|
+
padding: theme.px-to-rem(12) theme.px-to-rem(16);
|
|
9
|
+
border-radius: 4px;
|
|
10
|
+
width: 100%;
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
margin-bottom: theme.px-to-rem(16);
|
|
13
|
+
font-family: 'Roboto', sans-serif;
|
|
14
|
+
|
|
15
|
+
.message-content {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
gap: theme.px-to-rem(16);
|
|
19
|
+
flex: 1;
|
|
20
|
+
|
|
21
|
+
.message-icon {
|
|
22
|
+
font-size: theme.px-to-rem(24);
|
|
23
|
+
width: theme.px-to-rem(24);
|
|
24
|
+
height: theme.px-to-rem(24);
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.message-body {
|
|
31
|
+
font-size: theme.px-to-rem(14);
|
|
32
|
+
line-height: theme.px-to-rem(20);
|
|
33
|
+
color: theme.$grey800;
|
|
34
|
+
flex: 1;
|
|
35
|
+
|
|
36
|
+
::ng-deep a {
|
|
37
|
+
color: theme.$blue600;
|
|
38
|
+
text-decoration: none;
|
|
39
|
+
&:hover {
|
|
40
|
+
text-decoration: underline;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.message-actions {
|
|
47
|
+
margin-left: theme.px-to-rem(16);
|
|
48
|
+
|
|
49
|
+
.dismiss-btn {
|
|
50
|
+
color: theme.$grey800;
|
|
51
|
+
border: 1px solid theme.$grey300;
|
|
52
|
+
border-radius: 4px;
|
|
53
|
+
padding: 0 theme.px-to-rem(16);
|
|
54
|
+
height: theme.px-to-rem(32);
|
|
55
|
+
line-height: theme.px-to-rem(32);
|
|
56
|
+
font-size: theme.px-to-rem(13);
|
|
57
|
+
font-weight: 500;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Type Variations
|
|
62
|
+
&.info {
|
|
63
|
+
background-color: theme.$grey100;
|
|
64
|
+
.message-icon { color: theme.$grey600; }
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
&.assist {
|
|
68
|
+
background-color: theme.$blue50;
|
|
69
|
+
.message-icon { color: theme.$blue600; }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
&.success {
|
|
73
|
+
background-color: theme.$green50;
|
|
74
|
+
.message-icon { color: theme.$green700; }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
&.warning {
|
|
78
|
+
background-color: theme.$yellow50;
|
|
79
|
+
.message-icon { color: theme.$yellow700; }
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
&.error {
|
|
83
|
+
background-color: theme.$red50;
|
|
84
|
+
.message-icon { color: theme.$red700; }
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
&.destructive {
|
|
88
|
+
background-color: theme.$red600;
|
|
89
|
+
.message-content {
|
|
90
|
+
.message-icon { color: theme.$white; }
|
|
91
|
+
.message-body { color: theme.$white; }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Support for rich templates Actions
|
|
97
|
+
.message-actions-rich {
|
|
98
|
+
::ng-deep [actions] {
|
|
99
|
+
display: flex;
|
|
100
|
+
gap: theme.px-to-rem(8);
|
|
101
|
+
margin-top: theme.px-to-rem(12);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
::ng-deep button {
|
|
105
|
+
border: 1px solid theme.$grey300;
|
|
106
|
+
border-radius: 4px;
|
|
107
|
+
height: theme.px-to-rem(32);
|
|
108
|
+
padding: 0 theme.px-to-rem(12);
|
|
109
|
+
font-size: theme.px-to-rem(13);
|
|
110
|
+
color: theme.$grey800;
|
|
111
|
+
background-color: #fff;
|
|
112
|
+
cursor: pointer;
|
|
113
|
+
&:hover { background-color: theme.$grey50; }
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
4
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
5
|
+
|
|
6
|
+
export type MessageType = 'info' | 'success' | 'warning' | 'error' | 'destructive' | 'assist';
|
|
7
|
+
|
|
8
|
+
@Component({
|
|
9
|
+
selector: 'app-message',
|
|
10
|
+
standalone: true,
|
|
11
|
+
imports: [CommonModule, MatIconModule, MatButtonModule],
|
|
12
|
+
templateUrl: './message.html',
|
|
13
|
+
styleUrl: './message.scss'
|
|
14
|
+
})
|
|
15
|
+
export class MessageComponent {
|
|
16
|
+
@Input() type: MessageType = 'info';
|
|
17
|
+
@Input() dismissible: boolean = false;
|
|
18
|
+
|
|
19
|
+
@Output() dismissed = new EventEmitter<void>();
|
|
20
|
+
|
|
21
|
+
isDismissed: boolean = false;
|
|
22
|
+
|
|
23
|
+
get iconName(): string {
|
|
24
|
+
switch (this.type) {
|
|
25
|
+
case 'success': return 'check_circle';
|
|
26
|
+
case 'warning': return 'warning';
|
|
27
|
+
case 'error': return 'error';
|
|
28
|
+
case 'destructive': return 'error';
|
|
29
|
+
case 'assist': return 'lightbulb';
|
|
30
|
+
case 'info':
|
|
31
|
+
default: return 'info';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
onDismiss(): void {
|
|
36
|
+
this.isDismissed = true;
|
|
37
|
+
this.dismissed.emit();
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
<app-page title="Sidebar Drawer Showcase">
|
|
2
|
+
<div class="demo-actions default-container-padding">
|
|
3
|
+
<button mat-flat-button color="primary" (click)="toggleSidebar()">
|
|
4
|
+
Open Simple Sidebar
|
|
5
|
+
</button>
|
|
6
|
+
|
|
7
|
+
<button mat-stroked-button color="accent" (click)="toggleSidebarWithContent()">
|
|
8
|
+
Open Summary Sidebar
|
|
9
|
+
</button>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
<!-- Sidebar 1: Simple -->
|
|
13
|
+
<app-sidebar [isOpen]="isSidebarOpen" title="Quick Info" (close)="isSidebarOpen = false">
|
|
14
|
+
<p>This is a basic sidebar panel drawer layout wrapper projection with content projection projection overlay framing.</p>
|
|
15
|
+
</app-sidebar>
|
|
16
|
+
|
|
17
|
+
<!-- Sidebar 2: With Content Details -->
|
|
18
|
+
<app-sidebar [isOpen]="isSidebarWithContentOpen" title="Resource Properties" (close)="isSidebarWithContentOpen = false">
|
|
19
|
+
<div class="property-list">
|
|
20
|
+
<div class="property-item">
|
|
21
|
+
<span class="label">Name</span>
|
|
22
|
+
<span class="value">app-server-01</span>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="property-item">
|
|
25
|
+
<span class="label">Type</span>
|
|
26
|
+
<span class="value">Compute Instance</span>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="property-item">
|
|
29
|
+
<span class="label">Network</span>
|
|
30
|
+
<span class="value">vpc-secure-01</span>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="property-item">
|
|
33
|
+
<span class="label">Status</span>
|
|
34
|
+
<span class="value status-active">Active</span>
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<mat-divider style="margin: 24px 0;"></mat-divider>
|
|
39
|
+
|
|
40
|
+
<h4>Performance Metrics</h4>
|
|
41
|
+
<div class="metrics-placeholder">
|
|
42
|
+
<p>CPU Utilization: 45%</p>
|
|
43
|
+
<p>Memory Usage: 2.1 GB / 4.0 GB</p>
|
|
44
|
+
</div>
|
|
45
|
+
</app-sidebar>
|
|
46
|
+
</app-page>
|