@laitszkin/apollo-toolkit 3.11.1 → 3.11.3

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 (25) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/analyse-app-logs/scripts/__pycache__/filter_logs_by_time.cpython-312.pyc +0 -0
  3. package/analyse-app-logs/scripts/__pycache__/log_cli_utils.cpython-312.pyc +0 -0
  4. package/analyse-app-logs/scripts/__pycache__/search_logs.cpython-312.pyc +0 -0
  5. package/docs-to-voice/scripts/__pycache__/docs_to_voice.cpython-312.pyc +0 -0
  6. package/generate-spec/SKILL.md +18 -16
  7. package/generate-spec/agents/openai.yaml +4 -1
  8. package/generate-spec/scripts/__pycache__/create-specscpython-312.pyc +0 -0
  9. package/init-project-html/SKILL.md +68 -89
  10. package/init-project-html/agents/openai.yaml +7 -18
  11. package/init-project-html/lib/atlas/assets/architecture.css +695 -107
  12. package/init-project-html/lib/atlas/assets/viewer.client.js +10 -2
  13. package/init-project-html/lib/atlas/cli.js +17 -12
  14. package/init-project-html/lib/atlas/render.js +44 -3
  15. package/init-project-html/scripts/architecture-bootstrap-render.js +16 -0
  16. package/init-project-html/scripts/architecture.js +22 -12
  17. package/katex/scripts/__pycache__/render_katex.cpython-312.pyc +0 -0
  18. package/open-github-issue/scripts/__pycache__/open_github_issue.cpython-312.pyc +0 -0
  19. package/package.json +1 -1
  20. package/read-github-issue/scripts/__pycache__/find_issues.cpython-312.pyc +0 -0
  21. package/read-github-issue/scripts/__pycache__/read_issue.cpython-312.pyc +0 -0
  22. package/resolve-review-comments/scripts/__pycache__/review_threads.cpython-312.pyc +0 -0
  23. package/spec-to-project-html/SKILL.md +38 -58
  24. package/spec-to-project-html/agents/openai.yaml +7 -14
  25. package/text-to-short-video/scripts/__pycache__/enforce_video_aspect_ratio.cpython-312.pyc +0 -0
@@ -1,88 +1,410 @@
1
- /* architecture.css — styling for the declarative atlas. The CLI copies
2
- * this file into <outDir>/assets/. Style hooks (class names) are owned
3
- * by render.js so agents never need to touch HTML by hand. */
1
+ /* architecture.css — declarative atlas styling.
2
+ *
3
+ * Design direction: dark "blueprint × editorial" a deep ink ground
4
+ * with a faint vellum grid; a Fraunces serif display voice for titles
5
+ * and prose, a Geist body for UI text, and JetBrains Mono for technical
6
+ * accents (slugs, edge labels, chips). Bold maximalism is avoided; the
7
+ * page sells through precision spacing, soft inner glows, and one
8
+ * accent color (signal teal) rather than rainbow chrome.
9
+ *
10
+ * Class hooks are owned by render.js; agents never hand-author the
11
+ * markup. The CLI copies this file into <outDir>/assets/.
12
+ */
4
13
 
5
14
  :root {
6
- color-scheme: light dark;
7
- --bg: #0f172a;
8
- --panel: #111827;
9
- --panel-soft: #1f2937;
10
- --text: #e5e7eb;
11
- --muted: #9ca3af;
12
- --border: #334155;
13
- --accent: #38bdf8;
14
- --kind-ui: #38bdf8;
15
- --kind-api: #818cf8;
16
- --kind-service: #34d399;
17
- --kind-db: #fbbf24;
18
- --kind-pure-fn: #cbd5e1;
19
- --kind-queue: #a78bfa;
20
- --kind-external: #fb7185;
21
- --edge-call: #60a5fa;
22
- --edge-return: #94a3b8;
23
- --edge-data-row: #fbbf24;
24
- --edge-failure: #fb7185;
15
+ color-scheme: dark;
16
+
17
+ /* ink ground */
18
+ --ink: #060B12;
19
+ --ink-1: #0B131F;
20
+ --ink-2: #0F1B2A;
21
+ --ink-3: #142336;
22
+ --ink-4: #1B304A;
23
+
24
+ /* rules and dividers */
25
+ --rule: #1F3651;
26
+ --rule-soft: #16263B;
27
+
28
+ /* vellum (foreground) */
29
+ --vellum: #EDE7D8;
30
+ --vellum-soft: #C8C2B3;
31
+ --vellum-muted: #8A99AE;
32
+
33
+ /* one accent color carries the brand */
34
+ --accent: #66E5C7;
35
+ --accent-warm: #F4B850;
36
+ --accent-rose: #F47391;
37
+ --accent-violet: #B79EFF;
38
+
39
+ /* sub-module kind palette */
40
+ --kind-ui: #7DD3FC;
41
+ --kind-api: #B79EFF;
42
+ --kind-service: #66E5C7;
43
+ --kind-db: #F4B850;
44
+ --kind-pure-fn: #C9C3B3;
45
+ --kind-queue: #F47391;
46
+ --kind-external: #FF9B6A;
47
+
48
+ /* edge palette */
49
+ --edge-call: #7DD3FC;
50
+ --edge-return: #C9C3B3;
51
+ --edge-data-row: #F4B850;
52
+ --edge-failure: #F47391;
53
+
54
+ /* shadows */
55
+ --shadow-card: 0 1px 0 rgba(255, 255, 255, 0.04) inset, 0 30px 60px -30px rgba(0, 0, 0, 0.7), 0 18px 40px -30px rgba(102, 229, 199, 0.10);
56
+
57
+ /* type stack — distinctive, not generic */
58
+ --font-display: 'Fraunces', 'Iowan Old Style', 'Charter', 'Georgia', serif;
59
+ --font-ui: 'Geist', 'Inter', system-ui, -apple-system, 'Segoe UI', sans-serif;
60
+ --font-mono: 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
25
61
  }
26
62
 
27
63
  * { box-sizing: border-box; }
28
- html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif; }
64
+
65
+ html, body { margin: 0; padding: 0; }
66
+
67
+ body {
68
+ min-height: 100vh;
69
+ background:
70
+ radial-gradient(1200px 600px at 90% -200px, rgba(102, 229, 199, 0.10), transparent 60%),
71
+ radial-gradient(900px 500px at -10% 110%, rgba(183, 158, 255, 0.07), transparent 60%),
72
+ var(--ink);
73
+ color: var(--vellum);
74
+ font-family: var(--font-ui);
75
+ font-feature-settings: 'ss01', 'cv11';
76
+ -webkit-font-smoothing: antialiased;
77
+ text-rendering: optimizeLegibility;
78
+ position: relative;
79
+ overflow-x: hidden;
80
+ }
81
+
82
+ /* faint vellum grid behind everything — looks like blueprint paper */
83
+ body::before {
84
+ content: '';
85
+ position: fixed;
86
+ inset: 0;
87
+ background-image:
88
+ linear-gradient(to right, rgba(237, 231, 216, 0.025) 1px, transparent 1px),
89
+ linear-gradient(to bottom, rgba(237, 231, 216, 0.025) 1px, transparent 1px);
90
+ background-size: 48px 48px;
91
+ pointer-events: none;
92
+ z-index: 0;
93
+ mask-image: radial-gradient(ellipse at 50% 30%, black 0%, transparent 80%);
94
+ }
29
95
 
30
96
  a { color: var(--accent); text-decoration: none; }
31
- a:hover { text-decoration: underline; }
97
+ a:hover {
98
+ color: var(--vellum);
99
+ text-decoration: underline;
100
+ text-decoration-color: var(--accent);
101
+ text-decoration-thickness: 1.5px;
102
+ text-underline-offset: 4px;
103
+ }
32
104
 
33
- h1, h2 { margin: 0 0 12px; font-weight: 600; letter-spacing: -0.01em; }
34
- h1 { font-size: 28px; }
35
- h2 { font-size: 18px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.08em; font-size: 13px; }
105
+ h1, h2 { margin: 0; font-weight: 500; }
106
+ h1 {
107
+ font-family: var(--font-display);
108
+ font-weight: 380;
109
+ font-size: clamp(34px, 4vw, 52px);
110
+ letter-spacing: -0.028em;
111
+ line-height: 1.05;
112
+ color: var(--vellum);
113
+ font-variation-settings: 'opsz' 96, 'SOFT' 30;
114
+ }
115
+ h2 {
116
+ font-family: var(--font-ui);
117
+ font-size: 11px;
118
+ font-weight: 600;
119
+ letter-spacing: 0.18em;
120
+ text-transform: uppercase;
121
+ color: var(--vellum-muted);
122
+ margin-bottom: 14px;
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 12px;
126
+ }
127
+ h2::before {
128
+ content: '';
129
+ display: inline-block;
130
+ width: 22px;
131
+ height: 1px;
132
+ background: linear-gradient(90deg, var(--accent), transparent);
133
+ }
36
134
 
37
- p { line-height: 1.55; color: var(--text); }
135
+ p { line-height: 1.6; color: var(--vellum-soft); }
38
136
 
39
- /* ---- atlas (macro) ---- */
40
- .atlas-header { padding: 28px 40px 16px; border-bottom: 1px solid var(--border); background: var(--panel); }
41
- .atlas-summary { color: var(--muted); max-width: 80ch; margin: 8px 0 0; }
137
+ /* =================================================================
138
+ atlas (macro)
139
+ ================================================================= */
140
+ .atlas-header {
141
+ position: relative;
142
+ padding: 56px 56px 32px;
143
+ border-bottom: 1px solid var(--rule-soft);
144
+ z-index: 1;
145
+ }
146
+ .atlas-header::before {
147
+ content: 'ATLAS · MACRO';
148
+ position: absolute;
149
+ top: 28px;
150
+ left: 56px;
151
+ font-family: var(--font-mono);
152
+ font-size: 11px;
153
+ letter-spacing: 0.32em;
154
+ color: var(--accent);
155
+ }
156
+ .atlas-header h1 { margin-top: 18px; }
157
+ .atlas-summary {
158
+ font-family: var(--font-display);
159
+ font-style: italic;
160
+ font-weight: 350;
161
+ font-size: 18px;
162
+ color: var(--vellum-soft);
163
+ max-width: 80ch;
164
+ margin: 20px 0 0;
165
+ line-height: 1.55;
166
+ }
167
+
168
+ .atlas-main {
169
+ position: relative;
170
+ z-index: 1;
171
+ display: grid;
172
+ grid-template-columns: minmax(0, 3fr) minmax(300px, 1fr);
173
+ gap: 28px;
174
+ padding: 32px 56px 64px;
175
+ align-items: start;
176
+ }
42
177
 
43
- .atlas-main { display: grid; grid-template-columns: minmax(0, 3fr) minmax(280px, 1fr); gap: 24px; padding: 24px 40px 48px; }
178
+ .atlas-canvas {
179
+ position: relative;
180
+ background: linear-gradient(180deg, rgba(15, 27, 42, 0.92), rgba(11, 19, 31, 0.92));
181
+ border: 1px solid var(--rule);
182
+ border-radius: 18px;
183
+ padding: 0;
184
+ box-shadow: var(--shadow-card);
185
+ overflow: hidden;
186
+ }
187
+ .atlas-canvas::before {
188
+ content: 'MACRO DIAGRAM';
189
+ position: absolute;
190
+ top: 18px;
191
+ left: 22px;
192
+ font-family: var(--font-mono);
193
+ font-size: 10px;
194
+ letter-spacing: 0.28em;
195
+ color: var(--accent);
196
+ z-index: 3;
197
+ }
44
198
 
45
- .atlas-canvas { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; position: relative; }
46
- .atlas-canvas__toolbar { position: absolute; top: 16px; right: 16px; display: flex; gap: 4px; z-index: 2; }
47
- .atlas-canvas__toolbar button { background: var(--panel-soft); color: var(--text); border: 1px solid var(--border); padding: 4px 12px; border-radius: 6px; cursor: pointer; font-size: 13px; }
48
- .atlas-canvas__toolbar button:hover { border-color: var(--accent); color: var(--accent); }
199
+ .atlas-canvas__toolbar {
200
+ position: absolute;
201
+ top: 12px;
202
+ right: 14px;
203
+ display: flex;
204
+ gap: 4px;
205
+ z-index: 3;
206
+ background: rgba(6, 11, 18, 0.65);
207
+ border: 1px solid var(--rule);
208
+ border-radius: 10px;
209
+ padding: 4px;
210
+ -webkit-backdrop-filter: blur(6px);
211
+ backdrop-filter: blur(6px);
212
+ }
213
+ .atlas-canvas__toolbar button {
214
+ background: transparent;
215
+ color: var(--vellum-soft);
216
+ border: 0;
217
+ padding: 4px 12px;
218
+ border-radius: 6px;
219
+ cursor: pointer;
220
+ font-family: var(--font-mono);
221
+ font-size: 11px;
222
+ letter-spacing: 0.08em;
223
+ }
224
+ .atlas-canvas__toolbar button:hover { background: var(--ink-3); color: var(--accent); }
49
225
 
50
- .atlas-canvas__viewport { width: 100%; max-height: 72vh; overflow: hidden; border-radius: 8px; background: #0b1220; }
226
+ /* Fixed-aspect viewport: the diagram always occupies the same block
227
+ * regardless of its viewBox aspect ratio, so horizontally-biased
228
+ * atlases no longer collapse to a thin strip. The SVG fills both axes
229
+ * via preserveAspectRatio="xMidYMid meet" (rendered as 100% / 100%). */
230
+ .atlas-canvas__viewport {
231
+ position: relative;
232
+ width: 100%;
233
+ height: clamp(480px, 68vh, 760px);
234
+ overflow: hidden;
235
+ margin-top: 44px;
236
+ background:
237
+ radial-gradient(circle at 50% 38%, rgba(102, 229, 199, 0.05), transparent 60%),
238
+ linear-gradient(180deg, #05101B, #03080F);
239
+ }
240
+ .atlas-canvas__viewport::after {
241
+ /* blueprint grid only inside the viewport */
242
+ content: '';
243
+ position: absolute;
244
+ inset: 0;
245
+ background-image:
246
+ linear-gradient(to right, rgba(237, 231, 216, 0.04) 1px, transparent 1px),
247
+ linear-gradient(to bottom, rgba(237, 231, 216, 0.04) 1px, transparent 1px);
248
+ background-size: 32px 32px;
249
+ pointer-events: none;
250
+ }
51
251
  .atlas-canvas__viewport.is-grabbing { cursor: grabbing; }
52
252
  .atlas-canvas__viewport:not(.is-grabbing) { cursor: grab; }
53
253
 
54
- .atlas-svg { width: 100%; height: auto; max-height: 72vh; display: block; user-select: none; touch-action: none; }
254
+ .atlas-svg {
255
+ position: relative;
256
+ z-index: 1;
257
+ width: 100%;
258
+ height: 100%;
259
+ display: block;
260
+ user-select: none;
261
+ touch-action: none;
262
+ overflow: visible;
263
+ }
55
264
 
56
- .atlas-legend { list-style: none; padding: 12px 4px 0; margin: 0; display: flex; gap: 18px; flex-wrap: wrap; font-size: 12px; color: var(--muted); }
57
- .atlas-legend li { display: inline-flex; align-items: center; gap: 6px; }
58
- .legend-swatch { display: inline-block; width: 18px; height: 4px; border-radius: 2px; }
265
+ .atlas-legend {
266
+ list-style: none;
267
+ margin: 0;
268
+ padding: 14px 22px 18px;
269
+ display: flex;
270
+ gap: 22px;
271
+ flex-wrap: wrap;
272
+ font-family: var(--font-mono);
273
+ font-size: 11px;
274
+ letter-spacing: 0.06em;
275
+ color: var(--vellum-muted);
276
+ border-top: 1px solid var(--rule-soft);
277
+ }
278
+ .atlas-legend li { display: inline-flex; align-items: center; gap: 8px; }
279
+ .legend-swatch { display: inline-block; width: 22px; height: 2px; border-radius: 1px; }
59
280
  .legend-swatch--call { background: var(--edge-call); }
60
281
  .legend-swatch--return { background: var(--edge-return); }
61
282
  .legend-swatch--data-row { background: var(--edge-data-row); }
62
283
  .legend-swatch--failure { background: var(--edge-failure); }
63
284
 
64
- .atlas-index { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; max-height: 80vh; overflow: auto; }
285
+ .atlas-index {
286
+ background: rgba(15, 27, 42, 0.6);
287
+ border: 1px solid var(--rule);
288
+ border-radius: 18px;
289
+ padding: 22px 22px 14px;
290
+ max-height: clamp(520px, 72vh, 820px);
291
+ overflow: auto;
292
+ box-shadow: var(--shadow-card);
293
+ }
294
+ .atlas-index::-webkit-scrollbar { width: 10px; }
295
+ .atlas-index::-webkit-scrollbar-thumb { background: var(--ink-4); border-radius: 999px; }
296
+ .atlas-index::-webkit-scrollbar-track { background: transparent; }
65
297
 
66
- .atlas-submodule-index { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 10px; }
67
- .atlas-submodule-index__item a { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px 8px; padding: 8px 10px; background: var(--panel-soft); border: 1px solid var(--border); border-radius: 8px; color: inherit; }
68
- .atlas-submodule-index__item a:hover { border-color: var(--accent); }
69
- .atlas-submodule-index__feature { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; grid-column: 1 / 3; }
70
- .atlas-submodule-index__sub { font-weight: 600; }
71
- .atlas-submodule-index__kind { font-size: 11px; padding: 1px 8px; border-radius: 999px; background: var(--panel); border: 1px solid var(--border); color: var(--muted); }
72
- .atlas-submodule-index__role { margin: 4px 10px 0; font-size: 12px; color: var(--muted); }
298
+ .atlas-submodule-index {
299
+ list-style: none;
300
+ padding: 0;
301
+ margin: 0;
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: 12px;
305
+ }
306
+ .atlas-submodule-index__item { position: relative; }
307
+ .atlas-submodule-index__item a {
308
+ display: grid;
309
+ grid-template-columns: minmax(0, 1fr) auto;
310
+ align-items: center;
311
+ gap: 4px 12px;
312
+ padding: 12px 14px;
313
+ background: linear-gradient(180deg, rgba(31, 54, 81, 0.42), rgba(15, 27, 42, 0.6));
314
+ border: 1px solid var(--rule);
315
+ border-radius: 12px;
316
+ color: var(--vellum);
317
+ transition: transform 140ms ease, border-color 140ms ease, background 140ms ease;
318
+ }
319
+ .atlas-submodule-index__item a:hover {
320
+ transform: translateY(-1px);
321
+ border-color: var(--accent);
322
+ background: linear-gradient(180deg, rgba(102, 229, 199, 0.07), rgba(15, 27, 42, 0.7));
323
+ }
324
+ .atlas-submodule-index__feature {
325
+ font-family: var(--font-mono);
326
+ font-size: 10px;
327
+ color: var(--vellum-muted);
328
+ text-transform: uppercase;
329
+ letter-spacing: 0.2em;
330
+ grid-column: 1 / 3;
331
+ }
332
+ .atlas-submodule-index__sub {
333
+ font-family: var(--font-display);
334
+ font-weight: 500;
335
+ font-size: 18px;
336
+ letter-spacing: -0.01em;
337
+ color: var(--vellum);
338
+ }
339
+ .atlas-submodule-index__kind {
340
+ font-family: var(--font-mono);
341
+ font-size: 10px;
342
+ padding: 3px 10px;
343
+ border-radius: 999px;
344
+ background: rgba(11, 19, 31, 0.85);
345
+ border: 1px solid var(--rule);
346
+ color: var(--vellum-soft);
347
+ text-transform: uppercase;
348
+ letter-spacing: 0.1em;
349
+ }
350
+ .atlas-submodule-index__role {
351
+ margin: 6px 14px 12px;
352
+ font-size: 12.5px;
353
+ color: var(--vellum-muted);
354
+ line-height: 1.5;
355
+ }
73
356
 
74
- /* ---- SVG macro ---- */
75
- .m-cluster__bg { fill: rgba(15, 23, 42, 0.55); stroke: var(--border); stroke-width: 1; }
76
- .m-cluster__title { font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; fill: var(--text); font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; }
357
+ /* =================================================================
358
+ SVG macro nodes & edges
359
+ ================================================================= */
360
+ .m-cluster__bg {
361
+ fill: rgba(11, 19, 31, 0.55);
362
+ stroke: rgba(237, 231, 216, 0.08);
363
+ stroke-width: 1;
364
+ }
365
+ .m-cluster__title {
366
+ font-family: var(--font-mono);
367
+ font-size: 12px;
368
+ fill: var(--vellum-muted);
369
+ font-weight: 600;
370
+ letter-spacing: 0.22em;
371
+ text-transform: uppercase;
372
+ }
77
373
  .m-node { cursor: pointer; }
78
- .m-node rect { fill: var(--panel-soft); stroke: var(--border); stroke-width: 1; transition: stroke 120ms ease, fill 120ms ease; }
374
+ .m-node rect {
375
+ fill: rgba(6, 11, 18, 0.92);
376
+ stroke: var(--rule);
377
+ stroke-width: 1;
378
+ transition: stroke 160ms ease, fill 160ms ease, filter 160ms ease;
379
+ }
79
380
  .m-node:hover rect,
80
381
  .m-node:focus rect,
81
- .m-node:focus-visible rect { stroke: var(--accent); stroke-width: 1.6; fill: rgba(56, 189, 248, 0.08); }
382
+ .m-node:focus-visible rect {
383
+ stroke: var(--accent);
384
+ stroke-width: 1.6;
385
+ fill: rgba(102, 229, 199, 0.08);
386
+ filter: drop-shadow(0 0 14px rgba(102, 229, 199, 0.35));
387
+ }
82
388
  .m-node:focus { outline: none; }
83
- .m-node__title { font-size: 13px; font-weight: 600; fill: var(--text); }
84
- .m-node__kind { font-size: 11px; fill: var(--muted); }
85
- .m-node__role { font-size: 11px; fill: var(--muted); }
389
+ .m-node__title {
390
+ font-family: var(--font-display);
391
+ font-size: 15px;
392
+ font-weight: 500;
393
+ fill: var(--vellum);
394
+ letter-spacing: -0.01em;
395
+ }
396
+ .m-node__kind {
397
+ font-family: var(--font-mono);
398
+ font-size: 10px;
399
+ fill: var(--vellum-muted);
400
+ text-transform: uppercase;
401
+ letter-spacing: 0.22em;
402
+ }
403
+ .m-node__role {
404
+ font-family: var(--font-ui);
405
+ font-size: 11.5px;
406
+ fill: var(--vellum-soft);
407
+ }
86
408
  .m-node:hover .m-node__title,
87
409
  .m-node:focus .m-node__title { fill: var(--accent); }
88
410
 
@@ -92,13 +414,13 @@ p { line-height: 1.55; color: var(--text); }
92
414
  .m-node--db rect { stroke: var(--kind-db); }
93
415
  .m-node--pure-fn rect { stroke: var(--kind-pure-fn); }
94
416
  .m-node--queue rect { stroke: var(--kind-queue); }
95
- .m-node--external rect { stroke: var(--kind-external); }
417
+ .m-node--external rect { stroke: var(--kind-external); stroke-dasharray: 5 4; }
96
418
 
97
419
  .m-edge path { stroke-width: 1.6; }
98
420
  .m-edge--call path { stroke: var(--edge-call); }
99
421
  .m-edge--return path { stroke: var(--edge-return); stroke-dasharray: 6 4; }
100
422
  .m-edge--data-row path { stroke: var(--edge-data-row); }
101
- .m-edge--failure path { stroke: var(--edge-failure); }
423
+ .m-edge--failure path { stroke: var(--edge-failure); stroke-dasharray: 3 3; }
102
424
 
103
425
  .m-arrow path { fill: currentColor; }
104
426
  .m-arrow--call { color: var(--edge-call); }
@@ -106,56 +428,322 @@ p { line-height: 1.55; color: var(--text); }
106
428
  .m-arrow--data-row { color: var(--edge-data-row); }
107
429
  .m-arrow--failure { color: var(--edge-failure); }
108
430
 
109
- .m-edge__label { fill: var(--muted); font-size: 11px; }
110
-
111
- /* ---- feature page ---- */
112
- .feature-header, .submodule-header { padding: 24px 40px 12px; border-bottom: 1px solid var(--border); background: var(--panel); }
113
- .feature-breadcrumb, .submodule-breadcrumb { font-size: 13px; color: var(--muted); margin-bottom: 8px; }
114
- .feature-depends { font-size: 13px; color: var(--muted); margin: 8px 0 0; }
115
- .feature-main, .submodule-main { padding: 24px 40px 48px; display: flex; flex-direction: column; gap: 32px; }
116
- .feature-story p { max-width: 80ch; }
117
-
118
- .submodule-nav { list-style: none; padding: 0; margin: 0; display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); }
119
- .submodule-card { background: var(--panel); border: 1px solid var(--border); border-radius: 10px; padding: 12px 14px; }
120
- .submodule-card__link { display: flex; align-items: center; justify-content: space-between; color: inherit; font-weight: 600; }
121
- .submodule-card__kind { font-size: 11px; padding: 2px 8px; border-radius: 999px; border: 1px solid var(--border); color: var(--muted); }
122
- .submodule-card__role { margin: 8px 0 0; font-size: 13px; color: var(--muted); }
123
-
124
- .feature-edges__list { list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 8px; }
125
- .feature-edges__item { display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 2fr); gap: 8px; padding: 8px 12px; background: var(--panel); border: 1px solid var(--border); border-radius: 8px; font-size: 13px; }
126
- .feature-edges__kind { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; align-self: center; }
127
- .feature-edges__item--call { border-left: 4px solid var(--edge-call); }
128
- .feature-edges__item--return { border-left: 4px solid var(--edge-return); }
129
- .feature-edges__item--data-row { border-left: 4px solid var(--edge-data-row); }
130
- .feature-edges__item--failure { border-left: 4px solid var(--edge-failure); }
131
-
132
- /* ---- submodule page ---- */
133
- .submodule-kind { display: inline-block; font-size: 12px; padding: 2px 10px; border-radius: 999px; border: 1px solid var(--border); color: var(--muted); margin-left: 8px; vertical-align: middle; text-transform: uppercase; letter-spacing: 0.06em; }
134
- .submodule-role { color: var(--muted); margin: 8px 0 0; max-width: 80ch; }
135
-
136
- .sub-table { width: 100%; border-collapse: collapse; font-size: 13px; }
137
- .sub-table th, .sub-table td { padding: 8px 12px; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }
138
- .sub-table th { font-size: 11px; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; background: var(--panel); }
139
-
140
- .sub-section__empty { color: var(--muted); font-style: italic; font-size: 13px; }
141
-
142
- .sub-dataflow__canvas { position: relative; background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; }
143
- .sub-dataflow__toolbar { position: absolute; top: 16px; right: 16px; display: flex; gap: 4px; z-index: 2; }
144
- .sub-dataflow__toolbar button { background: var(--panel-soft); color: var(--text); border: 1px solid var(--border); padding: 4px 12px; border-radius: 6px; cursor: pointer; font-size: 13px; }
145
- .sub-dataflow__toolbar button:hover { border-color: var(--accent); color: var(--accent); }
146
- .sub-dataflow__viewport { width: 100%; max-height: 60vh; overflow: hidden; border-radius: 8px; background: #0b1220; }
431
+ .m-edge__label {
432
+ fill: var(--vellum-soft);
433
+ font-family: var(--font-mono);
434
+ font-size: 11px;
435
+ letter-spacing: 0.02em;
436
+ }
437
+
438
+ /* =================================================================
439
+ feature page
440
+ ================================================================= */
441
+ .feature-header, .submodule-header {
442
+ position: relative;
443
+ padding: 52px 56px 28px;
444
+ border-bottom: 1px solid var(--rule-soft);
445
+ z-index: 1;
446
+ }
447
+ .feature-breadcrumb, .submodule-breadcrumb {
448
+ font-family: var(--font-mono);
449
+ font-size: 11px;
450
+ letter-spacing: 0.22em;
451
+ color: var(--vellum-muted);
452
+ text-transform: uppercase;
453
+ margin-bottom: 22px;
454
+ }
455
+ .feature-breadcrumb a, .submodule-breadcrumb a { color: var(--accent); }
456
+ .feature-depends {
457
+ font-family: var(--font-mono);
458
+ font-size: 12px;
459
+ color: var(--vellum-muted);
460
+ margin: 18px 0 0;
461
+ }
462
+ .feature-main, .submodule-main {
463
+ position: relative;
464
+ padding: 36px 56px 64px;
465
+ display: flex;
466
+ flex-direction: column;
467
+ gap: 40px;
468
+ z-index: 1;
469
+ }
470
+ .feature-story p {
471
+ font-family: var(--font-display);
472
+ font-size: 19px;
473
+ font-weight: 350;
474
+ line-height: 1.6;
475
+ max-width: 70ch;
476
+ color: var(--vellum-soft);
477
+ }
478
+
479
+ .submodule-nav {
480
+ list-style: none;
481
+ padding: 0;
482
+ margin: 0;
483
+ display: grid;
484
+ gap: 16px;
485
+ grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
486
+ }
487
+ .submodule-card {
488
+ background: linear-gradient(180deg, rgba(31, 54, 81, 0.42), rgba(15, 27, 42, 0.65));
489
+ border: 1px solid var(--rule);
490
+ border-radius: 14px;
491
+ padding: 18px 18px 16px;
492
+ transition: transform 160ms ease, border-color 160ms ease;
493
+ }
494
+ .submodule-card:hover { transform: translateY(-2px); border-color: var(--accent); }
495
+ .submodule-card__link {
496
+ display: flex;
497
+ align-items: center;
498
+ justify-content: space-between;
499
+ color: var(--vellum);
500
+ font-family: var(--font-display);
501
+ font-weight: 500;
502
+ font-size: 18px;
503
+ }
504
+ .submodule-card__name { letter-spacing: -0.01em; }
505
+ .submodule-card__kind {
506
+ font-family: var(--font-mono);
507
+ font-size: 10px;
508
+ padding: 3px 10px;
509
+ border-radius: 999px;
510
+ border: 1px solid var(--rule);
511
+ color: var(--vellum-soft);
512
+ text-transform: uppercase;
513
+ letter-spacing: 0.1em;
514
+ }
515
+ .submodule-card__role {
516
+ margin: 10px 0 0;
517
+ font-size: 13px;
518
+ color: var(--vellum-muted);
519
+ line-height: 1.5;
520
+ }
521
+
522
+ .feature-edges__list {
523
+ list-style: none;
524
+ padding: 0;
525
+ margin: 0;
526
+ display: flex;
527
+ flex-direction: column;
528
+ gap: 10px;
529
+ }
530
+ .feature-edges__item {
531
+ display: grid;
532
+ grid-template-columns: minmax(0, 1.4fr) auto minmax(0, 2.2fr);
533
+ gap: 12px;
534
+ padding: 12px 16px;
535
+ background: rgba(15, 27, 42, 0.55);
536
+ border: 1px solid var(--rule);
537
+ border-radius: 12px;
538
+ font-size: 13px;
539
+ align-items: center;
540
+ }
541
+ .feature-edges__endpoints { font-family: var(--font-mono); color: var(--vellum); }
542
+ .feature-edges__kind {
543
+ font-family: var(--font-mono);
544
+ font-size: 10px;
545
+ color: var(--vellum-muted);
546
+ text-transform: uppercase;
547
+ letter-spacing: 0.18em;
548
+ }
549
+ .feature-edges__label { color: var(--vellum-soft); }
550
+ .feature-edges__item--call { border-left: 3px solid var(--edge-call); }
551
+ .feature-edges__item--return { border-left: 3px solid var(--edge-return); }
552
+ .feature-edges__item--data-row { border-left: 3px solid var(--edge-data-row); }
553
+ .feature-edges__item--failure { border-left: 3px solid var(--edge-failure); }
554
+
555
+ /* =================================================================
556
+ submodule page
557
+ ================================================================= */
558
+ .submodule-kind {
559
+ display: inline-block;
560
+ font-family: var(--font-mono);
561
+ font-size: 11px;
562
+ padding: 4px 12px;
563
+ border-radius: 999px;
564
+ border: 1px solid var(--rule);
565
+ color: var(--accent);
566
+ margin-left: 14px;
567
+ vertical-align: middle;
568
+ text-transform: uppercase;
569
+ letter-spacing: 0.18em;
570
+ }
571
+ .submodule-role {
572
+ color: var(--vellum-soft);
573
+ margin: 14px 0 0;
574
+ max-width: 70ch;
575
+ font-family: var(--font-display);
576
+ font-size: 17px;
577
+ font-weight: 350;
578
+ line-height: 1.55;
579
+ }
580
+
581
+ .sub-table {
582
+ width: 100%;
583
+ border-collapse: collapse;
584
+ font-size: 13px;
585
+ background: rgba(15, 27, 42, 0.55);
586
+ border: 1px solid var(--rule);
587
+ border-radius: 12px;
588
+ overflow: hidden;
589
+ }
590
+ .sub-table th, .sub-table td {
591
+ padding: 12px 16px;
592
+ border-bottom: 1px solid var(--rule-soft);
593
+ text-align: left;
594
+ vertical-align: top;
595
+ }
596
+ .sub-table tr:last-child td { border-bottom: none; }
597
+ .sub-table th {
598
+ font-family: var(--font-mono);
599
+ font-size: 10px;
600
+ color: var(--vellum-muted);
601
+ text-transform: uppercase;
602
+ letter-spacing: 0.16em;
603
+ background: rgba(6, 11, 18, 0.7);
604
+ }
605
+ .sub-table td { color: var(--vellum-soft); font-family: var(--font-mono); }
606
+ .sub-table td:first-child { color: var(--vellum); }
607
+
608
+ .sub-section__empty {
609
+ color: var(--vellum-muted);
610
+ font-style: italic;
611
+ font-size: 13px;
612
+ padding: 14px 18px;
613
+ background: rgba(15, 27, 42, 0.4);
614
+ border: 1px dashed var(--rule);
615
+ border-radius: 12px;
616
+ font-family: var(--font-display);
617
+ }
618
+
619
+ .sub-dataflow__canvas {
620
+ position: relative;
621
+ background: linear-gradient(180deg, rgba(15, 27, 42, 0.92), rgba(11, 19, 31, 0.92));
622
+ border: 1px solid var(--rule);
623
+ border-radius: 18px;
624
+ padding: 0;
625
+ box-shadow: var(--shadow-card);
626
+ overflow: hidden;
627
+ }
628
+ .sub-dataflow__canvas::before {
629
+ content: 'INTERNAL FLOW';
630
+ position: absolute;
631
+ top: 18px;
632
+ left: 22px;
633
+ font-family: var(--font-mono);
634
+ font-size: 10px;
635
+ letter-spacing: 0.28em;
636
+ color: var(--accent);
637
+ z-index: 3;
638
+ }
639
+ .sub-dataflow__toolbar {
640
+ position: absolute;
641
+ top: 12px;
642
+ right: 14px;
643
+ display: flex;
644
+ gap: 4px;
645
+ z-index: 3;
646
+ background: rgba(6, 11, 18, 0.65);
647
+ border: 1px solid var(--rule);
648
+ border-radius: 10px;
649
+ padding: 4px;
650
+ -webkit-backdrop-filter: blur(6px);
651
+ backdrop-filter: blur(6px);
652
+ }
653
+ .sub-dataflow__toolbar button {
654
+ background: transparent;
655
+ color: var(--vellum-soft);
656
+ border: 0;
657
+ padding: 4px 12px;
658
+ border-radius: 6px;
659
+ cursor: pointer;
660
+ font-family: var(--font-mono);
661
+ font-size: 11px;
662
+ letter-spacing: 0.08em;
663
+ }
664
+ .sub-dataflow__toolbar button:hover { background: var(--ink-3); color: var(--accent); }
665
+
666
+ .sub-dataflow__viewport {
667
+ position: relative;
668
+ width: 100%;
669
+ height: clamp(480px, 64vh, 720px);
670
+ overflow: hidden;
671
+ margin-top: 44px;
672
+ background:
673
+ radial-gradient(circle at 50% 38%, rgba(102, 229, 199, 0.05), transparent 60%),
674
+ linear-gradient(180deg, #05101B, #03080F);
675
+ }
676
+ .sub-dataflow__viewport::after {
677
+ content: '';
678
+ position: absolute;
679
+ inset: 0;
680
+ background-image:
681
+ linear-gradient(to right, rgba(237, 231, 216, 0.04) 1px, transparent 1px),
682
+ linear-gradient(to bottom, rgba(237, 231, 216, 0.04) 1px, transparent 1px);
683
+ background-size: 32px 32px;
684
+ pointer-events: none;
685
+ }
147
686
  .sub-dataflow__viewport.is-grabbing { cursor: grabbing; }
148
687
  .sub-dataflow__viewport:not(.is-grabbing) { cursor: grab; }
149
- .sub-dataflow__svg { width: 100%; height: auto; max-height: 60vh; display: block; user-select: none; touch-action: none; }
150
- .sub-dataflow__badge { fill: var(--panel-soft); stroke: var(--accent); stroke-width: 1.4; }
151
- .sub-dataflow__badge-text { font-family: ui-sans-serif, system-ui, sans-serif; font-size: 13px; font-weight: 600; fill: var(--accent); }
152
- .sub-dataflow__step .sub-dataflow__box { fill: var(--panel-soft); stroke: var(--border); stroke-width: 1; }
688
+ .sub-dataflow__svg {
689
+ position: relative;
690
+ z-index: 1;
691
+ width: 100%;
692
+ height: 100%;
693
+ display: block;
694
+ user-select: none;
695
+ touch-action: none;
696
+ overflow: visible;
697
+ }
698
+ .sub-dataflow__badge { fill: rgba(102, 229, 199, 0.12); stroke: var(--accent); stroke-width: 1.5; }
699
+ .sub-dataflow__badge-text {
700
+ font-family: var(--font-mono);
701
+ font-size: 14px;
702
+ font-weight: 600;
703
+ fill: var(--accent);
704
+ letter-spacing: 0.04em;
705
+ }
706
+ .sub-dataflow__step .sub-dataflow__box {
707
+ fill: rgba(15, 27, 42, 0.78);
708
+ stroke: var(--rule);
709
+ stroke-width: 1;
710
+ filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.35));
711
+ }
153
712
  .sub-dataflow__step:hover .sub-dataflow__box { stroke: var(--accent); }
154
- .sub-dataflow__text { font-family: ui-sans-serif, system-ui, sans-serif; font-size: 14px; fill: var(--text); }
155
- .sub-dataflow__arrow { stroke: var(--muted); stroke-width: 1.6; }
156
- .sub-dataflow__fn-bg { fill: rgba(56, 189, 248, 0.12); stroke: var(--accent); stroke-width: 1; }
157
- .sub-dataflow__fn-text { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; font-weight: 600; fill: var(--accent); letter-spacing: 0.02em; }
158
- .sub-dataflow__chip { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; font-weight: 500; }
713
+ .sub-dataflow__text {
714
+ font-family: var(--font-display);
715
+ font-size: 15px;
716
+ font-weight: 400;
717
+ fill: var(--vellum);
718
+ }
719
+ .sub-dataflow__arrow { stroke: var(--accent); stroke-width: 1.5; opacity: 0.7; }
720
+ .sub-dataflow__fn-bg { fill: rgba(102, 229, 199, 0.16); stroke: var(--accent); stroke-width: 1; }
721
+ .sub-dataflow__fn-text {
722
+ font-family: var(--font-mono);
723
+ font-size: 11px;
724
+ font-weight: 600;
725
+ fill: var(--accent);
726
+ letter-spacing: 0.04em;
727
+ }
728
+ .sub-dataflow__chip {
729
+ font-family: var(--font-mono);
730
+ font-size: 11px;
731
+ font-weight: 500;
732
+ }
159
733
  .sub-dataflow__chip--reads { fill: var(--kind-service); }
160
734
  .sub-dataflow__chip--writes { fill: var(--kind-db); }
161
- .sub-dataflow__empty { color: var(--muted); font-style: italic; }
735
+ .sub-dataflow__empty {
736
+ color: var(--vellum-muted);
737
+ font-style: italic;
738
+ padding: 14px 18px;
739
+ border: 1px dashed var(--rule);
740
+ border-radius: 12px;
741
+ font-family: var(--font-display);
742
+ }
743
+
744
+ @media (max-width: 960px) {
745
+ .atlas-header, .feature-header, .submodule-header { padding: 40px 28px 24px; }
746
+ .atlas-header::before { left: 28px; }
747
+ .atlas-main { grid-template-columns: 1fr; padding: 24px 28px 48px; gap: 22px; }
748
+ .feature-main, .submodule-main { padding: 28px 28px 48px; gap: 32px; }
749
+ }