@ibgib/space-gib 0.0.33 → 0.0.34
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.
- package/dist/client/bootstrap.mjs +24 -51
- package/dist/client/chunk-25PXC4HP.mjs +9914 -0
- package/dist/client/chunk-RXWLL2AI.mjs +30 -0
- package/dist/client/css/activity-bar.css +417 -0
- package/dist/client/css/base.css +167 -0
- package/dist/client/css/components.css +218 -0
- package/dist/client/css/cosmic.css +557 -0
- package/dist/client/css/dev-tools.css +163 -0
- package/dist/client/css/landing.css +184 -0
- package/dist/client/css/layout.css +896 -0
- package/dist/client/css/onboarding.css +181 -0
- package/dist/client/css/repos.css +740 -0
- package/dist/client/css/variables.css +64 -0
- package/dist/client/index.html +202 -31
- package/dist/client/index.mjs +32 -32
- package/dist/client/script.mjs +1 -1
- package/dist/client/style.css +11 -1056
- package/dist/respec-gib.node.mjs +5 -0
- package/dist/server/server.mjs +6879 -3109
- package/package.json +6 -6
- package/src/client/AUTO-GENERATED-version.mts +1 -1
- package/src/client/cosmos/seed-cosmos-workspace.mts +69 -0
- package/src/client/css/activity-bar.css +417 -0
- package/src/client/css/base.css +167 -0
- package/src/client/css/components.css +218 -0
- package/src/client/css/cosmic.css +557 -0
- package/src/client/css/dev-tools.css +163 -0
- package/src/client/css/landing.css +184 -0
- package/src/client/css/layout.css +896 -0
- package/src/client/css/onboarding.css +181 -0
- package/src/client/css/repos.css +740 -0
- package/src/client/css/variables.css +64 -0
- package/src/client/dev-tools/vcs-workspace.mts +3 -3
- package/src/client/index.html +202 -31
- package/src/client/style.css +11 -1056
- package/src/client/ui/component/chat-view/IMPLEMENTATION.md +48 -0
- package/src/client/ui/component/chat-view/chat-view.css +381 -0
- package/src/client/ui/component/chat-view/chat-view.html +104 -0
- package/src/client/ui/component/chat-view/chat-view.mts +277 -0
- package/src/client/ui/component/chat-view/index.mts +9 -0
- package/src/client/ui/component/clone/IMPLEMENTATION.md +68 -0
- package/src/client/ui/component/clone/clone-constants.mts +16 -0
- package/src/client/ui/component/clone/clone-types.mts +60 -0
- package/src/client/ui/component/clone/clone.css +383 -0
- package/src/client/ui/component/clone/clone.html +89 -0
- package/src/client/ui/component/clone/clone.mts +620 -0
- package/src/client/ui/component/clone/index.mts +11 -0
- package/src/client/ui/component/code-editor/IMPLEMENTATION.md +89 -0
- package/src/client/ui/component/code-editor/code-editor.css +275 -0
- package/src/client/ui/component/code-editor/code-editor.html +54 -0
- package/src/client/ui/component/code-editor/code-editor.mts +427 -0
- package/src/client/ui/component/code-editor/index.mts +9 -0
- package/src/client/ui/component/cosmos-navigator/IMPLEMENTATION.md +31 -0
- package/src/client/ui/component/cosmos-navigator/cosmos-navigator.css +864 -0
- package/src/client/ui/component/cosmos-navigator/cosmos-navigator.html +97 -0
- package/src/client/ui/component/cosmos-navigator/cosmos-navigator.mts +1084 -0
- package/src/client/ui/component/cosmos-navigator/index.mts +18 -0
- package/src/client/ui/component/file-explorer/IMPLEMENTATION.md +42 -0
- package/src/client/ui/component/file-explorer/file-explorer.css +256 -0
- package/src/client/ui/component/file-explorer/file-explorer.html +75 -0
- package/src/client/ui/component/file-explorer/file-explorer.mts +346 -0
- package/src/client/ui/component/file-explorer/index.mts +9 -0
- package/src/client/ui/component/nested-chat/IMPLEMENTATION.md +18 -0
- package/src/client/ui/component/nested-chat/chat/IMPLEMENTATION.md +14 -0
- package/src/client/ui/component/nested-chat/chat/chat-constants.mts +14 -0
- package/src/client/ui/component/nested-chat/chat/chat-helpers.mts +66 -0
- package/src/client/ui/component/nested-chat/chat/chat.css +654 -0
- package/src/client/ui/component/nested-chat/chat/chat.html +90 -0
- package/src/client/ui/component/nested-chat/chat/chat.mts +646 -0
- package/src/client/ui/component/nested-chat/chat/index.mts +7 -0
- package/src/client/ui/component/nested-chat/index.mts +14 -0
- package/src/client/ui/component/nested-chat/nested-chat-constants.mts +12 -0
- package/src/client/ui/component/nested-chat/nested-chat-types.mts +53 -0
- package/src/client/ui/component/nested-chat/nested-chat.css +142 -0
- package/src/client/ui/component/nested-chat/nested-chat.html +11 -0
- package/src/client/ui/component/nested-chat/nested-chat.mts +393 -0
- package/src/client/ui/component/notes-explorer/index.mts +9 -0
- package/src/client/ui/component/notes-explorer/notes-explorer.css +313 -0
- package/src/client/ui/component/notes-explorer/notes-explorer.html +136 -0
- package/src/client/ui/component/notes-explorer/notes-explorer.mts +240 -0
- package/src/client/ui/component/notes-inspector/index.mts +9 -0
- package/src/client/ui/component/notes-inspector/notes-inspector.css +244 -0
- package/src/client/ui/component/notes-inspector/notes-inspector.html +97 -0
- package/src/client/ui/component/notes-inspector/notes-inspector.mts +152 -0
- package/src/client/ui/component/pitch/IMPLEMENTATION.md +48 -0
- package/src/client/ui/component/pitch/index.mts +9 -0
- package/src/client/ui/component/pitch/pitch.css +295 -0
- package/src/client/ui/component/pitch/pitch.html +97 -0
- package/src/client/ui/component/pitch/pitch.mts +135 -0
- package/src/client/ui/component/timeline/IMPLEMENTATION.md +33 -0
- package/src/client/ui/component/timeline/index.mts +9 -0
- package/src/client/ui/component/timeline/timeline.css +264 -0
- package/src/client/ui/component/timeline/timeline.html +23 -0
- package/src/client/ui/component/timeline/timeline.mts +317 -0
- package/src/client/ui/component/timeline-item-details/IMPLEMENTATION.md +28 -0
- package/src/client/ui/component/timeline-item-details/index.mts +9 -0
- package/src/client/ui/component/timeline-item-details/timeline-item-details.css +286 -0
- package/src/client/ui/component/timeline-item-details/timeline-item-details.html +64 -0
- package/src/client/ui/component/timeline-item-details/timeline-item-details.mts +194 -0
- package/src/client/ui/router/index.mts +3 -0
- package/src/client/ui/router/space-gib-router-helpers.mts +272 -0
- package/src/client/ui/router/space-gib-router-helpers.respec.mts +353 -0
- package/src/client/ui/router/space-gib-router-service.mts +186 -0
- package/src/client/ui/router/space-gib-router-types.mts +93 -0
- package/src/client/ui/shell/cosmic-big-bang.mts +844 -0
- package/src/client/ui/shell/space-gib-shell-constants.mts +7 -0
- package/src/client/ui/shell/space-gib-shell-service.mts +1728 -31
- package/src/server/server.mts +20 -1
- package/tsconfig.test.json +5 -1
- package/dist/client/chunk-CRJV762I.mjs +0 -3102
- package/dist/client/chunk-LXRCF5OS.mjs +0 -25
- package/dist/client/chunk-UBDQUZZV.mjs +0 -1
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
display: block;
|
|
3
|
+
width: 100%;
|
|
4
|
+
height: 100%;
|
|
5
|
+
color: #e2e8f0;
|
|
6
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
7
|
+
font-size: 13px;
|
|
8
|
+
background: transparent;
|
|
9
|
+
user-select: none;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
.notes-explorer-root {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
height: 100%;
|
|
16
|
+
overflow-y: auto;
|
|
17
|
+
background: transparent;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* Header */
|
|
21
|
+
.notes-header {
|
|
22
|
+
padding: 12px 14px;
|
|
23
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-direction: column;
|
|
26
|
+
gap: 10px;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.notes-title-row {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: 8px;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.notes-icon {
|
|
36
|
+
font-size: 16px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.notes-title {
|
|
40
|
+
font-weight: 600;
|
|
41
|
+
font-size: 13px;
|
|
42
|
+
letter-spacing: 0.3px;
|
|
43
|
+
color: #f1f5f9;
|
|
44
|
+
flex: 1;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.notes-header-actions {
|
|
48
|
+
display: flex;
|
|
49
|
+
align-items: center;
|
|
50
|
+
gap: 6px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.btn-notes-action {
|
|
54
|
+
background: #6366f1;
|
|
55
|
+
color: #ffffff;
|
|
56
|
+
border: none;
|
|
57
|
+
border-radius: 4px;
|
|
58
|
+
padding: 3px 8px;
|
|
59
|
+
font-size: 11px;
|
|
60
|
+
font-weight: 600;
|
|
61
|
+
cursor: pointer;
|
|
62
|
+
transition: background 0.15s ease, transform 0.1s ease;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.btn-notes-action:hover {
|
|
66
|
+
background: #4f46e5;
|
|
67
|
+
transform: translateY(-1px);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.btn-notes-action:active {
|
|
71
|
+
transform: translateY(0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.notes-search-bar {
|
|
75
|
+
width: 100%;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
.notes-filter-input {
|
|
79
|
+
width: 100%;
|
|
80
|
+
box-sizing: border-box;
|
|
81
|
+
background: rgba(0, 0, 0, 0.25);
|
|
82
|
+
border: 1px solid rgba(255, 255, 255, 0.12);
|
|
83
|
+
border-radius: 4px;
|
|
84
|
+
padding: 5px 8px;
|
|
85
|
+
color: #f8fafc;
|
|
86
|
+
font-size: 11.5px;
|
|
87
|
+
outline: none;
|
|
88
|
+
transition: border-color 0.15s ease;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.notes-filter-input:focus {
|
|
92
|
+
border-color: #818cf8;
|
|
93
|
+
background: rgba(0, 0, 0, 0.35);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/* Accordion Sections */
|
|
97
|
+
.notes-sections-container {
|
|
98
|
+
display: flex;
|
|
99
|
+
flex-direction: column;
|
|
100
|
+
padding-bottom: 24px;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.notes-accordion-section {
|
|
104
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.accordion-header {
|
|
108
|
+
display: flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
padding: 8px 12px;
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
background: rgba(255, 255, 255, 0.02);
|
|
113
|
+
transition: background 0.15s ease;
|
|
114
|
+
gap: 6px;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
.accordion-header:hover {
|
|
118
|
+
background: rgba(255, 255, 255, 0.06);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.accordion-arrow {
|
|
122
|
+
font-size: 9px;
|
|
123
|
+
color: #94a3b8;
|
|
124
|
+
width: 12px;
|
|
125
|
+
text-align: center;
|
|
126
|
+
transition: transform 0.15s ease;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.accordion-title {
|
|
130
|
+
font-size: 11px;
|
|
131
|
+
font-weight: 700;
|
|
132
|
+
letter-spacing: 0.5px;
|
|
133
|
+
color: #94a3b8;
|
|
134
|
+
flex: 1;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.btn-section-mini {
|
|
138
|
+
background: transparent;
|
|
139
|
+
color: #94a3b8;
|
|
140
|
+
border: none;
|
|
141
|
+
cursor: pointer;
|
|
142
|
+
font-size: 13px;
|
|
143
|
+
padding: 0 4px;
|
|
144
|
+
line-height: 1;
|
|
145
|
+
border-radius: 3px;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
.btn-section-mini:hover {
|
|
149
|
+
background: rgba(255, 255, 255, 0.1);
|
|
150
|
+
color: #f8fafc;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.accordion-content {
|
|
154
|
+
display: flex;
|
|
155
|
+
flex-direction: column;
|
|
156
|
+
padding: 4px 8px 8px 8px;
|
|
157
|
+
gap: 2px;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.accordion-content.hidden {
|
|
161
|
+
display: none;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* Lens Items */
|
|
165
|
+
.lens-item {
|
|
166
|
+
display: flex;
|
|
167
|
+
align-items: center;
|
|
168
|
+
gap: 8px;
|
|
169
|
+
padding: 6px 10px;
|
|
170
|
+
border-radius: 5px;
|
|
171
|
+
cursor: pointer;
|
|
172
|
+
transition: background 0.15s ease, color 0.15s ease;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
.lens-item:hover {
|
|
176
|
+
background: rgba(255, 255, 255, 0.06);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
.lens-item.active {
|
|
180
|
+
background: rgba(99, 102, 241, 0.18);
|
|
181
|
+
color: #c7d2fe;
|
|
182
|
+
font-weight: 500;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
.lens-icon {
|
|
186
|
+
font-size: 13px;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.lens-label {
|
|
190
|
+
flex: 1;
|
|
191
|
+
font-size: 12px;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.lens-count {
|
|
195
|
+
font-size: 11px;
|
|
196
|
+
color: #94a3b8;
|
|
197
|
+
background: rgba(0, 0, 0, 0.25);
|
|
198
|
+
padding: 1px 6px;
|
|
199
|
+
border-radius: 10px;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/* Tag Pills */
|
|
203
|
+
.tag-pill-item {
|
|
204
|
+
display: flex;
|
|
205
|
+
align-items: center;
|
|
206
|
+
gap: 6px;
|
|
207
|
+
padding: 5px 10px;
|
|
208
|
+
border-radius: 4px;
|
|
209
|
+
cursor: pointer;
|
|
210
|
+
transition: background 0.15s ease;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.tag-pill-item:hover {
|
|
214
|
+
background: rgba(255, 255, 255, 0.06);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
.tag-pill-item.active {
|
|
218
|
+
background: rgba(129, 140, 248, 0.16);
|
|
219
|
+
color: #c7d2fe;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
.tag-hash {
|
|
223
|
+
color: #818cf8;
|
|
224
|
+
font-weight: 700;
|
|
225
|
+
font-size: 12px;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.tag-name {
|
|
229
|
+
flex: 1;
|
|
230
|
+
font-size: 12px;
|
|
231
|
+
color: #cbd5e1;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.tag-badge {
|
|
235
|
+
font-size: 10.5px;
|
|
236
|
+
color: #94a3b8;
|
|
237
|
+
background: rgba(0, 0, 0, 0.25);
|
|
238
|
+
padding: 1px 5px;
|
|
239
|
+
border-radius: 8px;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/* Living Code Anchors */
|
|
243
|
+
.code-anchor-group {
|
|
244
|
+
display: flex;
|
|
245
|
+
flex-direction: column;
|
|
246
|
+
margin-top: 4px;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
.anchor-dir-label {
|
|
250
|
+
font-size: 11px;
|
|
251
|
+
font-family: monospace;
|
|
252
|
+
color: #64748b;
|
|
253
|
+
padding: 4px 6px;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.code-anchor-item {
|
|
257
|
+
display: flex;
|
|
258
|
+
align-items: center;
|
|
259
|
+
gap: 6px;
|
|
260
|
+
padding: 5px 8px 5px 18px;
|
|
261
|
+
border-radius: 4px;
|
|
262
|
+
cursor: pointer;
|
|
263
|
+
transition: background 0.15s ease;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
.code-anchor-item:hover {
|
|
267
|
+
background: rgba(255, 255, 255, 0.06);
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.code-anchor-item.active {
|
|
271
|
+
background: rgba(99, 102, 241, 0.16);
|
|
272
|
+
color: #c7d2fe;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.anchor-file-icon {
|
|
276
|
+
font-size: 12px;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.anchor-file-name {
|
|
280
|
+
flex: 1;
|
|
281
|
+
font-size: 11.5px;
|
|
282
|
+
font-family: monospace;
|
|
283
|
+
overflow: hidden;
|
|
284
|
+
text-overflow: ellipsis;
|
|
285
|
+
white-space: nowrap;
|
|
286
|
+
color: #cbd5e1;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.anchor-notes-count {
|
|
290
|
+
font-size: 10px;
|
|
291
|
+
color: #94a3b8;
|
|
292
|
+
background: rgba(0, 0, 0, 0.25);
|
|
293
|
+
padding: 1px 5px;
|
|
294
|
+
border-radius: 8px;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/* Settings */
|
|
298
|
+
.settings-row {
|
|
299
|
+
display: flex;
|
|
300
|
+
justify-content: space-between;
|
|
301
|
+
padding: 5px 8px;
|
|
302
|
+
font-size: 11px;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.settings-label {
|
|
306
|
+
color: #64748b;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
.settings-value {
|
|
310
|
+
color: #cbd5e1;
|
|
311
|
+
font-weight: 500;
|
|
312
|
+
text-align: right;
|
|
313
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
<div id="notes-explorer-root" class="notes-explorer-root">
|
|
2
|
+
<!-- Galaxy Header -->
|
|
3
|
+
<div class="notes-header">
|
|
4
|
+
<div class="notes-title-row">
|
|
5
|
+
<span class="notes-icon">📝</span>
|
|
6
|
+
<span id="notes-space-title" class="notes-title">Notes Space 1</span>
|
|
7
|
+
<div class="notes-header-actions">
|
|
8
|
+
<button id="btn-notes-new-topic" class="btn-notes-action" title="New Topic or Discussion">+ New</button>
|
|
9
|
+
</div>
|
|
10
|
+
</div>
|
|
11
|
+
<div class="notes-search-bar">
|
|
12
|
+
<input type="text" id="notes-filter-input" class="notes-filter-input" placeholder="Filter topics, #tags, or code..." />
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
|
|
16
|
+
<!-- Accordion Sections Container -->
|
|
17
|
+
<div class="notes-sections-container">
|
|
18
|
+
<!-- Section 1: Smart Lenses -->
|
|
19
|
+
<div class="notes-accordion-section open" data-section="lenses">
|
|
20
|
+
<div class="accordion-header" id="header-lenses">
|
|
21
|
+
<span class="accordion-arrow">▼</span>
|
|
22
|
+
<span class="accordion-title">🧭 SMART LENSES</span>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="accordion-content" id="content-lenses">
|
|
25
|
+
<div class="lens-item active" data-lens="all">
|
|
26
|
+
<span class="lens-icon">📥</span>
|
|
27
|
+
<span class="lens-label">All Activity</span>
|
|
28
|
+
<span class="lens-count">18</span>
|
|
29
|
+
</div>
|
|
30
|
+
<div class="lens-item" data-lens="issues">
|
|
31
|
+
<span class="lens-icon">🐛</span>
|
|
32
|
+
<span class="lens-label">Issues & Tasks</span>
|
|
33
|
+
<span class="lens-count">4</span>
|
|
34
|
+
</div>
|
|
35
|
+
<div class="lens-item" data-lens="discussions">
|
|
36
|
+
<span class="lens-icon">💡</span>
|
|
37
|
+
<span class="lens-label">Discussions & RFCs</span>
|
|
38
|
+
<span class="lens-count">9</span>
|
|
39
|
+
</div>
|
|
40
|
+
<div class="lens-item" data-lens="anchors">
|
|
41
|
+
<span class="lens-icon">📎</span>
|
|
42
|
+
<span class="lens-label">Living Code Anchors</span>
|
|
43
|
+
<span class="lens-count">5</span>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
|
|
48
|
+
<!-- Section 2: Tags & Topics -->
|
|
49
|
+
<div class="notes-accordion-section open" data-section="tags">
|
|
50
|
+
<div class="accordion-header" id="header-tags">
|
|
51
|
+
<span class="accordion-arrow">▼</span>
|
|
52
|
+
<span class="accordion-title">🏷️ TAGS & TOPICS</span>
|
|
53
|
+
<button id="btn-notes-add-tag" class="btn-section-mini" title="Add Tag">+</button>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="accordion-content" id="content-tags">
|
|
56
|
+
<div class="tag-pill-item" data-tag="architecture">
|
|
57
|
+
<span class="tag-hash">#</span>
|
|
58
|
+
<span class="tag-name">architecture</span>
|
|
59
|
+
<span class="tag-badge">6</span>
|
|
60
|
+
</div>
|
|
61
|
+
<div class="tag-pill-item" data-tag="bug">
|
|
62
|
+
<span class="tag-hash">#</span>
|
|
63
|
+
<span class="tag-name">bug</span>
|
|
64
|
+
<span class="tag-badge">4</span>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="tag-pill-item" data-tag="frontend-ui">
|
|
67
|
+
<span class="tag-hash">#</span>
|
|
68
|
+
<span class="tag-name">frontend-ui</span>
|
|
69
|
+
<span class="tag-badge">12</span>
|
|
70
|
+
</div>
|
|
71
|
+
<div class="tag-pill-item" data-tag="v1-mvp">
|
|
72
|
+
<span class="tag-hash">#</span>
|
|
73
|
+
<span class="tag-name">v1-mvp</span>
|
|
74
|
+
<span class="tag-badge">8</span>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<!-- Section 3: Living Code Anchors -->
|
|
80
|
+
<div class="notes-accordion-section open" data-section="anchors">
|
|
81
|
+
<div class="accordion-header" id="header-anchors">
|
|
82
|
+
<span class="accordion-arrow">▼</span>
|
|
83
|
+
<span class="accordion-title">🌲 LIVING CODE ANCHORS</span>
|
|
84
|
+
</div>
|
|
85
|
+
<div class="accordion-content" id="content-anchors">
|
|
86
|
+
<div class="code-anchor-group">
|
|
87
|
+
<div class="anchor-dir-label">📁 src/client/ui/shell/</div>
|
|
88
|
+
<div class="code-anchor-item active" data-file="src/client/ui/shell/space-gib-shell-service.mts" data-line="1080">
|
|
89
|
+
<span class="anchor-file-icon">📄</span>
|
|
90
|
+
<span class="anchor-file-name" title="space-gib-shell-service.mts">space-gib-shell-service.mts</span>
|
|
91
|
+
<span class="anchor-notes-count">3</span>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="code-anchor-item" data-file="src/client/ui/shell/cosmic-big-bang.mts" data-line="335">
|
|
94
|
+
<span class="anchor-file-icon">📄</span>
|
|
95
|
+
<span class="anchor-file-name" title="cosmic-big-bang.mts">cosmic-big-bang.mts</span>
|
|
96
|
+
<span class="anchor-notes-count">1</span>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div class="code-anchor-group">
|
|
100
|
+
<div class="anchor-dir-label">📁 libs/core-gib/</div>
|
|
101
|
+
<div class="code-anchor-item" data-file="libs/core-gib/src/witness/space/space-helper.mts" data-line="1263">
|
|
102
|
+
<span class="anchor-file-icon">📄</span>
|
|
103
|
+
<span class="anchor-file-name" title="space-helper.mts">space-helper.mts</span>
|
|
104
|
+
<span class="anchor-notes-count">1</span>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<!-- Section 4: Galaxy Settings -->
|
|
111
|
+
<div class="notes-accordion-section" data-section="settings">
|
|
112
|
+
<div class="accordion-header" id="header-settings">
|
|
113
|
+
<span class="accordion-arrow">▶</span>
|
|
114
|
+
<span class="accordion-title">⚙️ GALAXY SETTINGS</span>
|
|
115
|
+
</div>
|
|
116
|
+
<div class="accordion-content hidden" id="content-settings">
|
|
117
|
+
<div class="settings-row">
|
|
118
|
+
<span class="settings-label">Galaxy Type:</span>
|
|
119
|
+
<span class="settings-value">Metatext & Notes</span>
|
|
120
|
+
</div>
|
|
121
|
+
<div class="settings-row">
|
|
122
|
+
<span class="settings-label">Space Topology:</span>
|
|
123
|
+
<span class="settings-value">Single Continuous Timeline</span>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="settings-row">
|
|
126
|
+
<span class="settings-label">Encryption:</span>
|
|
127
|
+
<span class="settings-value">None (Public in Cosmos)</span>
|
|
128
|
+
</div>
|
|
129
|
+
<div class="settings-row">
|
|
130
|
+
<span class="settings-label">Living Soft Links:</span>
|
|
131
|
+
<span class="settings-value">Inverted space-qualified</span>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import thisCss from "./notes-explorer.css";
|
|
2
|
+
import thisHtml from "./notes-explorer.html";
|
|
3
|
+
|
|
4
|
+
import { ROOT_ADDR } from "@ibgib/ts-gib/dist/V1/constants.mjs";
|
|
5
|
+
import { IbGibAddr } from "@ibgib/ts-gib/dist/types.mjs";
|
|
6
|
+
import { IbGib_V1 } from "@ibgib/ts-gib/dist/V1/types.mjs";
|
|
7
|
+
import { promptForText } from "@ibgib/web-gib/dist/helpers.web.mjs";
|
|
8
|
+
import {
|
|
9
|
+
IbGibDynamicComponentMetaBase, IbGibDynamicComponentInstanceBase,
|
|
10
|
+
} from "@ibgib/web-gib/dist/ui/component/ibgib-dynamic-component-bases.mjs";
|
|
11
|
+
import {
|
|
12
|
+
ElementsBase, IbGibDynamicComponentInstance,
|
|
13
|
+
} from "@ibgib/web-gib/dist/ui/component/component-types.mjs";
|
|
14
|
+
import { getComponentCtorArg } from "@ibgib/web-gib/dist/app-bootstrap/init-orchestration.mjs";
|
|
15
|
+
|
|
16
|
+
export const NOTES_EXPLORER_COMPONENT_NAME = 'space-gib-notes-explorer';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Metadata factory for space-gib-notes-explorer Web Component.
|
|
20
|
+
*/
|
|
21
|
+
export class NotesExplorerComponentMeta extends IbGibDynamicComponentMetaBase {
|
|
22
|
+
protected lc: string = `[${NotesExplorerComponentMeta.name}]`;
|
|
23
|
+
|
|
24
|
+
routeRegExp?: RegExp = new RegExp(`^${NOTES_EXPLORER_COMPONENT_NAME}$`);
|
|
25
|
+
componentName = NOTES_EXPLORER_COMPONENT_NAME;
|
|
26
|
+
|
|
27
|
+
constructor() {
|
|
28
|
+
super(getComponentCtorArg());
|
|
29
|
+
if (!customElements.get(this.componentName)) {
|
|
30
|
+
customElements.define(this.componentName, NotesExplorerComponentInstance);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async createInstance({
|
|
35
|
+
path,
|
|
36
|
+
ibGibAddr
|
|
37
|
+
}: {
|
|
38
|
+
path: string;
|
|
39
|
+
ibGibAddr: IbGibAddr;
|
|
40
|
+
}): Promise<IbGibDynamicComponentInstance> {
|
|
41
|
+
const component = document.createElement(this.componentName) as NotesExplorerComponentInstance;
|
|
42
|
+
await component.initialize({
|
|
43
|
+
ibGibAddr: ibGibAddr || ROOT_ADDR,
|
|
44
|
+
meta: this,
|
|
45
|
+
html: thisHtml,
|
|
46
|
+
css: [thisCss],
|
|
47
|
+
});
|
|
48
|
+
return component;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Elements inside Shadow Root.
|
|
54
|
+
*/
|
|
55
|
+
export interface NotesExplorerElements extends ElementsBase {
|
|
56
|
+
rootEl: HTMLDivElement;
|
|
57
|
+
spaceTitleEl: HTMLSpanElement;
|
|
58
|
+
btnNewTopicEl: HTMLButtonElement;
|
|
59
|
+
filterInputEl: HTMLInputElement;
|
|
60
|
+
btnAddTagEl: HTMLButtonElement;
|
|
61
|
+
contentEl: HTMLDivElement;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Notes Explorer Left Panel Accordion Component Instance.
|
|
66
|
+
*/
|
|
67
|
+
export class NotesExplorerComponentInstance
|
|
68
|
+
extends IbGibDynamicComponentInstanceBase<IbGib_V1, NotesExplorerElements>
|
|
69
|
+
implements IbGibDynamicComponentInstance<IbGib_V1, NotesExplorerElements> {
|
|
70
|
+
|
|
71
|
+
protected lc: string = `[${NotesExplorerComponentInstance.name}]`;
|
|
72
|
+
|
|
73
|
+
get el(): NotesExplorerElements {
|
|
74
|
+
if (!this.elements) {
|
|
75
|
+
throw new Error(`elements is not defined in ${this.lc}`);
|
|
76
|
+
}
|
|
77
|
+
return this.elements;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
override async created(): Promise<void> {
|
|
81
|
+
const shadow = this.shadowRoot!;
|
|
82
|
+
this.elements = {
|
|
83
|
+
rootEl: shadow.getElementById('notes-explorer-root') as HTMLDivElement,
|
|
84
|
+
spaceTitleEl: shadow.getElementById('notes-space-title') as HTMLSpanElement,
|
|
85
|
+
btnNewTopicEl: shadow.getElementById('btn-notes-new-topic') as HTMLButtonElement,
|
|
86
|
+
filterInputEl: shadow.getElementById('notes-filter-input') as HTMLInputElement,
|
|
87
|
+
btnAddTagEl: shadow.getElementById('btn-notes-add-tag') as HTMLButtonElement,
|
|
88
|
+
contentEl: shadow.getElementById('notes-explorer-root') as HTMLDivElement,
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
this.bindEvents();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override async disconnected(): Promise<void> {
|
|
95
|
+
// Lifecycle teardown if required
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
public setTitle(title: string): void {
|
|
99
|
+
if (this.elements?.spaceTitleEl) {
|
|
100
|
+
this.elements.spaceTitleEl.textContent = title || 'Notes Space 1';
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private bindEvents(): void {
|
|
105
|
+
const shadow = this.shadowRoot!;
|
|
106
|
+
|
|
107
|
+
// Accordion headers toggle
|
|
108
|
+
shadow.querySelectorAll('.accordion-header').forEach(header => {
|
|
109
|
+
header.addEventListener('click', (e) => {
|
|
110
|
+
// Ignore if clicked on a mini button inside header
|
|
111
|
+
if ((e.target as HTMLElement).tagName.toLowerCase() === 'button') return;
|
|
112
|
+
|
|
113
|
+
const section = header.closest('.notes-accordion-section');
|
|
114
|
+
const content = section?.querySelector('.accordion-content');
|
|
115
|
+
const arrow = header.querySelector('.accordion-arrow');
|
|
116
|
+
|
|
117
|
+
if (content) {
|
|
118
|
+
const isHidden = content.classList.toggle('hidden');
|
|
119
|
+
if (arrow) {
|
|
120
|
+
arrow.textContent = isHidden ? '▶' : '▼';
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Smart Lenses selection
|
|
127
|
+
shadow.querySelectorAll('.lens-item').forEach(item => {
|
|
128
|
+
item.addEventListener('click', () => {
|
|
129
|
+
shadow.querySelectorAll('.lens-item').forEach(l => l.classList.remove('active'));
|
|
130
|
+
item.classList.add('active');
|
|
131
|
+
const lens = item.getAttribute('data-lens');
|
|
132
|
+
|
|
133
|
+
this.dispatchEvent(new CustomEvent('space-gib-lens-selected', {
|
|
134
|
+
detail: { lens },
|
|
135
|
+
bubbles: true,
|
|
136
|
+
composed: true,
|
|
137
|
+
}));
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
// Tag selection
|
|
142
|
+
shadow.querySelectorAll('.tag-pill-item').forEach(pill => {
|
|
143
|
+
pill.addEventListener('click', () => {
|
|
144
|
+
shadow.querySelectorAll('.tag-pill-item').forEach(t => t.classList.remove('active'));
|
|
145
|
+
pill.classList.add('active');
|
|
146
|
+
const tag = pill.getAttribute('data-tag');
|
|
147
|
+
|
|
148
|
+
this.dispatchEvent(new CustomEvent('space-gib-notes-tag-selected', {
|
|
149
|
+
detail: { tag },
|
|
150
|
+
bubbles: true,
|
|
151
|
+
composed: true,
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
// Living Code Anchors selection
|
|
157
|
+
shadow.querySelectorAll('.code-anchor-item').forEach(anchor => {
|
|
158
|
+
anchor.addEventListener('click', () => {
|
|
159
|
+
shadow.querySelectorAll('.code-anchor-item').forEach(a => a.classList.remove('active'));
|
|
160
|
+
anchor.classList.add('active');
|
|
161
|
+
const file = anchor.getAttribute('data-file');
|
|
162
|
+
const line = anchor.getAttribute('data-line');
|
|
163
|
+
|
|
164
|
+
this.dispatchEvent(new CustomEvent('space-gib-note-selected', {
|
|
165
|
+
detail: { file, line: Number(line) || 1 },
|
|
166
|
+
bubbles: true,
|
|
167
|
+
composed: true,
|
|
168
|
+
}));
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
// New Topic button
|
|
173
|
+
this.el.btnNewTopicEl?.addEventListener('click', () => {
|
|
174
|
+
this.dispatchEvent(new CustomEvent('space-gib-new-note-requested', {
|
|
175
|
+
bubbles: true,
|
|
176
|
+
composed: true,
|
|
177
|
+
}));
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
// Add Tag button
|
|
181
|
+
this.el.btnAddTagEl?.addEventListener('click', async (e) => {
|
|
182
|
+
e.stopPropagation();
|
|
183
|
+
const newTag = await promptForText({
|
|
184
|
+
title: 'Add Project Tag',
|
|
185
|
+
msg: 'Enter tag name (e.g. p0-blocker or security):',
|
|
186
|
+
});
|
|
187
|
+
if (newTag) {
|
|
188
|
+
this.addTagPill(newTag);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// Filter search input
|
|
193
|
+
this.el.filterInputEl?.addEventListener('input', () => {
|
|
194
|
+
const query = (this.el.filterInputEl.value || '').toLowerCase().trim();
|
|
195
|
+
this.filterItems(query);
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private addTagPill(tagName: string): void {
|
|
200
|
+
const shadow = this.shadowRoot!;
|
|
201
|
+
const cleanTag = tagName.replace(/^#/, '').trim();
|
|
202
|
+
const contentTags = shadow.getElementById('content-tags');
|
|
203
|
+
if (!contentTags || !cleanTag) { return; }
|
|
204
|
+
|
|
205
|
+
const pill = document.createElement('div');
|
|
206
|
+
pill.className = 'tag-pill-item active';
|
|
207
|
+
pill.setAttribute('data-tag', cleanTag);
|
|
208
|
+
pill.innerHTML = `
|
|
209
|
+
<span class="tag-hash">#</span>
|
|
210
|
+
<span class="tag-name">${cleanTag}</span>
|
|
211
|
+
<span class="tag-badge">1</span>
|
|
212
|
+
`;
|
|
213
|
+
pill.addEventListener('click', () => {
|
|
214
|
+
shadow.querySelectorAll('.tag-pill-item').forEach(t => t.classList.remove('active'));
|
|
215
|
+
pill.classList.add('active');
|
|
216
|
+
this.dispatchEvent(new CustomEvent('space-gib-notes-tag-selected', {
|
|
217
|
+
detail: { tag: cleanTag },
|
|
218
|
+
bubbles: true,
|
|
219
|
+
composed: true,
|
|
220
|
+
}));
|
|
221
|
+
});
|
|
222
|
+
contentTags.appendChild(pill);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
private filterItems(query: string): void {
|
|
226
|
+
const shadow = this.shadowRoot!;
|
|
227
|
+
|
|
228
|
+
// Filter tags
|
|
229
|
+
shadow.querySelectorAll('.tag-pill-item').forEach((el: any) => {
|
|
230
|
+
const name = (el.querySelector('.tag-name')?.textContent || '').toLowerCase();
|
|
231
|
+
el.style.display = !query || name.includes(query) ? 'flex' : 'none';
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
// Filter code anchors
|
|
235
|
+
shadow.querySelectorAll('.code-anchor-item').forEach((el: any) => {
|
|
236
|
+
const name = (el.querySelector('.anchor-file-name')?.textContent || '').toLowerCase();
|
|
237
|
+
el.style.display = !query || name.includes(query) ? 'flex' : 'none';
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { getComponentSvc } from "@ibgib/web-gib/dist/ui/component/ibgib-component-service.mjs";
|
|
2
|
+
import { NotesInspectorComponentMeta } from "./notes-inspector.mjs";
|
|
3
|
+
|
|
4
|
+
export * from "./notes-inspector.mjs";
|
|
5
|
+
|
|
6
|
+
export async function registerNotesInspectorComponent(): Promise<void> {
|
|
7
|
+
const componentSvc = await getComponentSvc();
|
|
8
|
+
componentSvc.registerComponentMeta(new NotesInspectorComponentMeta());
|
|
9
|
+
}
|