living-ai-documentation 2.3.0 → 2.5.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.
@@ -0,0 +1,61 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
6
+ <title>Blueprint</title>
7
+ <link rel="stylesheet" href="/blueprint/styles.css" />
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/github-dark.min.css" />
9
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
10
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>
11
+ </head>
12
+ <body>
13
+ <main class="app-shell">
14
+ <header class="topbar">
15
+ <div class="brand-lockup">
16
+ <span class="brand-mark">LD</span>
17
+ <div>
18
+ <h1>Blueprint</h1>
19
+ <p>Source folder explorer</p>
20
+ </div>
21
+ </div>
22
+ <nav id="breadcrumb" class="breadcrumb"></nav>
23
+ <div class="topbar-right">
24
+ <a href="/workspace" class="ghost-button">Workspace</a>
25
+ <a href="/" class="ghost-button">Home</a>
26
+ </div>
27
+ </header>
28
+
29
+ <section class="workspace-shell">
30
+ <nav class="rail">
31
+ <button id="fitButton" class="tool-button" type="button" title="Fit view">⌖</button>
32
+ <button id="dragToggle" class="tool-button" type="button" title="Toggle drag mode">⠿</button>
33
+ </nav>
34
+
35
+ <canvas id="blueprintCanvas"></canvas>
36
+
37
+ <div id="emptyState" class="empty-state" hidden>
38
+ <p>No sub-folders found.</p>
39
+ </div>
40
+
41
+ <aside id="fileExplorer" class="file-explorer" hidden>
42
+ <header class="explorer-header">
43
+ <div id="explorerBreadcrumb" class="explorer-breadcrumb"></div>
44
+ <button id="explorerClose" class="explorer-close" type="button">×</button>
45
+ </header>
46
+ <div class="explorer-top">
47
+ <div id="explorerList" class="explorer-list"></div>
48
+ </div>
49
+ <div class="explorer-divider"></div>
50
+ <div class="explorer-bottom">
51
+ <div id="filePreview" class="file-preview">
52
+ <p class="file-preview-placeholder">Click a file to preview it</p>
53
+ </div>
54
+ </div>
55
+ </aside>
56
+ </section>
57
+ </main>
58
+
59
+ <script type="module" src="/blueprint/app.js"></script>
60
+ </body>
61
+ </html>
@@ -0,0 +1,392 @@
1
+ :root {
2
+ --bg: #0f172a;
3
+ --ink: #f1f5f9;
4
+ --muted: #94a3b8;
5
+ --line: rgb(255 255 255 / 10%);
6
+ --accent: #3b82f6;
7
+ --accent-soft: rgb(59 130 246 / 15%);
8
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, sans-serif;
9
+ }
10
+
11
+ * { box-sizing: border-box; }
12
+
13
+ [hidden] { display: none !important; }
14
+
15
+ html, body {
16
+ width: 100%;
17
+ height: 100%;
18
+ margin: 0;
19
+ overflow: hidden;
20
+ background: var(--bg);
21
+ color: var(--ink);
22
+ }
23
+
24
+ .app-shell {
25
+ display: grid;
26
+ grid-template-rows: 64px minmax(0, 1fr);
27
+ width: 100vw;
28
+ height: 100vh;
29
+ }
30
+
31
+ .topbar {
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: space-between;
35
+ gap: 16px;
36
+ padding: 0 24px;
37
+ border-bottom: 1px solid var(--line);
38
+ background: rgb(15 23 42 / 92%);
39
+ backdrop-filter: blur(12px);
40
+ z-index: 10;
41
+ }
42
+
43
+ .brand-lockup {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 12px;
47
+ min-width: 0;
48
+ }
49
+
50
+ .brand-mark {
51
+ display: grid;
52
+ width: 36px;
53
+ height: 36px;
54
+ place-items: center;
55
+ border: 1px solid rgb(255 255 255 / 20%);
56
+ border-radius: 10px;
57
+ background: #1e293b;
58
+ color: #fff;
59
+ font-size: 11px;
60
+ font-weight: 800;
61
+ }
62
+
63
+ .brand-lockup h1 {
64
+ font-size: 14px;
65
+ font-weight: 760;
66
+ margin: 0;
67
+ letter-spacing: 0;
68
+ }
69
+
70
+ .brand-lockup p {
71
+ margin: 2px 0 0;
72
+ color: var(--muted);
73
+ font-size: 11px;
74
+ }
75
+
76
+ .topbar-right {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 8px;
80
+ }
81
+
82
+ .breadcrumb {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: 6px;
86
+ font-size: 13px;
87
+ color: var(--muted);
88
+ overflow: hidden;
89
+ }
90
+
91
+ .breadcrumb-item {
92
+ cursor: pointer;
93
+ color: var(--accent);
94
+ font-weight: 600;
95
+ white-space: nowrap;
96
+ transition: opacity 0.15s;
97
+ }
98
+
99
+ .breadcrumb-item:hover { opacity: 0.75; }
100
+
101
+ .breadcrumb-item.current {
102
+ color: var(--ink);
103
+ cursor: default;
104
+ font-weight: 700;
105
+ }
106
+
107
+ .breadcrumb-sep {
108
+ opacity: 0.4;
109
+ font-size: 11px;
110
+ }
111
+
112
+ .ghost-button {
113
+ display: inline-flex;
114
+ align-items: center;
115
+ height: 34px;
116
+ padding: 0 12px;
117
+ border: 1px solid var(--line);
118
+ border-radius: 9px;
119
+ background: transparent;
120
+ color: var(--ink);
121
+ font-size: 13px;
122
+ font-weight: 700;
123
+ cursor: pointer;
124
+ text-decoration: none;
125
+ transition: background 0.15s;
126
+ }
127
+
128
+ .ghost-button:hover { background: rgb(255 255 255 / 6%); }
129
+
130
+ .workspace-shell {
131
+ position: relative;
132
+ overflow: hidden;
133
+ }
134
+
135
+ canvas {
136
+ width: 100%;
137
+ height: 100%;
138
+ cursor: default;
139
+ }
140
+
141
+ canvas.is-panning { cursor: grabbing; }
142
+
143
+ .rail {
144
+ position: absolute;
145
+ top: 16px;
146
+ left: 16px;
147
+ display: flex;
148
+ flex-direction: column;
149
+ gap: 10px;
150
+ z-index: 5;
151
+ }
152
+
153
+ .tool-button {
154
+ display: grid;
155
+ width: 46px;
156
+ height: 46px;
157
+ place-items: center;
158
+ border: 1px solid var(--line);
159
+ border-radius: 14px;
160
+ background: #1e293b;
161
+ color: var(--ink);
162
+ font-size: 22px;
163
+ font-weight: 700;
164
+ cursor: pointer;
165
+ box-shadow: 0 8px 24px rgb(0 0 0 / 30%);
166
+ transition: background 0.15s;
167
+ }
168
+
169
+ .tool-button:hover { background: #273549; }
170
+
171
+ .tool-button.active {
172
+ border-color: #3b82f6;
173
+ background: rgb(59 130 246 / 20%);
174
+ color: #60a5fa;
175
+ }
176
+
177
+ .file-explorer {
178
+ position: absolute;
179
+ top: 0;
180
+ right: 0;
181
+ bottom: 0;
182
+ width: 50%;
183
+ background: #0f172a;
184
+ border-left: 1px solid var(--line);
185
+ display: flex;
186
+ flex-direction: column;
187
+ z-index: 10;
188
+ animation: slide-in 200ms ease-out both;
189
+ }
190
+
191
+ @keyframes slide-in {
192
+ from { transform: translateX(100%); opacity: 0; }
193
+ to { transform: translateX(0); opacity: 1; }
194
+ }
195
+
196
+ .explorer-header {
197
+ display: flex;
198
+ align-items: center;
199
+ justify-content: space-between;
200
+ gap: 12px;
201
+ padding: 16px 20px;
202
+ border-bottom: 1px solid var(--line);
203
+ flex-shrink: 0;
204
+ }
205
+
206
+ .explorer-path {
207
+ font-size: 13px;
208
+ font-weight: 700;
209
+ color: #93c5fd;
210
+ overflow: hidden;
211
+ text-overflow: ellipsis;
212
+ white-space: nowrap;
213
+ }
214
+
215
+ .explorer-close {
216
+ display: grid;
217
+ place-items: center;
218
+ width: 28px;
219
+ height: 28px;
220
+ border: 1px solid var(--line);
221
+ border-radius: 8px;
222
+ background: transparent;
223
+ color: var(--muted);
224
+ font-size: 18px;
225
+ cursor: pointer;
226
+ flex-shrink: 0;
227
+ transition: background 0.15s;
228
+ }
229
+
230
+ .explorer-close:hover { background: rgb(255 255 255 / 6%); color: var(--ink); }
231
+
232
+ .explorer-top {
233
+ flex: 1;
234
+ overflow-y: auto;
235
+ min-height: 0;
236
+ }
237
+
238
+ .explorer-divider {
239
+ height: 1px;
240
+ background: var(--line);
241
+ flex-shrink: 0;
242
+ }
243
+
244
+ .explorer-bottom {
245
+ flex: 1;
246
+ overflow-y: auto;
247
+ min-height: 0;
248
+ }
249
+
250
+ .explorer-list {
251
+ padding: 8px 0;
252
+ }
253
+
254
+ .explorer-item {
255
+ display: flex;
256
+ align-items: center;
257
+ gap: 10px;
258
+ padding: 8px 20px;
259
+ font-size: 13px;
260
+ transition: background 0.1s;
261
+ }
262
+
263
+ .explorer-item:hover { background: rgb(255 255 255 / 4%); }
264
+ .explorer-item.is-folder { color: #93c5fd; font-weight: 600; }
265
+ .explorer-item.is-file { color: #94a3b8; }
266
+
267
+ .explorer-breadcrumb {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 4px;
271
+ font-size: 12px;
272
+ overflow: hidden;
273
+ flex: 1;
274
+ min-width: 0;
275
+ }
276
+
277
+ .explorer-breadcrumb-item {
278
+ color: #60a5fa;
279
+ cursor: pointer;
280
+ white-space: nowrap;
281
+ font-weight: 600;
282
+ }
283
+
284
+ .explorer-breadcrumb-item:hover { text-decoration: underline; }
285
+ .explorer-breadcrumb-item.current { color: #f1f5f9; cursor: default; }
286
+ .explorer-breadcrumb-item.current:hover { text-decoration: none; }
287
+
288
+ .explorer-breadcrumb-sep { color: #475569; font-size: 11px; }
289
+
290
+ .file-preview {
291
+ padding: 16px;
292
+ height: 100%;
293
+ }
294
+
295
+ .file-preview-placeholder {
296
+ color: #475569;
297
+ font-size: 13px;
298
+ margin: 0;
299
+ padding-top: 8px;
300
+ }
301
+
302
+ .file-preview pre {
303
+ margin: 0;
304
+ font-size: 12px;
305
+ line-height: 1.6;
306
+ white-space: pre-wrap;
307
+ word-break: break-all;
308
+ }
309
+
310
+ .file-preview .hljs {
311
+ background: transparent;
312
+ padding: 0;
313
+ }
314
+
315
+ .file-preview .hljs-ln {
316
+ border-collapse: collapse;
317
+ font-size: 12px;
318
+ line-height: 1.6;
319
+ }
320
+
321
+ .file-preview .hljs-ln td { padding: 0; }
322
+
323
+ .file-preview .hljs-ln-numbers {
324
+ user-select: none;
325
+ text-align: right;
326
+ padding-right: 16px !important;
327
+ padding-left: 4px !important;
328
+ color: #3d4f6b;
329
+ border-right: 1px solid #1e3a5f;
330
+ min-width: 36px;
331
+ vertical-align: top;
332
+ }
333
+
334
+ .file-preview .hljs-ln-code {
335
+ padding-left: 16px !important;
336
+ }
337
+
338
+ .file-preview img {
339
+ max-width: 100%;
340
+ max-height: 300px;
341
+ border-radius: 8px;
342
+ object-fit: contain;
343
+ }
344
+
345
+ .file-preview video {
346
+ max-width: 100%;
347
+ border-radius: 8px;
348
+ }
349
+
350
+ .file-preview-binary,
351
+ .file-preview-truncated {
352
+ display: inline-block;
353
+ margin-top: 8px;
354
+ padding: 4px 10px;
355
+ border-radius: 6px;
356
+ font-size: 11px;
357
+ font-weight: 700;
358
+ }
359
+
360
+ .file-preview-binary { background: rgb(239 68 68 / 15%); color: #fca5a5; }
361
+ .file-preview-truncated { background: rgb(234 179 8 / 15%); color: #fde047; }
362
+
363
+ .file-preview-name {
364
+ font-size: 12px;
365
+ font-weight: 700;
366
+ color: #94a3b8;
367
+ margin: 0 0 10px;
368
+ }
369
+
370
+ .explorer-section-label {
371
+ padding: 12px 20px 4px;
372
+ font-size: 11px;
373
+ font-weight: 700;
374
+ color: #475569;
375
+ text-transform: uppercase;
376
+ letter-spacing: 0.06em;
377
+ }
378
+
379
+ .empty-state {
380
+ position: absolute;
381
+ inset: 0;
382
+ display: flex;
383
+ flex-direction: column;
384
+ align-items: center;
385
+ justify-content: center;
386
+ gap: 12px;
387
+ color: var(--muted);
388
+ font-size: 14px;
389
+ pointer-events: none;
390
+ }
391
+
392
+ .empty-state p { margin: 0; }
@@ -0,0 +1,12 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "ES2020",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2020", "DOM"],
7
+ "strict": false,
8
+ "skipLibCheck": true,
9
+ "sourceMap": true
10
+ },
11
+ "files": ["app.ts"]
12
+ }
@@ -558,6 +558,14 @@
558
558
  Workspace
559
559
  </a>
560
560
 
561
+ <!-- Blueprint -->
562
+ <a
563
+ href="/blueprint"
564
+ class="h-[34px] px-3 rounded-[9px] border border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 text-[13px] font-bold text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors inline-flex items-center no-underline"
565
+ >
566
+ Blueprint
567
+ </a>
568
+
561
569
  <!-- AI Agents -->
562
570
  <button
563
571
  id="ai-agents-btn"
@@ -21,6 +21,7 @@
21
21
  </div>
22
22
  <div class="status-row">
23
23
  <span id="apiStatus" class="status-pill">Detecting canvas API</span>
24
+ <a href="/blueprint" class="ghost-button" title="Blueprint">Blueprint</a>
24
25
  <a href="/" class="ghost-button" title="Back to home">Home</a>
25
26
  </div>
26
27
  </header>
@@ -0,0 +1,14 @@
1
+ import { Router } from 'express';
2
+ export interface BlueprintFolder {
3
+ name: string;
4
+ path: string;
5
+ hasChildren: boolean;
6
+ }
7
+ export interface BlueprintResponse {
8
+ sourceRoot: string;
9
+ path: string;
10
+ name: string;
11
+ folders: BlueprintFolder[];
12
+ }
13
+ export declare function blueprintRouter(docsPath: string): Router;
14
+ //# sourceMappingURL=blueprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../../../src/routes/blueprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AA2CjC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAgDD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA+HxD"}