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,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
+ }