@authrim/setup 0.1.63 → 0.1.66

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 (60) hide show
  1. package/dist/__tests__/migrate.test.d.ts +5 -0
  2. package/dist/__tests__/migrate.test.d.ts.map +1 -0
  3. package/dist/__tests__/migrate.test.js +273 -0
  4. package/dist/__tests__/migrate.test.js.map +1 -0
  5. package/dist/__tests__/paths.test.d.ts +2 -0
  6. package/dist/__tests__/paths.test.d.ts.map +1 -0
  7. package/dist/__tests__/paths.test.js +257 -0
  8. package/dist/__tests__/paths.test.js.map +1 -0
  9. package/dist/cli/commands/config.d.ts +1 -0
  10. package/dist/cli/commands/config.d.ts.map +1 -1
  11. package/dist/cli/commands/config.js +41 -7
  12. package/dist/cli/commands/config.js.map +1 -1
  13. package/dist/cli/commands/deploy.d.ts +1 -0
  14. package/dist/cli/commands/deploy.d.ts.map +1 -1
  15. package/dist/cli/commands/deploy.js +181 -19
  16. package/dist/cli/commands/deploy.js.map +1 -1
  17. package/dist/cli/commands/init.d.ts.map +1 -1
  18. package/dist/cli/commands/init.js +267 -82
  19. package/dist/cli/commands/init.js.map +1 -1
  20. package/dist/cli/commands/migrate.d.ts +21 -0
  21. package/dist/cli/commands/migrate.d.ts.map +1 -0
  22. package/dist/cli/commands/migrate.js +166 -0
  23. package/dist/cli/commands/migrate.js.map +1 -0
  24. package/dist/core/admin.d.ts +18 -1
  25. package/dist/core/admin.d.ts.map +1 -1
  26. package/dist/core/admin.js +36 -7
  27. package/dist/core/admin.js.map +1 -1
  28. package/dist/core/config.d.ts +10 -2
  29. package/dist/core/config.d.ts.map +1 -1
  30. package/dist/core/config.js +6 -2
  31. package/dist/core/config.js.map +1 -1
  32. package/dist/core/keys.d.ts +55 -4
  33. package/dist/core/keys.d.ts.map +1 -1
  34. package/dist/core/keys.js +104 -12
  35. package/dist/core/keys.js.map +1 -1
  36. package/dist/core/lock.d.ts +60 -3
  37. package/dist/core/lock.d.ts.map +1 -1
  38. package/dist/core/lock.js +108 -4
  39. package/dist/core/lock.js.map +1 -1
  40. package/dist/core/migrate.d.ts +95 -0
  41. package/dist/core/migrate.d.ts.map +1 -0
  42. package/dist/core/migrate.js +549 -0
  43. package/dist/core/migrate.js.map +1 -0
  44. package/dist/core/paths.d.ts +171 -0
  45. package/dist/core/paths.d.ts.map +1 -0
  46. package/dist/core/paths.js +319 -0
  47. package/dist/core/paths.js.map +1 -0
  48. package/dist/core/wrangler-sync.d.ts +88 -0
  49. package/dist/core/wrangler-sync.d.ts.map +1 -0
  50. package/dist/core/wrangler-sync.js +242 -0
  51. package/dist/core/wrangler-sync.js.map +1 -0
  52. package/dist/index.js +16 -1
  53. package/dist/index.js.map +1 -1
  54. package/dist/web/api.d.ts.map +1 -1
  55. package/dist/web/api.js +102 -28
  56. package/dist/web/api.js.map +1 -1
  57. package/dist/web/ui.d.ts.map +1 -1
  58. package/dist/web/ui.js +859 -276
  59. package/dist/web/ui.js.map +1 -1
  60. package/package.json +1 -1
package/dist/web/ui.js CHANGED
@@ -14,18 +14,74 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
14
14
  <meta charset="UTF-8">
15
15
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
16
  <title>Authrim Setup</title>
17
+ <link rel="preconnect" href="https://fonts.googleapis.com">
18
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
19
+ <link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,400;0,600;0,700;1,400&family=DM+Sans:ital,opsz,wght@0,9..40,400;0,9..40,500;0,9..40,600;0,9..40,700;1,9..40,400&display=swap" rel="stylesheet">
17
20
  <style>
18
21
  :root {
22
+ /* Typography */
23
+ --font-serif: 'Cormorant Garamond', Georgia, 'Times New Roman', serif;
24
+ --font-sans: 'DM Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
+ --font-mono: 'SF Mono', Monaco, 'Cascadia Code', 'Consolas', monospace;
26
+
27
+ /* Light theme colors */
19
28
  --primary: #2563eb;
20
29
  --primary-dark: #1d4ed8;
21
- --success: #10b981;
22
- --error: #ef4444;
23
- --warning: #f59e0b;
24
- --bg: #f8fafc;
25
- --card-bg: #ffffff;
26
- --text: #1e293b;
27
- --text-muted: #64748b;
28
- --border: #e2e8f0;
30
+ --primary-light: #3b82f6;
31
+ --accent: #c2410c;
32
+ --success: #059669;
33
+ --error: #dc2626;
34
+ --warning: #d97706;
35
+ --bg: #f8f5e3;
36
+ --bg-secondary: #f3eed6;
37
+ --card-bg: #fffefa;
38
+ --card-bg-hover: #fdfcf4;
39
+ --text: #1c1917;
40
+ --text-muted: #57534e;
41
+ --text-subtle: #78716c;
42
+ --border: #d6d3d1;
43
+ --border-light: #e7e5e4;
44
+
45
+ /* Splash */
46
+ --splash-bg: #1c1917;
47
+ --splash-text: #f8f5e3;
48
+
49
+ /* Shadows & Effects */
50
+ --shadow-sm: 0 1px 2px rgba(28, 25, 23, 0.04);
51
+ --shadow-md: 0 4px 12px rgba(28, 25, 23, 0.06);
52
+ --shadow-lg: 0 12px 32px rgba(28, 25, 23, 0.08);
53
+ --shadow-card: 0 1px 3px rgba(28, 25, 23, 0.04), 0 4px 12px rgba(28, 25, 23, 0.02);
54
+
55
+ /* Transitions */
56
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
57
+ --transition-base: 250ms cubic-bezier(0.4, 0, 0.2, 1);
58
+ --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
59
+ }
60
+
61
+ /* Dark theme */
62
+ [data-theme="dark"] {
63
+ --primary: #60a5fa;
64
+ --primary-dark: #3b82f6;
65
+ --primary-light: #93c5fd;
66
+ --accent: #fb923c;
67
+ --success: #34d399;
68
+ --error: #f87171;
69
+ --warning: #fbbf24;
70
+ --bg: #0c0a09;
71
+ --bg-secondary: #1c1917;
72
+ --card-bg: #1c1917;
73
+ --card-bg-hover: #292524;
74
+ --text: #fafaf9;
75
+ --text-muted: #a8a29e;
76
+ --text-subtle: #78716c;
77
+ --border: #44403c;
78
+ --border-light: #292524;
79
+ --splash-bg: #0c0a09;
80
+ --splash-text: #f8f5e3;
81
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.2);
82
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.3);
83
+ --shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.4);
84
+ --shadow-card: 0 1px 3px rgba(0, 0, 0, 0.2), 0 4px 12px rgba(0, 0, 0, 0.15);
29
85
  }
30
86
 
31
87
  * {
@@ -35,155 +91,397 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
35
91
  }
36
92
 
37
93
  body {
38
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
94
+ font-family: var(--font-sans);
39
95
  background: var(--bg);
40
96
  color: var(--text);
41
97
  line-height: 1.6;
42
98
  min-height: 100vh;
99
+ transition: background-color var(--transition-slow), color var(--transition-slow);
100
+ }
101
+
102
+ /* Subtle grain texture */
103
+ body::before {
104
+ content: '';
105
+ position: fixed;
106
+ top: 0;
107
+ left: 0;
108
+ width: 100%;
109
+ height: 100%;
110
+ pointer-events: none;
111
+ opacity: 0.015;
112
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
113
+ z-index: 9998;
114
+ }
115
+
116
+ [data-theme="dark"] body::before {
117
+ opacity: 0.03;
118
+ }
119
+
120
+ /* ========================================
121
+ SPLASH SCREEN
122
+ ======================================== */
123
+ .splash {
124
+ position: fixed;
125
+ inset: 0;
126
+ z-index: 10000;
127
+ background: var(--splash-bg);
128
+ display: flex;
129
+ align-items: center;
130
+ justify-content: center;
131
+ opacity: 1;
132
+ visibility: visible;
133
+ transition: opacity 600ms ease, visibility 600ms ease;
43
134
  }
44
135
 
136
+ .splash.fade-out {
137
+ opacity: 0;
138
+ visibility: hidden;
139
+ }
140
+
141
+ .splash-content {
142
+ text-align: center;
143
+ opacity: 0;
144
+ transform: translateY(16px);
145
+ animation: splash-reveal 800ms ease forwards;
146
+ animation-delay: 200ms;
147
+ }
148
+
149
+ .splash-title {
150
+ font-family: var(--font-serif);
151
+ font-size: clamp(3.5rem, 10vw, 5.5rem);
152
+ font-weight: 600;
153
+ color: var(--splash-text);
154
+ letter-spacing: -0.03em;
155
+ line-height: 1;
156
+ margin-bottom: 1rem;
157
+ }
158
+
159
+ .splash-tagline {
160
+ font-family: var(--font-sans);
161
+ font-size: 0.85rem;
162
+ font-weight: 500;
163
+ color: var(--text-subtle);
164
+ letter-spacing: 0.2em;
165
+ text-transform: uppercase;
166
+ margin-bottom: 3rem;
167
+ }
168
+
169
+ .splash-loader {
170
+ width: 32px;
171
+ height: 32px;
172
+ margin: 0 auto;
173
+ border: 2px solid var(--border);
174
+ border-top-color: var(--splash-text);
175
+ border-radius: 50%;
176
+ animation: spin 1s linear infinite;
177
+ }
178
+
179
+ @keyframes splash-reveal {
180
+ to {
181
+ opacity: 1;
182
+ transform: translateY(0);
183
+ }
184
+ }
185
+
186
+ /* ========================================
187
+ BACKGROUND TYPOGRAPHY
188
+ ======================================== */
189
+ .bg-typography {
190
+ position: fixed;
191
+ top: -16%;
192
+ left: -5%;
193
+ font-family: var(--font-serif);
194
+ font-size: clamp(26rem, 25vw, 28rem);
195
+ font-weight: 700;
196
+ color: rgba(209, 201, 173, 0.18);
197
+ letter-spacing: -0.04em;
198
+ white-space: nowrap;
199
+ pointer-events: none;
200
+ z-index: 0;
201
+ user-select: none;
202
+ }
203
+
204
+ [data-theme="dark"] .bg-typography {
205
+ color: rgba(255, 255, 255, 0.025);
206
+ }
207
+
208
+ /* ========================================
209
+ THEME TOGGLE
210
+ ======================================== */
211
+ .theme-toggle {
212
+ position: fixed;
213
+ top: 1.25rem;
214
+ right: 1.5rem;
215
+ z-index: 100;
216
+ width: 44px;
217
+ height: 44px;
218
+ background: var(--card-bg);
219
+ border: 1px solid var(--border);
220
+ border-radius: 12px;
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ cursor: pointer;
225
+ font-size: 1.25rem;
226
+ transition: all var(--transition-fast);
227
+ box-shadow: var(--shadow-sm);
228
+ }
229
+
230
+ .theme-toggle:hover {
231
+ background: var(--card-bg-hover);
232
+ border-color: var(--primary);
233
+ transform: scale(1.05);
234
+ }
235
+
236
+ .theme-toggle:active {
237
+ transform: scale(0.95);
238
+ }
239
+
240
+ /* ========================================
241
+ LAYOUT
242
+ ======================================== */
45
243
  .container {
46
- max-width: 800px;
244
+ position: relative;
245
+ z-index: 1;
246
+ max-width: 820px;
47
247
  margin: 0 auto;
48
- padding: 2rem;
248
+ padding: 2.5rem 2rem;
49
249
  }
50
250
 
51
251
  header {
52
252
  text-align: center;
53
253
  margin-bottom: 2rem;
254
+ padding-top: 0.5rem;
54
255
  }
55
256
 
56
257
  h1 {
57
- font-size: 2rem;
58
- color: var(--primary);
258
+ font-family: var(--font-serif);
259
+ font-size: clamp(2.25rem, 6vw, 3rem);
260
+ font-weight: 600;
261
+ color: var(--text);
262
+ letter-spacing: -0.03em;
263
+ line-height: 1;
59
264
  margin-bottom: 0.5rem;
60
265
  }
61
266
 
267
+ .header-wizard {
268
+ font-family: var(--font-serif);
269
+ font-size: 1.15rem;
270
+ font-weight: 400;
271
+ font-style: italic;
272
+ color: var(--primary);
273
+ margin-bottom: 0.375rem;
274
+ }
275
+
62
276
  .subtitle {
277
+ font-family: var(--font-sans);
278
+ font-size: 0.85rem;
63
279
  color: var(--text-muted);
280
+ letter-spacing: 0.03em;
64
281
  }
65
282
 
283
+ /* ========================================
284
+ CARDS
285
+ ======================================== */
66
286
  .card {
287
+ position: relative;
288
+ z-index: 1;
67
289
  background: var(--card-bg);
68
- border-radius: 12px;
69
- padding: 1.5rem;
70
- margin-bottom: 1.5rem;
71
- box-shadow: 0 1px 3px rgba(0,0,0,0.1);
290
+ border-radius: 16px;
291
+ border: 1px solid var(--border-light);
292
+ padding: 2rem;
293
+ margin-bottom: 1.75rem;
294
+ box-shadow: var(--shadow-card);
295
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
296
+ }
297
+
298
+ .card:hover {
299
+ border-color: var(--border);
72
300
  }
73
301
 
74
302
  .card-title {
75
- font-size: 1.25rem;
303
+ font-family: var(--font-sans);
304
+ font-size: 1.35rem;
76
305
  font-weight: 600;
77
- margin-bottom: 1rem;
306
+ margin-bottom: 1.25rem;
78
307
  display: flex;
79
308
  align-items: center;
80
- gap: 0.5rem;
309
+ gap: 0.625rem;
310
+ color: var(--text);
81
311
  }
82
312
 
313
+ /* ========================================
314
+ STATUS BADGES
315
+ ======================================== */
83
316
  .status-badge {
84
- font-size: 0.75rem;
85
- padding: 0.25rem 0.5rem;
86
- border-radius: 9999px;
87
- font-weight: 500;
317
+ font-family: var(--font-sans);
318
+ font-size: 0.7rem;
319
+ font-weight: 600;
320
+ padding: 0.3rem 0.625rem;
321
+ border-radius: 6px;
322
+ letter-spacing: 0.02em;
323
+ text-transform: uppercase;
88
324
  }
89
325
 
90
- .status-pending { background: var(--border); color: var(--text-muted); }
91
- .status-running { background: #dbeafe; color: var(--primary); }
92
- .status-success { background: #d1fae5; color: var(--success); }
93
- .status-error { background: #fee2e2; color: var(--error); }
94
- .status-warning { background: #fef3c7; color: #b45309; }
326
+ .status-pending {
327
+ background: var(--bg-secondary);
328
+ color: var(--text-muted);
329
+ }
330
+ .status-running {
331
+ background: rgba(37, 99, 235, 0.1);
332
+ color: var(--primary);
333
+ }
334
+ .status-success {
335
+ background: rgba(5, 150, 105, 0.1);
336
+ color: var(--success);
337
+ }
338
+ .status-error {
339
+ background: rgba(220, 38, 38, 0.1);
340
+ color: var(--error);
341
+ }
342
+ .status-warning {
343
+ background: rgba(217, 119, 6, 0.1);
344
+ color: var(--warning);
345
+ }
346
+
347
+ [data-theme="dark"] .status-running { background: rgba(96, 165, 250, 0.15); }
348
+ [data-theme="dark"] .status-success { background: rgba(52, 211, 153, 0.15); }
349
+ [data-theme="dark"] .status-error { background: rgba(248, 113, 113, 0.15); }
350
+ [data-theme="dark"] .status-warning { background: rgba(251, 191, 36, 0.15); }
95
351
 
96
- /* Mode selection cards */
352
+ /* ========================================
353
+ MODE SELECTION CARDS
354
+ ======================================== */
97
355
  .mode-cards {
98
356
  display: grid;
99
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
100
- gap: 1rem;
101
- margin-bottom: 1rem;
357
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
358
+ gap: 1.25rem;
359
+ margin-bottom: 1.25rem;
102
360
  }
103
361
 
104
362
  .mode-card {
105
- border: 2px solid var(--border);
106
- border-radius: 12px;
107
- padding: 1.5rem;
363
+ background: var(--card-bg);
364
+ border: 2px solid var(--border-light);
365
+ border-radius: 14px;
366
+ padding: 1.75rem;
108
367
  cursor: pointer;
109
- transition: all 0.2s;
368
+ transition: all var(--transition-base);
110
369
  position: relative;
111
370
  }
112
371
 
113
372
  .mode-card:hover {
114
373
  border-color: var(--primary);
115
- background: #f8fafc;
374
+ background: var(--card-bg-hover);
375
+ transform: translateY(-2px);
376
+ box-shadow: var(--shadow-md);
116
377
  }
117
378
 
118
379
  .mode-card.selected {
119
380
  border-color: var(--primary);
120
- background: #eff6ff;
381
+ background: rgba(37, 99, 235, 0.04);
382
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
383
+ }
384
+
385
+ [data-theme="dark"] .mode-card.selected {
386
+ background: rgba(96, 165, 250, 0.08);
387
+ box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.15);
121
388
  }
122
389
 
123
390
  .mode-card .mode-icon {
124
- font-size: 2rem;
125
- margin-bottom: 0.5rem;
391
+ font-size: 2.25rem;
392
+ margin-bottom: 0.75rem;
393
+ display: block;
126
394
  }
127
395
 
128
396
  .mode-card h3 {
397
+ font-family: var(--font-sans);
129
398
  font-size: 1.1rem;
399
+ font-weight: 600;
130
400
  margin-bottom: 0.5rem;
401
+ color: var(--text);
131
402
  }
132
403
 
133
404
  .mode-card p {
134
- font-size: 0.875rem;
405
+ font-size: 0.9rem;
135
406
  color: var(--text-muted);
136
- margin-bottom: 0.75rem;
407
+ margin-bottom: 0.875rem;
408
+ line-height: 1.5;
137
409
  }
138
410
 
139
411
  .mode-card ul {
140
412
  font-size: 0.8rem;
141
- color: var(--text-muted);
413
+ color: var(--text-subtle);
142
414
  margin-left: 1rem;
415
+ line-height: 1.6;
143
416
  }
144
417
 
145
418
  .mode-card ul li {
146
- margin-bottom: 0.25rem;
419
+ margin-bottom: 0.3rem;
147
420
  }
148
421
 
149
422
  .mode-badge {
150
423
  position: absolute;
151
- top: -8px;
152
- right: 10px;
153
- background: var(--primary);
424
+ top: -10px;
425
+ right: 12px;
426
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
154
427
  color: white;
155
- font-size: 0.7rem;
156
- padding: 0.2rem 0.5rem;
157
- border-radius: 4px;
158
- font-weight: 500;
428
+ font-family: var(--font-sans);
429
+ font-size: 0.65rem;
430
+ font-weight: 600;
431
+ padding: 0.35rem 0.625rem;
432
+ border-radius: 6px;
433
+ letter-spacing: 0.03em;
434
+ text-transform: uppercase;
435
+ box-shadow: 0 2px 8px rgba(37, 99, 235, 0.3);
159
436
  }
160
437
 
438
+ /* ========================================
439
+ FORMS
440
+ ======================================== */
161
441
  .form-group {
162
- margin-bottom: 1rem;
442
+ margin-bottom: 1.25rem;
163
443
  }
164
444
 
165
445
  label {
166
446
  display: block;
447
+ font-family: var(--font-sans);
167
448
  font-weight: 500;
449
+ font-size: 0.9rem;
168
450
  margin-bottom: 0.5rem;
451
+ color: var(--text);
169
452
  }
170
453
 
171
454
  input[type="text"],
172
455
  input[type="password"],
456
+ input[type="email"],
173
457
  input[type="file"],
174
458
  select {
175
459
  width: 100%;
176
- padding: 0.75rem;
460
+ padding: 0.875rem 1rem;
177
461
  border: 1px solid var(--border);
178
- border-radius: 8px;
179
- font-size: 1rem;
180
- transition: border-color 0.2s;
462
+ border-radius: 10px;
463
+ font-family: var(--font-sans);
464
+ font-size: 0.95rem;
465
+ background: var(--card-bg);
466
+ color: var(--text);
467
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
468
+ }
469
+
470
+ input::placeholder,
471
+ select::placeholder {
472
+ color: var(--text-subtle);
181
473
  }
182
474
 
183
475
  input:focus,
184
476
  select:focus {
185
477
  outline: none;
186
478
  border-color: var(--primary);
479
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
480
+ }
481
+
482
+ [data-theme="dark"] input:focus,
483
+ [data-theme="dark"] select:focus {
484
+ box-shadow: 0 0 0 3px rgba(96, 165, 250, 0.15);
187
485
  }
188
486
 
189
487
  /* Fix browser autofill/autocomplete styling */
@@ -191,9 +489,17 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
191
489
  input:-webkit-autofill:hover,
192
490
  input:-webkit-autofill:focus,
193
491
  input:-webkit-autofill:active {
194
- -webkit-box-shadow: 0 0 0 30px white inset !important;
195
- -webkit-text-fill-color: #1e293b !important;
196
- caret-color: #1e293b !important;
492
+ -webkit-box-shadow: 0 0 0 30px var(--card-bg) inset !important;
493
+ -webkit-text-fill-color: var(--text) !important;
494
+ caret-color: var(--text) !important;
495
+ }
496
+
497
+ small {
498
+ display: block;
499
+ font-size: 0.8rem;
500
+ color: var(--text-muted);
501
+ margin-top: 0.375rem;
502
+ line-height: 1.4;
197
503
  }
198
504
 
199
505
  .checkbox-group {
@@ -206,28 +512,42 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
206
512
  display: flex;
207
513
  align-items: center;
208
514
  gap: 0.5rem;
515
+ cursor: pointer;
516
+ }
517
+
518
+ .checkbox-item input[type="checkbox"] {
519
+ width: 18px;
520
+ height: 18px;
521
+ accent-color: var(--primary);
522
+ cursor: pointer;
209
523
  }
210
524
 
211
- /* Infrastructure info section */
525
+ /* ========================================
526
+ INFRASTRUCTURE INFO SECTION
527
+ ======================================== */
212
528
  .infra-section {
213
- background: #f8fafc;
214
- border: 1px solid var(--border);
215
- border-radius: 8px;
216
- padding: 1rem;
217
- margin-bottom: 1rem;
529
+ background: var(--bg-secondary);
530
+ border: 1px solid var(--border-light);
531
+ border-radius: 12px;
532
+ padding: 1.25rem;
533
+ margin-bottom: 1.25rem;
218
534
  }
219
535
 
220
536
  .infra-section h4 {
221
- margin: 0 0 0.75rem 0;
222
- font-size: 0.9rem;
537
+ margin: 0 0 0.875rem 0;
538
+ font-family: var(--font-sans);
539
+ font-size: 0.85rem;
540
+ font-weight: 600;
223
541
  color: var(--text-muted);
542
+ text-transform: uppercase;
543
+ letter-spacing: 0.04em;
224
544
  }
225
545
 
226
546
  .infra-item {
227
547
  display: flex;
228
548
  justify-content: space-between;
229
- padding: 0.25rem 0;
230
- font-size: 0.85rem;
549
+ padding: 0.375rem 0;
550
+ font-size: 0.875rem;
231
551
  }
232
552
 
233
553
  .infra-label {
@@ -235,22 +555,27 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
235
555
  }
236
556
 
237
557
  .infra-value {
238
- font-family: monospace;
558
+ font-family: var(--font-mono);
559
+ font-size: 0.8rem;
239
560
  color: var(--primary);
240
561
  }
241
562
 
242
- /* Domain configuration section */
563
+ /* ========================================
564
+ DOMAIN CONFIGURATION SECTION
565
+ ======================================== */
243
566
  .domain-section {
244
- background: var(--bg);
245
- border: 1px solid var(--border);
246
- border-radius: 8px;
247
- padding: 1rem;
248
- margin-bottom: 1rem;
567
+ background: var(--bg-secondary);
568
+ border: 1px solid var(--border-light);
569
+ border-radius: 12px;
570
+ padding: 1.25rem;
571
+ margin-bottom: 1.25rem;
249
572
  }
250
573
 
251
574
  .domain-section h4 {
252
- margin: 0 0 0.5rem 0;
253
- font-size: 0.95rem;
575
+ margin: 0 0 0.625rem 0;
576
+ font-family: var(--font-sans);
577
+ font-size: 1rem;
578
+ font-weight: 600;
254
579
  color: var(--text);
255
580
  display: flex;
256
581
  align-items: center;
@@ -261,9 +586,14 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
261
586
  font-size: 0.8rem;
262
587
  color: var(--text-muted);
263
588
  margin-bottom: 1rem;
264
- padding: 0.5rem;
265
- background: #f0f9ff;
266
- border-radius: 4px;
589
+ padding: 0.625rem 0.75rem;
590
+ background: rgba(37, 99, 235, 0.06);
591
+ border-radius: 8px;
592
+ line-height: 1.5;
593
+ }
594
+
595
+ [data-theme="dark"] .domain-section .section-hint {
596
+ background: rgba(96, 165, 250, 0.1);
267
597
  }
268
598
 
269
599
  .domain-row {
@@ -294,14 +624,15 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
294
624
 
295
625
  .domain-default {
296
626
  position: absolute;
297
- right: 10px;
627
+ right: 12px;
298
628
  top: 50%;
299
629
  transform: translateY(-50%);
300
- font-size: 0.7rem;
301
- color: var(--text-muted);
302
- background: #f1f5f9;
303
- padding: 2px 6px;
304
- border-radius: 4px;
630
+ font-family: var(--font-mono);
631
+ font-size: 0.65rem;
632
+ color: var(--text-subtle);
633
+ background: var(--bg);
634
+ padding: 3px 8px;
635
+ border-radius: 5px;
305
636
  max-width: 160px;
306
637
  overflow: hidden;
307
638
  text-overflow: ellipsis;
@@ -309,11 +640,15 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
309
640
  }
310
641
 
311
642
  .issuer-preview {
312
- margin-top: 0.75rem;
313
- padding: 0.5rem;
314
- background: #f0fdf4;
315
- border-radius: 4px;
316
- font-size: 0.85rem;
643
+ margin-top: 0.875rem;
644
+ padding: 0.625rem 0.75rem;
645
+ background: rgba(5, 150, 105, 0.08);
646
+ border-radius: 8px;
647
+ font-size: 0.875rem;
648
+ }
649
+
650
+ [data-theme="dark"] .issuer-preview {
651
+ background: rgba(52, 211, 153, 0.1);
317
652
  }
318
653
 
319
654
  .issuer-preview .label {
@@ -322,82 +657,101 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
322
657
  }
323
658
 
324
659
  .issuer-preview .value {
325
- color: #16a34a;
326
- font-family: monospace;
660
+ color: var(--success);
661
+ font-family: var(--font-mono);
662
+ font-size: 0.8rem;
327
663
  word-break: break-all;
328
664
  }
329
665
 
666
+ /* ========================================
667
+ BUTTONS
668
+ ======================================== */
330
669
  button {
331
- padding: 0.75rem 1.5rem;
332
- border-radius: 8px;
333
- font-size: 1rem;
334
- font-weight: 500;
670
+ padding: 0.875rem 1.75rem;
671
+ border-radius: 10px;
672
+ font-family: var(--font-sans);
673
+ font-size: 0.95rem;
674
+ font-weight: 600;
335
675
  cursor: pointer;
336
- transition: all 0.2s;
676
+ transition: all var(--transition-fast);
337
677
  border: none;
338
678
  }
339
679
 
340
680
  .btn-primary {
341
- background: var(--primary);
681
+ background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%);
342
682
  color: white;
683
+ box-shadow: 0 2px 8px rgba(37, 99, 235, 0.25);
343
684
  }
344
685
 
345
686
  .btn-primary:hover:not(:disabled) {
346
- background: var(--primary-dark);
687
+ transform: translateY(-1px);
688
+ box-shadow: 0 4px 12px rgba(37, 99, 235, 0.35);
689
+ }
690
+
691
+ .btn-primary:active:not(:disabled) {
692
+ transform: translateY(0);
347
693
  }
348
694
 
349
695
  .btn-primary:disabled {
350
- opacity: 0.6;
696
+ opacity: 0.5;
351
697
  cursor: not-allowed;
698
+ box-shadow: none;
352
699
  }
353
700
 
354
701
  .btn-secondary {
355
- background: var(--border);
702
+ background: var(--bg-secondary);
356
703
  color: var(--text);
704
+ border: 1px solid var(--border);
357
705
  }
358
706
 
359
707
  .btn-secondary:hover {
360
- background: #cbd5e1;
708
+ background: var(--border-light);
709
+ border-color: var(--border);
361
710
  }
362
711
 
363
712
  .button-group {
364
713
  display: flex;
365
714
  gap: 1rem;
366
- margin-top: 1.5rem;
715
+ margin-top: 2rem;
367
716
  }
368
717
 
718
+ /* ========================================
719
+ PROGRESS LOG
720
+ ======================================== */
369
721
  .progress-log {
370
- background: #1e293b;
371
- border-radius: 8px;
372
- padding: 1rem;
373
- max-height: 300px;
722
+ background: #0f172a;
723
+ border-radius: 12px;
724
+ padding: 1.25rem;
725
+ max-height: 320px;
374
726
  overflow-y: auto;
375
- font-family: 'Monaco', 'Menlo', monospace;
376
- font-size: 0.875rem;
727
+ font-family: var(--font-mono);
728
+ font-size: 0.8rem;
729
+ border: 1px solid #1e293b;
377
730
  }
378
731
 
379
732
  .progress-log pre {
380
733
  color: #e2e8f0;
381
734
  white-space: pre-wrap;
382
735
  word-break: break-word;
736
+ line-height: 1.6;
383
737
  }
384
738
 
385
739
  /* Progress UI Components */
386
740
  .progress-container {
387
- margin: 1rem 0;
741
+ margin: 1.25rem 0;
388
742
  }
389
743
 
390
744
  .progress-status {
391
745
  display: flex;
392
746
  align-items: center;
393
- gap: 0.75rem;
394
- margin-bottom: 0.75rem;
747
+ gap: 0.875rem;
748
+ margin-bottom: 1rem;
395
749
  }
396
750
 
397
751
  .progress-status .spinner {
398
- width: 20px;
399
- height: 20px;
400
- border: 2px solid #e2e8f0;
752
+ width: 22px;
753
+ height: 22px;
754
+ border: 2px solid var(--border);
401
755
  border-top-color: var(--primary);
402
756
  border-radius: 50%;
403
757
  animation: spin 0.8s linear infinite;
@@ -408,126 +762,228 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
408
762
  }
409
763
 
410
764
  .progress-bar-wrapper {
411
- background: #e2e8f0;
412
- border-radius: 4px;
413
- height: 8px;
765
+ background: var(--bg-secondary);
766
+ border-radius: 6px;
767
+ height: 10px;
414
768
  overflow: hidden;
415
- margin-bottom: 0.5rem;
769
+ margin-bottom: 0.625rem;
416
770
  }
417
771
 
418
772
  .progress-bar {
419
773
  height: 100%;
420
- background: var(--primary);
421
- border-radius: 4px;
422
- transition: width 0.3s ease;
774
+ background: linear-gradient(90deg, var(--primary) 0%, var(--primary-light) 100%);
775
+ border-radius: 6px;
776
+ transition: width 0.4s ease;
423
777
  }
424
778
 
425
779
  .progress-text {
426
- font-size: 0.875rem;
780
+ font-family: var(--font-sans);
781
+ font-size: 0.85rem;
427
782
  color: var(--text-muted);
428
783
  }
429
784
 
430
785
  .log-toggle {
431
- display: flex;
786
+ display: inline-flex;
432
787
  align-items: center;
433
788
  gap: 0.5rem;
434
- padding: 0.5rem 0.75rem;
435
- background: #f1f5f9;
436
- border: 1px solid var(--border);
437
- border-radius: 6px;
789
+ padding: 0.625rem 1rem;
790
+ background: var(--bg-secondary);
791
+ border: 1px solid var(--border-light);
792
+ border-radius: 8px;
438
793
  cursor: pointer;
439
- font-size: 0.875rem;
794
+ font-family: var(--font-sans);
795
+ font-size: 0.85rem;
440
796
  color: var(--text-muted);
441
797
  margin-top: 1rem;
798
+ transition: all var(--transition-fast);
442
799
  }
443
800
 
444
801
  .log-toggle:hover {
445
- background: #e2e8f0;
802
+ background: var(--border-light);
803
+ color: var(--text);
446
804
  }
447
805
 
448
806
  .log-toggle .arrow {
449
- transition: transform 0.2s;
807
+ transition: transform var(--transition-fast);
450
808
  }
451
809
 
452
810
  .log-toggle.open .arrow {
453
811
  transform: rotate(90deg);
454
812
  }
455
813
 
814
+ /* ========================================
815
+ STEP INDICATOR - Refined Minimal Design
816
+ ======================================== */
456
817
  .step-indicator {
818
+ position: relative;
457
819
  display: flex;
458
820
  justify-content: center;
459
- gap: 0.5rem;
460
- margin-bottom: 2rem;
821
+ align-items: center;
822
+ gap: 0;
823
+ margin-bottom: 2.5rem;
824
+ padding: 0.75rem 0;
825
+ }
826
+
827
+ /* The connecting line */
828
+ .step-indicator::before {
829
+ content: '';
830
+ position: absolute;
831
+ top: 50%;
832
+ left: 50%;
833
+ transform: translate(-50%, -50%);
834
+ width: calc(100% - 80px);
835
+ max-width: 500px;
836
+ height: 1px;
837
+ background: var(--border);
461
838
  }
462
839
 
463
840
  .step {
464
- width: 40px;
465
- height: 40px;
841
+ position: relative;
842
+ z-index: 1;
843
+ width: 28px;
844
+ height: 28px;
466
845
  border-radius: 50%;
467
846
  display: flex;
468
847
  align-items: center;
469
848
  justify-content: center;
470
- font-weight: 600;
471
- font-size: 0.875rem;
849
+ font-family: var(--font-sans);
850
+ font-weight: 500;
851
+ font-size: 0.7rem;
852
+ background: var(--bg);
853
+ transition: all var(--transition-base);
472
854
  }
473
855
 
474
856
  .step-active {
475
- background: var(--primary);
476
- color: white;
857
+ width: 32px;
858
+ height: 32px;
859
+ background: var(--text);
860
+ color: var(--bg);
861
+ font-weight: 600;
862
+ font-size: 0.75rem;
863
+ box-shadow: 0 0 0 4px var(--bg), 0 0 0 5px var(--text);
864
+ }
865
+
866
+ [data-theme="dark"] .step-active {
867
+ background: var(--splash-text);
868
+ color: var(--bg);
869
+ box-shadow: 0 0 0 4px var(--bg), 0 0 0 5px var(--splash-text);
477
870
  }
478
871
 
479
872
  .step-complete {
480
- background: var(--success);
481
- color: white;
873
+ background: var(--text);
874
+ color: var(--bg);
875
+ font-size: 0;
876
+ }
877
+
878
+ .step-complete::after {
879
+ content: '✓';
880
+ font-size: 0.7rem;
881
+ }
882
+
883
+ [data-theme="dark"] .step-complete {
884
+ background: var(--splash-text);
885
+ color: var(--bg);
482
886
  }
483
887
 
484
888
  .step-pending {
485
- background: var(--border);
486
- color: var(--text-muted);
889
+ background: var(--bg);
890
+ color: var(--text-subtle);
891
+ border: 1px solid var(--border);
487
892
  }
488
893
 
489
894
  .step-connector {
490
895
  width: 40px;
491
- height: 2px;
492
- background: var(--border);
896
+ height: 1px;
897
+ background: transparent;
493
898
  align-self: center;
494
899
  }
495
900
 
901
+ /* ========================================
902
+ ALERTS
903
+ ======================================== */
496
904
  .alert {
497
- padding: 1rem;
498
- border-radius: 8px;
499
- margin-bottom: 1rem;
905
+ padding: 1rem 1.25rem;
906
+ border-radius: 10px;
907
+ margin-bottom: 1.25rem;
908
+ font-size: 0.9rem;
909
+ line-height: 1.5;
500
910
  }
501
911
 
502
- .alert-success { background: #d1fae5; color: #065f46; }
503
- .alert-error { background: #fee2e2; color: #991b1b; }
504
- .alert-warning { background: #fef3c7; color: #92400e; }
505
- .alert-info { background: #dbeafe; color: #1e40af; }
912
+ .alert-success {
913
+ background: rgba(5, 150, 105, 0.08);
914
+ color: var(--success);
915
+ border: 1px solid rgba(5, 150, 105, 0.2);
916
+ }
917
+ .alert-error {
918
+ background: rgba(220, 38, 38, 0.08);
919
+ color: var(--error);
920
+ border: 1px solid rgba(220, 38, 38, 0.2);
921
+ }
922
+ .alert-warning {
923
+ background: rgba(217, 119, 6, 0.08);
924
+ color: var(--warning);
925
+ border: 1px solid rgba(217, 119, 6, 0.2);
926
+ }
927
+ .alert-info {
928
+ background: rgba(37, 99, 235, 0.06);
929
+ color: var(--primary);
930
+ border: 1px solid rgba(37, 99, 235, 0.15);
931
+ }
932
+
933
+ [data-theme="dark"] .alert-success {
934
+ background: rgba(52, 211, 153, 0.1);
935
+ border-color: rgba(52, 211, 153, 0.25);
936
+ }
937
+ [data-theme="dark"] .alert-error {
938
+ background: rgba(248, 113, 113, 0.1);
939
+ border-color: rgba(248, 113, 113, 0.25);
940
+ }
941
+ [data-theme="dark"] .alert-warning {
942
+ background: rgba(251, 191, 36, 0.1);
943
+ border-color: rgba(251, 191, 36, 0.25);
944
+ }
945
+ [data-theme="dark"] .alert-info {
946
+ background: rgba(96, 165, 250, 0.1);
947
+ border-color: rgba(96, 165, 250, 0.2);
948
+ }
506
949
 
950
+ /* ========================================
951
+ URL DISPLAY
952
+ ======================================== */
507
953
  .url-display {
508
- background: var(--bg);
509
- padding: 1rem;
510
- border-radius: 8px;
511
- margin-top: 1rem;
954
+ background: var(--bg-secondary);
955
+ padding: 1.25rem;
956
+ border-radius: 12px;
957
+ margin-top: 1.25rem;
958
+ border: 1px solid var(--border-light);
512
959
  }
513
960
 
514
961
  .url-item {
515
962
  display: flex;
516
- gap: 0.5rem;
517
- margin-bottom: 0.5rem;
963
+ gap: 0.75rem;
964
+ margin-bottom: 0.625rem;
965
+ align-items: baseline;
518
966
  }
519
967
 
520
968
  .url-label {
521
- font-weight: 500;
522
- min-width: 100px;
969
+ font-family: var(--font-sans);
970
+ font-weight: 600;
971
+ font-size: 0.85rem;
972
+ min-width: 110px;
973
+ color: var(--text-muted);
523
974
  }
524
975
 
525
976
  .url-value {
977
+ font-family: var(--font-mono);
978
+ font-size: 0.8rem;
526
979
  color: var(--primary);
527
980
  word-break: break-all;
528
981
  overflow-wrap: break-word;
529
982
  }
530
983
 
984
+ /* ========================================
985
+ FILE INPUT
986
+ ======================================== */
531
987
  .file-input-wrapper {
532
988
  position: relative;
533
989
  overflow: hidden;
@@ -545,74 +1001,92 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
545
1001
  }
546
1002
 
547
1003
  .file-input-btn {
548
- display: inline-block;
549
- padding: 0.75rem 1.5rem;
550
- background: var(--border);
1004
+ display: inline-flex;
1005
+ align-items: center;
1006
+ gap: 0.5rem;
1007
+ padding: 0.875rem 1.5rem;
1008
+ background: var(--bg-secondary);
551
1009
  color: var(--text);
552
- border-radius: 8px;
1010
+ border: 1px solid var(--border);
1011
+ border-radius: 10px;
553
1012
  cursor: pointer;
1013
+ font-family: var(--font-sans);
1014
+ font-weight: 500;
1015
+ transition: all var(--transition-fast);
554
1016
  }
555
1017
 
556
1018
  .file-input-btn:hover {
557
- background: #cbd5e1;
1019
+ background: var(--border-light);
1020
+ border-color: var(--primary);
558
1021
  }
559
1022
 
560
1023
  .config-preview {
561
- background: var(--bg);
562
- border-radius: 8px;
1024
+ background: var(--bg-secondary);
1025
+ border: 1px solid var(--border-light);
1026
+ border-radius: 10px;
563
1027
  padding: 1rem;
564
1028
  margin-top: 1rem;
565
- font-family: 'Monaco', 'Menlo', monospace;
566
- font-size: 0.8rem;
1029
+ font-family: var(--font-mono);
1030
+ font-size: 0.75rem;
567
1031
  max-height: 200px;
568
1032
  overflow-y: auto;
1033
+ line-height: 1.5;
569
1034
  }
570
1035
 
571
1036
  .hidden { display: none; }
572
1037
 
573
- /* Modal styles */
1038
+ /* ========================================
1039
+ MODAL
1040
+ ======================================== */
574
1041
  .modal {
575
1042
  position: fixed;
576
- top: 0;
577
- left: 0;
578
- right: 0;
579
- bottom: 0;
1043
+ inset: 0;
580
1044
  z-index: 1000;
581
1045
  display: flex;
582
1046
  align-items: center;
583
1047
  justify-content: center;
584
1048
  }
585
1049
  .modal.hidden { display: none; }
1050
+
586
1051
  .modal-backdrop {
587
1052
  position: absolute;
588
- top: 0;
589
- left: 0;
590
- right: 0;
591
- bottom: 0;
592
- background: rgba(0, 0, 0, 0.5);
1053
+ inset: 0;
1054
+ background: rgba(0, 0, 0, 0.6);
1055
+ backdrop-filter: blur(4px);
593
1056
  }
1057
+
594
1058
  .modal-content {
595
1059
  position: relative;
596
1060
  background: var(--card-bg);
597
- border-radius: 12px;
598
- padding: 1.5rem;
599
- max-width: 450px;
1061
+ border-radius: 16px;
1062
+ padding: 2rem;
1063
+ max-width: 460px;
600
1064
  width: 90%;
601
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
1065
+ box-shadow: var(--shadow-lg);
1066
+ border: 1px solid var(--border-light);
602
1067
  }
603
1068
 
604
- /* Resource preview styles */
605
- .resource-preview {
606
- background: var(--bg);
607
- border: 1px solid var(--border);
608
- border-radius: 8px;
609
- padding: 1rem;
1069
+ .modal-content h3 {
1070
+ font-family: var(--font-sans);
1071
+ font-size: 1.25rem;
1072
+ font-weight: 600;
610
1073
  margin-bottom: 1rem;
611
1074
  }
612
1075
 
1076
+ /* ========================================
1077
+ RESOURCE PREVIEW
1078
+ ======================================== */
1079
+ .resource-preview {
1080
+ background: var(--bg-secondary);
1081
+ border: 1px solid var(--border-light);
1082
+ border-radius: 12px;
1083
+ padding: 1.25rem;
1084
+ margin-bottom: 1.25rem;
1085
+ }
1086
+
613
1087
  .resource-list {
614
1088
  display: grid;
615
- gap: 1rem;
1089
+ gap: 1.25rem;
616
1090
  }
617
1091
 
618
1092
  .resource-category {
@@ -621,6 +1095,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
621
1095
 
622
1096
  .resource-category strong {
623
1097
  display: block;
1098
+ font-family: var(--font-sans);
1099
+ font-weight: 600;
624
1100
  margin-bottom: 0.5rem;
625
1101
  color: var(--text);
626
1102
  }
@@ -632,9 +1108,9 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
632
1108
  }
633
1109
 
634
1110
  .resource-category li {
635
- font-family: 'Monaco', 'Menlo', monospace;
636
- font-size: 0.8rem;
637
- margin-bottom: 0.25rem;
1111
+ font-family: var(--font-mono);
1112
+ font-size: 0.75rem;
1113
+ margin-bottom: 0.3rem;
638
1114
  }
639
1115
 
640
1116
  /* Progress spinner */
@@ -658,6 +1134,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
658
1134
  align-items: center;
659
1135
  margin-bottom: 0.5rem;
660
1136
  color: #e2e8f0;
1137
+ font-family: var(--font-mono);
1138
+ font-size: 0.8rem;
661
1139
  }
662
1140
 
663
1141
  .progress-item.complete {
@@ -668,28 +1146,32 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
668
1146
  color: var(--error);
669
1147
  }
670
1148
 
671
- /* Environment cards */
1149
+ /* ========================================
1150
+ ENVIRONMENT CARDS
1151
+ ======================================== */
672
1152
  .env-cards {
673
1153
  display: grid;
674
1154
  gap: 1rem;
675
- margin-bottom: 1rem;
1155
+ margin-bottom: 1.25rem;
676
1156
  }
677
1157
 
678
1158
  .env-card {
679
- border: 1px solid var(--border);
680
- border-radius: 8px;
681
- padding: 1rem;
1159
+ background: var(--card-bg);
1160
+ border: 1px solid var(--border-light);
1161
+ border-radius: 12px;
1162
+ padding: 1.25rem;
682
1163
  display: flex;
683
1164
  justify-content: space-between;
684
1165
  align-items: center;
685
1166
  cursor: pointer;
686
- transition: border-color 0.2s, background 0.2s, box-shadow 0.2s;
1167
+ transition: all var(--transition-fast);
687
1168
  }
688
1169
 
689
1170
  .env-card:hover {
690
1171
  border-color: var(--primary);
691
- background: #f8fafc;
692
- box-shadow: 0 2px 8px rgba(59, 130, 246, 0.1);
1172
+ background: var(--card-bg-hover);
1173
+ box-shadow: var(--shadow-md);
1174
+ transform: translateY(-1px);
693
1175
  }
694
1176
 
695
1177
  .env-card-info {
@@ -697,14 +1179,16 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
697
1179
  }
698
1180
 
699
1181
  .env-card-name {
1182
+ font-family: var(--font-sans);
700
1183
  font-size: 1.1rem;
701
1184
  font-weight: 600;
702
1185
  margin-bottom: 0.5rem;
1186
+ color: var(--text);
703
1187
  }
704
1188
 
705
1189
  .env-card-stats {
706
1190
  display: flex;
707
- gap: 1rem;
1191
+ gap: 1.25rem;
708
1192
  font-size: 0.8rem;
709
1193
  color: var(--text-muted);
710
1194
  }
@@ -712,70 +1196,79 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
712
1196
  .env-card-stat {
713
1197
  display: flex;
714
1198
  align-items: center;
715
- gap: 0.25rem;
1199
+ gap: 0.375rem;
716
1200
  }
717
1201
 
718
1202
  .env-card-actions {
719
1203
  display: flex;
720
- gap: 0.5rem;
1204
+ gap: 0.625rem;
721
1205
  }
722
1206
 
723
1207
  .btn-danger {
724
1208
  background: var(--error);
725
1209
  color: white;
726
- padding: 0.5rem 1rem;
727
- font-size: 0.875rem;
1210
+ padding: 0.625rem 1rem;
1211
+ font-size: 0.85rem;
1212
+ border-radius: 8px;
728
1213
  }
729
1214
 
730
1215
  .btn-danger:hover {
731
- background: #dc2626;
1216
+ background: #b91c1c;
1217
+ transform: translateY(-1px);
732
1218
  }
733
1219
 
734
1220
  .btn-info {
735
1221
  background: var(--primary);
736
1222
  color: white;
737
- padding: 0.5rem 1rem;
738
- font-size: 0.875rem;
1223
+ padding: 0.625rem 1rem;
1224
+ font-size: 0.85rem;
1225
+ border-radius: 8px;
739
1226
  }
740
1227
 
741
1228
  .btn-info:hover {
742
1229
  background: var(--primary-dark);
1230
+ transform: translateY(-1px);
743
1231
  }
744
1232
 
745
- /* Resource list in details view */
1233
+ /* ========================================
1234
+ RESOURCE LIST (Details view)
1235
+ ======================================== */
746
1236
  .resource-section {
747
- margin-bottom: 1.5rem;
1237
+ margin-bottom: 1.75rem;
748
1238
  }
749
1239
 
750
1240
  .resource-section-title {
1241
+ font-family: var(--font-sans);
751
1242
  font-size: 1rem;
752
1243
  font-weight: 600;
753
- margin-bottom: 0.75rem;
1244
+ margin-bottom: 0.875rem;
754
1245
  display: flex;
755
1246
  align-items: center;
756
1247
  gap: 0.5rem;
1248
+ color: var(--text);
757
1249
  }
758
1250
 
759
1251
  .resource-section-title .count {
760
1252
  font-size: 0.8rem;
761
1253
  color: var(--text-muted);
762
- font-weight: normal;
1254
+ font-weight: 500;
763
1255
  }
764
1256
 
765
1257
  .resource-list {
766
- background: var(--bg);
767
- border-radius: 8px;
768
- padding: 0.75rem;
1258
+ background: var(--bg-secondary);
1259
+ border-radius: 10px;
1260
+ padding: 0.875rem;
1261
+ border: 1px solid var(--border-light);
769
1262
  }
770
1263
 
771
1264
  .resource-item {
772
- font-family: 'Monaco', 'Menlo', monospace;
773
- font-size: 0.8rem;
774
- padding: 0.25rem 0.5rem;
775
- margin-bottom: 0.25rem;
1265
+ font-family: var(--font-mono);
1266
+ font-size: 0.75rem;
1267
+ padding: 0.5rem 0.75rem;
1268
+ margin-bottom: 0.375rem;
776
1269
  background: var(--card-bg);
777
- border-radius: 4px;
778
- border: 1px solid var(--border);
1270
+ border-radius: 6px;
1271
+ border: 1px solid var(--border-light);
779
1272
  }
780
1273
 
781
1274
  .resource-item:last-child {
@@ -783,14 +1276,14 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
783
1276
  }
784
1277
 
785
1278
  .resource-item-name {
786
- font-weight: 500;
1279
+ font-weight: 600;
787
1280
  }
788
1281
 
789
1282
  .resource-item-details {
790
- font-size: 0.75rem;
1283
+ font-size: 0.7rem;
791
1284
  color: var(--text-muted);
792
1285
  margin-top: 0.25rem;
793
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
1286
+ font-family: var(--font-sans);
794
1287
  }
795
1288
 
796
1289
  .resource-item-details span {
@@ -817,29 +1310,35 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
817
1310
  font-size: 0.875rem;
818
1311
  }
819
1312
 
820
- /* Delete options */
1313
+ /* ========================================
1314
+ DELETE OPTIONS
1315
+ ======================================== */
821
1316
  .delete-options {
822
1317
  display: grid;
823
- gap: 0.75rem;
1318
+ gap: 0.875rem;
824
1319
  }
825
1320
 
826
1321
  .delete-option {
827
1322
  display: flex;
828
1323
  align-items: center;
829
- gap: 0.75rem;
830
- padding: 0.75rem;
831
- border: 1px solid var(--border);
832
- border-radius: 8px;
1324
+ gap: 0.875rem;
1325
+ padding: 1rem;
1326
+ border: 1px solid var(--border-light);
1327
+ border-radius: 10px;
833
1328
  cursor: pointer;
1329
+ background: var(--card-bg);
1330
+ transition: all var(--transition-fast);
834
1331
  }
835
1332
 
836
1333
  .delete-option:hover {
837
- background: var(--bg);
1334
+ background: var(--bg-secondary);
1335
+ border-color: var(--border);
838
1336
  }
839
1337
 
840
1338
  .delete-option input[type="checkbox"] {
841
1339
  width: 18px;
842
1340
  height: 18px;
1341
+ accent-color: var(--error);
843
1342
  }
844
1343
 
845
1344
  .delete-option span {
@@ -852,37 +1351,43 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
852
1351
  font-size: 0.8rem;
853
1352
  }
854
1353
 
855
- /* Database configuration styles */
1354
+ /* ========================================
1355
+ DATABASE CONFIGURATION
1356
+ ======================================== */
856
1357
  .database-config-grid {
857
1358
  display: grid;
858
1359
  grid-template-columns: 1fr 1fr;
859
1360
  gap: 1.5rem;
860
- margin-bottom: 1.5rem;
1361
+ margin-bottom: 1.75rem;
861
1362
  }
862
1363
 
863
1364
  .database-config-stack {
864
1365
  display: flex;
865
1366
  flex-direction: column;
866
1367
  gap: 1.5rem;
867
- margin-bottom: 1.5rem;
1368
+ margin-bottom: 1.75rem;
868
1369
  }
869
1370
 
870
1371
  .database-card {
871
- background: var(--bg);
872
- border: 1px solid var(--border);
873
- border-radius: 0.5rem;
874
- padding: 1.25rem;
1372
+ background: var(--bg-secondary);
1373
+ border: 1px solid var(--border-light);
1374
+ border-radius: 12px;
1375
+ padding: 1.5rem;
875
1376
  }
876
1377
 
877
1378
  .database-card h3 {
878
- margin: 0 0 1rem 0;
1379
+ margin: 0 0 1.125rem 0;
1380
+ font-family: var(--font-sans);
879
1381
  font-size: 1.1rem;
1382
+ font-weight: 600;
1383
+ color: var(--text);
880
1384
  }
881
1385
 
882
1386
  .db-description {
883
1387
  font-size: 0.875rem;
884
1388
  color: var(--text-muted);
885
- margin-bottom: 1rem;
1389
+ margin-bottom: 1.25rem;
1390
+ line-height: 1.6;
886
1391
  }
887
1392
 
888
1393
  .db-description p {
@@ -895,21 +1400,28 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
895
1400
  }
896
1401
 
897
1402
  .db-description li {
898
- margin-bottom: 0.25rem;
1403
+ margin-bottom: 0.3rem;
899
1404
  }
900
1405
 
901
1406
  .db-hint {
902
1407
  font-style: italic;
903
- margin-top: 0.75rem;
904
- padding: 0.5rem;
905
- background: #f0f9ff;
906
- border-radius: 4px;
1408
+ margin-top: 0.875rem;
1409
+ padding: 0.625rem 0.75rem;
1410
+ background: rgba(37, 99, 235, 0.06);
1411
+ border-radius: 8px;
1412
+ font-size: 0.85rem;
1413
+ }
1414
+
1415
+ [data-theme="dark"] .db-hint {
1416
+ background: rgba(96, 165, 250, 0.1);
907
1417
  }
908
1418
 
909
1419
  .region-selection h4 {
910
- margin: 0 0 0.75rem 0;
1420
+ margin: 0 0 0.875rem 0;
1421
+ font-family: var(--font-sans);
911
1422
  font-size: 0.95rem;
912
1423
  font-weight: 600;
1424
+ color: var(--text);
913
1425
  }
914
1426
 
915
1427
  .radio-group {
@@ -921,24 +1433,27 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
921
1433
  .radio-item {
922
1434
  display: flex;
923
1435
  align-items: center;
924
- gap: 0.5rem;
1436
+ gap: 0.625rem;
925
1437
  cursor: pointer;
926
- padding: 0.25rem 0;
1438
+ padding: 0.375rem 0;
1439
+ font-size: 0.9rem;
927
1440
  }
928
1441
 
929
1442
  .radio-item input[type="radio"] {
930
1443
  margin: 0;
931
- width: 16px;
932
- height: 16px;
1444
+ width: 18px;
1445
+ height: 18px;
1446
+ accent-color: var(--primary);
933
1447
  }
934
1448
 
935
1449
  .radio-separator {
936
- font-size: 0.75rem;
937
- color: var(--text-muted);
938
- margin: 0.5rem 0 0.25rem 0;
939
- font-weight: 500;
1450
+ font-family: var(--font-sans);
1451
+ font-size: 0.7rem;
1452
+ color: var(--text-subtle);
1453
+ margin: 0.75rem 0 0.375rem 0;
1454
+ font-weight: 600;
940
1455
  text-transform: uppercase;
941
- letter-spacing: 0.05em;
1456
+ letter-spacing: 0.08em;
942
1457
  }
943
1458
 
944
1459
  @media (max-width: 768px) {
@@ -949,21 +1464,28 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
949
1464
  </style>
950
1465
  </head>
951
1466
  <body>
1467
+ <!-- Background Typography -->
1468
+ <div class="bg-typography" aria-hidden="true">Authrim</div>
1469
+
1470
+ <!-- Splash Screen -->
1471
+ <div id="splash" class="splash">
1472
+ <div class="splash-content">
1473
+ <h1 class="splash-title">Authrim</h1>
1474
+ <p class="splash-tagline">Identity & Access Platform</p>
1475
+ <div class="splash-loader"></div>
1476
+ </div>
1477
+ </div>
1478
+
1479
+ <!-- Theme Toggle -->
1480
+ <button id="theme-toggle" class="theme-toggle" aria-label="Toggle theme">🌙</button>
1481
+
952
1482
  <div class="container">
953
1483
  <header>
954
- <h1>🔐 Authrim Setup</h1>
1484
+ <h1>Authrim</h1>
1485
+ <p class="header-wizard">Setup Wizard</p>
955
1486
  <p class="subtitle">OIDC Provider on Cloudflare Workers</p>
956
1487
  </header>
957
1488
 
958
- <!-- Development Warning Banner -->
959
- <div style="background: #fef3c7; border: 2px solid #f59e0b; border-radius: 0.5rem; padding: 1rem; margin-bottom: 1.5rem; text-align: center;">
960
- <strong style="color: #92400e;">⚠️ WARNING: Under Development!</strong>
961
- <p style="color: #78350f; margin: 0.5rem 0 0 0; font-size: 0.875rem;">
962
- This project is still under active development and does not work correctly yet.<br>
963
- Admin UI is incomplete and does not support login functionality.
964
- </p>
965
- </div>
966
-
967
1489
  <div class="step-indicator" id="step-indicator">
968
1490
  <div class="step step-active" id="step-1">1</div>
969
1491
  <div class="step-connector"></div>
@@ -1822,6 +2344,67 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
1822
2344
  </div>
1823
2345
 
1824
2346
  <script>
2347
+ // ========================================
2348
+ // THEME MANAGEMENT
2349
+ // ========================================
2350
+ function initTheme() {
2351
+ const savedTheme = localStorage.getItem('authrim-theme');
2352
+ const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
2353
+ const theme = savedTheme || (prefersDark ? 'dark' : 'light');
2354
+ document.documentElement.setAttribute('data-theme', theme);
2355
+ updateThemeToggle(theme);
2356
+ }
2357
+
2358
+ function toggleTheme() {
2359
+ const current = document.documentElement.getAttribute('data-theme') || 'light';
2360
+ const newTheme = current === 'dark' ? 'light' : 'dark';
2361
+ document.documentElement.setAttribute('data-theme', newTheme);
2362
+ localStorage.setItem('authrim-theme', newTheme);
2363
+ updateThemeToggle(newTheme);
2364
+ }
2365
+
2366
+ function updateThemeToggle(theme) {
2367
+ const toggle = document.getElementById('theme-toggle');
2368
+ if (toggle) {
2369
+ toggle.textContent = theme === 'dark' ? '☀️' : '🌙';
2370
+ toggle.setAttribute('aria-label', theme === 'dark' ? 'Switch to light mode' : 'Switch to dark mode');
2371
+ }
2372
+ }
2373
+
2374
+ // Listen for system preference changes
2375
+ window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
2376
+ if (!localStorage.getItem('authrim-theme')) {
2377
+ const theme = e.matches ? 'dark' : 'light';
2378
+ document.documentElement.setAttribute('data-theme', theme);
2379
+ updateThemeToggle(theme);
2380
+ }
2381
+ });
2382
+
2383
+ // Initialize theme immediately
2384
+ initTheme();
2385
+
2386
+ // Theme toggle event
2387
+ document.getElementById('theme-toggle').addEventListener('click', toggleTheme);
2388
+
2389
+ // ========================================
2390
+ // SPLASH SCREEN
2391
+ // ========================================
2392
+ function hideSplash() {
2393
+ const splash = document.getElementById('splash');
2394
+ if (splash) {
2395
+ splash.classList.add('fade-out');
2396
+ setTimeout(() => {
2397
+ splash.style.display = 'none';
2398
+ }, 600);
2399
+ }
2400
+ }
2401
+
2402
+ // Hide splash after 2500ms
2403
+ setTimeout(hideSplash, 2500);
2404
+
2405
+ // ========================================
2406
+ // MAIN APPLICATION
2407
+ // ========================================
1825
2408
  // Session token for API authentication (embedded by server)
1826
2409
  const SESSION_TOKEN = '${safeToken}';
1827
2410
  const MANAGE_ONLY = ${manageOnlyFlag};
@@ -2872,8 +3455,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
2872
3455
  output.textContent += '\\n';
2873
3456
  scrollToBottom(log);
2874
3457
 
2875
- // Show keys saved location (full path with environment)
2876
- keysPath.textContent = workingDirectory ? workingDirectory + '/.keys/' + config.env + '/' : './.keys/' + config.env + '/';
3458
+ // Show keys saved location (new structure: .authrim/{env}/keys/)
3459
+ keysPath.textContent = workingDirectory ? workingDirectory + '/.authrim/' + config.env + '/keys/' : './.authrim/' + config.env + '/keys/';
2877
3460
 
2878
3461
  // Provision resources
2879
3462
  output.textContent += '☁️ Provisioning Cloudflare resources...\\n';
@@ -3049,7 +3632,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3049
3632
 
3050
3633
  output.textContent += ' API URL: ' + apiUrl + '\\n';
3051
3634
  output.textContent += ' Login UI URL: ' + loginUiUrl + '\\n';
3052
- output.textContent += ' Keys Dir: .keys/' + config.env + '\\n';
3635
+ output.textContent += ' Keys Dir: .authrim/' + config.env + '/keys/\\n';
3053
3636
  scrollToBottom(log);
3054
3637
 
3055
3638
  let adminSetupResult;
@@ -3059,7 +3642,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3059
3642
  body: {
3060
3643
  env: config.env,
3061
3644
  baseUrl: apiUrl, // Setup page is served by ar-auth worker (API)
3062
- keysDir: '.keys',
3645
+ // keysDir is auto-detected by API using paths.ts
3063
3646
  },
3064
3647
  });
3065
3648
  output.textContent += ' API Response: ' + JSON.stringify(adminSetupResult) + '\\n';
@@ -3180,8 +3763,8 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3180
3763
 
3181
3764
  // Resource naming functions
3182
3765
  function getResourceNames(env) {
3183
- // Keys are stored in environment-specific subdirectory: .keys/{env}/
3184
- const keysDir = workingDirectory ? workingDirectory + '/.keys/' + env : '.keys/' + env;
3766
+ // Keys are stored in environment-specific subdirectory: .authrim/{env}/keys/
3767
+ const keysDir = workingDirectory ? workingDirectory + '/.authrim/' + env + '/keys' : '.authrim/' + env + '/keys';
3185
3768
  return {
3186
3769
  d1: [
3187
3770
  env + '-authrim-core-db',
@@ -3348,7 +3931,7 @@ export function getHtmlTemplate(sessionToken, manageOnly) {
3348
3931
  policy: true,
3349
3932
  },
3350
3933
  keys: {
3351
- secretsPath: './.keys/',
3934
+ secretsPath: './keys/', // Relative path within .authrim/{env}/ structure
3352
3935
  },
3353
3936
  database: config.database || {
3354
3937
  core: { location: 'auto', jurisdiction: 'none' },