@idp.global/catalog 2.0.0 → 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.
- package/changelog.md +15 -0
- package/dist_bundle/bundle.js +4428 -1496
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/idp-admin-overview.d.ts +28 -0
- package/dist_ts_web/elements/idp-admin-overview.js +460 -0
- package/dist_ts_web/elements/idp-admin-shared.d.ts +18 -0
- package/dist_ts_web/elements/idp-admin-shared.js +404 -0
- package/dist_ts_web/elements/idp-admin-shell.d.ts +96 -11
- package/dist_ts_web/elements/idp-admin-shell.js +442 -816
- package/dist_ts_web/elements/idp-admin-sidebar.d.ts +42 -0
- package/dist_ts_web/elements/idp-admin-sidebar.js +700 -0
- package/dist_ts_web/elements/idp-app-pair.d.ts +19 -0
- package/dist_ts_web/elements/idp-app-pair.js +187 -0
- package/dist_ts_web/elements/idp-auth-card.d.ts +17 -0
- package/dist_ts_web/elements/idp-auth-card.js +180 -0
- package/dist_ts_web/elements/idp-avatar.d.ts +17 -0
- package/dist_ts_web/elements/idp-avatar.js +151 -0
- package/dist_ts_web/elements/idp-badge.d.ts +2 -0
- package/dist_ts_web/elements/idp-badge.js +12 -3
- package/dist_ts_web/elements/idp-brand-mark.d.ts +16 -0
- package/dist_ts_web/elements/idp-brand-mark.js +139 -0
- package/dist_ts_web/elements/idp-button.d.ts +3 -0
- package/dist_ts_web/elements/idp-button.js +47 -3
- package/dist_ts_web/elements/idp-consent-card.d.ts +34 -0
- package/dist_ts_web/elements/idp-consent-card.js +217 -0
- package/dist_ts_web/elements/idp-delegation-section.d.ts +59 -0
- package/dist_ts_web/elements/idp-delegation-section.js +609 -0
- package/dist_ts_web/elements/idp-form-submit.d.ts +2 -1
- package/dist_ts_web/elements/idp-form-submit.js +11 -2
- package/dist_ts_web/elements/idp-form.js +2 -2
- package/dist_ts_web/elements/idp-input.d.ts +4 -0
- package/dist_ts_web/elements/idp-input.js +68 -15
- package/dist_ts_web/elements/idp-option-row.d.ts +25 -0
- package/dist_ts_web/elements/idp-option-row.js +267 -0
- package/dist_ts_web/elements/idp-otp-input.d.ts +32 -0
- package/dist_ts_web/elements/idp-otp-input.js +274 -0
- package/dist_ts_web/elements/idp-progress-bar.d.ts +14 -0
- package/dist_ts_web/elements/idp-progress-bar.js +127 -0
- package/dist_ts_web/elements/idp-signed-in-pill.d.ts +15 -0
- package/dist_ts_web/elements/idp-signed-in-pill.js +113 -0
- package/dist_ts_web/elements/idp-spinner.d.ts +13 -0
- package/dist_ts_web/elements/idp-spinner.js +109 -0
- package/dist_ts_web/elements/idp-status-icon.d.ts +18 -0
- package/dist_ts_web/elements/idp-status-icon.js +136 -0
- package/dist_ts_web/elements/index.d.ts +15 -0
- package/dist_ts_web/elements/index.js +16 -1
- package/package.json +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/idp-admin-overview.ts +388 -0
- package/ts_web/elements/idp-admin-shared.ts +419 -0
- package/ts_web/elements/idp-admin-shell.ts +514 -871
- package/ts_web/elements/idp-admin-sidebar.ts +646 -0
- package/ts_web/elements/idp-app-pair.ts +120 -0
- package/ts_web/elements/idp-auth-card.ts +113 -0
- package/ts_web/elements/idp-avatar.ts +84 -0
- package/ts_web/elements/idp-badge.ts +5 -1
- package/ts_web/elements/idp-brand-mark.ts +76 -0
- package/ts_web/elements/idp-button.ts +36 -1
- package/ts_web/elements/idp-consent-card.ts +146 -0
- package/ts_web/elements/idp-delegation-section.ts +576 -0
- package/ts_web/elements/idp-form-submit.ts +5 -1
- package/ts_web/elements/idp-form.ts +1 -1
- package/ts_web/elements/idp-input.ts +58 -13
- package/ts_web/elements/idp-option-row.ts +184 -0
- package/ts_web/elements/idp-otp-input.ts +204 -0
- package/ts_web/elements/idp-progress-bar.ts +69 -0
- package/ts_web/elements/idp-signed-in-pill.ts +55 -0
- package/ts_web/elements/idp-spinner.ts +56 -0
- package/ts_web/elements/idp-status-icon.ts +76 -0
- package/ts_web/elements/index.ts +15 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@idp.global/catalog',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.1.0',
|
|
7
7
|
description: 'Web component catalog for idp.global, based on the v5 Apple-system design language.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUscUJBQXFCO0lBQzNCLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxxRkFBcUY7Q0FDbkcsQ0FBQSJ9
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DeesElement, type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import './idp-icon.js';
|
|
3
|
+
import './idp-badge.js';
|
|
4
|
+
import '@design.estate/dees-catalog/dist_ts_web/elements/00group-chart/dees-chart-area/index.js';
|
|
5
|
+
import type { IIdpAdminUser, IIdpAdminOrg, IIdpAdminSession, IIdpAdminActivity, IIdpAdminPassportDevice, IIdpAdminOverviewData } from './idp-admin-shell.js';
|
|
6
|
+
declare global {
|
|
7
|
+
interface HTMLElementTagNameMap {
|
|
8
|
+
'idp-admin-overview': IdpAdminOverview;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export declare class IdpAdminOverview extends DeesElement {
|
|
12
|
+
static demo: () => TemplateResult<1>;
|
|
13
|
+
static demoGroups: string[];
|
|
14
|
+
static styles: import("@design.estate/dees-element").CSSResult[];
|
|
15
|
+
accessor user: IIdpAdminUser;
|
|
16
|
+
accessor orgs: IIdpAdminOrg[];
|
|
17
|
+
accessor sessions: IIdpAdminSession[];
|
|
18
|
+
accessor activities: IIdpAdminActivity[];
|
|
19
|
+
accessor passportDevices: IIdpAdminPassportDevice[];
|
|
20
|
+
accessor dataLoading: boolean;
|
|
21
|
+
accessor dataError: string;
|
|
22
|
+
accessor overviewData: IIdpAdminOverviewData | null;
|
|
23
|
+
private navigate;
|
|
24
|
+
private renderDataState;
|
|
25
|
+
private renderInsights;
|
|
26
|
+
private renderFooterRows;
|
|
27
|
+
render(): TemplateResult;
|
|
28
|
+
}
|
|
@@ -0,0 +1,460 @@
|
|
|
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, customElement, css } from '@design.estate/dees-element';
|
|
36
|
+
import { idpElementStyles } from './tokens.js';
|
|
37
|
+
import { idpAdminSharedStyles, renderAdminKpi, renderAdminStateCard, formatAdminTimeAgo } from './idp-admin-shared.js';
|
|
38
|
+
import './idp-icon.js';
|
|
39
|
+
import './idp-badge.js';
|
|
40
|
+
import '@design.estate/dees-catalog/dist_ts_web/elements/00group-chart/dees-chart-area/index.js';
|
|
41
|
+
let IdpAdminOverview = (() => {
|
|
42
|
+
let _classDecorators = [customElement('idp-admin-overview')];
|
|
43
|
+
let _classDescriptor;
|
|
44
|
+
let _classExtraInitializers = [];
|
|
45
|
+
let _classThis;
|
|
46
|
+
let _classSuper = DeesElement;
|
|
47
|
+
let _user_decorators;
|
|
48
|
+
let _user_initializers = [];
|
|
49
|
+
let _user_extraInitializers = [];
|
|
50
|
+
let _orgs_decorators;
|
|
51
|
+
let _orgs_initializers = [];
|
|
52
|
+
let _orgs_extraInitializers = [];
|
|
53
|
+
let _sessions_decorators;
|
|
54
|
+
let _sessions_initializers = [];
|
|
55
|
+
let _sessions_extraInitializers = [];
|
|
56
|
+
let _activities_decorators;
|
|
57
|
+
let _activities_initializers = [];
|
|
58
|
+
let _activities_extraInitializers = [];
|
|
59
|
+
let _passportDevices_decorators;
|
|
60
|
+
let _passportDevices_initializers = [];
|
|
61
|
+
let _passportDevices_extraInitializers = [];
|
|
62
|
+
let _dataLoading_decorators;
|
|
63
|
+
let _dataLoading_initializers = [];
|
|
64
|
+
let _dataLoading_extraInitializers = [];
|
|
65
|
+
let _dataError_decorators;
|
|
66
|
+
let _dataError_initializers = [];
|
|
67
|
+
let _dataError_extraInitializers = [];
|
|
68
|
+
let _overviewData_decorators;
|
|
69
|
+
let _overviewData_initializers = [];
|
|
70
|
+
let _overviewData_extraInitializers = [];
|
|
71
|
+
var IdpAdminOverview = class extends _classSuper {
|
|
72
|
+
static { _classThis = this; }
|
|
73
|
+
static {
|
|
74
|
+
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
|
|
75
|
+
_user_decorators = [property({ type: Object })];
|
|
76
|
+
_orgs_decorators = [property({ type: Array })];
|
|
77
|
+
_sessions_decorators = [property({ type: Array })];
|
|
78
|
+
_activities_decorators = [property({ type: Array })];
|
|
79
|
+
_passportDevices_decorators = [property({ type: Array })];
|
|
80
|
+
_dataLoading_decorators = [property({ type: Boolean, attribute: 'data-loading', reflect: true })];
|
|
81
|
+
_dataError_decorators = [property({ type: String, attribute: 'data-error' })];
|
|
82
|
+
_overviewData_decorators = [property({ type: Object })];
|
|
83
|
+
__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);
|
|
84
|
+
__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);
|
|
85
|
+
__esDecorate(this, null, _sessions_decorators, { kind: "accessor", name: "sessions", static: false, private: false, access: { has: obj => "sessions" in obj, get: obj => obj.sessions, set: (obj, value) => { obj.sessions = value; } }, metadata: _metadata }, _sessions_initializers, _sessions_extraInitializers);
|
|
86
|
+
__esDecorate(this, null, _activities_decorators, { kind: "accessor", name: "activities", static: false, private: false, access: { has: obj => "activities" in obj, get: obj => obj.activities, set: (obj, value) => { obj.activities = value; } }, metadata: _metadata }, _activities_initializers, _activities_extraInitializers);
|
|
87
|
+
__esDecorate(this, null, _passportDevices_decorators, { kind: "accessor", name: "passportDevices", static: false, private: false, access: { has: obj => "passportDevices" in obj, get: obj => obj.passportDevices, set: (obj, value) => { obj.passportDevices = value; } }, metadata: _metadata }, _passportDevices_initializers, _passportDevices_extraInitializers);
|
|
88
|
+
__esDecorate(this, null, _dataLoading_decorators, { kind: "accessor", name: "dataLoading", static: false, private: false, access: { has: obj => "dataLoading" in obj, get: obj => obj.dataLoading, set: (obj, value) => { obj.dataLoading = value; } }, metadata: _metadata }, _dataLoading_initializers, _dataLoading_extraInitializers);
|
|
89
|
+
__esDecorate(this, null, _dataError_decorators, { kind: "accessor", name: "dataError", static: false, private: false, access: { has: obj => "dataError" in obj, get: obj => obj.dataError, set: (obj, value) => { obj.dataError = value; } }, metadata: _metadata }, _dataError_initializers, _dataError_extraInitializers);
|
|
90
|
+
__esDecorate(this, null, _overviewData_decorators, { kind: "accessor", name: "overviewData", static: false, private: false, access: { has: obj => "overviewData" in obj, get: obj => obj.overviewData, set: (obj, value) => { obj.overviewData = value; } }, metadata: _metadata }, _overviewData_initializers, _overviewData_extraInitializers);
|
|
91
|
+
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
|
|
92
|
+
IdpAdminOverview = _classThis = _classDescriptor.value;
|
|
93
|
+
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
94
|
+
}
|
|
95
|
+
static demo = () => {
|
|
96
|
+
const now = Date.now();
|
|
97
|
+
const hours = Array.from({ length: 24 }, (unused, indexArg) => indexArg);
|
|
98
|
+
return html `
|
|
99
|
+
<idp-admin-overview
|
|
100
|
+
.user=${{ name: 'Alex Mercer', email: 'alex@lossless.com' }}
|
|
101
|
+
.orgs=${[
|
|
102
|
+
{ id: 'org_foss', name: 'Lossless GmbH', slug: 'lossless', myRole: 'owner' },
|
|
103
|
+
{ id: 'org_task', name: 'Task VC', slug: 'task', myRole: 'admin' },
|
|
104
|
+
]}
|
|
105
|
+
.sessions=${[
|
|
106
|
+
{ id: 's1', deviceName: 'MacBook Pro', browser: 'Safari 18', os: 'macOS', ip: '84.132.10.4', lastActive: now - 120000, createdAt: now - 86400000 * 3, isCurrent: true },
|
|
107
|
+
{ id: 's2', deviceName: 'iPhone 15 Pro', browser: 'Safari', os: 'iOS 18', ip: '84.132.10.4', lastActive: now - 3600000, createdAt: now - 86400000 * 10, isCurrent: false },
|
|
108
|
+
]}
|
|
109
|
+
.activities=${[
|
|
110
|
+
{ id: 'a1', action: 'login_success', description: 'Signed in with passkey', timestamp: now - 300000 },
|
|
111
|
+
{ id: 'a2', action: 'app_authorized', description: 'Granted access to foss.global', timestamp: now - 7200000 },
|
|
112
|
+
]}
|
|
113
|
+
.overviewData=${{
|
|
114
|
+
chartLabel: 'Approval activity',
|
|
115
|
+
chartSeries: [
|
|
116
|
+
{ name: 'Approvals', data: hours.map((hourArg) => ({ x: now - (23 - hourArg) * 3600000, y: [22, 18, 14, 10, 8, 7, 9, 14, 22, 38, 52, 64, 71, 74, 70, 65, 58, 52, 45, 38, 32, 28, 25, 23][hourArg] })) },
|
|
117
|
+
{ name: 'OAuth grants', data: hours.map((hourArg) => ({ x: now - (23 - hourArg) * 3600000, y: [16, 12, 9, 7, 6, 5, 7, 11, 18, 30, 42, 50, 56, 58, 56, 52, 47, 41, 36, 30, 26, 23, 20, 18][hourArg] })) },
|
|
118
|
+
],
|
|
119
|
+
threats: [
|
|
120
|
+
{ severity: 'error', title: 'Repeated denied logins', meta: '5 attempts · Lagos, NG · last 1h', action: 'Block IP' },
|
|
121
|
+
{ severity: 'warning', title: 'Stale device key', meta: 'sam@ · Apple Watch · 9 mo old', action: 'Rotate' },
|
|
122
|
+
],
|
|
123
|
+
regions: [
|
|
124
|
+
{ name: 'Berlin, DE', code: 'DE', count: 1284, share: 1, kind: 'home' },
|
|
125
|
+
{ name: 'Amsterdam, NL', code: 'NL', count: 642, share: 0.5 },
|
|
126
|
+
{ name: 'Lagos, NG', code: 'NG', count: 12, share: 0.01, kind: 'risk' },
|
|
127
|
+
],
|
|
128
|
+
feed: [
|
|
129
|
+
{ tone: 'info', text: 'Identity created · did:idp:0x9b12…f034', meta: 'block #9 841 222' },
|
|
130
|
+
{ tone: 'ok', text: 'Anchor confirmed · 12 blocks deep', meta: '2m' },
|
|
131
|
+
],
|
|
132
|
+
}}
|
|
133
|
+
></idp-admin-overview>
|
|
134
|
+
`;
|
|
135
|
+
};
|
|
136
|
+
static demoGroups = ['idp.global v5 composed surfaces'];
|
|
137
|
+
static styles = [
|
|
138
|
+
...idpElementStyles,
|
|
139
|
+
idpAdminSharedStyles,
|
|
140
|
+
css `
|
|
141
|
+
:host {
|
|
142
|
+
display: block;
|
|
143
|
+
background: var(--idp-bg);
|
|
144
|
+
color: var(--idp-fg);
|
|
145
|
+
}
|
|
146
|
+
.chart-card dees-chart-area {
|
|
147
|
+
display: block;
|
|
148
|
+
min-height: 240px;
|
|
149
|
+
}
|
|
150
|
+
.region-row {
|
|
151
|
+
display: grid;
|
|
152
|
+
grid-template-columns: 28px 1fr auto;
|
|
153
|
+
gap: 12px;
|
|
154
|
+
align-items: center;
|
|
155
|
+
padding: 8px 0;
|
|
156
|
+
}
|
|
157
|
+
.region-code {
|
|
158
|
+
font-family: var(--idp-mono);
|
|
159
|
+
font-size: 10px;
|
|
160
|
+
font-weight: 700;
|
|
161
|
+
text-align: center;
|
|
162
|
+
padding: 2px 0;
|
|
163
|
+
border: 1px solid var(--idp-border);
|
|
164
|
+
border-radius: 3px;
|
|
165
|
+
color: var(--idp-fg-3);
|
|
166
|
+
}
|
|
167
|
+
.region-code.home {
|
|
168
|
+
color: var(--idp-accent);
|
|
169
|
+
border-color: var(--sh-accent-ring);
|
|
170
|
+
background: var(--idp-accent-soft);
|
|
171
|
+
}
|
|
172
|
+
.region-code.risk {
|
|
173
|
+
color: var(--idp-error);
|
|
174
|
+
border-color: var(--idp-error-border);
|
|
175
|
+
background: var(--idp-error-bg);
|
|
176
|
+
}
|
|
177
|
+
.region-bar {
|
|
178
|
+
height: 4px;
|
|
179
|
+
margin-top: 4px;
|
|
180
|
+
border-radius: 2px;
|
|
181
|
+
background: var(--idp-muted);
|
|
182
|
+
overflow: hidden;
|
|
183
|
+
}
|
|
184
|
+
.region-bar-fill {
|
|
185
|
+
height: 100%;
|
|
186
|
+
background: var(--idp-accent);
|
|
187
|
+
opacity: 0.85;
|
|
188
|
+
}
|
|
189
|
+
.region-bar-fill.risk {
|
|
190
|
+
background: var(--idp-error);
|
|
191
|
+
opacity: 0.8;
|
|
192
|
+
}
|
|
193
|
+
.region-count {
|
|
194
|
+
font-family: var(--idp-mono);
|
|
195
|
+
font-size: 11.5px;
|
|
196
|
+
color: var(--idp-fg);
|
|
197
|
+
min-width: 44px;
|
|
198
|
+
text-align: right;
|
|
199
|
+
}
|
|
200
|
+
.region-list {
|
|
201
|
+
padding: 4px 16px 8px;
|
|
202
|
+
}
|
|
203
|
+
.threat-row {
|
|
204
|
+
display: grid;
|
|
205
|
+
grid-template-columns: 6px 1fr auto;
|
|
206
|
+
gap: 12px;
|
|
207
|
+
align-items: center;
|
|
208
|
+
padding: 12px 0;
|
|
209
|
+
border-bottom: 1px solid var(--idp-border-soft);
|
|
210
|
+
}
|
|
211
|
+
.threat-row:last-child {
|
|
212
|
+
border-bottom: none;
|
|
213
|
+
}
|
|
214
|
+
.threat-list {
|
|
215
|
+
padding: 0 16px;
|
|
216
|
+
}
|
|
217
|
+
.threat-dot {
|
|
218
|
+
width: 6px;
|
|
219
|
+
height: 6px;
|
|
220
|
+
border-radius: 3px;
|
|
221
|
+
}
|
|
222
|
+
.threat-title {
|
|
223
|
+
font-size: 12.5px;
|
|
224
|
+
font-weight: 500;
|
|
225
|
+
color: var(--idp-fg);
|
|
226
|
+
}
|
|
227
|
+
.threat-meta {
|
|
228
|
+
font-family: var(--idp-mono);
|
|
229
|
+
font-size: 10.5px;
|
|
230
|
+
color: var(--idp-muted-fg);
|
|
231
|
+
margin-top: 2px;
|
|
232
|
+
}
|
|
233
|
+
.threat-action {
|
|
234
|
+
padding: 4px 10px;
|
|
235
|
+
border: 1px solid var(--idp-border);
|
|
236
|
+
border-radius: 6px;
|
|
237
|
+
background: var(--idp-bg);
|
|
238
|
+
color: var(--idp-fg);
|
|
239
|
+
font-family: var(--idp-font);
|
|
240
|
+
font-size: 11px;
|
|
241
|
+
font-weight: 500;
|
|
242
|
+
white-space: nowrap;
|
|
243
|
+
cursor: pointer;
|
|
244
|
+
}
|
|
245
|
+
`,
|
|
246
|
+
];
|
|
247
|
+
#user_accessor_storage = __runInitializers(this, _user_initializers, {
|
|
248
|
+
name: '',
|
|
249
|
+
email: '',
|
|
250
|
+
});
|
|
251
|
+
get user() { return this.#user_accessor_storage; }
|
|
252
|
+
set user(value) { this.#user_accessor_storage = value; }
|
|
253
|
+
#orgs_accessor_storage = (__runInitializers(this, _user_extraInitializers), __runInitializers(this, _orgs_initializers, []));
|
|
254
|
+
get orgs() { return this.#orgs_accessor_storage; }
|
|
255
|
+
set orgs(value) { this.#orgs_accessor_storage = value; }
|
|
256
|
+
#sessions_accessor_storage = (__runInitializers(this, _orgs_extraInitializers), __runInitializers(this, _sessions_initializers, []));
|
|
257
|
+
get sessions() { return this.#sessions_accessor_storage; }
|
|
258
|
+
set sessions(value) { this.#sessions_accessor_storage = value; }
|
|
259
|
+
#activities_accessor_storage = (__runInitializers(this, _sessions_extraInitializers), __runInitializers(this, _activities_initializers, []));
|
|
260
|
+
get activities() { return this.#activities_accessor_storage; }
|
|
261
|
+
set activities(value) { this.#activities_accessor_storage = value; }
|
|
262
|
+
#passportDevices_accessor_storage = (__runInitializers(this, _activities_extraInitializers), __runInitializers(this, _passportDevices_initializers, []));
|
|
263
|
+
get passportDevices() { return this.#passportDevices_accessor_storage; }
|
|
264
|
+
set passportDevices(value) { this.#passportDevices_accessor_storage = value; }
|
|
265
|
+
#dataLoading_accessor_storage = (__runInitializers(this, _passportDevices_extraInitializers), __runInitializers(this, _dataLoading_initializers, false));
|
|
266
|
+
get dataLoading() { return this.#dataLoading_accessor_storage; }
|
|
267
|
+
set dataLoading(value) { this.#dataLoading_accessor_storage = value; }
|
|
268
|
+
#dataError_accessor_storage = (__runInitializers(this, _dataLoading_extraInitializers), __runInitializers(this, _dataError_initializers, ''));
|
|
269
|
+
get dataError() { return this.#dataError_accessor_storage; }
|
|
270
|
+
set dataError(value) { this.#dataError_accessor_storage = value; }
|
|
271
|
+
#overviewData_accessor_storage = (__runInitializers(this, _dataError_extraInitializers), __runInitializers(this, _overviewData_initializers, null));
|
|
272
|
+
get overviewData() { return this.#overviewData_accessor_storage; }
|
|
273
|
+
set overviewData(value) { this.#overviewData_accessor_storage = value; }
|
|
274
|
+
navigate(pageArg) {
|
|
275
|
+
this.dispatchEvent(new CustomEvent('idp-admin-navigate', {
|
|
276
|
+
detail: { page: pageArg },
|
|
277
|
+
bubbles: true,
|
|
278
|
+
composed: true,
|
|
279
|
+
}));
|
|
280
|
+
}
|
|
281
|
+
renderDataState(emptyTitleArg, emptyDescriptionArg, iconArg = 'box') {
|
|
282
|
+
if (this.dataLoading) {
|
|
283
|
+
return renderAdminStateCard('Loading data', 'Fetching the latest account and organisation data.', 'cloud');
|
|
284
|
+
}
|
|
285
|
+
if (this.dataError) {
|
|
286
|
+
return renderAdminStateCard('Data unavailable', this.dataError, 'alert');
|
|
287
|
+
}
|
|
288
|
+
return renderAdminStateCard(emptyTitleArg, emptyDescriptionArg, iconArg);
|
|
289
|
+
}
|
|
290
|
+
renderInsights() {
|
|
291
|
+
const data = this.overviewData;
|
|
292
|
+
if (!data?.chartSeries?.length && !data?.threats?.length) {
|
|
293
|
+
return html ``;
|
|
294
|
+
}
|
|
295
|
+
const toneColor = (severityArg) => severityArg === 'error'
|
|
296
|
+
? 'var(--idp-error)'
|
|
297
|
+
: severityArg === 'warning' ? 'var(--idp-warn)' : 'var(--idp-info)';
|
|
298
|
+
return html `
|
|
299
|
+
<div class="primary-grid">
|
|
300
|
+
${data?.chartSeries?.length ? html `
|
|
301
|
+
<div class="card chart-card">
|
|
302
|
+
<div class="card-head"><span class="card-title">${data.chartLabel || 'Approval activity'}</span></div>
|
|
303
|
+
<dees-chart-area
|
|
304
|
+
.label=${data.chartLabel || 'Approval activity'}
|
|
305
|
+
.yAxisFormatter=${(valueArg) => `${Math.round(valueArg)}`}
|
|
306
|
+
.series=${data.chartSeries.map((seriesArg) => ({
|
|
307
|
+
name: seriesArg.name,
|
|
308
|
+
data: seriesArg.data.map((pointArg) => ({ x: pointArg.x, y: pointArg.y })),
|
|
309
|
+
}))}
|
|
310
|
+
></dees-chart-area>
|
|
311
|
+
</div>
|
|
312
|
+
` : html ``}
|
|
313
|
+
${data?.threats?.length ? html `
|
|
314
|
+
<div class="card">
|
|
315
|
+
<div class="card-head"><span class="card-title">Needs attention</span><idp-badge variant="error">${data.threats.length} open</idp-badge></div>
|
|
316
|
+
<div class="threat-list">
|
|
317
|
+
${data.threats.map((threatArg) => html `
|
|
318
|
+
<div class="threat-row">
|
|
319
|
+
<span class="threat-dot" style="background:${toneColor(threatArg.severity)}"></span>
|
|
320
|
+
<div><div class="threat-title">${threatArg.title}</div><div class="threat-meta">${threatArg.meta}</div></div>
|
|
321
|
+
${threatArg.action ? html `<button class="threat-action">${threatArg.action}</button>` : html ``}
|
|
322
|
+
</div>
|
|
323
|
+
`)}
|
|
324
|
+
</div>
|
|
325
|
+
</div>
|
|
326
|
+
` : html ``}
|
|
327
|
+
</div>
|
|
328
|
+
`;
|
|
329
|
+
}
|
|
330
|
+
renderFooterRows() {
|
|
331
|
+
const data = this.overviewData;
|
|
332
|
+
if (!data?.feed?.length && !data?.regions?.length) {
|
|
333
|
+
return html ``;
|
|
334
|
+
}
|
|
335
|
+
const feedColor = (toneArg) => toneArg === 'ok'
|
|
336
|
+
? 'var(--idp-ok)'
|
|
337
|
+
: toneArg === 'warn' ? 'var(--idp-warn)' : toneArg === 'error' ? 'var(--idp-error)' : 'var(--idp-info)';
|
|
338
|
+
return html `
|
|
339
|
+
<div class="primary-grid">
|
|
340
|
+
${data?.feed?.length ? html `
|
|
341
|
+
<div class="card">
|
|
342
|
+
<div class="card-head"><span class="card-title">Cardano feed</span><idp-badge variant="accent">live</idp-badge></div>
|
|
343
|
+
${data.feed.map((itemArg) => html `
|
|
344
|
+
<div class="feed-item"><span class="feed-dot" style="--dot-color:${feedColor(itemArg.tone)}"></span><div class="feed-text">${itemArg.text}</div><span class="feed-meta">${itemArg.meta}</span></div>
|
|
345
|
+
`)}
|
|
346
|
+
</div>
|
|
347
|
+
` : html ``}
|
|
348
|
+
${data?.regions?.length ? html `
|
|
349
|
+
<div class="card">
|
|
350
|
+
<div class="card-head"><span class="card-title">Sign-ins by region</span><span class="feed-meta">last 24h</span></div>
|
|
351
|
+
<div class="region-list">
|
|
352
|
+
${data.regions.map((regionArg) => html `
|
|
353
|
+
<div class="region-row">
|
|
354
|
+
<span class="region-code ${regionArg.kind || ''}">${regionArg.code}</span>
|
|
355
|
+
<div>
|
|
356
|
+
<div style="display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--idp-fg)">
|
|
357
|
+
${regionArg.name}
|
|
358
|
+
${regionArg.kind === 'risk' ? html `<idp-badge variant="error">flagged</idp-badge>` : html ``}
|
|
359
|
+
${regionArg.kind === 'home' ? html `<idp-badge variant="accent">primary</idp-badge>` : html ``}
|
|
360
|
+
</div>
|
|
361
|
+
<div class="region-bar"><div class="region-bar-fill ${regionArg.kind === 'risk' ? 'risk' : ''}" style="width:${Math.round(Math.min(1, Math.max(0, regionArg.share)) * 100)}%"></div></div>
|
|
362
|
+
</div>
|
|
363
|
+
<span class="region-count">${regionArg.count.toLocaleString()}</span>
|
|
364
|
+
</div>
|
|
365
|
+
`)}
|
|
366
|
+
</div>
|
|
367
|
+
</div>
|
|
368
|
+
` : html ``}
|
|
369
|
+
</div>
|
|
370
|
+
`;
|
|
371
|
+
}
|
|
372
|
+
render() {
|
|
373
|
+
const firstName = this.user?.name?.split(' ')[0] || 'there';
|
|
374
|
+
const activeSessionCount = this.sessions.filter((sessionArg) => sessionArg.isCurrent).length || this.sessions.length;
|
|
375
|
+
const activePassportCount = this.passportDevices.filter((deviceArg) => deviceArg.status === 'active').length;
|
|
376
|
+
const kpis = [
|
|
377
|
+
{
|
|
378
|
+
label: 'Organisations',
|
|
379
|
+
value: String(this.orgs.length),
|
|
380
|
+
delta: 'live',
|
|
381
|
+
deltaKind: 'live',
|
|
382
|
+
spark: [1, 1, 1, 1, 1, 1, 1, Math.max(this.orgs.length, 1)],
|
|
383
|
+
sparkColor: 'var(--idp-spark-info)',
|
|
384
|
+
accent: 'var(--idp-chart-1)',
|
|
385
|
+
sub: 'Memberships visible to this account',
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
label: 'Sessions',
|
|
389
|
+
value: String(this.sessions.length),
|
|
390
|
+
delta: `${activeSessionCount} active`,
|
|
391
|
+
deltaKind: 'up',
|
|
392
|
+
spark: [1, 2, 1, 2, 3, 2, Math.max(this.sessions.length, 1)],
|
|
393
|
+
sparkColor: 'var(--idp-spark-up)',
|
|
394
|
+
accent: 'var(--idp-chart-2)',
|
|
395
|
+
sub: this.sessions.length ? `Latest ${formatAdminTimeAgo(Math.max(...this.sessions.map((sessionArg) => sessionArg.lastActive)))}` : 'No active sessions loaded',
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
label: 'Passport devices',
|
|
399
|
+
value: String(this.passportDevices.length),
|
|
400
|
+
delta: `${activePassportCount} active`,
|
|
401
|
+
deltaKind: 'live',
|
|
402
|
+
spark: [1, 1, 1, Math.max(this.passportDevices.length, 1)],
|
|
403
|
+
sparkColor: 'var(--idp-spark-info)',
|
|
404
|
+
accent: 'var(--idp-chart-5)',
|
|
405
|
+
sub: 'Cryptographic credentials',
|
|
406
|
+
},
|
|
407
|
+
{
|
|
408
|
+
label: 'Activity',
|
|
409
|
+
value: String(this.activities.length),
|
|
410
|
+
delta: 'live',
|
|
411
|
+
deltaKind: 'live',
|
|
412
|
+
spark: [1, 2, 2, 3, Math.max(this.activities.length, 1)],
|
|
413
|
+
sparkColor: 'var(--idp-spark-info)',
|
|
414
|
+
accent: 'var(--idp-info)',
|
|
415
|
+
sub: 'Recent account events',
|
|
416
|
+
},
|
|
417
|
+
];
|
|
418
|
+
return html `
|
|
419
|
+
<header class="page-head">
|
|
420
|
+
<div>
|
|
421
|
+
<div class="eyebrow-row"><span class="eyebrow">Account - Overview</span><span class="live-pill"><span class="live-dot"></span>live</span></div>
|
|
422
|
+
<h1>Good morning, ${firstName}.</h1>
|
|
423
|
+
<div class="lead">Account-wide operational snapshot using live identity data.</div>
|
|
424
|
+
</div>
|
|
425
|
+
<div class="page-actions"><button class="plain-button outline" @click=${() => this.navigate('sessions')}>Review sessions</button><button class="plain-button primary" @click=${() => this.navigate('security')}>Manage security</button></div>
|
|
426
|
+
</header>
|
|
427
|
+
<div class="body">
|
|
428
|
+
<div class="kpis">${kpis.map((kpiArg) => renderAdminKpi(kpiArg))}</div>
|
|
429
|
+
${this.dataLoading || this.dataError ? this.renderDataState('No overview data', 'The console has not received live account data yet.', 'activity') : html ``}
|
|
430
|
+
${this.renderInsights()}
|
|
431
|
+
<div class="primary-grid">
|
|
432
|
+
<div class="card">
|
|
433
|
+
<div class="card-head"><span class="card-title">Recent activity</span><idp-badge>${this.activities.length} events</idp-badge></div>
|
|
434
|
+
${this.activities.length ? this.activities.slice(0, 8).map((activityArg) => html `
|
|
435
|
+
<div class="feed-item"><span class="feed-dot" style="--dot-color:var(--idp-info)"></span><div class="feed-text"><strong>${activityArg.action.replace(/_/g, ' ')}</strong> - ${activityArg.description}</div><span class="feed-meta">${formatAdminTimeAgo(activityArg.timestamp)}</span></div>
|
|
436
|
+
`) : renderAdminStateCard('No activity yet', 'Activity events will appear here after logins, app changes, and organisation updates.', 'activity')}
|
|
437
|
+
</div>
|
|
438
|
+
<div class="card">
|
|
439
|
+
<div class="card-head"><span class="card-title">Current sessions</span><idp-badge>${this.sessions.length} total</idp-badge></div>
|
|
440
|
+
${this.sessions.length ? this.sessions.slice(0, 5).map((sessionArg) => html `
|
|
441
|
+
<div class="feed-item"><span class="feed-dot" style="--dot-color:${sessionArg.isCurrent ? 'var(--idp-ok)' : 'var(--idp-muted-fg)'}"></span><div class="feed-text"><strong>${sessionArg.deviceName || 'Unknown device'}</strong> - <span class="mono">${sessionArg.browser} ${sessionArg.os}</span></div><span class="feed-meta">${formatAdminTimeAgo(sessionArg.lastActive)}</span></div>
|
|
442
|
+
`) : renderAdminStateCard('No sessions loaded', 'Active session telemetry is unavailable or there are no sessions.', 'monitor')}
|
|
443
|
+
</div>
|
|
444
|
+
</div>
|
|
445
|
+
${this.renderFooterRows()}
|
|
446
|
+
</div>
|
|
447
|
+
`;
|
|
448
|
+
}
|
|
449
|
+
constructor() {
|
|
450
|
+
super(...arguments);
|
|
451
|
+
__runInitializers(this, _overviewData_extraInitializers);
|
|
452
|
+
}
|
|
453
|
+
static {
|
|
454
|
+
__runInitializers(_classThis, _classExtraInitializers);
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
return IdpAdminOverview = _classThis;
|
|
458
|
+
})();
|
|
459
|
+
export { IdpAdminOverview };
|
|
460
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRwLWFkbWluLW92ZXJ2aWV3LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL2lkcC1hZG1pbi1vdmVydmlldy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQXVCLE1BQU0sNkJBQTZCLENBQUM7QUFDbkgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFDMUksT0FBTyxlQUFlLENBQUM7QUFDdkIsT0FBTyxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLHlGQUF5RixDQUFDO0lBbUJwRixnQkFBZ0I7NEJBRDVCLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQzs7OztzQkFDRSxXQUFXOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2dDQUFuQixTQUFRLFdBQVc7Ozs7Z0NBMko5QyxRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7Z0NBTTFCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztvQ0FHekIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO3NDQUd6QixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7MkNBR3pCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQzt1Q0FHekIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztxQ0FHckUsUUFBUSxDQUFDLEVBQUUsSUFBSSxF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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type TemplateResult } from '@design.estate/dees-element';
|
|
2
|
+
import './idp-icon.js';
|
|
3
|
+
export type TIdpAdminKpi = {
|
|
4
|
+
label: string;
|
|
5
|
+
value: string;
|
|
6
|
+
unit?: string;
|
|
7
|
+
delta: string;
|
|
8
|
+
deltaKind: 'up' | 'live';
|
|
9
|
+
sub: string;
|
|
10
|
+
accent: string;
|
|
11
|
+
spark: number[];
|
|
12
|
+
sparkColor: string;
|
|
13
|
+
};
|
|
14
|
+
export declare const idpAdminSharedStyles: import("@design.estate/dees-element").CSSResult;
|
|
15
|
+
export declare const renderAdminSparkline: (dataArg: number[], colorArg: string) => TemplateResult;
|
|
16
|
+
export declare const renderAdminKpi: (kpiArg: TIdpAdminKpi) => TemplateResult;
|
|
17
|
+
export declare const renderAdminStateCard: (titleArg: string, descriptionArg: string, iconArg?: string) => TemplateResult;
|
|
18
|
+
export declare const formatAdminTimeAgo: (timestampArg?: number) => string;
|