Commit ·
7e44a97
1
Parent(s): 8bd2b82
Refine palette and interaction motion
Browse files- index.html +76 -66
index.html
CHANGED
|
@@ -10,14 +10,14 @@
|
|
| 10 |
<link href="https://fonts.googleapis.com/css2?family=Bodoni+Moda:opsz,wght@6..96,400;6..96,600&family=DM+Mono:wght@300;400;500&display=swap" rel="stylesheet">
|
| 11 |
<style>
|
| 12 |
:root {
|
| 13 |
-
--paper: #
|
| 14 |
-
--paper-deep: #
|
| 15 |
-
--ink: #
|
| 16 |
-
--muted: #
|
| 17 |
-
--signal: #
|
| 18 |
-
--signal-soft: #
|
| 19 |
-
--line: rgba(
|
| 20 |
-
--line-strong: rgba(
|
| 21 |
--serif: "Bodoni Moda", "Iowan Old Style", "Times New Roman", serif;
|
| 22 |
--mono: "DM Mono", "SFMono-Regular", Consolas, monospace;
|
| 23 |
}
|
|
@@ -28,7 +28,8 @@
|
|
| 28 |
margin: 0;
|
| 29 |
color: var(--ink);
|
| 30 |
background:
|
| 31 |
-
|
|
|
|
| 32 |
var(--paper);
|
| 33 |
font-family: var(--mono);
|
| 34 |
overflow-x: hidden;
|
|
@@ -37,11 +38,11 @@
|
|
| 37 |
content: "";
|
| 38 |
position: fixed;
|
| 39 |
inset: 0;
|
| 40 |
-
opacity: .
|
| 41 |
pointer-events: none;
|
| 42 |
z-index: 20;
|
| 43 |
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");
|
| 44 |
-
mix-blend-mode:
|
| 45 |
}
|
| 46 |
button, a { font: inherit; }
|
| 47 |
button { color: inherit; }
|
|
@@ -61,7 +62,7 @@
|
|
| 61 |
.mark-glyph { width: 28px; height: 28px; border: 1px solid var(--ink); display: grid; place-items: center; font-weight: 500; }
|
| 62 |
.top-center { font-size: 10px; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); }
|
| 63 |
.top-right { justify-self: end; display: flex; align-items: center; gap: 18px; font-size: 10px; text-transform: uppercase; letter-spacing: .12em; }
|
| 64 |
-
.status-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--signal); box-shadow: 0 0 0 4px rgba(
|
| 65 |
|
| 66 |
.hero {
|
| 67 |
min-height: calc(100vh - 72px);
|
|
@@ -97,7 +98,7 @@
|
|
| 97 |
inset: 0;
|
| 98 |
background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px);
|
| 99 |
background-size: 44px 44px;
|
| 100 |
-
opacity: .
|
| 101 |
pointer-events: none;
|
| 102 |
z-index: -1;
|
| 103 |
}
|
|
@@ -108,65 +109,66 @@
|
|
| 108 |
|
| 109 |
.source-panel { display: flex; flex-direction: column; }
|
| 110 |
.evidence-window {
|
| 111 |
-
background:
|
| 112 |
-
color: var(--
|
| 113 |
min-height: 220px;
|
| 114 |
position: relative;
|
| 115 |
overflow: hidden;
|
| 116 |
padding: 16px;
|
| 117 |
display: flex;
|
| 118 |
align-items: end;
|
|
|
|
| 119 |
}
|
| 120 |
.evidence-window::before {
|
| 121 |
content: "";
|
| 122 |
position: absolute;
|
| 123 |
width: 260px;
|
| 124 |
height: 260px;
|
| 125 |
-
border: 1px solid rgba(
|
| 126 |
border-radius: 50%;
|
| 127 |
top: -122px;
|
| 128 |
right: -82px;
|
| 129 |
-
box-shadow: 0 0 0 34px rgba(
|
| 130 |
}
|
| 131 |
.scene-glyph { position: absolute; inset: 0; }
|
| 132 |
.surface-line { position: relative; z-index: 2; font: 400 clamp(23px, 2.3vw, 38px)/1.05 var(--serif); max-width: 90%; }
|
| 133 |
.surface-line span { transition: color .35s, background .35s; }
|
| 134 |
.surface-line .hot { color: var(--signal-soft); }
|
| 135 |
-
.framecode { position: absolute; top: 14px; left: 16px; color: rgba(
|
| 136 |
-
.scope-line { position: absolute; bottom: 0; left: 0; height:
|
| 137 |
-
.scope-line::after { content: ""; display: block; height: 100%; width: var(--progress, 0%); background: var(--signal); transition: width .
|
| 138 |
.evidence-meta { margin-top: auto; padding-top: 20px; display: grid; gap: 9px; font-size: 10px; }
|
| 139 |
.meta-row { display: flex; justify-content: space-between; border-bottom: 1px solid var(--line); padding-bottom: 8px; }
|
| 140 |
.meta-row span:last-child { color: var(--muted); text-align: right; }
|
| 141 |
|
| 142 |
.core-panel { overflow: hidden; }
|
| 143 |
.core-stage { height: 355px; position: relative; display: grid; place-items: center; }
|
| 144 |
-
.orbit { position: absolute; border: 1px solid var(--line); border-radius: 50%;
|
| 145 |
.orbit.one { width: 326px; height: 326px; }
|
| 146 |
-
.orbit.two { width: 250px; height: 250px;
|
| 147 |
-
.orbit::before, .orbit::after { content: ""; position: absolute; width:
|
| 148 |
.orbit::before { left: 50%; top: -4px; }
|
| 149 |
-
.orbit::after { left: 50%; bottom: -
|
| 150 |
.core {
|
| 151 |
width: 178px;
|
| 152 |
height: 178px;
|
| 153 |
border-radius: 50%;
|
| 154 |
-
background:
|
| 155 |
-
color: var(--
|
| 156 |
position: relative;
|
| 157 |
display: grid;
|
| 158 |
place-items: center;
|
| 159 |
text-align: center;
|
| 160 |
-
box-shadow: 0 0 0 12px var(--paper), 0 0 0 13px
|
| 161 |
z-index: 3;
|
| 162 |
}
|
| 163 |
-
.core::before { content: ""; position: absolute; inset: 16px; border: 1px dashed rgba(
|
| 164 |
.core-copy { position: relative; }
|
| 165 |
.core-kicker { font-size: 9px; letter-spacing: .18em; color: var(--signal-soft); }
|
| 166 |
.core-name { display: block; margin: 9px 0 5px; font: 400 25px/1 var(--serif); }
|
| 167 |
-
.core-count { font-size: 9px; letter-spacing: .08em; color: rgba(
|
| 168 |
-
.claim-node { position: absolute; font-size: 8px; letter-spacing: .08em; text-transform: uppercase; background:
|
| 169 |
-
.claim-node.active { background: var(--signal); color: var(--
|
| 170 |
.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%}
|
| 171 |
.compression-meter { position: absolute; inset: auto 0 0; display: grid; grid-template-columns: repeat(3,1fr); border-top: 1px solid var(--line); }
|
| 172 |
.metric { padding: 11px; border-right: 1px solid var(--line); }
|
|
@@ -190,7 +192,7 @@
|
|
| 190 |
transition: padding .25s, color .25s;
|
| 191 |
}
|
| 192 |
.output:first-child { border-top: 0; }
|
| 193 |
-
.output:hover, .output.active { padding-left: 10px; color: var(--signal); }
|
| 194 |
.output-code { font-size: 9px; color: var(--muted); text-transform: uppercase; }
|
| 195 |
.output-text { font: 400 clamp(17px, 1.45vw, 24px)/1.15 var(--serif); }
|
| 196 |
.output-check { font-size: 11px; opacity: .3; }
|
|
@@ -202,15 +204,18 @@
|
|
| 202 |
.scenario-strip { display: grid; grid-template-columns: auto repeat(4, 1fr) auto; align-items: stretch; min-height: 66px; }
|
| 203 |
.strip-label { padding: 0 18px 0 0; display: flex; align-items: center; font-size: 9px; text-transform: uppercase; letter-spacing: .15em; }
|
| 204 |
.scenario {
|
| 205 |
-
appearance: none; background: transparent; border: 0; border-left: 1px solid var(--line); padding: 12px 16px; text-align: left; cursor: pointer; position: relative;
|
| 206 |
}
|
|
|
|
| 207 |
.scenario::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 3px; background: var(--signal); transition: right .35s; }
|
| 208 |
.scenario.active::after { right: 0; }
|
| 209 |
.scenario-num { display: block; color: var(--muted); font-size: 8px; margin-bottom: 5px; }
|
| 210 |
.scenario-name { font: 400 15px/1 var(--serif); }
|
| 211 |
.pause { appearance: none; border: 0; border-left: 1px solid var(--line); background: transparent; width: 58px; cursor: pointer; font-size: 15px; }
|
| 212 |
|
| 213 |
-
.particle { position: fixed; z-index: 30; pointer-events: none;
|
|
|
|
|
|
|
| 214 |
|
| 215 |
.thesis { padding: 108px 0 90px; display: grid; grid-template-columns: .8fr 1.2fr; gap: 8vw; border-bottom: 1px solid var(--line-strong); }
|
| 216 |
.thesis-index { font-size: 10px; letter-spacing: .15em; text-transform: uppercase; color: var(--muted); }
|
|
@@ -225,21 +230,19 @@
|
|
| 225 |
.section-head p { max-width: 440px; font-size: 10px; line-height: 1.7; color: var(--muted); margin: 0; }
|
| 226 |
.packet-table { display: grid; }
|
| 227 |
.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; }
|
| 228 |
-
.packet-row:hover { background: rgba(
|
| 229 |
.packet-row .idx { color: var(--muted); font-size: 9px; }
|
| 230 |
.packet-row .field { text-transform: uppercase; font-size: 9px; letter-spacing: .12em; }
|
| 231 |
.packet-row .value { font: 400 19px/1.2 var(--serif); }
|
| 232 |
.packet-row .state { justify-self: end; font-size: 8px; text-transform: uppercase; letter-spacing: .1em; color: var(--signal); }
|
| 233 |
|
| 234 |
-
footer { background:
|
| 235 |
.footer-inner { width: min(1544px,100%); margin: auto; display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 30px; }
|
| 236 |
.footer-title { font: 400 clamp(38px,6vw,92px)/.86 var(--serif); letter-spacing: -.045em; }
|
| 237 |
-
.footer-meta { text-align: right; font-size: 9px; line-height: 1.9; color: rgba(
|
| 238 |
-
.footer-meta a { color: var(--
|
| 239 |
|
| 240 |
-
@keyframes
|
| 241 |
-
@keyframes breathe { 50% { opacity: .35; transform: scale(.8); } }
|
| 242 |
-
@keyframes scan { from { transform: translateX(-100%); } to { transform: translateX(100%); } }
|
| 243 |
|
| 244 |
@media (max-width: 1050px) {
|
| 245 |
.hero-heading { grid-template-columns: 1fr; }
|
|
@@ -283,7 +286,7 @@
|
|
| 283 |
<header class="shell topbar">
|
| 284 |
<div class="mark"><span class="mark-glyph">U</span><span>UniversalLabeler</span></div>
|
| 285 |
<div class="top-center">Loss-resistant annotation translation</div>
|
| 286 |
-
<div class="top-right"><span class="status-dot" aria-hidden="true"></span><span>v1.0.
|
| 287 |
</header>
|
| 288 |
|
| 289 |
<main>
|
|
@@ -299,15 +302,15 @@
|
|
| 299 |
<div class="evidence-window">
|
| 300 |
<div class="framecode" id="framecode">FRAME 01:00:01.000—01:00:08.000</div>
|
| 301 |
<svg class="scene-glyph" viewBox="0 0 420 260" aria-hidden="true">
|
| 302 |
-
<g fill="none" stroke="rgba(
|
| 303 |
<path d="M38 190H382M94 190v42M330 190v42"/>
|
| 304 |
<path id="object-shape" d="M145 154 Q210 126 275 154 L260 182H157Z"/>
|
| 305 |
<path d="M45 94Q93 105 142 151M375 92Q328 106 276 151"/>
|
| 306 |
<circle cx="45" cy="94" r="9"/><circle cx="375" cy="92" r="9"/>
|
| 307 |
</g>
|
| 308 |
-
<g fill="#
|
| 309 |
-
<text x="51" y="86" fill="rgba(
|
| 310 |
-
<text x="283" y="84" fill="rgba(
|
| 311 |
</svg>
|
| 312 |
<div class="surface-line" id="source-text">Fold the <span class="hot">towel</span> on the table with both hands.</div>
|
| 313 |
<div class="scope-line" id="scope-line"></div>
|
|
@@ -361,7 +364,7 @@
|
|
| 361 |
<button class="scenario" data-scene="1"><span class="scenario-num">02</span><span class="scenario-name">Open container</span></button>
|
| 362 |
<button class="scenario" data-scene="2"><span class="scenario-num">03</span><span class="scenario-name">Place object</span></button>
|
| 363 |
<button class="scenario" data-scene="3"><span class="scenario-num">04</span><span class="scenario-name">Cut ingredient</span></button>
|
| 364 |
-
<button class="pause" id="pause" aria-label="
|
| 365 |
</nav>
|
| 366 |
</section>
|
| 367 |
|
|
@@ -388,7 +391,7 @@
|
|
| 388 |
<footer>
|
| 389 |
<div class="footer-inner">
|
| 390 |
<div class="footer-title">Meaning,<br>packed.</div>
|
| 391 |
-
<div class="footer-meta">UNIVERSAL LABELER / RELEASE 1.0.
|
| 392 |
</div>
|
| 393 |
</footer>
|
| 394 |
|
|
@@ -427,7 +430,7 @@
|
|
| 427 |
const machine = document.querySelector("#machine");
|
| 428 |
let sceneIndex = 0;
|
| 429 |
let activeLanguage = "tl";
|
| 430 |
-
let playing =
|
| 431 |
let timer;
|
| 432 |
|
| 433 |
function renderOutputs(scene) {
|
|
@@ -438,7 +441,7 @@
|
|
| 438 |
output.querySelectorAll(".output").forEach(button => button.addEventListener("click", () => {
|
| 439 |
activeLanguage = button.dataset.language;
|
| 440 |
renderOutputs(scenes[sceneIndex]);
|
| 441 |
-
|
| 442 |
}));
|
| 443 |
}
|
| 444 |
|
|
@@ -451,33 +454,32 @@
|
|
| 451 |
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("");
|
| 452 |
}
|
| 453 |
|
| 454 |
-
function
|
| 455 |
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
| 456 |
const source = document.querySelector("#source-text");
|
| 457 |
const target = output.querySelector(".output.active .output-text") || output.querySelector(".output-text");
|
| 458 |
if (!source || !target || window.innerWidth < 720) return;
|
| 459 |
const a = source.getBoundingClientRect(), c = core.getBoundingClientRect(), b = target.getBoundingClientRect();
|
| 460 |
-
|
| 461 |
-
labels.forEach((label, i) => {
|
| 462 |
const p = document.createElement("span");
|
| 463 |
-
p.className = "particle";
|
| 464 |
-
p.style.left = `${a.right -
|
| 465 |
document.body.appendChild(p);
|
| 466 |
-
requestAnimationFrame(() => {
|
| 467 |
-
p.style.transform = `translate(${c.left + c.width/2 - a.right - 8}px, ${c.top + c.height/2 - a.top - 28 - (i%3)*24}px) scale(.55)`;
|
| 468 |
-
});
|
| 469 |
setTimeout(() => {
|
| 470 |
-
p.style.
|
| 471 |
-
|
|
|
|
|
|
|
|
|
|
| 472 |
p.style.opacity = "0";
|
| 473 |
-
},
|
| 474 |
-
setTimeout(() => p.remove(),
|
| 475 |
});
|
| 476 |
const nodes = [...document.querySelectorAll(".claim-node")];
|
| 477 |
-
nodes.forEach((node, i) => setTimeout(() => { node.classList.add("active"); setTimeout(() => node.classList.remove("active"),
|
| 478 |
}
|
| 479 |
|
| 480 |
-
function
|
| 481 |
sceneIndex = index;
|
| 482 |
const scene = scenes[index];
|
| 483 |
document.querySelectorAll(".scenario").forEach((b, i) => b.classList.toggle("active", i === index));
|
|
@@ -492,7 +494,16 @@
|
|
| 492 |
document.querySelector("#scope-line").style.setProperty("--progress", "0%");
|
| 493 |
requestAnimationFrame(() => document.querySelector("#scope-line").style.setProperty("--progress", "100%"));
|
| 494 |
renderOutputs(scene); renderTable(scene);
|
| 495 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 496 |
}
|
| 497 |
|
| 498 |
function schedule() {
|
|
@@ -509,7 +520,6 @@
|
|
| 509 |
});
|
| 510 |
|
| 511 |
setScene(0, false); schedule();
|
| 512 |
-
window.addEventListener("load", () => setTimeout(launchParticles, 900), { once: true });
|
| 513 |
</script>
|
| 514 |
</body>
|
| 515 |
</html>
|
|
|
|
| 10 |
<link href="https://fonts.googleapis.com/css2?family=Bodoni+Moda:opsz,wght@6..96,400;6..96,600&family=DM+Mono:wght@300;400;500&display=swap" rel="stylesheet">
|
| 11 |
<style>
|
| 12 |
:root {
|
| 13 |
+
--paper: #071116;
|
| 14 |
+
--paper-deep: #0d1a21;
|
| 15 |
+
--ink: #edf7f8;
|
| 16 |
+
--muted: #7e969e;
|
| 17 |
+
--signal: #53d9f5;
|
| 18 |
+
--signal-soft: #b7f2ff;
|
| 19 |
+
--line: rgba(157, 199, 210, .16);
|
| 20 |
+
--line-strong: rgba(174, 216, 226, .38);
|
| 21 |
--serif: "Bodoni Moda", "Iowan Old Style", "Times New Roman", serif;
|
| 22 |
--mono: "DM Mono", "SFMono-Regular", Consolas, monospace;
|
| 23 |
}
|
|
|
|
| 28 |
margin: 0;
|
| 29 |
color: var(--ink);
|
| 30 |
background:
|
| 31 |
+
radial-gradient(circle at 50% -10%, rgba(42, 105, 121, .18), transparent 38%),
|
| 32 |
+
linear-gradient(90deg, transparent calc(50% - .5px), rgba(140,190,202,.035) 50%, transparent calc(50% + .5px)),
|
| 33 |
var(--paper);
|
| 34 |
font-family: var(--mono);
|
| 35 |
overflow-x: hidden;
|
|
|
|
| 38 |
content: "";
|
| 39 |
position: fixed;
|
| 40 |
inset: 0;
|
| 41 |
+
opacity: .035;
|
| 42 |
pointer-events: none;
|
| 43 |
z-index: 20;
|
| 44 |
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");
|
| 45 |
+
mix-blend-mode: screen;
|
| 46 |
}
|
| 47 |
button, a { font: inherit; }
|
| 48 |
button { color: inherit; }
|
|
|
|
| 62 |
.mark-glyph { width: 28px; height: 28px; border: 1px solid var(--ink); display: grid; place-items: center; font-weight: 500; }
|
| 63 |
.top-center { font-size: 10px; letter-spacing: .18em; text-transform: uppercase; color: var(--muted); }
|
| 64 |
.top-right { justify-self: end; display: flex; align-items: center; gap: 18px; font-size: 10px; text-transform: uppercase; letter-spacing: .12em; }
|
| 65 |
+
.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; }
|
| 66 |
|
| 67 |
.hero {
|
| 68 |
min-height: calc(100vh - 72px);
|
|
|
|
| 98 |
inset: 0;
|
| 99 |
background-image: linear-gradient(var(--line) 1px, transparent 1px), linear-gradient(90deg, var(--line) 1px, transparent 1px);
|
| 100 |
background-size: 44px 44px;
|
| 101 |
+
opacity: .32;
|
| 102 |
pointer-events: none;
|
| 103 |
z-index: -1;
|
| 104 |
}
|
|
|
|
| 109 |
|
| 110 |
.source-panel { display: flex; flex-direction: column; }
|
| 111 |
.evidence-window {
|
| 112 |
+
background: #02080b;
|
| 113 |
+
color: var(--ink);
|
| 114 |
min-height: 220px;
|
| 115 |
position: relative;
|
| 116 |
overflow: hidden;
|
| 117 |
padding: 16px;
|
| 118 |
display: flex;
|
| 119 |
align-items: end;
|
| 120 |
+
box-shadow: inset 0 0 0 1px rgba(183,242,255,.08), inset 0 -70px 80px rgba(24,78,91,.14);
|
| 121 |
}
|
| 122 |
.evidence-window::before {
|
| 123 |
content: "";
|
| 124 |
position: absolute;
|
| 125 |
width: 260px;
|
| 126 |
height: 260px;
|
| 127 |
+
border: 1px solid rgba(183,242,255,.16);
|
| 128 |
border-radius: 50%;
|
| 129 |
top: -122px;
|
| 130 |
right: -82px;
|
| 131 |
+
box-shadow: 0 0 0 34px rgba(83,217,245,.025), 0 0 0 68px rgba(83,217,245,.018);
|
| 132 |
}
|
| 133 |
.scene-glyph { position: absolute; inset: 0; }
|
| 134 |
.surface-line { position: relative; z-index: 2; font: 400 clamp(23px, 2.3vw, 38px)/1.05 var(--serif); max-width: 90%; }
|
| 135 |
.surface-line span { transition: color .35s, background .35s; }
|
| 136 |
.surface-line .hot { color: var(--signal-soft); }
|
| 137 |
+
.framecode { position: absolute; top: 14px; left: 16px; color: rgba(183,242,255,.45); font-size: 9px; letter-spacing: .12em; }
|
| 138 |
+
.scope-line { position: absolute; bottom: 0; left: 0; height: 2px; width: 100%; background: rgba(183,242,255,.1); }
|
| 139 |
+
.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); }
|
| 140 |
.evidence-meta { margin-top: auto; padding-top: 20px; display: grid; gap: 9px; font-size: 10px; }
|
| 141 |
.meta-row { display: flex; justify-content: space-between; border-bottom: 1px solid var(--line); padding-bottom: 8px; }
|
| 142 |
.meta-row span:last-child { color: var(--muted); text-align: right; }
|
| 143 |
|
| 144 |
.core-panel { overflow: hidden; }
|
| 145 |
.core-stage { height: 355px; position: relative; display: grid; place-items: center; }
|
| 146 |
+
.orbit { position: absolute; border: 1px solid var(--line); border-radius: 50%; }
|
| 147 |
.orbit.one { width: 326px; height: 326px; }
|
| 148 |
+
.orbit.two { width: 250px; height: 250px; border-style: dashed; opacity: .7; }
|
| 149 |
+
.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); }
|
| 150 |
.orbit::before { left: 50%; top: -4px; }
|
| 151 |
+
.orbit::after { left: 50%; bottom: -3px; background: var(--muted); box-shadow: none; }
|
| 152 |
.core {
|
| 153 |
width: 178px;
|
| 154 |
height: 178px;
|
| 155 |
border-radius: 50%;
|
| 156 |
+
background: #02080b;
|
| 157 |
+
color: var(--ink);
|
| 158 |
position: relative;
|
| 159 |
display: grid;
|
| 160 |
place-items: center;
|
| 161 |
text-align: center;
|
| 162 |
+
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);
|
| 163 |
z-index: 3;
|
| 164 |
}
|
| 165 |
+
.core::before { content: ""; position: absolute; inset: 16px; border: 1px dashed rgba(183,242,255,.28); border-radius: 50%; }
|
| 166 |
.core-copy { position: relative; }
|
| 167 |
.core-kicker { font-size: 9px; letter-spacing: .18em; color: var(--signal-soft); }
|
| 168 |
.core-name { display: block; margin: 9px 0 5px; font: 400 25px/1 var(--serif); }
|
| 169 |
+
.core-count { font-size: 9px; letter-spacing: .08em; color: rgba(183,242,255,.48); }
|
| 170 |
+
.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; }
|
| 171 |
+
.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); }
|
| 172 |
.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%}
|
| 173 |
.compression-meter { position: absolute; inset: auto 0 0; display: grid; grid-template-columns: repeat(3,1fr); border-top: 1px solid var(--line); }
|
| 174 |
.metric { padding: 11px; border-right: 1px solid var(--line); }
|
|
|
|
| 192 |
transition: padding .25s, color .25s;
|
| 193 |
}
|
| 194 |
.output:first-child { border-top: 0; }
|
| 195 |
+
.output:hover, .output.active { padding-left: 10px; color: var(--signal-soft); background: linear-gradient(90deg, rgba(83,217,245,.07), transparent 72%); }
|
| 196 |
.output-code { font-size: 9px; color: var(--muted); text-transform: uppercase; }
|
| 197 |
.output-text { font: 400 clamp(17px, 1.45vw, 24px)/1.15 var(--serif); }
|
| 198 |
.output-check { font-size: 11px; opacity: .3; }
|
|
|
|
| 204 |
.scenario-strip { display: grid; grid-template-columns: auto repeat(4, 1fr) auto; align-items: stretch; min-height: 66px; }
|
| 205 |
.strip-label { padding: 0 18px 0 0; display: flex; align-items: center; font-size: 9px; text-transform: uppercase; letter-spacing: .15em; }
|
| 206 |
.scenario {
|
| 207 |
+
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;
|
| 208 |
}
|
| 209 |
+
.scenario:hover, .scenario.active { background: rgba(83,217,245,.045); }
|
| 210 |
.scenario::after { content: ""; position: absolute; left: 0; right: 100%; bottom: 0; height: 3px; background: var(--signal); transition: right .35s; }
|
| 211 |
.scenario.active::after { right: 0; }
|
| 212 |
.scenario-num { display: block; color: var(--muted); font-size: 8px; margin-bottom: 5px; }
|
| 213 |
.scenario-name { font: 400 15px/1 var(--serif); }
|
| 214 |
.pause { appearance: none; border: 0; border-left: 1px solid var(--line); background: transparent; width: 58px; cursor: pointer; font-size: 15px; }
|
| 215 |
|
| 216 |
+
.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; }
|
| 217 |
+
.machine.is-updating .surface-line, .machine.is-updating .outputs, .machine.is-updating .evidence-meta { opacity: .32; transform: translateY(3px); }
|
| 218 |
+
.surface-line, .outputs, .evidence-meta { transition: opacity .22s ease, transform .22s ease; }
|
| 219 |
|
| 220 |
.thesis { padding: 108px 0 90px; display: grid; grid-template-columns: .8fr 1.2fr; gap: 8vw; border-bottom: 1px solid var(--line-strong); }
|
| 221 |
.thesis-index { font-size: 10px; letter-spacing: .15em; text-transform: uppercase; color: var(--muted); }
|
|
|
|
| 230 |
.section-head p { max-width: 440px; font-size: 10px; line-height: 1.7; color: var(--muted); margin: 0; }
|
| 231 |
.packet-table { display: grid; }
|
| 232 |
.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; }
|
| 233 |
+
.packet-row:hover { background: rgba(83,217,245,.045); }
|
| 234 |
.packet-row .idx { color: var(--muted); font-size: 9px; }
|
| 235 |
.packet-row .field { text-transform: uppercase; font-size: 9px; letter-spacing: .12em; }
|
| 236 |
.packet-row .value { font: 400 19px/1.2 var(--serif); }
|
| 237 |
.packet-row .state { justify-self: end; font-size: 8px; text-transform: uppercase; letter-spacing: .1em; color: var(--signal); }
|
| 238 |
|
| 239 |
+
footer { background: #02080b; color: var(--ink); padding: 28px; border-top: 1px solid rgba(183,242,255,.16); }
|
| 240 |
.footer-inner { width: min(1544px,100%); margin: auto; display: grid; grid-template-columns: 1fr auto; align-items: end; gap: 30px; }
|
| 241 |
.footer-title { font: 400 clamp(38px,6vw,92px)/.86 var(--serif); letter-spacing: -.045em; }
|
| 242 |
+
.footer-meta { text-align: right; font-size: 9px; line-height: 1.9; color: rgba(183,242,255,.46); }
|
| 243 |
+
.footer-meta a { color: var(--ink); text-decoration-color: var(--signal); text-underline-offset: 4px; }
|
| 244 |
|
| 245 |
+
@keyframes breathe { 50% { opacity: .5; box-shadow: 0 0 0 6px rgba(83,217,245,.06), 0 0 24px rgba(83,217,245,.42); } }
|
|
|
|
|
|
|
| 246 |
|
| 247 |
@media (max-width: 1050px) {
|
| 248 |
.hero-heading { grid-template-columns: 1fr; }
|
|
|
|
| 286 |
<header class="shell topbar">
|
| 287 |
<div class="mark"><span class="mark-glyph">U</span><span>UniversalLabeler</span></div>
|
| 288 |
<div class="top-center">Loss-resistant annotation translation</div>
|
| 289 |
+
<div class="top-right"><span class="status-dot" aria-hidden="true"></span><span>v1.0.3 / Public spec</span></div>
|
| 290 |
</header>
|
| 291 |
|
| 292 |
<main>
|
|
|
|
| 302 |
<div class="evidence-window">
|
| 303 |
<div class="framecode" id="framecode">FRAME 01:00:01.000—01:00:08.000</div>
|
| 304 |
<svg class="scene-glyph" viewBox="0 0 420 260" aria-hidden="true">
|
| 305 |
+
<g fill="none" stroke="rgba(183,242,255,.24)" stroke-width="1.4">
|
| 306 |
<path d="M38 190H382M94 190v42M330 190v42"/>
|
| 307 |
<path id="object-shape" d="M145 154 Q210 126 275 154 L260 182H157Z"/>
|
| 308 |
<path d="M45 94Q93 105 142 151M375 92Q328 106 276 151"/>
|
| 309 |
<circle cx="45" cy="94" r="9"/><circle cx="375" cy="92" r="9"/>
|
| 310 |
</g>
|
| 311 |
+
<g fill="#53d9f5"><circle cx="142" cy="151" r="4"/><circle cx="276" cy="151" r="4"/></g>
|
| 312 |
+
<text x="51" y="86" fill="rgba(183,242,255,.52)" font-family="monospace" font-size="8">LEFT / STABILIZE</text>
|
| 313 |
+
<text x="283" y="84" fill="rgba(183,242,255,.52)" font-family="monospace" font-size="8">RIGHT / ACT</text>
|
| 314 |
</svg>
|
| 315 |
<div class="surface-line" id="source-text">Fold the <span class="hot">towel</span> on the table with both hands.</div>
|
| 316 |
<div class="scope-line" id="scope-line"></div>
|
|
|
|
| 364 |
<button class="scenario" data-scene="1"><span class="scenario-num">02</span><span class="scenario-name">Open container</span></button>
|
| 365 |
<button class="scenario" data-scene="2"><span class="scenario-num">03</span><span class="scenario-name">Place object</span></button>
|
| 366 |
<button class="scenario" data-scene="3"><span class="scenario-num">04</span><span class="scenario-name">Cut ingredient</span></button>
|
| 367 |
+
<button class="pause" id="pause" aria-label="Play automatic examples" title="Play examples">▶</button>
|
| 368 |
</nav>
|
| 369 |
</section>
|
| 370 |
|
|
|
|
| 391 |
<footer>
|
| 392 |
<div class="footer-inner">
|
| 393 |
<div class="footer-title">Meaning,<br>packed.</div>
|
| 394 |
+
<div class="footer-meta">UNIVERSAL LABELER / RELEASE 1.0.3<br>5 HUMAN LANGUAGES · 22 WORLD DIMENSIONS<br><a href="https://huggingface.co/datasets/itspublu/UniversalLabeler">VIEW DATA + SCHEMAS ↗</a></div>
|
| 395 |
</div>
|
| 396 |
</footer>
|
| 397 |
|
|
|
|
| 430 |
const machine = document.querySelector("#machine");
|
| 431 |
let sceneIndex = 0;
|
| 432 |
let activeLanguage = "tl";
|
| 433 |
+
let playing = false;
|
| 434 |
let timer;
|
| 435 |
|
| 436 |
function renderOutputs(scene) {
|
|
|
|
| 441 |
output.querySelectorAll(".output").forEach(button => button.addEventListener("click", () => {
|
| 442 |
activeLanguage = button.dataset.language;
|
| 443 |
renderOutputs(scenes[sceneIndex]);
|
| 444 |
+
launchSignal();
|
| 445 |
}));
|
| 446 |
}
|
| 447 |
|
|
|
|
| 454 |
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("");
|
| 455 |
}
|
| 456 |
|
| 457 |
+
function launchSignal() {
|
| 458 |
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) return;
|
| 459 |
const source = document.querySelector("#source-text");
|
| 460 |
const target = output.querySelector(".output.active .output-text") || output.querySelector(".output-text");
|
| 461 |
if (!source || !target || window.innerWidth < 720) return;
|
| 462 |
const a = source.getBoundingClientRect(), c = core.getBoundingClientRect(), b = target.getBoundingClientRect();
|
| 463 |
+
[0, 1].forEach((i) => {
|
|
|
|
| 464 |
const p = document.createElement("span");
|
| 465 |
+
p.className = "particle";
|
| 466 |
+
p.style.left = `${a.right - 8}px`; p.style.top = `${a.top + a.height / 2 + (i ? 9 : -9)}px`; p.style.opacity = "1";
|
| 467 |
document.body.appendChild(p);
|
|
|
|
|
|
|
|
|
|
| 468 |
setTimeout(() => {
|
| 469 |
+
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)`;
|
| 470 |
+
}, i * 120);
|
| 471 |
+
setTimeout(() => {
|
| 472 |
+
p.style.transition = "transform 1.05s cubic-bezier(.2,.7,.2,1), opacity .28s .72s";
|
| 473 |
+
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)`;
|
| 474 |
p.style.opacity = "0";
|
| 475 |
+
}, 980 + i * 120);
|
| 476 |
+
setTimeout(() => p.remove(), 2150 + i * 120);
|
| 477 |
});
|
| 478 |
const nodes = [...document.querySelectorAll(".claim-node")];
|
| 479 |
+
nodes.forEach((node, i) => setTimeout(() => { node.classList.add("active"); setTimeout(() => node.classList.remove("active"), 420); }, 430 + i*55));
|
| 480 |
}
|
| 481 |
|
| 482 |
+
function applyScene(index) {
|
| 483 |
sceneIndex = index;
|
| 484 |
const scene = scenes[index];
|
| 485 |
document.querySelectorAll(".scenario").forEach((b, i) => b.classList.toggle("active", i === index));
|
|
|
|
| 494 |
document.querySelector("#scope-line").style.setProperty("--progress", "0%");
|
| 495 |
requestAnimationFrame(() => document.querySelector("#scope-line").style.setProperty("--progress", "100%"));
|
| 496 |
renderOutputs(scene); renderTable(scene);
|
| 497 |
+
}
|
| 498 |
+
|
| 499 |
+
function setScene(index, animate = true) {
|
| 500 |
+
if (!animate) { applyScene(index); return; }
|
| 501 |
+
machine.classList.add("is-updating");
|
| 502 |
+
setTimeout(() => {
|
| 503 |
+
applyScene(index);
|
| 504 |
+
machine.classList.remove("is-updating");
|
| 505 |
+
setTimeout(launchSignal, 180);
|
| 506 |
+
}, 180);
|
| 507 |
}
|
| 508 |
|
| 509 |
function schedule() {
|
|
|
|
| 520 |
});
|
| 521 |
|
| 522 |
setScene(0, false); schedule();
|
|
|
|
| 523 |
</script>
|
| 524 |
</body>
|
| 525 |
</html>
|