@idp.global/catalog 1.2.1 → 2.1.0

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 (70) hide show
  1. package/changelog.md +21 -0
  2. package/dist_bundle/bundle.js +4428 -1496
  3. package/dist_ts_web/00_commitinfo_data.js +1 -1
  4. package/dist_ts_web/elements/idp-admin-overview.d.ts +28 -0
  5. package/dist_ts_web/elements/idp-admin-overview.js +460 -0
  6. package/dist_ts_web/elements/idp-admin-shared.d.ts +18 -0
  7. package/dist_ts_web/elements/idp-admin-shared.js +404 -0
  8. package/dist_ts_web/elements/idp-admin-shell.d.ts +96 -11
  9. package/dist_ts_web/elements/idp-admin-shell.js +442 -816
  10. package/dist_ts_web/elements/idp-admin-sidebar.d.ts +42 -0
  11. package/dist_ts_web/elements/idp-admin-sidebar.js +700 -0
  12. package/dist_ts_web/elements/idp-app-pair.d.ts +19 -0
  13. package/dist_ts_web/elements/idp-app-pair.js +187 -0
  14. package/dist_ts_web/elements/idp-auth-card.d.ts +17 -0
  15. package/dist_ts_web/elements/idp-auth-card.js +180 -0
  16. package/dist_ts_web/elements/idp-avatar.d.ts +17 -0
  17. package/dist_ts_web/elements/idp-avatar.js +151 -0
  18. package/dist_ts_web/elements/idp-badge.d.ts +2 -0
  19. package/dist_ts_web/elements/idp-badge.js +12 -3
  20. package/dist_ts_web/elements/idp-brand-mark.d.ts +16 -0
  21. package/dist_ts_web/elements/idp-brand-mark.js +139 -0
  22. package/dist_ts_web/elements/idp-button.d.ts +3 -0
  23. package/dist_ts_web/elements/idp-button.js +47 -3
  24. package/dist_ts_web/elements/idp-consent-card.d.ts +34 -0
  25. package/dist_ts_web/elements/idp-consent-card.js +217 -0
  26. package/dist_ts_web/elements/idp-delegation-section.d.ts +59 -0
  27. package/dist_ts_web/elements/idp-delegation-section.js +609 -0
  28. package/dist_ts_web/elements/idp-form-submit.d.ts +2 -1
  29. package/dist_ts_web/elements/idp-form-submit.js +11 -2
  30. package/dist_ts_web/elements/idp-form.js +2 -2
  31. package/dist_ts_web/elements/idp-input.d.ts +4 -0
  32. package/dist_ts_web/elements/idp-input.js +68 -15
  33. package/dist_ts_web/elements/idp-option-row.d.ts +25 -0
  34. package/dist_ts_web/elements/idp-option-row.js +267 -0
  35. package/dist_ts_web/elements/idp-otp-input.d.ts +32 -0
  36. package/dist_ts_web/elements/idp-otp-input.js +274 -0
  37. package/dist_ts_web/elements/idp-progress-bar.d.ts +14 -0
  38. package/dist_ts_web/elements/idp-progress-bar.js +127 -0
  39. package/dist_ts_web/elements/idp-signed-in-pill.d.ts +15 -0
  40. package/dist_ts_web/elements/idp-signed-in-pill.js +113 -0
  41. package/dist_ts_web/elements/idp-spinner.d.ts +13 -0
  42. package/dist_ts_web/elements/idp-spinner.js +109 -0
  43. package/dist_ts_web/elements/idp-status-icon.d.ts +18 -0
  44. package/dist_ts_web/elements/idp-status-icon.js +136 -0
  45. package/dist_ts_web/elements/index.d.ts +15 -0
  46. package/dist_ts_web/elements/index.js +16 -1
  47. package/package.json +1 -1
  48. package/ts_web/00_commitinfo_data.ts +1 -1
  49. package/ts_web/elements/idp-admin-overview.ts +388 -0
  50. package/ts_web/elements/idp-admin-shared.ts +419 -0
  51. package/ts_web/elements/idp-admin-shell.ts +514 -871
  52. package/ts_web/elements/idp-admin-sidebar.ts +646 -0
  53. package/ts_web/elements/idp-app-pair.ts +120 -0
  54. package/ts_web/elements/idp-auth-card.ts +113 -0
  55. package/ts_web/elements/idp-avatar.ts +84 -0
  56. package/ts_web/elements/idp-badge.ts +5 -1
  57. package/ts_web/elements/idp-brand-mark.ts +76 -0
  58. package/ts_web/elements/idp-button.ts +36 -1
  59. package/ts_web/elements/idp-consent-card.ts +146 -0
  60. package/ts_web/elements/idp-delegation-section.ts +576 -0
  61. package/ts_web/elements/idp-form-submit.ts +5 -1
  62. package/ts_web/elements/idp-form.ts +1 -1
  63. package/ts_web/elements/idp-input.ts +58 -13
  64. package/ts_web/elements/idp-option-row.ts +184 -0
  65. package/ts_web/elements/idp-otp-input.ts +204 -0
  66. package/ts_web/elements/idp-progress-bar.ts +69 -0
  67. package/ts_web/elements/idp-signed-in-pill.ts +55 -0
  68. package/ts_web/elements/idp-spinner.ts +56 -0
  69. package/ts_web/elements/idp-status-icon.ts +76 -0
  70. package/ts_web/elements/index.ts +15 -0
@@ -0,0 +1,700 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import { DeesElement, html, property, state, customElement, css } from '@design.estate/dees-element';
36
+ import { idpElementStyles } from './tokens.js';
37
+ import { idpAdminSharedStyles } from './idp-admin-shared.js';
38
+ import './idp-icon.js';
39
+ import './idp-badge.js';
40
+ import './idp-avatar.js';
41
+ let IdpAdminSidebar = (() => {
42
+ let _classDecorators = [customElement('idp-admin-sidebar')];
43
+ let _classDescriptor;
44
+ let _classExtraInitializers = [];
45
+ let _classThis;
46
+ let _classSuper = DeesElement;
47
+ let _page_decorators;
48
+ let _page_initializers = [];
49
+ let _page_extraInitializers = [];
50
+ let _user_decorators;
51
+ let _user_initializers = [];
52
+ let _user_extraInitializers = [];
53
+ let _accounts_decorators;
54
+ let _accounts_initializers = [];
55
+ let _accounts_extraInitializers = [];
56
+ let _orgs_decorators;
57
+ let _orgs_initializers = [];
58
+ let _orgs_extraInitializers = [];
59
+ let _selectedOrgId_decorators;
60
+ let _selectedOrgId_initializers = [];
61
+ let _selectedOrgId_extraInitializers = [];
62
+ let _globalAdmin_decorators;
63
+ let _globalAdmin_initializers = [];
64
+ let _globalAdmin_extraInitializers = [];
65
+ let _sessionCount_decorators;
66
+ let _sessionCount_initializers = [];
67
+ let _sessionCount_extraInitializers = [];
68
+ let _orgMenuOpen_decorators;
69
+ let _orgMenuOpen_initializers = [];
70
+ let _orgMenuOpen_extraInitializers = [];
71
+ let _userMenuOpen_decorators;
72
+ let _userMenuOpen_initializers = [];
73
+ let _userMenuOpen_extraInitializers = [];
74
+ var IdpAdminSidebar = class extends _classSuper {
75
+ static { _classThis = this; }
76
+ static {
77
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
78
+ _page_decorators = [property({ type: String })];
79
+ _user_decorators = [property({ type: Object })];
80
+ _accounts_decorators = [property({ type: Array })];
81
+ _orgs_decorators = [property({ type: Array })];
82
+ _selectedOrgId_decorators = [property({ type: String, attribute: 'selected-org-id' })];
83
+ _globalAdmin_decorators = [property({ type: Boolean, attribute: 'global-admin', reflect: true })];
84
+ _sessionCount_decorators = [property({ type: Number, attribute: 'session-count' })];
85
+ _orgMenuOpen_decorators = [state()];
86
+ _userMenuOpen_decorators = [state()];
87
+ __esDecorate(this, null, _page_decorators, { kind: "accessor", name: "page", static: false, private: false, access: { has: obj => "page" in obj, get: obj => obj.page, set: (obj, value) => { obj.page = value; } }, metadata: _metadata }, _page_initializers, _page_extraInitializers);
88
+ __esDecorate(this, null, _user_decorators, { kind: "accessor", name: "user", static: false, private: false, access: { has: obj => "user" in obj, get: obj => obj.user, set: (obj, value) => { obj.user = value; } }, metadata: _metadata }, _user_initializers, _user_extraInitializers);
89
+ __esDecorate(this, null, _accounts_decorators, { kind: "accessor", name: "accounts", static: false, private: false, access: { has: obj => "accounts" in obj, get: obj => obj.accounts, set: (obj, value) => { obj.accounts = value; } }, metadata: _metadata }, _accounts_initializers, _accounts_extraInitializers);
90
+ __esDecorate(this, null, _orgs_decorators, { kind: "accessor", name: "orgs", static: false, private: false, access: { has: obj => "orgs" in obj, get: obj => obj.orgs, set: (obj, value) => { obj.orgs = value; } }, metadata: _metadata }, _orgs_initializers, _orgs_extraInitializers);
91
+ __esDecorate(this, null, _selectedOrgId_decorators, { kind: "accessor", name: "selectedOrgId", static: false, private: false, access: { has: obj => "selectedOrgId" in obj, get: obj => obj.selectedOrgId, set: (obj, value) => { obj.selectedOrgId = value; } }, metadata: _metadata }, _selectedOrgId_initializers, _selectedOrgId_extraInitializers);
92
+ __esDecorate(this, null, _globalAdmin_decorators, { kind: "accessor", name: "globalAdmin", static: false, private: false, access: { has: obj => "globalAdmin" in obj, get: obj => obj.globalAdmin, set: (obj, value) => { obj.globalAdmin = value; } }, metadata: _metadata }, _globalAdmin_initializers, _globalAdmin_extraInitializers);
93
+ __esDecorate(this, null, _sessionCount_decorators, { kind: "accessor", name: "sessionCount", static: false, private: false, access: { has: obj => "sessionCount" in obj, get: obj => obj.sessionCount, set: (obj, value) => { obj.sessionCount = value; } }, metadata: _metadata }, _sessionCount_initializers, _sessionCount_extraInitializers);
94
+ __esDecorate(this, null, _orgMenuOpen_decorators, { kind: "accessor", name: "orgMenuOpen", static: false, private: false, access: { has: obj => "orgMenuOpen" in obj, get: obj => obj.orgMenuOpen, set: (obj, value) => { obj.orgMenuOpen = value; } }, metadata: _metadata }, _orgMenuOpen_initializers, _orgMenuOpen_extraInitializers);
95
+ __esDecorate(this, null, _userMenuOpen_decorators, { kind: "accessor", name: "userMenuOpen", static: false, private: false, access: { has: obj => "userMenuOpen" in obj, get: obj => obj.userMenuOpen, set: (obj, value) => { obj.userMenuOpen = value; } }, metadata: _metadata }, _userMenuOpen_initializers, _userMenuOpen_extraInitializers);
96
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
97
+ IdpAdminSidebar = _classThis = _classDescriptor.value;
98
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
99
+ }
100
+ static demo = () => html `
101
+ <div style="height: 520px; width: 220px; border: 1px solid var(--sh-border, #e8e8ed); overflow: hidden;">
102
+ <idp-admin-sidebar
103
+ global-admin
104
+ page="overview"
105
+ selected-org-id="org_foss"
106
+ session-count="3"
107
+ .user=${{ name: 'Alex Mercer', email: 'alex@lossless.com' }}
108
+ .accounts=${[{ name: 'Alex Mercer', email: 'alex.mercer@gmail.com' }]}
109
+ .orgs=${[
110
+ { id: 'org_foss', name: 'Lossless GmbH', slug: 'lossless', myRole: 'owner' },
111
+ { id: 'org_task', name: 'Task VC', slug: 'task', myRole: 'admin' },
112
+ ]}
113
+ ></idp-admin-sidebar>
114
+ </div>
115
+ `;
116
+ static demoGroups = ['idp.global v5 composed surfaces'];
117
+ static styles = [
118
+ ...idpElementStyles,
119
+ idpAdminSharedStyles,
120
+ css `
121
+ :host {
122
+ display: block;
123
+ height: 100%;
124
+ min-height: 0;
125
+ }
126
+ .sidebar {
127
+ height: 100%;
128
+ min-height: 0;
129
+ display: flex;
130
+ flex-direction: column;
131
+ overflow: hidden;
132
+ border-right: 1px solid var(--idp-border);
133
+ background: var(--idp-bg);
134
+ }
135
+ .logo-block {
136
+ padding: 14px 16px 10px;
137
+ border-bottom: 1px solid var(--idp-border);
138
+ }
139
+ .logo {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 8px;
143
+ }
144
+ .logo-icon {
145
+ width: 26px;
146
+ height: 26px;
147
+ display: flex;
148
+ align-items: center;
149
+ justify-content: center;
150
+ flex-shrink: 0;
151
+ border-radius: 7px;
152
+ background: var(--idp-primary);
153
+ color: var(--idp-primary-fg);
154
+ }
155
+ .logo-text {
156
+ color: var(--idp-fg);
157
+ font-size: 13px;
158
+ font-weight: 700;
159
+ letter-spacing: -0.3px;
160
+ }
161
+ .nav-wrap {
162
+ flex: 1;
163
+ min-height: 0;
164
+ overflow: auto;
165
+ padding: 10px 8px;
166
+ }
167
+ .nav-section {
168
+ margin-bottom: 20px;
169
+ }
170
+ .nav-title {
171
+ padding: 0 8px;
172
+ margin-bottom: 4px;
173
+ color: var(--idp-muted-fg);
174
+ font-size: 10px;
175
+ font-weight: 600;
176
+ letter-spacing: 0.8px;
177
+ text-transform: uppercase;
178
+ }
179
+ .nav-list {
180
+ display: grid;
181
+ }
182
+ .nav-item,
183
+ .org-switch {
184
+ border: 0;
185
+ font-family: inherit;
186
+ }
187
+ .nav-item {
188
+ width: 100%;
189
+ display: flex;
190
+ align-items: center;
191
+ gap: 8px;
192
+ padding: 6px 8px;
193
+ border-radius: 7px;
194
+ background: transparent;
195
+ color: var(--idp-muted-fg);
196
+ font-size: 13px;
197
+ font-weight: 400;
198
+ text-align: left;
199
+ }
200
+ .nav-item.active {
201
+ background: var(--idp-muted);
202
+ color: var(--idp-fg);
203
+ font-weight: 500;
204
+ }
205
+ .nav-item idp-icon {
206
+ color: currentColor;
207
+ }
208
+ .nav-item.active idp-icon {
209
+ color: var(--idp-accent);
210
+ }
211
+ .org-switch-wrap {
212
+ position: relative;
213
+ margin-bottom: 2px;
214
+ }
215
+ .org-switch {
216
+ width: 100%;
217
+ display: flex;
218
+ align-items: center;
219
+ gap: 8px;
220
+ padding: 6px 8px;
221
+ border-radius: 7px;
222
+ background: transparent;
223
+ color: var(--idp-muted-fg);
224
+ cursor: pointer;
225
+ }
226
+ .org-switch:hover {
227
+ background: var(--idp-muted);
228
+ }
229
+ .org-switch.open {
230
+ background: var(--idp-muted);
231
+ }
232
+ .org-switch.open .org-name {
233
+ color: var(--idp-accent);
234
+ }
235
+ .org-switch.open idp-icon {
236
+ transform: rotate(180deg);
237
+ }
238
+ .org-menu {
239
+ position: absolute;
240
+ top: calc(100% + 4px);
241
+ left: 0;
242
+ right: 0;
243
+ z-index: 40;
244
+ overflow: hidden;
245
+ border: 1px solid var(--idp-border);
246
+ border-radius: 10px;
247
+ background: var(--idp-card);
248
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.1);
249
+ }
250
+ .org-menu-title {
251
+ padding: 6px 8px 3px;
252
+ color: var(--idp-muted-fg);
253
+ font-size: 10px;
254
+ font-weight: 600;
255
+ letter-spacing: 0.7px;
256
+ text-transform: uppercase;
257
+ }
258
+ .org-menu-item,
259
+ .org-create {
260
+ width: 100%;
261
+ display: flex;
262
+ align-items: center;
263
+ gap: 8px;
264
+ border: 0;
265
+ background: transparent;
266
+ font-family: inherit;
267
+ text-align: left;
268
+ }
269
+ .org-menu-item {
270
+ padding: 6px 8px;
271
+ cursor: pointer;
272
+ }
273
+ .org-menu-item.selected {
274
+ background: var(--idp-accent-soft);
275
+ }
276
+ .org-menu-item .org-avatar {
277
+ width: 20px;
278
+ height: 20px;
279
+ font-size: 7px;
280
+ }
281
+ .org-menu-name {
282
+ overflow: hidden;
283
+ color: var(--idp-fg);
284
+ font-size: 12px;
285
+ font-weight: 400;
286
+ text-overflow: ellipsis;
287
+ white-space: nowrap;
288
+ }
289
+ .org-menu-item.selected .org-menu-name {
290
+ color: var(--idp-accent);
291
+ }
292
+ .org-menu-role {
293
+ color: var(--idp-muted-fg);
294
+ font-size: 10px;
295
+ }
296
+ .org-menu-divider {
297
+ height: 1px;
298
+ margin: 3px 0;
299
+ background: var(--idp-border);
300
+ }
301
+ .org-create {
302
+ padding: 6px 8px 8px;
303
+ color: var(--idp-muted-fg);
304
+ cursor: pointer;
305
+ font-size: 12px;
306
+ }
307
+ .org-create-icon {
308
+ width: 20px;
309
+ height: 20px;
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ flex-shrink: 0;
314
+ border: 1.5px dashed var(--idp-border);
315
+ border-radius: 5px;
316
+ }
317
+ .org-name {
318
+ flex: 1;
319
+ min-width: 0;
320
+ overflow: hidden;
321
+ color: var(--idp-muted-fg);
322
+ font-size: 13px;
323
+ font-weight: 400;
324
+ text-align: left;
325
+ text-overflow: ellipsis;
326
+ white-space: nowrap;
327
+ }
328
+ .user-footer {
329
+ position: relative;
330
+ padding: 8px;
331
+ border-top: 1px solid var(--idp-border);
332
+ }
333
+ .user-trigger {
334
+ display: flex;
335
+ align-items: center;
336
+ gap: 9px;
337
+ width: 100%;
338
+ padding: 6px 8px;
339
+ border: none;
340
+ border-radius: 8px;
341
+ background: transparent;
342
+ color: var(--idp-muted-fg);
343
+ font-family: var(--idp-font);
344
+ text-align: left;
345
+ cursor: pointer;
346
+ transition: background 120ms ease;
347
+ }
348
+ .user-trigger:hover,
349
+ .user-trigger.open {
350
+ background: var(--idp-muted);
351
+ }
352
+ .user-menu {
353
+ position: absolute;
354
+ bottom: calc(100% + 2px);
355
+ left: 8px;
356
+ right: 8px;
357
+ z-index: 40;
358
+ padding: 4px;
359
+ background: var(--idp-card);
360
+ border: 1px solid var(--idp-border);
361
+ border-radius: var(--idp-radius);
362
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
363
+ overflow: hidden;
364
+ }
365
+ .user-menu-identity {
366
+ display: flex;
367
+ align-items: center;
368
+ gap: 9px;
369
+ padding: 8px 10px 9px;
370
+ margin-bottom: 4px;
371
+ border-bottom: 1px solid var(--idp-border);
372
+ }
373
+ .user-menu-item {
374
+ display: flex;
375
+ align-items: center;
376
+ gap: 9px;
377
+ width: 100%;
378
+ padding: 7px 10px;
379
+ border: none;
380
+ border-radius: 7px;
381
+ background: transparent;
382
+ color: var(--idp-fg);
383
+ font-family: var(--idp-font);
384
+ font-size: 12.5px;
385
+ text-align: left;
386
+ cursor: pointer;
387
+ transition: background 100ms ease;
388
+ }
389
+ .user-menu-item idp-icon {
390
+ color: var(--idp-muted-fg);
391
+ flex-shrink: 0;
392
+ }
393
+ .user-menu-item span {
394
+ flex: 1;
395
+ }
396
+ .user-menu-item:hover {
397
+ background: var(--idp-muted);
398
+ }
399
+ .user-menu-item.destructive {
400
+ color: var(--idp-destructive);
401
+ }
402
+ .user-menu-item.destructive idp-icon {
403
+ color: var(--idp-destructive);
404
+ }
405
+ .user-menu-item.destructive:hover {
406
+ background: var(--idp-error-bg);
407
+ }
408
+ .user-menu-item.account .user-meta {
409
+ flex: 1;
410
+ }
411
+ .user-menu-hint {
412
+ flex: 0 0 auto !important;
413
+ font-size: 10.5px;
414
+ color: var(--idp-muted-fg);
415
+ }
416
+ .user-menu-divider {
417
+ height: 1px;
418
+ margin: 4px 0;
419
+ background: var(--idp-border);
420
+ }
421
+ .user-menu-title {
422
+ padding: 4px 10px 2px;
423
+ font-size: 10px;
424
+ font-weight: 600;
425
+ letter-spacing: 0.7px;
426
+ text-transform: uppercase;
427
+ }
428
+ .user-menu-title,
429
+ .user-email {
430
+ color: var(--idp-muted-fg);
431
+ }
432
+ .user-avatar {
433
+ display: flex;
434
+ align-items: center;
435
+ justify-content: center;
436
+ flex-shrink: 0;
437
+ width: 26px;
438
+ height: 26px;
439
+ border-radius: 50%;
440
+ background: oklch(0.85 0.08 240);
441
+ color: oklch(0.3 0.08 240);
442
+ font-family: var(--idp-mono);
443
+ font-size: 9px;
444
+ font-weight: 700;
445
+ }
446
+ .user-meta {
447
+ flex: 1;
448
+ min-width: 0;
449
+ }
450
+ .user-name,
451
+ .user-email {
452
+ overflow: hidden;
453
+ text-overflow: ellipsis;
454
+ white-space: nowrap;
455
+ }
456
+ .user-name {
457
+ color: var(--idp-fg);
458
+ font-size: 12px;
459
+ font-weight: 500;
460
+ }
461
+ .user-email {
462
+ font-size: 10px;
463
+ }
464
+ `,
465
+ ];
466
+ #page_accessor_storage = __runInitializers(this, _page_initializers, 'overview');
467
+ get page() { return this.#page_accessor_storage; }
468
+ set page(value) { this.#page_accessor_storage = value; }
469
+ #user_accessor_storage = (__runInitializers(this, _page_extraInitializers), __runInitializers(this, _user_initializers, {
470
+ name: '',
471
+ email: '',
472
+ }));
473
+ get user() { return this.#user_accessor_storage; }
474
+ set user(value) { this.#user_accessor_storage = value; }
475
+ #accounts_accessor_storage = (__runInitializers(this, _user_extraInitializers), __runInitializers(this, _accounts_initializers, []));
476
+ get accounts() { return this.#accounts_accessor_storage; }
477
+ set accounts(value) { this.#accounts_accessor_storage = value; }
478
+ #orgs_accessor_storage = (__runInitializers(this, _accounts_extraInitializers), __runInitializers(this, _orgs_initializers, []));
479
+ get orgs() { return this.#orgs_accessor_storage; }
480
+ set orgs(value) { this.#orgs_accessor_storage = value; }
481
+ #selectedOrgId_accessor_storage = (__runInitializers(this, _orgs_extraInitializers), __runInitializers(this, _selectedOrgId_initializers, ''));
482
+ get selectedOrgId() { return this.#selectedOrgId_accessor_storage; }
483
+ set selectedOrgId(value) { this.#selectedOrgId_accessor_storage = value; }
484
+ #globalAdmin_accessor_storage = (__runInitializers(this, _selectedOrgId_extraInitializers), __runInitializers(this, _globalAdmin_initializers, false));
485
+ get globalAdmin() { return this.#globalAdmin_accessor_storage; }
486
+ set globalAdmin(value) { this.#globalAdmin_accessor_storage = value; }
487
+ #sessionCount_accessor_storage = (__runInitializers(this, _globalAdmin_extraInitializers), __runInitializers(this, _sessionCount_initializers, 0));
488
+ get sessionCount() { return this.#sessionCount_accessor_storage; }
489
+ set sessionCount(value) { this.#sessionCount_accessor_storage = value; }
490
+ #orgMenuOpen_accessor_storage = (__runInitializers(this, _sessionCount_extraInitializers), __runInitializers(this, _orgMenuOpen_initializers, false));
491
+ get orgMenuOpen() { return this.#orgMenuOpen_accessor_storage; }
492
+ set orgMenuOpen(value) { this.#orgMenuOpen_accessor_storage = value; }
493
+ #userMenuOpen_accessor_storage = (__runInitializers(this, _orgMenuOpen_extraInitializers), __runInitializers(this, _userMenuOpen_initializers, false));
494
+ get userMenuOpen() { return this.#userMenuOpen_accessor_storage; }
495
+ set userMenuOpen(value) { this.#userMenuOpen_accessor_storage = value; }
496
+ workspaceNav = (__runInitializers(this, _userMenuOpen_extraInitializers), [
497
+ { id: 'overview', label: 'Overview', icon: 'grid' },
498
+ ]);
499
+ accountNav = [
500
+ { id: 'profile', label: 'Profile', icon: 'user' },
501
+ { id: 'security', label: 'Security', icon: 'shield' },
502
+ { id: 'sessions', label: 'Sessions & Devices', icon: 'monitor' },
503
+ { id: 'apps', label: 'Connected Apps', icon: 'grid' },
504
+ ];
505
+ orgNav = [
506
+ { id: 'org-general', label: 'General', icon: 'building' },
507
+ { id: 'org-settings', label: 'Settings', icon: 'settings' },
508
+ { id: 'org-members', label: 'Members', icon: 'users' },
509
+ { id: 'org-apps', label: 'OAuth Apps', icon: 'box' },
510
+ ];
511
+ supportNav = [
512
+ { id: 'support', label: 'Support', icon: 'shield' },
513
+ ];
514
+ adminNav = [
515
+ { id: 'ga-users', label: 'All Users', icon: 'users' },
516
+ { id: 'ga-orgs', label: 'All Organisations', icon: 'building' },
517
+ { id: 'ga-apps', label: 'Platform Apps', icon: 'globe' },
518
+ ];
519
+ get safeOrgs() {
520
+ return Array.isArray(this.orgs) ? this.orgs.filter(Boolean) : [];
521
+ }
522
+ get currentOrg() {
523
+ const orgs = this.safeOrgs;
524
+ return orgs.find((orgArg) => orgArg.id === this.selectedOrgId) || orgs[0] || {
525
+ id: '',
526
+ name: 'No organisation',
527
+ slug: '',
528
+ myRole: '',
529
+ };
530
+ }
531
+ get userInitials() {
532
+ if (this.user?.initials) {
533
+ return this.user.initials;
534
+ }
535
+ const source = this.user?.name || this.user?.email || '?';
536
+ return source
537
+ .split(/\s+|@/)
538
+ .filter(Boolean)
539
+ .map((partArg) => partArg[0])
540
+ .slice(0, 2)
541
+ .join('')
542
+ .toUpperCase();
543
+ }
544
+ dispatchSidebarEvent(eventNameArg, detailArg) {
545
+ this.dispatchEvent(new CustomEvent(eventNameArg, {
546
+ detail: detailArg,
547
+ bubbles: true,
548
+ composed: true,
549
+ }));
550
+ }
551
+ setPage(pageArg) {
552
+ this.page = pageArg;
553
+ this.orgMenuOpen = false;
554
+ this.userMenuOpen = false;
555
+ this.dispatchSidebarEvent('idp-admin-navigate', { page: pageArg });
556
+ }
557
+ selectOrg(orgIdArg) {
558
+ this.selectedOrgId = orgIdArg;
559
+ this.orgMenuOpen = false;
560
+ this.page = 'org-general';
561
+ this.dispatchSidebarEvent('idp-admin-org-select', {
562
+ orgId: orgIdArg,
563
+ org: this.safeOrgs.find((orgArg) => orgArg.id === orgIdArg) || null,
564
+ });
565
+ }
566
+ requestOrgCreate() {
567
+ this.orgMenuOpen = false;
568
+ this.dispatchSidebarEvent('idp-admin-org-create-request', {});
569
+ }
570
+ requestLogout() {
571
+ this.userMenuOpen = false;
572
+ this.dispatchSidebarEvent('idp-admin-logout-request', {});
573
+ }
574
+ switchAccount(accountArg) {
575
+ this.userMenuOpen = false;
576
+ this.dispatchSidebarEvent('idp-admin-account-switch', { account: accountArg });
577
+ }
578
+ requestAddAccount() {
579
+ this.userMenuOpen = false;
580
+ this.dispatchEvent(new CustomEvent('idp-admin-account-add', { bubbles: true, composed: true }));
581
+ }
582
+ renderNavGroup(items, active = '') {
583
+ return html `
584
+ <div class="nav-list">
585
+ ${items.map((item) => html `
586
+ <button class="nav-item ${item.id === active ? 'active' : ''}" @click=${() => this.setPage(item.id)}>
587
+ <idp-icon name=${item.icon} size="14"></idp-icon>
588
+ ${item.label}
589
+ ${item.badge ? html `<idp-badge variant="accent" style="margin-left:auto">${item.badge}</idp-badge>` : html ``}
590
+ </button>
591
+ `)}
592
+ </div>
593
+ `;
594
+ }
595
+ renderUserMenu() {
596
+ const otherAccounts = (this.accounts || []).filter((accountArg) => accountArg.email !== this.user?.email);
597
+ return html `
598
+ <div class="user-menu" role="menu">
599
+ <div class="user-menu-identity">
600
+ <idp-avatar name=${this.user?.name || this.user?.email || '?'} size="32"></idp-avatar>
601
+ <div class="user-meta"><div class="user-name">${this.user?.name || 'Unknown User'}</div><div class="user-email">${this.user?.email || 'No email'}</div></div>
602
+ ${this.globalAdmin ? html `<idp-badge variant="accent">Admin</idp-badge>` : html ``}
603
+ </div>
604
+ <button class="user-menu-item" @click=${() => this.setPage('profile')}>
605
+ <idp-icon name="user" size="14"></idp-icon><span>Profile</span>
606
+ </button>
607
+ <button class="user-menu-item" @click=${() => this.setPage('security')}>
608
+ <idp-icon name="shield" size="14"></idp-icon><span>Security</span>
609
+ </button>
610
+ <button class="user-menu-item" @click=${() => this.setPage('sessions')}>
611
+ <idp-icon name="monitor" size="14"></idp-icon><span>Sessions &amp; Devices</span>
612
+ ${this.sessionCount ? html `<span class="user-menu-hint">${this.sessionCount} active</span>` : html ``}
613
+ </button>
614
+ ${otherAccounts.length
615
+ ? html `
616
+ <div class="user-menu-divider"></div>
617
+ <div class="user-menu-title">Switch account</div>
618
+ ${otherAccounts.map((accountArg) => html `
619
+ <button class="user-menu-item account" @click=${() => this.switchAccount(accountArg)}>
620
+ <idp-avatar name=${accountArg.name || accountArg.email} size="22"></idp-avatar>
621
+ <div class="user-meta"><div class="user-name">${accountArg.name}</div><div class="user-email">${accountArg.email}</div></div>
622
+ <idp-icon name="lucide:ArrowLeftRight" size="12"></idp-icon>
623
+ </button>
624
+ `)}
625
+ <button class="user-menu-item" @click=${() => this.requestAddAccount()}>
626
+ <idp-icon name="plus" size="14"></idp-icon><span>Add account</span>
627
+ </button>
628
+ `
629
+ : html ``}
630
+ <div class="user-menu-divider"></div>
631
+ <button class="user-menu-item destructive" @click=${() => this.requestLogout()}>
632
+ <idp-icon name="logout" size="14"></idp-icon><span>Sign out</span>
633
+ </button>
634
+ </div>
635
+ `;
636
+ }
637
+ render() {
638
+ const currentOrg = this.currentOrg;
639
+ return html `
640
+ <aside class="sidebar">
641
+ <div class="logo-block">
642
+ <div class="logo">
643
+ <div class="logo-icon" aria-hidden="true">
644
+ <svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
645
+ <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
646
+ </svg>
647
+ </div>
648
+ <span class="logo-text">idp.global</span>
649
+ </div>
650
+ </div>
651
+ <div class="nav-wrap">
652
+ <div class="nav-section"><div class="nav-title">Workspace</div>${this.renderNavGroup(this.workspaceNav, this.page)}</div>
653
+ <div class="nav-section"><div class="nav-title">My Account</div>${this.renderNavGroup(this.accountNav, this.page)}</div>
654
+ <div class="nav-section">
655
+ <div class="nav-title">Organisation</div>
656
+ <div class="org-switch-wrap">
657
+ <button class="org-switch ${this.orgMenuOpen ? 'open' : ''}" @click=${() => { this.orgMenuOpen = !this.orgMenuOpen; }}>
658
+ <span class="org-avatar">${currentOrg.name.slice(0, 2).toUpperCase()}</span>
659
+ <span class="org-name">${currentOrg.name}</span>
660
+ <idp-icon name="chevron-down" size="10"></idp-icon>
661
+ </button>
662
+ ${this.orgMenuOpen ? html `
663
+ <div class="org-menu">
664
+ <div class="org-menu-title">Switch organisation</div>
665
+ ${this.safeOrgs.map((orgArg) => html `
666
+ <button class="org-menu-item ${orgArg.id === this.selectedOrgId ? 'selected' : ''}" @click=${() => this.selectOrg(orgArg.id)}>
667
+ <span class="org-avatar">${orgArg.name.slice(0, 2).toUpperCase()}</span>
668
+ <span style="flex:1;min-width:0"><span class="org-menu-name">${orgArg.name}</span><span class="org-menu-role">${orgArg.myRole || 'member'}</span></span>
669
+ ${orgArg.id === this.selectedOrgId ? html `<idp-icon name="check" size="11"></idp-icon>` : html ``}
670
+ </button>
671
+ `)}
672
+ <div class="org-menu-divider"></div>
673
+ <button class="org-create" @click=${() => this.requestOrgCreate()}><span class="org-create-icon"><idp-icon name="plus" size="9"></idp-icon></span>Create organisation</button>
674
+ </div>
675
+ ` : html ``}
676
+ </div>
677
+ ${this.renderNavGroup(this.orgNav, this.page)}
678
+ </div>
679
+ <div class="nav-section"><div class="nav-title">Support</div>${this.renderNavGroup(this.supportNav, this.page)}</div>
680
+ ${this.globalAdmin ? html `<div class="nav-section"><div class="nav-title">Global Admin</div>${this.renderNavGroup(this.adminNav, this.page)}</div>` : html ``}
681
+ </div>
682
+ <div class="user-footer">
683
+ <button class="user-trigger ${this.userMenuOpen ? 'open' : ''}" aria-haspopup="menu" aria-expanded=${this.userMenuOpen} @click=${() => { this.userMenuOpen = !this.userMenuOpen; }}>
684
+ <span class="user-avatar">${this.userInitials}</span>
685
+ <div class="user-meta"><div class="user-name">${this.user?.name || 'Unknown User'}</div><div class="user-email">${this.user?.email || 'No email'}</div></div>
686
+ <idp-icon name="lucide:ChevronsUpDown" size="13"></idp-icon>
687
+ </button>
688
+ ${this.userMenuOpen ? this.renderUserMenu() : html ``}
689
+ </div>
690
+ </aside>
691
+ `;
692
+ }
693
+ static {
694
+ __runInitializers(_classThis, _classExtraInitializers);
695
+ }
696
+ };
697
+ return IdpAdminSidebar = _classThis;
698
+ })();
699
+ export { IdpAdminSidebar };
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRwLWFkbWluLXNpZGViYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaWRwLWFkbWluLXNpZGViYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBdUIsTUFBTSw2QkFBNkIsQ0FBQztBQUMxSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0QsT0FBTyxlQUFlLENBQUM7QUFDdkIsT0FBTyxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLGlCQUFpQixDQUFDO0lBd0JaLGVBQWU7NEJBRDNCLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OytCQUFuQixTQUFRLFdBQVc7Ozs7Z0NBaVg3QyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0NBRzFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQ0FNMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO2dDQUd6QixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7eUNBR3pCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLENBQUM7dUNBR3hELFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7d0NBR3JFLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxN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