@idp.global/catalog 2.1.1 → 3.0.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 +19 -0
- package/dist_bundle/bundle.js +2291 -1744
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/elements/idp-admin-shell.d.ts +13 -1
- package/dist_ts_web/elements/idp-admin-shell.js +55 -2
- package/dist_ts_web/elements/idp-admin-sidebar.js +2 -1
- package/dist_ts_web/elements/idp-button.d.ts +6 -0
- package/dist_ts_web/elements/idp-button.js +48 -10
- package/dist_ts_web/elements/idp-landing-hero.d.ts +2 -0
- package/dist_ts_web/elements/idp-landing-hero.js +24 -4
- package/dist_ts_web/elements/idp-landing-page.d.ts +14 -0
- package/dist_ts_web/elements/idp-landing-page.js +80 -20
- package/dist_ts_web/elements/idp-scim-token-panel.d.ts +43 -0
- package/dist_ts_web/elements/idp-scim-token-panel.js +361 -0
- package/dist_ts_web/elements/idp-sso-connection-form.d.ts +81 -0
- package/dist_ts_web/elements/idp-sso-connection-form.js +637 -0
- package/dist_ts_web/elements/index.d.ts +2 -0
- package/dist_ts_web/elements/index.js +3 -1
- package/package.json +1 -1
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/elements/idp-admin-shell.ts +37 -0
- package/ts_web/elements/idp-admin-sidebar.ts +1 -0
- package/ts_web/elements/idp-button.ts +36 -8
- package/ts_web/elements/idp-landing-hero.ts +9 -3
- package/ts_web/elements/idp-landing-page.ts +83 -19
- package/ts_web/elements/idp-scim-token-panel.ts +311 -0
- package/ts_web/elements/idp-sso-connection-form.ts +574 -0
- package/ts_web/elements/index.ts +2 -0
|
@@ -34,4 +34,6 @@ export * from './idp-admin-shell.js';
|
|
|
34
34
|
export * from './idp-landing-hero.js';
|
|
35
35
|
export * from './idp-landing-page.js';
|
|
36
36
|
export * from './idp-mobile-showcase.js';
|
|
37
|
-
|
|
37
|
+
export * from './idp-sso-connection-form.js';
|
|
38
|
+
export * from './idp-scim-token-panel.js';
|
|
39
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c193ZWIvZWxlbWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxlQUFlLENBQUM7QUFDOUIsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLGdCQUFnQixDQUFDO0FBQy9CLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsZ0JBQWdCLENBQUM7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsaUJBQWlCLENBQUM7QUFDaEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHlCQUF5QixDQUFDO0FBQ3hDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyx5QkFBeUIsQ0FBQztBQUN4QyxjQUFjLHNCQUFzQixDQUFDO0FBQ3JDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMsOEJBQThCLENBQUM7QUFDN0MsY0FBYywyQkFBMkIsQ0FBQyJ9
|
package/package.json
CHANGED
|
@@ -8,8 +8,12 @@ import './idp-toggle.js';
|
|
|
8
8
|
import './idp-delegation-section.js';
|
|
9
9
|
import './idp-admin-sidebar.js';
|
|
10
10
|
import './idp-admin-overview.js';
|
|
11
|
+
import './idp-sso-connection-form.js';
|
|
12
|
+
import './idp-scim-token-panel.js';
|
|
11
13
|
import { idpAdminSharedStyles, renderAdminKpi, renderAdminStateCard, formatAdminTimeAgo, type TIdpAdminKpi } from './idp-admin-shared.js';
|
|
12
14
|
import type { IIdpDelegation, IIdpDelegationApp } from './idp-delegation-section.js';
|
|
15
|
+
import type { IIdpSsoConnectionItem, IIdpSsoSpDetails } from './idp-sso-connection-form.js';
|
|
16
|
+
import type { IIdpScimTokenItem } from './idp-scim-token-panel.js';
|
|
13
17
|
|
|
14
18
|
declare global {
|
|
15
19
|
interface HTMLElementTagNameMap {
|
|
@@ -27,6 +31,7 @@ export type TIdpAdminPage =
|
|
|
27
31
|
| 'org-settings'
|
|
28
32
|
| 'org-members'
|
|
29
33
|
| 'org-apps'
|
|
34
|
+
| 'org-sso'
|
|
30
35
|
| 'support'
|
|
31
36
|
| 'ga-users'
|
|
32
37
|
| 'ga-orgs'
|
|
@@ -917,6 +922,18 @@ export class IdpAdminShell extends DeesElement {
|
|
|
917
922
|
@property({ type: Array })
|
|
918
923
|
public accessor gaUsers: IIdpAdminGaUser[] = [];
|
|
919
924
|
|
|
925
|
+
@property({ type: Array })
|
|
926
|
+
public accessor ssoConnections: IIdpSsoConnectionItem[] = [];
|
|
927
|
+
|
|
928
|
+
@property({ type: Object })
|
|
929
|
+
public accessor ssoSpDetails: IIdpSsoSpDetails | null = null;
|
|
930
|
+
|
|
931
|
+
@property({ type: Array })
|
|
932
|
+
public accessor scimTokens: IIdpScimTokenItem[] = [];
|
|
933
|
+
|
|
934
|
+
@property({ type: Object })
|
|
935
|
+
public accessor scimCreatedToken: { label: string; plaintextToken: string } | null = null;
|
|
936
|
+
|
|
920
937
|
@property({ type: Object })
|
|
921
938
|
public accessor overviewData: IIdpAdminOverviewData | null = null;
|
|
922
939
|
|
|
@@ -2220,6 +2237,25 @@ export class IdpAdminShell extends DeesElement {
|
|
|
2220
2237
|
`;
|
|
2221
2238
|
}
|
|
2222
2239
|
|
|
2240
|
+
private renderOrgSso(): TemplateResult {
|
|
2241
|
+
return html`
|
|
2242
|
+
${this.renderPageHeader('SSO & Provisioning', 'Enterprise single sign-on and automated user provisioning for this organisation.')}
|
|
2243
|
+
<div class="body narrow-body">
|
|
2244
|
+
<div class="list-stack">
|
|
2245
|
+
<idp-sso-connection-form
|
|
2246
|
+
.connections=${this.ssoConnections}
|
|
2247
|
+
.spDetails=${this.ssoSpDetails}
|
|
2248
|
+
></idp-sso-connection-form>
|
|
2249
|
+
<idp-scim-token-panel
|
|
2250
|
+
.tokens=${this.scimTokens}
|
|
2251
|
+
.createdToken=${this.scimCreatedToken}
|
|
2252
|
+
scimBaseUrl=${this.ssoSpDetails?.scimBaseUrl || ''}
|
|
2253
|
+
></idp-scim-token-panel>
|
|
2254
|
+
</div>
|
|
2255
|
+
</div>
|
|
2256
|
+
`;
|
|
2257
|
+
}
|
|
2258
|
+
|
|
2223
2259
|
private renderSupport(): TemplateResult {
|
|
2224
2260
|
const services = [
|
|
2225
2261
|
['Account Recovery', 'Lost access to your account or locked out of your organisation? Our team will verify your identity and restore access securely.', 'EUR149', 'per incident', 'key', '1-2 business days'],
|
|
@@ -2409,6 +2445,7 @@ export class IdpAdminShell extends DeesElement {
|
|
|
2409
2445
|
'org-settings': () => this.renderOrgSettings(),
|
|
2410
2446
|
'org-members': () => this.renderOrgMembers(),
|
|
2411
2447
|
'org-apps': () => this.renderOrgApps(),
|
|
2448
|
+
'org-sso': () => this.renderOrgSso(),
|
|
2412
2449
|
support: () => this.renderSupport(),
|
|
2413
2450
|
'ga-users': () => this.renderGAUsers(),
|
|
2414
2451
|
'ga-orgs': () => this.renderGAOrgs(),
|
|
@@ -444,6 +444,7 @@ export class IdpAdminSidebar extends DeesElement {
|
|
|
444
444
|
{ id: 'org-settings', label: 'Settings', icon: 'settings' },
|
|
445
445
|
{ id: 'org-members', label: 'Members', icon: 'users' },
|
|
446
446
|
{ id: 'org-apps', label: 'OAuth Apps', icon: 'box' },
|
|
447
|
+
{ id: 'org-sso', label: 'SSO & Provisioning', icon: 'key' },
|
|
447
448
|
];
|
|
448
449
|
|
|
449
450
|
private supportNav: TNavItem[] = [
|
|
@@ -57,6 +57,16 @@ export class IdpButton extends DeesElement {
|
|
|
57
57
|
@property({ type: Boolean, reflect: true })
|
|
58
58
|
public accessor loading = false;
|
|
59
59
|
|
|
60
|
+
/**
|
|
61
|
+
* When set, the button renders as a real anchor so it works as a link
|
|
62
|
+
* (new-tab, middle-click, crawlers) without any host-side click wiring.
|
|
63
|
+
*/
|
|
64
|
+
@property({ type: String })
|
|
65
|
+
public accessor href = '';
|
|
66
|
+
|
|
67
|
+
@property({ type: String })
|
|
68
|
+
public accessor target = '';
|
|
69
|
+
|
|
60
70
|
public static styles = [
|
|
61
71
|
...idpElementStyles,
|
|
62
72
|
css`
|
|
@@ -69,10 +79,12 @@ export class IdpButton extends DeesElement {
|
|
|
69
79
|
:host([block]) {
|
|
70
80
|
display: block;
|
|
71
81
|
}
|
|
72
|
-
:host([block]) button
|
|
82
|
+
:host([block]) button,
|
|
83
|
+
:host([block]) a {
|
|
73
84
|
width: 100%;
|
|
74
85
|
}
|
|
75
|
-
button
|
|
86
|
+
button,
|
|
87
|
+
a {
|
|
76
88
|
display: inline-flex;
|
|
77
89
|
align-items: center;
|
|
78
90
|
justify-content: center;
|
|
@@ -87,10 +99,16 @@ export class IdpButton extends DeesElement {
|
|
|
87
99
|
cursor: pointer;
|
|
88
100
|
transition: background 120ms ease, color 120ms ease, border-color 120ms ease, transform 80ms ease;
|
|
89
101
|
}
|
|
90
|
-
|
|
102
|
+
a {
|
|
103
|
+
text-decoration: none;
|
|
104
|
+
box-sizing: border-box;
|
|
105
|
+
}
|
|
106
|
+
button:active:not(:disabled),
|
|
107
|
+
a:active {
|
|
91
108
|
transform: translateY(1px);
|
|
92
109
|
}
|
|
93
|
-
button:focus-visible
|
|
110
|
+
button:focus-visible,
|
|
111
|
+
a:focus-visible {
|
|
94
112
|
outline: 2px solid color-mix(in srgb, var(--idp-accent), transparent 68%);
|
|
95
113
|
outline-offset: 2px;
|
|
96
114
|
}
|
|
@@ -212,12 +230,22 @@ export class IdpButton extends DeesElement {
|
|
|
212
230
|
];
|
|
213
231
|
|
|
214
232
|
public render(): TemplateResult {
|
|
233
|
+
const contentTemplate = html`
|
|
234
|
+
${this.loading
|
|
235
|
+
? html`<span class="spinner" aria-hidden="true"></span>`
|
|
236
|
+
: this.icon ? html`<idp-icon name=${this.icon as any} size="14"></idp-icon>` : html``}
|
|
237
|
+
<slot></slot>
|
|
238
|
+
`;
|
|
239
|
+
if (this.href && !this.disabled) {
|
|
240
|
+
return html`
|
|
241
|
+
<a class="${this.variant} ${this.size} ${this.shape === 'rect' ? 'rect' : ''}" href=${this.href} target=${this.target || ''} part="button">
|
|
242
|
+
${contentTemplate}
|
|
243
|
+
</a>
|
|
244
|
+
`;
|
|
245
|
+
}
|
|
215
246
|
return html`
|
|
216
247
|
<button class="${this.variant} ${this.size} ${this.shape === 'rect' ? 'rect' : ''}" type=${this.type} ?disabled=${this.disabled || this.loading} part="button">
|
|
217
|
-
${
|
|
218
|
-
? html`<span class="spinner" aria-hidden="true"></span>`
|
|
219
|
-
: this.icon ? html`<idp-icon name=${this.icon as any} size="14"></idp-icon>` : html``}
|
|
220
|
-
<slot></slot>
|
|
248
|
+
${contentTemplate}
|
|
221
249
|
</button>
|
|
222
250
|
`;
|
|
223
251
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DeesElement, html, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
1
|
+
import { DeesElement, html, customElement, css, property, type TemplateResult } from '@design.estate/dees-element';
|
|
2
2
|
import { idpElementStyles } from './tokens.js';
|
|
3
3
|
import './idp-button.js';
|
|
4
4
|
import './idp-screenshot-placeholder.js';
|
|
@@ -14,6 +14,12 @@ export class IdpLandingHero extends DeesElement {
|
|
|
14
14
|
public static demo = () => html`<idp-landing-hero></idp-landing-hero>`;
|
|
15
15
|
public static demoGroups = ['idp.global v5 composed surfaces'];
|
|
16
16
|
|
|
17
|
+
@property({ type: String })
|
|
18
|
+
public accessor claimHref = '';
|
|
19
|
+
|
|
20
|
+
@property({ type: String })
|
|
21
|
+
public accessor secondaryHref = '';
|
|
22
|
+
|
|
17
23
|
public static styles = [
|
|
18
24
|
...idpElementStyles,
|
|
19
25
|
css`
|
|
@@ -100,8 +106,8 @@ export class IdpLandingHero extends DeesElement {
|
|
|
100
106
|
Anchored to Cardano, so it can never be erased or taken away.
|
|
101
107
|
</p>
|
|
102
108
|
<div class="hero-actions">
|
|
103
|
-
<idp-button variant="accent" size="lg">Claim your identity</idp-button>
|
|
104
|
-
<idp-button variant="link" size="lg">See how it works</idp-button>
|
|
109
|
+
<idp-button variant="accent" size="lg" href=${this.claimHref}>Claim your identity</idp-button>
|
|
110
|
+
<idp-button variant="link" size="lg" href=${this.secondaryHref}>See how it works</idp-button>
|
|
105
111
|
</div>
|
|
106
112
|
<div class="hero-fine">
|
|
107
113
|
<span>MIT licensed</span><span>Self-hostable</span><span>No credit card</span><span>Cardano mainnet</span>
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DeesElement, html, customElement, css, type TemplateResult } from '@design.estate/dees-element';
|
|
1
|
+
import { DeesElement, html, customElement, css, property, type TemplateResult } from '@design.estate/dees-element';
|
|
2
2
|
import { idpElementStyles } from './tokens.js';
|
|
3
3
|
import './idp-badge.js';
|
|
4
4
|
import './idp-button.js';
|
|
@@ -12,11 +12,47 @@ declare global {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
+
export interface IIdpLandingLinks {
|
|
16
|
+
signIn: string;
|
|
17
|
+
claim: string;
|
|
18
|
+
docs: string;
|
|
19
|
+
github: string;
|
|
20
|
+
contact: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
15
23
|
@customElement('idp-landing-page')
|
|
16
24
|
export class IdpLandingPage extends DeesElement {
|
|
17
25
|
public static demo = () => html`<idp-landing-page></idp-landing-page>`;
|
|
18
26
|
public static demoGroups = ['idp.global v5 full pages'];
|
|
19
27
|
|
|
28
|
+
/**
|
|
29
|
+
* Real navigation targets for the page chrome. Consumers override any subset;
|
|
30
|
+
* labels without a link target stay presentational.
|
|
31
|
+
*/
|
|
32
|
+
@property({ type: Object })
|
|
33
|
+
public accessor links: Partial<IIdpLandingLinks> = {};
|
|
34
|
+
|
|
35
|
+
private getLinks(): IIdpLandingLinks {
|
|
36
|
+
return {
|
|
37
|
+
signIn: 'https://idp.global/login',
|
|
38
|
+
claim: 'https://idp.global/register',
|
|
39
|
+
docs: 'https://about.idp.global/docs',
|
|
40
|
+
github: 'https://code.foss.global/idp.global/idp.global',
|
|
41
|
+
contact: 'mailto:hello@task.vc',
|
|
42
|
+
...this.links,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private scrollToSection(eventArg: Event, sectionIdArg: string) {
|
|
47
|
+
eventArg.preventDefault();
|
|
48
|
+
if (sectionIdArg === 'product') {
|
|
49
|
+
// the product screenshot lives inside the hero's shadow root
|
|
50
|
+
this.shadowRoot?.querySelector('idp-landing-hero')?.scrollIntoView({ behavior: 'smooth', block: 'end' });
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
this.shadowRoot?.getElementById(sectionIdArg)?.scrollIntoView({ behavior: 'smooth' });
|
|
54
|
+
}
|
|
55
|
+
|
|
20
56
|
public static styles = [
|
|
21
57
|
...idpElementStyles,
|
|
22
58
|
css`
|
|
@@ -767,20 +803,28 @@ export class IdpLandingPage extends DeesElement {
|
|
|
767
803
|
];
|
|
768
804
|
|
|
769
805
|
private renderNav() {
|
|
806
|
+
const links = this.getLinks();
|
|
807
|
+
const sections = [
|
|
808
|
+
['product', 'Product'],
|
|
809
|
+
['features', 'Features'],
|
|
810
|
+
['chain', 'On-chain'],
|
|
811
|
+
['pricing', 'Pricing'],
|
|
812
|
+
['developers', 'Developers'],
|
|
813
|
+
] as const;
|
|
770
814
|
return html`
|
|
771
815
|
<div class="nav-shell">
|
|
772
816
|
<nav>
|
|
773
|
-
<a class="logo" href="#">idp<span class="logo-dot"></span>global</a>
|
|
817
|
+
<a class="logo" href="#" @click=${(eventArg: Event) => this.scrollToSection(eventArg, 'product')}>idp<span class="logo-dot"></span>global</a>
|
|
774
818
|
<div class="nav-links">
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
819
|
+
${sections.map(
|
|
820
|
+
([sectionId, label]) => html`
|
|
821
|
+
<a href="#${sectionId}" @click=${(eventArg: Event) => this.scrollToSection(eventArg, sectionId)}>${label}</a>
|
|
822
|
+
`,
|
|
823
|
+
)}
|
|
780
824
|
</div>
|
|
781
825
|
<div class="actions">
|
|
782
|
-
<a class="nav-signin">Sign in</a>
|
|
783
|
-
<idp-button variant="accent" size="sm">Claim identity</idp-button>
|
|
826
|
+
<a class="nav-signin" href=${links.signIn}>Sign in</a>
|
|
827
|
+
<idp-button variant="accent" size="sm" href=${links.claim}>Claim identity</idp-button>
|
|
784
828
|
</div>
|
|
785
829
|
</nav>
|
|
786
830
|
</div>
|
|
@@ -977,6 +1021,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
977
1021
|
}
|
|
978
1022
|
|
|
979
1023
|
private renderPricing() {
|
|
1024
|
+
const links = this.getLinks();
|
|
980
1025
|
const tiers = [
|
|
981
1026
|
{
|
|
982
1027
|
name: 'Personal',
|
|
@@ -992,6 +1037,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
992
1037
|
'Recovery via your other devices',
|
|
993
1038
|
],
|
|
994
1039
|
cta: 'Claim your identity',
|
|
1040
|
+
ctaHref: links.claim,
|
|
995
1041
|
variant: 'tint',
|
|
996
1042
|
featured: false,
|
|
997
1043
|
},
|
|
@@ -1009,6 +1055,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1009
1055
|
'SSO & SCIM included, no upsell',
|
|
1010
1056
|
],
|
|
1011
1057
|
cta: 'Start an organisation',
|
|
1058
|
+
ctaHref: links.claim,
|
|
1012
1059
|
variant: 'accent',
|
|
1013
1060
|
featured: true,
|
|
1014
1061
|
},
|
|
@@ -1026,6 +1073,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1026
1073
|
'Priority engineering & SLA',
|
|
1027
1074
|
],
|
|
1028
1075
|
cta: 'Talk to us',
|
|
1076
|
+
ctaHref: links.contact,
|
|
1029
1077
|
variant: 'tint',
|
|
1030
1078
|
featured: false,
|
|
1031
1079
|
},
|
|
@@ -1051,7 +1099,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1051
1099
|
<div class="price">${tierArg.price}<span class="sub">${tierArg.sub}</span></div>
|
|
1052
1100
|
<div class="price-note">${tierArg.note}</div>
|
|
1053
1101
|
<ul class="tier-list">${tierArg.items.map((itemArg) => html`<li>${itemArg}</li>`)}</ul>
|
|
1054
|
-
<idp-button variant=${tierArg.variant as any}>${tierArg.cta}</idp-button>
|
|
1102
|
+
<idp-button variant=${tierArg.variant as any} href=${tierArg.ctaHref}>${tierArg.cta}</idp-button>
|
|
1055
1103
|
</div>
|
|
1056
1104
|
`,
|
|
1057
1105
|
)}
|
|
@@ -1077,8 +1125,8 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1077
1125
|
<p>One CLI. Standard OAuth 2 & OIDC. Native SDKs for Node, Python, Swift, Kotlin, Go, Rust.</p>
|
|
1078
1126
|
<div class="dev-tags">${tags.map((tagArg) => html`<span class="dev-tag">${tagArg}</span>`)}</div>
|
|
1079
1127
|
<div class="dev-actions">
|
|
1080
|
-
<idp-button variant="accent" icon="lucide:github">View on GitHub</idp-button>
|
|
1081
|
-
<idp-button variant="link">Read the docs</idp-button>
|
|
1128
|
+
<idp-button variant="accent" icon="lucide:github" href=${this.getLinks().github}>View on GitHub</idp-button>
|
|
1129
|
+
<idp-button variant="link" href=${this.getLinks().docs}>Read the docs</idp-button>
|
|
1082
1130
|
</div>
|
|
1083
1131
|
</div>
|
|
1084
1132
|
<div class="terminal">
|
|
@@ -1115,7 +1163,7 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1115
1163
|
|
|
1116
1164
|
private renderManifesto() {
|
|
1117
1165
|
return html`
|
|
1118
|
-
<section class="manifesto">
|
|
1166
|
+
<section class="manifesto" id="manifesto">
|
|
1119
1167
|
<div class="wrap">
|
|
1120
1168
|
<div class="eyebrow sm" style="margin-bottom: 24px;">Why we built this</div>
|
|
1121
1169
|
<q>Identity should not be a product the user is sold. It should be a permanent <em>fact</em>, owned by the person it describes.</q>
|
|
@@ -1135,8 +1183,8 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1135
1183
|
we disappear.
|
|
1136
1184
|
</p>
|
|
1137
1185
|
<div class="cta-actions">
|
|
1138
|
-
<idp-button variant="accent" size="lg">Claim your identity</idp-button>
|
|
1139
|
-
<idp-button variant="link" size="lg">Read the manifesto</idp-button>
|
|
1186
|
+
<idp-button variant="accent" size="lg" href=${this.getLinks().claim}>Claim your identity</idp-button>
|
|
1187
|
+
<idp-button variant="link" size="lg" @click=${(eventArg: Event) => this.scrollToSection(eventArg, 'manifesto')}>Read the manifesto</idp-button>
|
|
1140
1188
|
</div>
|
|
1141
1189
|
</div>
|
|
1142
1190
|
</section>
|
|
@@ -1144,17 +1192,30 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1144
1192
|
}
|
|
1145
1193
|
|
|
1146
1194
|
private renderFooter() {
|
|
1195
|
+
const links = this.getLinks();
|
|
1196
|
+
const labelHrefs: Record<string, string> = {
|
|
1197
|
+
Documentation: links.docs,
|
|
1198
|
+
'API reference': links.docs,
|
|
1199
|
+
'Self-hosting': links.docs,
|
|
1200
|
+
GitHub: links.github,
|
|
1201
|
+
};
|
|
1147
1202
|
const cols = [
|
|
1148
1203
|
['Product', ['For individuals', 'For organisations', 'Enterprise', 'Cardano sync', 'Changelog']],
|
|
1149
1204
|
['Developers', ['Documentation', 'API reference', 'Self-hosting', 'SDKs', 'GitHub']],
|
|
1150
1205
|
['Company', ['Manifesto', 'Blog', 'Security', 'Privacy', 'Terms']],
|
|
1151
1206
|
] as const;
|
|
1207
|
+
const renderFooterLink = (labelArg: string) =>
|
|
1208
|
+
labelHrefs[labelArg]
|
|
1209
|
+
? html`<a href=${labelHrefs[labelArg]}>${labelArg}</a>`
|
|
1210
|
+
: labelArg === 'Manifesto'
|
|
1211
|
+
? html`<a href="#manifesto" @click=${(eventArg: Event) => this.scrollToSection(eventArg, 'manifesto')}>${labelArg}</a>`
|
|
1212
|
+
: html`<a>${labelArg}</a>`;
|
|
1152
1213
|
return html`
|
|
1153
1214
|
<footer>
|
|
1154
1215
|
<div class="wrap-wide">
|
|
1155
1216
|
<div class="footer-cols">
|
|
1156
1217
|
<div class="footer-brand">
|
|
1157
|
-
<a class="logo" href="#">idp<span class="logo-dot"></span>global</a>
|
|
1218
|
+
<a class="logo" href="#" @click=${(eventArg: Event) => this.scrollToSection(eventArg, 'product')}>idp<span class="logo-dot"></span>global</a>
|
|
1158
1219
|
<p>
|
|
1159
1220
|
An open identity provider for everyone — from individuals to enterprises. Anchored on Cardano. Built in
|
|
1160
1221
|
the open. Yours forever.
|
|
@@ -1165,14 +1226,14 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1165
1226
|
(colArg) => html`
|
|
1166
1227
|
<div class="footer-col">
|
|
1167
1228
|
<h4>${colArg[0]}</h4>
|
|
1168
|
-
<ul>${colArg[1].map((linkArg) => html`<li
|
|
1229
|
+
<ul>${colArg[1].map((linkArg) => html`<li>${renderFooterLink(linkArg)}</li>`)}</ul>
|
|
1169
1230
|
</div>
|
|
1170
1231
|
`,
|
|
1171
1232
|
)}
|
|
1172
1233
|
</div>
|
|
1173
1234
|
<div class="footer-bottom">
|
|
1174
1235
|
<span>© 2026 idp.global · MIT · Anchored to Cardano</span>
|
|
1175
|
-
<span class="links"><a>Status</a><a>
|
|
1236
|
+
<span class="links"><a>Status</a><a href=${links.github}>GitHub</a></span>
|
|
1176
1237
|
</div>
|
|
1177
1238
|
</div>
|
|
1178
1239
|
</footer>
|
|
@@ -1183,7 +1244,10 @@ export class IdpLandingPage extends DeesElement {
|
|
|
1183
1244
|
return html`
|
|
1184
1245
|
<div class="page">
|
|
1185
1246
|
${this.renderNav()}
|
|
1186
|
-
<idp-landing-hero
|
|
1247
|
+
<idp-landing-hero
|
|
1248
|
+
claimHref=${this.getLinks().claim}
|
|
1249
|
+
secondaryHref=${this.getLinks().docs}
|
|
1250
|
+
></idp-landing-hero>
|
|
1187
1251
|
${this.renderProof()}
|
|
1188
1252
|
${this.renderFeatures()}
|
|
1189
1253
|
${this.renderChain()}
|