Spaces:
Running
Running
jasondo OpenAI Codex commited on
Commit ·
ca9bbeb
1
Parent(s): 2972ff4
Polish cutaway viewport visuals
Browse filesCo-authored-by: OpenAI Codex <codex@openai.com>
- AGENTS.md +6 -2
- index.html +69 -9
AGENTS.md
CHANGED
|
@@ -255,6 +255,12 @@ technical cutaway animation.
|
|
| 255 |
`unavailable` photo-render state, and the target-like synthetic image returned
|
| 256 |
a real Modal analysis for `reticle assembly` at `0.7` confidence with 4 parts;
|
| 257 |
`/generate_scene` returned `render_mode: three` and `renderer: three`.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 258 |
|
| 259 |
## Next Work
|
| 260 |
|
|
@@ -262,8 +268,6 @@ technical cutaway animation.
|
|
| 262 |
tune token/context/timeout values down if valid JSON remains reliable with
|
| 263 |
lower latency. The synthetic Modal check now succeeds with the current
|
| 264 |
`4096` output token, `8192` context, `300s` timeout settings.
|
| 265 |
-
- Optional polish only after private deployment verification: component
|
| 266 |
-
watermark, noise texture, vignette, then scan-line reveal refinements.
|
| 267 |
- Keep the Hugging Face Space private until the user explicitly approves making
|
| 268 |
it public for submission.
|
| 269 |
- Keep the README opening hook intact: "You find a small metal cylinder at a
|
|
|
|
| 255 |
`unavailable` photo-render state, and the target-like synthetic image returned
|
| 256 |
a real Modal analysis for `reticle assembly` at `0.7` confidence with 4 parts;
|
| 257 |
`/generate_scene` returned `render_mode: three` and `renderer: three`.
|
| 258 |
+
- Implemented the optional visual-polish pass after private deployment
|
| 259 |
+
verification: component watermark populated from the analysis component name,
|
| 260 |
+
subtle static noise overlay, stronger viewport vignette, and refined scan-line
|
| 261 |
+
reveal. Local browser verification confirmed the scene still renders, orbit
|
| 262 |
+
drag still works, the canvas remains the pointer target, the source preview
|
| 263 |
+
remains contained, and the mobile layout has no horizontal overflow.
|
| 264 |
|
| 265 |
## Next Work
|
| 266 |
|
|
|
|
| 268 |
tune token/context/timeout values down if valid JSON remains reliable with
|
| 269 |
lower latency. The synthetic Modal check now succeeds with the current
|
| 270 |
`4096` output token, `8192` context, `300s` timeout settings.
|
|
|
|
|
|
|
| 271 |
- Keep the Hugging Face Space private until the user explicitly approves making
|
| 272 |
it public for submission.
|
| 273 |
- Keep the README opening hook intact: "You find a small metal cylinder at a
|
index.html
CHANGED
|
@@ -60,12 +60,45 @@
|
|
| 60 |
}
|
| 61 |
|
| 62 |
.shell {
|
|
|
|
|
|
|
| 63 |
display: grid;
|
| 64 |
grid-template-columns: minmax(0, 63fr) minmax(340px, 37fr);
|
| 65 |
width: 100vw;
|
| 66 |
height: 100vh;
|
| 67 |
}
|
| 68 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
.viewport-pane {
|
| 70 |
position: relative;
|
| 71 |
min-width: 0;
|
|
@@ -80,7 +113,9 @@
|
|
| 80 |
position: absolute;
|
| 81 |
inset: 0;
|
| 82 |
pointer-events: none;
|
| 83 |
-
background:
|
|
|
|
|
|
|
| 84 |
z-index: 7;
|
| 85 |
}
|
| 86 |
|
|
@@ -122,15 +157,27 @@
|
|
| 122 |
right: 0;
|
| 123 |
top: -2px;
|
| 124 |
z-index: 8;
|
| 125 |
-
height:
|
| 126 |
opacity: 0;
|
| 127 |
-
background: var(--cyan);
|
| 128 |
-
box-shadow:
|
|
|
|
|
|
|
| 129 |
pointer-events: none;
|
| 130 |
}
|
| 131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
.scan-line.active {
|
| 133 |
-
animation: scan
|
| 134 |
}
|
| 135 |
|
| 136 |
.progress {
|
|
@@ -198,7 +245,7 @@
|
|
| 198 |
position: absolute;
|
| 199 |
left: 18px;
|
| 200 |
bottom: 18px;
|
| 201 |
-
z-index:
|
| 202 |
max-width: min(320px, calc(100% - 36px));
|
| 203 |
border-left: 1px solid var(--cyan-dim);
|
| 204 |
padding: 6px 0 6px 10px;
|
|
@@ -214,6 +261,7 @@
|
|
| 214 |
}
|
| 215 |
|
| 216 |
.panel {
|
|
|
|
| 217 |
min-width: 0;
|
| 218 |
overflow: auto;
|
| 219 |
border-left: 1px solid var(--amber-dim);
|
|
@@ -221,6 +269,8 @@
|
|
| 221 |
}
|
| 222 |
|
| 223 |
.panel-inner {
|
|
|
|
|
|
|
| 224 |
min-height: 100%;
|
| 225 |
padding: 24px;
|
| 226 |
display: grid;
|
|
@@ -459,8 +509,8 @@
|
|
| 459 |
|
| 460 |
@keyframes scan {
|
| 461 |
0% { transform: translateY(0); opacity: 0; }
|
| 462 |
-
|
| 463 |
-
100% { transform: translateY(100vh); opacity: 0; }
|
| 464 |
}
|
| 465 |
|
| 466 |
@media (max-width: 860px) {
|
|
@@ -469,12 +519,18 @@
|
|
| 469 |
}
|
| 470 |
|
| 471 |
.shell {
|
|
|
|
| 472 |
grid-template-columns: 1fr;
|
| 473 |
grid-template-rows: minmax(420px, 62vh) auto;
|
| 474 |
min-height: 100vh;
|
| 475 |
height: auto;
|
| 476 |
}
|
| 477 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 478 |
.panel {
|
| 479 |
border-left: 0;
|
| 480 |
border-top: 1px solid var(--amber-dim);
|
|
@@ -488,6 +544,7 @@
|
|
| 488 |
</head>
|
| 489 |
<body>
|
| 490 |
<main class="shell">
|
|
|
|
| 491 |
<section class="viewport-pane" aria-label="Cutaway viewport">
|
| 492 |
<div id="progress" class="progress"></div>
|
| 493 |
<div class="toolbar">
|
|
@@ -555,6 +612,7 @@
|
|
| 555 |
const retryButton = document.getElementById("retryButton");
|
| 556 |
const sourceCard = document.getElementById("sourceCard");
|
| 557 |
const sourceImage = document.getElementById("sourceImage");
|
|
|
|
| 558 |
const componentEl = document.getElementById("component");
|
| 559 |
const confidenceEl = document.getElementById("confidence");
|
| 560 |
const summaryEl = document.getElementById("summary");
|
|
@@ -662,7 +720,9 @@
|
|
| 662 |
|
| 663 |
function populateAnalysis(analysis) {
|
| 664 |
window.lastAnalysis = analysis;
|
| 665 |
-
|
|
|
|
|
|
|
| 666 |
confidenceEl.textContent = typeof analysis.confidence === "number"
|
| 667 |
? Math.round(analysis.confidence * 100) + "%"
|
| 668 |
: "--";
|
|
|
|
| 60 |
}
|
| 61 |
|
| 62 |
.shell {
|
| 63 |
+
position: relative;
|
| 64 |
+
isolation: isolate;
|
| 65 |
display: grid;
|
| 66 |
grid-template-columns: minmax(0, 63fr) minmax(340px, 37fr);
|
| 67 |
width: 100vw;
|
| 68 |
height: 100vh;
|
| 69 |
}
|
| 70 |
|
| 71 |
+
.shell::after {
|
| 72 |
+
content: "";
|
| 73 |
+
position: absolute;
|
| 74 |
+
inset: 0;
|
| 75 |
+
z-index: 3;
|
| 76 |
+
pointer-events: none;
|
| 77 |
+
opacity: 0.11;
|
| 78 |
+
mix-blend-mode: screen;
|
| 79 |
+
background-image:
|
| 80 |
+
radial-gradient(circle at 25% 25%, rgba(255, 255, 255, 0.28) 0 1px, transparent 1px),
|
| 81 |
+
radial-gradient(circle at 75% 65%, rgba(0, 0, 0, 0.42) 0 1px, transparent 1px);
|
| 82 |
+
background-size: 13px 17px, 19px 23px;
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
.component-watermark {
|
| 86 |
+
position: absolute;
|
| 87 |
+
left: clamp(-10px, 2vw, 28px);
|
| 88 |
+
bottom: clamp(-18px, -1.2vw, -8px);
|
| 89 |
+
z-index: 2;
|
| 90 |
+
max-width: 92vw;
|
| 91 |
+
color: var(--bg-lift);
|
| 92 |
+
opacity: 0.34;
|
| 93 |
+
font-size: clamp(3.6rem, 8vw, 9rem);
|
| 94 |
+
line-height: 0.76;
|
| 95 |
+
font-weight: 700;
|
| 96 |
+
text-transform: uppercase;
|
| 97 |
+
overflow-wrap: anywhere;
|
| 98 |
+
pointer-events: none;
|
| 99 |
+
user-select: none;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
.viewport-pane {
|
| 103 |
position: relative;
|
| 104 |
min-width: 0;
|
|
|
|
| 113 |
position: absolute;
|
| 114 |
inset: 0;
|
| 115 |
pointer-events: none;
|
| 116 |
+
background:
|
| 117 |
+
linear-gradient(90deg, rgba(0, 0, 0, 0.18), transparent 18%, transparent 76%, rgba(0, 0, 0, 0.22)),
|
| 118 |
+
radial-gradient(circle at center, transparent 52%, rgba(0, 0, 0, 0.44));
|
| 119 |
z-index: 7;
|
| 120 |
}
|
| 121 |
|
|
|
|
| 157 |
right: 0;
|
| 158 |
top: -2px;
|
| 159 |
z-index: 8;
|
| 160 |
+
height: 3px;
|
| 161 |
opacity: 0;
|
| 162 |
+
background: linear-gradient(90deg, transparent, var(--cyan), transparent);
|
| 163 |
+
box-shadow:
|
| 164 |
+
0 0 18px rgba(95, 212, 208, 0.8),
|
| 165 |
+
0 18px 42px rgba(95, 212, 208, 0.16);
|
| 166 |
pointer-events: none;
|
| 167 |
}
|
| 168 |
|
| 169 |
+
.scan-line::after {
|
| 170 |
+
content: "";
|
| 171 |
+
position: absolute;
|
| 172 |
+
left: 0;
|
| 173 |
+
right: 0;
|
| 174 |
+
top: 3px;
|
| 175 |
+
height: 52px;
|
| 176 |
+
background: linear-gradient(180deg, rgba(95, 212, 208, 0.13), transparent);
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
.scan-line.active {
|
| 180 |
+
animation: scan 820ms cubic-bezier(0.16, 1, 0.3, 1);
|
| 181 |
}
|
| 182 |
|
| 183 |
.progress {
|
|
|
|
| 245 |
position: absolute;
|
| 246 |
left: 18px;
|
| 247 |
bottom: 18px;
|
| 248 |
+
z-index: 11;
|
| 249 |
max-width: min(320px, calc(100% - 36px));
|
| 250 |
border-left: 1px solid var(--cyan-dim);
|
| 251 |
padding: 6px 0 6px 10px;
|
|
|
|
| 261 |
}
|
| 262 |
|
| 263 |
.panel {
|
| 264 |
+
position: relative;
|
| 265 |
min-width: 0;
|
| 266 |
overflow: auto;
|
| 267 |
border-left: 1px solid var(--amber-dim);
|
|
|
|
| 269 |
}
|
| 270 |
|
| 271 |
.panel-inner {
|
| 272 |
+
position: relative;
|
| 273 |
+
z-index: 1;
|
| 274 |
min-height: 100%;
|
| 275 |
padding: 24px;
|
| 276 |
display: grid;
|
|
|
|
| 509 |
|
| 510 |
@keyframes scan {
|
| 511 |
0% { transform: translateY(0); opacity: 0; }
|
| 512 |
+
8%, 72% { opacity: 1; }
|
| 513 |
+
100% { transform: translateY(calc(100vh + 60px)); opacity: 0; }
|
| 514 |
}
|
| 515 |
|
| 516 |
@media (max-width: 860px) {
|
|
|
|
| 519 |
}
|
| 520 |
|
| 521 |
.shell {
|
| 522 |
+
overflow: hidden;
|
| 523 |
grid-template-columns: 1fr;
|
| 524 |
grid-template-rows: minmax(420px, 62vh) auto;
|
| 525 |
min-height: 100vh;
|
| 526 |
height: auto;
|
| 527 |
}
|
| 528 |
|
| 529 |
+
.component-watermark {
|
| 530 |
+
max-width: 120vw;
|
| 531 |
+
font-size: clamp(3rem, 14vw, 6rem);
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
.panel {
|
| 535 |
border-left: 0;
|
| 536 |
border-top: 1px solid var(--amber-dim);
|
|
|
|
| 544 |
</head>
|
| 545 |
<body>
|
| 546 |
<main class="shell">
|
| 547 |
+
<div id="componentWatermark" class="component-watermark" aria-hidden="true">Inside the Machine</div>
|
| 548 |
<section class="viewport-pane" aria-label="Cutaway viewport">
|
| 549 |
<div id="progress" class="progress"></div>
|
| 550 |
<div class="toolbar">
|
|
|
|
| 612 |
const retryButton = document.getElementById("retryButton");
|
| 613 |
const sourceCard = document.getElementById("sourceCard");
|
| 614 |
const sourceImage = document.getElementById("sourceImage");
|
| 615 |
+
const componentWatermark = document.getElementById("componentWatermark");
|
| 616 |
const componentEl = document.getElementById("component");
|
| 617 |
const confidenceEl = document.getElementById("confidence");
|
| 618 |
const summaryEl = document.getElementById("summary");
|
|
|
|
| 720 |
|
| 721 |
function populateAnalysis(analysis) {
|
| 722 |
window.lastAnalysis = analysis;
|
| 723 |
+
const componentName = String(analysis.component || "Component");
|
| 724 |
+
componentEl.textContent = componentName.toUpperCase();
|
| 725 |
+
componentWatermark.textContent = componentName;
|
| 726 |
confidenceEl.textContent = typeof analysis.confidence === "number"
|
| 727 |
? Math.round(analysis.confidence * 100) + "%"
|
| 728 |
: "--";
|