gitmaps 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +5 -11
  2. package/app/[owner]/[repo]/page.client.tsx +5 -0
  3. package/app/[owner]/[repo]/page.tsx +6 -0
  4. package/app/[slug]/page.client.tsx +5 -0
  5. package/app/[slug]/page.tsx +6 -0
  6. package/app/api/manifest.json/route.ts +20 -0
  7. package/app/api/pwa-icon/route.ts +14 -0
  8. package/app/api/repo/clone-stream/route.ts +20 -12
  9. package/app/api/repo/imports/route.ts +21 -3
  10. package/app/api/repo/list/route.ts +30 -0
  11. package/app/api/repo/upload/route.ts +6 -9
  12. package/app/api/sw.js/route.ts +70 -0
  13. package/app/galaxy-canvas/page.client.tsx +2 -0
  14. package/app/galaxy-canvas/page.tsx +5 -0
  15. package/app/globals.css +477 -95
  16. package/app/icon.png +0 -0
  17. package/app/layout.tsx +30 -2
  18. package/app/lib/canvas-text.ts +4 -72
  19. package/app/lib/canvas.ts +1 -1
  20. package/app/lib/card-arrangement.ts +21 -7
  21. package/app/lib/card-context-menu.tsx +2 -2
  22. package/app/lib/card-groups.ts +9 -2
  23. package/app/lib/cards.tsx +3 -1
  24. package/app/lib/connections.tsx +34 -43
  25. package/app/lib/events.tsx +25 -0
  26. package/app/lib/file-card-plugin.ts +14 -0
  27. package/app/lib/file-preview.ts +68 -41
  28. package/app/lib/galaxydraw-bridge.ts +5 -0
  29. package/app/lib/global-search.ts +48 -27
  30. package/app/lib/layers.tsx +17 -18
  31. package/app/lib/perf-overlay.ts +78 -0
  32. package/app/lib/positions.ts +1 -1
  33. package/app/lib/repo.tsx +18 -8
  34. package/app/lib/shortcuts-panel.ts +2 -0
  35. package/app/lib/viewport-culling.ts +7 -0
  36. package/app/page.client.tsx +72 -18
  37. package/app/page.tsx +22 -86
  38. package/banner.png +0 -0
  39. package/package.json +2 -2
  40. package/packages/galaxydraw/README.md +2 -2
  41. package/packages/galaxydraw/package.json +1 -1
  42. package/server.ts +1 -1
  43. package/app/api/connections/route.ts +0 -72
  44. package/app/api/positions/route.ts +0 -80
  45. package/app/api/repo/browse/route.ts +0 -55
  46. package/app/lib/pr-review.ts +0 -374
package/app/globals.css CHANGED
@@ -1,47 +1,53 @@
1
- /* Git Canvas - Premium Dark Theme */
1
+ /* Git Canvas - Premium Dark Theme v2 */
2
2
  :root {
3
- --bg-primary: #0a0a0f;
4
- --bg-secondary: #12121a;
5
- --bg-tertiary: #1a1a25;
6
- --bg-elevated: #22222f;
7
- --bg-card: linear-gradient(135deg, rgba(30, 30, 45, 0.9), rgba(20, 20, 32, 0.95));
3
+ --bg-primary: #08080e;
4
+ --bg-secondary: #0e0e18;
5
+ --bg-tertiary: #161622;
6
+ --bg-elevated: #1e1e2e;
7
+ --bg-card: linear-gradient(145deg, rgba(28, 28, 48, 0.92), rgba(16, 16, 28, 0.96));
8
+ --bg-glass: rgba(14, 14, 24, 0.7);
8
9
 
9
10
  --accent-primary: #7c3aed;
10
11
  --accent-secondary: #a855f7;
11
12
  --accent-tertiary: #c084fc;
12
- --accent-glow: rgba(124, 58, 237, 0.4);
13
+ --accent-glow: rgba(124, 58, 237, 0.35);
14
+ --accent-gradient: linear-gradient(135deg, #7c3aed, #a855f7, #6d28d9);
15
+ --accent-gradient-3d: linear-gradient(180deg, #a855f7 0%, #7c3aed 40%, #5b21b6 100%);
13
16
 
14
17
  --success: #10b981;
15
18
  --warning: #f59e0b;
16
19
  --error: #ef4444;
17
20
  --info: #3b82f6;
18
21
 
19
- --text-primary: #f1f5f9;
20
- --text-secondary: #94a3b8;
21
- --text-muted: #64748b;
22
+ --text-primary: #eef2ff;
23
+ --text-secondary: #a1a1b5;
24
+ --text-muted: #5c5c72;
22
25
 
23
- --border-subtle: rgba(255, 255, 255, 0.06);
24
- --border-default: rgba(255, 255, 255, 0.1);
25
- --border-accent: rgba(124, 58, 237, 0.3);
26
+ --border-subtle: rgba(255, 255, 255, 0.04);
27
+ --border-default: rgba(255, 255, 255, 0.07);
28
+ --border-accent: rgba(124, 58, 237, 0.25);
29
+ --border-glass: rgba(255, 255, 255, 0.06);
26
30
 
27
- --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.3);
28
- --shadow-md: 0 4px 20px rgba(0, 0, 0, 0.4);
29
- --shadow-lg: 0 8px 40px rgba(0, 0, 0, 0.5);
31
+ --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.4);
32
+ --shadow-md: 0 4px 24px rgba(0, 0, 0, 0.5);
33
+ --shadow-lg: 0 12px 48px rgba(0, 0, 0, 0.6);
30
34
  --shadow-glow: 0 0 30px var(--accent-glow);
35
+ --shadow-inset: inset 0 1px 0 rgba(255, 255, 255, 0.04);
31
36
 
32
- --radius-sm: 6px;
33
- --radius-md: 10px;
37
+ --radius-sm: 8px;
38
+ --radius-md: 12px;
34
39
  --radius-lg: 16px;
35
40
  --radius-xl: 24px;
36
41
 
37
42
  --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
38
43
  --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
39
44
  --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
45
+ --transition-spring: 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
40
46
 
41
47
  --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
42
48
  --font-mono: 'JetBrains Mono', 'Fira Code', monospace;
43
49
 
44
- --sidebar-width: 320px;
50
+ --sidebar-width: 300px;
45
51
  }
46
52
 
47
53
  /* Light Theme Override */
@@ -130,24 +136,37 @@ body {
130
136
  #app {
131
137
  display: flex;
132
138
  height: 100vh;
133
- background: radial-gradient(ellipse at top left, rgba(124, 58, 237, 0.08) 0%, transparent 50%),
134
- radial-gradient(ellipse at bottom right, rgba(168, 85, 247, 0.05) 0%, transparent 50%),
135
- var(--bg-primary);
139
+ background: var(--bg-primary);
136
140
  }
137
141
 
138
142
  /* Sidebar */
139
143
  .sidebar {
140
144
  width: var(--sidebar-width);
141
- background: var(--bg-secondary);
145
+ background: linear-gradient(180deg, rgba(14, 14, 24, 0.98) 0%, rgba(10, 10, 16, 0.99) 100%);
142
146
  border-right: 1px solid var(--border-subtle);
143
147
  display: flex;
144
148
  flex-direction: column;
145
149
  overflow: hidden;
150
+ position: relative;
151
+ z-index: 10;
152
+ box-shadow: 4px 0 24px rgba(0, 0, 0, 0.3);
153
+ }
154
+
155
+ .sidebar::after {
156
+ content: '';
157
+ position: absolute;
158
+ top: 0;
159
+ right: 0;
160
+ width: 1px;
161
+ height: 100%;
162
+ background: linear-gradient(180deg, rgba(124, 58, 237, 0.15) 0%, transparent 30%, transparent 70%, rgba(124, 58, 237, 0.1) 100%);
163
+ pointer-events: none;
146
164
  }
147
165
 
148
166
  .sidebar-header {
149
- padding: 14px 16px;
167
+ padding: 16px 18px;
150
168
  border-bottom: 1px solid var(--border-subtle);
169
+ background: linear-gradient(180deg, rgba(124, 58, 237, 0.06) 0%, transparent 100%);
151
170
  }
152
171
 
153
172
  .logo {
@@ -155,27 +174,27 @@ body {
155
174
  align-items: center;
156
175
  gap: 10px;
157
176
  font-size: 1rem;
158
- font-weight: 600;
177
+ font-weight: 700;
159
178
  color: var(--text-primary);
160
- letter-spacing: -0.01em;
179
+ letter-spacing: -0.02em;
161
180
  }
162
181
 
163
182
  .logo svg {
164
- color: var(--accent-primary);
165
- filter: drop-shadow(0 0 6px var(--accent-glow));
183
+ color: var(--accent-secondary);
184
+ filter: drop-shadow(0 0 8px var(--accent-glow));
166
185
  }
167
186
 
168
187
  /* Repository Selector */
169
188
  .repo-selector {
170
- padding: 10px 12px;
189
+ padding: 12px 16px;
171
190
  border-bottom: 1px solid var(--border-subtle);
172
191
  }
173
192
 
174
193
  .repo-dropdown {
175
194
  width: 100%;
176
- padding: 8px 10px;
177
- background: var(--bg-tertiary);
178
- border: 1px solid var(--border-subtle);
195
+ padding: 10px 12px;
196
+ background: rgba(22, 22, 34, 0.8);
197
+ border: 1px solid var(--border-glass);
179
198
  border-radius: var(--radius-sm);
180
199
  color: var(--text-primary);
181
200
  font-family: var(--font-mono);
@@ -183,16 +202,17 @@ body {
183
202
  cursor: pointer;
184
203
  transition: all var(--transition-fast);
185
204
  appearance: none;
186
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
205
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236e6e8a' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");
187
206
  background-repeat: no-repeat;
188
- background-position: right 8px center;
189
- padding-right: 28px;
207
+ background-position: right 10px center;
208
+ padding-right: 30px;
209
+ box-shadow: var(--shadow-inset), 0 2px 6px rgba(0, 0, 0, 0.2);
190
210
  }
191
211
 
192
212
  .repo-dropdown:focus {
193
213
  outline: none;
194
214
  border-color: var(--accent-primary);
195
- box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.2);
215
+ box-shadow: var(--shadow-inset), 0 0 0 2px rgba(124, 58, 237, 0.15), 0 0 12px rgba(124, 58, 237, 0.1);
196
216
  }
197
217
 
198
218
  .repo-dropdown option {
@@ -210,21 +230,22 @@ body {
210
230
 
211
231
  .clone-url-input {
212
232
  flex: 1;
213
- padding: 6px 8px;
214
- background: var(--bg-tertiary);
215
- border: 1px solid var(--border-subtle);
233
+ padding: 8px 10px;
234
+ background: rgba(22, 22, 34, 0.8);
235
+ border: 1px solid var(--border-glass);
216
236
  border-radius: var(--radius-sm);
217
237
  color: var(--text-primary);
218
238
  font-family: var(--font-mono);
219
239
  font-size: 0.72rem;
220
240
  transition: all var(--transition-fast);
221
241
  min-width: 0;
242
+ box-shadow: var(--shadow-inset);
222
243
  }
223
244
 
224
245
  .clone-url-input:focus {
225
246
  outline: none;
226
247
  border-color: var(--accent-primary);
227
- box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.2);
248
+ box-shadow: var(--shadow-inset), 0 0 0 2px rgba(124, 58, 237, 0.15);
228
249
  }
229
250
 
230
251
  .clone-url-input::placeholder {
@@ -236,31 +257,36 @@ body {
236
257
  display: flex;
237
258
  align-items: center;
238
259
  gap: 4px;
239
- padding: 5px 10px;
240
- background: linear-gradient(135deg, var(--accent-primary), #6d28d9);
260
+ padding: 7px 12px;
261
+ background: var(--accent-gradient-3d);
241
262
  border: none;
242
263
  border-radius: var(--radius-sm);
243
264
  color: white;
244
265
  font-size: 0.7rem;
245
- font-weight: 500;
266
+ font-weight: 600;
246
267
  cursor: pointer;
247
268
  transition: all var(--transition-fast);
248
269
  white-space: nowrap;
249
270
  flex-shrink: 0;
271
+ box-shadow: 0 2px 8px rgba(124, 58, 237, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
272
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
250
273
  }
251
274
 
252
275
  .clone-btn:hover {
253
- background: linear-gradient(135deg, var(--accent-secondary), var(--accent-primary));
254
- box-shadow: 0 0 12px var(--accent-glow);
276
+ background: linear-gradient(180deg, #c084fc 0%, #a855f7 40%, #7c3aed 100%);
277
+ box-shadow: 0 4px 16px rgba(124, 58, 237, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.2);
278
+ transform: translateY(-1px);
255
279
  }
256
280
 
257
281
  .clone-btn:active {
258
- transform: scale(0.96);
282
+ transform: translateY(0) scale(0.97);
283
+ box-shadow: 0 1px 4px rgba(124, 58, 237, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1);
259
284
  }
260
285
 
261
286
  .clone-btn:disabled {
262
- opacity: 0.5;
287
+ opacity: 0.4;
263
288
  cursor: not-allowed;
289
+ transform: none;
264
290
  }
265
291
 
266
292
  .clone-status {
@@ -422,13 +448,14 @@ body {
422
448
  font-size: 0.65rem !important;
423
449
  }
424
450
 
425
- /* View Tabs (sidebar) */
451
+ /* View Tabs (sidebar) — 3D gradient style */
426
452
  .view-tabs {
427
453
  display: flex;
428
- padding: 6px 12px;
454
+ padding: 8px 14px;
429
455
  gap: 6px;
430
456
  border-bottom: 1px solid var(--border-subtle);
431
457
  align-items: center;
458
+ background: rgba(0, 0, 0, 0.15);
432
459
  }
433
460
 
434
461
  .view-tab {
@@ -436,7 +463,7 @@ body {
436
463
  align-items: center;
437
464
  justify-content: center;
438
465
  gap: 5px;
439
- padding: 6px 10px;
466
+ padding: 7px 12px;
440
467
  font-size: 0.72rem;
441
468
  font-weight: 500;
442
469
  background: transparent;
@@ -445,22 +472,25 @@ body {
445
472
  border-radius: var(--radius-sm);
446
473
  cursor: pointer;
447
474
  transition: all var(--transition-fast);
475
+ position: relative;
448
476
  }
449
477
 
450
478
  .view-tab:hover {
451
- background: var(--bg-tertiary);
479
+ background: rgba(255, 255, 255, 0.04);
452
480
  color: var(--text-secondary);
453
481
  }
454
482
 
455
483
  .view-tab.active {
456
- background: var(--accent-primary);
484
+ background: var(--accent-gradient-3d);
457
485
  color: white;
458
- box-shadow: 0 0 8px var(--accent-glow);
486
+ box-shadow: 0 2px 10px rgba(124, 58, 237, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.15);
487
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
488
+ font-weight: 600;
459
489
  }
460
490
 
461
491
  .view-tab svg {
462
492
  flex-shrink: 0;
463
- opacity: 0.8;
493
+ opacity: 0.85;
464
494
  }
465
495
 
466
496
  /* All Files Toggle */
@@ -584,11 +614,11 @@ body {
584
614
  /* Commit Item */
585
615
  .commit-item {
586
616
  position: relative;
587
- padding: 12px 16px;
588
- margin-bottom: 4px;
617
+ padding: 10px 14px;
618
+ margin-bottom: 2px;
589
619
  background: transparent;
590
620
  border: 1px solid transparent;
591
- border-radius: var(--radius-md);
621
+ border-radius: var(--radius-sm);
592
622
  cursor: pointer;
593
623
  transition: all var(--transition-fast);
594
624
  }
@@ -598,38 +628,50 @@ body {
598
628
  }
599
629
 
600
630
  .commit-item:hover {
601
- background: var(--bg-tertiary);
631
+ background: rgba(255, 255, 255, 0.025);
602
632
  border-color: var(--border-subtle);
603
633
  }
604
634
 
605
635
  .commit-item.active {
606
- background: var(--bg-card);
607
- border-color: var(--border-accent);
608
- box-shadow: var(--shadow-sm);
636
+ background: linear-gradient(135deg, rgba(124, 58, 237, 0.08), rgba(124, 58, 237, 0.03));
637
+ border-color: rgba(124, 58, 237, 0.2);
638
+ box-shadow: 0 0 12px rgba(124, 58, 237, 0.06);
639
+ }
640
+
641
+ .commit-item.active::after {
642
+ content: '';
643
+ position: absolute;
644
+ left: 0;
645
+ top: 8px;
646
+ bottom: 8px;
647
+ width: 2px;
648
+ background: var(--accent-gradient-3d);
649
+ border-radius: 1px;
609
650
  }
610
651
 
611
652
  .commit-hash {
612
653
  font-family: var(--font-mono);
613
- font-size: 0.8rem;
654
+ font-size: 0.78rem;
614
655
  color: var(--accent-tertiary);
615
656
  font-weight: 500;
616
657
  }
617
658
 
618
659
  .commit-message {
619
- font-size: 0.875rem;
660
+ font-size: 0.82rem;
620
661
  color: var(--text-primary);
621
- margin-top: 4px;
662
+ margin-top: 3px;
622
663
  white-space: nowrap;
623
664
  overflow: hidden;
624
665
  text-overflow: ellipsis;
666
+ line-height: 1.4;
625
667
  }
626
668
 
627
669
  .commit-meta {
628
670
  display: flex;
629
671
  align-items: center;
630
- gap: 12px;
631
- margin-top: 6px;
632
- font-size: 0.75rem;
672
+ gap: 10px;
673
+ margin-top: 5px;
674
+ font-size: 0.72rem;
633
675
  color: var(--text-muted);
634
676
  }
635
677
 
@@ -641,20 +683,24 @@ body {
641
683
  }
642
684
 
643
685
  .commit-ref-badge {
644
- background: rgba(124, 58, 237, 0.15);
645
- border: 1px solid rgba(124, 58, 237, 0.3);
646
- color: var(--accent-secondary);
647
- padding: 0px 4px;
648
- border-radius: 4px;
649
- font-size: 0.65rem;
686
+ background: linear-gradient(135deg, rgba(124, 58, 237, 0.18), rgba(124, 58, 237, 0.08));
687
+ border: 1px solid rgba(124, 58, 237, 0.25);
688
+ color: var(--accent-tertiary);
689
+ padding: 1px 6px;
690
+ border-radius: 6px;
691
+ font-size: 0.62rem;
650
692
  font-weight: 600;
651
693
  white-space: nowrap;
694
+ letter-spacing: 0.02em;
652
695
  }
653
696
 
654
697
  .commit-author {
655
698
  display: flex;
656
699
  align-items: center;
657
700
  gap: 4px;
701
+ max-width: 140px;
702
+ overflow: hidden;
703
+ text-overflow: ellipsis;
658
704
  }
659
705
 
660
706
  /* Canvas Controls */
@@ -817,12 +863,16 @@ body {
817
863
  display: flex;
818
864
  align-items: center;
819
865
  justify-content: space-between;
820
- padding: 6px 12px;
821
- background: var(--bg-secondary);
866
+ padding: 4px 12px;
867
+ background: linear-gradient(180deg, rgba(14, 14, 24, 0.95) 0%, rgba(10, 10, 16, 0.9) 100%);
822
868
  border-bottom: 1px solid var(--border-subtle);
823
- height: 36px;
869
+ height: 38px;
824
870
  flex-shrink: 0;
825
871
  overflow: hidden;
872
+ backdrop-filter: blur(12px);
873
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
874
+ position: relative;
875
+ z-index: 5;
826
876
  }
827
877
 
828
878
  .header-left {
@@ -892,17 +942,37 @@ body {
892
942
  gap: 4px !important;
893
943
  }
894
944
 
895
- /* Changed Files Panel */
945
+ /* Changed Files Panel — Glassmorphism */
896
946
  .changed-files-panel {
897
947
  position: absolute;
898
- top: 44px;
899
- right: 8px;
948
+ top: 48px;
949
+ right: 10px;
900
950
  width: 260px;
901
- max-height: calc(100% - 56px - 140px);
902
- background: var(--bg-secondary);
903
- border: 1px solid var(--border-default);
951
+ max-height: calc(100% - 60px - 140px);
952
+ background: rgba(14, 14, 24, 0.85);
953
+ backdrop-filter: blur(20px);
954
+ -webkit-backdrop-filter: blur(20px);
955
+ border: 1px solid var(--border-glass);
904
956
  border-radius: var(--radius-md);
905
- box-shadow: var(--shadow-lg);
957
+ box-shadow: var(--shadow-lg), 0 0 1px rgba(255, 255, 255, 0.05);
958
+ z-index: 200;
959
+ display: flex;
960
+ flex-direction: column;
961
+ animation: fadeIn 150ms ease;
962
+ }
963
+
964
+ .connections-panel {
965
+ position: absolute;
966
+ top: 48px;
967
+ right: 280px;
968
+ width: 320px;
969
+ max-height: calc(100% - 60px - 140px);
970
+ background: rgba(14, 14, 24, 0.85);
971
+ backdrop-filter: blur(20px);
972
+ -webkit-backdrop-filter: blur(20px);
973
+ border: 1px solid var(--border-glass);
974
+ border-radius: var(--radius-md);
975
+ box-shadow: var(--shadow-lg), 0 0 1px rgba(255, 255, 255, 0.05);
906
976
  z-index: 200;
907
977
  display: flex;
908
978
  flex-direction: column;
@@ -5254,19 +5324,24 @@ body {
5254
5324
  transition: opacity 0.25s ease, transform 0.25s ease;
5255
5325
  }
5256
5326
 
5257
- /* When not hovered, shrink to a compact indicator */
5327
+ /* When not hovered, hide non-active items but show active layer name */
5258
5328
  #layersBarContainer:not(:hover) .layers-bar {
5259
- max-width: 160px;
5260
- overflow: hidden;
5261
- opacity: 0.5;
5262
- transition: max-width 0.3s ease, opacity 0.2s ease;
5329
+ opacity: 0.7;
5330
+ transition: opacity 0.2s ease;
5331
+ }
5332
+
5333
+ #layersBarContainer:not(:hover) .layers-bar-item:not(.active) {
5334
+ display: none;
5335
+ }
5336
+
5337
+ #layersBarContainer:not(:hover) .layers-bar-add {
5338
+ display: none;
5263
5339
  }
5264
5340
 
5265
5341
  /* On hover, expand to full width */
5266
5342
  #layersBarContainer:hover .layers-bar {
5267
- max-width: 800px;
5268
5343
  opacity: 1;
5269
- transition: max-width 0.3s ease, opacity 0.15s ease;
5344
+ transition: opacity 0.15s ease;
5270
5345
  }
5271
5346
 
5272
5347
  .layers-bar {
@@ -5883,6 +5958,310 @@ body {
5883
5958
  color: var(--text-muted);
5884
5959
  }
5885
5960
 
5961
+ /* Feature pills (inline in hero) */
5962
+ .landing-features {
5963
+ display: flex;
5964
+ flex-wrap: wrap;
5965
+ gap: 10px;
5966
+ justify-content: center;
5967
+ margin-top: 20px;
5968
+ animation: landingSlideUp 0.5s 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
5969
+ }
5970
+
5971
+ .feature-pill {
5972
+ display: flex;
5973
+ align-items: center;
5974
+ gap: 6px;
5975
+ padding: 6px 14px;
5976
+ background: rgba(124, 58, 237, 0.1);
5977
+ border: 1px solid rgba(124, 58, 237, 0.2);
5978
+ border-radius: 20px;
5979
+ font-size: 0.78rem;
5980
+ color: var(--text-secondary);
5981
+ font-weight: 500;
5982
+ white-space: nowrap;
5983
+ transition: border-color 0.2s, background 0.2s;
5984
+ }
5985
+
5986
+ .feature-pill:hover {
5987
+ border-color: rgba(124, 58, 237, 0.4);
5988
+ background: rgba(124, 58, 237, 0.15);
5989
+ }
5990
+
5991
+ .feature-icon {
5992
+ font-size: 0.9rem;
5993
+ }
5994
+
5995
+ /* Repo card as anchor link */
5996
+ a.repo-card-btn {
5997
+ text-decoration: none;
5998
+ color: inherit;
5999
+ }
6000
+
6001
+ /* ─── Dimensions Section ─── */
6002
+ .landing-dimensions {
6003
+ display: flex;
6004
+ flex-direction: column;
6005
+ gap: 12px;
6006
+ margin-bottom: 40px;
6007
+ animation: landingSlideUp 0.5s 0.3s cubic-bezier(0.16, 1, 0.3, 1) both;
6008
+ }
6009
+
6010
+ .dimension-label {
6011
+ font-size: 0.7rem;
6012
+ text-transform: uppercase;
6013
+ letter-spacing: 0.08em;
6014
+ color: var(--text-muted);
6015
+ text-align: center;
6016
+ margin-bottom: 8px;
6017
+ font-weight: 500;
6018
+ }
6019
+
6020
+ .dimension-card {
6021
+ display: grid;
6022
+ grid-template-columns: auto 1fr;
6023
+ grid-template-rows: auto auto;
6024
+ gap: 4px 14px;
6025
+ background: rgba(255, 255, 255, 0.015);
6026
+ border: 1px solid rgba(255, 255, 255, 0.04);
6027
+ border-radius: 12px;
6028
+ padding: 16px 20px;
6029
+ transition: border-color 0.3s, background 0.3s, transform 0.3s;
6030
+ position: relative;
6031
+ overflow: hidden;
6032
+ }
6033
+
6034
+ .dimension-card::before {
6035
+ content: '';
6036
+ position: absolute;
6037
+ inset: 0;
6038
+ background: radial-gradient(ellipse at 20% 50%, rgba(167, 139, 250, 0.04), transparent 60%);
6039
+ pointer-events: none;
6040
+ }
6041
+
6042
+ .dimension-card:hover {
6043
+ border-color: rgba(167, 139, 250, 0.15);
6044
+ background: rgba(255, 255, 255, 0.025);
6045
+ transform: translateX(2px);
6046
+ }
6047
+
6048
+ .dim-badge {
6049
+ grid-row: 1 / 3;
6050
+ display: flex;
6051
+ flex-direction: column;
6052
+ align-items: center;
6053
+ justify-content: center;
6054
+ width: 48px;
6055
+ gap: 2px;
6056
+ }
6057
+
6058
+ .dim-num {
6059
+ font-family: var(--font-display);
6060
+ font-size: 1.3rem;
6061
+ font-weight: 800;
6062
+ background: linear-gradient(135deg, #a78bfa, #60a5fa);
6063
+ -webkit-background-clip: text;
6064
+ -webkit-text-fill-color: transparent;
6065
+ background-clip: text;
6066
+ line-height: 1.1;
6067
+ }
6068
+
6069
+ .dim-axis {
6070
+ font-size: 0.6rem;
6071
+ text-transform: uppercase;
6072
+ letter-spacing: 0.08em;
6073
+ color: var(--text-muted);
6074
+ font-weight: 600;
6075
+ }
6076
+
6077
+ .dim-visual {
6078
+ display: none;
6079
+ /* Hidden on small screens, shown in wide layout */
6080
+ }
6081
+
6082
+ .dim-svg {
6083
+ width: 100%;
6084
+ height: auto;
6085
+ }
6086
+
6087
+ .dimension-card h3 {
6088
+ font-size: 0.85rem;
6089
+ font-weight: 600;
6090
+ color: var(--text-primary);
6091
+ margin: 0;
6092
+ line-height: 1.3;
6093
+ }
6094
+
6095
+ .dimension-card p {
6096
+ font-size: 0.75rem;
6097
+ color: var(--text-secondary);
6098
+ margin: 0;
6099
+ line-height: 1.5;
6100
+ grid-column: 2;
6101
+ }
6102
+
6103
+ .dimension-card em {
6104
+ color: #a78bfa;
6105
+ font-style: normal;
6106
+ font-weight: 600;
6107
+ }
6108
+
6109
+ /* Specific dimension colors */
6110
+ .dim-1d:hover {
6111
+ border-color: rgba(167, 139, 250, 0.2);
6112
+ }
6113
+
6114
+ .dim-1d .dim-num {
6115
+ background: linear-gradient(135deg, #a78bfa, #c084fc);
6116
+ -webkit-background-clip: text;
6117
+ background-clip: text;
6118
+ }
6119
+
6120
+ .dim-2d:hover {
6121
+ border-color: rgba(96, 165, 250, 0.2);
6122
+ }
6123
+
6124
+ .dim-2d .dim-num {
6125
+ background: linear-gradient(135deg, #60a5fa, #818cf8);
6126
+ -webkit-background-clip: text;
6127
+ background-clip: text;
6128
+ }
6129
+
6130
+ .dim-3d:hover {
6131
+ border-color: rgba(52, 211, 153, 0.2);
6132
+ }
6133
+
6134
+ .dim-3d .dim-num {
6135
+ background: linear-gradient(135deg, #34d399, #60a5fa);
6136
+ -webkit-background-clip: text;
6137
+ background-clip: text;
6138
+ }
6139
+
6140
+ .dim-conn:hover {
6141
+ border-color: rgba(167, 139, 250, 0.25);
6142
+ }
6143
+
6144
+ .dim-conn .dim-num {
6145
+ background: linear-gradient(135deg, #f472b6, #a78bfa);
6146
+ -webkit-background-clip: text;
6147
+ background-clip: text;
6148
+ font-size: 1.5rem;
6149
+ }
6150
+
6151
+ .dim-4d:hover {
6152
+ border-color: rgba(124, 58, 237, 0.25);
6153
+ }
6154
+
6155
+ .dim-4d .dim-num {
6156
+ background: linear-gradient(135deg, #7c3aed, #a78bfa);
6157
+ -webkit-background-clip: text;
6158
+ background-clip: text;
6159
+ }
6160
+
6161
+ /* Connection pulse animation */
6162
+ @keyframes connPulse {
6163
+
6164
+ 0%,
6165
+ 100% {
6166
+ r: 6;
6167
+ opacity: 0.15;
6168
+ }
6169
+
6170
+ 50% {
6171
+ r: 10;
6172
+ opacity: 0.05;
6173
+ }
6174
+ }
6175
+
6176
+ .conn-pulse {
6177
+ animation: connPulse 2s ease-in-out infinite;
6178
+ }
6179
+
6180
+ /* ─── Pitch Section (AI code review) ─── */
6181
+ .landing-pitch {
6182
+ text-align: center;
6183
+ margin-bottom: 40px;
6184
+ padding: 32px 24px;
6185
+ background: linear-gradient(135deg, rgba(124, 58, 237, 0.05), rgba(96, 165, 250, 0.03));
6186
+ border: 1px solid rgba(167, 139, 250, 0.08);
6187
+ border-radius: 16px;
6188
+ position: relative;
6189
+ overflow: hidden;
6190
+ animation: landingSlideUp 0.5s 0.35s cubic-bezier(0.16, 1, 0.3, 1) both;
6191
+ }
6192
+
6193
+ .landing-pitch::before {
6194
+ content: '';
6195
+ position: absolute;
6196
+ top: -50%;
6197
+ left: -50%;
6198
+ width: 200%;
6199
+ height: 200%;
6200
+ background: radial-gradient(circle at center, rgba(167, 139, 250, 0.03), transparent 50%);
6201
+ pointer-events: none;
6202
+ }
6203
+
6204
+ .pitch-badge {
6205
+ display: inline-block;
6206
+ font-size: 0.65rem;
6207
+ text-transform: uppercase;
6208
+ letter-spacing: 0.1em;
6209
+ color: #a78bfa;
6210
+ background: rgba(167, 139, 250, 0.1);
6211
+ border: 1px solid rgba(167, 139, 250, 0.15);
6212
+ border-radius: 20px;
6213
+ padding: 4px 14px;
6214
+ margin-bottom: 16px;
6215
+ font-weight: 600;
6216
+ }
6217
+
6218
+ .pitch-title {
6219
+ font-family: var(--font-display);
6220
+ font-size: 1.4rem;
6221
+ font-weight: 700;
6222
+ color: var(--text-primary);
6223
+ line-height: 1.3;
6224
+ margin: 0 0 12px;
6225
+ }
6226
+
6227
+ .pitch-accent {
6228
+ background: linear-gradient(135deg, #a78bfa, #60a5fa, #34d399);
6229
+ -webkit-background-clip: text;
6230
+ -webkit-text-fill-color: transparent;
6231
+ background-clip: text;
6232
+ }
6233
+
6234
+ .pitch-body {
6235
+ font-size: 0.82rem;
6236
+ color: var(--text-secondary);
6237
+ line-height: 1.65;
6238
+ max-width: 560px;
6239
+ margin: 0 auto;
6240
+ }
6241
+
6242
+ /* ─── Wide layout: show visuals inline ─── */
6243
+ @media (min-width: 900px) {
6244
+ .dimension-card {
6245
+ grid-template-columns: auto 200px 1fr;
6246
+ gap: 4px 20px;
6247
+ }
6248
+
6249
+ .dim-visual {
6250
+ display: flex;
6251
+ align-items: center;
6252
+ justify-content: center;
6253
+ grid-row: 1 / 3;
6254
+ }
6255
+
6256
+ .dimension-card h3 {
6257
+ grid-column: 3;
6258
+ }
6259
+
6260
+ .dimension-card p {
6261
+ grid-column: 3;
6262
+ }
6263
+ }
6264
+
5886
6265
  /* Stats row */
5887
6266
  .landing-stats {
5888
6267
  display: flex;
@@ -6160,10 +6539,10 @@ body {
6160
6539
  align-items: center;
6161
6540
  gap: 6px;
6162
6541
  width: 100%;
6163
- padding: 8px 10px;
6542
+ padding: 9px 12px;
6164
6543
  margin-top: 8px;
6165
- background: var(--bg-tertiary);
6166
- border: 1px solid var(--border-subtle);
6544
+ background: rgba(22, 22, 34, 0.6);
6545
+ border: 1px solid var(--border-glass);
6167
6546
  border-radius: var(--radius-sm);
6168
6547
  color: var(--text-secondary);
6169
6548
  font-family: var(--font-sans);
@@ -6171,12 +6550,14 @@ body {
6171
6550
  font-weight: 500;
6172
6551
  cursor: pointer;
6173
6552
  transition: all var(--transition-fast);
6553
+ box-shadow: var(--shadow-inset);
6174
6554
  }
6175
6555
 
6176
6556
  .github-import-btn:hover {
6177
- background: var(--bg-elevated);
6178
- border-color: var(--border-default);
6557
+ background: rgba(124, 58, 237, 0.08);
6558
+ border-color: rgba(124, 58, 237, 0.2);
6179
6559
  color: var(--text-primary);
6560
+ box-shadow: var(--shadow-inset), 0 0 12px rgba(124, 58, 237, 0.08);
6180
6561
  }
6181
6562
 
6182
6563
  .github-import-btn:active {
@@ -6521,6 +6902,7 @@ body {
6521
6902
  margin: 0 0 8px 0;
6522
6903
  display: -webkit-box;
6523
6904
  -webkit-line-clamp: 2;
6905
+ line-clamp: 2;
6524
6906
  -webkit-box-orient: vertical;
6525
6907
  overflow: hidden;
6526
6908
  }