Repository navigation
Expand file tree
/
Copy pathindex.html
More file actions
1094 lines (1039 loc) · 81.2 KB
/
Copy pathindex.html
File metadata and controls
1094 lines (1039 loc) · 81.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Archify — Technical Diagrams from Plain English</title>
<meta name="description" content="An agent skill for Cursor, Claude Code, Codex CLI, OpenCode, and GitHub Copilot that turns plain-English descriptions into polished, explorable, self-contained technical diagrams with semantic focus, motion, and crisp export.">
<meta name="theme-color" content="#eff2f1">
<link rel="icon" type="image/svg+xml" href="assets/archify-mark.svg">
<meta property="og:type" content="website">
<meta property="og:title" content="Archify — Technical Diagrams from Plain English">
<meta property="og:description" content="Describe your system in chat. Archify generates a polished, explorable HTML diagram with semantic focus, dark/light themes, motion, and ultra-crisp export.">
<meta property="og:image" content="https://tt-a1i.github.io/archify/assets/archify-social-preview.png">
<meta property="og:url" content="https://tt-a1i.github.io/archify/">
<meta name="twitter:card" content="summary_large_image">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@0,9..144,300;0,9..144,400;0,9..144,500;1,9..144,400&family=Space+Grotesk:wght@400;500;600&family=Inter:wght@400;450;500;600&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="assets/site-navigation.css">
<style>
:root {
/* Drafted-sheet palette — warm paper, ink, one international-orange accent */
--paper:#eff2f1; --paper-raised:#f8faf9;
--ink:#15181b; --ink-soft:#363c41; --muted:#60686d; --dim:#929a9e;
--line:rgba(20,23,26,0.14); --line-hi:rgba(20,23,26,0.3);
--accent:#e14a0e; --accent-soft:rgba(225,74,14,0.08);
--plate:#0f1216;
/* Product semantic hues — print-depth, only where they carry diagram meaning */
--cyan:#0891b2; --emerald:#047857; --violet:#6d28d9;
--amber:#b45309; --rose:#be123c; --orange:#c2410c; --slate:#475569;
--cyan-fill:rgba(8,145,178,0.12); --emerald-fill:rgba(4,120,87,0.11);
--violet-fill:rgba(109,40,217,0.1); --amber-fill:rgba(180,83,9,0.13);
--rose-fill:rgba(190,18,60,0.09); --orange-fill:rgba(194,65,12,0.11);
--slate-fill:rgba(71,85,105,0.1);
--font-display:'Fraunces','Songti SC','STSong',Georgia,serif;
--font-grot:'Space Grotesk','Inter',-apple-system,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;
--font-body:'Inter',-apple-system,BlinkMacSystemFont,'PingFang SC','Hiragino Sans GB','Microsoft YaHei',sans-serif;
--font-mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,monospace;
--ease-out:cubic-bezier(.22,1,.36,1);
--bento-gap:14px;
}
*, *::before, *::after { margin:0; padding:0; box-sizing:border-box; }
html { scroll-behavior:smooth; }
body {
font-family:var(--font-body);
-webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
background:var(--paper); color:var(--ink); min-height:100vh; overflow-x:hidden;
counter-reset:seclabel;
}
body::after {
content:''; position:fixed; inset:0; z-index:1000; pointer-events:none;
opacity:.05; mix-blend-mode:multiply;
background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/></filter><rect width='140' height='140' filter='url(%23n)'/></svg>");
}
::selection { background:rgba(225,74,14,.18); color:var(--ink); }
html { scrollbar-width:thin; scrollbar-color:rgba(20,23,26,.32) transparent; }
::-webkit-scrollbar { width:10px; height:10px; }
::-webkit-scrollbar-track { background:transparent; }
::-webkit-scrollbar-thumb { background:rgba(20,23,26,.24); border-radius:999px; border:3px solid transparent; background-clip:content-box; }
::-webkit-scrollbar-thumb:hover { background:rgba(20,23,26,.38); border:3px solid transparent; background-clip:content-box; }
:focus-visible { outline:2px solid var(--accent); outline-offset:3px; border-radius:4px; }
.grid-bg {
position:fixed; inset:0; z-index:0; pointer-events:none;
background-image:linear-gradient(rgba(20,23,26,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(20,23,26,.045) 1px,transparent 1px);
background-size:56px 56px;
-webkit-mask-image:radial-gradient(ellipse 95% 62% at 50% -6%, black 12%, transparent 75%);
mask-image:radial-gradient(ellipse 95% 62% at 50% -6%, black 12%, transparent 75%);
}
.btn { display:inline-flex; align-items:center; gap:.5rem; padding:.55rem 1.15rem; border-radius:6px; font-family:var(--font-body); font-size:.8125rem; font-weight:500; letter-spacing:-.005em; cursor:pointer; text-decoration:none; transition:all .2s var(--ease-out); border:1px solid transparent; }
.btn-primary { background:var(--ink); color:var(--paper); }
.btn-primary:hover { background:#272c31; transform:translateY(-1px); }
.btn-ghost { background:transparent; color:var(--ink-soft); border-color:var(--line-hi); }
.btn-ghost:hover { color:var(--ink); border-color:var(--ink); transform:translateY(-1px); }
.container { position:relative; z-index:1; max-width:1200px; margin:0 auto; padding:0 2rem; }
section { position:relative; padding:5.25rem 0; }
/* FADE — develop-in like a photographic print */
.fade-up { opacity:0; transform:translateY(18px); filter:blur(6px); transition:opacity .9s var(--ease-out),transform .9s var(--ease-out),filter .9s var(--ease-out); }
.fade-up.visible { opacity:1; transform:translateY(0); filter:blur(0); }
.fade-up.d1 { transition-delay:.08s; } .fade-up.d2 { transition-delay:.16s; }
.fade-up.d3 { transition-delay:.24s; } .fade-up.d4 { transition-delay:.32s; }
.fade-up.d5 { transition-delay:.4s; }
/* ══════════════════════════════════════
HERO — editorial bento: intro / live proof / specimen rail / stats
══════════════════════════════════════ */
.hero { position:relative; padding-top:9rem; padding-bottom:4.5rem; overflow:hidden; }
.hero::before { content:''; position:absolute; top:-140px; left:50%; transform:translateX(-50%); width:820px; height:480px; background:radial-gradient(closest-side,rgba(225,74,14,.06),transparent); pointer-events:none; }
.hero-bento { display:grid; grid-template-columns:repeat(12,1fr); gap:var(--bento-gap); }
.hero-intro { grid-column:1 / 8; padding:1.25rem .5rem 0 0; }
.hero-badge { display:inline-flex; align-items:center; gap:.75rem; font-family:var(--font-mono); font-size:.625rem; font-weight:500; color:var(--muted); margin-bottom:1.625rem; letter-spacing:.22em; text-transform:uppercase; }
.hero-badge::before { content:''; width:2.75rem; height:1px; background:var(--line-hi); }
.pulse-dot { width:5px; height:5px; border-radius:50%; background:var(--accent); animation:pulse 2.4s ease-in-out infinite; }
@keyframes pulse { 0%,100% { opacity:1; transform:scale(1); } 50% { opacity:.4; transform:scale(.75); } }
.hero h1 { font-family:var(--font-grot); font-size:clamp(2.75rem,4.7vw,4.5rem); font-weight:500; line-height:1.04; letter-spacing:-.042em; color:var(--ink); margin-bottom:1.25rem; text-wrap:balance; }
.hero h1 em { font-family:var(--font-display); font-style:italic; font-optical-sizing:auto; font-weight:400; color:var(--accent); letter-spacing:-.02em; }
.hero-sub { font-size:.9375rem; font-weight:400; color:var(--muted); line-height:1.72; max-width:480px; margin-bottom:1.75rem; text-wrap:pretty; }
.hero-actions { display:flex; flex-wrap:wrap; align-items:center; gap:.625rem; }
.hero-actions .btn { min-height:44px; padding:.65rem 1.375rem; font-size:.875rem; }
/* MAIN PROOF — paper-mounted dark plate */
.proof-main { grid-column:8 / 13; grid-row:1 / 3; position:relative; overflow:hidden; display:flex; flex-direction:column; border:1px solid var(--line-hi); border-radius:14px; background:var(--paper-raised); box-shadow:0 1px 0 rgba(255,255,255,.6) inset,0 30px 70px rgba(20,23,26,.16); }
.proof-main::before, .proof-main::after { position:absolute; z-index:5; font-family:var(--font-mono); font-size:.8125rem; font-weight:400; color:var(--dim); line-height:1; pointer-events:none; }
.proof-main::before { content:'+'; top:.5rem; left:.625rem; }
.proof-main::after { content:'+'; top:.5rem; right:.625rem; }
.proof-chrome { min-height:60px; display:flex; align-items:center; justify-content:space-between; gap:1rem; padding:.7rem 1.5rem; border-bottom:1px solid var(--line); }
.proof-status { display:flex; align-items:center; gap:.75rem; min-width:0; }
.proof-live { display:inline-flex; align-items:center; gap:.45rem; flex-shrink:0; color:var(--accent); font-family:var(--font-mono); font-size:.5625rem; font-weight:600; letter-spacing:.16em; text-transform:uppercase; }
.proof-live::before { content:''; width:5px; height:5px; border-radius:50%; background:currentColor; animation:pulse 2.4s ease-in-out infinite; }
.proof-status-copy { min-width:0; }
.proof-status-copy strong { display:block; overflow:hidden; color:var(--ink); font-size:.75rem; font-weight:500; letter-spacing:-.005em; white-space:nowrap; text-overflow:ellipsis; }
.proof-status-copy span { display:block; margin-top:.2rem; color:var(--dim); font-family:var(--font-mono); font-size:.5625rem; letter-spacing:.06em; white-space:nowrap; }
.proof-open { flex-shrink:0; display:inline-flex; align-items:center; gap:.4rem; color:var(--muted); font-size:.75rem; font-weight:500; text-decoration:none; white-space:nowrap; transition:color .18s var(--ease-out); }
.proof-open:hover { color:var(--accent); }
.proof-viewport { position:relative; flex:1; min-height:430px; background:var(--plate); border:12px solid var(--paper-raised); border-top-width:10px; border-bottom-width:10px; }
.proof-viewport iframe { position:absolute; inset:0; z-index:1; width:100%; height:100%; display:block; border:0; background:var(--plate); opacity:1; transition:opacity .25s var(--ease-out); }
.proof-main.is-loading .proof-viewport iframe { opacity:.3; }
.proof-caption { position:relative; min-height:64px; display:flex; align-items:center; justify-content:space-between; gap:1.5rem; padding:.85rem 1.5rem; border-top:1px solid var(--line); }
.proof-caption-main { min-width:0; }
.proof-caption-main span { display:block; margin-bottom:.26rem; color:var(--accent); font-family:var(--font-mono); font-size:.5625rem; font-weight:500; letter-spacing:.14em; text-transform:uppercase; }
.proof-caption-main strong { display:block; overflow:hidden; color:var(--ink); font-family:var(--font-display); font-optical-sizing:auto; font-size:.9375rem; font-weight:500; letter-spacing:-.01em; white-space:nowrap; text-overflow:ellipsis; }
.proof-hint { color:var(--dim); font-size:.6875rem; line-height:1.55; text-align:right; max-width:170px; }
/* SPECIMEN RAIL — three bento cards replace the tab strip */
.proof-rail { grid-column:1 / 8; display:grid; grid-template-columns:repeat(3,1fr); gap:var(--bento-gap); align-content:start; }
.rail-label { grid-column:1 / -1; display:flex; align-items:center; gap:.875rem; font-family:var(--font-mono); font-size:.5625rem; font-weight:500; letter-spacing:.2em; color:var(--dim); text-transform:uppercase; }
.rail-label::after { content:''; flex:1; height:1px; background:var(--line); }
.spec-card { position:relative; display:flex; flex-direction:column; gap:.6rem; padding:1.125rem 1.25rem 1.125rem; background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:12px; cursor:pointer; text-align:left; font-family:inherit; transition:all .22s var(--ease-out); }
.spec-card:hover { transform:translateY(-2px); border-color:var(--ink); box-shadow:0 10px 26px rgba(20,23,26,.1); }
.spec-card[aria-selected="true"] { background:var(--ink); border-color:var(--ink); box-shadow:0 14px 34px rgba(20,23,26,.22); }
.spec-top { display:flex; align-items:center; justify-content:space-between; gap:.5rem; }
.spec-idx { font-family:var(--font-mono); font-size:.5625rem; font-weight:600; letter-spacing:.18em; color:var(--accent); }
.spec-glyph { color:var(--muted); transition:color .22s var(--ease-out); }
.spec-glyph svg { display:block; }
.spec-glyph svg * { stroke:currentColor; }
.spec-card[aria-selected="true"] .spec-glyph { color:rgba(247,249,249,.85); }
.spec-name { font-family:var(--font-display); font-optical-sizing:auto; font-size:1rem; font-weight:500; letter-spacing:-.01em; color:var(--ink); line-height:1.3; }
.spec-card[aria-selected="true"] .spec-name { color:var(--paper); }
.spec-meta { font-family:var(--font-mono); font-size:.5625rem; letter-spacing:.06em; color:var(--dim); line-height:1.6; }
.spec-card[aria-selected="true"] .spec-meta { color:rgba(247,249,249,.55); }
/* STATS STRIP */
.hero-stats { grid-column:1 / -1; display:grid; grid-template-columns:repeat(5,1fr); border:1px solid var(--line-hi); border-radius:12px; background:var(--paper-raised); overflow:hidden; }
.stat { padding:1.375rem 1.5rem 1.25rem; border-left:1px solid var(--line); }
.stat:first-child { border-left:0; }
.stat b { display:block; font-family:var(--font-display); font-style:italic; font-optical-sizing:auto; font-size:2rem; font-weight:400; line-height:1; color:var(--ink); margin-bottom:.55rem; }
.stat b sup { font-size:.55em; font-style:normal; color:var(--accent); }
.stat span { font-family:var(--font-mono); font-size:.5625rem; font-weight:500; letter-spacing:.16em; text-transform:uppercase; color:var(--dim); }
/* SECTION — ghost folio numerals + indexed labels */
#types::after, #features::after, #palette::after, #quickstart::after {
position:absolute; top:3.5rem; right:1.5rem; z-index:0;
font-family:var(--font-display); font-style:italic; font-optical-sizing:auto;
font-size:clamp(5rem,10vw,9rem); line-height:1;
color:transparent; -webkit-text-stroke:1px rgba(20,23,26,.08);
pointer-events:none; user-select:none;
}
#types::after { content:'01'; } #features::after { content:'02'; }
#palette::after { content:'03'; } #quickstart::after { content:'04'; }
.section-label { counter-increment:seclabel; display:flex; align-items:center; gap:.875rem; font-family:var(--font-mono); font-size:.625rem; font-weight:500; letter-spacing:.2em; color:var(--muted); text-transform:uppercase; margin-bottom:1.5rem; }
.section-label::before { content:counter(seclabel,decimal-leading-zero); color:var(--accent); font-weight:600; }
.section-label::after { content:''; flex:1; max-width:4rem; height:1px; background:var(--line-hi); }
.section-heading { font-family:var(--font-display); font-optical-sizing:auto; font-size:clamp(2.25rem,4vw,3.5rem); font-weight:400; letter-spacing:-.028em; line-height:1.06; color:var(--ink); margin-bottom:1.25rem; text-wrap:balance; }
.section-body { font-size:.9375rem; color:var(--muted); line-height:1.72; max-width:540px; text-wrap:pretty; }
.divider { height:1px; background:linear-gradient(90deg,transparent,var(--line),transparent); }
/* ══════════════════════════════════════
TYPES — asymmetric bento deck
══════════════════════════════════════ */
.types-header { display:block; margin-bottom:2.75rem; }
.types-header .section-body { max-width:560px; }
.types-bento { display:grid; grid-template-columns:repeat(6,1fr); gap:var(--bento-gap); }
.type-card { position:relative; display:flex; flex-direction:column; background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:14px; overflow:hidden; transition:transform .3s var(--ease-out),border-color .3s var(--ease-out),box-shadow .3s var(--ease-out); }
.type-card:hover { transform:translateY(-3px); border-color:var(--ink); box-shadow:0 22px 54px rgba(20,23,26,.14); }
.type-card.big { grid-column:span 4; grid-row:span 2; }
.type-card.sm { grid-column:span 2; }
.type-media { position:relative; overflow:hidden; border-bottom:1px solid var(--line); background:var(--paper); }
.type-card.big .type-media { aspect-ratio:4 / 3.05; }
.type-card.sm .type-media { aspect-ratio:16 / 9.5; }
.type-media img { width:100%; height:100%; display:block; object-fit:cover; object-position:top center; transition:transform .7s var(--ease-out); }
.type-card:hover .type-media img { transform:scale(1.04); }
.type-tag { position:absolute; top:.75rem; left:.75rem; z-index:2; padding:.32rem .6rem; background:rgba(247,249,249,.88); backdrop-filter:blur(6px); border:1px solid var(--line-hi); border-radius:6px; font-family:var(--font-mono); font-size:.5625rem; font-weight:600; letter-spacing:.16em; color:var(--ink-soft); text-transform:uppercase; }
.type-body { padding:1.5rem 1.625rem 1.5rem; }
.type-card.sm .type-body { padding:1.25rem 1.375rem 1.25rem; }
.type-body h3 { font-family:var(--font-display); font-optical-sizing:auto; font-size:1.5rem; font-weight:500; letter-spacing:-.02em; color:var(--ink); margin-bottom:.5rem; }
.type-card.sm .type-body h3 { font-size:1.125rem; }
.type-body p { font-size:.8125rem; color:var(--muted); line-height:1.68; text-wrap:pretty; }
.type-uses { list-style:none; margin-top:1.125rem; display:grid; grid-template-columns:1fr 1fr; gap:.45rem .875rem; }
.type-uses li { font-size:.75rem; color:var(--muted); display:flex; align-items:flex-start; gap:.5rem; }
.type-uses li::before { content:'→'; color:var(--accent); flex-shrink:0; font-size:.6875rem; line-height:1.6; }
/* gallery tile */
.type-card.more { grid-column:span 2; background:var(--ink); border-color:var(--ink); color:var(--paper); justify-content:space-between; padding:1.5rem 1.5rem 1.375rem; text-decoration:none; }
.type-card.more:hover { border-color:var(--accent); box-shadow:0 22px 54px rgba(20,23,26,.3); }
.more-kicker { font-family:var(--font-mono); font-size:.5625rem; font-weight:500; letter-spacing:.2em; text-transform:uppercase; color:rgba(247,249,249,.5); margin-bottom:1.75rem; }
.more-title { font-family:var(--font-display); font-style:italic; font-optical-sizing:auto; font-size:1.625rem; font-weight:400; letter-spacing:-.02em; line-height:1.2; color:var(--paper); margin-bottom:.75rem; }
.more-sub { font-size:.75rem; color:rgba(247,249,249,.55); line-height:1.6; }
.more-arrow { align-self:flex-end; margin-top:1.5rem; width:40px; height:40px; display:flex; align-items:center; justify-content:center; border:1px solid rgba(247,249,249,.3); border-radius:50%; color:var(--paper); font-size:1rem; transition:all .25s var(--ease-out); }
.type-card.more:hover .more-arrow { background:var(--accent); border-color:var(--accent); transform:rotate(45deg); }
/* ══════════════════════════════════════
FEATURES — numbered text cards
══════════════════════════════════════ */
.features-bento { display:grid; grid-template-columns:repeat(6,1fr); gap:var(--bento-gap); counter-reset:feat; }
.feature-card { position:relative; counter-increment:feat; background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:12px; padding:1.75rem 1.625rem 1.625rem; transition:all .25s var(--ease-out); overflow:hidden; }
.feature-card:hover { transform:translateY(-2px); border-color:var(--ink); box-shadow:0 14px 36px rgba(20,23,26,.1); }
.f-lg { grid-column:span 3; } .f-sm { grid-column:span 2; }
.feature-card::after { content:counter(feat,decimal-leading-zero); position:absolute; top:1.125rem; right:1.375rem; font-family:var(--font-display); font-style:italic; font-optical-sizing:auto; font-size:1.75rem; font-weight:400; color:var(--dim); opacity:.55; transition:color .25s var(--ease-out),opacity .25s var(--ease-out); }
.feature-card:hover::after { color:var(--accent); opacity:1; }
.feature-card h3 { font-family:var(--font-display); font-optical-sizing:auto; font-size:1.25rem; font-weight:500; letter-spacing:-.015em; color:var(--ink); margin-bottom:.625rem; padding-right:2.75rem; }
.f-sm .feature-card h3, .f-sm h3 { font-size:1.0625rem; }
.feature-card p { font-size:.8125rem; color:var(--muted); line-height:1.68; text-wrap:pretty; }
.f-lg p { max-width:52ch; }
.feature-tag { display:inline-block; margin-top:1.125rem; padding:.32rem .7rem; border-radius:999px; font-family:var(--font-mono); font-size:.5625rem; font-weight:500; letter-spacing:.12em; text-transform:uppercase; color:var(--dim); border:1px solid var(--line); }
/* EXPORT */
.export-label-row { font-family:var(--font-mono); font-size:.625rem; color:var(--dim); text-transform:uppercase; letter-spacing:.18em; margin-top:var(--bento-gap); margin-bottom:.875rem; }
.export-grid { display:grid; grid-template-columns:repeat(6,1fr); gap:1px; background:var(--line); border:1px solid var(--line-hi); border-radius:12px; overflow:hidden; }
.export-item { background:var(--paper-raised); padding:1.375rem 1rem; text-align:center; transition:background .25s var(--ease-out); }
.export-item:hover { background:var(--paper); }
.export-item .fmt { font-family:var(--font-mono); font-size:.6875rem; font-weight:600; letter-spacing:.12em; margin-bottom:.4rem; color:var(--ink); }
.export-item .desc { font-size:.6875rem; color:var(--dim); line-height:1.5; }
/* ══════════════════════════════════════
PALETTE — mini nodes on light paper and dark plate
══════════════════════════════════════ */
.palette-card { display:grid; grid-template-columns:repeat(7,1fr); gap:1.25rem; padding:1.75rem; background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:14px; }
.palette-chip { display:flex; flex-direction:column; gap:.75rem; }
.chip-nodes { display:flex; flex-direction:column; gap:6px; }
.mini-node { display:flex; flex-direction:column; justify-content:center; gap:2px; height:46px; padding:0 .75rem; border-radius:8px; border:1.5px solid var(--node); background:var(--node-fill); transition:transform .3s var(--ease-out); }
.palette-chip:hover .mini-node { transform:translateY(-3px); }
.mini-node b { font-family:var(--font-mono); font-size:.625rem; font-weight:600; letter-spacing:.02em; color:var(--ink); }
.mini-node span { font-family:var(--font-mono); font-size:.5625rem; letter-spacing:.02em; color:var(--muted); }
.mini-node.dark { background:var(--plate); border-color:var(--node-dark); }
.mini-node.dark b { color:#e8edf2; }
.mini-node.dark span { color:#7d8894; }
.chip-label { font-family:var(--font-mono); font-size:.625rem; font-weight:600; letter-spacing:.1em; text-transform:uppercase; }
.chip-use { font-size:.6875rem; color:var(--dim); margin-top:.15rem; line-height:1.5; }
/* ══════════════════════════════════════
QUICK START — steps card + shortcuts card
══════════════════════════════════════ */
.quickstart-layout { display:grid; grid-template-columns:1.15fr .85fr; gap:var(--bento-gap); align-items:stretch; }
.quickstart-layout > * { min-width:0; }
/* let the shortcut card match the steps card's height */
.quickstart-layout > .fade-up { display:flex; flex-direction:column; }
.quickstart-layout > .fade-up > .shortcut-box { flex:1; }
.qs-card { background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:14px; padding:2.25rem 2.5rem; }
.steps { display:flex; flex-direction:column; }
.step { display:grid; grid-template-columns:44px 1fr; gap:1.375rem; padding-bottom:2.25rem; position:relative; }
.step:last-child { padding-bottom:0; }
.step:not(:last-child)::before { content:''; position:absolute; left:21px; top:48px; bottom:0; width:1px; background:var(--line); }
.step-num { width:44px; height:44px; display:flex; align-items:center; justify-content:center; font-family:var(--font-display); font-style:italic; font-optical-sizing:auto; font-size:1.625rem; font-weight:400; color:var(--accent); flex-shrink:0; position:relative; z-index:1; }
.step-content h4 { font-family:var(--font-display); font-optical-sizing:auto; font-size:1.25rem; font-weight:500; letter-spacing:-.015em; color:var(--ink); margin-bottom:.5rem; padding-top:.55rem; }
.step-content p { font-size:.875rem; color:var(--muted); line-height:1.7; text-wrap:pretty; }
.step-content code { font-family:var(--font-mono); font-size:.82em; background:rgba(20,23,26,.05); border:1px solid var(--line); padding:.15em .45em; border-radius:5px; overflow-wrap:anywhere; }
.step-content a { color:var(--accent); text-decoration:none; border-bottom:1px solid rgba(225,74,14,.35); transition:border-color .18s var(--ease-out); }
.step-content a:hover { border-bottom-color:var(--accent); }
/* INSTALL STRIP — two commands, nothing else */
.install-strip { margin-top:var(--bento-gap); padding:1.5rem 1.75rem; background:var(--plate); border:1px solid var(--ink); border-radius:12px; font-family:var(--font-mono); font-size:.75rem; line-height:1.9; overflow-wrap:break-word; }
.install-cmt { color:#60686d; }
.install-cmd { color:var(--paper); }
.install-cmd + .install-cmt { margin-top:1.125rem; }
/* SHORTCUT BOX */
.shortcut-box { padding:1.625rem 1.75rem; background:var(--paper-raised); border:1px solid var(--line-hi); border-radius:14px; display:flex; flex-direction:column; }
.shortcut-title { font-family:var(--font-mono); font-size:.625rem; color:var(--dim); font-weight:500; letter-spacing:.16em; text-transform:uppercase; margin-bottom:1.125rem; }
.shortcut-rows { flex:1; display:flex; flex-direction:column; justify-content:space-between; gap:.45rem; }
.shortcut-row { display:flex; justify-content:space-between; align-items:center; font-size:.75rem; }
.shortcut-row span { color:var(--muted); }
kbd { background:var(--paper); border:1px solid var(--line-hi); padding:2px 7px; border-radius:5px; color:var(--ink-soft); font-family:var(--font-mono); font-size:.625rem; }
/* ══════════════════════════════════════
CLOSING CTA — one dark plate, one action
══════════════════════════════════════ */
#cta { padding-top:1rem; }
.cta-card { position:relative; overflow:hidden; background:var(--plate); border:1px solid var(--ink); border-radius:16px; padding:4.25rem 3.5rem 3.75rem; text-align:center; }
.cta-card::before { content:''; position:absolute; top:-160px; left:50%; transform:translateX(-50%); width:640px; height:360px; background:radial-gradient(closest-side,rgba(225,74,14,.16),transparent); pointer-events:none; }
.cta-h { position:relative; font-family:var(--font-display); font-optical-sizing:auto; font-size:clamp(1.9rem,3.4vw,2.875rem); font-weight:400; letter-spacing:-.026em; line-height:1.12; color:var(--paper); margin-bottom:1rem; text-wrap:balance; }
.cta-h em { font-style:italic; color:var(--accent); }
.cta-sub { position:relative; max-width:520px; margin:0 auto 2rem; font-size:.9375rem; color:#98a1a9; line-height:1.72; text-wrap:pretty; }
.cta-actions { position:relative; display:flex; flex-wrap:wrap; align-items:center; justify-content:center; gap:1.375rem; }
.cta-install { display:inline-flex; align-items:center; gap:.5rem; min-height:46px; padding:.7rem 1.625rem; border-radius:8px; background:var(--paper); color:var(--ink); font-size:.875rem; font-weight:600; letter-spacing:-.005em; text-decoration:none; transition:background .2s var(--ease-out),color .2s var(--ease-out); }
.cta-install:hover { background:var(--accent); color:var(--paper); }
.cta-gh { font-family:var(--font-mono); font-size:.6875rem; letter-spacing:.06em; color:#7d8894; text-decoration:none; transition:color .18s var(--ease-out); }
.cta-gh:hover { color:var(--paper); }
.cta-cmd { position:relative; margin-top:2.25rem; font-family:var(--font-mono); font-size:.6875rem; letter-spacing:.03em; color:#5f6870; }
.cta-cmd b { font-weight:500; color:#aab3bb; }
/* FOOTER — drawing title block */
footer { position:relative; z-index:1; border-top:1px solid var(--line-hi); padding:3rem 2rem; }
.footer-inner { max-width:1140px; margin:0 auto; display:grid; grid-template-columns:1fr auto; align-items:stretch; gap:0; border:1px solid var(--line); background:var(--paper-raised); }
.footer-left { display:flex; align-items:center; gap:1.5rem; padding:1.5rem 1.75rem; border-right:1px solid var(--line); }
.footer-meta { font-family:var(--font-mono); font-size:.625rem; letter-spacing:.04em; color:var(--dim); line-height:1.7; }
.footer-links { display:flex; align-items:center; gap:1.75rem; padding:1.5rem 1.75rem; }
.footer-links a { font-family:var(--font-mono); font-size:.625rem; letter-spacing:.12em; text-transform:uppercase; color:var(--muted); text-decoration:none; transition:color .18s var(--ease-out); }
.footer-links a:hover { color:var(--ink); }
@media(prefers-reduced-motion:reduce) {
html { scroll-behavior:auto; }
.fade-up { opacity:1!important; transform:none!important; transition:none!important; filter:none!important; }
.pulse-dot,.proof-live::before { animation:none!important; }
.proof-viewport iframe { transition:none; }
.type-card:hover, .feature-card:hover, .spec-card:hover { transform:none; }
}
@media(max-width:1024px) {
section { padding:5rem 0; }
.hero { padding-top:7.5rem; }
.hero-intro { grid-column:1 / -1; padding-right:0; }
.hero-sub { max-width:560px; }
.proof-main { grid-column:1 / -1; grid-row:auto; }
.proof-viewport { min-height:480px; }
.proof-rail { grid-column:1 / -1; }
.hero-stats { grid-template-columns:repeat(3,1fr); }
.stat:nth-child(4) { border-left:0; }
.stat { border-top:1px solid var(--line); }
.stat:nth-child(-n+3) { border-top:0; }
.type-card.big { grid-column:span 6; grid-row:auto; }
.type-card.big .type-media { aspect-ratio:16 / 8; }
.type-card.sm { grid-column:span 3; }
.type-card.more { grid-column:span 6; flex-direction:row; align-items:center; gap:1.5rem; }
.more-kicker { margin-bottom:.75rem; }
.more-arrow { align-self:center; margin-top:0; flex-shrink:0; }
.f-lg { grid-column:span 3; } .f-sm { grid-column:span 3; }
.export-grid { grid-template-columns:repeat(3,1fr); }
.palette-card { grid-template-columns:repeat(4,1fr); }
.quickstart-layout { grid-template-columns:1fr; }
}
@media(max-width:640px) {
.container { padding:0 1.25rem; }
section { padding:4rem 0; }
.hero { padding-top:6.75rem; }
.hero h1 { font-size:2.35rem; }
#types::after, #features::after, #palette::after, #quickstart::after { font-size:3.25rem; top:2.25rem; right:.75rem; }
.hero-actions .btn { flex:1; justify-content:center; }
.proof-chrome { padding:.7rem 1.125rem; }
.proof-status-copy span { display:none; }
.proof-viewport { min-height:360px; }
.proof-caption { align-items:flex-start; gap:.6rem; padding:.8rem 1.125rem; }
.proof-caption-main strong { white-space:normal; line-height:1.4; }
.proof-hint { max-width:104px; }
.proof-rail { grid-template-columns:1fr; }
.spec-card { flex-direction:row; align-items:center; gap:1rem; padding:1rem 1.125rem; }
.spec-top { flex-direction:column; align-items:flex-start; gap:.5rem; }
.hero-stats { grid-template-columns:1fr 1fr; }
.stat { border-top:1px solid var(--line); }
.stat:nth-child(-n+2) { border-top:0; }
.stat:nth-child(odd) { border-left:0; }
.type-card.sm { grid-column:span 6; }
.type-card.big .type-media, .type-card.sm .type-media { aspect-ratio:16 / 10; }
.type-card.more { flex-direction:column; align-items:flex-start; }
.f-lg, .f-sm { grid-column:span 6; }
.export-grid { grid-template-columns:1fr 1fr; }
.palette-card { grid-template-columns:repeat(2,1fr); padding:1.25rem; }
.qs-card { padding:1.75rem 1.5rem; }
.cta-card { padding:3rem 1.5rem 2.5rem; }
.cta-actions { flex-direction:column; gap:1rem; }
.cta-install { width:100%; justify-content:center; }
footer { padding:2rem 1.25rem; }
.footer-inner { grid-template-columns:minmax(0,1fr); }
.footer-left, .footer-links { flex-wrap:wrap; }
.footer-left { border-right:0; border-bottom:1px solid var(--line); }
}
</style>
</head>
<body>
<div class="grid-bg" aria-hidden="true"></div>
<!-- NAV -->
<nav class="site-nav" aria-label="Primary navigation">
<a class="nav-logo" href="#">
<img class="nav-logo-text brand-lockup" src="assets/archify-lockup-light.svg" alt="Archify" width="117" height="32">
</a>
<div class="nav-right">
<div class="nav-links">
<a class="nav-link" href="guide.html" data-i18n="nav-guide">Guide</a>
<a class="nav-link" href="gallery.html" data-i18n="nav-gallery">Proof Lab</a>
<a class="nav-link" href="start.html" data-i18n="nav-start">Start</a>
<a class="nav-link" href="community.html" data-i18n="nav-community">Community</a>
<a class="nav-link nav-github" href="https://github.com/tt-a1i/archify" target="_blank" rel="noopener"><svg class="nav-star" viewBox="0 0 16 16" aria-hidden="true"><path d="M 8 1.6 l 1.9 3.9 l 4.3 0.6 l -3.1 3 l 0.7 4.3 L 8 11.4 l -3.8 2 l 0.7 -4.3 l -3.1 -3 l 4.3 -0.6 Z"/></svg>GitHub</a>
</div>
<button class="btn btn-lang" id="btn-lang">中文</button>
<a class="btn btn-primary nav-cta" href="#quickstart" data-i18n="nav-install">Install Skill</a>
</div>
</nav>
<!-- HERO — bento: intro / live proof / specimen rail / stats -->
<section class="hero" data-proof-aperture="first-fold">
<div class="container">
<div class="hero-bento">
<div class="hero-intro">
<div class="hero-badge fade-up">
<div class="pulse-dot"></div>
<span data-i18n="hero-badge">Agent Skill · stable · v3.2.0</span>
</div>
<h1 class="fade-up d1" data-i18n="hero-h1">From plain English<br>to architecture <em>you can trust.</em></h1>
<p class="hero-sub fade-up d2" data-i18n="hero-sub">Describe your system in chat. Archify generates a polished, explorable HTML diagram — with progressive MAP → READ → FULL detail, a semantic camera, path-aware stories, motion, and ultra-crisp export built in.</p>
<div class="hero-actions fade-up d3">
<a class="btn btn-primary" href="guide.html">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><path d="M2 7h10M7 2l5 5-5 5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/></svg>
<span data-i18n="hero-cta">Choose the right diagram</span>
</a>
<a class="btn btn-ghost" href="gallery.html">
<svg width="14" height="14" viewBox="0 0 14 14" fill="none"><rect x="1.5" y="1.5" width="4" height="4" stroke="currentColor"/><rect x="8.5" y="1.5" width="4" height="4" stroke="currentColor"/><rect x="1.5" y="8.5" width="4" height="4" stroke="currentColor"/><rect x="8.5" y="8.5" width="4" height="4" stroke="currentColor"/></svg>
<span data-i18n="hero-gallery">Explore proof gallery</span>
</a>
</div>
</div>
<!-- MAIN LIVE PROOF -->
<div class="proof-main fade-up d2" id="hero-proof-stage" data-proof-playback="first-fold-once">
<div class="proof-chrome">
<div class="proof-status">
<span class="proof-live" data-i18n="proof-live">Live proof</span>
<div class="proof-status-copy">
<strong data-i18n="proof-status">Generated, checked, interactive</strong>
<span data-i18n="proof-receipt">Real gallery artifact · 9/9 validation checks</span>
</div>
</div>
<a class="proof-open" id="proof-open" href="gallery/artifacts/agent-tool-call.workflow.html?present=1&play=1#view=happy-path" target="_blank" rel="noopener">
<span data-i18n="proof-open">Open artifact</span><span aria-hidden="true">↗</span>
</a>
</div>
<div class="proof-viewport" id="hero-proof-panel" role="tabpanel" aria-labelledby="proof-tab-signal">
<iframe id="hero-proof-frame" data-proof="signal" src="gallery/artifacts/agent-tool-call.workflow.html?embed=1&play=1&theme=dark#view=happy-path" title="Agent Tool Call live Archify proof" loading="eager" sandbox="allow-scripts"></iframe>
</div>
<div class="proof-caption" aria-live="polite">
<div class="proof-caption-main">
<span id="proof-meta">Workflow · Signal Flow · 12 nodes · 11 edges</span>
<strong id="proof-title">Agent Tool Call — policy, execution, recovery, and evidence</strong>
</div>
<span class="proof-hint" data-i18n="proof-hint">Pin one exact Story Moment, copy its stable link, and let someone else open the same authored node.</span>
</div>
</div>
<!-- SPECIMEN RAIL (tablist) -->
<div class="proof-rail fade-up d3" id="proof-tabs" role="tablist" aria-label="Choose a live Archify proof">
<div class="rail-label" data-i18n="rail-label">Live specimens — select to load</div>
<button class="spec-card" id="proof-tab-signal" type="button" role="tab" aria-controls="hero-proof-panel" aria-selected="true" tabindex="0" data-proof="signal">
<div class="spec-top">
<span class="spec-idx">S·01</span>
<span class="spec-glyph" aria-hidden="true">
<svg width="34" height="26" viewBox="0 0 34 26" fill="none">
<path d="M1 5h32M1 13h32M1 21h32" stroke-width="1" opacity=".35"/>
<rect x="4" y="3" width="7" height="4" rx="1" stroke-width="1.25"/>
<rect x="14" y="11" width="7" height="4" rx="1" stroke-width="1.25"/>
<rect x="23" y="19" width="7" height="4" rx="1" stroke-width="1.25"/>
<path d="M11 5h6v6M21 13h4v6" stroke-width="1.25"/>
</svg>
</span>
</div>
<span class="spec-name">Agent Tool Call</span>
<span class="spec-meta">Workflow · Signal Flow · 12 nodes · 11 edges</span>
</button>
<button class="spec-card" id="proof-tab-blueprint" type="button" role="tab" aria-controls="hero-proof-panel" aria-selected="false" tabindex="-1" data-proof="blueprint">
<div class="spec-top">
<span class="spec-idx">S·02</span>
<span class="spec-glyph" aria-hidden="true">
<svg width="34" height="26" viewBox="0 0 34 26" fill="none">
<rect x="1" y="1" width="32" height="24" rx="2" stroke-width="1.25"/>
<rect x="5" y="5" width="10" height="7" rx="1" stroke-width="1.25"/>
<rect x="19" y="5" width="10" height="7" rx="1" stroke-width="1.25"/>
<rect x="5" y="16" width="24" height="5" rx="1" stroke-width="1.25"/>
<path d="M15 8.5h4M17 12v4" stroke-width="1.25"/>
</svg>
</span>
</div>
<span class="spec-name">Production Deployment</span>
<span class="spec-meta">Architecture · Blueprint · 12 nodes · 12 edges</span>
</button>
<button class="spec-card" id="proof-tab-classic" type="button" role="tab" aria-controls="hero-proof-panel" aria-selected="false" tabindex="-1" data-proof="classic">
<div class="spec-top">
<span class="spec-idx">S·03</span>
<span class="spec-glyph" aria-hidden="true">
<svg width="34" height="26" viewBox="0 0 34 26" fill="none">
<circle cx="6" cy="3.5" r="2.5" stroke-width="1.25"/>
<circle cx="17" cy="3.5" r="2.5" stroke-width="1.25"/>
<circle cx="28" cy="3.5" r="2.5" stroke-width="1.25"/>
<path d="M6 6v18M17 6v18M28 6v18" stroke-width="1" stroke-dasharray="2.5 2.5" opacity=".45"/>
<path d="M6 11h9.5M13 9l2.5 2-2.5 2" stroke-width="1.25"/>
<path d="M17 17h9.5M24 15l2.5 2-2.5 2" stroke-width="1.25"/>
</svg>
</span>
</div>
<span class="spec-name">Cache Miss</span>
<span class="spec-meta">Sequence · Classic · 7 participants · 12 messages</span>
</button>
</div>
<!-- STATS STRIP -->
<div class="hero-stats fade-up d4">
<div class="stat"><b>10</b><span data-i18n="stat-types">Diagram types</span></div>
<div class="stat"><b>04</b><span data-i18n="stat-presets">Visual presets</span></div>
<div class="stat"><b>02</b><span data-i18n="stat-themes">Coordinated themes</span></div>
<div class="stat"><b>4<sup>×</sup></b><span data-i18n="stat-export">Native export scale</span></div>
<div class="stat"><b>00</b><span data-i18n="stat-deps">Dependencies</span></div>
</div>
</div>
</div>
</section>
<div class="divider"></div>
<!-- DIAGRAM TYPES — asymmetric bento deck -->
<section id="types">
<div class="container">
<div class="types-header">
<div class="fade-up">
<div class="section-label" data-i18n="label-types">Diagram Types</div>
<h2 class="section-heading" data-i18n="types-h2">Five ways to see your system.</h2>
<p class="section-body" data-i18n="types-body">Architecture, workflows, sequences, data flows, or state machines — describe what you need and Archify picks the right visual language.</p>
</div>
</div>
<div class="types-bento">
<div class="type-card big fade-up" data-type="arch">
<div class="type-media">
<span class="type-tag">T·01</span>
<img src="assets/archify-architecture.png" alt="Architecture diagram">
</div>
<div class="type-body">
<h3 data-i18n="arch-h">Architecture</h3>
<p data-i18n="arch-p">System components, cloud resources, databases, caches, services, security groups, and the connections between them.</p>
<ul class="type-uses">
<li data-i18n="arch-li1">AWS / GCP / Azure infra</li>
<li data-i18n="arch-li2">Microservices topology</li>
<li data-i18n="arch-li3">Security boundaries</li>
<li data-i18n="arch-li4">Network layout</li>
</ul>
</div>
</div>
<div class="type-card sm fade-up d1" data-type="wf">
<div class="type-media">
<span class="type-tag">T·02</span>
<img src="assets/archify-workflow.png" alt="Workflow diagram">
</div>
<div class="type-body">
<h3 data-i18n="wf-h">Workflow</h3>
<p data-i18n="wf-p">Swim-lane processes with semantic nodes and anchored edges — approval gates, async branches, and observability paths, lane by lane.</p>
</div>
</div>
<div class="type-card sm fade-up d2" data-type="seq">
<div class="type-media">
<span class="type-tag">T·03</span>
<img src="assets/archify-sequence.png" alt="Sequence diagram">
</div>
<div class="type-body">
<h3 data-i18n="seq-h">Sequence</h3>
<p data-i18n="seq-p">API call chains, request lifecycles, cache fallback paths, auth checks, async traces — who calls whom, in what order, and what returns.</p>
</div>
</div>
<div class="type-card sm fade-up d1" data-type="flow">
<div class="type-media">
<span class="type-tag">T·04</span>
<img src="assets/archify-dataflow.png" alt="Data flow diagram">
</div>
<div class="type-body">
<h3 data-i18n="flow-h">Data Flow</h3>
<p data-i18n="flow-p">Data pipelines, ETL/ELT, analytics events, PII isolation, warehouse sync, lineage, and downstream consumers — with governance boundaries.</p>
</div>
</div>
<div class="type-card sm fade-up d2" data-type="life">
<div class="type-media">
<span class="type-tag">T·05</span>
<img src="assets/archify-lifecycle.png" alt="Lifecycle diagram">
</div>
<div class="type-body">
<h3 data-i18n="life-h">Lifecycle</h3>
<p data-i18n="life-p">State machines, object lifecycles, run/order/deployment status transitions — with wait states, retries, cancellation, and terminal outcomes.</p>
</div>
</div>
<a class="type-card more fade-up d3" href="gallery.html">
<div>
<div class="more-kicker" data-i18n="label-gallery">Index</div>
<div class="more-title" data-i18n="types-more">Browse the full proof gallery</div>
<div class="more-sub" data-i18n="types-more-sub">Live artifacts · every preset · every type</div>
</div>
<span class="more-arrow" aria-hidden="true">↗</span>
</a>
</div>
</div>
</section>
<div class="divider"></div>
<!-- FEATURES — numbered text cards -->
<section id="features">
<div class="container">
<div class="fade-up" style="margin-bottom:2.75rem">
<div class="section-label" data-i18n="label-features">Features</div>
<h2 class="section-heading" data-i18n="features-h2">Production-ready output,<br>zero configuration.</h2>
</div>
<div class="features-bento">
<div class="feature-card f-lg fade-up">
<h3 data-i18n="f1-h">Four visual identities</h3>
<p data-i18n="f1-p">Classic, Signal Flow, Blueprint, and Editorial share one geometry contract. Every preset includes coordinated dark/light themes and exports cleanly.</p>
<span class="feature-tag" data-i18n="f1-tag">4 PRESETS · 2 THEMES</span>
</div>
<div class="feature-card f-lg fade-up d1">
<h3 data-i18n="f2-h">Ultra-crisp 4× export</h3>
<p data-i18n="f2-p">PNG, JPEG, WebP — all rasterized natively at up to 4× source resolution by the browser. No upsampling blur. Sharp on retina displays, slides, and print.</p>
<span class="feature-tag" data-i18n="f2-tag">PNG · JPEG · WEBP</span>
</div>
<div class="feature-card f-sm fade-up d2">
<h3 data-i18n="f3-h">Dual-theme SVG</h3>
<p data-i18n="f3-p">The SVG export ships with both variable sets plus a @media prefers-color-scheme rule. Drop one file into a GitHub README — it follows the reader's theme.</p>
<span class="feature-tag" data-i18n="f3-tag">VECTOR · SELF-THEMED</span>
</div>
<div class="feature-card f-sm fade-up d3">
<h3 data-i18n="f4-h">Copy to clipboard</h3>
<p data-i18n="f4-p">One button puts a PNG straight on your clipboard. Paste directly into Slack, Notion, GitHub, or Figma — no intermediate save step.</p>
<span class="feature-tag" data-i18n="f4-tag">INSTANT SHARE</span>
</div>
<div class="feature-card f-sm fade-up d4">
<h3 data-i18n="f5-h">Self-contained HTML</h3>
<p data-i18n="f5-p">One HTML file. Zero dependencies, no server, no runtime. Open it in any browser and it works. Share by attaching it to an email or PR comment.</p>
<span class="feature-tag" data-i18n="f5-tag">ZERO DEPS</span>
</div>
<div class="feature-card f-sm fade-up d2">
<h3 data-i18n="f6-h">Iterate by chat</h3>
<p data-i18n="f6-p">"Add Redis", "move auth to the left", "use emerald for the API" — refine in natural language. No diagram editor to learn.</p>
<span class="feature-tag" data-i18n="f6-tag">CONVERSATIONAL</span>
</div>
<div class="feature-card f-sm fade-up d3">
<h3 data-i18n="f7-h">Inspect and play real routes</h3>
<p data-i18n="f7-p">Route Journey keeps the complete authored path visible while you inspect any stop or play one finite, reader-controlled pass over each exact incoming relationship.</p>
<span class="feature-tag" data-i18n="f7-tag">INSPECT · PLAY · PAUSE</span>
</div>
<div class="feature-card f-sm fade-up d4">
<h3 data-i18n="f8-h">Anticipate and share the exact story moment</h3>
<p data-i18n="f8-p">Story Horizon distinguishes the exact next stop, while Semantic Story Carrier shows whether its one authored relationship is a call, data, event, security, or state transition. Pin any beat or share the same stable moment.</p>
<span class="feature-tag" data-i18n="f8-tag">FOLLOW · ANTICIPATE · SHARE</span>
</div>
</div>
<div class="fade-up d2">
<p class="export-label-row" data-i18n="export-label">Export formats</p>
<div class="export-grid">
<div class="export-item"><div class="fmt">PNG</div><div class="desc" data-i18n="exp-png">Transparent · 4× native</div></div>
<div class="export-item"><div class="fmt">JPEG</div><div class="desc" data-i18n="exp-jpg">Theme bg · 4× native</div></div>
<div class="export-item"><div class="fmt">WEBP</div><div class="desc" data-i18n="exp-webp">Small · 4× native</div></div>
<div class="export-item"><div class="fmt">SVG</div><div class="desc" data-i18n="exp-svg">Vector · dual-theme</div></div>
<div class="export-item"><div class="fmt">WEBM</div><div class="desc" data-i18n="exp-webm">Motion · browser-native</div></div>
<div class="export-item"><div class="fmt" data-i18n="exp-clip-fmt">Clipboard</div><div class="desc" data-i18n="exp-clip">Copy PNG · instant paste</div></div>
</div>
</div>
</div>
</section>
<div class="divider"></div>
<!-- COLOR PALETTE — one specimen strip -->
<section id="palette">
<div class="container">
<div class="fade-up" style="margin-bottom:2.75rem">
<div class="section-label" data-i18n="label-palette">Design System</div>
<h2 class="section-heading" data-i18n="palette-h2">A semantic color language for infrastructure.</h2>
<p class="section-body" style="margin-top:.5rem" data-i18n="palette-body">Seven component types. Each with coordinated dark and light variants that switch together via the theme toggle.</p>
</div>
<div class="palette-card fade-up">
<div class="palette-chip" style="--node:var(--cyan);--node-fill:var(--cyan-fill);--node-dark:#22d3ee">
<div class="chip-nodes">
<div class="mini-node"><b>Web App</b><span>React SPA</span></div>
<div class="mini-node dark"><b>Web App</b><span>React SPA</span></div>
</div>
<div class="chip-label" style="color:var(--cyan)" data-i18n="chip-frontend">Frontend</div>
<div class="chip-use" data-i18n="chip-frontend-use">Client apps, browsers, mobile, UI</div>
</div>
<div class="palette-chip" style="--node:var(--emerald);--node-fill:var(--emerald-fill);--node-dark:#34d399">
<div class="chip-nodes">
<div class="mini-node"><b>API Server</b><span>Fastify :8080</span></div>
<div class="mini-node dark"><b>API Server</b><span>Fastify :8080</span></div>
</div>
<div class="chip-label" style="color:var(--emerald)" data-i18n="chip-backend">Backend</div>
<div class="chip-use" data-i18n="chip-backend-use">Services, APIs, workers, daemons</div>
</div>
<div class="palette-chip" style="--node:var(--violet);--node-fill:var(--violet-fill);--node-dark:#a78bfa">
<div class="chip-nodes">
<div class="mini-node"><b>Postgres</b><span>primary :5432</span></div>
<div class="mini-node dark"><b>Postgres</b><span>primary :5432</span></div>
</div>
<div class="chip-label" style="color:var(--violet)" data-i18n="chip-database">Database</div>
<div class="chip-use" data-i18n="chip-database-use">DBs, caches, stores, AI/ML</div>
</div>
<div class="palette-chip" style="--node:var(--amber);--node-fill:var(--amber-fill);--node-dark:#fbbf24">
<div class="chip-nodes">
<div class="mini-node"><b>CloudFront</b><span>CDN</span></div>
<div class="mini-node dark"><b>CloudFront</b><span>CDN</span></div>
</div>
<div class="chip-label" style="color:var(--amber)" data-i18n="chip-cloud">Cloud</div>
<div class="chip-use" data-i18n="chip-cloud-use">Managed services, infra</div>
</div>
<div class="palette-chip" style="--node:var(--rose);--node-fill:var(--rose-fill);--node-dark:#fb7185">
<div class="chip-nodes">
<div class="mini-node"><b>Auth Provider</b><span>OAuth 2.0</span></div>
<div class="mini-node dark"><b>Auth Provider</b><span>OAuth 2.0</span></div>
</div>
<div class="chip-label" style="color:var(--rose)" data-i18n="chip-security">Security</div>
<div class="chip-use" data-i18n="chip-security-use">Auth, secrets, guards</div>
</div>
<div class="palette-chip" style="--node:var(--orange);--node-fill:var(--orange-fill);--node-dark:#fb923c">
<div class="chip-nodes">
<div class="mini-node"><b>Kafka</b><span>events topic</span></div>
<div class="mini-node dark"><b>Kafka</b><span>events topic</span></div>
</div>
<div class="chip-label" style="color:var(--orange)" data-i18n="chip-bus">Message Bus</div>
<div class="chip-use" data-i18n="chip-bus-use">Kafka, RabbitMQ, SNS</div>
</div>
<div class="palette-chip" style="--node:var(--slate);--node-fill:var(--slate-fill);--node-dark:#94a3b8">
<div class="chip-nodes">
<div class="mini-node"><b>Users</b><span>browser · mobile</span></div>
<div class="mini-node dark"><b>Users</b><span>browser · mobile</span></div>
</div>
<div class="chip-label" style="color:var(--slate)" data-i18n="chip-external">External</div>
<div class="chip-use" data-i18n="chip-external-use">Users, 3rd parties, generic</div>
</div>
</div>
</div>
</section>
<div class="divider"></div>
<!-- QUICK START -->
<section id="quickstart">
<div class="container">
<div class="fade-up" style="margin-bottom:2.75rem">
<div class="section-label" data-i18n="label-qs">Quick Start</div>
<h2 class="section-heading" data-i18n="qs-h2">Up and running<br>in three steps.</h2>
<p class="section-body" data-i18n="qs-body">One checked Skill for Cursor, Claude Code, Codex, and OpenCode. Their switcher generates exact commands.</p>
</div>
<div class="quickstart-layout">
<div class="qs-card fade-up d1">
<div class="steps">
<div class="step">
<div class="step-num">1</div>
<div class="step-content">
<h4 data-i18n="step1-h">Install in one command</h4>
<p data-i18n="step1-p">Run <code>npx skills add tt-a1i/archify -g</code>, or open the <a href="start.html?agent=cursor&type=architecture">agent-aware quick start</a> for an exact Cursor, Codex, Claude Code, or OpenCode command.</p>
</div>
</div>
<div class="step">
<div class="step-num">2</div>
<div class="step-content">
<h4 data-i18n="step2-h">Describe your system</h4>
<p data-i18n="step2-p">Describe components, connections, and cloud services — or ask your agent to analyze the repository first.</p>
</div>
</div>
<div class="step">
<div class="step-num">3</div>
<div class="step-content">
<h4 data-i18n="step3-h">Ask your agent to draw it</h4>
<p data-i18n="step3-p">Tell your agent to use Archify. It generates a self-contained HTML file you can open in any browser and refine in chat.</p>
</div>
</div>
</div>
</div>
<div class="fade-up d2">
<div class="shortcut-box">
<p class="shortcut-title" data-i18n="kbd-label">Keyboard shortcuts</p>
<div class="shortcut-rows">
<div class="shortcut-row"><span data-i18n="kbd-guide">Diagram guide</span><kbd>?</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-theme">Toggle theme</span><kbd>T</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-find">Find node / route endpoint</span><kbd>/</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-route">Trace, inspect, and play a route</span><kbd>R</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-radar">Semantic radar</span><kbd>M</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-lens">Compare semantic kinds</span><kbd>L</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-present">Presentation stage</span><kbd>F</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-export">Open export menu</span><kbd>E</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-focus">Focus node</span><kbd>Enter</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-views">Guided views</span><kbd>[ ]</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-play">Play story</span><kbd>P</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-zoom">Reading depth / reset</span><kbd>+ − 0</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-nav">Navigate menu</span><kbd>↑ ↓</kbd></div>
<div class="shortcut-row"><span data-i18n="kbd-close">Close menu</span><kbd>Esc</kbd></div>
</div>
</div>
</div>
</div>
<div class="fade-up d2">
<div class="install-strip">
<div id="code-en">
<p class="install-cmt"># Install globally for Cursor</p>
<p class="install-cmd">npx -y skills add tt-a1i/archify --skill archify --agent cursor --global --copy --yes</p>
<p class="install-cmt"># Or try with Codex, without a permanent install</p>
<p class="install-cmd">npx skills use tt-a1i/archify@archify --agent codex</p>
</div>
<div id="code-zh" style="display:none">
<p class="install-cmt"># 全局安装到 Cursor</p>
<p class="install-cmd">npx -y skills add tt-a1i/archify --skill archify --agent cursor --global --copy --yes</p>
<p class="install-cmt"># 或者用临时副本启动 Codex</p>
<p class="install-cmd">npx skills use tt-a1i/archify@archify --agent codex</p>
</div>
</div>
</div>
</div>
</section>
<!-- CLOSING CTA -->
<section id="cta">
<div class="container">
<div class="cta-card fade-up">
<h2 class="cta-h" data-i18n="cta-h">Describe it once.<br><em>Share the map.</em></h2>
<p class="cta-sub" data-i18n="cta-sub">One command installs the checked skill for Cursor, Claude Code, Codex, or OpenCode — and your next diagram is a chat message away.</p>
<div class="cta-actions">
<a class="cta-install" href="start.html" data-i18n="cta-install">Install the skill</a>
<a class="cta-gh" href="https://github.com/tt-a1i/archify" target="_blank" rel="noopener">github.com/tt-a1i/archify ↗</a>
</div>
<p class="cta-cmd">$ <b>npx skills add tt-a1i/archify -g</b></p>
</div>
</div>
</section>
<!-- FOOTER -->
<footer>
<div class="footer-inner">
<div class="footer-left">
<a class="nav-logo" href="#">
<img class="nav-logo-text brand-lockup" src="assets/archify-lockup-light.svg" alt="Archify" width="117" height="32">
</a>
<p class="footer-meta" data-i18n="footer-meta">stable · v3.2.0 · Apache License 2.0<br>Based on Cocoon-AI/architecture-diagram-generator</p>
</div>
<div class="footer-links">
<a href="https://github.com/tt-a1i/archify" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/tt-a1i/archify/blob/main/CHANGELOG.md" target="_blank" rel="noopener" data-i18n="footer-changelog">Changelog</a>
<a href="https://github.com/tt-a1i/archify/blob/main/LICENSE" target="_blank" rel="noopener" data-i18n="footer-license">License</a>
</div>
</div>
</footer>
<script src="assets/site-language.js"></script>
<script>
/* ══════════════════════════════════════
i18n strings
══════════════════════════════════════ */
const LANGS = {
en: {
'nav-guide':'Guide','nav-gallery':'Proof Lab','nav-start':'Start','nav-community':'Community','nav-install':'Install Skill',
'hero-badge':'Agent Skill · stable · v3.2.0',
'hero-h1':'From plain English<br>to architecture <em>you can trust.</em>',
'hero-sub':'Describe your system in chat. Archify generates a polished, explorable HTML diagram — with progressive MAP → READ → FULL detail, a semantic camera, path-aware stories, motion, and ultra-crisp export built in.',
'hero-cta':'Choose the right diagram','hero-gallery':'Explore proof gallery',
'proof-live':'Live proof','proof-status':'Generated, checked, interactive','proof-receipt':'Real gallery artifact · 9/9 validation checks','proof-open':'Open artifact','proof-hint':'Play a story that follows the current authored moment, then pin and share that exact node.',
'rail-label':'Live specimens — select to load',
'stat-types':'Diagram types','stat-presets':'Visual presets','stat-themes':'Coordinated themes','stat-export':'Native export scale','stat-deps':'Dependencies',
'label-types':'Diagram Types',
'types-h2':'Five ways to see your system.',
'types-body':'Architecture, workflows, sequences, data flows, or state machines — describe what you need and Archify picks the right visual language.',
'label-gallery':'Index',
'types-more':'Browse the full proof gallery','types-more-sub':'Live artifacts · every preset · every type',
'arch-h':'Architecture',
'arch-p':'System components, cloud resources, databases, caches, services, security groups, and the connections between them.',
'arch-li1':'AWS / GCP / Azure infra','arch-li2':'Microservices topology','arch-li3':'Security boundaries','arch-li4':'Network layout',
'wf-h':'Workflow',
'wf-p':'Swim-lane processes with semantic nodes and anchored edges — approval gates, async branches, and observability paths, lane by lane.',
'seq-h':'Sequence',
'seq-p':'API call chains, request lifecycles, cache fallback paths, auth checks, async traces — who calls whom, in what order, and what returns.',
'flow-h':'Data Flow',
'flow-p':'Data pipelines, ETL/ELT, analytics events, PII isolation, warehouse sync, lineage, and downstream consumers — with governance boundaries.',
'life-h':'Lifecycle',
'life-p':'State machines, object lifecycles, run/order/deployment status transitions — with wait states, retries, cancellation, and terminal outcomes.',
'label-features':'Features',
'features-h2':'Production-ready output,<br>zero configuration.',
'f1-h':'Four visual identities','f1-p':'Classic, Signal Flow, Blueprint, and Editorial share one geometry contract. Every preset includes coordinated dark/light themes and exports cleanly.','f1-tag':'4 PRESETS · 2 THEMES',
'f2-h':'Ultra-crisp 4× export','f2-p':'PNG, JPEG, WebP — all rasterized natively at up to 4× source resolution by the browser. No upsampling blur. Sharp on retina displays, slides, and print.','f2-tag':'PNG · JPEG · WEBP',
'f3-h':'Dual-theme SVG','f3-p':"The SVG export ships with both variable sets plus a @media prefers-color-scheme rule. Drop one file into a GitHub README — it follows the reader's theme.",'f3-tag':'VECTOR · SELF-THEMED',
'f4-h':'Copy to clipboard','f4-p':'One button puts a PNG straight on your clipboard. Paste directly into Slack, Notion, GitHub, or Figma — no intermediate save step.','f4-tag':'INSTANT SHARE',
'f5-h':'Self-contained HTML','f5-p':'One HTML file. Zero dependencies, no server, no runtime. Open it in any browser and it works. Share by attaching it to an email or PR comment.','f5-tag':'ZERO DEPS',
'f6-h':'Iterate by chat','f6-p':'"Add Redis", "move auth to the left", "use emerald for the API" — refine in natural language. No diagram editor to learn.','f6-tag':'CONVERSATIONAL',
'f7-h':'Inspect and play real routes','f7-p':'Route Journey keeps the complete authored path visible while you inspect any stop or play one finite, reader-controlled pass over each exact incoming relationship.','f7-tag':'INSPECT · PLAY · PAUSE',
'f8-h':'Anticipate and share the exact story moment','f8-p':'Story Horizon distinguishes the exact next stop, while Semantic Story Carrier shows whether its one authored relationship is a call, data, event, security, or state transition. Pin any beat or share the same stable moment.','f8-tag':'FOLLOW · ANTICIPATE · SHARE',
'export-label':'Export formats',
'exp-png':'Transparent · 4× native','exp-jpg':'Theme bg · 4× native','exp-webp':'Small · 4× native','exp-svg':'Vector · dual-theme','exp-webm':'Motion · browser-native','exp-clip-fmt':'Clipboard','exp-clip':'Copy PNG · instant paste',
'label-palette':'Design System',
'palette-h2':'A semantic color language for infrastructure.',
'palette-body':'Seven component types. Each with coordinated dark and light variants that switch together via the theme toggle.',
'chip-frontend':'Frontend','chip-frontend-use':'Client apps, browsers, mobile, UI',
'chip-backend':'Backend','chip-backend-use':'Services, APIs, workers, daemons',
'chip-database':'Database','chip-database-use':'DBs, caches, stores, AI/ML',
'chip-cloud':'Cloud','chip-cloud-use':'Managed services, infra',
'chip-security':'Security','chip-security-use':'Auth, secrets, guards',
'chip-bus':'Message Bus','chip-bus-use':'Kafka, RabbitMQ, SNS',
'chip-external':'External','chip-external-use':'Users, 3rd parties, generic',
'label-qs':'Quick Start',
'qs-h2':'Up and running<br>in three steps.',
'qs-body':'One checked Skill for Cursor, Claude Code, Codex, and OpenCode. Their switcher generates exact commands.',
'step1-h':'Install in one command','step1-p':'Run <code>npx skills add tt-a1i/archify -g</code>, or open the <a href="start.html?agent=cursor&type=architecture">agent-aware quick start</a> for an exact Cursor, Codex, Claude Code, or OpenCode command.',
'step2-h':'Describe your system','step2-p':'Describe components, connections, and cloud services — or ask your agent to analyze the repository first.',
'step3-h':'Ask your agent to draw it','step3-p':'Tell your agent to use Archify. It generates a self-contained HTML file you can open in any browser and refine in chat.',
'kbd-label':'Keyboard shortcuts','kbd-guide':'Diagram guide','kbd-theme':'Toggle theme','kbd-find':'Find node / route endpoint','kbd-route':'Trace, inspect, and play a route','kbd-radar':'Semantic radar','kbd-lens':'Compare semantic kinds','kbd-present':'Presentation stage','kbd-export':'Open export menu','kbd-focus':'Focus node','kbd-views':'Guided views','kbd-play':'Play story','kbd-zoom':'Reading depth / reset','kbd-nav':'Navigate menu','kbd-close':'Close menu',
'footer-meta':'stable · v3.2.0 · Apache License 2.0<br>Based on Cocoon-AI/architecture-diagram-generator',
'cta-h':'Describe it once.<br><em>Share the map.</em>',
'cta-sub':'One command installs the checked skill for Cursor, Claude Code, Codex, or OpenCode — and your next diagram is a chat message away.',
'cta-install':'Install the skill',
'footer-changelog':'Changelog','footer-license':'License'
},
zh: {
'nav-guide':'场景指南','nav-gallery':'验证作品集','nav-start':'快速上手','nav-community':'社区包','nav-install':'安装技能',
'hero-badge':'Agent 技能 · 稳定版 · v3.2.0',
'hero-h1':'用自然语言,<br>生成<em>可信的架构图。</em>',
'hero-sub':'在对话中描述你的系统,Archify 生成精美、可探索的 HTML 技术图——信息会按 MAP → READ → FULL 渐进展开,并内置语义镜头、路径故事、动态效果和超清导出。',
'hero-cta':'选择合适的图','hero-gallery':'查看验证作品集',
'proof-live':'实时成品','proof-status':'自动生成 · 检查通过 · 可交互','proof-receipt':'真实作品集成品 · 9/9 项验证通过','proof-open':'打开完整成品','proof-hint':'播放会跟随当前作者时刻的故事,再钉住并分享这个精确节点。',
'rail-label':'实时标本 · 点击加载',
'stat-types':'图表类型','stat-presets':'视觉预设','stat-themes':'深浅主题','stat-export':'原生导出倍率','stat-deps':'外部依赖',
'label-types':'图表类型',
'types-h2':'五种方式,读懂你的系统。',
'types-body':'架构图、工作流、时序图、数据流图、状态机——描述需求,Archify 自动选择最合适的可视化语言。',
'label-gallery':'索引',
'types-more':'浏览完整作品集','types-more-sub':'实时成品 · 全部预设 · 全部图型',
'arch-h':'架构图',
'arch-p':'系统组件、云资源、数据库、缓存、服务、安全组及其连接关系,一图清晰呈现。',
'arch-li1':'AWS / GCP / Azure 基础设施','arch-li2':'微服务拓扑','arch-li3':'安全边界','arch-li4':'网络布局',
'wf-h':'工作流图',
'wf-p':'泳道式流程:语义化节点与锚定连线——审批门、异步分支、观测路径,逐泳道清晰铺开。',
'seq-h':'时序图',
'seq-p':'API 调用链、请求生命周期、缓存回退路径、鉴权检查、异步追踪——谁调用谁、顺序如何、返回什么。',
'flow-h':'数据流图',
'flow-p':'数据管道、ETL/ELT、分析事件、PII 隔离、数仓同步、数据血缘及下游消费者——附治理边界。',
'life-h':'生命周期图',
'life-p':'状态机、对象生命周期、运行/订单/部署状态流转——含等待态、重试、取消和终态。',
'label-features':'功能特性',
'features-h2':'生产级输出,<br>零配置。',
'f1-h':'四套视觉身份','f1-p':'Classic、Signal Flow、Blueprint 和 Editorial 共用同一套几何契约;每套都提供协调的深浅主题并保持干净导出。','f1-tag':'4 套预设 · 2 套主题',
'f2-h':'超清 4× 导出','f2-p':'PNG、JPEG、WebP——由浏览器以最高 4 倍分辨率原生栅格化,无上采样模糊。视网膜屏、幻灯片、印刷均清晰。','f2-tag':'PNG · JPEG · WEBP',
'f3-h':'双主题 SVG','f3-p':'SVG 导出同时内置深色和浅色变量集,并附 @media prefers-color-scheme 规则。放入 GitHub README,自动跟随读者主题。','f3-tag':'矢量 · 自适应主题',
'f4-h':'复制到剪贴板','f4-p':'一键将 PNG 写入剪贴板,直接粘贴到 Slack、Notion、GitHub 或 Figma,无需手动保存。','f4-tag':'即时分享',
'f5-h':'独立 HTML 文件','f5-p':'单个 HTML 文件,零依赖、无需服务器或构建工具,任意浏览器打开即用。作为附件发邮件或贴 PR 评论均可。','f5-tag':'零依赖',
'f6-h':'对话式迭代','f6-p':'「加一个 Redis」「把鉴权移到左边」「API 用绿色」——用自然语言精调,无需学习任何图形编辑器。','f6-tag':'对话驱动',
'f7-h':'检查并播放真实路径','f7-p':'Route Journey 始终保留完整作者路径,可逐站检查,也可沿每条精确入向关系播放一次由读者控制的有限旅程。','f7-tag':'检查 · 播放 · 暂停',
'f8-h':'跟随并分享精确故事时刻','f8-p':'Story Horizon 指出唯一下一站,Semantic Story Carrier 则说明这条真实关系传递的是调用、数据、事件、安全还是状态变化;任意 beat 都可钉住或稳定分享。','f8-tag':'跟随 · 钉住 · 分享',
'export-label':'导出格式',
'exp-png':'透明底 · 4× 分辨率','exp-jpg':'主题背景 · 4× 分辨率','exp-webp':'体积小 · 4× 分辨率','exp-svg':'矢量 · 双主题','exp-webm':'动态 · 浏览器原生','exp-clip-fmt':'剪贴板','exp-clip':'复制 PNG · 即时粘贴',
'label-palette':'设计系统',
'palette-h2':'为基础设施而生的语义色彩系统。',
'palette-body':'七种组件类型,各有深色与浅色协调变体,随主题切换同步变换。',
'chip-frontend':'前端','chip-frontend-use':'客户端、浏览器、移动端、UI',
'chip-backend':'后端','chip-backend-use':'服务、API、Worker、守护进程',
'chip-database':'数据库','chip-database-use':'数据库、缓存、存储、AI/ML',
'chip-cloud':'云服务','chip-cloud-use':'托管服务、基础设施',
'chip-security':'安全','chip-security-use':'鉴权、密钥、安全网关',
'chip-bus':'消息总线','chip-bus-use':'Kafka、RabbitMQ、SNS',
'chip-external':'外部系统','chip-external-use':'用户、第三方、通用外部',
'label-qs':'快速开始',
'qs-h2':'三步上手,<br>即刻运行。',
'qs-body':'同一份经过检查的 Skill 可用于 Cursor、Claude Code、Codex 和 OpenCode,切换器会生成准确命令。',
'step1-h':'一条命令安装','step1-p':'运行 <code>npx skills add tt-a1i/archify -g</code>,或打开<a href="start.html?agent=cursor&type=architecture">可切换 Agent 的快速开始页</a>,获取准确的 Cursor、Codex、Claude Code 或 OpenCode 命令。',
'step2-h':'描述你的系统','step2-p':'描述组件、连接关系和云服务,也可以先让 agent 分析代码仓库。',
'step3-h':'让 agent 绘制','step3-p':'告诉 agent 使用 Archify,它会生成可在任意浏览器打开的单文件 HTML,并可继续在对话中迭代。',
'kbd-label':'键盘快捷键','kbd-guide':'图表指南','kbd-theme':'切换主题','kbd-find':'查找节点 / 路径端点','kbd-route':'探查、检查并播放路径','kbd-radar':'语义雷达','kbd-lens':'对比语义类型','kbd-present':'演示舞台','kbd-export':'打开导出菜单','kbd-focus':'聚焦节点','kbd-views':'引导视图','kbd-play':'播放故事','kbd-zoom':'阅读层级 / 复位','kbd-nav':'菜单导航','kbd-close':'关闭菜单',
'footer-meta':'稳定版 · v3.2.0 · Apache-2.0 许可证<br>基于 Cocoon-AI/architecture-diagram-generator',
'cta-h':'描述一次,<br><em>分享这张图。</em>',
'cta-sub':'一条命令即可为 Cursor、Claude Code、Codex 或 OpenCode 安装经过检查的技能——你的下一张架构图,只差一句对话。',
'cta-install':'安装技能',
'footer-changelog':'更新日志','footer-license':'许可证'
}
};
const PROOFS = {
signal: {
artifact: 'gallery/artifacts/agent-tool-call.workflow.html',
view: 'happy-path',
iframeTitle: { en: 'Agent Tool Call live Archify proof', zh: '智能体工具调用 Archify 实时成品' },
name: { en: 'Agent Tool Call', zh: '智能体工具调用' },
meta: { en: 'Workflow · Signal Flow · 12 nodes · 11 edges', zh: '工作流 · Signal Flow · 12 节点 · 11 条关系' },
title: { en: 'Agent Tool Call — policy, execution, recovery, and evidence', zh: '智能体工具调用——策略、执行、恢复与证据闭环' }
},
blueprint: {
artifact: 'gallery/artifacts/production-deployment.architecture.html',
view: 'request-boundary',
iframeTitle: { en: 'Production Deployment live Archify proof', zh: '生产部署架构 Archify 实时成品' },
name: { en: 'Production Deployment', zh: '生产部署' },
meta: { en: 'Architecture · Blueprint · 12 nodes · 12 edges', zh: '架构图 · Blueprint · 12 节点 · 12 条关系' },
title: { en: 'Production Deployment — regions, ownership, state, and audit', zh: '生产部署——区域、归属、状态与审计边界' }
},
classic: {
artifact: 'gallery/artifacts/cache-miss.sequence.html',
view: 'cache-fallback',
iframeTitle: { en: 'Cache Miss Request live Archify proof', zh: '缓存未命中请求 Archify 实时成品' },
name: { en: 'Cache Miss', zh: '缓存未命中' },
meta: { en: 'Sequence · Classic · 7 participants · 12 messages', zh: '时序图 · Classic · 7 个参与者 · 12 条消息' },
title: { en: 'Cache Miss — authentication, fallback, return, and trace', zh: '缓存未命中——鉴权、回退、返回与追踪' }
}
};
let lang = ArchifySiteLanguage.read();
let activeProof = 'signal';
const btnLang = document.getElementById('btn-lang');
const proofStage = document.getElementById('hero-proof-stage');