@idp.global/catalog 1.2.0 → 2.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.
Files changed (31) hide show
  1. package/changelog.md +15 -1
  2. package/dist_bundle/bundle.js +1470 -960
  3. package/dist_ts_web/00_commitinfo_data.js +3 -3
  4. package/dist_ts_web/elements/idp-badge.js +9 -12
  5. package/dist_ts_web/elements/idp-button.d.ts +1 -1
  6. package/dist_ts_web/elements/idp-button.js +39 -16
  7. package/dist_ts_web/elements/idp-landing-hero.d.ts +1 -2
  8. package/dist_ts_web/elements/idp-landing-hero.js +63 -108
  9. package/dist_ts_web/elements/idp-landing-page.d.ts +5 -0
  10. package/dist_ts_web/elements/idp-landing-page.js +922 -391
  11. package/dist_ts_web/elements/idp-mobile-showcase.js +1 -1
  12. package/dist_ts_web/elements/idp-screenshot-placeholder.d.ts +23 -0
  13. package/dist_ts_web/elements/idp-screenshot-placeholder.js +192 -0
  14. package/dist_ts_web/elements/index.d.ts +1 -0
  15. package/dist_ts_web/elements/index.js +2 -1
  16. package/dist_ts_web/elements/tokens.d.ts +1 -1
  17. package/dist_ts_web/elements/tokens.js +129 -115
  18. package/package.json +5 -6
  19. package/readme.md +4 -3
  20. package/ts_web/00_commitinfo_data.ts +2 -2
  21. package/ts_web/elements/idp-badge.ts +8 -11
  22. package/ts_web/elements/idp-button.ts +39 -16
  23. package/ts_web/elements/idp-landing-hero.ts +62 -107
  24. package/ts_web/elements/idp-landing-page.ts +932 -389
  25. package/ts_web/elements/idp-mobile-showcase.ts +1 -1
  26. package/ts_web/elements/idp-screenshot-placeholder.ts +126 -0
  27. package/ts_web/elements/index.ts +1 -0
  28. package/ts_web/elements/tokens.ts +128 -114
  29. package/dist_watch/bundle.js +0 -120699
  30. package/dist_watch/bundle.js.map +0 -7
  31. package/dist_watch/index.html +0 -29
@@ -37,6 +37,7 @@ import { idpElementStyles } from './tokens.js';
37
37
  import './idp-badge.js';
38
38
  import './idp-button.js';
39
39
  import './idp-icon.js';
40
+ import './idp-screenshot-placeholder.js';
40
41
  import './idp-landing-hero.js';
41
42
  let IdpLandingPage = (() => {
42
43
  let _classDecorators = [customElement('idp-landing-page')];
@@ -53,564 +54,752 @@ let IdpLandingPage = (() => {
53
54
  if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
54
55
  }
55
56
  static demo = () => html `<idp-landing-page></idp-landing-page>`;
56
- static demoGroups = ['idp.global v3 full pages'];
57
+ static demoGroups = ['idp.global v5 full pages'];
57
58
  static styles = [
58
59
  ...idpElementStyles,
59
60
  css `
60
61
  :host {
61
62
  display: block;
62
- background: var(--idp-bg);
63
+ background: var(--idp-card);
63
64
  color: var(--idp-fg);
64
65
  }
65
66
  .page {
66
67
  min-height: 100vh;
67
- background: var(--idp-bg);
68
+ background: var(--idp-card);
68
69
  }
69
- nav {
70
- position: sticky;
71
- top: 0;
72
- z-index: 20;
73
- display: flex;
74
- align-items: center;
75
- justify-content: space-between;
76
- gap: 24px;
77
- height: 56px;
70
+ .wrap {
71
+ max-width: 1024px;
72
+ margin: 0 auto;
73
+ padding: 0 22px;
74
+ }
75
+ .wrap-wide {
78
76
  max-width: 1240px;
79
77
  margin: 0 auto;
80
- padding: 0 32px;
81
- border-bottom: 1px solid var(--idp-border-soft);
82
- background: color-mix(in srgb, var(--idp-bg), transparent 14%);
83
- backdrop-filter: blur(14px) saturate(140%);
78
+ padding: 0 22px;
84
79
  }
80
+
81
+ /* Nav */
85
82
  .nav-shell {
86
83
  position: sticky;
87
84
  top: 0;
88
- z-index: 20;
89
- border-bottom: 1px solid var(--idp-border-soft);
90
- background: color-mix(in srgb, var(--idp-bg), transparent 14%);
85
+ z-index: 50;
86
+ border-bottom: 0.5px solid var(--idp-border-soft);
87
+ background: var(--idp-nav-bg);
88
+ backdrop-filter: saturate(180%) blur(20px);
89
+ -webkit-backdrop-filter: saturate(180%) blur(20px);
90
+ }
91
+ nav {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: space-between;
95
+ height: 48px;
96
+ max-width: 1024px;
97
+ margin: 0 auto;
98
+ padding: 0 22px;
91
99
  }
92
100
  .logo {
93
101
  display: inline-flex;
94
102
  align-items: center;
95
- gap: 8px;
96
- font-family: var(--idp-display);
97
- font-size: 16px;
98
- font-weight: 700;
99
- letter-spacing: -0.015em;
103
+ font-size: 19px;
104
+ font-weight: 600;
105
+ letter-spacing: -0.02em;
106
+ color: var(--idp-fg);
107
+ text-decoration: none;
100
108
  }
101
109
  .logo-dot {
102
110
  width: 6px;
103
111
  height: 6px;
104
- border-radius: 999px;
112
+ margin: 0 1px 5px;
113
+ border-radius: 50%;
105
114
  background: var(--idp-accent);
106
- box-shadow: 0 0 12px var(--idp-accent);
115
+ align-self: flex-end;
107
116
  }
108
- .links, .actions {
117
+ .nav-links {
109
118
  display: flex;
110
- align-items: center;
111
- gap: 6px;
119
+ gap: 4px;
112
120
  }
113
- .links a {
114
- padding: 6px 12px;
115
- border-radius: 5px;
121
+ .nav-links a {
122
+ padding: 4px 11px;
123
+ border-radius: 6px;
116
124
  color: var(--idp-fg-3);
117
125
  font-size: 13px;
118
126
  text-decoration: none;
119
127
  }
120
- .links a:hover {
121
- background: var(--idp-muted);
128
+ .nav-links a:hover {
122
129
  color: var(--idp-fg);
123
130
  }
124
- .status {
125
- display: inline-flex;
131
+ .actions {
132
+ display: flex;
126
133
  align-items: center;
127
- gap: 6px;
128
- margin-right: 8px;
129
- color: var(--idp-muted-fg);
130
- font-family: var(--idp-mono);
131
- font-size: 11px;
132
- }
133
- .live-dot {
134
- width: 6px;
135
- height: 6px;
136
- border-radius: 50%;
137
- background: var(--idp-ok);
138
- box-shadow: 0 0 8px var(--idp-ok);
134
+ gap: 8px;
139
135
  }
140
- .wrap {
141
- max-width: 1240px;
142
- margin: 0 auto;
143
- padding: 0 32px;
136
+ .nav-signin {
137
+ color: var(--idp-accent);
138
+ font-size: 13px;
139
+ cursor: pointer;
144
140
  }
145
- .proof, .section, .manifesto, .cta, footer {
146
- border-bottom: 1px solid var(--idp-border-soft);
141
+ .nav-signin:hover {
142
+ text-decoration: underline;
147
143
  }
144
+
145
+ /* Proof */
148
146
  .proof {
149
- padding: 56px 0;
147
+ padding: 64px 0;
148
+ text-align: center;
150
149
  }
151
150
  .proof-label {
152
151
  margin-bottom: 28px;
153
- color: var(--idp-muted-fg);
154
- text-align: center;
155
- font-family: var(--idp-mono);
156
- font-size: 11px;
157
- letter-spacing: 0.12em;
158
- text-transform: uppercase;
152
+ color: var(--idp-fg-3);
153
+ font-size: 14px;
159
154
  }
160
155
  .proof-row {
161
- display: grid;
162
- grid-template-columns: repeat(6, 1fr);
163
- gap: 24px;
164
- place-items: center;
165
- opacity: 0.72;
156
+ display: flex;
157
+ flex-wrap: wrap;
158
+ justify-content: center;
159
+ gap: 16px 48px;
166
160
  }
167
161
  .proof-name {
168
162
  color: var(--idp-fg-3);
169
- font-family: var(--idp-display);
170
- font-size: 18px;
171
- font-weight: 700;
163
+ font-size: 22px;
164
+ font-weight: 600;
172
165
  letter-spacing: -0.02em;
166
+ opacity: 0.82;
173
167
  }
168
+
169
+ /* Sections */
174
170
  .section {
175
- padding: 120px 0;
171
+ padding: 110px 0;
176
172
  }
177
173
  .section.alt {
178
- background: var(--idp-bg-2);
174
+ background: var(--idp-bg);
179
175
  }
180
176
  .section-head {
181
- max-width: 760px;
177
+ max-width: 720px;
182
178
  margin: 0 auto 64px;
183
179
  text-align: center;
184
180
  }
185
181
  .eyebrow {
186
- display: inline-flex;
187
- align-items: center;
188
- gap: 8px;
189
- margin-bottom: 16px;
190
- color: var(--idp-muted-fg);
191
- font-family: var(--idp-mono);
192
- font-size: 11px;
193
- letter-spacing: 0.1em;
194
- text-transform: uppercase;
182
+ margin-bottom: 6px;
183
+ color: var(--idp-accent);
184
+ font-size: 19px;
185
+ font-weight: 600;
186
+ letter-spacing: -0.01em;
195
187
  }
196
- .eyebrow::before, .eyebrow::after {
197
- content: '';
198
- width: 24px;
199
- height: 1px;
200
- background: var(--idp-border-strong);
188
+ .eyebrow.sm {
189
+ color: var(--idp-fg-3);
190
+ font-size: 12px;
191
+ font-weight: 600;
192
+ letter-spacing: 0.06em;
193
+ text-transform: uppercase;
201
194
  }
202
- h2, h3, q {
195
+ h2 {
203
196
  margin: 0;
204
197
  font-family: var(--idp-display);
205
- letter-spacing: -0.03em;
206
- }
207
- h2 {
208
198
  font-size: clamp(36px, 4.5vw, 56px);
209
- line-height: 1.05;
210
- }
211
- em {
212
- color: var(--idp-accent-hover);
213
- font-family: var(--idp-serif);
214
- font-style: italic;
215
- font-weight: 400;
199
+ font-weight: 700;
200
+ line-height: 1.07;
201
+ letter-spacing: -0.025em;
216
202
  }
217
203
  .lede {
218
- max-width: 640px;
219
- margin: 20px auto 0;
204
+ margin-top: 18px;
220
205
  color: var(--idp-fg-3);
221
- font-size: 17px;
222
- line-height: 1.55;
206
+ font-size: clamp(18px, 1.6vw, 21px);
207
+ line-height: 1.45;
208
+ }
209
+ em {
210
+ color: var(--idp-accent);
211
+ font-style: normal;
223
212
  }
213
+
214
+ /* Bento */
224
215
  .bento {
225
216
  display: grid;
226
217
  grid-template-columns: repeat(6, 1fr);
227
218
  gap: 16px;
228
219
  }
229
- .tile, .tier, .chain-panel, .terminal {
230
- border: 1px solid var(--idp-border-soft);
231
- border-radius: 12px;
232
- background: var(--idp-bg-2);
233
- }
234
220
  .tile {
235
- padding: 28px;
221
+ display: flex;
222
+ flex-direction: column;
223
+ padding: 34px;
224
+ border: 0.5px solid var(--idp-border-soft);
225
+ border-radius: 28px;
226
+ background: var(--idp-card);
227
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.05), 0 1px 3px rgba(0, 0, 0, 0.04);
228
+ }
229
+ .tile.col-3 {
230
+ grid-column: span 3;
231
+ }
232
+ .tile.col-2 {
233
+ grid-column: span 2;
234
+ }
235
+ .tile.tall {
236
+ grid-row: span 1;
236
237
  }
237
- .tile.col-2 { grid-column: span 2; }
238
- .tile.col-3 { grid-column: span 3; }
239
- .tile.tall { grid-row: span 2; }
240
238
  .tile-tag {
241
- display: inline-flex;
242
- align-items: center;
243
- gap: 6px;
244
- margin-bottom: 14px;
239
+ margin-bottom: 10px;
245
240
  color: var(--idp-accent-hover);
246
- font-family: var(--idp-mono);
247
- font-size: 10.5px;
241
+ font-size: 13px;
248
242
  font-weight: 600;
249
- letter-spacing: 0.06em;
250
- text-transform: uppercase;
251
- }
252
- .tile-tag::before {
253
- content: '';
254
- width: 6px;
255
- height: 6px;
256
- border-radius: 999px;
257
- background: var(--idp-accent);
243
+ letter-spacing: -0.01em;
258
244
  }
259
245
  .tile h3 {
260
- margin-bottom: 10px;
261
- font-size: 24px;
262
- line-height: 1.15;
246
+ margin: 0 0 10px;
247
+ font-family: var(--idp-display);
248
+ font-size: 28px;
249
+ font-weight: 700;
250
+ line-height: 1.1;
251
+ letter-spacing: -0.025em;
263
252
  }
264
- .tile p, .tier li, .chain-step p {
253
+ .tile p {
254
+ max-width: 42ch;
255
+ margin: 0;
265
256
  color: var(--idp-fg-3);
266
- font-size: 14px;
267
- line-height: 1.55;
257
+ font-size: 16px;
258
+ line-height: 1.45;
268
259
  }
269
- .approval-stack {
270
- display: grid;
271
- gap: 6px;
260
+ .tile-visual {
272
261
  margin-top: 22px;
273
262
  }
274
- .approval-row {
275
- display: grid;
276
- grid-template-columns: 28px 1fr auto;
277
- gap: 12px;
278
- align-items: center;
279
- padding: 10px 12px;
280
- border: 1px solid var(--idp-border-soft);
281
- border-left: 2px solid var(--idp-accent);
282
- border-radius: 6px;
283
- background: var(--idp-bg);
284
- }
285
- .avatar {
286
- width: 28px;
287
- height: 28px;
288
- display: grid;
289
- place-items: center;
290
- border: 1px solid var(--idp-border);
291
- border-radius: 50%;
292
- background: var(--idp-card-2);
293
- color: var(--idp-muted-fg);
294
- font-family: var(--idp-mono);
295
- font-size: 10px;
296
- font-weight: 700;
297
- }
298
- .approval-row strong {
299
- display: block;
300
- color: var(--idp-fg);
301
- font-size: 12.5px;
263
+ .tile-foot {
264
+ margin-top: auto;
265
+ padding-top: 16px;
266
+ color: var(--idp-fg-3);
267
+ font-size: 13px;
302
268
  font-weight: 500;
303
269
  }
304
- .approval-row span.meta {
305
- color: color-mix(in srgb, var(--idp-muted-fg), transparent 30%);
306
- font-family: var(--idp-mono);
307
- font-size: 10.5px;
308
- }
309
- .identity-card {
310
- position: relative;
311
- overflow: hidden;
312
- margin-top: 22px;
313
- border: 1px solid var(--idp-border);
314
- border-radius: 10px;
315
- padding: 20px;
316
- background: linear-gradient(140deg, var(--idp-card) 0%, var(--idp-bg) 100%);
317
- }
318
- .identity-card::after {
319
- content: '';
320
- position: absolute;
321
- top: -100px;
322
- right: -80px;
323
- width: 240px;
324
- height: 240px;
325
- border-radius: 50%;
326
- background: radial-gradient(circle, rgba(0,105,242,0.4), transparent 65%);
327
- }
328
- .identity-card > * {
329
- position: relative;
330
- z-index: 1;
331
- }
332
- .chip {
333
- width: 32px;
334
- height: 24px;
335
- margin: 18px 0 14px;
336
- border-radius: 3px;
337
- background: linear-gradient(135deg, #93bbfd 0%, #0050b9 80%);
338
- }
339
- .mono {
340
- color: var(--idp-muted-fg);
341
- font-family: var(--idp-mono);
342
- font-size: 10.5px;
343
- }
344
- .metric {
345
- margin-top: 8px;
346
- background: linear-gradient(180deg, var(--idp-fg) 0%, var(--idp-muted-fg) 110%);
347
- background-clip: text;
348
- color: transparent;
270
+ .tile-metric {
271
+ margin-top: auto;
272
+ padding-top: 18px;
349
273
  font-family: var(--idp-display);
350
274
  font-size: 64px;
351
275
  font-weight: 700;
352
276
  letter-spacing: -0.04em;
353
277
  line-height: 1;
354
278
  }
355
- .metric span {
279
+ .tile-metric .unit {
280
+ margin-left: 2px;
281
+ color: var(--idp-fg-3);
356
282
  font-size: 24px;
283
+ font-weight: 600;
357
284
  }
358
285
  .devices-row {
359
286
  display: grid;
360
287
  grid-template-columns: repeat(4, 1fr);
361
- gap: 8px;
288
+ gap: 10px;
362
289
  margin-top: 22px;
363
290
  }
364
291
  .dev-cell {
365
- padding: 14px 10px;
366
- border: 1px solid var(--idp-border-soft);
367
- border-radius: 6px;
368
- background: var(--idp-bg);
292
+ padding: 16px 8px;
293
+ border: 0.5px solid var(--idp-border-soft);
294
+ border-radius: 16px;
295
+ background: var(--idp-bg-2);
369
296
  text-align: center;
370
297
  }
371
298
  .dev-icon {
372
- width: 32px;
373
- height: 32px;
374
- display: inline-flex;
375
- align-items: center;
299
+ display: flex;
376
300
  justify-content: center;
377
301
  margin-bottom: 8px;
378
- border: 1px solid rgba(96,165,250,0.35);
379
- border-radius: 9px;
380
- color: var(--idp-accent-hover);
302
+ color: var(--idp-accent);
381
303
  }
382
304
  .dev-name {
383
- color: var(--idp-fg);
384
- font-size: 12px;
385
- font-weight: 500;
305
+ font-size: 14px;
306
+ font-weight: 600;
386
307
  }
387
308
  .dev-sub {
388
- color: var(--idp-muted-fg);
389
- font-family: var(--idp-mono);
390
- font-size: 10px;
309
+ margin-top: 1px;
310
+ color: var(--idp-fg-3);
311
+ font-size: 11px;
391
312
  }
392
- .chain-grid, .dev-grid {
313
+
314
+ /* On-chain */
315
+ .chain-grid {
393
316
  display: grid;
394
- grid-template-columns: 1fr 1fr;
317
+ grid-template-columns: 1.05fr 1fr;
395
318
  gap: 48px;
396
- }
397
- .chain-steps {
398
- display: grid;
399
- gap: 28px;
319
+ align-items: start;
400
320
  }
401
321
  .chain-step {
402
322
  display: grid;
403
- grid-template-columns: 70px 1fr;
323
+ grid-template-columns: 52px 1fr;
404
324
  gap: 16px;
405
- padding-bottom: 24px;
406
- border-bottom: 1px solid var(--idp-border-soft);
325
+ padding-bottom: 26px;
407
326
  }
408
- .chain-step > div {
327
+ .chain-step + .chain-step {
328
+ border-top: 0.5px solid var(--idp-border-soft);
329
+ padding-top: 26px;
330
+ }
331
+ .chain-step .num {
332
+ padding-top: 4px;
409
333
  color: var(--idp-accent-hover);
410
- font-family: var(--idp-mono);
411
- font-size: 11px;
412
- font-weight: 600;
413
- letter-spacing: 0.08em;
334
+ font-size: 13px;
335
+ font-weight: 700;
336
+ letter-spacing: 0.02em;
337
+ }
338
+ .chain-step h4 {
339
+ margin: 0 0 6px;
340
+ font-family: var(--idp-display);
341
+ font-size: 24px;
342
+ font-weight: 700;
343
+ letter-spacing: -0.02em;
344
+ }
345
+ .chain-step p {
346
+ margin: 0;
347
+ color: var(--idp-fg-3);
348
+ font-size: 16px;
349
+ line-height: 1.5;
414
350
  }
415
351
  .chain-panel {
416
352
  overflow: hidden;
417
- background: var(--idp-bg);
353
+ border: 0.5px solid var(--idp-border-soft);
354
+ border-radius: 22px;
355
+ background: var(--idp-bg-2);
356
+ box-shadow: 0 10px 30px -14px rgba(0, 0, 0, 0.12);
418
357
  }
419
- .chain-head {
358
+ .chain-panel-head {
420
359
  display: flex;
360
+ align-items: center;
421
361
  justify-content: space-between;
422
- padding: 14px 18px;
423
- border-bottom: 1px solid var(--idp-border-soft);
424
- color: var(--idp-muted-fg);
425
- font-family: var(--idp-mono);
426
- font-size: 11px;
427
- letter-spacing: 0.08em;
362
+ padding: 16px 18px;
363
+ border-bottom: 0.5px solid var(--idp-border-soft);
364
+ }
365
+ .chain-panel-head .ttl {
366
+ color: var(--idp-fg-3);
367
+ font-size: 12px;
368
+ font-weight: 600;
369
+ letter-spacing: 0.04em;
428
370
  text-transform: uppercase;
429
371
  }
430
372
  .chain-block {
431
- display: grid;
432
- grid-template-columns: auto 1fr auto;
373
+ display: flex;
374
+ align-items: center;
433
375
  gap: 12px;
434
- margin: 8px 14px;
435
- padding: 14px 16px;
436
- border: 1px solid var(--idp-border-soft);
437
- border-radius: 8px;
438
- color: var(--idp-muted-fg);
376
+ padding: 12px 18px;
439
377
  font-family: var(--idp-mono);
440
- font-size: 11px;
378
+ font-size: 12px;
379
+ }
380
+ .chain-block + .chain-block {
381
+ border-top: 0.5px solid var(--idp-border-soft);
382
+ }
383
+ .chain-block.is-idp {
384
+ background: var(--idp-accent-soft);
385
+ }
386
+ .blk-num {
387
+ width: 88px;
388
+ flex-shrink: 0;
389
+ color: var(--idp-fg-3);
390
+ }
391
+ .blk-hash {
392
+ flex: 1;
393
+ min-width: 0;
394
+ display: inline-flex;
395
+ align-items: center;
396
+ gap: 6px;
397
+ color: var(--idp-fg);
398
+ }
399
+ .blk-tag {
400
+ padding: 2px 8px;
401
+ border-radius: var(--idp-radius-pill);
402
+ font-family: var(--idp-font);
403
+ font-size: 10px;
404
+ font-weight: 700;
441
405
  }
442
- .chain-block.idp {
443
- border-left: 2px solid var(--idp-accent);
406
+ .blk-tag.cnf {
407
+ background: var(--idp-ok-bg);
408
+ color: var(--idp-ok);
409
+ }
410
+ .blk-tag.idp {
444
411
  background: var(--idp-accent-soft);
412
+ color: var(--idp-accent-hover);
413
+ }
414
+ .chain-foot {
415
+ padding: 20px;
416
+ border-top: 0.5px solid var(--idp-border-soft);
417
+ background: var(--idp-card);
418
+ }
419
+ .chain-foot .lab {
420
+ margin-bottom: 8px;
421
+ color: var(--idp-accent-hover);
422
+ font-size: 11px;
423
+ font-weight: 600;
424
+ letter-spacing: 0.04em;
425
+ text-transform: uppercase;
426
+ }
427
+ .chain-foot .quote {
428
+ color: var(--idp-fg);
429
+ font-size: 18px;
430
+ font-weight: 500;
431
+ line-height: 1.5;
432
+ letter-spacing: -0.01em;
445
433
  }
434
+
435
+ /* Pricing */
446
436
  .tiers {
447
437
  display: grid;
448
438
  grid-template-columns: repeat(3, 1fr);
449
- gap: 16px;
439
+ gap: 20px;
440
+ align-items: start;
450
441
  }
451
442
  .tier {
452
443
  position: relative;
453
- display: flex;
454
- flex-direction: column;
455
- padding: 28px;
444
+ padding: 34px 30px;
445
+ border: 0.5px solid var(--idp-border-soft);
446
+ border-radius: 24px;
447
+ background: var(--idp-card);
448
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.05);
456
449
  }
457
450
  .tier.featured {
458
- border-color: var(--idp-accent);
459
- background: linear-gradient(180deg, var(--idp-accent-soft) 0%, var(--idp-bg-2) 40%);
451
+ border: 1.5px solid var(--idp-accent);
452
+ box-shadow: 0 20px 50px -20px rgba(0, 0, 0, 0.22);
453
+ }
454
+ .tier-ribbon {
455
+ position: absolute;
456
+ top: -12px;
457
+ left: 30px;
458
+ padding: 4px 12px;
459
+ border-radius: var(--idp-radius-pill);
460
+ background: var(--idp-accent);
461
+ color: var(--idp-accent-fg);
462
+ font-size: 12px;
463
+ font-weight: 600;
460
464
  }
461
465
  .tier-name {
462
- margin-bottom: 10px;
463
- color: var(--idp-muted-fg);
464
- font-family: var(--idp-mono);
465
- font-size: 11px;
466
- letter-spacing: 0.08em;
467
- text-transform: uppercase;
466
+ color: var(--idp-accent-hover);
467
+ font-size: 13px;
468
+ font-weight: 600;
469
+ letter-spacing: -0.01em;
470
+ }
471
+ .tier h3 {
472
+ margin: 6px 0 18px;
473
+ font-family: var(--idp-display);
474
+ font-size: 24px;
475
+ font-weight: 700;
476
+ letter-spacing: -0.02em;
468
477
  }
469
478
  .price {
470
- margin: 12px 0 20px;
471
479
  font-family: var(--idp-display);
472
- font-size: 40px;
480
+ font-size: 48px;
473
481
  font-weight: 700;
482
+ letter-spacing: -0.04em;
474
483
  }
475
- .tier ul {
476
- flex: 1;
477
- margin: 0 0 24px;
478
- padding-left: 20px;
484
+ .price .sub {
485
+ color: var(--idp-fg-3);
486
+ font-size: 15px;
487
+ font-weight: 500;
488
+ letter-spacing: -0.01em;
489
+ }
490
+ .price-note {
491
+ margin: 6px 0 20px;
492
+ color: var(--idp-fg-3);
493
+ font-size: 13px;
494
+ }
495
+ .tier-list {
496
+ list-style: none;
497
+ display: flex;
498
+ flex-direction: column;
499
+ gap: 11px;
500
+ margin: 0 0 26px;
501
+ padding: 0;
502
+ }
503
+ .tier-list li {
504
+ position: relative;
505
+ padding-left: 26px;
506
+ color: var(--idp-fg-3);
507
+ font-size: 15px;
508
+ line-height: 1.4;
509
+ }
510
+ .tier-list li::before {
511
+ content: '';
512
+ position: absolute;
513
+ left: 0;
514
+ top: 5px;
515
+ width: 16px;
516
+ height: 16px;
517
+ border-radius: 50%;
518
+ background: var(--idp-ok);
519
+ -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7' fill='none' stroke='black' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/13px no-repeat;
520
+ mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5 12.5l4.5 4.5L19 7' fill='none' stroke='black' stroke-width='2.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/13px no-repeat;
521
+ }
522
+ .tier idp-button {
523
+ display: block;
524
+ }
525
+ .tier idp-button::part(button) {
526
+ width: 100%;
527
+ }
528
+
529
+ /* Developers */
530
+ .dev-grid {
531
+ display: grid;
532
+ grid-template-columns: 1fr 1.05fr;
533
+ gap: 56px;
534
+ align-items: center;
535
+ }
536
+ .dev-text h3 {
537
+ margin: 0 0 16px;
538
+ font-family: var(--idp-display);
539
+ font-size: clamp(30px, 3.4vw, 42px);
540
+ font-weight: 700;
541
+ line-height: 1.1;
542
+ letter-spacing: -0.025em;
479
543
  }
480
544
  .dev-text p {
545
+ max-width: 46ch;
546
+ margin: 0 0 14px;
481
547
  color: var(--idp-fg-3);
548
+ font-size: 17px;
549
+ line-height: 1.5;
482
550
  }
483
- .tags {
551
+ .dev-tags {
484
552
  display: flex;
485
553
  flex-wrap: wrap;
486
- gap: 6px;
487
- margin: 18px 0 22px;
554
+ gap: 8px;
555
+ margin: 22px 0 26px;
488
556
  }
489
- .tags span {
490
- padding: 4px 10px;
491
- border: 1px solid var(--idp-border);
492
- border-radius: 999px;
557
+ .dev-tag {
558
+ padding: 5px 12px;
559
+ border: 0.5px solid var(--idp-border-soft);
560
+ border-radius: var(--idp-radius-pill);
493
561
  background: var(--idp-bg-2);
494
562
  color: var(--idp-fg-3);
495
- font-family: var(--idp-mono);
496
- font-size: 10.5px;
563
+ font-size: 12px;
564
+ font-weight: 500;
565
+ white-space: nowrap;
566
+ }
567
+ .dev-actions {
568
+ display: flex;
569
+ gap: 18px;
570
+ flex-wrap: wrap;
571
+ align-items: center;
497
572
  }
498
573
  .terminal {
499
574
  overflow: hidden;
500
- background: var(--idp-bg);
575
+ border: 0.5px solid rgba(255, 255, 255, 0.08);
576
+ border-radius: 18px;
577
+ background: var(--idp-term-bg);
578
+ box-shadow: 0 30px 70px -24px rgba(0, 0, 0, 0.45);
501
579
  }
502
580
  .term-bar {
503
581
  display: flex;
504
- gap: 6px;
505
- padding: 10px 14px;
506
- border-bottom: 1px solid var(--idp-border-soft);
582
+ align-items: center;
583
+ gap: 8px;
584
+ padding: 12px 14px;
585
+ border-bottom: 0.5px solid rgba(255, 255, 255, 0.08);
586
+ background: rgba(255, 255, 255, 0.04);
507
587
  }
508
588
  .tdot {
509
- width: 11px;
510
- height: 11px;
589
+ width: 12px;
590
+ height: 12px;
511
591
  border-radius: 50%;
512
592
  }
513
- .red { background: #ff5f57; }
514
- .yellow { background: #ffbd2e; }
515
- .green { background: #28c840; }
516
- pre {
517
- min-height: 300px;
518
- margin: 0;
519
- padding: 22px 24px;
520
- color: var(--idp-fg-3);
593
+ .term-bar .name {
594
+ margin-left: 8px;
595
+ color: rgba(255, 255, 255, 0.5);
596
+ font-family: var(--idp-mono);
597
+ font-size: 11px;
598
+ }
599
+ .term-bar .shell {
600
+ margin-left: auto;
601
+ color: rgba(255, 255, 255, 0.35);
602
+ font-family: var(--idp-mono);
603
+ font-size: 10px;
604
+ }
605
+ .term-body {
606
+ padding: 20px;
607
+ color: rgba(255, 255, 255, 0.85);
521
608
  font-family: var(--idp-mono);
522
609
  font-size: 13px;
523
610
  line-height: 1.85;
524
611
  }
525
- .manifesto, .cta {
526
- padding: 120px 0;
612
+ .t-dim {
613
+ color: rgba(255, 255, 255, 0.4);
614
+ }
615
+ .t-acc {
616
+ color: #6cb6ff;
617
+ }
618
+ .t-w {
619
+ color: #fff;
620
+ }
621
+ .t-ok {
622
+ color: #41d97e;
623
+ }
624
+ .t-am {
625
+ color: #ffb340;
626
+ }
627
+ .t-cur {
628
+ display: inline-block;
629
+ width: 8px;
630
+ height: 15px;
631
+ background: #6cb6ff;
632
+ vertical-align: -2px;
633
+ animation: blink 1.1s steps(1) infinite;
634
+ }
635
+ @keyframes blink {
636
+ 50% {
637
+ opacity: 0;
638
+ }
639
+ }
640
+
641
+ /* Manifesto */
642
+ .manifesto {
643
+ padding: 130px 0;
644
+ background: var(--idp-bg);
527
645
  text-align: center;
528
646
  }
529
- q {
647
+ .manifesto q {
530
648
  display: block;
531
- max-width: 980px;
649
+ max-width: 16ch;
532
650
  margin: 0 auto;
533
- font-family: var(--idp-serif);
534
- font-size: clamp(32px, 4vw, 48px);
535
- font-style: italic;
536
- line-height: 1.2;
651
+ font-family: var(--idp-display);
652
+ font-size: clamp(28px, 3.6vw, 46px);
653
+ font-weight: 600;
654
+ line-height: 1.18;
655
+ letter-spacing: -0.025em;
537
656
  quotes: none;
538
657
  }
539
- q::before, q::after {
658
+ .manifesto q::before,
659
+ .manifesto q::after {
540
660
  content: none;
541
661
  }
662
+ .manifesto-cite {
663
+ margin-top: 28px;
664
+ color: var(--idp-fg-3);
665
+ font-size: 14px;
666
+ }
667
+
668
+ /* CTA */
542
669
  .cta {
543
- position: relative;
544
- overflow: hidden;
670
+ padding: 130px 0;
671
+ text-align: center;
545
672
  }
546
- .cta::before {
547
- content: '';
548
- position: absolute;
549
- left: 50%;
550
- top: 50%;
551
- width: 800px;
552
- height: 600px;
553
- transform: translate(-50%, -50%);
554
- background: radial-gradient(ellipse, rgba(59,130,246,0.15) 0%, transparent 60%);
555
- }
556
- .cta .wrap {
557
- position: relative;
673
+ .cta h2 {
674
+ font-size: clamp(40px, 5vw, 64px);
675
+ line-height: 1.05;
558
676
  }
559
677
  .cta p {
560
678
  max-width: 560px;
561
- margin: 24px auto 32px;
679
+ margin: 20px auto 32px;
562
680
  color: var(--idp-fg-3);
681
+ font-size: 19px;
682
+ line-height: 1.45;
563
683
  }
684
+ .cta-actions {
685
+ display: flex;
686
+ gap: 26px;
687
+ flex-wrap: wrap;
688
+ align-items: center;
689
+ justify-content: center;
690
+ }
691
+
692
+ /* Footer */
564
693
  footer {
565
- padding: 64px 0 28px;
566
- border-bottom: 0;
694
+ padding: 48px 0 36px;
695
+ border-top: 0.5px solid var(--idp-border-soft);
696
+ background: var(--idp-bg);
697
+ color: var(--idp-fg-3);
698
+ font-size: 12px;
567
699
  }
568
700
  .footer-cols {
569
701
  display: grid;
570
702
  grid-template-columns: 2fr 1fr 1fr 1fr;
571
- gap: 48px;
572
- margin-bottom: 48px;
703
+ gap: 32px;
704
+ padding-bottom: 32px;
573
705
  }
574
- .footer-brand p, .footer-col a, .footer-bottom {
575
- color: var(--idp-muted-fg);
706
+ .footer-brand p {
707
+ max-width: 36ch;
708
+ margin: 14px 0;
709
+ color: var(--idp-fg-3);
576
710
  font-size: 13px;
711
+ line-height: 1.5;
577
712
  }
578
- .footer-col {
579
- display: grid;
580
- gap: 9px;
713
+ .footer-status {
714
+ display: inline-flex;
715
+ align-items: center;
716
+ gap: 7px;
717
+ color: var(--idp-fg-3);
718
+ font-size: 12px;
581
719
  }
582
720
  .footer-col h4 {
721
+ margin: 0 0 12px;
722
+ color: var(--idp-fg);
723
+ font-size: 12px;
724
+ font-weight: 600;
725
+ }
726
+ .footer-col ul {
727
+ list-style: none;
728
+ display: flex;
729
+ flex-direction: column;
730
+ gap: 9px;
583
731
  margin: 0;
732
+ padding: 0;
733
+ }
734
+ .footer-col a {
584
735
  color: var(--idp-fg-3);
585
- font-family: var(--idp-mono);
586
- font-size: 11px;
587
- letter-spacing: 0.1em;
588
- text-transform: uppercase;
736
+ text-decoration: none;
737
+ cursor: pointer;
738
+ }
739
+ .footer-col a:hover {
740
+ color: var(--idp-fg);
589
741
  }
590
742
  .footer-bottom {
591
743
  display: flex;
744
+ align-items: center;
592
745
  justify-content: space-between;
593
- padding-top: 22px;
594
- border-top: 1px solid var(--idp-border-soft);
595
- font-family: var(--idp-mono);
596
- font-size: 11px;
746
+ gap: 12px;
747
+ padding-top: 24px;
748
+ border-top: 0.5px solid var(--idp-border-soft);
749
+ flex-wrap: wrap;
750
+ }
751
+ .footer-bottom .links {
752
+ display: flex;
753
+ gap: 18px;
754
+ }
755
+ .footer-bottom .links a {
756
+ color: var(--idp-fg-3);
757
+ text-decoration: none;
758
+ cursor: pointer;
759
+ }
760
+ .footer-bottom .links a:hover {
761
+ color: var(--idp-fg);
762
+ }
763
+
764
+ .live-dot {
765
+ width: 7px;
766
+ height: 7px;
767
+ border-radius: 50%;
768
+ background: var(--idp-ok);
769
+ display: inline-block;
770
+ }
771
+
772
+ @media (max-width: 940px) {
773
+ .nav-links {
774
+ display: none;
775
+ }
776
+ .bento {
777
+ grid-template-columns: 1fr;
778
+ }
779
+ .tile.col-3,
780
+ .tile.col-2 {
781
+ grid-column: span 1;
782
+ }
783
+ .chain-grid,
784
+ .dev-grid,
785
+ .tiers {
786
+ grid-template-columns: 1fr;
787
+ }
788
+ .footer-cols {
789
+ grid-template-columns: 1fr 1fr;
790
+ }
597
791
  }
598
- @media (max-width: 1100px) {
599
- .links { display: none; }
600
- .bento { grid-template-columns: repeat(2, 1fr); }
601
- .tile.col-2, .tile.col-3 { grid-column: span 2; }
602
- .chain-grid, .dev-grid { grid-template-columns: 1fr; }
603
- .tiers { grid-template-columns: 1fr; max-width: 520px; margin: 0 auto; }
604
- .footer-cols { grid-template-columns: 1fr 1fr; }
605
- }
606
- @media (max-width: 720px) {
607
- nav, .wrap { padding-left: 20px; padding-right: 20px; }
608
- .status, .actions .ghost { display: none; }
609
- .proof-row { grid-template-columns: repeat(2, 1fr); }
610
- .bento { grid-template-columns: 1fr; }
611
- .tile.col-2, .tile.col-3 { grid-column: span 1; }
612
- .section, .manifesto, .cta { padding: 80px 0; }
613
- .footer-cols { grid-template-columns: 1fr; }
792
+ @media (max-width: 640px) {
793
+ .section {
794
+ padding: 80px 0;
795
+ }
796
+ .manifesto,
797
+ .cta {
798
+ padding: 90px 0;
799
+ }
800
+ .footer-cols {
801
+ grid-template-columns: 1fr;
802
+ }
614
803
  }
615
804
  `,
616
805
  ];
@@ -618,57 +807,396 @@ let IdpLandingPage = (() => {
618
807
  return html `
619
808
  <div class="nav-shell">
620
809
  <nav>
621
- <div class="logo">idp<span class="logo-dot"></span>global</div>
622
- <div class="links"><a href="#product">Product</a><a href="#features">Features</a><a href="#chain">On-chain</a><a href="#pricing">Pricing</a><a href="#developers">Developers</a></div>
623
- <div class="actions"><span class="status"><span class="live-dot"></span>All systems normal</span><idp-button variant="ghost" size="sm">Sign in</idp-button><idp-button variant="accent" size="sm">Claim identity</idp-button></div>
810
+ <a class="logo" href="#">idp<span class="logo-dot"></span>global</a>
811
+ <div class="nav-links">
812
+ <a href="#product">Product</a>
813
+ <a href="#features">Features</a>
814
+ <a href="#chain">On-chain</a>
815
+ <a href="#pricing">Pricing</a>
816
+ <a href="#developers">Developers</a>
817
+ </div>
818
+ <div class="actions">
819
+ <a class="nav-signin">Sign in</a>
820
+ <idp-button variant="accent" size="sm">Claim identity</idp-button>
821
+ </div>
624
822
  </nav>
625
823
  </div>
824
+ `;
825
+ }
826
+ renderProof() {
827
+ const names = ['Lossless', 'design.estate', 'Holopin', 'Cardano', 'Spotter', 'Catalyst'];
828
+ return html `
829
+ <section class="proof">
830
+ <div class="wrap-wide">
831
+ <div class="proof-label">Trusted by teams shipping identity at every scale</div>
832
+ <div class="proof-row">${names.map((nameArg) => html `<div class="proof-name">${nameArg}</div>`)}</div>
833
+ </div>
834
+ </section>
626
835
  `;
627
836
  }
628
837
  renderFeatures() {
838
+ const devices = [
839
+ ['iPhone', 'lucide:smartphone', 'Push · NFC'],
840
+ ['Watch', 'lucide:watch', '⌘↩ approve'],
841
+ ['iPad', 'lucide:tablet', 'Split-view'],
842
+ ['Mac', 'lucide:laptop', 'Menu-bar'],
843
+ ];
629
844
  return html `
630
- <section class="section" id="features">
631
- <div class="wrap">
632
- <div class="section-head"><div class="eyebrow">Capabilities</div><h2>Native on every screen <em>you already carry.</em></h2><p class="lede">Approvals on iPhone. Tap-to-auth via NFC. Lock-screen actions on Apple Watch. The same identity, one tap away on any device.</p></div>
845
+ <section class="section alt" id="features">
846
+ <div class="wrap-wide">
847
+ <div class="section-head">
848
+ <div class="eyebrow">Capabilities</div>
849
+ <h2>Native on every screen you already carry.</h2>
850
+ <p class="lede">
851
+ Approvals on iPhone. Tap-to-auth via NFC. Lock-screen actions on Apple Watch. The same identity, one tap
852
+ away on any device.
853
+ </p>
854
+ </div>
633
855
  <div class="bento">
634
- <div class="tile col-3 tall"><div class="tile-tag">Push approvals</div><h3>Approve or deny <em>in one tap.</em></h3><p>Every login, OAuth grant, and sensitive action triggers a real-time approval.</p><div class="approval-stack">${['GitHub OAuth|repo:read - 2 min ago|approved|ok', 'CLI login - MacBook Pro|Berlin - just now|pending|accent', 'Unknown device|Lagos - 1 hr ago|denied|error', 'NFC tap - door 4F|HQ - 12 min ago|approved|ok'].map((rowArg) => { const row = rowArg.split('|'); return html `<div class="approval-row"><div class="avatar">${row[0].slice(0, 2).toUpperCase()}</div><div><strong>${row[0]}</strong><span class="meta">${row[1]}</span></div><idp-badge variant=${row[3]}>${row[2]}</idp-badge></div>`; })}</div></div>
635
- <div class="tile col-3"><div class="tile-tag">NFC tap-to-auth</div><h3>Tap to <em>authenticate.</em></h3><p>Hold your phone to any compatible reader. Identity token exchanges in under a second.</p><div class="identity-card"><h3>Alex Mercer</h3><div class="mono">@alexmercer - Personal</div><div class="chip"></div><div class="mono">did:idp:0x4a3f...c819</div></div></div>
636
- <div class="tile col-3"><div class="tile-tag">Four platforms</div><h3>iPhone, Watch, iPad, Mac.</h3><p>Every device you carry is a trusted authenticator.</p><div class="devices-row">${[
637
- ['iPhone', 'phone'],
638
- ['Watch', 'smartphone-nfc'],
639
- ['iPad', 'device'],
640
- ['Mac', 'monitor'],
641
- ].map((deviceArg) => html `<div class="dev-cell"><div class="dev-icon"><idp-icon name=${deviceArg[1]} size="18"></idp-icon></div><div class="dev-name">${deviceArg[0]}</div><div class="dev-sub">trusted</div></div>`)}</div><div class="mono" style="margin-top:14px">One approval, anywhere - synchronized end-to-end.</div></div>
642
- <div class="tile col-2"><div class="tile-tag">Average approval</div><h3>Sub-second auth.</h3><p>Push delivery, biometric prompt, and signed response under a second.</p><div class="metric">0.8<span>sec</span></div></div>
643
- <div class="tile col-2"><div class="tile-tag">Audit-grade</div><h3>Every action, <em>on the record.</em></h3><p>Tamper-evident audit trail per identity and organization.</p></div>
644
- <div class="tile col-2"><div class="tile-tag">Recovery</div><h3>Lose a phone? Not your identity.</h3><p>Multi-device recovery or social-recovery quorum. No vendor lockout.</p></div>
856
+ <div class="tile col-3 tall">
857
+ <div class="tile-tag">Push approvals</div>
858
+ <h3>Approve or deny in one tap.</h3>
859
+ <p>
860
+ Every login, OAuth grant, and sensitive action triggers a real-time approval. Full context — who, where,
861
+ why — before you decide.
862
+ </p>
863
+ <div class="tile-visual">
864
+ <idp-screenshot-placeholder
865
+ variant="tile"
866
+ label="Approval inbox"
867
+ meta="push approval list UI"
868
+ ></idp-screenshot-placeholder>
869
+ </div>
870
+ </div>
871
+
872
+ <div class="tile col-3">
873
+ <div class="tile-tag">NFC tap-to-auth</div>
874
+ <h3>Tap to authenticate.</h3>
875
+ <p>
876
+ Hold your iPhone to any compatible reader. Identity token exchanges in under a second, signed by your
877
+ on-device key.
878
+ </p>
879
+ <div class="tile-visual">
880
+ <idp-screenshot-placeholder
881
+ variant="tile-short"
882
+ label="Identity card"
883
+ meta="NFC tap-to-auth credential"
884
+ ></idp-screenshot-placeholder>
885
+ </div>
886
+ </div>
887
+
888
+ <div class="tile col-3">
889
+ <div class="tile-tag">Four platforms</div>
890
+ <h3>iPhone, Watch, iPad, Mac.</h3>
891
+ <p>
892
+ Every device you carry is a trusted authenticator. Approve from a complication on your wrist or a popover
893
+ in your menu bar.
894
+ </p>
895
+ <div class="devices-row">
896
+ ${devices.map((deviceArg) => html `
897
+ <div class="dev-cell">
898
+ <div class="dev-icon"><idp-icon name=${deviceArg[1]} .size=${22}></idp-icon></div>
899
+ <div class="dev-name">${deviceArg[0]}</div>
900
+ <div class="dev-sub">${deviceArg[2]}</div>
901
+ </div>
902
+ `)}
903
+ </div>
904
+ <div class="tile-foot">One approval, anywhere — synchronised end-to-end.</div>
905
+ </div>
906
+
907
+ <div class="tile col-2">
908
+ <div class="tile-tag">Average approval</div>
909
+ <h3>Sub-second auth.</h3>
910
+ <p>Push delivery, biometric prompt, and signed response — under a second, ninety-fifth percentile.</p>
911
+ <div class="tile-metric">0.8<span class="unit">sec</span></div>
912
+ </div>
913
+
914
+ <div class="tile col-2">
915
+ <div class="tile-tag">Audit-grade</div>
916
+ <h3>Every action, on the record.</h3>
917
+ <p>Tamper-evident audit trail per identity, per org. Filter, export, and replay. Cryptographically signed.</p>
918
+ <div class="tile-foot">SOC 2 · ISO 27001 · GDPR-aligned</div>
919
+ </div>
920
+
921
+ <div class="tile col-2">
922
+ <div class="tile-tag">Recovery</div>
923
+ <h3>Lose a phone? Not your identity.</h3>
924
+ <p>Multi-device recovery via your other authenticators or a social-recovery quorum. The Cardano ledger is your safety net.</p>
925
+ <div class="tile-foot">No vendor can lock you out.</div>
926
+ </div>
645
927
  </div>
646
928
  </div>
647
929
  </section>
648
930
  `;
649
931
  }
650
932
  renderChain() {
933
+ const steps = [
934
+ [
935
+ '01 / 03',
936
+ 'Immutable record',
937
+ 'Your identity hash is written to Cardano at creation and on every key rotation. The ledger is tamper-proof by design and replicated across thousands of nodes.',
938
+ ],
939
+ [
940
+ '02 / 03',
941
+ 'Synced on every change',
942
+ 'Profile updates, device additions, and revocations are anchored to the chain — not just stored on idp.global servers. The chain is the source of truth.',
943
+ ],
944
+ [
945
+ '03 / 03',
946
+ 'Independently verifiable',
947
+ 'Anyone — any wallet, any resolver, any client — can verify your identity directly against the public ledger. No dependency on us.',
948
+ ],
949
+ ];
651
950
  return html `
652
- <section class="section alt" id="chain"><div class="wrap"><div class="section-head"><div class="eyebrow">Cardano-anchored</div><h2>Your identity outlives <em>any single server.</em></h2><p class="lede">Every identity is anchored to the Cardano mainnet, independently verifiable and recoverable.</p></div><div class="chain-grid"><div class="chain-steps">${[['01 / 03', 'Immutable record', 'Your identity hash is written to Cardano at creation and on every key rotation.'], ['02 / 03', 'Synced on every change', 'Profile updates, device additions, and revocations are anchored to the chain.'], ['03 / 03', 'Independently verifiable', 'Any compatible resolver can verify your identity directly against the public ledger.']].map((stepArg) => html `<div class="chain-step"><div>${stepArg[0]}</div><section><h3>${stepArg[1]}</h3><p>${stepArg[2]}</p></section></div>`)}</div><div class="chain-panel"><div class="chain-head"><span>Cardano mainnet</span><idp-badge variant="accent">live</idp-badge></div>${['#9 841 220', '#9 841 221', '#9 841 222', '#9 841 223'].map((blockArg, indexArg) => html `<div class="chain-block ${indexArg === 1 || indexArg === 2 ? 'idp' : ''}"><span>${blockArg}</span><span>${indexArg === 1 ? 'did:idp:0x4a3f...c819' : indexArg === 2 ? 'did:idp:0x9b12...f034' : 'confirmed block'}</span><strong>${indexArg === 1 || indexArg === 2 ? 'idp.global' : 'confirmed'}</strong></div>`)}</div></div></div></section>
951
+ <section class="section" id="chain">
952
+ <div class="wrap-wide">
953
+ <div class="section-head">
954
+ <div class="eyebrow">Cardano-anchored</div>
955
+ <h2>Your identity outlives any single server.</h2>
956
+ <p class="lede">
957
+ Every identity is anchored to the Cardano mainnet — independently verifiable, independently recoverable,
958
+ immune to a single point of failure.
959
+ </p>
960
+ </div>
961
+ <div class="chain-grid">
962
+ <div>
963
+ ${steps.map((stepArg) => html `
964
+ <div class="chain-step">
965
+ <div class="num">${stepArg[0]}</div>
966
+ <div><h4>${stepArg[1]}</h4><p>${stepArg[2]}</p></div>
967
+ </div>
968
+ `)}
969
+ </div>
970
+ <div class="chain-panel">
971
+ <div class="chain-panel-head">
972
+ <span class="ttl">Cardano mainnet</span>
973
+ <idp-badge variant="accent"><span class="live-dot"></span>block #9 841 223</idp-badge>
974
+ </div>
975
+ <div style="padding: 6px 0;">
976
+ <div class="chain-block">
977
+ <span class="blk-num">#9 841 220</span><span class="blk-hash">a3f8d2c19…4e712b</span
978
+ ><span class="blk-tag cnf">confirmed</span>
979
+ </div>
980
+ <div class="chain-block is-idp">
981
+ <span class="blk-num">#9 841 221</span>
982
+ <span class="blk-hash">did:idp:0x4a3f…c819 <idp-badge variant="accent">key rotation</idp-badge></span>
983
+ <span class="blk-tag idp">idp.global</span>
984
+ </div>
985
+ <div class="chain-block is-idp">
986
+ <span class="blk-num">#9 841 222</span>
987
+ <span class="blk-hash">did:idp:0x9b12…f034 <idp-badge variant="accent">identity created</idp-badge></span>
988
+ <span class="blk-tag idp">idp.global</span>
989
+ </div>
990
+ <div class="chain-block">
991
+ <span class="blk-num">#9 841 223</span><span class="blk-hash">e7c412a88…91d3f</span
992
+ ><span class="blk-tag cnf">confirmed</span>
993
+ </div>
994
+ </div>
995
+ <div class="chain-foot">
996
+ <div class="lab">If we disappear?</div>
997
+ <div class="quote">
998
+ Your identity record stays on Cardano. Any compatible resolver can verify and recover it. There is no
999
+ lock-in.
1000
+ </div>
1001
+ </div>
1002
+ </div>
1003
+ </div>
1004
+ </div>
1005
+ </section>
653
1006
  `;
654
1007
  }
655
1008
  renderPricing() {
656
1009
  const tiers = [
657
- ['Personal', 'For one person.', '$0', ['One portable identity', 'Push approval on devices', 'NFC tap-to-authenticate', 'Anchored on Cardano'], 'Claim your identity'],
658
- ['Family & Org', 'For teams under 1,000.', '$0', ['Multi-member organization', 'Role-based access control', 'Shared OAuth client registry', 'Full audit trail'], 'Start an organization'],
659
- ['Enterprise', 'Above $1M ARR.', 'Fair', ['Self-hosted and air-gap deployable', 'Compliance and audit support', 'Global admin across orgs', 'Priority SLA'], 'Talk to us'],
1010
+ {
1011
+ name: 'Personal',
1012
+ headline: 'For one person.',
1013
+ price: '$0',
1014
+ sub: ' / forever',
1015
+ note: 'No credit card. No upgrades. Yours.',
1016
+ items: [
1017
+ 'One portable identity across every service',
1018
+ 'Push approval on iPhone, Watch, iPad, Mac',
1019
+ 'NFC tap-to-authenticate',
1020
+ 'Anchored on Cardano permanently',
1021
+ 'Recovery via your other devices',
1022
+ ],
1023
+ cta: 'Claim your identity',
1024
+ variant: 'tint',
1025
+ featured: false,
1026
+ },
1027
+ {
1028
+ name: 'Family & Org',
1029
+ headline: 'For teams under 1,000.',
1030
+ price: '$0',
1031
+ sub: ' / up to 1k users',
1032
+ note: 'Households, hobby projects, growing teams.',
1033
+ items: [
1034
+ 'Multi-member organisation with shared namespace',
1035
+ 'Role-based access control & delegated permissions',
1036
+ 'Shared OAuth client registry',
1037
+ 'Full audit trail per organisation',
1038
+ 'SSO & SCIM included, no upsell',
1039
+ ],
1040
+ cta: 'Start an organisation',
1041
+ variant: 'accent',
1042
+ featured: true,
1043
+ },
1044
+ {
1045
+ name: 'Enterprise',
1046
+ headline: 'Above $1M ARR.',
1047
+ price: 'Fair',
1048
+ sub: ' contribution',
1049
+ note: 'Free until your org passes one million ARR.',
1050
+ items: [
1051
+ 'Self-hosted & air-gap deployable',
1052
+ 'Compliance & audit support (SOC 2, ISO 27001)',
1053
+ 'Global admin across orgs',
1054
+ 'Identity recovery service for end users',
1055
+ 'Priority engineering & SLA',
1056
+ ],
1057
+ cta: 'Talk to us',
1058
+ variant: 'tint',
1059
+ featured: false,
1060
+ },
660
1061
  ];
661
- return html `<section class="section" id="pricing"><div class="wrap"><div class="section-head"><div class="eyebrow">Pricing</div><h2>The same identity, <em>at every scale.</em></h2><p class="lede">Free for the first thousand users. Fair contribution above that. No hard paywalls.</p></div><div class="tiers">${tiers.map((tierArg, indexArg) => html `<div class="tier ${indexArg === 1 ? 'featured' : ''}"><div class="tier-name">${tierArg[0]}</div><h3>${tierArg[1]}</h3><div class="price">${tierArg[2]}</div><ul>${tierArg[3].map((itemArg) => html `<li>${itemArg}</li>`)}</ul><idp-button variant=${indexArg === 1 ? 'accent' : 'ghost'}>${tierArg[4]}</idp-button></div>`)}</div></div></section>`;
1062
+ return html `
1063
+ <section class="section alt" id="pricing">
1064
+ <div class="wrap-wide">
1065
+ <div class="section-head">
1066
+ <div class="eyebrow">Pricing</div>
1067
+ <h2>The same identity, at every scale.</h2>
1068
+ <p class="lede">
1069
+ From a solo developer to a thirty-thousand-person enterprise. Free for the first thousand users. Fair
1070
+ contribution above that. No hard paywalls.
1071
+ </p>
1072
+ </div>
1073
+ <div class="tiers">
1074
+ ${tiers.map((tierArg) => html `
1075
+ <div class="tier ${tierArg.featured ? 'featured' : ''}">
1076
+ ${tierArg.featured ? html `<div class="tier-ribbon">Most popular</div>` : html ``}
1077
+ <div class="tier-name">${tierArg.name}</div>
1078
+ <h3>${tierArg.headline}</h3>
1079
+ <div class="price">${tierArg.price}<span class="sub">${tierArg.sub}</span></div>
1080
+ <div class="price-note">${tierArg.note}</div>
1081
+ <ul class="tier-list">${tierArg.items.map((itemArg) => html `<li>${itemArg}</li>`)}</ul>
1082
+ <idp-button variant=${tierArg.variant}>${tierArg.cta}</idp-button>
1083
+ </div>
1084
+ `)}
1085
+ </div>
1086
+ </div>
1087
+ </section>
1088
+ `;
662
1089
  }
663
1090
  renderDevelopers() {
1091
+ const tags = ['MIT licensed', 'OAuth 2 / OIDC', 'Self-hostable', 'Air-gappable', 'Cardano native', 'SOC 2'];
664
1092
  return html `
665
- <section class="section alt" id="developers"><div class="wrap dev-grid"><div class="dev-text"><div class="eyebrow">For developers</div><h2>No black boxes <em>in your identity stack.</em></h2><p>idp.global is fully open source and MIT licensed. Read the cryptography. Verify the Cardano sync. Run it on your own metal.</p><div class="tags">${['MIT licensed', 'OAuth 2 / OIDC', 'Self-hostable', 'Air-gappable', 'Cardano native', 'SOC 2'].map((tagArg) => html `<span>${tagArg}</span>`)}</div><idp-button variant="accent">View source</idp-button></div><div class="terminal"><div class="term-bar"><span class="tdot red"></span><span class="tdot yellow"></span><span class="tdot green"></span></div><pre><code>$ idp identity create
666
- OK Identity created - did:idp:0x4a3f...c819
667
- OK Confirmed on-chain - permanent
668
-
669
- $ idp login github.com
670
- OK Push sent - iPhone 15 Pro
671
- OK Approved - Watch - 0.8s</code></pre></div></div></section>
1093
+ <section class="section" id="developers">
1094
+ <div class="wrap-wide">
1095
+ <div class="dev-grid">
1096
+ <div class="dev-text">
1097
+ <div class="eyebrow">For developers</div>
1098
+ <h3>No black boxes in your identity stack.</h3>
1099
+ <p>
1100
+ idp.global is fully open source and MIT licensed. Read the cryptography. Verify the Cardano sync. Run it
1101
+ on your own metal.
1102
+ </p>
1103
+ <p>One CLI. Standard OAuth 2 &amp; OIDC. Native SDKs for Node, Python, Swift, Kotlin, Go, Rust.</p>
1104
+ <div class="dev-tags">${tags.map((tagArg) => html `<span class="dev-tag">${tagArg}</span>`)}</div>
1105
+ <div class="dev-actions">
1106
+ <idp-button variant="accent" icon="lucide:github">View on GitHub</idp-button>
1107
+ <idp-button variant="link">Read the docs</idp-button>
1108
+ </div>
1109
+ </div>
1110
+ <div class="terminal">
1111
+ <div class="term-bar">
1112
+ <span class="tdot" style="background:#ff5f57"></span>
1113
+ <span class="tdot" style="background:#ffbd2e"></span>
1114
+ <span class="tdot" style="background:#28c840"></span>
1115
+ <span class="name">~/idp-cli</span>
1116
+ <span class="shell">zsh</span>
1117
+ </div>
1118
+ <div class="term-body">
1119
+ <div><span class="t-dim">$</span> <span class="t-acc">idp</span> <span class="t-w">identity create</span></div>
1120
+ <div><span class="t-dim">›</span> Generating Ed25519 keypair…</div>
1121
+ <div><span class="t-ok">✓</span> Identity created · <span class="t-acc">did:idp:0x4a3f…c819</span></div>
1122
+ <div><span class="t-dim">›</span> Anchoring to Cardano mainnet…</div>
1123
+ <div><span class="t-acc">◆</span> tx submitted · <span class="t-dim">block #9 841 222</span></div>
1124
+ <div><span class="t-ok">✓</span> Confirmed on-chain · <span class="t-w">permanent</span></div>
1125
+ <div>&nbsp;</div>
1126
+ <div><span class="t-dim">$</span> <span class="t-acc">idp</span> <span class="t-w">login github.com</span></div>
1127
+ <div><span class="t-ok">✓</span> Push sent · <span class="t-am">iPhone 15 Pro</span></div>
1128
+ <div><span class="t-ok">✓</span> Approved · <span class="t-dim">⌘↩ on Watch · 0.8s</span></div>
1129
+ <div>
1130
+ <span class="t-ok">✓</span> Token issued · <span class="t-acc">scope</span><span class="t-dim">:</span>
1131
+ <span class="t-w">openid profile</span>
1132
+ </div>
1133
+ <div><span class="t-dim">$</span> <span class="t-cur"></span></div>
1134
+ </div>
1135
+ </div>
1136
+ </div>
1137
+ </div>
1138
+ </section>
1139
+ `;
1140
+ }
1141
+ renderManifesto() {
1142
+ return html `
1143
+ <section class="manifesto">
1144
+ <div class="wrap">
1145
+ <div class="eyebrow sm" style="margin-bottom: 24px;">Why we built this</div>
1146
+ <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>
1147
+ <div class="manifesto-cite">— Editorial · vol. III · idp.global</div>
1148
+ </div>
1149
+ </section>
1150
+ `;
1151
+ }
1152
+ renderCta() {
1153
+ return html `
1154
+ <section class="cta">
1155
+ <div class="wrap">
1156
+ <h2>Claim your identity.<br />Free, forever.</h2>
1157
+ <p>
1158
+ Sixty seconds to claim, anchored to Cardano on submission. No credit card. No vendor lock-in. Yours, even if
1159
+ we disappear.
1160
+ </p>
1161
+ <div class="cta-actions">
1162
+ <idp-button variant="accent" size="lg">Claim your identity</idp-button>
1163
+ <idp-button variant="link" size="lg">Read the manifesto</idp-button>
1164
+ </div>
1165
+ </div>
1166
+ </section>
1167
+ `;
1168
+ }
1169
+ renderFooter() {
1170
+ const cols = [
1171
+ ['Product', ['For individuals', 'For organisations', 'Enterprise', 'Cardano sync', 'Changelog']],
1172
+ ['Developers', ['Documentation', 'API reference', 'Self-hosting', 'SDKs', 'GitHub']],
1173
+ ['Company', ['Manifesto', 'Blog', 'Security', 'Privacy', 'Terms']],
1174
+ ];
1175
+ return html `
1176
+ <footer>
1177
+ <div class="wrap-wide">
1178
+ <div class="footer-cols">
1179
+ <div class="footer-brand">
1180
+ <a class="logo" href="#">idp<span class="logo-dot"></span>global</a>
1181
+ <p>
1182
+ An open identity provider for everyone — from individuals to enterprises. Anchored on Cardano. Built in
1183
+ the open. Yours forever.
1184
+ </p>
1185
+ <div class="footer-status"><span class="live-dot"></span>All systems normal · 99.99%</div>
1186
+ </div>
1187
+ ${cols.map((colArg) => html `
1188
+ <div class="footer-col">
1189
+ <h4>${colArg[0]}</h4>
1190
+ <ul>${colArg[1].map((linkArg) => html `<li><a>${linkArg}</a></li>`)}</ul>
1191
+ </div>
1192
+ `)}
1193
+ </div>
1194
+ <div class="footer-bottom">
1195
+ <span>© 2026 idp.global · MIT · Anchored to Cardano</span>
1196
+ <span class="links"><a>Status</a><a>Twitter</a><a>GitHub</a><a>Discord</a></span>
1197
+ </div>
1198
+ </div>
1199
+ </footer>
672
1200
  `;
673
1201
  }
674
1202
  render() {
@@ -676,11 +1204,14 @@ OK Approved - Watch - 0.8s</code></pre></div></div></section>
676
1204
  <div class="page">
677
1205
  ${this.renderNav()}
678
1206
  <idp-landing-hero></idp-landing-hero>
679
- <section class="proof"><div class="wrap"><div class="proof-label">Built for identity at every scale</div><div class="proof-row">${['Open Source', 'Self-hostable', 'Cardano anchored', 'OIDC ready', 'Passkey first', 'Free for everyone'].map((nameArg) => html `<div class="proof-name">${nameArg}</div>`)}</div></div></section>
680
- ${this.renderFeatures()}${this.renderChain()}${this.renderPricing()}${this.renderDevelopers()}
681
- <section class="manifesto"><div class="wrap"><div class="eyebrow">Why we built this</div><q>Identity should not be a product the user is sold.<br/>It should be a permanent <em>fact</em>, owned by the person it describes.</q></div></section>
682
- <section class="cta"><div class="wrap"><h2>Claim your identity.<br/><em>Free, forever.</em></h2><p>Sixty seconds to claim, anchored to Cardano on submission. No credit card. No vendor lock-in.</p><idp-button variant="accent" size="lg">Claim your identity</idp-button></div></section>
683
- <footer><div class="wrap"><div class="footer-cols"><div class="footer-brand"><div class="logo">idp<span class="logo-dot"></span>global</div><p>An open identity provider for everyone. Anchored on Cardano. Built in the open. Yours forever.</p></div><div class="footer-col"><h4>Product</h4><a>For individuals</a><a>For organizations</a><a>Cardano sync</a></div><div class="footer-col"><h4>Developers</h4><a>Documentation</a><a>Self-hosting</a><a>SDKs</a></div><div class="footer-col"><h4>Company</h4><a>Manifesto</a><a>Security</a><a>Privacy</a></div></div><div class="footer-bottom"><span>© 2026 idp.global - MIT - Anchored to Cardano</span><span>Source - Community</span></div></div></footer>
1207
+ ${this.renderProof()}
1208
+ ${this.renderFeatures()}
1209
+ ${this.renderChain()}
1210
+ ${this.renderPricing()}
1211
+ ${this.renderDevelopers()}
1212
+ ${this.renderManifesto()}
1213
+ ${this.renderCta()}
1214
+ ${this.renderFooter()}
684
1215
  </div>
685
1216
  `;
686
1217
  }
@@ -691,4 +1222,4 @@ OK Approved - Watch - 0.8s</code></pre></div></div></section>
691
1222
  return IdpLandingPage = _classThis;
692
1223
  })();
693
1224
  export { IdpLandingPage };
694
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRwLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9pZHAtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxlQUFlLENBQUM7QUFDdkIsT0FBTyx1QkFBdUIsQ0FBQztJQVNsQixjQUFjOzRCQUQxQixhQUFhLENBQUMsa0JBQWtCLENBQUM7Ozs7c0JBQ0UsV0FBVzs4QkFBbkIsU0FBUSxXQUFXOzs7O1lBQS9DLDZLQWdvQkM7Ozs7UUEvbkJRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBLHVDQUF1QyxDQUFDO1FBQ2hFLE1BQU0sQ0FBQyxVQUFVLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBRWpELE1BQU0sQ0FBQyxNQUFNLEdBQUc7WUFDckIsR0FBRyxnQkFBZ0I7WUFDbkIsR0FBRyxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
1225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRwLWxhbmRpbmctcGFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9pZHAtbGFuZGluZy1wYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUF1QixNQUFNLDZCQUE2QixDQUFDO0FBQ3pHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUMvQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8saUJBQWlCLENBQUM7QUFDekIsT0FBTyxlQUFlLENBQUM7QUFDdkIsT0FBTyxpQ0FBaUMsQ0FBQztBQUN6QyxPQUFPLHVCQUF1QixDQUFDO0lBU2xCLGNBQWM7NEJBRDFCLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQzs7OztzQkFDRSxXQUFXOzhCQUFuQixTQUFRLFdBQVc7Ozs7WUFBL0MsNktBOHBDQzs7OztRQTdwQ1EsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUEsdUNBQXVDLENBQUM7UUFDaEUsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFFakQsTUFBTSxDQUFDLE1BQU0sR0FBRztZQUNyQixHQUFHLGdCQUFnQjtZQUNuQixHQUFHLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXd1QkY7U0FDRixDQUFDO1FBRU0sU0FBUztZQUNmLE9BQU8sSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztLQWlCVixDQUFDO1FBQ0osQ0FBQztRQUVPLFdBQVc7WUFDakIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxVQUFVLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pGLE9BQU8sSUFBSSxDQUFBOzs7O21DQUlvQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUEsMkJBQTJCLE9BQU8sUUFBUSxDQUFDOzs7S0FHcEcsQ0FBQztRQUNKLENBQUM7UUFFTyxjQUFjO1lBQ3BCLE1BQU0sT0FBTyxHQUFHO2dCQUNkLENBQUMsUUFBUSxFQUFFLG1CQUFtQixFQUFFLFlBQVksQ0FBQztnQkFDN0MsQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQztnQkFDdkMsQ0FBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLFlBQVksQ0FBQztnQkFDdkMsQ0FBQyxLQUFLLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQzthQUNyQyxDQUFDO1lBQ0YsT0FBTyxJQUFJLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBb0RHLE9BQU8sQ0FBQyxHQUFHLENBQ1gsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQTs7NkRBRXdCLFNBQVMsQ0FBQyxDQUFDLENBQVEsVUFBVSxFQUFFOzhDQUM5QyxTQUFTLENBQUMsQ0FBQyxDQUFDOzZDQUNiLFNBQVMsQ0FBQyxDQUFDLENBQUM7O21CQUV0QyxDQUNGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBNEJaLENBQUM7UUFDSixDQUFDO1FBRU8sV0FBVztZQUNqQixNQUFNLEtBQUssR0FBRztnQkFDWjtvQkFDRSxTQUFTO29CQUNULGtCQUFrQjtvQkFDbEIsZ0tBQWdLO2lCQUNqSztnQkFDRDtvQkFDRSxTQUFTO29CQUNULHdCQUF3QjtvQkFDeEIseUpBQXlKO2lCQUMxSjtnQkFDRDtvQkFDRSxTQUFTO29CQUNULDBCQUEwQjtvQkFDMUIsbUlBQW1JO2lCQUNwSTthQUNGLENBQUM7WUFDRixPQUFPLElBQUksQ0FBQTs7Ozs7Ozs7Ozs7OztnQkFhQyxLQUFLLENBQUMsR0FBRyxDQUNULENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUE7O3VDQUVNLE9BQU8sQ0FBQyxDQUFDLENBQUM7K0JBQ2xCLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxPQUFPLENBQUMsQ0FBQyxDQUFDOztpQkFFN0MsQ0FDRjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7S0FzQ1YsQ0FBQztRQUNKLENBQUM7UUFFTyxhQUFhO1lBQ25CLE1BQU0sS0FBSyxHQUFHO2dCQUNaO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixLQUFLLEVBQUUsSUFBSTtvQkFDWCxHQUFHLEVBQUUsWUFBWTtvQkFDakIsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsS0FBSyxFQUFFO3dCQUNMLDRDQUE0Qzt3QkFDNUMsMkNBQTJDO3dCQUMzQyx5QkFBeUI7d0JBQ3pCLGlDQUFpQzt3QkFDakMsaUNBQWlDO3FCQUNsQztvQkFDRCxHQUFHLEVBQUUscUJBQXFCO29CQUMxQixPQUFPLEVBQUUsTUFBTTtvQkFDZixRQUFRLEVBQUUsS0FBSztpQkFDaEI7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGNBQWM7b0JBQ3BCLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLEtBQUssRUFBRSxJQUFJO29CQUNYLEdBQUcsRUFBRSxtQkFBbUI7b0JBQ3hCLElBQUksRUFBRSw0Q0FBNEM7b0JBQ2xELEtBQUssRUFBRTt3QkFDTCxpREFBaUQ7d0JBQ2pELG1EQUFtRDt3QkFDbkQsOEJBQThCO3dCQUM5QixtQ0FBbUM7d0JBQ25DLGdDQUFnQztxQkFDakM7b0JBQ0QsR0FBRyxFQUFFLHVCQUF1QjtvQkFDNUIsT0FBTyxFQUFFLFFBQVE7b0JBQ2pCLFFBQVEsRUFBRSxJQUFJO2lCQUNmO2dCQUNEO29CQUNFLElBQUksRUFBRSxZQUFZO29CQUNsQixRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixLQUFLLEVBQUUsTUFBTTtvQkFDYixHQUFHLEVBQUUsZUFBZTtvQkFDcEIsSUFBSSxFQUFFLDZDQUE2QztvQkFDbkQsS0FBSyxFQUFFO3dCQUNMLGtDQUFrQzt3QkFDbEMsK0NBQStDO3dCQUMvQywwQkFBMEI7d0JBQzFCLHlDQUF5Qzt3QkFDekMsNEJBQTRCO3FCQUM3QjtvQkFDRCxHQUFHLEVBQUUsWUFBWTtvQkFDakIsT0FBTyxFQUFFLE1BQU07b0JBQ2YsUUFBUSxFQUFFLEtBQUs7aUJBQ2hCO2FBQ0YsQ0FBQztZQUNGLE9BQU8sSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7Y0FZRCxLQUFLLENBQUMsR0FBRyxDQUNULENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUE7bUNBQ0ksT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNqRCxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUEsNkNBQTZDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQSxFQUFFOzJDQUN0RCxPQUFPLENBQUMsSUFBSTt3QkFDL0IsT0FBTyxDQUFDLFFBQVE7dUNBQ0QsT0FBTyxDQUFDLEtBQUsscUJBQXFCLE9BQU8sQ0FBQyxHQUFHOzRDQUN4QyxPQUFPLENBQUMsSUFBSTswQ0FDZCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFBLE9BQU8sT0FBTyxPQUFPLENBQUM7d0NBQzNELE9BQU8sQ0FBQyxPQUFjLElBQUksT0FBTyxDQUFDLEdBQUc7O2VBRTlELENBQ0Y7Ozs7S0FJUixDQUFDO1FBQ0osQ0FBQztRQUVPLGdCQUFnQjtZQUN0QixNQUFNLElBQUksR0FBRyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzVHLE9BQU8sSUFBSSxDQUFBOzs7Ozs7Ozs7Ozs7c0NBWXVCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQSx5QkFBeUIsTUFBTSxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBbUNuRyxDQUFDO1FBQ0osQ0FBQztRQUVPLGVBQWU7WUFDckIsT0FBTyxJQUFJLENBQUE7Ozs7Ozs7O0tBUVYsQ0FBQztRQUNKLENBQUM7UUFFTyxTQUFTO1lBQ2YsT0FBTyxJQUFJLENBQUE7Ozs7Ozs7Ozs7Ozs7O0tBY1YsQ0FBQztRQUNKLENBQUM7UUFFTyxZQUFZO1lBQ2xCLE1BQU0sSUFBSSxHQUFHO2dCQUNYLENBQUMsU0FBUyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFDaEcsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ3BGLENBQUMsU0FBUyxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2FBQzFELENBQUM7WUFDWCxPQUFPLElBQUksQ0FBQTs7Ozs7Ozs7Ozs7O2NBWUQsSUFBSSxDQUFDLEdBQUcsQ0FDUixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFBOzt3QkFFTixNQUFNLENBQUMsQ0FBQyxDQUFDO3dCQUNULE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQSxVQUFVLE9BQU8sV0FBVyxDQUFDOztlQUVyRSxDQUNGOzs7Ozs7OztLQVFSLENBQUM7UUFDSixDQUFDO1FBRU0sTUFBTTtZQUNYLE9BQU8sSUFBSSxDQUFBOztVQUVMLElBQUksQ0FBQyxTQUFTLEVBQUU7O1VBRWhCLElBQUksQ0FBQyxXQUFXLEVBQUU7VUFDbEIsSUFBSSxDQUFDLGNBQWMsRUFBRTtVQUNyQixJQUFJLENBQUMsV0FBVyxFQUFFO1VBQ2xCLElBQUksQ0FBQyxhQUFhLEVBQUU7VUFDcEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1VBQ3ZCLElBQUksQ0FBQyxlQUFlLEVBQUU7VUFDdEIsSUFBSSxDQUFDLFNBQVMsRUFBRTtVQUNoQixJQUFJLENBQUMsWUFBWSxFQUFFOztLQUV4QixDQUFDO1FBQ0osQ0FBQzs7WUE3cENVLHVEQUFjOzs7OztTQUFkLGNBQWMifQ==