@idp.global/catalog 1.1.1
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/assets/v2/draw-41d55381-b162-433d-956c-fe4cd400212e.png +0 -0
- package/assets/v2/draw-bd386bf3-ce94-4452-88da-05ae372fae35.png +0 -0
- package/assets/v2/draw-be69231a-f491-4bd3-9a47-71561ce14c15.png +0 -0
- package/assets/v2/draw-d58859a8-0615-44ec-80fe-626033c888f7.png +0 -0
- package/assets/v2/draw-db67b502-d987-4226-a5f8-d57e3f8d7ba9.png +0 -0
- package/assets/v2/draw-e6ac3ef5-5a93-464d-9d3f-5ae7b7278bdd.png +0 -0
- package/changelog.md +26 -0
- package/dist_bundle/bundle.js +6385 -0
- package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
- package/dist_ts_web/00_commitinfo_data.js +9 -0
- package/dist_ts_web/elements/idp-admin-shell.d.ts +292 -0
- package/dist_ts_web/elements/idp-admin-shell.js +2615 -0
- package/dist_ts_web/elements/idp-approval-card.d.ts +25 -0
- package/dist_ts_web/elements/idp-approval-card.js +274 -0
- package/dist_ts_web/elements/idp-badge.d.ts +14 -0
- package/dist_ts_web/elements/idp-badge.js +135 -0
- package/dist_ts_web/elements/idp-button.d.ts +21 -0
- package/dist_ts_web/elements/idp-button.js +234 -0
- package/dist_ts_web/elements/idp-card.d.ts +15 -0
- package/dist_ts_web/elements/idp-card.js +139 -0
- package/dist_ts_web/elements/idp-checkbox.d.ts +23 -0
- package/dist_ts_web/elements/idp-checkbox.js +233 -0
- package/dist_ts_web/elements/idp-dashboard-window.d.ts +23 -0
- package/dist_ts_web/elements/idp-dashboard-window.js +587 -0
- package/dist_ts_web/elements/idp-data-table.d.ts +45 -0
- package/dist_ts_web/elements/idp-data-table.js +472 -0
- package/dist_ts_web/elements/idp-form-submit.d.ts +20 -0
- package/dist_ts_web/elements/idp-form-submit.js +136 -0
- package/dist_ts_web/elements/idp-form.d.ts +31 -0
- package/dist_ts_web/elements/idp-form.js +197 -0
- package/dist_ts_web/elements/idp-icon.d.ts +18 -0
- package/dist_ts_web/elements/idp-icon.js +204 -0
- package/dist_ts_web/elements/idp-inbox-preview.d.ts +18 -0
- package/dist_ts_web/elements/idp-inbox-preview.js +245 -0
- package/dist_ts_web/elements/idp-input.d.ts +26 -0
- package/dist_ts_web/elements/idp-input.js +249 -0
- package/dist_ts_web/elements/idp-landing-hero.d.ts +15 -0
- package/dist_ts_web/elements/idp-landing-hero.js +209 -0
- package/dist_ts_web/elements/idp-landing-page.d.ts +21 -0
- package/dist_ts_web/elements/idp-landing-page.js +694 -0
- package/dist_ts_web/elements/idp-mobile-frame.d.ts +14 -0
- package/dist_ts_web/elements/idp-mobile-frame.js +195 -0
- package/dist_ts_web/elements/idp-mobile-showcase.d.ts +16 -0
- package/dist_ts_web/elements/idp-mobile-showcase.js +339 -0
- package/dist_ts_web/elements/idp-select.d.ts +28 -0
- package/dist_ts_web/elements/idp-select.js +179 -0
- package/dist_ts_web/elements/idp-toggle.d.ts +15 -0
- package/dist_ts_web/elements/idp-toggle.js +134 -0
- package/dist_ts_web/elements/index.d.ts +20 -0
- package/dist_ts_web/elements/index.js +21 -0
- package/dist_ts_web/elements/tokens.d.ts +21 -0
- package/dist_ts_web/elements/tokens.js +190 -0
- package/dist_ts_web/index.d.ts +1 -0
- package/dist_ts_web/index.js +2 -0
- package/dist_ts_web/pages/index.d.ts +5 -0
- package/dist_ts_web/pages/index.js +23 -0
- package/dist_watch/bundle.js +120699 -0
- package/dist_watch/bundle.js.map +7 -0
- package/dist_watch/index.html +29 -0
- package/html/index.html +29 -0
- package/html/index.ts +39 -0
- package/license +21 -0
- package/package.json +64 -0
- package/readme.md +103 -0
- package/ts_web/00_commitinfo_data.ts +8 -0
- package/ts_web/elements/idp-admin-shell.ts +2664 -0
- package/ts_web/elements/idp-approval-card.ts +182 -0
- package/ts_web/elements/idp-badge.ts +84 -0
- package/ts_web/elements/idp-button.ts +166 -0
- package/ts_web/elements/idp-card.ts +76 -0
- package/ts_web/elements/idp-checkbox.ts +143 -0
- package/ts_web/elements/idp-dashboard-window.ts +564 -0
- package/ts_web/elements/idp-data-table.ts +407 -0
- package/ts_web/elements/idp-form-submit.ts +65 -0
- package/ts_web/elements/idp-form.ts +159 -0
- package/ts_web/elements/idp-icon.ts +263 -0
- package/ts_web/elements/idp-inbox-preview.ts +192 -0
- package/ts_web/elements/idp-input.ts +151 -0
- package/ts_web/elements/idp-landing-hero.ts +165 -0
- package/ts_web/elements/idp-landing-page.ts +655 -0
- package/ts_web/elements/idp-mobile-frame.ts +137 -0
- package/ts_web/elements/idp-mobile-showcase.ts +295 -0
- package/ts_web/elements/idp-select.ts +119 -0
- package/ts_web/elements/idp-toggle.ts +77 -0
- package/ts_web/elements/index.ts +20 -0
- package/ts_web/elements/tokens.ts +193 -0
- package/ts_web/index.ts +1 -0
- package/ts_web/pages/index.ts +26 -0
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
import { DeesElement, html, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import { idpElementStyles } from './tokens.js';
|
|
3
|
+
import './idp-badge.js';
|
|
4
|
+
import './idp-button.js';
|
|
5
|
+
import './idp-icon.js';
|
|
6
|
+
import './idp-data-table.js';
|
|
7
|
+
|
|
8
|
+
type TDashboardStat = {
|
|
9
|
+
label: string;
|
|
10
|
+
value: string;
|
|
11
|
+
unit?: string;
|
|
12
|
+
delta: string;
|
|
13
|
+
sub: string;
|
|
14
|
+
accent: string;
|
|
15
|
+
sparkColor: string;
|
|
16
|
+
spark: number[];
|
|
17
|
+
live?: boolean;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
declare global {
|
|
21
|
+
interface HTMLElementTagNameMap {
|
|
22
|
+
'idp-dashboard-window': IdpDashboardWindow;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@customElement('idp-dashboard-window')
|
|
27
|
+
export class IdpDashboardWindow extends DeesElement {
|
|
28
|
+
public static demo = () => html`<idp-dashboard-window></idp-dashboard-window>`;
|
|
29
|
+
public static demoGroups = ['idp.global v3 composed surfaces'];
|
|
30
|
+
|
|
31
|
+
public static styles = [
|
|
32
|
+
...idpElementStyles,
|
|
33
|
+
css`
|
|
34
|
+
:host {
|
|
35
|
+
display: block;
|
|
36
|
+
}
|
|
37
|
+
.dash {
|
|
38
|
+
position: relative;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
border: 1px solid var(--idp-border);
|
|
41
|
+
border-radius: 14px;
|
|
42
|
+
background: var(--idp-bg-2);
|
|
43
|
+
color: var(--idp-fg);
|
|
44
|
+
box-shadow: 0 1px 0 rgba(255,255,255,0.04) inset, 0 40px 80px -20px rgba(0,0,0,0.70), 0 8px 24px rgba(0,0,0,0.35);
|
|
45
|
+
}
|
|
46
|
+
.chrome, .appbar, .bottom {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: 8px;
|
|
50
|
+
border-bottom: 1px solid var(--idp-border-soft);
|
|
51
|
+
background: rgba(255,255,255,0.02);
|
|
52
|
+
color: var(--idp-muted-fg);
|
|
53
|
+
font-family: var(--idp-mono);
|
|
54
|
+
font-size: 11px;
|
|
55
|
+
}
|
|
56
|
+
.chrome {
|
|
57
|
+
padding: 11px 14px;
|
|
58
|
+
}
|
|
59
|
+
.tdot {
|
|
60
|
+
width: 11px;
|
|
61
|
+
height: 11px;
|
|
62
|
+
border-radius: 50%;
|
|
63
|
+
}
|
|
64
|
+
.red { background: #ff5f57; }
|
|
65
|
+
.yellow { background: #ffbd2e; }
|
|
66
|
+
.green { background: #28c840; }
|
|
67
|
+
.url, .org, .search {
|
|
68
|
+
display: inline-flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
gap: 8px;
|
|
71
|
+
border: 1px solid var(--idp-border-soft);
|
|
72
|
+
border-radius: 5px;
|
|
73
|
+
background: var(--idp-bg);
|
|
74
|
+
color: var(--idp-fg-3, var(--idp-muted-fg));
|
|
75
|
+
}
|
|
76
|
+
.url {
|
|
77
|
+
margin-left: 12px;
|
|
78
|
+
padding: 4px 10px;
|
|
79
|
+
}
|
|
80
|
+
.status {
|
|
81
|
+
margin-left: auto;
|
|
82
|
+
display: inline-flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
gap: 6px;
|
|
85
|
+
}
|
|
86
|
+
.live-dot {
|
|
87
|
+
width: 6px;
|
|
88
|
+
height: 6px;
|
|
89
|
+
border-radius: 50%;
|
|
90
|
+
background: var(--idp-ok);
|
|
91
|
+
box-shadow: 0 0 8px var(--idp-ok);
|
|
92
|
+
animation: pulse 1.6s ease-in-out infinite;
|
|
93
|
+
}
|
|
94
|
+
@keyframes pulse {
|
|
95
|
+
0%, 100% { opacity: 1; }
|
|
96
|
+
50% { opacity: 0.35; }
|
|
97
|
+
}
|
|
98
|
+
.appbar {
|
|
99
|
+
justify-content: space-between;
|
|
100
|
+
height: 44px;
|
|
101
|
+
padding: 0 14px;
|
|
102
|
+
background: var(--idp-bg);
|
|
103
|
+
}
|
|
104
|
+
.appbar-left, .appbar-right {
|
|
105
|
+
display: flex;
|
|
106
|
+
align-items: center;
|
|
107
|
+
gap: 12px;
|
|
108
|
+
}
|
|
109
|
+
.logo {
|
|
110
|
+
display: inline-flex;
|
|
111
|
+
align-items: center;
|
|
112
|
+
gap: 7px;
|
|
113
|
+
color: var(--idp-fg);
|
|
114
|
+
font-family: var(--idp-display);
|
|
115
|
+
font-size: 13px;
|
|
116
|
+
font-weight: 700;
|
|
117
|
+
letter-spacing: -0.015em;
|
|
118
|
+
}
|
|
119
|
+
.logo-dot {
|
|
120
|
+
width: 6px;
|
|
121
|
+
height: 6px;
|
|
122
|
+
border-radius: 999px;
|
|
123
|
+
background: var(--idp-accent);
|
|
124
|
+
box-shadow: 0 0 12px var(--idp-accent);
|
|
125
|
+
}
|
|
126
|
+
.divider {
|
|
127
|
+
width: 1px;
|
|
128
|
+
height: 18px;
|
|
129
|
+
background: var(--idp-border);
|
|
130
|
+
}
|
|
131
|
+
.org {
|
|
132
|
+
padding: 4px 10px 4px 4px;
|
|
133
|
+
background: var(--idp-bg-2);
|
|
134
|
+
font-size: 12px;
|
|
135
|
+
}
|
|
136
|
+
.avatar-sm {
|
|
137
|
+
width: 20px;
|
|
138
|
+
height: 20px;
|
|
139
|
+
display: inline-grid;
|
|
140
|
+
place-items: center;
|
|
141
|
+
border-radius: 4px;
|
|
142
|
+
background: var(--idp-accent);
|
|
143
|
+
color: var(--idp-accent-fg);
|
|
144
|
+
font-family: var(--idp-mono);
|
|
145
|
+
font-size: 10px;
|
|
146
|
+
font-weight: 700;
|
|
147
|
+
}
|
|
148
|
+
.search {
|
|
149
|
+
min-width: 240px;
|
|
150
|
+
height: 28px;
|
|
151
|
+
padding: 0 10px;
|
|
152
|
+
background: var(--idp-bg-2);
|
|
153
|
+
}
|
|
154
|
+
.kbd {
|
|
155
|
+
margin-left: auto;
|
|
156
|
+
padding: 0 5px;
|
|
157
|
+
border: 1px solid var(--idp-border);
|
|
158
|
+
border-radius: 3px;
|
|
159
|
+
background: var(--idp-bg);
|
|
160
|
+
font-size: 10px;
|
|
161
|
+
}
|
|
162
|
+
.user-avatar {
|
|
163
|
+
width: 28px;
|
|
164
|
+
height: 28px;
|
|
165
|
+
display: inline-grid;
|
|
166
|
+
place-items: center;
|
|
167
|
+
border: 1px solid rgba(59,130,246,0.4);
|
|
168
|
+
border-radius: 50%;
|
|
169
|
+
background: rgba(0,80,185,0.25);
|
|
170
|
+
color: var(--idp-accent-hover);
|
|
171
|
+
font-family: var(--idp-mono);
|
|
172
|
+
font-size: 10px;
|
|
173
|
+
font-weight: 700;
|
|
174
|
+
}
|
|
175
|
+
.shell {
|
|
176
|
+
display: grid;
|
|
177
|
+
grid-template-columns: 200px 1fr;
|
|
178
|
+
min-height: 580px;
|
|
179
|
+
}
|
|
180
|
+
aside {
|
|
181
|
+
display: flex;
|
|
182
|
+
flex-direction: column;
|
|
183
|
+
gap: 1px;
|
|
184
|
+
padding: 12px 8px;
|
|
185
|
+
border-right: 1px solid var(--idp-border-soft);
|
|
186
|
+
background: var(--idp-bg);
|
|
187
|
+
}
|
|
188
|
+
.side-label {
|
|
189
|
+
padding: 12px 10px 6px;
|
|
190
|
+
color: color-mix(in srgb, var(--idp-muted-fg), transparent 35%);
|
|
191
|
+
font-family: var(--idp-mono);
|
|
192
|
+
font-size: 10px;
|
|
193
|
+
font-weight: 600;
|
|
194
|
+
letter-spacing: 0.1em;
|
|
195
|
+
text-transform: uppercase;
|
|
196
|
+
}
|
|
197
|
+
.side-nav {
|
|
198
|
+
display: flex;
|
|
199
|
+
align-items: center;
|
|
200
|
+
gap: 10px;
|
|
201
|
+
padding: 7px 10px;
|
|
202
|
+
border-radius: 5px;
|
|
203
|
+
color: var(--idp-muted-fg);
|
|
204
|
+
font-size: 12.5px;
|
|
205
|
+
}
|
|
206
|
+
.side-nav.active {
|
|
207
|
+
background: rgba(0,80,185,0.18);
|
|
208
|
+
color: var(--idp-fg);
|
|
209
|
+
}
|
|
210
|
+
.nav-icon {
|
|
211
|
+
width: 18px;
|
|
212
|
+
display: inline-flex;
|
|
213
|
+
justify-content: center;
|
|
214
|
+
color: currentColor;
|
|
215
|
+
}
|
|
216
|
+
.side-nav.active .nav-icon {
|
|
217
|
+
color: var(--idp-accent-hover);
|
|
218
|
+
}
|
|
219
|
+
main {
|
|
220
|
+
min-width: 0;
|
|
221
|
+
padding: 22px 24px;
|
|
222
|
+
background: var(--idp-bg);
|
|
223
|
+
}
|
|
224
|
+
.head {
|
|
225
|
+
display: flex;
|
|
226
|
+
align-items: flex-end;
|
|
227
|
+
justify-content: space-between;
|
|
228
|
+
gap: 16px;
|
|
229
|
+
margin-bottom: 18px;
|
|
230
|
+
}
|
|
231
|
+
h3 {
|
|
232
|
+
margin: 0;
|
|
233
|
+
font-family: var(--idp-display);
|
|
234
|
+
font-size: 22px;
|
|
235
|
+
font-weight: 650;
|
|
236
|
+
letter-spacing: -0.02em;
|
|
237
|
+
}
|
|
238
|
+
.sub {
|
|
239
|
+
margin-top: 2px;
|
|
240
|
+
color: var(--idp-muted-fg);
|
|
241
|
+
font-size: 12.5px;
|
|
242
|
+
}
|
|
243
|
+
.actions {
|
|
244
|
+
display: flex;
|
|
245
|
+
gap: 8px;
|
|
246
|
+
}
|
|
247
|
+
.stats {
|
|
248
|
+
display: grid;
|
|
249
|
+
grid-template-columns: repeat(4, 1fr);
|
|
250
|
+
gap: 12px;
|
|
251
|
+
margin-bottom: 16px;
|
|
252
|
+
}
|
|
253
|
+
.stat, .card {
|
|
254
|
+
border: 1px solid var(--idp-border-soft);
|
|
255
|
+
background: var(--idp-bg-2);
|
|
256
|
+
}
|
|
257
|
+
.stat {
|
|
258
|
+
position: relative;
|
|
259
|
+
min-height: 132px;
|
|
260
|
+
display: flex;
|
|
261
|
+
flex-direction: column;
|
|
262
|
+
gap: 4px;
|
|
263
|
+
overflow: hidden;
|
|
264
|
+
padding: 18px 20px 14px;
|
|
265
|
+
border-radius: 10px;
|
|
266
|
+
}
|
|
267
|
+
.stat::before {
|
|
268
|
+
content: '';
|
|
269
|
+
position: absolute;
|
|
270
|
+
inset: 0 0 auto;
|
|
271
|
+
height: 2px;
|
|
272
|
+
background: var(--stat-accent);
|
|
273
|
+
}
|
|
274
|
+
.stat-label {
|
|
275
|
+
color: var(--idp-muted-fg);
|
|
276
|
+
font-size: 11.5px;
|
|
277
|
+
font-weight: 500;
|
|
278
|
+
letter-spacing: 0.02em;
|
|
279
|
+
}
|
|
280
|
+
.stat-val {
|
|
281
|
+
color: var(--idp-fg);
|
|
282
|
+
font-family: var(--idp-display);
|
|
283
|
+
font-size: 30px;
|
|
284
|
+
font-weight: 700;
|
|
285
|
+
font-variant-numeric: tabular-nums;
|
|
286
|
+
letter-spacing: -0.025em;
|
|
287
|
+
line-height: 1.1;
|
|
288
|
+
}
|
|
289
|
+
.stat-val span {
|
|
290
|
+
margin-left: 2px;
|
|
291
|
+
color: var(--idp-muted-fg);
|
|
292
|
+
font-size: 14px;
|
|
293
|
+
font-weight: 500;
|
|
294
|
+
}
|
|
295
|
+
.stat-sub {
|
|
296
|
+
color: var(--idp-fg-3);
|
|
297
|
+
font-family: var(--idp-mono);
|
|
298
|
+
font-size: 11px;
|
|
299
|
+
}
|
|
300
|
+
.stat-foot {
|
|
301
|
+
display: flex;
|
|
302
|
+
align-items: flex-end;
|
|
303
|
+
justify-content: space-between;
|
|
304
|
+
gap: 8px;
|
|
305
|
+
margin-top: auto;
|
|
306
|
+
}
|
|
307
|
+
.delta {
|
|
308
|
+
display: inline-flex;
|
|
309
|
+
align-items: center;
|
|
310
|
+
gap: 4px;
|
|
311
|
+
color: var(--idp-ok);
|
|
312
|
+
font-family: var(--idp-mono);
|
|
313
|
+
font-size: 11px;
|
|
314
|
+
font-weight: 600;
|
|
315
|
+
}
|
|
316
|
+
.sparkline {
|
|
317
|
+
width: 84px;
|
|
318
|
+
opacity: 0.85;
|
|
319
|
+
}
|
|
320
|
+
.sparkline svg {
|
|
321
|
+
width: 100%;
|
|
322
|
+
height: 22px;
|
|
323
|
+
display: block;
|
|
324
|
+
}
|
|
325
|
+
.grid {
|
|
326
|
+
display: grid;
|
|
327
|
+
grid-template-columns: 1.6fr 1fr;
|
|
328
|
+
gap: 16px;
|
|
329
|
+
}
|
|
330
|
+
.card {
|
|
331
|
+
overflow: hidden;
|
|
332
|
+
}
|
|
333
|
+
.card-head {
|
|
334
|
+
display: flex;
|
|
335
|
+
align-items: center;
|
|
336
|
+
gap: 10px;
|
|
337
|
+
padding: 12px 16px;
|
|
338
|
+
border-bottom: 1px solid var(--idp-border-soft);
|
|
339
|
+
}
|
|
340
|
+
.card-title {
|
|
341
|
+
font-size: 13px;
|
|
342
|
+
font-weight: 600;
|
|
343
|
+
}
|
|
344
|
+
.feed-item {
|
|
345
|
+
display: grid;
|
|
346
|
+
grid-template-columns: 14px 1fr auto;
|
|
347
|
+
gap: 12px;
|
|
348
|
+
align-items: center;
|
|
349
|
+
padding: 12px 16px;
|
|
350
|
+
border-bottom: 1px solid var(--idp-border-soft);
|
|
351
|
+
}
|
|
352
|
+
.feed-dot {
|
|
353
|
+
width: 8px;
|
|
354
|
+
height: 8px;
|
|
355
|
+
border-radius: 50%;
|
|
356
|
+
background: var(--idp-accent-hover);
|
|
357
|
+
}
|
|
358
|
+
.feed-dot.ok {
|
|
359
|
+
background: var(--idp-ok);
|
|
360
|
+
}
|
|
361
|
+
.feed-text {
|
|
362
|
+
color: var(--idp-fg-3, var(--idp-muted-fg));
|
|
363
|
+
font-size: 12.5px;
|
|
364
|
+
}
|
|
365
|
+
.feed-text strong {
|
|
366
|
+
color: var(--idp-fg);
|
|
367
|
+
font-weight: 500;
|
|
368
|
+
}
|
|
369
|
+
.feed-meta {
|
|
370
|
+
color: color-mix(in srgb, var(--idp-muted-fg), transparent 35%);
|
|
371
|
+
font-family: var(--idp-mono);
|
|
372
|
+
font-size: 10.5px;
|
|
373
|
+
}
|
|
374
|
+
.bottom {
|
|
375
|
+
height: 28px;
|
|
376
|
+
padding: 0 14px;
|
|
377
|
+
border-top: 1px solid var(--idp-border-soft);
|
|
378
|
+
border-bottom: 0;
|
|
379
|
+
background: var(--idp-bg);
|
|
380
|
+
}
|
|
381
|
+
.bottom .divider {
|
|
382
|
+
height: 12px;
|
|
383
|
+
}
|
|
384
|
+
.grow {
|
|
385
|
+
flex: 1;
|
|
386
|
+
}
|
|
387
|
+
@media (max-width: 900px) {
|
|
388
|
+
.shell {
|
|
389
|
+
grid-template-columns: 1fr;
|
|
390
|
+
}
|
|
391
|
+
aside, .search {
|
|
392
|
+
display: none;
|
|
393
|
+
}
|
|
394
|
+
.stats {
|
|
395
|
+
grid-template-columns: repeat(2, 1fr);
|
|
396
|
+
}
|
|
397
|
+
.grid {
|
|
398
|
+
grid-template-columns: 1fr;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
@media (max-width: 560px) {
|
|
402
|
+
.stats {
|
|
403
|
+
grid-template-columns: 1fr;
|
|
404
|
+
}
|
|
405
|
+
.head {
|
|
406
|
+
align-items: flex-start;
|
|
407
|
+
flex-direction: column;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
`,
|
|
411
|
+
];
|
|
412
|
+
|
|
413
|
+
private stats: TDashboardStat[] = [
|
|
414
|
+
{ label: 'Identities', value: '2,847', delta: '↑ 12% wk', sub: '142 added this week', accent: 'var(--idp-chart-1)', sparkColor: 'var(--idp-spark-up)', spark: [10, 12, 11, 14, 13, 16, 15, 18, 19] },
|
|
415
|
+
{ label: 'Active devices', value: '9,140', delta: '↑ 4.2%', sub: '3.2 avg / identity', accent: 'var(--idp-chart-2)', sparkColor: 'var(--idp-spark-up)', spark: [12, 13, 11, 14, 13, 15, 14, 16, 17] },
|
|
416
|
+
{ label: 'Avg approval', value: '0.8', unit: 's', delta: '↓ 60ms faster', sub: 'p95 - all regions', accent: 'var(--idp-chart-5)', sparkColor: 'var(--idp-spark-info)', spark: [16, 14, 17, 12, 15, 13, 11, 9, 7] },
|
|
417
|
+
{ label: 'Cardano anchors', value: '12,408', delta: 'synced 4s ago', sub: 'block #9 841 222', accent: 'var(--idp-info)', sparkColor: 'var(--idp-spark-up)', spark: [8, 9, 11, 10, 13, 12, 15, 16, 18], live: true },
|
|
418
|
+
];
|
|
419
|
+
|
|
420
|
+
private approvals = [
|
|
421
|
+
['Jane Doe', 'jane@lossless.com', 'OAuth - GitHub', 'iPhone 15 Pro', 'approved', 'ok'],
|
|
422
|
+
['Alex Brown', 'alex@lossless.com', 'CLI login', 'MacBook Pro', 'pending', 'warn'],
|
|
423
|
+
['Sam Chen', 'sam@lossless.com', 'NFC tap - door 4F', 'iPhone 14', 'approved', 'ok'],
|
|
424
|
+
['Unknown device', 'Lagos - NG', 'Web login', 'Chrome 132', 'denied', 'error'],
|
|
425
|
+
['Maria K.', 'maria@lossless.com', 'Key rotation', 'Apple Watch S9', 'on-chain', 'accent'],
|
|
426
|
+
];
|
|
427
|
+
|
|
428
|
+
private feed = [
|
|
429
|
+
['Identity created', 'did:idp:0x9b12...f034', 'block #9 841 222', ''],
|
|
430
|
+
['Anchor confirmed', '12 blocks deep', '2m', 'ok'],
|
|
431
|
+
['Key rotation', 'did:idp:0x4a3f...c819', 'block #9 841 221', ''],
|
|
432
|
+
['OAuth scope updated', 'github repo:read', '5m', 'ok'],
|
|
433
|
+
['Device registered', 'MacBook Pro pending', '7m', ''],
|
|
434
|
+
];
|
|
435
|
+
|
|
436
|
+
private workspaceNav = [
|
|
437
|
+
['Overview', 'grid'],
|
|
438
|
+
['Identities', 'user'],
|
|
439
|
+
['Approvals', 'bell'],
|
|
440
|
+
['OAuth clients', 'key'],
|
|
441
|
+
['Devices', 'monitor'],
|
|
442
|
+
['Audit log', 'clock'],
|
|
443
|
+
];
|
|
444
|
+
|
|
445
|
+
private chainNav = [
|
|
446
|
+
['Cardano sync', 'wallet'],
|
|
447
|
+
['Anchors', 'shield'],
|
|
448
|
+
];
|
|
449
|
+
|
|
450
|
+
private renderSparkline(data: number[], color: string): TemplateResult {
|
|
451
|
+
const max = Math.max(...data);
|
|
452
|
+
const min = Math.min(...data);
|
|
453
|
+
const range = max - min || 1;
|
|
454
|
+
const width = 100;
|
|
455
|
+
const height = 22;
|
|
456
|
+
const points = data.map((valueArg, indexArg) => {
|
|
457
|
+
const x = (indexArg / (data.length - 1)) * width;
|
|
458
|
+
const y = height - ((valueArg - min) / range) * (height - 4) - 2;
|
|
459
|
+
return `${x},${y}`;
|
|
460
|
+
}).join(' ');
|
|
461
|
+
const area = `0,${height} ${points} ${width},${height}`;
|
|
462
|
+
|
|
463
|
+
return html`<svg viewBox="0 0 ${width} ${height}" preserveAspectRatio="none"><polygon points=${area} fill=${color} opacity="0.12"></polygon><polyline points=${points} fill="none" stroke=${color} stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></polyline></svg>`;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
private renderStat(statArg: TDashboardStat): TemplateResult {
|
|
467
|
+
return html`
|
|
468
|
+
<div class="stat" style="--stat-accent:${statArg.accent}">
|
|
469
|
+
<div class="stat-label">${statArg.label}</div>
|
|
470
|
+
<div class="stat-val">${statArg.value}${statArg.unit ? html`<span>${statArg.unit}</span>` : html``}</div>
|
|
471
|
+
<div class="stat-sub">${statArg.sub}</div>
|
|
472
|
+
<div class="stat-foot"><span class="delta">${statArg.live ? html`<span class="live-dot"></span>` : html``}${statArg.delta}</span><div class="sparkline">${this.renderSparkline(statArg.spark, statArg.sparkColor)}</div></div>
|
|
473
|
+
</div>
|
|
474
|
+
`;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
public render(): TemplateResult {
|
|
478
|
+
const approvalRows = this.approvals.map((rowArg) => ({
|
|
479
|
+
cells: [
|
|
480
|
+
html`
|
|
481
|
+
<div class="identity-cell">
|
|
482
|
+
<span class="identity-avatar">${rowArg[0].slice(0, 2).toUpperCase()}</span>
|
|
483
|
+
<div>
|
|
484
|
+
<div class="identity-primary">${rowArg[0]}</div>
|
|
485
|
+
<div class="identity-secondary">${rowArg[1]}</div>
|
|
486
|
+
</div>
|
|
487
|
+
</div>
|
|
488
|
+
`,
|
|
489
|
+
rowArg[2],
|
|
490
|
+
rowArg[3],
|
|
491
|
+
html`<idp-badge variant=${rowArg[5] as any}>${rowArg[4]}</idp-badge>`,
|
|
492
|
+
],
|
|
493
|
+
}));
|
|
494
|
+
|
|
495
|
+
return html`
|
|
496
|
+
<div class="dash">
|
|
497
|
+
<div class="chrome">
|
|
498
|
+
<span class="tdot red"></span><span class="tdot yellow"></span><span class="tdot green"></span>
|
|
499
|
+
<span class="url"><idp-icon name="lock" size="11" style="color: var(--idp-ok)"></idp-icon> console.idp.global / dashboard</span>
|
|
500
|
+
<span class="status"><span class="live-dot"></span>eu-west-1 - 38ms</span>
|
|
501
|
+
</div>
|
|
502
|
+
<div class="appbar">
|
|
503
|
+
<div class="appbar-left">
|
|
504
|
+
<span class="logo">idp<span class="logo-dot"></span>global</span>
|
|
505
|
+
<span class="divider"></span>
|
|
506
|
+
<span class="org"><span class="avatar-sm">L</span>Lossless GmbH</span>
|
|
507
|
+
</div>
|
|
508
|
+
<div class="appbar-right">
|
|
509
|
+
<span class="search">Search identities, devices <span class="kbd">Cmd+K</span></span>
|
|
510
|
+
<span class="user-avatar">AM</span>
|
|
511
|
+
</div>
|
|
512
|
+
</div>
|
|
513
|
+
<div class="shell">
|
|
514
|
+
<aside>
|
|
515
|
+
<div class="side-label">Workspace</div>
|
|
516
|
+
${this.workspaceNav.map((itemArg, indexArg) => html`
|
|
517
|
+
<span class="side-nav ${indexArg === 0 ? 'active' : ''}"><span class="nav-icon"><idp-icon name=${itemArg[1] as any} size="13"></idp-icon></span>${itemArg[0]}</span>
|
|
518
|
+
`)}
|
|
519
|
+
<div class="side-label">On-chain</div>
|
|
520
|
+
${this.chainNav.map((itemArg) => html`<span class="side-nav"><span class="nav-icon"><idp-icon name=${itemArg[1] as any} size="13"></idp-icon></span>${itemArg[0]}</span>`)}
|
|
521
|
+
</aside>
|
|
522
|
+
<main>
|
|
523
|
+
<div class="head">
|
|
524
|
+
<div>
|
|
525
|
+
<h3>Overview</h3>
|
|
526
|
+
<div class="sub">Identity activity across <span style="color: var(--idp-accent-hover); font-family: var(--idp-mono)">@lossless</span> - last 7 days</div>
|
|
527
|
+
</div>
|
|
528
|
+
<div class="actions"><idp-button variant="ghost" size="sm">Export</idp-button><idp-button variant="accent" size="sm">New identity</idp-button></div>
|
|
529
|
+
</div>
|
|
530
|
+
<div class="stats">
|
|
531
|
+
${this.stats.map((statArg) => this.renderStat(statArg))}
|
|
532
|
+
</div>
|
|
533
|
+
<div class="grid">
|
|
534
|
+
<idp-data-table
|
|
535
|
+
title="Recent approvals"
|
|
536
|
+
badge="142 total"
|
|
537
|
+
selected-tab="all"
|
|
538
|
+
.tabs=${[
|
|
539
|
+
{ id: 'all', label: 'All' },
|
|
540
|
+
{ id: 'pending', label: 'Pending' },
|
|
541
|
+
{ id: 'denied', label: 'Denied' },
|
|
542
|
+
]}
|
|
543
|
+
.columns=${[
|
|
544
|
+
{ label: 'User' },
|
|
545
|
+
{ label: 'Action' },
|
|
546
|
+
{ label: 'Device', mono: true, hideBelow: 'mobile' },
|
|
547
|
+
{ label: 'Status' },
|
|
548
|
+
]}
|
|
549
|
+
.rows=${approvalRows}
|
|
550
|
+
></idp-data-table>
|
|
551
|
+
<section class="card">
|
|
552
|
+
<div class="card-head"><span class="card-title">Cardano feed</span><idp-badge variant="accent"><span class="live-dot"></span>live</idp-badge></div>
|
|
553
|
+
${this.feed.map((itemArg) => html`
|
|
554
|
+
<div class="feed-item"><span class="feed-dot ${itemArg[3]}"></span><div class="feed-text"><strong>${itemArg[0]}</strong> - ${itemArg[1]}</div><span class="feed-meta">${itemArg[2]}</span></div>
|
|
555
|
+
`)}
|
|
556
|
+
</section>
|
|
557
|
+
</div>
|
|
558
|
+
</main>
|
|
559
|
+
</div>
|
|
560
|
+
<div class="bottom"><span><span class="live-dot"></span>API - 38ms</span><span class="divider"></span><span>v3.81.0</span><span class="grow"></span><span>block #9 841 222 - confirmed</span></div>
|
|
561
|
+
</div>
|
|
562
|
+
`;
|
|
563
|
+
}
|
|
564
|
+
}
|