File size: 35,457 Bytes
db121cf
94bd375
 
 
 
 
 
 
 
 
 
 
7e44a97
 
 
 
 
 
 
 
94bd375
 
 
 
 
 
 
 
 
 
7e44a97
 
94bd375
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
7e44a97
 
94bd375
 
 
 
 
 
7e44a97
94bd375
62291cd
 
 
 
 
 
 
 
94bd375
 
 
 
 
7e44a97
94bd375
 
 
7e44a97
94bd375
62291cd
 
 
 
 
94bd375
 
62291cd
 
 
7e44a97
94bd375
 
 
 
 
 
7e44a97
94bd375
7e44a97
 
94bd375
7e44a97
94bd375
 
 
 
7e44a97
 
94bd375
 
 
 
7e44a97
94bd375
 
7e44a97
94bd375
 
 
7e44a97
 
 
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
7e44a97
94bd375
 
 
 
 
 
7e44a97
 
 
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
7e44a97
94bd375
 
7e44a97
 
94bd375
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad08800
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
62291cd
94bd375
62291cd
94bd375
7e44a97
94bd375
 
 
 
 
7e44a97
 
 
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad08800
94bd375
 
 
 
 
 
 
62291cd
ad08800
94bd375
 
 
 
 
 
ad08800
 
94bd375
 
 
 
 
 
ad08800
 
94bd375
 
 
 
 
 
ad08800
 
94bd375
 
 
 
 
 
 
ad08800
94bd375
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
 
 
 
 
 
 
 
7e44a97
94bd375
 
 
 
 
7e44a97
94bd375
7e44a97
 
94bd375
 
7e44a97
 
 
 
 
94bd375
7e44a97
 
94bd375
 
7e44a97
94bd375
 
7e44a97
94bd375
 
 
 
 
 
 
 
62291cd
 
 
 
ad08800
62291cd
 
 
 
 
 
 
 
94bd375
 
 
 
 
 
7e44a97
 
 
 
 
 
 
 
 
 
94bd375
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db121cf
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
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="An interactive view of UniversalLabeler: language surfaces compress into evidence-linked semantic claims, then expand without discarding world information.">
  <title>UniversalLabeler — Meaning, packed.</title>
  <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=Bodoni+Moda:opsz,wght@6..96,400;6..96,600&amp;family=DM+Mono:wght@300;400;500&amp;display=swap" rel="stylesheet">
  <style>
    :root {
      --paper: #071116;
      --paper-deep: #0d1a21;
      --ink: #edf7f8;
      --muted: #7e969e;
      --signal: #53d9f5;
      --signal-soft: #b7f2ff;
      --line: rgba(157, 199, 210, .16);
      --line-strong: rgba(174, 216, 226, .38);
      --serif: "Bodoni Moda", "Iowan Old Style", "Times New Roman", serif;
      --mono: "DM Mono", "SFMono-Regular", Consolas, monospace;
    }

    * { box-sizing: border-box; }
    html { scroll-behavior: smooth; }
    body {
      margin: 0;
      color: var(--ink);
      background:
        radial-gradient(circle at 50% -10%, rgba(42, 105, 121, .18), transparent 38%),
        linear-gradient(90deg, transparent calc(50% - .5px), rgba(140,190,202,.035) 50%, transparent calc(50% + .5px)),
        var(--paper);
      font-family: var(--mono);
      overflow-x: hidden;
    }
    body::before {
      content: "";
      position: fixed;
      inset: 0;
      opacity: .035;
      pointer-events: none;
      z-index: 20;
      background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 180 180' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.45'/%3E%3C/svg%3E");
      mix-blend-mode: screen;
    }
    button, a { font: inherit; }
    button { color: inherit; }
    ::selection { background: var(--signal); color: var(--paper); }

    .shell { width: min(1600px, 100%); margin: 0 auto; padding: 0 28px; }
    .topbar {
      height: 72px;
      border-bottom: 1px solid var(--line-strong);
      display: grid;
      grid-template-columns: 1fr auto 1fr;
      align-items: center;
      position: relative;
      z-index: 5;
    }
    .mark { display: flex; align-items: center; gap: 12px; font-size: 11px; letter-spacing: .14em; text-transform: uppercase; }
    .mark-glyph { width: 28px; height: 28px; border: 1px solid var(--ink); display: grid; place-items: center; font-weight: 500; }
    .top-center { font-size: 10px; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); }
    .top-right { justify-self: end; display: flex; align-items: center; gap: 18px; font-size: 10px; text-transform: uppercase; letter-spacing: .12em; }
    .status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--signal); box-shadow: 0 0 0 4px rgba(83,217,245,.1), 0 0 18px rgba(83,217,245,.35); animation: breathe 4s ease-in-out infinite; }

    .hero {
      min-height: calc(100vh - 72px);
      display: grid;
      grid-template-rows: auto 1fr auto;
      padding-top: 44px;
      padding-bottom: 24px;
    }
    .hero-heading {
      display: grid;
      grid-template-columns: 1.25fr .75fr;
      align-items: end;
      gap: 40px;
      margin-bottom: 40px;
    }
    h1 { margin: 0; font: 400 clamp(52px, 7vw, 118px)/.82 var(--serif); letter-spacing: -.055em; max-width: 980px; }
    h1 em { color: var(--signal); font-style: italic; }
    .lede { margin: 0 0 6px auto; max-width: 440px; font-size: 12px; line-height: 1.75; color: var(--muted); }
    .lede strong { color: var(--ink); font-weight: 500; }

    .machine {
      min-height: 470px;
      border-top: 1px solid var(--line-strong);
      border-bottom: 1px solid var(--line-strong);
      display: grid;
      grid-template-columns: minmax(260px, .85fr) minmax(360px, 1.15fr) minmax(320px, 1fr);
      position: relative;
      isolation: isolate;
    }
    .machine::after {
      content: "";
      position: absolute;
      inset: 0;
      background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px);
      background-size: 44px 44px;
      opacity: .32;
      pointer-events: none;
      z-index: -1;
    }
    .panel { padding: 22px; min-width: 0; position: relative; }
    .panel + .panel { border-left: 1px solid var(--line-strong); }
    .panel-label { display: flex; align-items: center; justify-content: space-between; margin-bottom: 24px; font-size: 10px; letter-spacing: .16em; text-transform: uppercase; }
    .panel-label span:last-child { color: var(--muted); }

    .source-panel { display: flex; flex-direction: column; }
    .evidence-window {
      background: #02080b;
      color: var(--ink);
      min-height: 220px;
      position: relative;
      overflow: hidden;
      padding: 16px;
      display: flex;
      align-items: end;
      box-shadow: inset 0 0 0 1px rgba(183,242,255,.08), inset 0 -70px 80px rgba(24,78,91,.14);
    }
    .evidence-window::after {
      content: "";
      position: absolute;
      inset: 0;
      z-index: 1;
      pointer-events: none;
      background: linear-gradient(180deg, rgba(2,8,11,.08) 24%, rgba(2,8,11,.3) 57%, rgba(2,8,11,.94) 100%);
    }
    .evidence-window::before {
      content: "";
      position: absolute;
      width: 260px;
      height: 260px;
      border: 1px solid rgba(183,242,255,.16);
      border-radius: 50%;
      top: -122px;
      right: -82px;
      box-shadow: 0 0 0 34px rgba(83,217,245,.025), 0 0 0 68px rgba(83,217,245,.018);
    }
    .evidence-preview { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 48%; filter: saturate(.76) brightness(.76) contrast(1.08); opacity: .9; }
    .evidence-preview[hidden] { display: none; }
    .scene-glyph { position: absolute; inset: 0; z-index: 2; opacity: .16; transition: opacity .25s; }
    .evidence-window:not(.has-preview) .scene-glyph { opacity: .78; }
    .surface-line { position: relative; z-index: 3; font: 400 clamp(21px, 2vw, 32px)/1.06 var(--serif); max-width: 92%; text-shadow: 0 2px 18px #02080b; }
    .surface-line span { transition: color .35s, background .35s; }
    .surface-line .hot { color: var(--signal-soft); }
    .framecode { position: absolute; z-index: 3; top: 14px; left: 16px; color: rgba(183,242,255,.74); font-size: 9px; letter-spacing: .12em; text-shadow: 0 1px 8px #02080b; }
    .preview-kind { position: absolute; z-index: 3; top: 14px; right: 16px; color: rgba(183,242,255,.64); font-size: 8px; letter-spacing: .1em; text-transform: uppercase; text-shadow: 0 1px 8px #02080b; }
    .scope-line { position: absolute; z-index: 4; bottom: 0; left: 0; height: 2px; width: 100%; background: rgba(183,242,255,.1); }
    .scope-line::after { content: ""; display: block; height: 100%; width: var(--progress, 0%); background: var(--signal); box-shadow: 0 0 12px rgba(83,217,245,.48); transition: width 1.1s cubic-bezier(.22,.8,.3,1); }
    .evidence-meta { margin-top: auto; padding-top: 20px; display: grid; gap: 9px; font-size: 10px; }
    .meta-row { display: flex; justify-content: space-between; border-bottom: 1px solid var(--line); padding-bottom: 8px; }
    .meta-row span:last-child { color: var(--muted); text-align: right; }

    .core-panel { overflow: hidden; }
    .core-stage { height: 355px; position: relative; display: grid; place-items: center; }
    .orbit { position: absolute; border: 1px solid var(--line); border-radius: 50%; }
    .orbit.one { width: 326px; height: 326px; }
    .orbit.two { width: 250px; height: 250px; border-style: dashed; opacity: .7; }
    .orbit::before, .orbit::after { content: ""; position: absolute; width: 6px; height: 6px; background: var(--signal); border-radius: 50%; box-shadow: 0 0 14px rgba(83,217,245,.5); }
    .orbit::before { left: 50%; top: -4px; }
    .orbit::after { left: 50%; bottom: -3px; background: var(--muted); box-shadow: none; }
    .core {
      width: 178px;
      height: 178px;
      border-radius: 50%;
      background: #02080b;
      color: var(--ink);
      position: relative;
      display: grid;
      place-items: center;
      text-align: center;
      box-shadow: 0 0 0 12px var(--paper), 0 0 0 13px rgba(183,242,255,.7), 0 0 48px rgba(83,217,245,.1);
      z-index: 3;
    }
    .core::before { content: ""; position: absolute; inset: 16px; border: 1px dashed rgba(183,242,255,.28); border-radius: 50%; }
    .core-copy { position: relative; }
    .core-kicker { font-size: 9px; letter-spacing: .18em; color: var(--signal-soft); }
    .core-name { display: block; margin: 9px 0 5px; font: 400 25px/1 var(--serif); }
    .core-count { font-size: 9px; letter-spacing: .08em; color: rgba(183,242,255,.48); }
    .claim-node { position: absolute; font-size: 8px; letter-spacing: .08em; text-transform: uppercase; background: #0a171d; border: 1px solid rgba(183,242,255,.46); padding: 5px 7px; z-index: 4; transition: border-color .4s, background .4s, color .4s, box-shadow .4s; }
    .claim-node.active { background: rgba(83,217,245,.13); color: var(--signal-soft); border-color: var(--signal); box-shadow: 0 0 14px rgba(83,217,245,.16); }
    .n1{top:14px;left:19%}.n2{top:49px;right:6%}.n3{top:139px;right:0}.n4{bottom:58px;right:8%}.n5{bottom:8px;right:29%}.n6{bottom:18px;left:14%}.n7{bottom:92px;left:0}.n8{top:117px;left:0}.n9{top:45px;left:5%}
    .compression-meter { position: absolute; inset: auto 0 0; display: grid; grid-template-columns: repeat(3,1fr); border-top: 1px solid var(--line); }
    .metric { padding: 11px; border-right: 1px solid var(--line); }
    .metric:last-child { border: 0; }
    .metric b { display: block; font: 400 22px/1 var(--serif); }
    .metric span { font-size: 8px; color: var(--muted); letter-spacing: .1em; text-transform: uppercase; }

    .outputs { display: flex; flex-direction: column; gap: 0; }
    .output {
      appearance: none;
      border: 0;
      border-top: 1px solid var(--line);
      background: transparent;
      padding: 14px 0;
      display: grid;
      grid-template-columns: 58px 1fr 20px;
      align-items: baseline;
      gap: 10px;
      text-align: left;
      cursor: pointer;
      transition: padding .25s, color .25s;
    }
    .output:first-child { border-top: 0; }
    .output:hover, .output.active { padding-left: 10px; color: var(--signal-soft); background: linear-gradient(90deg, rgba(83,217,245,.07), transparent 72%); }
    .output-code { font-size: 9px; color: var(--muted); text-transform: uppercase; }
    .output-text { font: 400 clamp(17px, 1.45vw, 24px)/1.15 var(--serif); }
    .output-check { font-size: 11px; opacity: .3; }
    .output.active .output-check { opacity: 1; }
    .ledger { margin-top: auto; background: var(--paper-deep); padding: 13px; font-size: 9px; line-height: 1.8; }
    .ledger-line { display: flex; justify-content: space-between; }
    .ledger-line b { font-weight: 400; color: var(--signal); }

    .scenario-strip { display: grid; grid-template-columns: auto repeat(4, 1fr) auto; align-items: stretch; min-height: 66px; }
    .strip-label { padding: 0 18px 0 0; display: flex; align-items: center; font-size: 9px; text-transform: uppercase; letter-spacing: .15em; }
    .scenario {
      appearance: none; background: transparent; border: 0; border-left: 1px solid var(--line); padding: 12px 16px; text-align: left; cursor: pointer; position: relative; transition: background .35s;
    }
    .scenario:hover, .scenario.active { background: rgba(83,217,245,.045); }
    .scenario::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 3px; background: var(--signal); transition: right .35s; }
    .scenario.active::after { right: 0; }
    .scenario-num { display: block; color: var(--muted); font-size: 8px; margin-bottom: 5px; }
    .scenario-name { font: 400 15px/1 var(--serif); }
    .pause { appearance: none; border: 0; border-left: 1px solid var(--line); background: transparent; width: 58px; cursor: pointer; font-size: 15px; }

    .particle { position: fixed; z-index: 30; pointer-events: none; width: 6px; height: 6px; padding: 0; overflow: hidden; color: transparent; font-size: 0; background: var(--signal); border: 1px solid var(--signal-soft); border-radius: 50%; box-shadow: 0 0 16px rgba(83,217,245,.75); transition: transform .95s cubic-bezier(.2,.7,.2,1), opacity .28s .65s; }
    .machine.is-updating .surface-line, .machine.is-updating .outputs, .machine.is-updating .evidence-meta { opacity: .32; transform: translateY(3px); }
    .surface-line, .outputs, .evidence-meta { transition: opacity .22s ease, transform .22s ease; }

    .thesis { padding: 108px 0 90px; display: grid; grid-template-columns: .8fr 1.2fr; gap: 8vw; border-bottom: 1px solid var(--line-strong); }
    .thesis-index { font-size: 10px; letter-spacing: .15em; text-transform: uppercase; color: var(--muted); }
    .thesis h2 { font: 400 clamp(42px, 5vw, 82px)/.94 var(--serif); letter-spacing: -.04em; margin: 0; }
    .thesis h2 em { color: var(--signal); }
    .thesis-copy { display: grid; grid-template-columns: 1fr 1fr; gap: 34px; margin-top: 54px; font-size: 11px; line-height: 1.8; color: var(--muted); }
    .thesis-copy strong { color: var(--ink); font-weight: 500; }

    .packet-section { padding: 72px 0 100px; }
    .section-head { display: flex; justify-content: space-between; align-items: end; border-bottom: 1px solid var(--line-strong); padding-bottom: 18px; }
    .section-head h2 { margin: 0; font: 400 clamp(38px,4vw,64px)/1 var(--serif); letter-spacing: -.035em; }
    .section-head p { max-width: 440px; font-size: 10px; line-height: 1.7; color: var(--muted); margin: 0; }
    .packet-table { display: grid; }
    .packet-row { display: grid; grid-template-columns: 42px 180px 1fr 95px; gap: 18px; align-items: center; min-height: 64px; border-bottom: 1px solid var(--line); transition: background .2s; }
    .packet-row:hover { background: rgba(83,217,245,.045); }
    .packet-row .idx { color: var(--muted); font-size: 9px; }
    .packet-row .field { text-transform: uppercase; font-size: 9px; letter-spacing: .12em; }
    .packet-row .value { font: 400 19px/1.2 var(--serif); }
    .packet-row .state { justify-self: end; font-size: 8px; text-transform: uppercase; letter-spacing: .1em; color: var(--signal); }

    footer { background: #02080b; color: var(--ink); padding: 28px; border-top: 1px solid rgba(183,242,255,.16); }
    .footer-inner { width: min(1544px,100%); margin: auto; display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 30px; }
    .footer-title { font: 400 clamp(38px,6vw,92px)/.86 var(--serif); letter-spacing: -.045em; }
    .footer-meta { text-align: right; font-size: 9px; line-height: 1.9; color: rgba(183,242,255,.46); }
    .footer-meta a { color: var(--ink); text-decoration-color: var(--signal); text-underline-offset: 4px; }

    @keyframes breathe { 50% { opacity: .5; box-shadow: 0 0 0 6px rgba(83,217,245,.06), 0 0 24px rgba(83,217,245,.42); } }

    @media (max-width: 1050px) {
      .hero-heading { grid-template-columns: 1fr; }
      .lede { margin-left: 0; }
      .machine { grid-template-columns: 1fr 1.25fr; }
      .source-panel { display: none; }
      .core-panel { border-left: 0 !important; }
      .scenario-strip { grid-template-columns: repeat(4,1fr) auto; }
      .strip-label { display: none; }
    }
    @media (max-width: 700px) {
      .shell { padding: 0 16px; }
      .topbar { grid-template-columns: 1fr auto; height: 62px; }
      .top-center { display: none; }
      .top-right span:not(.status-dot) { display: none; }
      .hero { padding-top: 30px; }
      h1 { font-size: clamp(48px,16vw,74px); }
      .machine { display: block; }
      .core-panel { height: 430px; border-bottom: 1px solid var(--line-strong); }
      .outputs-panel { min-height: 420px; border-left: 0 !important; }
      .scenario-strip { grid-template-columns: 1fr 1fr; }
      .scenario { border-bottom: 1px solid var(--line); }
      .pause { position: absolute; top: 14px; right: 16px; border: 1px solid var(--line); width: 36px; height: 30px; z-index: 8; }
      .thesis { grid-template-columns: 1fr; padding: 72px 0; }
      .thesis-copy { grid-template-columns: 1fr; margin-top: 34px; }
      .section-head { display: block; }
      .section-head p { margin-top: 20px; }
      .packet-row { grid-template-columns: 28px 100px 1fr; gap: 8px; }
      .packet-row .state { display: none; }
      .packet-row .value { font-size: 16px; }
      .footer-inner { grid-template-columns: 1fr; }
      .footer-meta { text-align: left; }
    }
    @media (prefers-reduced-motion: reduce) {
      *, *::before, *::after { animation-duration: .001ms !important; animation-iteration-count: 1 !important; scroll-behavior: auto !important; }
      .particle { display: none; }
    }
  </style>
</head>
<body>
  <header class="shell topbar">
    <div class="mark"><span class="mark-glyph">U</span><span>UniversalLabeler</span></div>
    <div class="top-center">Loss-resistant annotation translation</div>
    <div class="top-right"><span class="status-dot" aria-hidden="true"></span><span>v1.0.5 / Public spec</span></div>
  </header>

  <main>
    <section class="shell hero" aria-labelledby="hero-title">
      <div class="hero-heading">
        <h1 id="hero-title">Language changes.<br>The <em>event</em> does not.</h1>
        <p class="lede"><strong>Pack the world, not just the sentence.</strong> UniversalLabeler turns an annotation into addressable claims—action, actors, hands, objects, state, place, time, outcome and evidence—then renders each language from the same packet.</p>
      </div>

      <div class="machine" id="machine">
        <section class="panel source-panel" aria-label="Source evidence">
          <div class="panel-label"><span>01 / Observe</span><span id="source-locale">EN source</span></div>
          <div class="evidence-window">
            <img class="evidence-preview" id="evidence-preview" src="../assets/evidence-fold-towel-v1.png" alt="Synthetic first-person preview of two hands folding a pale blue towel on a dark table">
            <div class="framecode" id="framecode">FRAME 01:00:01.000—01:00:08.000</div>
            <div class="preview-kind" id="preview-kind">synthetic visual preview</div>
            <svg class="scene-glyph" viewBox="0 0 420 260" aria-hidden="true">
              <g fill="none" stroke="rgba(183,242,255,.24)" stroke-width="1.4">
                <path d="M38 190H382M94 190v42M330 190v42"/>
                <path id="object-shape" d="M145 154 Q210 126 275 154 L260 182H157Z"/>
                <path d="M45 94Q93 105 142 151M375 92Q328 106 276 151"/>
                <circle cx="45" cy="94" r="9"/><circle cx="375" cy="92" r="9"/>
              </g>
              <g fill="#53d9f5"><circle cx="142" cy="151" r="4"/><circle cx="276" cy="151" r="4"/></g>
              <text x="51" y="86" fill="rgba(183,242,255,.52)" font-family="monospace" font-size="8">LEFT / STABILIZE</text>
              <text x="283" y="84" fill="rgba(183,242,255,.52)" font-family="monospace" font-size="8">RIGHT / ACT</text>
            </svg>
            <div class="surface-line" id="source-text">Fold the <span class="hot">towel</span> on the table with both hands.</div>
            <div class="scope-line" id="scope-line"></div>
          </div>
          <div class="evidence-meta">
            <div class="meta-row"><span>EVIDENCE</span><span>head_video · hand_pose</span></div>
            <div class="meta-row"><span>ENVIRONMENT</span><span id="environment">indoor · laundry area</span></div>
            <div class="meta-row"><span>TIME SCOPE</span><span id="time-scope">7.00 s · episode_clock</span></div>
            <div class="meta-row"><span>PROVENANCE</span><span>source-bound · reviewed</span></div>
          </div>
        </section>

        <section class="panel core-panel" aria-label="Semantic packet">
          <div class="panel-label"><span>02 / Pack</span><span>UAP core v1</span></div>
          <div class="core-stage">
            <div class="orbit one"></div><div class="orbit two"></div>
            <span class="claim-node n1" data-claim="action">action</span>
            <span class="claim-node n2" data-claim="patient">object</span>
            <span class="claim-node n3" data-claim="hands">hands</span>
            <span class="claim-node n4" data-claim="state">state Δ</span>
            <span class="claim-node n5" data-claim="outcome">outcome</span>
            <span class="claim-node n6" data-claim="evidence">evidence</span>
            <span class="claim-node n7" data-claim="time">time</span>
            <span class="claim-node n8" data-claim="place">place</span>
            <span class="claim-node n9" data-claim="roles">roles</span>
            <div class="core" id="core">
              <div class="core-copy"><span class="core-kicker">CONTENT-BOUND</span><span class="core-name">meaning<br>packet</span><span class="core-count">10 / 10 claims</span></div>
            </div>
            <div class="compression-meter">
              <div class="metric"><b id="claim-count">10</b><span>atomic claims</span></div>
              <div class="metric"><b>0</b><span>silent drops</span></div>
              <div class="metric"><b>5</b><span>projections</span></div>
            </div>
          </div>
        </section>

        <section class="panel outputs-panel" aria-label="Language projections">
          <div class="panel-label"><span>03 / Project</span><span>one packet → many surfaces</span></div>
          <div class="outputs" id="outputs"></div>
          <div class="ledger">
            <div class="ledger-line"><span>CLAIMS REPRESENTED</span><b id="represented">10 / 10</b></div>
            <div class="ledger-line"><span>CLAIMS OMITTED</span><b>0</b></div>
            <div class="ledger-line"><span>REVIEW STATE</span><b>CONFORMANCE</b></div>
          </div>
        </section>
      </div>

      <nav class="scenario-strip" aria-label="Example events">
        <span class="strip-label">Select event</span>
        <button class="scenario active" data-scene="0"><span class="scenario-num">01</span><span class="scenario-name">Fold textile</span></button>
        <button class="scenario" data-scene="1"><span class="scenario-num">02</span><span class="scenario-name">Open container</span></button>
        <button class="scenario" data-scene="2"><span class="scenario-num">03</span><span class="scenario-name">Place object</span></button>
        <button class="scenario" data-scene="3"><span class="scenario-num">04</span><span class="scenario-name">Cut ingredient</span></button>
        <button class="pause" id="pause" aria-label="Play automatic examples" title="Play examples"></button>
      </nav>
    </section>

    <section class="shell thesis">
      <div class="thesis-index">00 / Design principle</div>
      <div>
        <h2>Compress the <em>description.</em><br>Keep the world.</h2>
        <div class="thesis-copy">
          <p><strong>A universal vocabulary is not an infinite dictionary.</strong> It is a compositional address space. New actions and nouns become concept IDs; roles describe how they participate; evidence says why each claim is believed.</p>
          <p><strong>Fluent text is a view, not the database.</strong> English, Chinese, Tagalog, Spanish and Hindi can choose their own word order and grammar without becoming the authority for hands, state, timing or geometry.</p>
        </div>
      </div>
    </section>

    <section class="shell packet-section" aria-labelledby="packet-title">
      <div class="section-head">
        <h2 id="packet-title">Inside one event.</h2>
        <p>The visible sentence is short. The packet remains explicit. Click an event above and every value below updates from the same semantic frame.</p>
      </div>
      <div class="packet-table" id="packet-table"></div>
    </section>
  </main>

  <footer>
    <div class="footer-inner">
      <div class="footer-title">Meaning,<br>packed.</div>
      <div class="footer-meta">UNIVERSAL LABELER / RELEASE 1.0.5<br>5 HUMAN LANGUAGES · 22 WORLD DIMENSIONS<br><a href="https://huggingface.co/datasets/itspublu/UniversalLabeler">VIEW DATA + SCHEMAS ↗</a></div>
    </div>
  </footer>

  <script>
    const scenes = [
      {
        name: "fold_towel", source: "Fold the towel on the table with both hands.", hot: "towel",
        preview: "../assets/evidence-fold-towel-v1.png",
        previewAlt: "Synthetic first-person preview of two hands folding a pale blue towel on a dark table",
        environment: "indoor · laundry area", duration: "7.00 s · episode_clock", claims: 10,
        values: { action: "fold", agent: "human performer", roles: "left stabilizes · right acts", object: "towel_01 · patient", place: "table · laundry area", before: "unfolded · dry", after: "folded · dry", time: "1.00—8.00 s", outcome: "success", evidence: "RGB · hand pose · narration" },
        text: { en: "Fold the towel on the table with both hands.", zh: "用双手在桌上把毛巾叠好。", tl: "Tiklupin ang tuwalya sa mesa gamit ang dalawang kamay.", es: "Dobla la toalla sobre la mesa con ambas manos.", hi: "दोनों हाथों से मेज़ पर तौलिया मोड़ें।" }
      },
      {
        name: "open_jar", source: "Hold the jar with the left hand and unscrew the lid with the right.", hot: "unscrew",
        preview: "../assets/evidence-open-jar-v1.png",
        previewAlt: "Synthetic first-person preview of the left hand stabilizing a glass jar while the right hand unscrews its lid",
        environment: "indoor · kitchen counter", duration: "4.20 s · episode_clock", claims: 11,
        values: { action: "unscrew", agent: "human performer", roles: "left stabilizes · right rotates", object: "lid_01 · patient", place: "jar · kitchen counter", before: "jar sealed", after: "jar open", time: "12.30—16.50 s", outcome: "success", evidence: "RGB · hand pose · object track" },
        text: { en: "Hold the jar with the left hand and unscrew the lid with the right.", zh: "左手扶稳罐子,右手拧开盖子。", tl: "Hawakan ang garapon sa kaliwang kamay at pihitin ang takip gamit ang kanan.", es: "Sujeta el frasco con la izquierda y desenrosca la tapa con la derecha.", hi: "बाएँ हाथ से जार को थामें और दाएँ हाथ से ढक्कन खोलें।" }
      },
      {
        name: "place_mug", source: "Place the blue mug upright on the upper shelf using the right hand.", hot: "upper shelf",
        preview: "../assets/evidence-place-mug-v1.png",
        previewAlt: "Synthetic first-person preview of the right hand placing a blue mug upright on an upper cabinet shelf while the left hand remains idle",
        environment: "indoor · storage cabinet", duration: "2.80 s · episode_clock", claims: 10,
        values: { action: "place", agent: "human performer", roles: "right acts · left idle", object: "blue_mug_01 · patient", place: "upper_shelf · destination", before: "held · tilted", after: "supported · upright", time: "21.10—23.90 s", outcome: "stable placement", evidence: "RGB · depth · object pose" },
        text: { en: "Place the blue mug upright on the upper shelf using the right hand.", zh: "用右手把蓝色杯子直立放到上层架子上。", tl: "Ilagay nang patayo ang asul na tasa sa itaas na estante gamit ang kanang kamay.", es: "Coloca la taza azul en posición vertical sobre el estante superior con la mano derecha.", hi: "दाएँ हाथ से नीले मग को ऊपरी शेल्फ़ पर सीधा रखें।" }
      },
      {
        name: "slice_tomato", source: "Stabilize the tomato with the left hand and slice it with the knife.", hot: "knife",
        preview: "../assets/evidence-slice-tomato-v1.png",
        previewAlt: "Synthetic first-person preview of the left hand stabilizing a tomato while the right hand slices it with a kitchen knife",
        environment: "indoor · food prep station", duration: "5.60 s · episode_clock", claims: 12,
        values: { action: "slice", agent: "human performer", roles: "left stabilizes · right cuts", object: "tomato_01 · patient", place: "cutting_board · support", before: "whole tomato", after: "separated slices", time: "31.00—36.60 s", outcome: "cut completed", evidence: "RGB · contact · temporal span" },
        text: { en: "Stabilize the tomato with the left hand and slice it with the knife.", zh: "左手扶稳番茄,用刀将它切片。", tl: "Hawakan nang matatag ang kamatis sa kaliwang kamay at hiwain ito gamit ang kutsilyo.", es: "Sujeta el tomate con la mano izquierda y córtalo en rodajas con el cuchillo.", hi: "बाएँ हाथ से टमाटर को स्थिर रखें और चाकू से उसके टुकड़े काटें।" }
      }
    ];

    const languageNames = { en: "English", zh: "简体中文", tl: "Tagalog", es: "Español", hi: "हिन्दी" };
    scenes.forEach(scene => { const image = new Image(); image.src = scene.preview; });
    const output = document.querySelector("#outputs");
    const table = document.querySelector("#packet-table");
    const core = document.querySelector("#core");
    const machine = document.querySelector("#machine");
    let sceneIndex = 0;
    let activeLanguage = "tl";
    let playing = false;
    let timer;

    function renderOutputs(scene) {
      output.innerHTML = Object.entries(scene.text).map(([code, value]) => `
        <button class="output ${code === activeLanguage ? "active" : ""}" data-language="${code}" aria-label="Highlight ${languageNames[code]}">
          <span class="output-code">${code}</span><span class="output-text" lang="${code}">${value}</span><span class="output-check">✓</span>
        </button>`).join("");
      output.querySelectorAll(".output").forEach(button => button.addEventListener("click", () => {
        activeLanguage = button.dataset.language;
        renderOutputs(scenes[sceneIndex]);
        launchSignal();
      }));
    }

    function renderTable(scene) {
      const rows = [
        ["action", scene.values.action], ["agent", scene.values.agent], ["effector roles", scene.values.roles],
        ["primary object", scene.values.object], ["environment", scene.values.place], ["state before", scene.values.before],
        ["state after", scene.values.after], ["temporal scope", scene.values.time], ["outcome", scene.values.outcome], ["evidence", scene.values.evidence]
      ];
      table.innerHTML = rows.map((row, i) => `<div class="packet-row"><span class="idx">${String(i+1).padStart(2,"0")}</span><span class="field">${row[0]}</span><span class="value">${row[1]}</span><span class="state">preserved</span></div>`).join("");
    }

    function launchSignal() {
      if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
      const source = document.querySelector("#source-text");
      const target = output.querySelector(".output.active .output-text") || output.querySelector(".output-text");
      if (!source || !target || window.innerWidth < 720) return;
      const a = source.getBoundingClientRect(), c = core.getBoundingClientRect(), b = target.getBoundingClientRect();
      [0, 1].forEach((i) => {
        const p = document.createElement("span");
        p.className = "particle";
        p.style.left = `${a.right - 8}px`; p.style.top = `${a.top + a.height / 2 + (i ? 9 : -9)}px`; p.style.opacity = "1";
        document.body.appendChild(p);
        setTimeout(() => {
          p.style.transform = `translate(${c.left + c.width/2 - a.right}px, ${c.top + c.height/2 - a.top - a.height/2 - (i ? 9 : -9)}px)`;
        }, i * 120);
        setTimeout(() => {
          p.style.transition = "transform 1.05s cubic-bezier(.2,.7,.2,1), opacity .28s .72s";
          p.style.transform = `translate(${b.left - a.right + 8}px, ${b.top + b.height/2 - a.top - a.height/2 - (i ? 9 : -9)}px) scale(.55)`;
          p.style.opacity = "0";
        }, 980 + i * 120);
        setTimeout(() => p.remove(), 2150 + i * 120);
      });
      const nodes = [...document.querySelectorAll(".claim-node")];
      nodes.forEach((node, i) => setTimeout(() => { node.classList.add("active"); setTimeout(() => node.classList.remove("active"), 420); }, 430 + i*55));
    }

    function applyScene(index) {
      sceneIndex = index;
      const scene = scenes[index];
      document.querySelectorAll(".scenario").forEach((b, i) => b.classList.toggle("active", i === index));
      const source = scene.source.replace(scene.hot, `<span class="hot">${scene.hot}</span>`);
      document.querySelector("#source-text").innerHTML = source;
      document.querySelector("#environment").textContent = scene.environment;
      document.querySelector("#time-scope").textContent = scene.duration;
      document.querySelector("#framecode").textContent = `EVENT / ${scene.name.toUpperCase()}`;
      const preview = document.querySelector("#evidence-preview");
      const previewWindow = document.querySelector(".evidence-window");
      if (scene.preview) {
        preview.src = scene.preview;
        preview.alt = scene.previewAlt;
        preview.hidden = false;
        previewWindow.classList.add("has-preview");
        document.querySelector("#preview-kind").textContent = "synthetic visual preview";
      } else {
        preview.hidden = true;
        previewWindow.classList.remove("has-preview");
        document.querySelector("#preview-kind").textContent = "semantic schematic";
      }
      document.querySelector("#claim-count").textContent = scene.claims;
      document.querySelector(".core-count").textContent = `${scene.claims} / ${scene.claims} claims`;
      document.querySelector("#represented").textContent = `${scene.claims} / ${scene.claims}`;
      document.querySelector("#scope-line").style.setProperty("--progress", "0%");
      requestAnimationFrame(() => document.querySelector("#scope-line").style.setProperty("--progress", "100%"));
      renderOutputs(scene); renderTable(scene);
    }

    function setScene(index, animate = true) {
      if (!animate) { applyScene(index); return; }
      machine.classList.add("is-updating");
      setTimeout(() => {
        applyScene(index);
        machine.classList.remove("is-updating");
        setTimeout(launchSignal, 180);
      }, 180);
    }

    function schedule() {
      clearInterval(timer);
      if (playing) timer = setInterval(() => setScene((sceneIndex + 1) % scenes.length), 6200);
    }

    document.querySelectorAll(".scenario").forEach(button => button.addEventListener("click", () => {
      setScene(Number(button.dataset.scene)); schedule();
    }));
    document.querySelector("#pause").addEventListener("click", (event) => {
      playing = !playing; event.currentTarget.textContent = playing ? "Ⅱ" : "▶";
      event.currentTarget.setAttribute("aria-label", playing ? "Pause automatic examples" : "Play automatic examples"); schedule();
    });

    setScene(0, false); schedule();
  </script>
</body>
</html>