This repository has no description
30 kB
1164 lines
1export const LANDING_PAGE = `<!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>Stigmergic</title>
7 <style>
8 :root {
9 --bg: #0d1117;
10 --surface: #161b22;
11 --border: #30363d;
12 --text: #e6edf3;
13 --text-muted: #8b949e;
14 --accent: #58a6ff;
15 --accent-hover: #79c0ff;
16 --green: #3fb950;
17 --red: #f85149;
18 --yellow: #d29922;
19 --purple: #bc8cff;
20 }
21 * { margin: 0; padding: 0; box-sizing: border-box; }
22 body {
23 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
24 background: var(--bg);
25 color: var(--text);
26 line-height: 1.6;
27 min-height: 100vh;
28 }
29 header {
30 border-bottom: 1px solid var(--border);
31 padding: 1rem 2rem;
32 display: flex;
33 align-items: baseline;
34 gap: 1.5rem;
35 flex-wrap: wrap;
36 }
37 header h1 {
38 font-size: 1.25rem;
39 font-weight: 600;
40 color: var(--accent);
41 }
42 .header-blurb {
43 font-size: 0.75rem;
44 color: var(--text-muted);
45 }
46 .header-blurb code {
47 font-size: 0.6875rem;
48 background: var(--surface);
49 padding: 0.125rem 0.375rem;
50 border-radius: 4px;
51 }
52 header nav { display: flex; gap: 1rem; align-items: center; }
53 header nav a, header nav button {
54 color: var(--text-muted);
55 text-decoration: none;
56 font-size: 0.875rem;
57 background: none;
58 border: none;
59 cursor: pointer;
60 padding: 0.25rem 0.75rem;
61 border-radius: 6px;
62 }
63 header nav a:hover, header nav button:hover {
64 color: var(--text);
65 background: var(--surface);
66 }
67 main {
68 max-width: 960px;
69 margin: 0 auto;
70 padding: 2rem;
71 }
72 .search-bar {
73 display: flex;
74 max-width: 480px;
75 margin: 0 auto 2rem;
76 }
77 .search-bar input {
78 flex: 1;
79 padding: 0.625rem 1rem;
80 border: 1px solid var(--border);
81 border-radius: 6px 0 0 6px;
82 background: var(--surface);
83 color: var(--text);
84 font-size: 0.875rem;
85 outline: none;
86 }
87 .search-bar input:focus { border-color: var(--accent); }
88 .search-bar button {
89 padding: 0.625rem 1.25rem;
90 background: var(--accent);
91 color: #fff;
92 border: none;
93 border-radius: 0 6px 6px 0;
94 cursor: pointer;
95 font-size: 0.875rem;
96 font-weight: 500;
97 }
98 .search-bar button:hover { background: var(--accent-hover); }
99 .search-hint {
100 text-align: center;
101 color: var(--text-muted);
102 font-size: 0.75rem;
103 margin-bottom: 2rem;
104 }
105
106 /* Explore layout */
107 .explore-page {
108 display: grid;
109 grid-template-columns: 1fr 240px;
110 gap: 2rem;
111 }
112 .explore-header {
113 display: flex;
114 justify-content: space-between;
115 align-items: center;
116 margin-bottom: 1rem;
117 }
118 .explore-header h2 {
119 font-size: 1.25rem;
120 color: var(--text);
121 }
122 .explore-sidebar h3 {
123 font-size: 0.875rem;
124 color: var(--text-muted);
125 margin-bottom: 0.75rem;
126 }
127 .collections-sidebar {
128 display: flex;
129 flex-direction: column;
130 gap: 0.5rem;
131 }
132 .sidebar-collection {
133 display: flex;
134 flex-direction: column;
135 padding: 0.5rem 0.75rem;
136 border-radius: 6px;
137 text-decoration: none;
138 color: inherit;
139 border: 1px solid transparent;
140 }
141 .sidebar-collection:hover {
142 background: var(--surface);
143 border-color: var(--border);
144 }
145 .sidebar-name { font-size: 0.8125rem; font-weight: 500; }
146 .sidebar-handle { font-size: 0.6875rem; color: var(--text-muted); }
147 .sidebar-empty { color: var(--text-muted); font-size: 0.75rem; }
148
149 /* Face feed */
150 .face-feed {
151 display: flex;
152 flex-direction: column;
153 gap: 1rem;
154 }
155 .face-card {
156 background: var(--surface);
157 border: 1px solid var(--border);
158 border-radius: 10px;
159 padding: 1rem 1.25rem;
160 transition: border-color 0.15s;
161 }
162 .face-card:hover { border-color: var(--accent); }
163 .face-top {
164 display: flex;
165 justify-content: space-between;
166 align-items: flex-start;
167 gap: 0.75rem;
168 margin-bottom: 0.5rem;
169 }
170 .face-header {
171 display: flex;
172 align-items: flex-start;
173 gap: 0.625rem;
174 text-decoration: none;
175 color: inherit;
176 flex: 1;
177 min-width: 0;
178 }
179 .face-header:hover .face-title { color: var(--accent); }
180 .face-favicon {
181 width: 20px;
182 height: 20px;
183 border-radius: 3px;
184 margin-top: 2px;
185 flex-shrink: 0;
186 }
187 .face-title-block { min-width: 0; }
188 .face-title {
189 font-size: 0.9375rem;
190 font-weight: 600;
191 color: var(--text);
192 line-height: 1.3;
193 overflow: hidden;
194 text-overflow: ellipsis;
195 white-space: nowrap;
196 }
197 .face-site {
198 font-size: 0.6875rem;
199 color: var(--text-muted);
200 }
201 .face-actions {
202 display: flex;
203 align-items: center;
204 gap: 0.5rem;
205 flex-shrink: 0;
206 }
207 .face-degree {
208 font-size: 0.625rem;
209 padding: 0.125rem 0.375rem;
210 border-radius: 8px;
211 background: var(--border);
212 color: var(--text-muted);
213 font-weight: 600;
214 }
215 .face-action-btn {
216 color: var(--text-muted);
217 font-size: 0.6875rem;
218 text-decoration: none;
219 }
220 .face-action-btn:hover { color: var(--accent); }
221 .face-desc {
222 font-size: 0.8125rem;
223 color: var(--text-muted);
224 line-height: 1.4;
225 margin-bottom: 0.75rem;
226 overflow: hidden;
227 text-overflow: ellipsis;
228 display: -webkit-box;
229 -webkit-line-clamp: 2;
230 -webkit-box-orient: vertical;
231 }
232
233 /* Face edges */
234 .face-edges {
235 display: flex;
236 gap: 1rem;
237 flex-wrap: wrap;
238 }
239 .face-neighbors {
240 flex: 1;
241 min-width: 200px;
242 }
243 .face-neighbors.incoming {
244 border-left: 2px solid var(--green);
245 padding-left: 0.75rem;
246 }
247 .face-neighbors.outgoing {
248 border-left: 2px solid var(--accent);
249 padding-left: 0.75rem;
250 }
251 .neighbors-label {
252 font-size: 0.625rem;
253 color: var(--text-muted);
254 text-transform: uppercase;
255 letter-spacing: 0.05em;
256 margin-bottom: 0.375rem;
257 font-weight: 600;
258 }
259 .face-neighbors.incoming .neighbors-label { color: var(--green); }
260 .face-neighbors.outgoing .neighbors-label { color: var(--accent); }
261 .neighbors-list {
262 display: flex;
263 flex-direction: column;
264 gap: 0.25rem;
265 }
266 .neighbor-pill {
267 display: flex;
268 align-items: center;
269 gap: 0.375rem;
270 text-decoration: none;
271 color: inherit;
272 padding: 0.25rem 0.5rem;
273 border-radius: 6px;
274 background: var(--bg);
275 border: 1px solid transparent;
276 transition: border-color 0.1s;
277 }
278 .neighbor-pill:hover { border-color: var(--border); }
279 .neighbor-pill:hover .pill-title { color: var(--accent); }
280 .pill-favicon {
281 width: 14px;
282 height: 14px;
283 border-radius: 2px;
284 flex-shrink: 0;
285 }
286 .pill-type {
287 font-size: 0.625rem;
288 color: var(--text-muted);
289 flex-shrink: 0;
290 }
291 .pill-title {
292 font-size: 0.75rem;
293 color: var(--text);
294 overflow: hidden;
295 text-overflow: ellipsis;
296 white-space: nowrap;
297 }
298
299 /* Connection items (resource page) */
300 .connection-item {
301 background: var(--surface);
302 border: 1px solid var(--border);
303 border-radius: 8px;
304 padding: 1rem 1.25rem;
305 transition: border-color 0.15s;
306 }
307 .connection-item:hover { border-color: var(--accent); }
308 .connection-item.compact {
309 padding: 0.5rem 0.75rem;
310 display: flex;
311 align-items: center;
312 gap: 0.5rem;
313 flex-wrap: wrap;
314 background: var(--bg);
315 border-radius: 6px;
316 }
317 .conn-type-badge {
318 font-size: 0.6875rem;
319 padding: 0.125rem 0.5rem;
320 border-radius: 12px;
321 background: var(--border);
322 color: var(--text);
323 }
324 .conn-uri {
325 color: var(--accent);
326 text-decoration: none;
327 font-size: 0.875rem;
328 font-weight: 500;
329 word-break: break-all;
330 }
331 .conn-uri:hover { text-decoration: underline; }
332 .conn-site {
333 font-size: 0.625rem;
334 color: var(--text-muted);
335 }
336 .conn-note-inline {
337 color: var(--text-muted);
338 font-size: 0.75rem;
339 }
340 .conn-handle-inline {
341 color: var(--text-muted);
342 font-size: 0.6875rem;
343 margin-left: auto;
344 }
345
346 /* Resource page header card */
347 .resource-header-card {
348 display: flex;
349 gap: 1rem;
350 padding: 1.25rem;
351 background: var(--surface);
352 border: 1px solid var(--border);
353 border-radius: 8px;
354 margin-bottom: 1rem;
355 }
356 .resource-favicon {
357 width: 32px;
358 height: 32px;
359 border-radius: 4px;
360 flex-shrink: 0;
361 }
362 .resource-meta { min-width: 0; }
363 .resource-title {
364 font-size: 1.125rem;
365 font-weight: 600;
366 color: var(--text);
367 margin-bottom: 0.25rem;
368 line-height: 1.3;
369 }
370 .resource-site {
371 font-size: 0.75rem;
372 color: var(--text-muted);
373 margin-bottom: 0.375rem;
374 }
375 .resource-desc {
376 font-size: 0.8125rem;
377 color: var(--text-muted);
378 line-height: 1.4;
379 }
380
381 /* Strata button */
382 .strata-btn {
383 background: none;
384 border: 1px solid var(--purple);
385 color: var(--purple);
386 font-size: 0.6875rem;
387 padding: 0.125rem 0.5rem;
388 border-radius: 4px;
389 cursor: pointer;
390 font-weight: 500;
391 }
392 .strata-btn:hover { background: var(--purple); color: #fff; }
393 .strata-btn.compact {
394 font-size: 0.625rem;
395 padding: 0.0625rem 0.375rem;
396 margin-left: auto;
397 }
398
399 /* Modal */
400 .modal-overlay {
401 position: fixed;
402 top: 0; left: 0; right: 0; bottom: 0;
403 background: rgba(0,0,0,0.6);
404 display: flex;
405 align-items: center;
406 justify-content: center;
407 z-index: 1000;
408 }
409 .modal-content {
410 background: var(--surface);
411 border: 1px solid var(--border);
412 border-radius: 12px;
413 max-width: 560px;
414 width: 90%;
415 max-height: 80vh;
416 overflow-y: auto;
417 padding: 1.5rem;
418 }
419 .modal-wide {
420 max-width: 720px;
421 }
422 .modal-header {
423 display: flex;
424 justify-content: space-between;
425 align-items: center;
426 margin-bottom: 1rem;
427 }
428 .modal-header h2 {
429 font-size: 1rem;
430 color: var(--purple);
431 }
432 .modal-close {
433 background: none;
434 border: none;
435 color: var(--text-muted);
436 font-size: 1.5rem;
437 cursor: pointer;
438 line-height: 1;
439 }
440 .modal-close:hover { color: var(--text); }
441
442 /* Analysis results */
443 .analysis-loading {
444 text-align: center;
445 color: var(--text-muted);
446 padding: 2rem;
447 }
448 .spinner {
449 width: 24px;
450 height: 24px;
451 border: 2px solid var(--border);
452 border-top-color: var(--purple);
453 border-radius: 50%;
454 animation: spin 0.8s linear infinite;
455 margin: 0 auto 0.75rem;
456 }
457 @keyframes spin { to { transform: rotate(360deg); } }
458
459 .analysis-face-header {
460 display: flex;
461 justify-content: space-between;
462 align-items: flex-start;
463 margin-bottom: 0.5rem;
464 }
465 .analysis-face-title {
466 font-size: 1.0625rem;
467 font-weight: 600;
468 color: var(--text);
469 line-height: 1.3;
470 flex: 1;
471 min-width: 0;
472 }
473 .analysis-face-degree {
474 font-size: 0.6875rem;
475 padding: 0.125rem 0.5rem;
476 border-radius: 8px;
477 background: var(--border);
478 color: var(--text-muted);
479 font-weight: 600;
480 flex-shrink: 0;
481 margin-left: 0.75rem;
482 }
483 .analysis-face-desc {
484 font-size: 0.8125rem;
485 color: var(--text-muted);
486 line-height: 1.4;
487 margin-bottom: 0.75rem;
488 }
489 .analysis-type-badges {
490 display: flex;
491 flex-wrap: wrap;
492 gap: 0.375rem;
493 margin-bottom: 0.75rem;
494 }
495 .type-badge {
496 font-size: 0.625rem;
497 padding: 0.125rem 0.5rem;
498 border-radius: 8px;
499 background: var(--border);
500 color: var(--text);
501 }
502 .analysis-domains {
503 display: flex;
504 flex-wrap: wrap;
505 gap: 0.25rem;
506 margin-bottom: 1rem;
507 }
508 .domain-tag {
509 font-size: 0.625rem;
510 padding: 0.0625rem 0.375rem;
511 border-radius: 8px;
512 background: var(--bg);
513 border: 1px solid var(--border);
514 color: var(--text-muted);
515 }
516
517 .analysis-edges {
518 display: grid;
519 grid-template-columns: 1fr 1fr;
520 gap: 1rem;
521 margin-bottom: 1rem;
522 }
523 .analysis-neighbors h4 {
524 font-size: 0.6875rem;
525 text-transform: uppercase;
526 letter-spacing: 0.05em;
527 margin-bottom: 0.375rem;
528 font-weight: 600;
529 }
530 .analysis-neighbors.incoming h4 { color: var(--green); }
531 .analysis-neighbors.outgoing h4 { color: var(--accent); }
532 .analysis-neighbor {
533 display: flex;
534 align-items: center;
535 gap: 0.375rem;
536 padding: 0.25rem 0;
537 font-size: 0.75rem;
538 }
539 .neighbor-type {
540 color: var(--text-muted);
541 font-size: 0.625rem;
542 flex-shrink: 0;
543 }
544 .neighbor-link {
545 color: var(--accent);
546 text-decoration: none;
547 overflow: hidden;
548 text-overflow: ellipsis;
549 white-space: nowrap;
550 }
551 .neighbor-link:hover { text-decoration: underline; }
552 .neighbor-note {
553 color: var(--text-muted);
554 font-size: 0.625rem;
555 overflow: hidden;
556 text-overflow: ellipsis;
557 white-space: nowrap;
558 }
559
560 .analysis-section {
561 margin-bottom: 1.25rem;
562 }
563 .analysis-section h3 {
564 font-size: 0.875rem;
565 color: var(--text-muted);
566 margin-bottom: 0.5rem;
567 }
568 .citation-mini {
569 display: flex;
570 align-items: center;
571 gap: 0.5rem;
572 padding: 0.25rem 0;
573 }
574 .citation-mini-title {
575 font-size: 0.75rem;
576 color: var(--text);
577 }
578 .citation-mini-domain {
579 font-size: 0.625rem;
580 color: var(--text-muted);
581 }
582 .analysis-error {
583 color: var(--red);
584 padding: 1rem;
585 text-align: center;
586 }
587
588 /* Resource page */
589 .resource-page { }
590 .resource-uri {
591 font-size: 1rem;
592 color: var(--accent);
593 word-break: break-all;
594 margin-bottom: 1rem;
595 padding: 0.75rem 1rem;
596 background: var(--surface);
597 border: 1px solid var(--border);
598 border-radius: 6px;
599 }
600 .resource-actions {
601 display: flex;
602 gap: 0.75rem;
603 margin-bottom: 2rem;
604 }
605 .yoneda-section {
606 margin-bottom: 2rem;
607 }
608 .yoneda-section h3 {
609 font-size: 1rem;
610 margin-bottom: 0.75rem;
611 }
612 .yoneda-hint {
613 font-size: 0.6875rem;
614 color: var(--text-muted);
615 font-weight: 400;
616 }
617 .connection-list {
618 display: flex;
619 flex-direction: column;
620 gap: 0.5rem;
621 }
622
623 /* Graph page */
624 .graph-page { }
625 .graph-meta {
626 color: var(--text-muted);
627 font-size: 0.875rem;
628 margin-bottom: 2rem;
629 }
630 .graph-connections, .graph-nodes {
631 margin-bottom: 2rem;
632 }
633 .graph-connections h3, .graph-nodes h3 {
634 font-size: 1rem;
635 margin-bottom: 0.75rem;
636 }
637 .graph-node {
638 display: inline-block;
639 padding: 0.375rem 0.75rem;
640 margin: 0.25rem;
641 background: var(--surface);
642 border: 1px solid var(--border);
643 border-radius: 6px;
644 color: var(--accent);
645 text-decoration: none;
646 font-size: 0.8125rem;
647 }
648 .graph-node:hover { border-color: var(--accent); }
649
650 /* Connect page */
651 .connect-page { max-width: 600px; }
652 .connect-hint {
653 color: var(--text-muted);
654 font-size: 0.875rem;
655 margin-bottom: 1.5rem;
656 }
657 .connect-form {
658 display: flex;
659 flex-direction: column;
660 gap: 1rem;
661 }
662 .form-field {
663 display: flex;
664 flex-direction: column;
665 gap: 0.25rem;
666 }
667 .form-field label {
668 font-size: 0.875rem;
669 font-weight: 500;
670 }
671 .form-field input, .form-field textarea, .form-field select {
672 padding: 0.625rem 0.75rem;
673 border: 1px solid var(--border);
674 border-radius: 6px;
675 background: var(--surface);
676 color: var(--text);
677 font-size: 0.875rem;
678 outline: none;
679 font-family: inherit;
680 }
681 .form-field input:focus, .form-field textarea:focus, .form-field select:focus {
682 border-color: var(--accent);
683 }
684 .form-field textarea { resize: vertical; min-height: 80px; }
685 .form-actions {
686 display: flex;
687 gap: 0.75rem;
688 }
689 .action-btn {
690 display: inline-block;
691 padding: 0.5rem 1rem;
692 border-radius: 6px;
693 font-size: 0.875rem;
694 font-weight: 500;
695 text-decoration: none;
696 cursor: pointer;
697 background: var(--surface);
698 border: 1px solid var(--border);
699 color: var(--text);
700 }
701 .action-btn:hover { border-color: var(--accent); color: var(--accent); }
702 .action-btn.primary {
703 background: var(--accent);
704 border-color: var(--accent);
705 color: #fff;
706 }
707 .action-btn.primary:hover { background: var(--accent-hover); }
708 .connect-result {
709 margin-top: 1rem;
710 }
711 .connect-result pre {
712 background: var(--surface);
713 border: 1px solid var(--border);
714 border-radius: 6px;
715 padding: 1rem;
716 font-size: 0.8125rem;
717 overflow-x: auto;
718 }
719 .preview-hint {
720 color: var(--text-muted);
721 font-size: 0.75rem;
722 margin-top: 0.5rem;
723 }
724 .pending { color: var(--yellow); }
725
726 /* Shared */
727 .back-link {
728 color: var(--accent);
729 text-decoration: none;
730 font-size: 0.875rem;
731 display: inline-block;
732 margin-right: 1rem;
733 margin-bottom: 1rem;
734 }
735 .back-link:hover { text-decoration: underline; }
736 .empty {
737 text-align: center;
738 padding: 2rem;
739 color: var(--text-muted);
740 }
741 #auth-status { display: none; }
742 #auth-status.visible { display: inline; }
743 #login-btn { display: inline; }
744 #login-btn.hidden { display: none; }
745
746 /* ── Islands feed ─────────────────────────────────────────────── */
747 .islands-feed {
748 display: flex;
749 flex-direction: column;
750 gap: 1rem;
751 }
752 .island-card {
753 background: var(--surface);
754 border: 1px solid var(--border);
755 border-radius: 10px;
756 padding: 1rem 1.25rem;
757 transition: border-color 0.15s;
758 }
759 .island-card:hover { border-color: var(--accent); }
760 .island-graph {
761 width: 100%;
762 height: 320px;
763 border-radius: 6px 6px 0 0;
764 background: var(--bg);
765 cursor: default;
766 }
767 .island-summary {
768 font-size: 0.85rem;
769 color: var(--fg-muted);
770 line-height: 1.4;
771 margin: 0;
772 padding: 0.75rem 1rem;
773 border-top: 1px solid var(--border);
774 }
775 .island-graph-large {
776 width: 100%;
777 height: 400px;
778 border-radius: 8px;
779 background: var(--bg);
780 margin-bottom: 1.5rem;
781 border: 1px solid var(--border);
782 cursor: default;
783 }
784 .island-header {
785 display: flex;
786 justify-content: space-between;
787 align-items: center;
788 margin-bottom: 0.75rem;
789 }
790 .island-size {
791 font-size: 0.75rem;
792 color: var(--text-muted);
793 font-weight: 500;
794 }
795 .island-vertices {
796 display: flex;
797 flex-direction: column;
798 gap: 0.375rem;
799 margin-bottom: 0.5rem;
800 }
801 .island-vertex {
802 display: flex;
803 flex-direction: column;
804 gap: 0.125rem;
805 }
806 .vertex-link {
807 color: var(--accent);
808 text-decoration: none;
809 font-size: 0.875rem;
810 font-weight: 500;
811 overflow: hidden;
812 text-overflow: ellipsis;
813 white-space: nowrap;
814 }
815 .vertex-link:hover { text-decoration: underline; }
816 .vertex-title {
817 font-size: 0.875rem;
818 font-weight: 500;
819 color: var(--text);
820 overflow: hidden;
821 text-overflow: ellipsis;
822 white-space: nowrap;
823 }
824 .vertex-desc {
825 font-size: 0.75rem;
826 color: var(--text-muted);
827 overflow: hidden;
828 text-overflow: ellipsis;
829 white-space: nowrap;
830 }
831 .island-more {
832 font-size: 0.6875rem;
833 color: var(--text-muted);
834 margin-bottom: 0.5rem;
835 }
836 .island-edge-types {
837 display: flex;
838 flex-wrap: wrap;
839 gap: 0.375rem;
840 margin-bottom: 0.5rem;
841 }
842 .edge-type-badge {
843 font-size: 0.625rem;
844 padding: 0.125rem 0.5rem;
845 border-radius: 8px;
846 background: var(--border);
847 color: var(--text);
848 }
849 .island-notes {
850 display: flex;
851 flex-direction: column;
852 gap: 0.25rem;
853 }
854 .island-note {
855 font-size: 0.75rem;
856 color: var(--text-muted);
857 font-style: italic;
858 }
859
860 /* ── Island detail page ───────────────────────────────────────── */
861 .island-detail { }
862 .island-meta {
863 color: var(--text-muted);
864 font-size: 0.875rem;
865 margin-bottom: 1.5rem;
866 }
867 .pds-link {
868 color: var(--accent);
869 text-decoration: none;
870 font-size: 0.8rem;
871 }
872 .pds-link:hover { text-decoration: underline; }
873 .island-section {
874 margin-bottom: 1.5rem;
875 }
876 .island-section h3 {
877 font-size: 0.9375rem;
878 margin-bottom: 0.75rem;
879 }
880 .island-edge-detail {
881 display: flex;
882 align-items: center;
883 gap: 0.5rem;
884 flex-wrap: wrap;
885 padding: 0.375rem 0;
886 font-size: 0.8125rem;
887 border-bottom: 1px solid var(--border);
888 }
889 .island-edge-detail:last-child { border-bottom: none; }
890 .edge-source, .edge-target {
891 color: var(--accent);
892 overflow: hidden;
893 text-overflow: ellipsis;
894 white-space: nowrap;
895 max-width: 200px;
896 }
897 .edge-note {
898 color: var(--text-muted);
899 font-size: 0.6875rem;
900 flex: 1;
901 min-width: 100px;
902 overflow: hidden;
903 text-overflow: ellipsis;
904 white-space: nowrap;
905 }
906 .edge-handle {
907 color: var(--text-muted);
908 font-size: 0.625rem;
909 flex-shrink: 0;
910 }
911 .island-actions {
912 margin-top: 1.5rem;
913 }
914
915 /* ── Strata prose page ─────────────────────────────────────────── */
916 .strata-page { }
917 .strata-section {
918 margin-bottom: 1.5rem;
919 }
920 .strata-section h3 {
921 font-size: 0.9375rem;
922 margin-bottom: 0.75rem;
923 color: var(--text-muted);
924 }
925 .strata-relationships {
926 display: flex;
927 flex-direction: column;
928 gap: 0.375rem;
929 }
930 .strata-rel-line {
931 font-size: 0.875rem;
932 line-height: 1.6;
933 color: var(--text);
934 padding: 0.25rem 0;
935 }
936 .arrow {
937 font-weight: 600;
938 font-size: 1rem;
939 margin: 0 0.25rem;
940 }
941 .arrow-forward { color: var(--accent); }
942 .arrow-back { color: var(--green); }
943 .arrow-bidi { color: var(--purple); }
944 .arrow-blocked { color: var(--red); }
945 .entity-link {
946 color: var(--accent);
947 text-decoration: none;
948 border-bottom: 1px dotted var(--accent);
949 }
950 .entity-link:hover {
951 color: var(--accent-hover);
952 border-bottom-style: solid;
953 }
954 .analysis-tension {
955 padding: 0.5rem 0.75rem;
956 border-left: 3px solid var(--red);
957 background: rgba(248,81,73,0.05);
958 border-radius: 0 6px 6px 0;
959 margin-bottom: 0.5rem;
960 font-size: 0.8125rem;
961 }
962 .analysis-question {
963 padding: 0.5rem 0.75rem;
964 border-left: 3px solid var(--yellow);
965 background: rgba(210,153,34,0.05);
966 border-radius: 0 6px 6px 0;
967 margin-bottom: 0.5rem;
968 font-size: 0.8125rem;
969 }
970 .synthesis-text {
971 font-size: 0.9375rem;
972 line-height: 1.7;
973 color: var(--text);
974 }
975 .strata-btn.has-strata {
976 background: var(--purple);
977 color: #fff;
978 border-color: var(--purple);
979 }
980 .island-summary-large {
981 font-size: 1.0625rem;
982 line-height: 1.5;
983 color: var(--text);
984 margin-bottom: 0.5rem;
985 }
986 .strata-edges {
987 display: flex;
988 flex-direction: column;
989 gap: 0;
990 }
991 a.strata-edge {
992 display: flex;
993 align-items: center;
994 gap: 0.5rem;
995 flex-wrap: wrap;
996 padding: 0.375rem 0.5rem;
997 font-size: 0.8125rem;
998 border-bottom: 1px solid var(--border);
999 text-decoration: none;
1000 color: var(--text);
1001 transition: background 0.1s;
1002 }
1003 a.strata-edge:hover {
1004 background: var(--surface);
1005 }
1006 a.strata-edge:last-child { border-bottom: none; }
1007 .strata-edge-source, .strata-edge-target {
1008 color: var(--accent);
1009 overflow: hidden;
1010 text-overflow: ellipsis;
1011 white-space: nowrap;
1012 max-width: 60%;
1013 }
1014 .strata-edge-type {
1015 font-size: 0.6875rem;
1016 padding: 0.0625rem 0.375rem;
1017 border-radius: 8px;
1018 background: var(--border);
1019 color: var(--text);
1020 flex-shrink: 0;
1021 }
1022 .strata-edge-note {
1023 color: var(--text-muted);
1024 font-size: 0.6875rem;
1025 overflow: hidden;
1026 text-overflow: ellipsis;
1027 white-space: nowrap;
1028 flex: 1;
1029 min-width: 80px;
1030 }
1031 .strata-edge-handle {
1032 color: var(--text-muted);
1033 font-size: 0.625rem;
1034 flex-shrink: 0;
1035 }
1036
1037 /* ── Island card footer ──────────────────────────────────────── */
1038 .island-card-footer {
1039 display: flex;
1040 justify-content: space-between;
1041 align-items: center;
1042 padding: 0.75rem 1rem;
1043 border-top: 1px solid var(--border);
1044 }
1045 .island-card-footer .island-summary {
1046 margin: 0;
1047 flex: 1;
1048 }
1049 .island-card-footer .strata-btn {
1050 flex-shrink: 0;
1051 margin-left: 1rem;
1052 }
1053
1054 /* ── Theme tags (shared) ─────────────────────────────────────── */
1055 .theme-tags {
1056 display: flex;
1057 flex-wrap: wrap;
1058 gap: 0.375rem;
1059 }
1060 .theme-tag {
1061 padding: 0.25rem 0.625rem;
1062 border-radius: 12px;
1063 background: var(--border);
1064 color: var(--text);
1065 font-size: 0.75rem;
1066 display: inline-flex;
1067 align-items: center;
1068 gap: 0.25rem;
1069 }
1070 .theme-tag[contenteditable] { cursor: text; outline: none; }
1071 .theme-tag[contenteditable]:focus { background: var(--accent); color: #fff; }
1072 .theme-remove {
1073 cursor: pointer;
1074 opacity: 0.4;
1075 font-size: 0.875rem;
1076 line-height: 1;
1077 }
1078 .theme-remove:hover { opacity: 1; color: #f85149; }
1079 .theme-add {
1080 display: inline-flex;
1081 align-items: center;
1082 justify-content: center;
1083 width: 1.5rem;
1084 height: 1.5rem;
1085 border-radius: 12px;
1086 background: var(--border);
1087 color: var(--text-muted);
1088 font-size: 0.875rem;
1089 cursor: pointer;
1090 transition: all 0.15s;
1091 }
1092 .theme-add:hover { background: var(--accent); color: #fff; }
1093
1094 /* Editable fields */
1095 .editable { cursor: text; border-radius: 4px; transition: outline 0.15s; outline: 1px solid transparent; }
1096 .editable:focus { outline: 1px solid var(--accent); background: rgba(88,166,255,0.05); }
1097 .edit-hint { opacity: 0; font-size: 0.75rem; color: var(--text-muted); cursor: pointer; transition: opacity 0.15s; }
1098 .strata-section:hover .edit-hint { opacity: 1; }
1099 .editable-list .list-add {
1100 color: var(--text-muted);
1101 font-size: 0.8rem;
1102 cursor: pointer;
1103 padding: 0.25rem 0;
1104 opacity: 0.6;
1105 transition: opacity 0.15s;
1106 }
1107 .editable-list .list-add:hover { opacity: 1; }
1108
1109 /* Diff highlight — brief glow on regenerated fields */
1110 .field-changed {
1111 animation: field-glow 2s ease-out;
1112 }
1113 @keyframes field-glow {
1114 0% { background: rgba(188,140,255,0.3); }
1115 100% { background: transparent; }
1116 }
1117
1118 /* Strata action bar */
1119 .strata-actions {
1120 display: flex;
1121 align-items: center;
1122 gap: 0.75rem;
1123 margin: 1.5rem 0;
1124 padding-top: 1rem;
1125 border-top: 1px solid var(--border);
1126 }
1127 .regenerate-btn {
1128 background: var(--accent);
1129 border-color: var(--accent);
1130 color: #fff;
1131 font-size: 0.75rem;
1132 padding: 0.375rem 1rem;
1133 }
1134 .regenerate-btn:hover { background: #79c0ff; border-color: #79c0ff; }
1135 .regenerate-btn:disabled { opacity: 0.5; cursor: wait; }
1136 .save-btn {
1137 background: #238636;
1138 border-color: #238636;
1139 color: #fff;
1140 font-size: 0.75rem;
1141 padding: 0.375rem 1rem;
1142 }
1143 .save-btn:hover { background: #2ea043; border-color: #2ea043; }
1144 .save-btn:disabled { opacity: 0.5; cursor: wait; }
1145 .save-status { font-size: 0.8rem; color: var(--text-muted); }
1146 .hidden { display: none !important; }
1147
1148 /* Hot edges */
1149 .highlights-count { font-size: 0.7rem; color: var(--accent); font-weight: 400; margin-left: 0.25rem; }
1150 .hot-edge { border-left: 2px solid var(--accent); padding-left: 0.5rem; }
1151 .hot-badge { color: var(--accent); font-size: 0.75rem; margin-right: 0.25rem; }
1152 </style>
1153</head>
1154<body>
1155 <header>
1156 <h1>Stigmergic</h1>
1157 <p class="header-blurb">All content derived from <code>network.cosmik.connection</code> records on the AT Protocol</p>
1158 </header>
1159 <main>
1160 <div id="page-content"></div>
1161 </main>
1162 <script src="/app.js"></script>
1163</body>
1164</html>`;