@ibgib/space-gib 0.0.34 → 0.0.36

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 (54) hide show
  1. package/dist/client/bootstrap.mjs +1 -1
  2. package/dist/client/{chunk-25PXC4HP.mjs → chunk-5DTAUY3E.mjs} +1586 -464
  3. package/dist/client/chunk-J7X3XTAI.mjs +53 -0
  4. package/dist/client/css/activity-bar.css +21 -3
  5. package/dist/client/css/layout.css +126 -5
  6. package/dist/client/css/tutorial.css +327 -0
  7. package/dist/client/index.html +6 -0
  8. package/dist/client/index.mjs +22 -45
  9. package/dist/client/privacy.html +22 -22
  10. package/dist/client/script.mjs +1 -1
  11. package/dist/client/style.css +1 -0
  12. package/dist/server/server.mjs +3 -3
  13. package/package.json +6 -6
  14. package/src/client/AUTO-GENERATED-version.mts +1 -1
  15. package/src/client/cosmos/seed-cosmos-workspace.mts +20 -6
  16. package/src/client/css/activity-bar.css +21 -3
  17. package/src/client/css/layout.css +126 -5
  18. package/src/client/css/tutorial.css +327 -0
  19. package/src/client/dev-tools/vcs-workspace.mts +4 -4
  20. package/src/client/index.html +6 -0
  21. package/src/client/privacy.html +22 -22
  22. package/src/client/style.css +1 -0
  23. package/src/client/ui/component/changes/changes.css +413 -0
  24. package/src/client/ui/component/changes/changes.html +37 -0
  25. package/src/client/ui/component/changes/changes.mts +766 -0
  26. package/src/client/ui/component/changes/index.mts +9 -0
  27. package/src/client/ui/component/chat-view/chat-view.html +6 -58
  28. package/src/client/ui/component/chat-view/chat-view.mts +13 -26
  29. package/src/client/ui/component/clone/clone.mts +67 -39
  30. package/src/client/ui/component/code-editor/code-editor.css +91 -9
  31. package/src/client/ui/component/code-editor/code-editor.html +58 -45
  32. package/src/client/ui/component/code-editor/code-editor.mts +265 -49
  33. package/src/client/ui/component/cosmos-navigator/cosmos-navigator.css +1 -1
  34. package/src/client/ui/component/cosmos-navigator/cosmos-navigator.html +5 -10
  35. package/src/client/ui/component/cosmos-navigator/cosmos-navigator.mts +328 -64
  36. package/src/client/ui/component/file-explorer/file-explorer.css +475 -11
  37. package/src/client/ui/component/file-explorer/file-explorer.html +45 -65
  38. package/src/client/ui/component/file-explorer/file-explorer.mts +1164 -98
  39. package/src/client/ui/component/nested-chat/chat/chat.mts +5 -90
  40. package/src/client/ui/component/nested-chat/nested-chat.mts +10 -8
  41. package/src/client/ui/component/timeline/timeline.css +16 -1
  42. package/src/client/ui/component/timeline/timeline.mts +37 -93
  43. package/src/client/ui/component/tutorial/index.mts +9 -0
  44. package/src/client/ui/component/tutorial/scripts/pitch-tour-script.mts +265 -0
  45. package/src/client/ui/component/tutorial/tutorial-controller.mts +622 -0
  46. package/src/client/ui/component/tutorial/tutorial-types.mts +45 -0
  47. package/src/client/ui/component/tutorial/tutorial.css +260 -0
  48. package/src/client/ui/router/space-gib-router-helpers.mts +33 -233
  49. package/src/client/ui/router/space-gib-router-helpers.respec.mts +298 -122
  50. package/src/client/ui/router/space-gib-router-service.mts +28 -151
  51. package/src/client/ui/router/space-gib-router-types.mts +32 -76
  52. package/src/client/ui/shell/cosmic-big-bang.mts +12 -3
  53. package/src/client/ui/shell/space-gib-shell-service.mts +715 -143
  54. package/dist/client/chunk-RXWLL2AI.mjs +0 -30
@@ -2,16 +2,51 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  width: 100%;
5
+ height: 100%;
6
+ min-height: 0;
5
7
  box-sizing: border-box;
6
8
  }
7
9
 
10
+ :host([collapsed]) {
11
+ height: auto !important;
12
+ flex: 0 0 auto !important;
13
+ }
14
+
15
+ :host([collapsed]) .file-explorer-root {
16
+ height: auto !important;
17
+ flex: 0 0 auto !important;
18
+ }
19
+
20
+ :host([collapsed]) .single-branch-view,
21
+ :host([collapsed]) .composite-tree-container {
22
+ height: auto !important;
23
+ flex: 0 0 auto !important;
24
+ min-height: 0 !important;
25
+ padding-bottom: 0 !important;
26
+ overflow: visible !important;
27
+ }
28
+
8
29
  .file-explorer-root {
9
30
  display: flex;
10
31
  flex-direction: column;
11
32
  width: 100%;
33
+ height: 100%;
34
+ min-height: 0;
35
+ overflow: hidden;
12
36
  user-select: none;
13
37
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
14
38
  box-sizing: border-box;
39
+ position: relative;
40
+ }
41
+
42
+ /* Single Branch View Container */
43
+ .single-branch-view {
44
+ display: flex;
45
+ flex-direction: column;
46
+ width: 100%;
47
+ flex: 1 1 0px;
48
+ min-height: 32px;
49
+ overflow: hidden;
15
50
  }
16
51
 
17
52
  /* Branch Worktree Accordion Header */
@@ -19,9 +54,10 @@
19
54
  display: flex;
20
55
  align-items: center;
21
56
  gap: 0.35rem;
22
- padding: 0.4rem 0.6rem;
57
+ padding: 0.28rem 0.5rem;
23
58
  background: rgba(255, 255, 255, 0.04);
24
59
  border: 1px solid rgba(255, 255, 255, 0.08);
60
+ border-left: 3px solid var(--branch-accent-color, rgba(255, 255, 255, 0.08));
25
61
  border-radius: 6px;
26
62
  font-size: 0.82rem;
27
63
  font-weight: 600;
@@ -30,16 +66,18 @@
30
66
  transition: all 0.15s ease;
31
67
  outline: none;
32
68
  box-sizing: border-box;
69
+ flex: 0 0 auto !important;
70
+ flex-shrink: 0 !important;
33
71
  }
34
72
 
35
73
  .branch-header:hover {
36
- background: rgba(255, 255, 255, 0.07);
37
- border-color: rgba(124, 92, 252, 0.3);
74
+ background: var(--branch-accent-translucent, rgba(255, 255, 255, 0.07));
75
+ border-color: var(--branch-accent-color, rgba(124, 92, 252, 0.3));
38
76
  color: #f1f5f9;
39
77
  }
40
78
 
41
79
  .branch-header:focus-visible {
42
- border-color: #a78bfa;
80
+ border-color: var(--branch-accent-color, #a78bfa);
43
81
  }
44
82
 
45
83
  .branch-toggle-btn {
@@ -67,22 +105,113 @@
67
105
  transform: rotate(-90deg);
68
106
  }
69
107
 
108
+ .branch-selector-container {
109
+ position: relative;
110
+ display: flex;
111
+ align-items: center;
112
+ flex: 1;
113
+ min-width: 0;
114
+ }
115
+
116
+ .branch-select-btn {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 0.35rem;
120
+ background: transparent;
121
+ border: 1px solid transparent;
122
+ border-radius: 4px;
123
+ padding: 2px 6px;
124
+ cursor: pointer;
125
+ color: inherit;
126
+ font-family: inherit;
127
+ min-width: 0;
128
+ max-width: 100%;
129
+ transition: all 0.15s ease;
130
+ }
131
+
132
+ .branch-select-btn:hover {
133
+ background: rgba(255, 255, 255, 0.08);
134
+ border-color: rgba(255, 255, 255, 0.15);
135
+ }
136
+
70
137
  .branch-icon {
71
138
  font-size: 0.9rem;
72
139
  line-height: 1;
140
+ color: var(--branch-accent-color, #a78bfa);
73
141
  }
74
142
 
75
143
  .branch-title {
76
- flex: 1;
77
144
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
78
145
  font-size: 0.82rem;
79
- color: #a78bfa;
146
+ color: var(--branch-accent-color, #a78bfa);
80
147
  font-weight: 600;
81
148
  overflow: hidden;
82
149
  text-overflow: ellipsis;
83
150
  white-space: nowrap;
84
151
  }
85
152
 
153
+ .branch-caret {
154
+ font-size: 0.65rem;
155
+ opacity: 0.7;
156
+ transition: transform 0.15s ease;
157
+ }
158
+
159
+ .branch-dropdown-menu {
160
+ position: absolute;
161
+ top: calc(100% + 4px);
162
+ left: 0;
163
+ min-width: 180px;
164
+ max-width: 260px;
165
+ max-height: 220px;
166
+ overflow-y: auto;
167
+ background: #11111b;
168
+ border: 1px solid rgba(255, 255, 255, 0.14);
169
+ border-radius: 6px;
170
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.55);
171
+ padding: 4px;
172
+ z-index: 1000;
173
+ display: flex;
174
+ flex-direction: column;
175
+ gap: 2px;
176
+ }
177
+
178
+ .branch-dropdown-item {
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 0.45rem;
182
+ padding: 0.35rem 0.5rem;
183
+ border-radius: 4px;
184
+ font-size: 0.78rem;
185
+ font-family: ui-monospace, SFMono-Regular, monospace;
186
+ color: #cbd5e1;
187
+ cursor: pointer;
188
+ transition: all 0.12s ease;
189
+ }
190
+
191
+ .branch-dropdown-item:hover {
192
+ background: rgba(255, 255, 255, 0.08);
193
+ color: #ffffff;
194
+ }
195
+
196
+ .branch-dropdown-item.active {
197
+ background: var(--branch-accent-translucent, rgba(167, 139, 250, 0.15));
198
+ color: var(--branch-accent-color, #a78bfa);
199
+ font-weight: 600;
200
+ }
201
+
202
+ .branch-color-dot {
203
+ width: 8px;
204
+ height: 8px;
205
+ border-radius: 50%;
206
+ flex-shrink: 0;
207
+ }
208
+
209
+ .branch-dropdown-check {
210
+ margin-left: auto;
211
+ font-size: 0.75rem;
212
+ opacity: 0.9;
213
+ }
214
+
86
215
  .worktree-badge {
87
216
  font-size: 0.58rem;
88
217
  text-transform: uppercase;
@@ -99,13 +228,33 @@
99
228
  display: flex;
100
229
  align-items: center;
101
230
  gap: 2px;
102
- opacity: 0;
103
- transition: opacity 0.15s ease;
104
- margin-left: 0.25rem;
231
+ margin-left: auto;
232
+ }
233
+
234
+ .branch-menu-btn {
235
+ font-size: 1.15rem;
236
+ font-weight: 700;
237
+ padding: 2px 7px;
238
+ min-width: 24px;
239
+ min-height: 22px;
240
+ display: inline-flex;
241
+ align-items: center;
242
+ justify-content: center;
243
+ line-height: 1;
244
+ color: #94a3b8;
245
+ border-radius: 4px;
246
+ cursor: pointer;
247
+ opacity: 0.8;
248
+ transition: all 0.12s ease;
105
249
  }
106
250
 
107
- .branch-header:hover .branch-actions {
251
+ .branch-header:hover .branch-menu-btn,
252
+ .composite-branch-header:hover .branch-menu-btn,
253
+ .branch-menu-btn:hover,
254
+ .branch-menu-btn.active {
108
255
  opacity: 1;
256
+ color: #ffffff;
257
+ background: rgba(255, 255, 255, 0.12);
109
258
  }
110
259
 
111
260
  .action-btn {
@@ -131,7 +280,11 @@
131
280
  flex-direction: column;
132
281
  gap: 2px;
133
282
  padding: 0.35rem 0.2rem;
134
- transition: max-height 0.2s ease, opacity 0.2s ease;
283
+ flex: 1 1 0px;
284
+ min-height: 0;
285
+ overflow-y: auto;
286
+ overflow-x: hidden;
287
+ transition: opacity 0.2s ease;
135
288
  }
136
289
 
137
290
  .file-tree-container.collapsed {
@@ -208,6 +361,58 @@
208
361
  white-space: nowrap;
209
362
  }
210
363
 
364
+ /* ── VCS Status Styling (driven by web-gib shared CSS variables) ── */
365
+ .tree-label.vcs-untracked, .tree-item.vcs-untracked .tree-label {
366
+ color: var(--vcs-clr-untracked, #73c991) !important;
367
+ }
368
+
369
+ .tree-label.vcs-modified, .tree-item.vcs-modified .tree-label {
370
+ color: var(--vcs-clr-modified, #e2c08d) !important;
371
+ }
372
+
373
+ .tree-label.vcs-added, .tree-item.vcs-added .tree-label {
374
+ color: var(--vcs-clr-added, #78f87e) !important;
375
+ }
376
+
377
+ .tree-label.vcs-deleted, .tree-item.vcs-deleted .tree-label {
378
+ color: var(--vcs-clr-deleted, #ff5b5b) !important;
379
+ text-decoration: line-through;
380
+ }
381
+
382
+ .vcs-status-badge {
383
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
384
+ font-size: var(--vcs-badge-font-size, 0.65rem);
385
+ font-weight: var(--vcs-badge-font-weight, 700);
386
+ padding: 1px 4px;
387
+ border-radius: var(--vcs-badge-radius, 3px);
388
+ line-height: 1;
389
+ display: inline-flex;
390
+ align-items: center;
391
+ justify-content: center;
392
+ margin-left: auto;
393
+ margin-right: 2px;
394
+ flex-shrink: 0;
395
+ text-transform: uppercase;
396
+ }
397
+
398
+ .vcs-status-badge.untracked, .vcs-status-badge.u {
399
+ color: var(--vcs-clr-untracked, #73c991);
400
+ background: var(--vcs-clr-untracked-bg, rgba(115, 201, 145, 0.12));
401
+ border: 1px solid var(--vcs-clr-untracked-border, rgba(115, 201, 145, 0.3));
402
+ }
403
+
404
+ .vcs-status-badge.modified, .vcs-status-badge.m {
405
+ color: var(--vcs-clr-modified, #e2c08d);
406
+ background: var(--vcs-clr-modified-bg, rgba(226, 192, 141, 0.12));
407
+ border: 1px solid var(--vcs-clr-modified-border, rgba(226, 192, 141, 0.3));
408
+ }
409
+
410
+ .vcs-status-badge.added, .vcs-status-badge.a {
411
+ color: var(--vcs-clr-added, #78f87e);
412
+ background: var(--vcs-clr-added-bg, rgba(120, 248, 126, 0.12));
413
+ border: 1px solid var(--vcs-clr-added-border, rgba(120, 248, 126, 0.3));
414
+ }
415
+
211
416
  .file-comment-badge {
212
417
  margin-left: auto;
213
418
  font-size: 0.75rem;
@@ -253,4 +458,263 @@
253
458
  color: #a7f3d0;
254
459
  }
255
460
 
461
+ .empty-tree-msg {
462
+ padding: 1.5rem 1rem;
463
+ text-align: center;
464
+ color: #94a3b8;
465
+ font-size: 0.8rem;
466
+ line-height: 1.5;
467
+ border: 1px dashed rgba(255, 255, 255, 0.1);
468
+ border-radius: 6px;
469
+ margin: 0.5rem 0.25rem;
470
+ }
471
+
472
+ .empty-tree-msg .highlight {
473
+ color: #38bdf8;
474
+ font-weight: 600;
475
+ }
476
+
477
+ /* ── View Mode Toolbar ── */
478
+ .explorer-mode-toolbar {
479
+ display: flex;
480
+ align-items: center;
481
+ justify-content: space-between;
482
+ padding: 0.35rem 0.5rem;
483
+ margin-bottom: 0.4rem;
484
+ background: rgba(255, 255, 255, 0.02);
485
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
486
+ flex: 0 0 auto !important;
487
+ flex-shrink: 0 !important;
488
+ }
489
+
490
+ .mode-toggle-group {
491
+ display: flex;
492
+ align-items: center;
493
+ background: rgba(0, 0, 0, 0.3);
494
+ border: 1px solid rgba(255, 255, 255, 0.08);
495
+ border-radius: 5px;
496
+ padding: 2px;
497
+ gap: 2px;
498
+ }
499
+
500
+ .mode-toggle-btn {
501
+ display: inline-flex;
502
+ align-items: center;
503
+ gap: 0.3rem;
504
+ background: transparent;
505
+ border: none;
506
+ border-radius: 3px;
507
+ color: #94a3b8;
508
+ font-size: 0.72rem;
509
+ font-weight: 500;
510
+ padding: 2px 7px;
511
+ cursor: pointer;
512
+ transition: all 0.15s ease;
513
+ user-select: none;
514
+ }
515
+
516
+ .mode-toggle-btn:hover {
517
+ color: #f1f5f9;
518
+ background: rgba(255, 255, 255, 0.06);
519
+ }
520
+
521
+ .mode-toggle-btn.active {
522
+ background: var(--branch-accent-translucent, rgba(124, 92, 252, 0.25));
523
+ color: #ffffff;
524
+ font-weight: 600;
525
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);
526
+ }
527
+
528
+ .explorer-global-actions {
529
+ display: flex;
530
+ align-items: center;
531
+ gap: 4px;
532
+ }
533
+
534
+ /* ── Branch Dirty Badges ── */
535
+ .branch-dirty-badge {
536
+ display: inline-flex;
537
+ align-items: center;
538
+ justify-content: center;
539
+ font-size: 0.65rem;
540
+ font-family: ui-monospace, SFMono-Regular, monospace;
541
+ font-weight: 700;
542
+ padding: 1px 5px;
543
+ border-radius: 10px;
544
+ background: var(--branch-accent-translucent, rgba(234, 179, 8, 0.18));
545
+ color: var(--branch-accent-color, #fbbf24);
546
+ border: 1px solid var(--branch-accent-color, rgba(234, 179, 8, 0.4));
547
+ margin-left: auto;
548
+ margin-right: 0.25rem;
549
+ line-height: 1.2;
550
+ }
551
+
552
+ /* ── Composite Branch Tree Styles ── */
553
+ .composite-tree-container {
554
+ display: flex;
555
+ flex-direction: column;
556
+ width: 100%;
557
+ gap: 4px;
558
+ padding-bottom: 0.25rem;
559
+ flex: 1 1 0px;
560
+ min-height: 0;
561
+ overflow-y: auto;
562
+ }
563
+
564
+ .composite-branch-node {
565
+ display: flex;
566
+ flex-direction: column;
567
+ width: 100%;
568
+ position: relative;
569
+ box-sizing: border-box;
570
+ }
571
+
572
+ .composite-branch-header {
573
+ display: flex;
574
+ align-items: center;
575
+ gap: 0.35rem;
576
+ padding: 0.28rem 0.5rem;
577
+ border-radius: 6px;
578
+ background: rgba(255, 255, 255, 0.04);
579
+ border: 1px solid rgba(255, 255, 255, 0.08);
580
+ border-left: 3px solid var(--node-accent-color, #818cf8);
581
+ font-size: 0.82rem;
582
+ font-weight: 600;
583
+ color: #cbd5e1;
584
+ cursor: pointer;
585
+ transition: all 0.15s ease;
586
+ user-select: none;
587
+ box-sizing: border-box;
588
+ flex: 0 0 auto !important;
589
+ flex-shrink: 0 !important;
590
+ }
591
+
592
+ .composite-branch-header:hover {
593
+ background: var(--node-accent-translucent, rgba(255, 255, 255, 0.07));
594
+ border-color: var(--node-accent-color, rgba(124, 92, 252, 0.3));
595
+ color: #f1f5f9;
596
+ }
597
+
598
+ .composite-branch-header.active {
599
+ background: var(--node-accent-translucent, rgba(129, 140, 248, 0.15));
600
+ border-color: var(--node-accent-color, rgba(129, 140, 248, 0.4));
601
+ }
602
+
603
+ .composite-branch-header.collapsed .chevron-icon {
604
+ transform: rotate(-90deg);
605
+ }
606
+
607
+ .composite-branch-icon,
608
+ .composite-branch-header .branch-icon {
609
+ font-size: 0.85rem;
610
+ color: var(--node-accent-color, var(--branch-accent-color, #818cf8));
611
+ }
612
+
613
+ .composite-branch-title,
614
+ .composite-branch-header .branch-title {
615
+ color: var(--node-accent-color, var(--branch-accent-color, #e2e8f0));
616
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
617
+ font-size: 0.82rem;
618
+ font-weight: 600;
619
+ overflow: hidden;
620
+ text-overflow: ellipsis;
621
+ white-space: nowrap;
622
+ }
623
+
624
+ .composite-scoped-badge {
625
+ font-size: 0.6rem;
626
+ font-weight: 500;
627
+ background: rgba(99, 102, 241, 0.2);
628
+ color: #a5b4fc;
629
+ border: 1px solid rgba(99, 102, 241, 0.4);
630
+ border-radius: 3px;
631
+ padding: 1px 4px;
632
+ }
633
+
634
+ .composite-branch-body {
635
+ display: flex;
636
+ flex-direction: column;
637
+ width: 100%;
638
+ }
639
+
640
+ .composite-branch-files {
641
+ display: flex;
642
+ flex-direction: column;
643
+ margin-left: 1rem;
644
+ padding-left: 0.35rem;
645
+ border-left: 1px dashed rgba(255, 255, 255, 0.12);
646
+ }
647
+
648
+ .composite-branch-children {
649
+ display: flex;
650
+ flex-direction: column;
651
+ margin-left: 0.85rem;
652
+ gap: 3px;
653
+ margin-top: 3px;
654
+ }
655
+
656
+ /* ── DRY Command Menu Popup ── */
657
+ .command-menu-popup {
658
+ position: absolute;
659
+ min-width: 175px;
660
+ max-width: 250px;
661
+ background: #11111b;
662
+ border: 1px solid rgba(255, 255, 255, 0.14);
663
+ border-radius: 6px;
664
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.65);
665
+ padding: 4px;
666
+ z-index: 1200;
667
+ display: flex;
668
+ flex-direction: column;
669
+ gap: 2px;
670
+ animation: menuFadeIn 0.1s ease-out;
671
+ }
672
+
673
+ @keyframes menuFadeIn {
674
+ from { opacity: 0; transform: translateY(-3px); }
675
+ to { opacity: 1; transform: translateY(0); }
676
+ }
677
+
678
+ .command-menu-item {
679
+ display: flex;
680
+ align-items: center;
681
+ gap: 0.5rem;
682
+ padding: 0.38rem 0.55rem;
683
+ border-radius: 4px;
684
+ font-size: 0.78rem;
685
+ font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace;
686
+ color: #cbd5e1;
687
+ cursor: pointer;
688
+ transition: all 0.12s ease;
689
+ user-select: none;
690
+ }
691
+
692
+ .command-menu-item:hover {
693
+ background: rgba(255, 255, 255, 0.09);
694
+ color: #ffffff;
695
+ }
696
+
697
+ .command-menu-item.danger:hover {
698
+ background: rgba(239, 68, 68, 0.15);
699
+ color: #ef4444;
700
+ }
701
+
702
+ .command-menu-item .cmd-icon {
703
+ font-size: 0.85rem;
704
+ line-height: 1;
705
+ width: 18px;
706
+ display: flex;
707
+ align-items: center;
708
+ justify-content: center;
709
+ flex-shrink: 0;
710
+ }
711
+
712
+ .command-menu-item .cmd-label {
713
+ flex: 1;
714
+ overflow: hidden;
715
+ text-overflow: ellipsis;
716
+ white-space: nowrap;
717
+ }
718
+
719
+
256
720
 
@@ -1,75 +1,55 @@
1
1
  <div id="file-explorer-root" class="file-explorer-root">
2
- <!-- Worktree Branch Header Accordion -->
3
- <div id="branch-header" class="branch-header expanded" tabindex="0">
4
- <button id="btn-branch-toggle" class="branch-toggle-btn" type="button" aria-label="Toggle Branch Files">
5
- <span class="chevron-icon">▼</span>
6
- </button>
7
- <span class="branch-icon">🌿</span>
8
- <span id="branch-title" class="branch-title">main</span>
9
- <!-- <span class="worktree-badge">worktree</span> -->
10
- <div class="branch-actions">
11
- <button id="btn-branch-branch" class="action-btn" type="button" title="Branch from worktree (🌿+)">🌿+</button>
12
- <button id="btn-clone-branch" class="action-btn" type="button" title="Clone / Export Worktree (⤓)">⤓</button>
13
- <button id="btn-new-file" class="action-btn" type="button" title="New File">📄+</button>
14
- <button id="btn-new-folder" class="action-btn" type="button" title="New Folder">📁+</button>
15
- <button id="btn-collapse-all" class="action-btn" type="button" title="Collapse All">⇱</button>
2
+ <!-- View Mode Toolbar: Single Branch vs Composite Tree -->
3
+ <div class="explorer-mode-toolbar" id="explorer-mode-toolbar">
4
+ <div class="mode-toggle-group">
5
+ <button id="btn-mode-single" class="mode-toggle-btn active" type="button" title="Single Branch View">
6
+ <span class="mode-icon">🌿</span>
7
+ <span class="mode-label">Single</span>
8
+ </button>
9
+ <button id="btn-mode-composite" class="mode-toggle-btn" type="button" title="Composite Tree View">
10
+ <span class="mode-icon">🌳</span>
11
+ <span class="mode-label">Composite</span>
12
+ </button>
13
+ </div>
14
+ <div class="explorer-global-actions">
15
+ <button id="btn-refresh-explorer" class="action-btn" type="button" title="Refresh Explorer">↻</button>
16
16
  </div>
17
17
  </div>
18
18
 
19
- <!-- Worktree Files Container -->
20
- <div id="file-tree-container" class="file-tree-container">
21
- <!-- Folder: src -->
22
- <div class="tree-item folder expanded" data-folder="src" tabindex="0">
23
- <span class="tree-chevron">▼</span>
24
- <span class="tree-icon">📂</span>
25
- <span class="tree-label">src</span>
26
- <button class="file-action-btn file-branch-btn" title="Branch from directory item (🌿+)"
27
- type="button">🌿+</button>
28
- <button class="file-action-btn file-clone-btn" title="Clone directory item" type="button">⤓</button>
29
- </div>
30
- <!-- File: src/index.ts (Selected by default) -->
31
- <div class="tree-item file selected" data-path="src/index.ts" data-name="index.ts" tabindex="0">
32
- <span class="tree-indent tree-indent-2"></span>
33
- <span class="tree-icon">📄</span>
34
- <span class="tree-label">index.ts</span>
35
- <span class="file-comment-badge" title="Living companion comment attached">💬</span>
36
- <button class="file-action-btn file-branch-btn" title="Branch from file item (🌿+)" type="button">🌿+</button>
37
- <button class="file-action-btn file-clone-btn" title="Clone file item" type="button">⤓</button>
38
- </div>
39
- <!-- File: src/helper.ts -->
40
- <div class="tree-item file" data-path="src/helper.ts" data-name="helper.ts" tabindex="0">
41
- <span class="tree-indent tree-indent-2"></span>
42
- <span class="tree-icon">📄</span>
43
- <span class="tree-label">helper.ts</span>
44
- <button class="file-action-btn file-branch-btn" title="Branch from file item (🌿+)" type="button">🌿+</button>
45
- <button class="file-action-btn file-clone-btn" title="Clone file item" type="button">⤓</button>
19
+ <!-- Single Branch View Container -->
20
+ <div id="single-branch-view" class="single-branch-view">
21
+ <!-- Worktree Branch Header Accordion -->
22
+ <div id="branch-header" class="branch-header expanded" tabindex="0">
23
+ <button id="btn-branch-toggle" class="branch-toggle-btn" type="button" aria-label="Toggle Branch Files">
24
+ <span class="chevron-icon">▼</span>
25
+ </button>
26
+ <div id="branch-selector-container" class="branch-selector-container">
27
+ <button id="btn-branch-select" class="branch-select-btn" type="button" title="Switch Branch">
28
+ <span class="branch-icon">🌿</span>
29
+ <span id="branch-title" class="branch-title">main</span>
30
+ <span class="branch-caret">▾</span>
31
+ </button>
32
+ <div id="branch-dropdown-menu" class="branch-dropdown-menu" style="display: none;">
33
+ <!-- Populated dynamically with branches in galaxy -->
34
+ </div>
35
+ </div>
36
+ <span id="branch-dirty-badge" class="branch-dirty-badge" style="display: none;">● 0</span>
37
+ <div class="branch-actions">
38
+ <button id="btn-branch-menu" class="action-btn branch-menu-btn" type="button" title="Branch actions (⋮)">⋮</button>
39
+ </div>
46
40
  </div>
47
41
 
48
- <!-- Folder: docs -->
49
- <div class="tree-item folder" data-folder="docs" tabindex="0">
50
- <span class="tree-chevron">▼</span>
51
- <span class="tree-icon">📁</span>
52
- <span class="tree-label">docs</span>
53
- <button class="file-action-btn file-branch-btn" title="Branch from directory item (🌿+)"
54
- type="button">🌿+</button>
55
- <button class="file-action-btn file-clone-btn" title="Clone directory item" type="button">⤓</button>
56
- </div>
57
- <!-- File: docs/README.md (Initially hidden under collapsed docs) -->
58
- <div class="tree-item file child-of-docs hidden" data-path="docs/README.md" data-name="README.md" tabindex="0">
59
- <span class="tree-indent tree-indent-2"></span>
60
- <span class="tree-icon">📝</span>
61
- <span class="tree-label">README.md</span>
62
- <button class="file-action-btn file-branch-btn" title="Branch from file item (🌿+)" type="button">🌿+</button>
63
- <button class="file-action-btn file-clone-btn" title="Clone file item" type="button">⤓</button>
42
+ <!-- Worktree Files Container -->
43
+ <div id="file-tree-container" class="file-tree-container">
44
+ <!-- Dynamically rendered tree items -->
64
45
  </div>
46
+ </div>
65
47
 
66
- <!-- Root File: package.json -->
67
- <div class="tree-item file" data-path="package.json" data-name="package.json" tabindex="0">
68
- <span class="tree-indent"></span>
69
- <span class="tree-icon">⚙️</span>
70
- <span class="tree-label">package.json</span>
71
- <button class="file-action-btn file-branch-btn" title="Branch from file item (🌿+)" type="button">🌿+</button>
72
- <button class="file-action-btn file-clone-btn" title="Clone file item" type="button">⤓</button>
73
- </div>
48
+ <!-- Composite Branch Tree Container -->
49
+ <div id="composite-tree-container" class="composite-tree-container" style="display: none;">
50
+ <!-- Dynamically rendered hierarchical branch tree -->
74
51
  </div>
52
+
53
+ <!-- Command Menu Popup (DRY popup menu for branch / item actions) -->
54
+ <div id="command-menu-popup" class="command-menu-popup" style="display: none;"></div>
75
55
  </div>