This repository has no description
27 kB
1073 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 .island-section {
868 margin-bottom: 1.5rem;
869 }
870 .island-section h3 {
871 font-size: 0.9375rem;
872 margin-bottom: 0.75rem;
873 }
874 .island-edge-detail {
875 display: flex;
876 align-items: center;
877 gap: 0.5rem;
878 flex-wrap: wrap;
879 padding: 0.375rem 0;
880 font-size: 0.8125rem;
881 border-bottom: 1px solid var(--border);
882 }
883 .island-edge-detail:last-child { border-bottom: none; }
884 .edge-source, .edge-target {
885 color: var(--accent);
886 overflow: hidden;
887 text-overflow: ellipsis;
888 white-space: nowrap;
889 max-width: 200px;
890 }
891 .edge-note {
892 color: var(--text-muted);
893 font-size: 0.6875rem;
894 flex: 1;
895 min-width: 100px;
896 overflow: hidden;
897 text-overflow: ellipsis;
898 white-space: nowrap;
899 }
900 .edge-handle {
901 color: var(--text-muted);
902 font-size: 0.625rem;
903 flex-shrink: 0;
904 }
905 .island-actions {
906 margin-top: 1.5rem;
907 }
908
909 /* ── Strata prose page ─────────────────────────────────────────── */
910 .strata-page { }
911 .strata-section {
912 margin-bottom: 1.5rem;
913 }
914 .strata-section h3 {
915 font-size: 0.9375rem;
916 margin-bottom: 0.75rem;
917 color: var(--text-muted);
918 }
919 .strata-relationships {
920 display: flex;
921 flex-direction: column;
922 gap: 0.375rem;
923 }
924 .strata-rel-line {
925 font-size: 0.875rem;
926 line-height: 1.6;
927 color: var(--text);
928 padding: 0.25rem 0;
929 }
930 .arrow {
931 font-weight: 600;
932 font-size: 1rem;
933 margin: 0 0.25rem;
934 }
935 .arrow-forward { color: var(--accent); }
936 .arrow-back { color: var(--green); }
937 .arrow-bidi { color: var(--purple); }
938 .arrow-blocked { color: var(--red); }
939 .entity-link {
940 color: var(--accent);
941 text-decoration: none;
942 border-bottom: 1px dotted var(--accent);
943 }
944 .entity-link:hover {
945 color: var(--accent-hover);
946 border-bottom-style: solid;
947 }
948 .analysis-tension {
949 padding: 0.5rem 0.75rem;
950 border-left: 3px solid var(--red);
951 background: rgba(248,81,73,0.05);
952 border-radius: 0 6px 6px 0;
953 margin-bottom: 0.5rem;
954 font-size: 0.8125rem;
955 }
956 .analysis-question {
957 padding: 0.5rem 0.75rem;
958 border-left: 3px solid var(--yellow);
959 background: rgba(210,153,34,0.05);
960 border-radius: 0 6px 6px 0;
961 margin-bottom: 0.5rem;
962 font-size: 0.8125rem;
963 }
964 .synthesis-text {
965 font-size: 0.9375rem;
966 line-height: 1.7;
967 color: var(--text);
968 }
969 .strata-btn.has-strata {
970 background: var(--purple);
971 color: #fff;
972 border-color: var(--purple);
973 }
974 .island-summary-large {
975 font-size: 1.0625rem;
976 line-height: 1.5;
977 color: var(--text);
978 margin-bottom: 0.5rem;
979 }
980 .strata-edges {
981 display: flex;
982 flex-direction: column;
983 gap: 0;
984 }
985 a.strata-edge {
986 display: flex;
987 align-items: center;
988 gap: 0.5rem;
989 flex-wrap: wrap;
990 padding: 0.375rem 0.5rem;
991 font-size: 0.8125rem;
992 border-bottom: 1px solid var(--border);
993 text-decoration: none;
994 color: var(--text);
995 transition: background 0.1s;
996 }
997 a.strata-edge:hover {
998 background: var(--surface);
999 }
1000 a.strata-edge:last-child { border-bottom: none; }
1001 .strata-edge-source, .strata-edge-target {
1002 color: var(--accent);
1003 overflow: hidden;
1004 text-overflow: ellipsis;
1005 white-space: nowrap;
1006 max-width: 200px;
1007 }
1008 .strata-edge-type {
1009 font-size: 0.6875rem;
1010 padding: 0.0625rem 0.375rem;
1011 border-radius: 8px;
1012 background: var(--border);
1013 color: var(--text);
1014 flex-shrink: 0;
1015 }
1016 .strata-edge-note {
1017 color: var(--text-muted);
1018 font-size: 0.6875rem;
1019 overflow: hidden;
1020 text-overflow: ellipsis;
1021 white-space: nowrap;
1022 flex: 1;
1023 min-width: 80px;
1024 }
1025 .strata-edge-handle {
1026 color: var(--text-muted);
1027 font-size: 0.625rem;
1028 flex-shrink: 0;
1029 }
1030
1031 /* ── Island card footer ──────────────────────────────────────── */
1032 .island-card-footer {
1033 display: flex;
1034 justify-content: space-between;
1035 align-items: center;
1036 padding: 0.75rem 1rem;
1037 border-top: 1px solid var(--border);
1038 }
1039 .island-card-footer .island-summary {
1040 margin: 0;
1041 flex: 1;
1042 }
1043 .island-card-footer .strata-btn {
1044 flex-shrink: 0;
1045 margin-left: 1rem;
1046 }
1047
1048 /* ── Theme tags (shared) ─────────────────────────────────────── */
1049 .theme-tags {
1050 display: flex;
1051 flex-wrap: wrap;
1052 gap: 0.375rem;
1053 }
1054 .theme-tag {
1055 padding: 0.25rem 0.625rem;
1056 border-radius: 12px;
1057 background: var(--border);
1058 color: var(--text);
1059 font-size: 0.75rem;
1060 }
1061 </style>
1062</head>
1063<body>
1064 <header>
1065 <h1>Stigmergic</h1>
1066 <p class="header-blurb">All content derived from <code>network.cosmik.connection</code> records on the AT Protocol</p>
1067 </header>
1068 <main>
1069 <div id="page-content"></div>
1070 </main>
1071 <script src="/app.js"></script>
1072</body>
1073</html>`;