@ibgib/space-gib 0.0.3 → 0.0.5

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 (63) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/IMPLEMENTATION.md +9 -13
  3. package/README.md +7 -0
  4. package/dist/client/bootstrap.mjs +1 -1
  5. package/dist/client/bootstrap.mjs.map +1 -1
  6. package/dist/client/chunk-ANGVYAEK.mjs +42 -0
  7. package/dist/client/chunk-ANGVYAEK.mjs.map +7 -0
  8. package/dist/client/chunk-IRGFDQRD.mjs +1920 -0
  9. package/dist/client/chunk-IRGFDQRD.mjs.map +7 -0
  10. package/dist/client/index.html +103 -5
  11. package/dist/client/index.mjs +1 -1
  12. package/dist/client/script.mjs +1 -1
  13. package/dist/client/style.css +466 -61
  14. package/dist/respec-gib.node.mjs +5 -0
  15. package/dist/server/server.mjs +533 -233
  16. package/dist/server/server.mjs.map +2 -2
  17. package/package.json +6 -6
  18. package/src/client/AUTO-GENERATED-version.mts +1 -1
  19. package/src/client/components/identity-header/IMPLEMENTATION.md +45 -0
  20. package/src/client/components/identity-header/identity-header.css +74 -0
  21. package/src/client/components/identity-header/identity-header.html +10 -0
  22. package/src/client/components/identity-header/identity-header.mts +361 -0
  23. package/src/client/components/identity-manager/IMPLEMENTATION.md +100 -0
  24. package/src/client/components/identity-manager/identity-manager.css +467 -0
  25. package/src/client/components/identity-manager/identity-manager.html +113 -0
  26. package/src/client/components/identity-manager/identity-manager.mts +767 -0
  27. package/src/client/components/keystone-creator/keystone-creator.css +2 -76
  28. package/src/client/components/keystone-creator/keystone-creator.html +41 -26
  29. package/src/client/components/keystone-creator/keystone-creator.mts +178 -41
  30. package/src/client/dev-tools/base-tools.mts +252 -0
  31. package/src/client/dev-tools/common.mts +217 -0
  32. package/src/client/dev-tools/phase-1.mts +156 -0
  33. package/src/client/dev-tools/phase-2.mts +143 -0
  34. package/src/client/dev-tools/phase-3.mts +189 -0
  35. package/src/client/dev-tools/phase-4-1.mts +197 -0
  36. package/src/client/dev-tools/phase-4-10.mts +884 -0
  37. package/src/client/dev-tools/phase-4-2.mts +388 -0
  38. package/src/client/dev-tools/phase-4-3.mts +391 -0
  39. package/src/client/dev-tools/phase-4-4.mts +374 -0
  40. package/src/client/dev-tools/phase-4-5.mts +376 -0
  41. package/src/client/dev-tools/phase-4-6.mts +273 -0
  42. package/src/client/dev-tools/phase-4-7.mts +399 -0
  43. package/src/client/dev-tools/phase-4-8.mts +430 -0
  44. package/src/client/dev-tools/phase-4-9.mts +398 -0
  45. package/src/client/dev-tools/phase-4.mts +1302 -0
  46. package/src/client/dev-tools.mts +52 -1194
  47. package/src/client/index.html +103 -5
  48. package/src/client/style.css +466 -61
  49. package/src/client/ui/shell/space-gib-shell-constants.mts +0 -2
  50. package/src/client/ui/shell/space-gib-shell-service.mts +82 -10
  51. package/src/common/common-constants.mts +0 -0
  52. package/src/common/keystone-policies.json +40 -43
  53. package/src/common/keystone-policies.mts +3 -5
  54. package/src/server/path-helper.respec.mts +99 -94
  55. package/src/server/serve-gib/README.md +9 -0
  56. package/src/server/serve-gib/handlers/api/keystone/keystone-genesis.handler.mts +1 -1
  57. package/src/server/serve-gib/handlers/api/keystone/keystone-get.respec.mts +1 -1
  58. package/src/server/serve-gib/handlers/ws/sync-upgrade-handler-base.mts +31 -3
  59. package/src/server/serve-gib/handlers/ws/ws-helper.mts +73 -45
  60. package/dist/client/chunk-2KJC5XKE.mjs +0 -31
  61. package/dist/client/chunk-2KJC5XKE.mjs.map +0 -7
  62. package/dist/client/chunk-QNIXTRFO.mjs +0 -235
  63. package/dist/client/chunk-QNIXTRFO.mjs.map +0 -7
@@ -3,44 +3,42 @@
3
3
  Dark-first, glassmorphism, premium design.
4
4
  ========================================================================= */
5
5
 
6
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');
7
-
8
6
  /* ── Custom properties ── */
9
7
  :root {
10
8
  /* Palette */
11
- --clr-bg-deep: #05080f;
12
- --clr-bg-surface: #0b1120;
13
- --clr-bg-glass: rgba(11, 17, 32, 0.7);
14
- --clr-border: rgba(120, 248, 126, 0.12);
9
+ --clr-bg-deep: #05080f;
10
+ --clr-bg-surface: #0b1120;
11
+ --clr-bg-glass: rgba(11, 17, 32, 0.7);
12
+ --clr-border: rgba(120, 248, 126, 0.12);
15
13
  --clr-border-hover: rgba(120, 248, 126, 0.32);
16
14
 
17
- --clr-accent: #78f87e;
18
- --clr-accent-dim: rgba(120, 248, 126, 0.35);
19
- --clr-accent-glow: rgba(120, 248, 126, 0.15);
15
+ --clr-accent: #78f87e;
16
+ --clr-accent-dim: rgba(120, 248, 126, 0.35);
17
+ --clr-accent-glow: rgba(120, 248, 126, 0.15);
20
18
 
21
- --clr-text-primary: #e8f0e8;
19
+ --clr-text-primary: #e8f0e8;
22
20
  --clr-text-secondary: #8fa08f;
23
- --clr-text-muted: #4a604a;
21
+ --clr-text-muted: #4a604a;
24
22
 
25
- --clr-danger: #ff5b5b;
26
- --clr-warn: #ffcc44;
27
- --clr-info: #44aaff;
23
+ --clr-danger: #ff5b5b;
24
+ --clr-warn: #ffcc44;
25
+ --clr-info: #44aaff;
28
26
 
29
27
  /* Typography */
30
- --font-sans: 'Inter', system-ui, -apple-system, sans-serif;
31
- --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
28
+ --font-sans: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
29
+ --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
32
30
 
33
31
  /* Spacing / Layout */
34
- --header-h: 60px;
35
- --footer-h: 48px;
36
- --radius-sm: 6px;
37
- --radius-md: 12px;
38
- --radius-lg: 20px;
32
+ --header-h: 60px;
33
+ --footer-h: 48px;
34
+ --radius-sm: 6px;
35
+ --radius-md: 12px;
36
+ --radius-lg: 20px;
39
37
 
40
38
  /* Shadows */
41
- --shadow-card: 0 4px 24px rgba(0,0,0,0.5), 0 0 0 1px var(--clr-border);
42
- --shadow-glow: 0 0 32px var(--clr-accent-glow);
43
- --shadow-dialog: 0 8px 48px rgba(0,0,0,0.8), 0 0 0 1px var(--clr-border);
39
+ --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.5), 0 0 0 1px var(--clr-border);
40
+ --shadow-glow: 0 0 32px var(--clr-accent-glow);
41
+ --shadow-dialog: 0 8px 48px rgba(0, 0, 0, 0.8), 0 0 0 1px var(--clr-border);
44
42
 
45
43
  /* Panel Dimensions */
46
44
  --left-panel-width: 250px;
@@ -49,30 +47,82 @@
49
47
 
50
48
  /* Transition */
51
49
  --t-fast: 120ms ease;
52
- --t-med: 240ms ease;
50
+ --t-med: 240ms ease;
53
51
  --t-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
52
+
53
+ /* Tab Component Properties */
54
+ --tab-padding: 0.55rem 1.25rem;
55
+ --tab-background-color: rgba(255, 255, 255, 0.03);
56
+ --tab-background-color-hover: rgba(255, 255, 255, 0.08);
57
+ --tab-background-color-active: rgba(120, 248, 126, 0.1);
58
+ --tab-border-radius: var(--radius-sm) var(--radius-sm) 0 0;
59
+ --tab-border-width: 1px;
60
+ --tab-border-color: rgba(255, 255, 255, 0.05);
61
+ --tab-border-color-active: var(--clr-accent-dim);
62
+ --tab-text-color: var(--clr-text-secondary);
63
+ --tab-text-color-active: var(--clr-accent);
54
64
  }
55
65
 
56
66
  /* ── Reset ── */
57
- *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
58
- html { font-size: 16px; -webkit-text-size-adjust: 100%; }
67
+ *,
68
+ *::before,
69
+ *::after {
70
+ box-sizing: border-box;
71
+ margin: 0;
72
+ padding: 0;
73
+ }
74
+
75
+ html {
76
+ font-size: 16px;
77
+ -webkit-text-size-adjust: 100%;
78
+ height: 100%;
79
+ overflow: hidden;
80
+ }
81
+
59
82
  body {
60
83
  font-family: var(--font-sans);
61
84
  background: var(--clr-bg-deep);
62
85
  color: var(--clr-text-primary);
63
- min-height: 100dvh;
64
- overflow-x: hidden;
86
+ height: 100dvh;
87
+ overflow: hidden;
65
88
  line-height: 1.6;
66
89
  }
67
90
 
91
+ /* ── Global Scrollbar Customization ── */
92
+ /* Custom scrollbar properties for Firefox */
93
+ * {
94
+ scrollbar-width: thin;
95
+ scrollbar-color: var(--clr-accent-dim) transparent;
96
+ }
97
+
98
+ /* Chrome, Safari, Edge, Opera */
99
+ ::-webkit-scrollbar {
100
+ width: 6px;
101
+ height: 6px;
102
+ }
103
+
104
+ ::-webkit-scrollbar-track {
105
+ background: transparent;
106
+ }
107
+
108
+ ::-webkit-scrollbar-thumb {
109
+ background: var(--clr-accent-dim);
110
+ border-radius: var(--radius-sm);
111
+ background-clip: padding-box;
112
+ }
113
+
114
+ ::-webkit-scrollbar-thumb:hover {
115
+ background: var(--clr-accent);
116
+ }
117
+
68
118
  /* Subtle animated background gradient */
69
119
  body::before {
70
120
  content: '';
71
121
  position: fixed;
72
122
  inset: 0;
73
123
  background:
74
- radial-gradient(ellipse 80% 60% at 10% 5%, rgba(120,248,126,0.06) 0%, transparent 60%),
75
- radial-gradient(ellipse 60% 50% at 90% 95%, rgba(68,170,255,0.05) 0%, transparent 55%);
124
+ radial-gradient(ellipse 80% 60% at 10% 5%, rgba(120, 248, 126, 0.06) 0%, transparent 60%),
125
+ radial-gradient(ellipse 60% 50% at 90% 95%, rgba(68, 170, 255, 0.05) 0%, transparent 55%);
76
126
  pointer-events: none;
77
127
  z-index: 0;
78
128
  }
@@ -88,37 +138,45 @@ body::before {
88
138
  width: 100%;
89
139
  padding: 0;
90
140
  outline: none;
141
+ margin: auto;
91
142
  }
143
+
92
144
  .fullscreen-dialog::backdrop {
93
145
  background: rgba(0, 0, 0, 0.72);
94
146
  backdrop-filter: blur(4px);
95
147
  }
148
+
96
149
  .fullscreen-dialog-content {
97
150
  display: flex;
98
151
  flex-direction: column;
99
152
  }
153
+
100
154
  .fullscreen-dialog-header {
101
155
  padding: 1.5rem 1.5rem 0.5rem;
102
156
  border-bottom: 1px solid var(--clr-border);
103
157
  }
158
+
104
159
  .fullscreen-dialog-header h2 {
105
160
  font-size: 1.1rem;
106
161
  font-weight: 600;
107
162
  color: var(--clr-accent);
108
163
  }
164
+
109
165
  .fullscreen-dialog-body {
110
166
  padding: 1rem 1.5rem;
111
167
  display: flex;
112
168
  flex-direction: column;
113
169
  gap: 0.75rem;
114
170
  }
171
+
115
172
  .fullscreen-dialog-message {
116
173
  font-size: 0.9375rem;
117
174
  color: var(--clr-text-primary);
118
175
  white-space: pre-wrap;
119
176
  }
177
+
120
178
  #fullscreen-dialog-prompt-input {
121
- background: rgba(255,255,255,0.04);
179
+ background: rgba(255, 255, 255, 0.04);
122
180
  border: 1px solid var(--clr-border);
123
181
  border-radius: var(--radius-sm);
124
182
  padding: 0.6rem 0.75rem;
@@ -128,17 +186,23 @@ body::before {
128
186
  outline: none;
129
187
  transition: border-color var(--t-fast), box-shadow var(--t-fast);
130
188
  }
189
+
131
190
  #fullscreen-dialog-prompt-input:focus {
132
191
  border-color: var(--clr-accent);
133
192
  box-shadow: 0 0 0 3px var(--clr-accent-glow);
134
193
  }
135
- #fullscreen-dialog-prompt-input.collapsed { display: none; }
194
+
195
+ #fullscreen-dialog-prompt-input.collapsed {
196
+ display: none;
197
+ }
198
+
136
199
  .fullscreen-dialog-footer {
137
200
  display: flex;
138
201
  justify-content: flex-end;
139
202
  gap: 0.5rem;
140
203
  padding: 0.75rem 1.5rem 1.25rem;
141
204
  }
205
+
142
206
  .dialog-button {
143
207
  padding: 0.5rem 1.25rem;
144
208
  border-radius: var(--radius-sm);
@@ -150,18 +214,21 @@ body::before {
150
214
  cursor: pointer;
151
215
  transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast);
152
216
  }
217
+
153
218
  .dialog-button:first-child {
154
219
  background: var(--clr-accent);
155
220
  border-color: var(--clr-accent);
156
221
  color: var(--clr-bg-deep);
157
222
  font-weight: 600;
158
223
  }
224
+
159
225
  .dialog-button:first-child:hover {
160
226
  background: #9fffa5;
161
227
  }
228
+
162
229
  .dialog-button:last-child:hover {
163
230
  border-color: var(--clr-border-hover);
164
- background: rgba(255,255,255,0.04);
231
+ background: rgba(255, 255, 255, 0.04);
165
232
  }
166
233
 
167
234
  /* ── App root layout ── */
@@ -192,8 +259,8 @@ body::before {
192
259
  backdrop-filter: blur(16px);
193
260
  -webkit-backdrop-filter: blur(16px);
194
261
  }
262
+
195
263
  .header-content {
196
- max-width: 1100px;
197
264
  margin: 0 auto;
198
265
  height: 100%;
199
266
  display: flex;
@@ -201,6 +268,7 @@ body::before {
201
268
  padding: 0 1.5rem;
202
269
  gap: 1rem;
203
270
  }
271
+
204
272
  .brand-link {
205
273
  text-decoration: none;
206
274
  display: flex;
@@ -213,21 +281,36 @@ body::before {
213
281
  transition: color var(--t-fast);
214
282
  margin-right: auto;
215
283
  }
216
- .brand-link:hover { color: var(--clr-accent); }
284
+
285
+ .brand-link:hover {
286
+ color: var(--clr-accent);
287
+ }
288
+
217
289
  .brand-icon {
218
290
  color: var(--clr-accent);
219
291
  font-size: 1.4rem;
220
292
  animation: spin-slow 12s linear infinite;
221
293
  }
222
- .brand-accent { color: var(--clr-accent); }
294
+
295
+ .brand-accent {
296
+ color: var(--clr-accent);
297
+ }
298
+
223
299
  @keyframes spin-slow {
224
- from { transform: rotate(0deg); }
225
- to { transform: rotate(360deg); }
300
+ from {
301
+ transform: rotate(0deg);
302
+ }
303
+
304
+ to {
305
+ transform: rotate(360deg);
306
+ }
226
307
  }
308
+
227
309
  .header-nav {
228
310
  display: flex;
229
311
  gap: 0.25rem;
230
312
  }
313
+
231
314
  .nav-link {
232
315
  text-decoration: none;
233
316
  color: var(--clr-text-secondary);
@@ -237,10 +320,12 @@ body::before {
237
320
  border-radius: var(--radius-sm);
238
321
  transition: color var(--t-fast), background var(--t-fast);
239
322
  }
323
+
240
324
  .nav-link:hover {
241
325
  color: var(--clr-text-primary);
242
- background: rgba(255,255,255,0.04);
326
+ background: rgba(255, 255, 255, 0.04);
243
327
  }
328
+
244
329
  .config-btn {
245
330
  background: none;
246
331
  border: 1px solid var(--clr-border);
@@ -251,10 +336,12 @@ body::before {
251
336
  font-size: 1rem;
252
337
  transition: border-color var(--t-fast), color var(--t-fast);
253
338
  }
339
+
254
340
  .config-btn:hover {
255
341
  border-color: var(--clr-border-hover);
256
342
  color: var(--clr-text-primary);
257
343
  }
344
+
258
345
  .config-popover {
259
346
  position: absolute;
260
347
  top: var(--header-h);
@@ -267,6 +354,7 @@ body::before {
267
354
  min-width: 200px;
268
355
  margin: 0;
269
356
  }
357
+
270
358
  .config-popover-option {
271
359
  display: block;
272
360
  width: 100%;
@@ -281,7 +369,10 @@ body::before {
281
369
  cursor: pointer;
282
370
  transition: background var(--t-fast);
283
371
  }
284
- .config-popover-option:hover { background: rgba(120,248,126,0.08); }
372
+
373
+ .config-popover-option:hover {
374
+ background: rgba(120, 248, 126, 0.08);
375
+ }
285
376
 
286
377
  /* ── Header Toggle Buttons ── */
287
378
  .panel-toggle-btn {
@@ -293,7 +384,10 @@ body::before {
293
384
  padding: 0.2rem 0.5rem;
294
385
  transition: color var(--t-fast);
295
386
  }
296
- .panel-toggle-btn:hover { color: var(--clr-accent); }
387
+
388
+ .panel-toggle-btn:hover {
389
+ color: var(--clr-accent);
390
+ }
297
391
 
298
392
  /* ── Center panel / main ── */
299
393
  .center-panel {
@@ -302,6 +396,7 @@ body::before {
302
396
  flex-direction: column;
303
397
  overflow: hidden;
304
398
  }
399
+
305
400
  .center-panel-content {
306
401
  flex: 1;
307
402
  overflow-y: auto;
@@ -314,17 +409,26 @@ body::before {
314
409
  transition: width var(--t-fast);
315
410
  z-index: 5;
316
411
  }
317
- .left-panel {
318
- width: var(--left-panel-width);
412
+
413
+ .left-panel {
414
+ width: var(--left-panel-width);
319
415
  border-right: 1px solid var(--clr-border);
320
416
  }
321
- .left-panel.collapsed { width: 0 !important; border: none; }
322
417
 
323
- .right-panel {
324
- width: var(--right-panel-width);
418
+ .left-panel.collapsed {
419
+ width: 0 !important;
420
+ border: none;
421
+ }
422
+
423
+ .right-panel {
424
+ width: var(--right-panel-width);
325
425
  border-left: 1px solid var(--clr-border);
326
426
  }
327
- .right-panel.collapsed { width: 0 !important; border: none; }
427
+
428
+ .right-panel.collapsed {
429
+ width: 0 !important;
430
+ border: none;
431
+ }
328
432
 
329
433
  .panel-content-inner {
330
434
  padding: 1rem;
@@ -333,6 +437,7 @@ body::before {
333
437
  height: 100%;
334
438
  overflow-y: auto;
335
439
  }
440
+
336
441
  .placeholder-text {
337
442
  color: var(--clr-text-muted);
338
443
  font-size: 0.9rem;
@@ -345,15 +450,19 @@ body::before {
345
450
  transition: background var(--t-fast);
346
451
  z-index: 10;
347
452
  }
348
- .resizer:hover, .resizer:active {
453
+
454
+ .resizer:hover,
455
+ .resizer:active {
349
456
  background: var(--clr-accent-dim);
350
457
  }
458
+
351
459
  .resizer-v {
352
460
  width: 6px;
353
461
  cursor: col-resize;
354
462
  margin-left: -3px;
355
463
  margin-right: -3px;
356
464
  }
465
+
357
466
  .resizer-h {
358
467
  height: 6px;
359
468
  cursor: row-resize;
@@ -372,15 +481,27 @@ body::before {
372
481
  align-items: center;
373
482
  gap: 1.25rem;
374
483
  }
484
+
375
485
  .hero-glyph {
376
486
  font-size: 4rem;
377
487
  color: var(--clr-accent);
378
488
  animation: pulse-glyph 3s ease-in-out infinite;
379
489
  }
490
+
380
491
  @keyframes pulse-glyph {
381
- 0%, 100% { text-shadow: 0 0 0 transparent; opacity: 1; }
382
- 50% { text-shadow: 0 0 30px var(--clr-accent-glow); opacity: 0.85; }
492
+
493
+ 0%,
494
+ 100% {
495
+ text-shadow: 0 0 0 transparent;
496
+ opacity: 1;
497
+ }
498
+
499
+ 50% {
500
+ text-shadow: 0 0 30px var(--clr-accent-glow);
501
+ opacity: 0.85;
502
+ }
383
503
  }
504
+
384
505
  .hero-title {
385
506
  font-size: clamp(2.5rem, 6vw, 4rem);
386
507
  font-weight: 700;
@@ -391,12 +512,14 @@ body::before {
391
512
  background-clip: text;
392
513
  line-height: 1.1;
393
514
  }
515
+
394
516
  .hero-tagline {
395
517
  font-size: 1.125rem;
396
518
  color: var(--clr-text-secondary);
397
519
  max-width: 480px;
398
520
  line-height: 1.7;
399
521
  }
522
+
400
523
  .cta-row {
401
524
  display: flex;
402
525
  gap: 0.75rem;
@@ -404,6 +527,7 @@ body::before {
404
527
  justify-content: center;
405
528
  margin-top: 0.5rem;
406
529
  }
530
+
407
531
  .cta-btn {
408
532
  padding: 0.75rem 1.75rem;
409
533
  border-radius: var(--radius-md);
@@ -417,25 +541,29 @@ body::before {
417
541
  align-items: center;
418
542
  gap: 0.4rem;
419
543
  }
544
+
420
545
  .cta-primary {
421
546
  background: var(--clr-accent);
422
547
  color: var(--clr-bg-deep);
423
548
  border: none;
424
549
  box-shadow: 0 0 20px var(--clr-accent-glow);
425
550
  }
551
+
426
552
  .cta-primary:hover {
427
553
  background: #9fffa5;
428
- box-shadow: 0 0 32px rgba(120,248,126,0.35);
554
+ box-shadow: 0 0 32px rgba(120, 248, 126, 0.35);
429
555
  transform: translateY(-1px);
430
556
  }
557
+
431
558
  .cta-secondary {
432
559
  background: transparent;
433
560
  color: var(--clr-text-primary);
434
561
  border: 1px solid var(--clr-border);
435
562
  }
563
+
436
564
  .cta-secondary:hover {
437
565
  border-color: var(--clr-border-hover);
438
- background: rgba(255,255,255,0.04);
566
+ background: rgba(255, 255, 255, 0.04);
439
567
  transform: translateY(-1px);
440
568
  }
441
569
 
@@ -448,6 +576,7 @@ body::before {
448
576
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
449
577
  gap: 1.25rem;
450
578
  }
579
+
451
580
  .feature-card {
452
581
  background: var(--clr-bg-glass);
453
582
  border: 1px solid var(--clr-border);
@@ -459,28 +588,33 @@ body::before {
459
588
  flex-direction: column;
460
589
  gap: 0.75rem;
461
590
  }
591
+
462
592
  .feature-card:hover {
463
593
  border-color: var(--clr-border-hover);
464
594
  box-shadow: var(--shadow-glow);
465
595
  transform: translateY(-3px);
466
596
  }
597
+
467
598
  .feature-icon {
468
599
  font-size: 1.75rem;
469
600
  }
601
+
470
602
  .feature-title {
471
603
  font-size: 1.1rem;
472
604
  font-weight: 600;
473
605
  color: var(--clr-text-primary);
474
606
  }
607
+
475
608
  .feature-desc {
476
609
  font-size: 0.9rem;
477
610
  color: var(--clr-text-secondary);
478
611
  line-height: 1.65;
479
612
  }
613
+
480
614
  .feature-desc code {
481
615
  font-family: var(--font-mono);
482
616
  font-size: 0.8rem;
483
- background: rgba(120,248,126,0.1);
617
+ background: rgba(120, 248, 126, 0.1);
484
618
  color: var(--clr-accent);
485
619
  padding: 0.1em 0.35em;
486
620
  border-radius: 3px;
@@ -494,6 +628,7 @@ body::before {
494
628
  display: flex;
495
629
  justify-content: center;
496
630
  }
631
+
497
632
  .status-badge {
498
633
  display: inline-flex;
499
634
  align-items: center;
@@ -506,9 +641,19 @@ body::before {
506
641
  background: var(--clr-bg-glass);
507
642
  backdrop-filter: blur(8px);
508
643
  }
509
- .status-loading { color: var(--clr-text-secondary); }
510
- .status-ready { color: var(--clr-accent); border-color: var(--clr-accent-dim); }
511
- .status-error { color: var(--clr-danger); }
644
+
645
+ .status-loading {
646
+ color: var(--clr-text-secondary);
647
+ }
648
+
649
+ .status-ready {
650
+ color: var(--clr-accent);
651
+ border-color: var(--clr-accent-dim);
652
+ }
653
+
654
+ .status-error {
655
+ color: var(--clr-danger);
656
+ }
512
657
 
513
658
  /* ── Footer ── */
514
659
  .footer-panel {
@@ -519,6 +664,7 @@ body::before {
519
664
  border-top: 1px solid var(--clr-border);
520
665
  background: var(--clr-bg-glass);
521
666
  }
667
+
522
668
  .footer-text {
523
669
  font-size: 0.8rem;
524
670
  color: var(--clr-text-muted);
@@ -528,18 +674,30 @@ body::before {
528
674
  justify-content: center;
529
675
  align-items: center;
530
676
  }
677
+
531
678
  .footer-link {
532
679
  color: var(--clr-text-secondary);
533
680
  text-decoration: none;
534
681
  transition: color var(--t-fast);
535
682
  }
536
- .footer-link:hover { color: var(--clr-accent); }
683
+
684
+ .footer-link:hover {
685
+ color: var(--clr-accent);
686
+ }
537
687
 
538
688
  /* ── Responsive ── */
539
689
  @media (max-width: 600px) {
540
- .header-nav { display: none; }
541
- .hero-section { padding: 3rem 1rem 2.5rem; }
542
- .features-section { padding: 0 1rem 3rem; }
690
+ .header-nav {
691
+ display: none;
692
+ }
693
+
694
+ .hero-section {
695
+ padding: 3rem 1rem 2.5rem;
696
+ }
697
+
698
+ .features-section {
699
+ padding: 0 1rem 3rem;
700
+ }
543
701
  }
544
702
 
545
703
  /* ── Dev Tools Panel (diagnostic only — remove when WS sync confirmed) ── */
@@ -554,7 +712,10 @@ body::before {
554
712
  flex-direction: column;
555
713
  gap: 1rem;
556
714
  margin-bottom: 3rem;
715
+ max-height: 250px;
716
+ overflow-y: auto;
557
717
  }
718
+
558
719
  .dev-panel-title {
559
720
  font-size: 0.8rem;
560
721
  font-weight: 600;
@@ -563,11 +724,13 @@ body::before {
563
724
  color: var(--clr-warn);
564
725
  opacity: 0.7;
565
726
  }
727
+
566
728
  .dev-panel-row {
567
729
  display: flex;
568
730
  gap: 0.75rem;
569
731
  flex-wrap: wrap;
570
732
  }
733
+
571
734
  .dev-btn {
572
735
  padding: 0.55rem 1.25rem;
573
736
  border-radius: var(--radius-sm);
@@ -580,15 +743,18 @@ body::before {
580
743
  cursor: pointer;
581
744
  transition: background var(--t-fast), border-color var(--t-fast);
582
745
  }
746
+
583
747
  .dev-btn:hover:not(:disabled) {
584
748
  background: rgba(255, 204, 68, 0.08);
585
749
  border-color: rgba(255, 204, 68, 0.7);
586
750
  }
751
+
587
752
  .dev-btn:disabled {
588
753
  opacity: 0.5;
589
754
  cursor: not-allowed;
590
755
  border-color: rgba(255, 204, 68, 0.2);
591
756
  }
757
+
592
758
  .dev-panel-log {
593
759
  font-family: var(--font-mono);
594
760
  font-size: 0.75rem;
@@ -612,10 +778,12 @@ body::before {
612
778
  border-bottom: 1px solid rgba(255, 204, 68, 0.08);
613
779
  padding-bottom: 0.85rem;
614
780
  }
781
+
615
782
  .dev-panel-row-container:last-of-type {
616
783
  border-bottom: none;
617
784
  padding-bottom: 0;
618
785
  }
786
+
619
787
  .dev-panel-row-label {
620
788
  font-family: var(--font-mono);
621
789
  font-size: 0.85rem;
@@ -629,3 +797,240 @@ body::before {
629
797
  background: rgba(255, 204, 68, 0.06);
630
798
  user-select: none;
631
799
  }
800
+
801
+ @keyframes spin-bounce {
802
+ 0% {
803
+ transform: translate(0, 0) scale(1);
804
+ }
805
+ 25% {
806
+ transform: translate(10px, -6px) scale(1.05);
807
+ }
808
+ 50% {
809
+ transform: translate(0, -12px) scale(1.1);
810
+ }
811
+ 75% {
812
+ transform: translate(-10px, -6px) scale(1.05);
813
+ }
814
+ 100% {
815
+ transform: translate(0, 0) scale(1);
816
+ }
817
+ }
818
+
819
+ /* ── Common Component Tab Styling ── */
820
+ .tabs-row {
821
+ display: flex;
822
+ align-items: center;
823
+ gap: 0.5rem;
824
+ }
825
+
826
+ .tabs-list {
827
+ display: flex;
828
+ gap: 0.25rem;
829
+ overflow-x: auto;
830
+ flex-grow: 1;
831
+ padding-bottom: 5px; /* Leave space for the thin scrollbar */
832
+ margin-bottom: -5px; /* Offset the padding in layout */
833
+
834
+ /* Custom scrollbar properties for Firefox */
835
+ scrollbar-width: thin;
836
+ scrollbar-color: var(--clr-accent-dim) transparent;
837
+ }
838
+
839
+ /* Chrome, Safari, Edge, Opera */
840
+ .tabs-list::-webkit-scrollbar {
841
+ height: 5px; /* Thin horizontal scrollbar */
842
+ }
843
+
844
+ .tabs-list::-webkit-scrollbar-track {
845
+ background: transparent;
846
+ }
847
+
848
+ .tabs-list::-webkit-scrollbar-thumb {
849
+ background: var(--clr-accent-dim);
850
+ border-radius: var(--radius-sm);
851
+ border: 1px solid transparent; /* Avoid thumb touching edges */
852
+ background-clip: padding-box;
853
+ }
854
+
855
+ .tabs-list::-webkit-scrollbar-thumb:hover {
856
+ background: var(--clr-accent);
857
+ }
858
+
859
+ /* Tab button styling (.tab-btn is TS default, .panel-tab-button for backwards compatibility) */
860
+ .tab-btn,
861
+ .panel-tab-button {
862
+ padding: var(--tab-padding);
863
+ background: var(--tab-background-color);
864
+ border-radius: var(--tab-border-radius);
865
+ border: var(--tab-border-width) solid var(--tab-border-color);
866
+ border-bottom: none;
867
+ color: var(--tab-text-color);
868
+ font-family: var(--font-sans);
869
+ font-size: 0.85rem;
870
+ font-weight: 500;
871
+ cursor: pointer;
872
+ white-space: nowrap;
873
+ transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast);
874
+ outline: none;
875
+ }
876
+
877
+ .tab-btn:hover,
878
+ .panel-tab-button:hover {
879
+ background: var(--tab-background-color-hover);
880
+ color: var(--clr-text-primary);
881
+ border-color: var(--clr-border-hover);
882
+ }
883
+
884
+ .tab-btn.active,
885
+ .panel-tab-button.active {
886
+ background: var(--tab-background-color-active);
887
+ color: var(--tab-text-color-active);
888
+ border-color: var(--tab-border-color-active);
889
+ border-bottom: var(--tab-border-width) solid transparent;
890
+ font-weight: 600;
891
+ box-shadow: inset 0 2px 0 0 var(--clr-accent);
892
+ }
893
+
894
+ .tab-btn.global-active::after {
895
+ content: " •";
896
+ color: var(--clr-accent);
897
+ font-size: 1.2rem;
898
+ line-height: 0;
899
+ vertical-align: middle;
900
+ }
901
+
902
+ .action-btn.active-primary:disabled {
903
+ opacity: 0.85;
904
+ background: rgba(120, 248, 126, 0.15) !important;
905
+ color: var(--clr-accent) !important;
906
+ border: 1px solid var(--clr-accent) !important;
907
+ }
908
+
909
+ /* ── Common Component Layout & Controls ── */
910
+
911
+ .component-container {
912
+ padding: 2rem;
913
+ background: var(--clr-bg-glass);
914
+ backdrop-filter: blur(16px);
915
+ border-radius: var(--radius-lg);
916
+ border: 1px solid var(--clr-border);
917
+ box-shadow: var(--shadow-card);
918
+ color: var(--clr-text-primary);
919
+ }
920
+
921
+ .action-row {
922
+ display: flex;
923
+ gap: 1rem;
924
+ margin-top: 0.5rem;
925
+ }
926
+
927
+ .action-btn {
928
+ padding: var(--button-padding-base, 0.75rem 1.5rem);
929
+ background: var(--button-background-color-base, var(--clr-accent));
930
+ color: var(--button-text-color-base, var(--clr-bg-deep));
931
+ border: var(--button-border-width-base, 1px) solid var(--button-border-color-base, transparent);
932
+ border-radius: var(--button-border-radius-base, var(--radius-md));
933
+ font-weight: 600;
934
+ cursor: pointer;
935
+ transition: all var(--t-fast);
936
+ display: inline-flex;
937
+ align-items: center;
938
+ justify-content: center;
939
+ }
940
+
941
+ .action-btn:hover:not(:disabled) {
942
+ background: var(--button-hover-background-color, #9fffa5);
943
+ color: var(--button-hover-text-color, var(--clr-bg-deep));
944
+ border-color: var(--button-hover-border-color, transparent);
945
+ transform: translateY(-1px);
946
+ box-shadow: 0 4px 12px var(--clr-accent-glow);
947
+ }
948
+
949
+ .action-btn:active:not(:disabled) {
950
+ transform: translateY(0);
951
+ }
952
+
953
+ .action-btn.secondary {
954
+ background: transparent;
955
+ border-color: var(--button-border-color-base, rgba(255, 255, 255, 0.2));
956
+ color: var(--clr-text-primary);
957
+ }
958
+
959
+ .action-btn.secondary:hover:not(:disabled) {
960
+ background: var(--button-hover-background-color, rgba(255, 255, 255, 0.05));
961
+ border-color: var(--button-hover-border-color, rgba(255, 255, 255, 0.4));
962
+ color: var(--clr-text-primary);
963
+ box-shadow: none;
964
+ }
965
+
966
+ .action-btn:disabled {
967
+ opacity: 0.5;
968
+ cursor: not-allowed;
969
+ background: var(--clr-border) !important;
970
+ color: var(--clr-text-muted) !important;
971
+ border-color: transparent !important;
972
+ box-shadow: none !important;
973
+ transform: none !important;
974
+ }
975
+
976
+ .text-input,
977
+ .secret-input {
978
+ flex-grow: 1;
979
+ padding: var(--input-padding, 0.75rem);
980
+ background: var(--input-background-color, rgba(0, 0, 0, 0.25));
981
+ color: var(--input-text-color, var(--clr-text-primary));
982
+ border: var(--input-border-width, 1px) solid var(--input-border-color, var(--clr-border));
983
+ border-radius: var(--input-border-radius, var(--radius-sm));
984
+ font-size: 0.9rem;
985
+ font-family: var(--font-mono);
986
+ transition: border-color var(--t-fast);
987
+ }
988
+
989
+ .text-input:focus,
990
+ .secret-input:focus {
991
+ outline: none;
992
+ border-color: var(--clr-accent);
993
+ }
994
+
995
+ .text-input.invalid,
996
+ .secret-input.invalid {
997
+ border-color: var(--clr-danger);
998
+ box-shadow: 0 0 0 2px rgba(255, 91, 91, 0.2);
999
+ }
1000
+
1001
+ .status-msg {
1002
+ padding: 0.75rem 1rem;
1003
+ border-radius: var(--radius-sm);
1004
+ font-size: 0.85rem;
1005
+ margin: 0;
1006
+ }
1007
+
1008
+ .status-msg.success {
1009
+ background: rgba(120, 248, 126, 0.08);
1010
+ border: 1px solid var(--clr-border);
1011
+ color: var(--clr-accent);
1012
+ }
1013
+
1014
+ .status-msg.error {
1015
+ background: rgba(255, 91, 91, 0.08);
1016
+ border: 1px solid rgba(255, 91, 91, 0.2);
1017
+ color: var(--clr-danger);
1018
+ }
1019
+
1020
+ .status-msg.info {
1021
+ background: rgba(255, 255, 255, 0.03);
1022
+ border: 1px solid rgba(255, 255, 255, 0.08);
1023
+ color: var(--clr-text-secondary);
1024
+ }
1025
+
1026
+ .address-code,
1027
+ .keystone-addr {
1028
+ display: block;
1029
+ padding: 0.75rem;
1030
+ background: rgba(0, 0, 0, 0.3);
1031
+ border-radius: var(--radius-sm);
1032
+ font-family: var(--font-mono);
1033
+ font-size: 0.85rem;
1034
+ word-break: break-all;
1035
+ color: var(--clr-accent);
1036
+ }