@jxrstudios/jxr 1.0.9 → 1.0.11

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 (89) hide show
  1. package/bin/jxr.js +6 -0
  2. package/dist/index.d.ts +43 -0
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +57 -2
  5. package/dist/jxr-server-manager.d.ts.map +1 -1
  6. package/package.json +1 -1
  7. package/src/jxr-server-manager.ts +57 -1
  8. package/zzz_react_template/App.tsx +43 -156
  9. package/zzz_react_template/components/ErrorBoundary.tsx +62 -0
  10. package/zzz_react_template/components/ManusDialog.tsx +85 -0
  11. package/zzz_react_template/components/Map.tsx +155 -0
  12. package/zzz_react_template/components/jxr/CodeEditor.tsx +313 -0
  13. package/zzz_react_template/components/jxr/FileExplorer.tsx +230 -0
  14. package/zzz_react_template/components/jxr/IDEShell.tsx +159 -0
  15. package/zzz_react_template/components/jxr/LandingPage.tsx +414 -0
  16. package/zzz_react_template/components/jxr/LivePreview.tsx +169 -0
  17. package/zzz_react_template/components/jxr/PerformanceDashboard.tsx +379 -0
  18. package/zzz_react_template/components/jxr/TopBar.tsx +149 -0
  19. package/zzz_react_template/components/ui/accordion.tsx +64 -0
  20. package/zzz_react_template/components/ui/alert-dialog.tsx +155 -0
  21. package/zzz_react_template/components/ui/alert.tsx +66 -0
  22. package/zzz_react_template/components/ui/aspect-ratio.tsx +9 -0
  23. package/zzz_react_template/components/ui/avatar.tsx +51 -0
  24. package/zzz_react_template/components/ui/badge.tsx +46 -0
  25. package/zzz_react_template/components/ui/breadcrumb.tsx +109 -0
  26. package/zzz_react_template/components/ui/button-group.tsx +83 -0
  27. package/zzz_react_template/components/ui/button.tsx +60 -0
  28. package/zzz_react_template/components/ui/calendar.tsx +211 -0
  29. package/zzz_react_template/components/ui/card.tsx +92 -0
  30. package/zzz_react_template/components/ui/carousel.tsx +239 -0
  31. package/zzz_react_template/components/ui/chart.tsx +355 -0
  32. package/zzz_react_template/components/ui/checkbox.tsx +30 -0
  33. package/zzz_react_template/components/ui/collapsible.tsx +31 -0
  34. package/zzz_react_template/components/ui/command.tsx +184 -0
  35. package/zzz_react_template/components/ui/context-menu.tsx +250 -0
  36. package/zzz_react_template/components/ui/dialog.tsx +209 -0
  37. package/zzz_react_template/components/ui/drawer.tsx +133 -0
  38. package/zzz_react_template/components/ui/dropdown-menu.tsx +255 -0
  39. package/zzz_react_template/components/ui/empty.tsx +104 -0
  40. package/zzz_react_template/components/ui/field.tsx +242 -0
  41. package/zzz_react_template/components/ui/form.tsx +168 -0
  42. package/zzz_react_template/components/ui/hover-card.tsx +42 -0
  43. package/zzz_react_template/components/ui/input-group.tsx +168 -0
  44. package/zzz_react_template/components/ui/input-otp.tsx +75 -0
  45. package/zzz_react_template/components/ui/input.tsx +70 -0
  46. package/zzz_react_template/components/ui/item.tsx +193 -0
  47. package/zzz_react_template/components/ui/kbd.tsx +28 -0
  48. package/zzz_react_template/components/ui/label.tsx +22 -0
  49. package/zzz_react_template/components/ui/menubar.tsx +274 -0
  50. package/zzz_react_template/components/ui/navigation-menu.tsx +168 -0
  51. package/zzz_react_template/components/ui/pagination.tsx +127 -0
  52. package/zzz_react_template/components/ui/popover.tsx +46 -0
  53. package/zzz_react_template/components/ui/progress.tsx +29 -0
  54. package/zzz_react_template/components/ui/radio-group.tsx +43 -0
  55. package/zzz_react_template/components/ui/resizable.tsx +54 -0
  56. package/zzz_react_template/components/ui/scroll-area.tsx +56 -0
  57. package/zzz_react_template/components/ui/select.tsx +185 -0
  58. package/zzz_react_template/components/ui/separator.tsx +26 -0
  59. package/zzz_react_template/components/ui/sheet.tsx +139 -0
  60. package/zzz_react_template/components/ui/sidebar.tsx +734 -0
  61. package/zzz_react_template/components/ui/skeleton.tsx +13 -0
  62. package/zzz_react_template/components/ui/slider.tsx +61 -0
  63. package/zzz_react_template/components/ui/sonner.tsx +23 -0
  64. package/zzz_react_template/components/ui/spinner.tsx +16 -0
  65. package/zzz_react_template/components/ui/switch.tsx +29 -0
  66. package/zzz_react_template/components/ui/table.tsx +114 -0
  67. package/zzz_react_template/components/ui/tabs.tsx +64 -0
  68. package/zzz_react_template/components/ui/textarea.tsx +67 -0
  69. package/zzz_react_template/components/ui/toggle-group.tsx +73 -0
  70. package/zzz_react_template/components/ui/toggle.tsx +45 -0
  71. package/zzz_react_template/components/ui/tooltip.tsx +59 -0
  72. package/zzz_react_template/const.ts +17 -0
  73. package/zzz_react_template/contexts/JXRContext.tsx +264 -0
  74. package/zzz_react_template/contexts/ThemeContext.tsx +64 -0
  75. package/zzz_react_template/hooks/useComposition.ts +81 -0
  76. package/zzz_react_template/hooks/useMobile.tsx +21 -0
  77. package/zzz_react_template/hooks/usePersistFn.ts +20 -0
  78. package/zzz_react_template/index.css +518 -11
  79. package/zzz_react_template/lib/jxr-runtime/index.ts +201 -0
  80. package/zzz_react_template/lib/jxr-runtime/module-resolver.ts +520 -0
  81. package/zzz_react_template/lib/jxr-runtime/moq-transport.ts +267 -0
  82. package/zzz_react_template/lib/jxr-runtime/web-crypto.ts +279 -0
  83. package/zzz_react_template/lib/jxr-runtime/worker-pool.ts +321 -0
  84. package/zzz_react_template/lib/utils.ts +6 -0
  85. package/zzz_react_template/main.tsx +4 -9
  86. package/zzz_react_template/pages/Docs.tsx +955 -0
  87. package/zzz_react_template/pages/Home.tsx +1080 -0
  88. package/zzz_react_template/pages/NotFound.tsx +105 -0
  89. package/zzz_react_template/tsconfig.json +24 -0
@@ -1,16 +1,523 @@
1
+ /**
2
+ * JXR.js — LavaFlow Brand System
3
+ * Matched to LavaFlow Streams (lavaflowstreams.pro)
4
+ *
5
+ * Core palette:
6
+ * Background: #0a0a0a — pure volcanic black
7
+ * Lava Orange: #ea580c / #f97316 — primary CTA, accent headlines
8
+ * Neon Green: #22c55e / #4ade80 — live indicators, success states
9
+ * White: #ffffff — primary headings
10
+ * Gray-400: #9ca3af — body text
11
+ * Gray-600: #4b5563 — muted / borders
12
+ *
13
+ * Typography: Inter (display + body) + JetBrains Mono (code)
14
+ * Radial warm glow: rgba(120,40,10,0.35) behind hero
15
+ */
16
+
1
17
  @import "tailwindcss";
18
+ @import "tw-animate-css";
19
+
20
+ @custom-variant dark (&:is(.dark *));
21
+
22
+ @theme inline {
23
+ --radius-sm: calc(var(--radius) - 4px);
24
+ --radius-md: calc(var(--radius) - 2px);
25
+ --radius-lg: var(--radius);
26
+ --radius-xl: calc(var(--radius) + 4px);
27
+ --color-background: var(--background);
28
+ --color-foreground: var(--foreground);
29
+ --color-card: var(--card);
30
+ --color-card-foreground: var(--card-foreground);
31
+ --color-popover: var(--popover);
32
+ --color-popover-foreground: var(--popover-foreground);
33
+ --color-primary: var(--primary);
34
+ --color-primary-foreground: var(--primary-foreground);
35
+ --color-secondary: var(--secondary);
36
+ --color-secondary-foreground: var(--secondary-foreground);
37
+ --color-muted: var(--muted);
38
+ --color-muted-foreground: var(--muted-foreground);
39
+ --color-accent: var(--accent);
40
+ --color-accent-foreground: var(--accent-foreground);
41
+ --color-destructive: var(--destructive);
42
+ --color-border: var(--border);
43
+ --color-input: var(--input);
44
+ --color-ring: var(--ring);
45
+ --color-chart-1: var(--chart-1);
46
+ --color-chart-2: var(--chart-2);
47
+ --color-chart-3: var(--chart-3);
48
+ --color-chart-4: var(--chart-4);
49
+ --color-chart-5: var(--chart-5);
50
+ --color-sidebar: var(--sidebar);
51
+ --color-sidebar-foreground: var(--sidebar-foreground);
52
+ --color-sidebar-primary: var(--sidebar-primary);
53
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
54
+ --color-sidebar-accent: var(--sidebar-accent);
55
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
56
+ --color-sidebar-border: var(--sidebar-border);
57
+ --color-sidebar-ring: var(--sidebar-ring);
58
+
59
+ /* JXR / LavaFlow brand tokens */
60
+ --color-lava: var(--lava);
61
+ --color-lava-hot: var(--lava-hot);
62
+ --color-green-live: var(--green-live);
63
+ --color-surface: var(--surface);
64
+ --color-surface-2: var(--surface-2);
65
+ }
2
66
 
3
67
  :root {
4
- --background: 0 0% 100%;
5
- --foreground: 222.2 84% 4.9%;
6
- --primary: 222.2 47.4% 11.2%;
7
- --primary-foreground: 210 40% 98%;
8
- --muted: 210 40% 96.1%;
9
- --muted-foreground: 215.4 16.3% 46.9%;
68
+ --radius: 0.5rem;
69
+
70
+ /* ── LavaFlow Brand Palette ── */
71
+ --lava: #ea580c; /* orange-600 primary CTA */
72
+ --lava-hot: #f97316; /* orange-500 headline accent */
73
+ --green-live: #22c55e; /* green-500 — live/active states */
74
+ --green-dim: #16a34a; /* green-600 — dimmer green */
75
+
76
+ /* ── Surface layers ── */
77
+ --surface: #111111; /* card background */
78
+ --surface-2: #1a1a1a; /* elevated surface */
79
+ --surface-3: #222222; /* hover surface */
80
+
81
+ /* ── Semantic tokens ── */
82
+ --background: #0a0a0a;
83
+ --foreground: #ffffff;
84
+ --card: #111111;
85
+ --card-foreground: #ffffff;
86
+ --popover: #111111;
87
+ --popover-foreground: #ffffff;
88
+ --primary: #ea580c;
89
+ --primary-foreground: #ffffff;
90
+ --secondary: #1a1a1a;
91
+ --secondary-foreground: #9ca3af;
92
+ --muted: #1a1a1a;
93
+ --muted-foreground: #6b7280;
94
+ --accent: #22c55e;
95
+ --accent-foreground: #0a0a0a;
96
+ --destructive: #ef4444;
97
+ --border: rgba(255,255,255,0.07);
98
+ --input: rgba(255,255,255,0.08);
99
+ --ring: #ea580c;
100
+ --chart-1: #ea580c;
101
+ --chart-2: #22c55e;
102
+ --chart-3: #f97316;
103
+ --chart-4: #16a34a;
104
+ --chart-5: #fb923c;
105
+ --sidebar: #0d0d0d;
106
+ --sidebar-foreground: #ffffff;
107
+ --sidebar-primary: #ea580c;
108
+ --sidebar-primary-foreground: #ffffff;
109
+ --sidebar-accent: #1a1a1a;
110
+ --sidebar-accent-foreground: #ffffff;
111
+ --sidebar-border: rgba(255,255,255,0.06);
112
+ --sidebar-ring: #ea580c;
10
113
  }
11
114
 
12
- body {
13
- margin: 0;
14
- font-family: system-ui, -apple-system, sans-serif;
15
- -webkit-font-smoothing: antialiased;
16
- }
115
+ @layer base {
116
+ * {
117
+ @apply border-border outline-ring/50;
118
+ box-sizing: border-box;
119
+ }
120
+
121
+ html {
122
+ scroll-behavior: smooth;
123
+ }
124
+
125
+ body {
126
+ background: #0a0a0a;
127
+ color: #ffffff;
128
+ font-family: 'Inter', system-ui, -apple-system, sans-serif;
129
+ -webkit-font-smoothing: antialiased;
130
+ -moz-osx-font-smoothing: grayscale;
131
+ line-height: 1.6;
132
+ }
133
+
134
+ code, pre, kbd, samp {
135
+ font-family: 'JetBrains Mono', 'Fira Code', 'Cascadia Code', monospace;
136
+ }
137
+
138
+ button:not(:disabled),
139
+ [role="button"]:not([aria-disabled="true"]),
140
+ a[href] {
141
+ cursor: pointer;
142
+ }
143
+
144
+ ::selection {
145
+ background: rgba(234, 88, 12, 0.3);
146
+ color: #ffffff;
147
+ }
148
+
149
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
150
+ ::-webkit-scrollbar-track { background: #0a0a0a; }
151
+ ::-webkit-scrollbar-thumb { background: #2a2a2a; border-radius: 3px; }
152
+ ::-webkit-scrollbar-thumb:hover { background: rgba(234,88,12,0.5); }
153
+ }
154
+
155
+ @layer components {
156
+ /* ── Container ── */
157
+ .container {
158
+ width: 100%;
159
+ margin-left: auto;
160
+ margin-right: auto;
161
+ padding-left: 1.5rem;
162
+ padding-right: 1.5rem;
163
+ max-width: 1200px;
164
+ }
165
+ @media (min-width: 768px) {
166
+ .container { padding-left: 2rem; padding-right: 2rem; }
167
+ }
168
+
169
+ .flex { min-height: 0; min-width: 0; }
170
+
171
+ /* ── Primary CTA Button — matches LavaFlow "Start building" ── */
172
+ .btn-lava {
173
+ display: inline-flex;
174
+ align-items: center;
175
+ gap: 0.5rem;
176
+ padding: 0.7rem 1.6rem;
177
+ background: #ea580c;
178
+ color: #ffffff;
179
+ font-family: 'Inter', sans-serif;
180
+ font-weight: 700;
181
+ font-size: 0.9rem;
182
+ letter-spacing: 0.01em;
183
+ border: none;
184
+ border-radius: 8px;
185
+ cursor: pointer;
186
+ transition: background 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease;
187
+ text-decoration: none;
188
+ white-space: nowrap;
189
+ }
190
+ .btn-lava:hover {
191
+ background: #f97316;
192
+ transform: translateY(-1px);
193
+ box-shadow: 0 6px 28px rgba(234,88,12,0.45);
194
+ }
195
+ .btn-lava:active { transform: translateY(0); }
196
+
197
+ /* ── Ghost Button ── */
198
+ .btn-ghost {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ gap: 0.5rem;
202
+ padding: 0.7rem 1.6rem;
203
+ background: transparent;
204
+ color: #d1d5db;
205
+ font-family: 'Inter', sans-serif;
206
+ font-weight: 600;
207
+ font-size: 0.9rem;
208
+ border: 1px solid rgba(255,255,255,0.12);
209
+ border-radius: 8px;
210
+ cursor: pointer;
211
+ transition: all 0.15s ease;
212
+ text-decoration: none;
213
+ white-space: nowrap;
214
+ }
215
+ .btn-ghost:hover {
216
+ border-color: rgba(234,88,12,0.45);
217
+ color: #ea580c;
218
+ background: rgba(234,88,12,0.06);
219
+ }
220
+
221
+ /* ── Code / Terminal Block ── */
222
+ .code-block {
223
+ background: #0d0d0d;
224
+ border: 1px solid rgba(255,255,255,0.07);
225
+ border-radius: 10px;
226
+ padding: 1.25rem 1.5rem;
227
+ font-family: 'JetBrains Mono', monospace;
228
+ font-size: 0.82rem;
229
+ line-height: 1.75;
230
+ color: #e5e7eb;
231
+ overflow-x: auto;
232
+ position: relative;
233
+ }
234
+ .code-block .token-cmd { color: #22c55e; font-weight: 600; }
235
+ .code-block .token-comment { color: #4b5563; }
236
+ .code-block .token-string { color: #f97316; }
237
+ .code-block .token-keyword { color: #fb923c; }
238
+ .code-block .token-output { color: #22c55e; }
239
+
240
+ /* ── Terminal Window Chrome ── */
241
+ .terminal-chrome {
242
+ background: #111111;
243
+ border: 1px solid rgba(255,255,255,0.07);
244
+ border-radius: 12px;
245
+ overflow: hidden;
246
+ }
247
+ .terminal-header {
248
+ display: flex;
249
+ align-items: center;
250
+ gap: 6px;
251
+ padding: 10px 14px;
252
+ background: #161616;
253
+ border-bottom: 1px solid rgba(255,255,255,0.06);
254
+ }
255
+ .terminal-dot {
256
+ width: 12px;
257
+ height: 12px;
258
+ border-radius: 50%;
259
+ flex-shrink: 0;
260
+ }
261
+ .terminal-label {
262
+ margin-left: 8px;
263
+ font-family: 'JetBrains Mono', monospace;
264
+ font-size: 0.72rem;
265
+ color: #4b5563;
266
+ letter-spacing: 0.05em;
267
+ }
268
+ .terminal-body {
269
+ padding: 1.25rem 1.5rem;
270
+ font-family: 'JetBrains Mono', monospace;
271
+ font-size: 0.82rem;
272
+ line-height: 1.85;
273
+ color: #d1d5db;
274
+ }
275
+ .terminal-prompt { color: #22c55e; font-weight: 600; }
276
+ .terminal-cmd { color: #ffffff; }
277
+ .terminal-out { color: #22c55e; }
278
+ .terminal-dim { color: #4b5563; }
279
+ .terminal-orange { color: #f97316; }
280
+
281
+ /* ── Card ── */
282
+ .jxr-card {
283
+ background: #111111;
284
+ border: 1px solid rgba(255,255,255,0.07);
285
+ border-radius: 12px;
286
+ padding: 1.5rem;
287
+ transition: border-color 0.2s, box-shadow 0.2s;
288
+ }
289
+ .jxr-card:hover {
290
+ border-color: rgba(234,88,12,0.25);
291
+ box-shadow: 0 0 32px rgba(234,88,12,0.05);
292
+ }
293
+
294
+ /* ── Stat Pill — matches LavaFlow hero stats ── */
295
+ .stat-pill {
296
+ display: inline-flex;
297
+ align-items: center;
298
+ gap: 0.5rem;
299
+ padding: 0.4rem 0.9rem;
300
+ background: #111111;
301
+ border: 1px solid rgba(255,255,255,0.1);
302
+ border-radius: 100px;
303
+ font-size: 0.8rem;
304
+ color: #9ca3af;
305
+ white-space: nowrap;
306
+ }
307
+ .stat-pill strong { color: #ffffff; font-weight: 700; }
308
+ .stat-pill .pill-icon { color: #ea580c; }
309
+
310
+ /* ── Section label — "> PROVISION IN SECONDS" style ── */
311
+ .section-label {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ gap: 0.5rem;
315
+ font-family: 'JetBrains Mono', monospace;
316
+ font-size: 0.68rem;
317
+ font-weight: 600;
318
+ letter-spacing: 0.18em;
319
+ text-transform: uppercase;
320
+ color: #6b7280;
321
+ margin-bottom: 1.25rem;
322
+ }
323
+ .section-label::before {
324
+ content: '›';
325
+ color: #ea580c;
326
+ font-size: 0.9rem;
327
+ line-height: 1;
328
+ }
329
+
330
+ /* ── Orange text accent ── */
331
+ .text-lava {
332
+ color: #f97316;
333
+ }
334
+
335
+ /* ── Live indicator ── */
336
+ .live-dot {
337
+ width: 7px;
338
+ height: 7px;
339
+ border-radius: 50%;
340
+ background: #22c55e;
341
+ flex-shrink: 0;
342
+ animation: pulse-green 2s ease-in-out infinite;
343
+ }
344
+
345
+ @keyframes pulse-green {
346
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(34,197,94,0.5); }
347
+ 50% { opacity: 0.8; box-shadow: 0 0 0 5px rgba(34,197,94,0); }
348
+ }
349
+
350
+ /* ── Orange pulse dot ── */
351
+ .pulse-dot {
352
+ width: 7px;
353
+ height: 7px;
354
+ border-radius: 50%;
355
+ background: #ea580c;
356
+ flex-shrink: 0;
357
+ animation: pulse-lava 2s ease-in-out infinite;
358
+ }
359
+
360
+ @keyframes pulse-lava {
361
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(234,88,12,0.5); }
362
+ 50% { opacity: 0.8; box-shadow: 0 0 0 5px rgba(234,88,12,0); }
363
+ }
364
+
365
+ /* ── Badge ── */
366
+ .badge-lava {
367
+ display: inline-flex;
368
+ align-items: center;
369
+ gap: 0.35rem;
370
+ padding: 0.2rem 0.7rem;
371
+ background: rgba(234,88,12,0.12);
372
+ border: 1px solid rgba(234,88,12,0.25);
373
+ border-radius: 100px;
374
+ font-family: 'JetBrains Mono', monospace;
375
+ font-size: 0.7rem;
376
+ font-weight: 600;
377
+ color: #f97316;
378
+ letter-spacing: 0.05em;
379
+ }
380
+ .badge-green {
381
+ display: inline-flex;
382
+ align-items: center;
383
+ gap: 0.35rem;
384
+ padding: 0.2rem 0.7rem;
385
+ background: rgba(34,197,94,0.1);
386
+ border: 1px solid rgba(34,197,94,0.2);
387
+ border-radius: 100px;
388
+ font-family: 'JetBrains Mono', monospace;
389
+ font-size: 0.7rem;
390
+ font-weight: 600;
391
+ color: #4ade80;
392
+ letter-spacing: 0.05em;
393
+ }
394
+
395
+ /* ── Divider ── */
396
+ .lava-divider {
397
+ height: 1px;
398
+ background: linear-gradient(90deg, transparent, rgba(234,88,12,0.25), transparent);
399
+ }
400
+
401
+ /* ── Cursor blink ── */
402
+ @keyframes blink {
403
+ 0%, 100% { opacity: 1; }
404
+ 50% { opacity: 0; }
405
+ }
406
+ .cursor-blink {
407
+ display: inline-block;
408
+ width: 2px;
409
+ height: 1em;
410
+ background: #22c55e;
411
+ vertical-align: text-bottom;
412
+ animation: blink 1s step-end infinite;
413
+ margin-left: 2px;
414
+ }
415
+
416
+ /* ── Architecture diagram card ── */
417
+ .arch-card {
418
+ background: #111111;
419
+ border: 1px solid rgba(255,255,255,0.08);
420
+ border-radius: 14px;
421
+ overflow: hidden;
422
+ }
423
+ .arch-header {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: space-between;
427
+ padding: 12px 16px;
428
+ border-bottom: 1px solid rgba(255,255,255,0.06);
429
+ }
430
+ .arch-live-label {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 6px;
434
+ font-family: 'JetBrains Mono', monospace;
435
+ font-size: 0.65rem;
436
+ font-weight: 700;
437
+ letter-spacing: 0.15em;
438
+ text-transform: uppercase;
439
+ color: #6b7280;
440
+ }
441
+ .arch-node {
442
+ display: flex;
443
+ flex-direction: column;
444
+ align-items: center;
445
+ gap: 8px;
446
+ padding: 14px 10px;
447
+ border-radius: 8px;
448
+ background: #1a1a1a;
449
+ border: 1px solid rgba(255,255,255,0.06);
450
+ min-width: 80px;
451
+ transition: border-color 0.2s;
452
+ }
453
+ .arch-node.active {
454
+ border-color: #22c55e;
455
+ box-shadow: 0 0 20px rgba(34,197,94,0.12);
456
+ }
457
+ .arch-node-icon {
458
+ width: 36px;
459
+ height: 36px;
460
+ border-radius: 8px;
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ background: #222222;
465
+ color: #9ca3af;
466
+ font-size: 0.9rem;
467
+ }
468
+ .arch-node.active .arch-node-icon {
469
+ background: rgba(34,197,94,0.12);
470
+ color: #22c55e;
471
+ }
472
+ .arch-node-name {
473
+ font-size: 0.7rem;
474
+ font-weight: 600;
475
+ color: #d1d5db;
476
+ text-align: center;
477
+ white-space: nowrap;
478
+ }
479
+ .arch-node-sub {
480
+ font-size: 0.6rem;
481
+ color: #4b5563;
482
+ text-align: center;
483
+ white-space: nowrap;
484
+ }
485
+ .arch-connector {
486
+ height: 2px;
487
+ flex: 1;
488
+ background: rgba(255,255,255,0.06);
489
+ position: relative;
490
+ overflow: hidden;
491
+ }
492
+ .arch-connector::after {
493
+ content: '';
494
+ position: absolute;
495
+ top: 0;
496
+ left: -100%;
497
+ width: 60%;
498
+ height: 100%;
499
+ background: linear-gradient(90deg, transparent, #ea580c, transparent);
500
+ animation: flow 2s linear infinite;
501
+ }
502
+ @keyframes flow {
503
+ 0% { left: -60%; }
504
+ 100% { left: 110%; }
505
+ }
506
+ .arch-progress {
507
+ height: 3px;
508
+ background: rgba(255,255,255,0.04);
509
+ position: relative;
510
+ overflow: hidden;
511
+ }
512
+ .arch-progress-bar {
513
+ height: 100%;
514
+ width: 65%;
515
+ background: linear-gradient(90deg, #ea580c, #f97316, #fb923c);
516
+ border-radius: 2px;
517
+ animation: progress-pulse 2s ease-in-out infinite;
518
+ }
519
+ @keyframes progress-pulse {
520
+ 0%, 100% { opacity: 1; }
521
+ 50% { opacity: 0.7; }
522
+ }
523
+ }