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,50 @@
|
|
|
1
|
+
import { Injectable, inject, signal } from '@angular/core';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
|
|
5
|
+
export interface User {
|
|
6
|
+
name: string;
|
|
7
|
+
picture: string;
|
|
8
|
+
email: string;
|
|
9
|
+
id: string;
|
|
10
|
+
[key: string]: any;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@Injectable({
|
|
15
|
+
providedIn: 'root'
|
|
16
|
+
})
|
|
17
|
+
export class AuthService {
|
|
18
|
+
private http = inject(HttpClient);
|
|
19
|
+
private router = inject(Router);
|
|
20
|
+
|
|
21
|
+
user = signal<User | null>({
|
|
22
|
+
name: 'John Doe',
|
|
23
|
+
picture: '',
|
|
24
|
+
email: 'john.doe@example.com',
|
|
25
|
+
id: '12345'
|
|
26
|
+
});
|
|
27
|
+
accessToken = signal<string | null>('mock-token-12345');
|
|
28
|
+
|
|
29
|
+
private initPromise: Promise<void>;
|
|
30
|
+
|
|
31
|
+
constructor() {
|
|
32
|
+
this.initPromise = Promise.resolve();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
isReady(): Promise<void> {
|
|
36
|
+
return this.initPromise;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
login() {
|
|
40
|
+
// No-op in mock setup
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
logout() {
|
|
44
|
+
// No-op in mock setup
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
isAuthenticated(): boolean {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
<div class="page-container">
|
|
2
|
+
<mat-toolbar class="page-header">
|
|
3
|
+
<div class="back-section">
|
|
4
|
+
<ng-content select="[back-button]"></ng-content>
|
|
5
|
+
</div>
|
|
6
|
+
<div class="title-section">
|
|
7
|
+
<span class="page-title">{{ title }}</span>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="left-actions-section">
|
|
10
|
+
<ng-content select="[left-actions]"></ng-content>
|
|
11
|
+
</div>
|
|
12
|
+
<span class="toolbar-spacer"></span>
|
|
13
|
+
<div class="actions-section">
|
|
14
|
+
<ng-content select="[actions]"></ng-content>
|
|
15
|
+
</div>
|
|
16
|
+
</mat-toolbar>
|
|
17
|
+
<div class="page-content">
|
|
18
|
+
<ng-content></ng-content>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
.page-container {
|
|
2
|
+
display: flex;
|
|
3
|
+
flex-direction: column;
|
|
4
|
+
height: 100%;
|
|
5
|
+
width: 100%;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.page-header {
|
|
9
|
+
padding: 0 24px;
|
|
10
|
+
background-color: transparent;
|
|
11
|
+
display: flex !important;
|
|
12
|
+
align-items: center;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.back-section {
|
|
16
|
+
display: flex;
|
|
17
|
+
margin-right: 8px;
|
|
18
|
+
align-items: center;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.left-actions-section {
|
|
22
|
+
display: flex;
|
|
23
|
+
margin-left: 16px;
|
|
24
|
+
gap: 8px;
|
|
25
|
+
align-items: center;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.toolbar-spacer {
|
|
29
|
+
flex: 1 1 auto;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.actions-section {
|
|
33
|
+
display: flex;
|
|
34
|
+
gap: 12px;
|
|
35
|
+
align-items: center;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.page-content {
|
|
39
|
+
flex: 1;
|
|
40
|
+
overflow: auto;
|
|
41
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
4
|
+
import { MatToolbarModule } from '@angular/material/toolbar';
|
|
5
|
+
|
|
6
|
+
@Component({
|
|
7
|
+
selector: 'app-page',
|
|
8
|
+
standalone: true,
|
|
9
|
+
imports: [CommonModule, MatDividerModule, MatToolbarModule],
|
|
10
|
+
templateUrl: './page.html',
|
|
11
|
+
styleUrls: ['./page.scss']
|
|
12
|
+
})
|
|
13
|
+
export class PageComponent {
|
|
14
|
+
@Input() title: string = '';
|
|
15
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
<app-page title="Workspace Overview">
|
|
2
|
+
<div class="dashboard-container">
|
|
3
|
+
<div class="info-grid">
|
|
4
|
+
<mat-card class="dashboard-card info-card">
|
|
5
|
+
<mat-card-header>
|
|
6
|
+
<mat-icon mat-card-avatar class="info-icon">folder</mat-icon>
|
|
7
|
+
<mat-card-title>Page Templates</mat-card-title>
|
|
8
|
+
<mat-card-subtitle>Located in standard templates directory</mat-card-subtitle>
|
|
9
|
+
</mat-card-header>
|
|
10
|
+
<mat-card-content>
|
|
11
|
+
<p>Pre-built page layouts and complex UI patterns are located in:</p>
|
|
12
|
+
<code class="path-block">src/app/page-templates/</code>
|
|
13
|
+
</mat-card-content>
|
|
14
|
+
</mat-card>
|
|
15
|
+
|
|
16
|
+
<mat-card class="dashboard-card info-card">
|
|
17
|
+
<mat-card-header>
|
|
18
|
+
<mat-icon mat-card-avatar class="info-icon">widgets</mat-icon>
|
|
19
|
+
<mat-card-title>Components</mat-card-title>
|
|
20
|
+
<mat-card-subtitle>Reusable UI building blocks</mat-card-subtitle>
|
|
21
|
+
</mat-card-header>
|
|
22
|
+
<mat-card-content>
|
|
23
|
+
<p>Standard UI elements like forms, tables, and buttons are located in:</p>
|
|
24
|
+
<code class="path-block">src/app/demo-components/</code>
|
|
25
|
+
</mat-card-content>
|
|
26
|
+
</mat-card>
|
|
27
|
+
|
|
28
|
+
<mat-card class="dashboard-card info-card">
|
|
29
|
+
<mat-card-header>
|
|
30
|
+
<mat-icon mat-card-avatar class="info-icon">smart_toy</mat-icon>
|
|
31
|
+
<mat-card-title>LLM Context</mat-card-title>
|
|
32
|
+
<mat-card-subtitle>Repository agent guidelines</mat-card-subtitle>
|
|
33
|
+
</mat-card-header>
|
|
34
|
+
<mat-card-content>
|
|
35
|
+
<p>Knowledge graph and automated agent context is located in the root:</p>
|
|
36
|
+
<code class="path-block">.agents/</code>
|
|
37
|
+
</mat-card-content>
|
|
38
|
+
</mat-card>
|
|
39
|
+
</div>
|
|
40
|
+
|
|
41
|
+
<mat-card class="dashboard-card welcome-card">
|
|
42
|
+
<mat-card-header>
|
|
43
|
+
<mat-icon mat-card-avatar class="info-icon">rocket_launch</mat-icon>
|
|
44
|
+
<mat-card-title>Quick Start: How to Create your own Prototype</mat-card-title>
|
|
45
|
+
<mat-card-subtitle>Bootstrap your own application</mat-card-subtitle>
|
|
46
|
+
</mat-card-header>
|
|
47
|
+
<mat-card-content>
|
|
48
|
+
<div class="stepper-container">
|
|
49
|
+
<div class="stepper-item active" (click)="scrollToSection('prerequisites')">
|
|
50
|
+
<div class="stepper-circle">1</div>
|
|
51
|
+
<div class="stepper-label">Prerequisites</div>
|
|
52
|
+
</div>
|
|
53
|
+
<div class="stepper-line"></div>
|
|
54
|
+
<div class="stepper-item" (click)="scrollToSection('git-config')">
|
|
55
|
+
<div class="stepper-circle">2</div>
|
|
56
|
+
<div class="stepper-label">Git & Clone</div>
|
|
57
|
+
</div>
|
|
58
|
+
<div class="stepper-line"></div>
|
|
59
|
+
<div class="stepper-item" (click)="scrollToSection('view-components')">
|
|
60
|
+
<div class="stepper-circle">3</div>
|
|
61
|
+
<div class="stepper-label">Components</div>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="stepper-line"></div>
|
|
64
|
+
<div class="stepper-item" (click)="scrollToSection('create-project')">
|
|
65
|
+
<div class="stepper-circle">4</div>
|
|
66
|
+
<div class="stepper-label">Create Project</div>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="stepper-line"></div>
|
|
69
|
+
<div class="stepper-item" (click)="scrollToSection('login')">
|
|
70
|
+
<div class="stepper-circle">5</div>
|
|
71
|
+
<div class="stepper-label">Log In</div>
|
|
72
|
+
</div>
|
|
73
|
+
<div class="stepper-line"></div>
|
|
74
|
+
<div class="stepper-item" (click)="scrollToSection('deployment')">
|
|
75
|
+
<div class="stepper-circle">6</div>
|
|
76
|
+
<div class="stepper-label">Deployment</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</mat-card-content>
|
|
80
|
+
</mat-card>
|
|
81
|
+
|
|
82
|
+
<!-- Workspace Setup & Onboarding Guide -->
|
|
83
|
+
<div id="prerequisites" class="section-container">
|
|
84
|
+
<h3 class="cm-t-title-medium section-title">1. Prerequisites</h3>
|
|
85
|
+
<div class="steps-grid">
|
|
86
|
+
<div class="inner-step-card">
|
|
87
|
+
<div class="card-header">
|
|
88
|
+
<h4>1. Request access (if missing)</h4>
|
|
89
|
+
</div>
|
|
90
|
+
<p>
|
|
91
|
+
You need to be part of the <strong>%cn-fe-prototyping.prod</strong> group - most likely
|
|
92
|
+
you are already added so you can skip this step unless you cannot watch fetch a
|
|
93
|
+
repository.
|
|
94
|
+
</p>
|
|
95
|
+
<div class="card-actions">
|
|
96
|
+
<a
|
|
97
|
+
mat-button
|
|
98
|
+
color="primary"
|
|
99
|
+
href="https://ganpati2.corp.google.com/group/cn-fe-prototyping.prod?sequence=884603875"
|
|
100
|
+
target="_blank"
|
|
101
|
+
class="badge-button"
|
|
102
|
+
>
|
|
103
|
+
<mat-icon>group</mat-icon> %cn-fe-prototyping.prod
|
|
104
|
+
</a>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div class="inner-step-card">
|
|
109
|
+
<div class="card-header">
|
|
110
|
+
<h4>2. Get JetSki</h4>
|
|
111
|
+
</div>
|
|
112
|
+
<p>Download JetSki from the software center.</p>
|
|
113
|
+
<div class="card-actions">
|
|
114
|
+
<a
|
|
115
|
+
mat-button
|
|
116
|
+
color="primary"
|
|
117
|
+
href="https://mytech.corp.google.com/software/tm-Jetski#installs"
|
|
118
|
+
target="_blank"
|
|
119
|
+
class="badge-button"
|
|
120
|
+
>
|
|
121
|
+
<mat-icon>install_desktop</mat-icon> Download JetSki Install
|
|
122
|
+
</a>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<div class="inner-step-card">
|
|
127
|
+
<div class="card-header">
|
|
128
|
+
<h4>3. Get Python</h4>
|
|
129
|
+
</div>
|
|
130
|
+
<p>
|
|
131
|
+
Python is required for gCloud (Cloud SDK). Download the macOS installer for
|
|
132
|
+
<strong>Python 3.13.12</strong>.
|
|
133
|
+
</p>
|
|
134
|
+
<div class="card-actions">
|
|
135
|
+
<a
|
|
136
|
+
mat-button
|
|
137
|
+
color="primary"
|
|
138
|
+
href="https://www.python.org/downloads/macos/"
|
|
139
|
+
target="_blank"
|
|
140
|
+
class="badge-button"
|
|
141
|
+
>
|
|
142
|
+
<mat-icon>download</mat-icon> Python 3.13.12
|
|
143
|
+
</a>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
|
|
147
|
+
<div class="inner-step-card">
|
|
148
|
+
<div class="card-header">
|
|
149
|
+
<h4>4. Install Dependencies</h4>
|
|
150
|
+
</div>
|
|
151
|
+
<p>Follow the instructions from the official guide to install dependencies.</p>
|
|
152
|
+
<div class="card-actions">
|
|
153
|
+
<a
|
|
154
|
+
mat-button
|
|
155
|
+
color="primary"
|
|
156
|
+
href="https://docs.cloud.google.com/sdk/docs/install-sdk"
|
|
157
|
+
target="_blank"
|
|
158
|
+
class="badge-button"
|
|
159
|
+
>
|
|
160
|
+
<mat-icon>cloud_download</mat-icon> Install SDK Guide
|
|
161
|
+
</a>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
</div>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
<mat-card id="git-config" class="dashboard-card git-card" style="margin-top: 24px">
|
|
168
|
+
<mat-card-header>
|
|
169
|
+
<mat-icon mat-card-avatar class="info-icon">code</mat-icon>
|
|
170
|
+
<mat-card-title>Git Configuration & Clonation</mat-card-title>
|
|
171
|
+
<mat-card-subtitle>Configure Git user info and clone repository</mat-card-subtitle>
|
|
172
|
+
</mat-card-header>
|
|
173
|
+
<mat-card-content style="padding: 16px">
|
|
174
|
+
<p>Remember to configure git with your LDAP and email:</p>
|
|
175
|
+
<pre class="path-block"><code>git config --global user.name "ldap"
|
|
176
|
+
git config --global user.email "ldap@google.com"
|
|
177
|
+
git config --global pull.rebase true</code></pre>
|
|
178
|
+
|
|
179
|
+
<h4 class="cm-t-title-small" style="margin-top: 16px">Clone repository</h4>
|
|
180
|
+
<pre class="path-block"><code>git clone "sso://cn-fe-ai-internal/prototypes"</code></pre>
|
|
181
|
+
</mat-card-content>
|
|
182
|
+
</mat-card>
|
|
183
|
+
|
|
184
|
+
<mat-card id="view-components" class="dashboard-card components-card" style="margin-top: 24px">
|
|
185
|
+
<mat-card-header>
|
|
186
|
+
<mat-icon mat-card-avatar class="info-icon">visibility</mat-icon>
|
|
187
|
+
<mat-card-title>View Available Components</mat-card-title>
|
|
188
|
+
<mat-card-subtitle>Explore shared UI elements and page templates</mat-card-subtitle>
|
|
189
|
+
</mat-card-header>
|
|
190
|
+
<mat-card-content style="padding: 16px">
|
|
191
|
+
<p>Navigate to the components project and run the application:</p>
|
|
192
|
+
<pre class="path-block"><code>cd components
|
|
193
|
+
npm install
|
|
194
|
+
npm run start</code></pre>
|
|
195
|
+
<p>
|
|
196
|
+
Go to <a href="http://localhost:4200" target="_blank">http://localhost:4200</a> to view
|
|
197
|
+
the workspace.
|
|
198
|
+
</p>
|
|
199
|
+
</mat-card-content>
|
|
200
|
+
</mat-card>
|
|
201
|
+
|
|
202
|
+
<mat-card id="create-project" class="dashboard-card project-card" style="margin-top: 24px">
|
|
203
|
+
<mat-card-header>
|
|
204
|
+
<mat-icon mat-card-avatar class="info-icon">add_circle</mat-icon>
|
|
205
|
+
<mat-card-title>Create & Run Your Project</mat-card-title>
|
|
206
|
+
<mat-card-subtitle>Bootstrap your own application</mat-card-subtitle>
|
|
207
|
+
</mat-card-header>
|
|
208
|
+
<mat-card-content style="padding: 16px">
|
|
209
|
+
<p>Generate a new Angular project from the repository root:</p>
|
|
210
|
+
<pre class="path-block"><code>./create-project.sh</code></pre>
|
|
211
|
+
|
|
212
|
+
<h4 class="cm-t-title-small" style="margin-top: 16px">Run Your Application</h4>
|
|
213
|
+
<p>Navigate to your newly created project folder and run:</p>
|
|
214
|
+
<pre class="path-block"><code>cd [your-project-name]
|
|
215
|
+
npm run start</code></pre>
|
|
216
|
+
</mat-card-content>
|
|
217
|
+
</mat-card>
|
|
218
|
+
|
|
219
|
+
<mat-card id="login" class="dashboard-card login-card" style="margin-top: 24px">
|
|
220
|
+
<mat-card-header>
|
|
221
|
+
<mat-icon mat-card-avatar class="info-icon">login</mat-icon>
|
|
222
|
+
<mat-card-title>How to Log In</mat-card-title>
|
|
223
|
+
<mat-card-subtitle>Step-by-step authentication process</mat-card-subtitle>
|
|
224
|
+
</mat-card-header>
|
|
225
|
+
<mat-card-content style="padding: 16px">
|
|
226
|
+
<p>Watch this video guide for a visual walkthrough:</p>
|
|
227
|
+
<a
|
|
228
|
+
mat-button
|
|
229
|
+
color="primary"
|
|
230
|
+
href="https://drive.google.com/corp/drive/u/0/folders/11luQgQO-PccXn1tcy9Ftv54PKAaIcz6X"
|
|
231
|
+
target="_blank"
|
|
232
|
+
>
|
|
233
|
+
<mat-icon>videocam</mat-icon> ai-poc Video Guide
|
|
234
|
+
</a>
|
|
235
|
+
|
|
236
|
+
<ol style="margin-top: 16px; font-size: 14px; line-height: 1.6">
|
|
237
|
+
<li>Open Chrome in incognito mode.</li>
|
|
238
|
+
<li>
|
|
239
|
+
Open your app (usually
|
|
240
|
+
<a href="http://localhost:4200" target="_blank">http://localhost:4200</a>).
|
|
241
|
+
</li>
|
|
242
|
+
<li>Click <strong>Sign in with the Test Account</strong> button.</li>
|
|
243
|
+
<li>Input <code>pantheon.networking.demo@gmail.com</code> as user.</li>
|
|
244
|
+
<li>Input your company LDAP email.</li>
|
|
245
|
+
<li>Verify login.</li>
|
|
246
|
+
<li>Accept permissions.</li>
|
|
247
|
+
<li>Done.</li>
|
|
248
|
+
</ol>
|
|
249
|
+
</mat-card-content>
|
|
250
|
+
</mat-card>
|
|
251
|
+
|
|
252
|
+
<mat-card id="deployment" class="dashboard-card deploy-card" style="margin-top: 24px">
|
|
253
|
+
<mat-card-header>
|
|
254
|
+
<mat-icon mat-card-avatar class="info-icon">cloud_upload</mat-icon>
|
|
255
|
+
<mat-card-title>Deployment & OAuth Setup</mat-card-title>
|
|
256
|
+
<mat-card-subtitle>Ship your application to Cloud Run</mat-card-subtitle>
|
|
257
|
+
</mat-card-header>
|
|
258
|
+
<mat-card-content style="padding: 16px">
|
|
259
|
+
<p>Deploy your application using standard script:</p>
|
|
260
|
+
<pre class="path-block"><code>./deploy.sh</code></pre>
|
|
261
|
+
|
|
262
|
+
<h4 class="cm-t-title-small" style="margin-top: 16px">Allowlist Application for OAuth</h4>
|
|
263
|
+
<p>First, get your application URL from Cloud Run console:</p>
|
|
264
|
+
<a
|
|
265
|
+
mat-button
|
|
266
|
+
color="primary"
|
|
267
|
+
href="https://pantheon.corp.google.com/run/services?project=cn-fe-ai-apps"
|
|
268
|
+
target="_blank"
|
|
269
|
+
>
|
|
270
|
+
<mat-icon>open_in_new</mat-icon> View Cloud Run Services
|
|
271
|
+
</a>
|
|
272
|
+
|
|
273
|
+
<p style="margin-top: 16px">
|
|
274
|
+
Add your production URL to BOTH allowed origins and redirect URIs in OAuth configuration:
|
|
275
|
+
</p>
|
|
276
|
+
<a
|
|
277
|
+
mat-button
|
|
278
|
+
color="primary"
|
|
279
|
+
href="https://pantheon.corp.google.com/auth/clients/639401146900-33blrbvq8l7g6e8cgqiorrdp1qvn3as2.apps.googleusercontent.com?project=cn-fe-ai-apps"
|
|
280
|
+
target="_blank"
|
|
281
|
+
>
|
|
282
|
+
<mat-icon>settings</mat-icon> OAuth Clients Config
|
|
283
|
+
</a>
|
|
284
|
+
</mat-card-content>
|
|
285
|
+
</mat-card>
|
|
286
|
+
</div>
|
|
287
|
+
</app-page>
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
.dashboard-container {
|
|
2
|
+
padding: 24px;
|
|
3
|
+
display: flex;
|
|
4
|
+
flex-direction: column;
|
|
5
|
+
gap: 24px;
|
|
6
|
+
font-family: 'Inter', sans-serif;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
.dashboard-card {
|
|
10
|
+
border-radius: 12px;
|
|
11
|
+
background: white;
|
|
12
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
|
13
|
+
border: 1px solid #e8eaed;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.welcome-card {
|
|
17
|
+
background: linear-gradient(135deg, #f8f9fa 0%, #e8f0fe 100%);
|
|
18
|
+
border: none;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// ... existing code ...
|
|
22
|
+
|
|
23
|
+
/* Custom Stepper */
|
|
24
|
+
.stepper-container {
|
|
25
|
+
display: flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: space-between;
|
|
28
|
+
padding: 16px 0;
|
|
29
|
+
overflow-x: auto;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.stepper-item {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
align-items: center;
|
|
36
|
+
text-align: center;
|
|
37
|
+
cursor: pointer;
|
|
38
|
+
flex: 1;
|
|
39
|
+
min-width: 120px;
|
|
40
|
+
position: relative;
|
|
41
|
+
|
|
42
|
+
&.active {
|
|
43
|
+
.stepper-circle {
|
|
44
|
+
background: #1a73e8;
|
|
45
|
+
color: white;
|
|
46
|
+
border-color: #1a73e8;
|
|
47
|
+
}
|
|
48
|
+
.stepper-label {
|
|
49
|
+
color: #1a73e8;
|
|
50
|
+
font-weight: 500;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.stepper-circle {
|
|
56
|
+
width: 32px;
|
|
57
|
+
height: 32px;
|
|
58
|
+
border-radius: 50%;
|
|
59
|
+
border: 2px solid #dadce0;
|
|
60
|
+
display: flex;
|
|
61
|
+
align-items: center;
|
|
62
|
+
justify-content: center;
|
|
63
|
+
font-weight: 500;
|
|
64
|
+
color: #5f6368;
|
|
65
|
+
background: white;
|
|
66
|
+
margin-bottom: 8px;
|
|
67
|
+
z-index: 2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.stepper-label {
|
|
71
|
+
font-size: 13px;
|
|
72
|
+
color: #3c4043;
|
|
73
|
+
display: flex;
|
|
74
|
+
flex-direction: column;
|
|
75
|
+
align-items: center;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
.stepper-line {
|
|
80
|
+
flex: 1;
|
|
81
|
+
height: 1px;
|
|
82
|
+
background: #dadce0;
|
|
83
|
+
margin-bottom: 24px; // Align with circle center (approx)
|
|
84
|
+
z-index: 1;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/* Grid Layout */
|
|
88
|
+
.section-container {
|
|
89
|
+
margin-top: 24px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.section-title {
|
|
93
|
+
margin-bottom: 16px;
|
|
94
|
+
color: #202124;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.steps-grid {
|
|
98
|
+
display: grid;
|
|
99
|
+
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
|
|
100
|
+
gap: 24px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.inner-step-card {
|
|
104
|
+
background: white;
|
|
105
|
+
border: 1px solid #e8eaed;
|
|
106
|
+
border-radius: 12px;
|
|
107
|
+
padding: 24px;
|
|
108
|
+
display: flex;
|
|
109
|
+
flex-direction: column;
|
|
110
|
+
justify-content: space-between;
|
|
111
|
+
transition: box-shadow 0.3s ease;
|
|
112
|
+
|
|
113
|
+
&:hover {
|
|
114
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
h4 {
|
|
118
|
+
margin: 0;
|
|
119
|
+
font-size: 16px;
|
|
120
|
+
font-weight: 500;
|
|
121
|
+
color: #202124;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
p {
|
|
125
|
+
font-size: 14px;
|
|
126
|
+
color: #5f6368;
|
|
127
|
+
margin-top: 12px;
|
|
128
|
+
margin-bottom: 24px;
|
|
129
|
+
flex-grow: 1;
|
|
130
|
+
line-height: 1.5;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
.card-header {
|
|
135
|
+
display: flex;
|
|
136
|
+
justify-content: space-between;
|
|
137
|
+
align-items: center;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
.card-actions {
|
|
142
|
+
display: flex;
|
|
143
|
+
justify-content: flex-start;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.badge-button {
|
|
147
|
+
background: #e8f0fe !important;
|
|
148
|
+
color: #1a73e8 !important;
|
|
149
|
+
border-radius: 20px !important;
|
|
150
|
+
font-size: 13px !important;
|
|
151
|
+
height: 36px !important;
|
|
152
|
+
display: flex;
|
|
153
|
+
align-items: center;
|
|
154
|
+
gap: 8px;
|
|
155
|
+
|
|
156
|
+
mat-icon {
|
|
157
|
+
font-size: 18px;
|
|
158
|
+
width: 18px;
|
|
159
|
+
height: 18px;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.info-grid {
|
|
164
|
+
display: grid;
|
|
165
|
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
|
166
|
+
gap: 24px;
|
|
167
|
+
padding: 30px;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.info-card {
|
|
171
|
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.info-card:hover {
|
|
175
|
+
transform: translateY(-5px);
|
|
176
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.info-icon {
|
|
180
|
+
background: #e8f0fe;
|
|
181
|
+
color: #0c67df;
|
|
182
|
+
border-radius: 50%;
|
|
183
|
+
padding: 8px;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
.path-block {
|
|
187
|
+
display: block;
|
|
188
|
+
background: #f1f3f4;
|
|
189
|
+
padding: 12px;
|
|
190
|
+
border-radius: 6px;
|
|
191
|
+
font-family: monospace;
|
|
192
|
+
font-size: 13px;
|
|
193
|
+
color: #202124;
|
|
194
|
+
margin-top: 12px;
|
|
195
|
+
border: 1px solid #dadce0;
|
|
196
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { MatCardModule } from '@angular/material/card';
|
|
4
|
+
import { MatIconModule } from '@angular/material/icon';
|
|
5
|
+
import { MatButtonModule } from '@angular/material/button';
|
|
6
|
+
import { MatDividerModule } from '@angular/material/divider';
|
|
7
|
+
import { PageComponent } from '../components/page/page';
|
|
8
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
9
|
+
|
|
10
|
+
@Component({
|
|
11
|
+
selector: 'app-dashboard',
|
|
12
|
+
standalone: true,
|
|
13
|
+
imports: [CommonModule, MatCardModule, MatIconModule, MatButtonModule, MatDividerModule, PageComponent, MatChipsModule],
|
|
14
|
+
templateUrl: './dashboard.html',
|
|
15
|
+
styleUrl: './dashboard.scss'
|
|
16
|
+
})
|
|
17
|
+
export class DashboardComponent {
|
|
18
|
+
scrollToSection(id: string) {
|
|
19
|
+
const element = document.getElementById(id);
|
|
20
|
+
if (element) {
|
|
21
|
+
element.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|