jasondo OpenAI Codex commited on
Commit
ca9bbeb
·
1 Parent(s): 2972ff4

Polish cutaway viewport visuals

Browse files

Co-authored-by: OpenAI Codex <codex@openai.com>

Files changed (2) hide show
  1. AGENTS.md +6 -2
  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: radial-gradient(circle at center, transparent 58%, rgba(0, 0, 0, 0.36));
 
 
84
  z-index: 7;
85
  }
86
 
@@ -122,15 +157,27 @@
122
  right: 0;
123
  top: -2px;
124
  z-index: 8;
125
- height: 2px;
126
  opacity: 0;
127
- background: var(--cyan);
128
- box-shadow: 0 0 18px rgba(95, 212, 208, 0.8);
 
 
129
  pointer-events: none;
130
  }
131
 
 
 
 
 
 
 
 
 
 
 
132
  .scan-line.active {
133
- animation: scan 700ms ease-out;
134
  }
135
 
136
  .progress {
@@ -198,7 +245,7 @@
198
  position: absolute;
199
  left: 18px;
200
  bottom: 18px;
201
- z-index: 10;
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
- 12%, 75% { opacity: 1; }
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
- componentEl.textContent = String(analysis.component || "Component").toUpperCase();
 
 
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
  : "--";