bennyguo Claude Opus 4.8 commited on
Commit
8e63a5c
·
1 Parent(s): 7265209

Polish web UI: gold theme, scrollable left panel, header cleanup

Browse files

- Retheme accent from red to the Tripo gold (#F9CF00) across the dark
UI: tokens, logo, buttons, focus rings, hovers, viewer glow, and the
sampling progress bar. Generate button now uses dark ink text for
contrast on gold. Destructive/error reds are intentionally kept.
- Rename the title "Splat" to "TripoSplat".
- Make the left panel scrollable with the Generate button pinned to the
bottom (inner .panel-left-scroll), so the upload area is no longer
clipped when the settings accordion is expanded.
- Move the Paper/Blog/GitHub links into the header center and drop the
tagline; remove the redundant left-panel title and the duplicate
bottom "drag to orbit" hint (the viewer keeps its top-left one).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files changed (1) hide show
  1. index.html +51 -66
index.html CHANGED
@@ -20,15 +20,17 @@
20
  --bg-input: rgba(255, 255, 255, 0.045);
21
  --border: rgba(255, 255, 255, 0.06);
22
  --border-hover: rgba(255, 255, 255, 0.12);
23
- --border-focus: rgba(255, 77, 79, 0.45);
24
- --text: #e2e8f0;
25
- --text-secondary: #94a3b8;
26
- --text-muted: #64748b;
27
- --text-faint: #475569;
28
- --accent: #ff4d4f;
29
- --accent-dark: #d9363e;
30
- --accent-glow: rgba(255, 77, 79, 0.25);
31
- --accent-subtle: rgba(255, 77, 79, 0.08);
 
 
32
  --success: #34d399;
33
  --error: #f87171;
34
  --radius-sm: 6px;
@@ -64,9 +66,9 @@ body::before {
64
  position: fixed;
65
  inset: 0;
66
  background:
67
- radial-gradient(ellipse at 15% 25%, rgba(255, 77, 79, 0.07) 0%, transparent 55%),
68
- radial-gradient(ellipse at 85% 75%, rgba(255, 120, 117, 0.05) 0%, transparent 50%),
69
- radial-gradient(ellipse at 50% 50%, rgba(63, 27, 27, 0.15) 0%, transparent 70%);
70
  pointer-events: none;
71
  z-index: 0;
72
  animation: bgPulse 25s ease-in-out infinite alternate;
@@ -113,25 +115,16 @@ body::before {
113
  .logo-text {
114
  font-size: 18px;
115
  font-weight: 700;
116
- background: linear-gradient(135deg, #ff9c6e, #ff4d4f);
117
  -webkit-background-clip: text;
118
  -webkit-text-fill-color: transparent;
119
  background-clip: text;
120
- letter-spacing: -0.3px;
121
  }
122
  .header-center {
123
  position: absolute;
124
  left: 50%;
125
  transform: translateX(-50%);
126
- font-size: 12px;
127
- color: var(--text-muted);
128
- max-width: 400px;
129
- text-align: center;
130
- line-height: 1.4;
131
- display: none;
132
- }
133
- @media (min-width: 1100px) { .header-center { display: block; } }
134
- .header-right {
135
  display: flex;
136
  align-items: center;
137
  gap: 4px;
@@ -146,8 +139,8 @@ body::before {
146
  transition: all var(--transition-fast);
147
  }
148
  .header-link:hover {
149
- color: var(--text);
150
- background: var(--bg-surface);
151
  }
152
 
153
  /* ======================================================================
@@ -171,13 +164,24 @@ body::before {
171
  .panel-left, .panel-right {
172
  display: flex;
173
  flex-direction: column;
174
- overflow-y: auto;
175
  padding: 20px;
176
  }
 
 
 
177
  .panel-left {
178
  width: var(--panel-left-w);
179
  min-width: 280px;
180
  border-right: 1px solid var(--border);
 
 
 
 
 
 
 
 
 
181
  }
182
  .panel-right {
183
  width: var(--panel-right-w);
@@ -245,12 +249,12 @@ body::before {
245
  overflow: hidden;
246
  }
247
  #upload-area:hover {
248
- border-color: rgba(255, 77, 79, 0.35);
249
  background: var(--accent-subtle);
250
  }
251
  #upload-area.drag-over {
252
  border-color: var(--accent);
253
- background: rgba(255, 77, 79, 0.12);
254
  transform: scale(1.01);
255
  }
256
  #upload-area.has-image {
@@ -331,7 +335,7 @@ body::before {
331
  position: relative;
332
  }
333
  .example-thumb:hover {
334
- border-color: rgba(255, 77, 79, 0.35);
335
  transform: scale(1.06);
336
  box-shadow: 0 4px 16px rgba(0,0,0,0.3);
337
  }
@@ -429,7 +433,7 @@ select {
429
  input[type="number"]:focus,
430
  select:focus {
431
  border-color: var(--border-focus);
432
- box-shadow: 0 0 0 3px rgba(255, 77, 79, 0.1);
433
  }
434
  select {
435
  appearance: none;
@@ -481,14 +485,14 @@ input[type="range"]::-moz-range-thumb {
481
  .btn-primary {
482
  width: 100%;
483
  padding: 13px 16px;
484
- margin-top: auto;
485
- background: linear-gradient(135deg, #ff4d4f 0%, #d9363e 100%);
486
  border: none;
487
  border-radius: var(--radius-md);
488
- color: #fff;
489
  font-family: inherit;
490
  font-size: 14px;
491
- font-weight: 600;
492
  cursor: pointer;
493
  display: flex;
494
  align-items: center;
@@ -503,7 +507,7 @@ input[type="range"]::-moz-range-thumb {
503
  content: '';
504
  position: absolute;
505
  inset: 0;
506
- background: linear-gradient(120deg, transparent 25%, rgba(255,255,255,0.12) 50%, transparent 75%);
507
  transform: translateX(-120%);
508
  transition: transform 0.65s ease;
509
  }
@@ -511,7 +515,7 @@ input[type="range"]::-moz-range-thumb {
511
  transform: translateX(120%);
512
  }
513
  .btn-primary:hover:not(:disabled) {
514
- box-shadow: 0 6px 24px rgba(255, 77, 79, 0.35), 0 0 0 1px rgba(255, 77, 79, 0.2);
515
  transform: translateY(-1px);
516
  }
517
  .btn-primary:active:not(:disabled) {
@@ -522,7 +526,7 @@ input[type="range"]::-moz-range-thumb {
522
  cursor: not-allowed;
523
  }
524
  .btn-primary.loading {
525
- background: linear-gradient(135deg, #d9363e 0%, #ad2128 100%);
526
  pointer-events: none;
527
  }
528
  .btn-icon {
@@ -543,7 +547,7 @@ input[type="range"]::-moz-range-thumb {
543
  transition: box-shadow var(--transition-slow);
544
  }
545
  .viewer-wrap.active {
546
- box-shadow: 0 0 40px rgba(255, 77, 79, 0.08), 0 0 80px rgba(255, 120, 117, 0.04);
547
  }
548
  .viewer-placeholder {
549
  display: flex;
@@ -575,18 +579,6 @@ input[type="range"]::-moz-range-thumb {
575
  position: absolute;
576
  inset: 0;
577
  }
578
- .viewer-bar {
579
- display: flex;
580
- align-items: center;
581
- justify-content: center;
582
- padding: 10px 0 0;
583
- flex-shrink: 0;
584
- }
585
- .viewer-hint {
586
- font-size: 11px;
587
- color: var(--text-muted);
588
- letter-spacing: 0.3px;
589
- }
590
 
591
  /* ======================================================================
592
  GENERATION PROGRESS OVERLAY (inside the viewer)
@@ -626,7 +618,7 @@ input[type="range"]::-moz-range-thumb {
626
  height: 100%;
627
  width: 0%;
628
  border-radius: 3px;
629
- background: linear-gradient(90deg, #ff9c6e, #ff4d4f);
630
  box-shadow: 0 0 12px var(--accent-glow);
631
  transition: width 0.3s ease;
632
  }
@@ -832,7 +824,9 @@ input[type="range"]::-moz-range-thumb {
832
  border-bottom: 1px solid var(--border);
833
  }
834
  .panel-center { min-height: 400px; }
835
- .header-center { display: none; }
 
 
836
  :root {
837
  --panel-left-w: 100%;
838
  --panel-right-w: 100%;
@@ -848,12 +842,9 @@ input[type="range"]::-moz-range-thumb {
848
  <header id="app-header">
849
  <div class="header-left">
850
  <img class="logo-img" src="https://cdn-web.tripo3d.ai/tripo-web/logo/tripo-logo1.webp" alt="Tripo AI Logo">
851
- <span class="logo-text">Splat</span>
852
  </div>
853
  <div class="header-center">
854
- Single image → high-quality 3D Gaussians by <a href="https://www.tripo3d.ai/" style="color:var(--accent);text-decoration:none" target="_blank">TripoAI</a>
855
- </div>
856
- <div class="header-right">
857
  <a class="header-link" href="https://arxiv.org/abs/2605.16355" target="_blank" rel="noopener">Paper</a>
858
  <a class="header-link" href="https://www.tripo3d.ai/research/triposplat" target="_blank" rel="noopener">Blog</a>
859
  <a class="header-link" href="https://github.com/VAST-AI-Research/TripoSplat" target="_blank" rel="noopener">GitHub</a>
@@ -867,10 +858,8 @@ input[type="range"]::-moz-range-thumb {
867
 
868
  <!-- =============== LEFT PANEL =============== -->
869
  <aside class="panel panel-left" id="panel-left">
870
- <div class="panel-header">
871
- <h2 class="panel-title">Image to 3D</h2>
872
- <span class="badge">Gaussian Splatting</span>
873
- </div>
874
 
875
  <!-- Upload area -->
876
  <div id="upload-area">
@@ -936,10 +925,9 @@ input[type="range"]::-moz-range-thumb {
936
  </div>
937
  </div>
938
 
939
- <!-- Spacer -->
940
- <div style="flex:1;min-height:12px"></div>
941
 
942
- <!-- Generate button -->
943
  <button class="btn-primary" id="generate-btn" type="button" disabled>
944
  <svg class="btn-icon" id="generate-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0L14.59 8.41 23 12 14.59 15.59 12 24 9.41 15.59 1 12 9.41 8.41Z"/></svg>
945
  <span id="generate-label">Generate</span>
@@ -969,9 +957,6 @@ input[type="range"]::-moz-range-thumb {
969
  <div class="gen-progress-pct" id="gen-progress-pct"></div>
970
  </div>
971
  </div>
972
- <div class="viewer-bar">
973
- <span class="viewer-hint">drag to orbit &nbsp;·&nbsp; scroll to zoom &nbsp;·&nbsp; right-drag to pan</span>
974
- </div>
975
  </section>
976
 
977
  <!-- =============== RIGHT PANEL =============== -->
 
20
  --bg-input: rgba(255, 255, 255, 0.045);
21
  --border: rgba(255, 255, 255, 0.06);
22
  --border-hover: rgba(255, 255, 255, 0.12);
23
+ --border-focus: rgba(249, 207, 0, 0.5);
24
+ --text: #e8eaf0;
25
+ --text-secondary: #9aa3b2;
26
+ --text-muted: #6b7488;
27
+ --text-faint: #4b5366;
28
+ --accent: #F9CF00;
29
+ --accent-light: #ffe14d;
30
+ --accent-dark: #d4af00;
31
+ --accent-ink: #1a1500;
32
+ --accent-glow: rgba(249, 207, 0, 0.28);
33
+ --accent-subtle: rgba(249, 207, 0, 0.1);
34
  --success: #34d399;
35
  --error: #f87171;
36
  --radius-sm: 6px;
 
66
  position: fixed;
67
  inset: 0;
68
  background:
69
+ radial-gradient(ellipse at 15% 25%, rgba(249, 207, 0, 0.08) 0%, transparent 55%),
70
+ radial-gradient(ellipse at 85% 75%, rgba(255, 225, 77, 0.05) 0%, transparent 50%),
71
+ radial-gradient(ellipse at 50% 50%, rgba(60, 50, 8, 0.18) 0%, transparent 70%);
72
  pointer-events: none;
73
  z-index: 0;
74
  animation: bgPulse 25s ease-in-out infinite alternate;
 
115
  .logo-text {
116
  font-size: 18px;
117
  font-weight: 700;
118
+ background: linear-gradient(135deg, #fff0a8, var(--accent) 55%, var(--accent-dark));
119
  -webkit-background-clip: text;
120
  -webkit-text-fill-color: transparent;
121
  background-clip: text;
122
+ letter-spacing: -0.2px;
123
  }
124
  .header-center {
125
  position: absolute;
126
  left: 50%;
127
  transform: translateX(-50%);
 
 
 
 
 
 
 
 
 
128
  display: flex;
129
  align-items: center;
130
  gap: 4px;
 
139
  transition: all var(--transition-fast);
140
  }
141
  .header-link:hover {
142
+ color: var(--accent);
143
+ background: var(--accent-subtle);
144
  }
145
 
146
  /* ======================================================================
 
164
  .panel-left, .panel-right {
165
  display: flex;
166
  flex-direction: column;
 
167
  padding: 20px;
168
  }
169
+ .panel-right {
170
+ overflow-y: auto;
171
+ }
172
  .panel-left {
173
  width: var(--panel-left-w);
174
  min-width: 280px;
175
  border-right: 1px solid var(--border);
176
+ overflow: hidden; /* the inner area scrolls; button stays pinned */
177
+ }
178
+ /* Scrollable region holding upload / examples / settings. */
179
+ .panel-left-scroll {
180
+ flex: 1 1 auto;
181
+ min-height: 0; /* allow the flex child to shrink so it can scroll */
182
+ overflow-y: auto;
183
+ margin-right: -8px; /* keep content clear of the scrollbar */
184
+ padding-right: 8px;
185
  }
186
  .panel-right {
187
  width: var(--panel-right-w);
 
249
  overflow: hidden;
250
  }
251
  #upload-area:hover {
252
+ border-color: rgba(249, 207, 0, 0.4);
253
  background: var(--accent-subtle);
254
  }
255
  #upload-area.drag-over {
256
  border-color: var(--accent);
257
+ background: rgba(249, 207, 0, 0.14);
258
  transform: scale(1.01);
259
  }
260
  #upload-area.has-image {
 
335
  position: relative;
336
  }
337
  .example-thumb:hover {
338
+ border-color: rgba(249, 207, 0, 0.4);
339
  transform: scale(1.06);
340
  box-shadow: 0 4px 16px rgba(0,0,0,0.3);
341
  }
 
433
  input[type="number"]:focus,
434
  select:focus {
435
  border-color: var(--border-focus);
436
+ box-shadow: 0 0 0 3px rgba(249, 207, 0, 0.12);
437
  }
438
  select {
439
  appearance: none;
 
485
  .btn-primary {
486
  width: 100%;
487
  padding: 13px 16px;
488
+ margin-top: 16px;
489
+ background: linear-gradient(135deg, var(--accent-light) 0%, var(--accent) 55%, var(--accent-dark) 100%);
490
  border: none;
491
  border-radius: var(--radius-md);
492
+ color: var(--accent-ink);
493
  font-family: inherit;
494
  font-size: 14px;
495
+ font-weight: 700;
496
  cursor: pointer;
497
  display: flex;
498
  align-items: center;
 
507
  content: '';
508
  position: absolute;
509
  inset: 0;
510
+ background: linear-gradient(120deg, transparent 25%, rgba(255,255,255,0.4) 50%, transparent 75%);
511
  transform: translateX(-120%);
512
  transition: transform 0.65s ease;
513
  }
 
515
  transform: translateX(120%);
516
  }
517
  .btn-primary:hover:not(:disabled) {
518
+ box-shadow: 0 6px 24px rgba(249, 207, 0, 0.38), 0 0 0 1px rgba(249, 207, 0, 0.25);
519
  transform: translateY(-1px);
520
  }
521
  .btn-primary:active:not(:disabled) {
 
526
  cursor: not-allowed;
527
  }
528
  .btn-primary.loading {
529
+ background: linear-gradient(135deg, var(--accent-dark) 0%, #9c8000 100%);
530
  pointer-events: none;
531
  }
532
  .btn-icon {
 
547
  transition: box-shadow var(--transition-slow);
548
  }
549
  .viewer-wrap.active {
550
+ box-shadow: 0 0 40px rgba(249, 207, 0, 0.1), 0 0 80px rgba(255, 225, 77, 0.05);
551
  }
552
  .viewer-placeholder {
553
  display: flex;
 
579
  position: absolute;
580
  inset: 0;
581
  }
 
 
 
 
 
 
 
 
 
 
 
 
582
 
583
  /* ======================================================================
584
  GENERATION PROGRESS OVERLAY (inside the viewer)
 
618
  height: 100%;
619
  width: 0%;
620
  border-radius: 3px;
621
+ background: linear-gradient(90deg, var(--accent-light), var(--accent));
622
  box-shadow: 0 0 12px var(--accent-glow);
623
  transition: width 0.3s ease;
624
  }
 
824
  border-bottom: 1px solid var(--border);
825
  }
826
  .panel-center { min-height: 400px; }
827
+ /* Let the left panel flow with the page instead of an inner scroll. */
828
+ .panel-left { overflow: visible; }
829
+ .panel-left-scroll { overflow: visible; min-height: 0; }
830
  :root {
831
  --panel-left-w: 100%;
832
  --panel-right-w: 100%;
 
842
  <header id="app-header">
843
  <div class="header-left">
844
  <img class="logo-img" src="https://cdn-web.tripo3d.ai/tripo-web/logo/tripo-logo1.webp" alt="Tripo AI Logo">
845
+ <span class="logo-text">TripoSplat</span>
846
  </div>
847
  <div class="header-center">
 
 
 
848
  <a class="header-link" href="https://arxiv.org/abs/2605.16355" target="_blank" rel="noopener">Paper</a>
849
  <a class="header-link" href="https://www.tripo3d.ai/research/triposplat" target="_blank" rel="noopener">Blog</a>
850
  <a class="header-link" href="https://github.com/VAST-AI-Research/TripoSplat" target="_blank" rel="noopener">GitHub</a>
 
858
 
859
  <!-- =============== LEFT PANEL =============== -->
860
  <aside class="panel panel-left" id="panel-left">
861
+ <!-- Scrollable content; the Generate button below stays pinned -->
862
+ <div class="panel-left-scroll">
 
 
863
 
864
  <!-- Upload area -->
865
  <div id="upload-area">
 
925
  </div>
926
  </div>
927
 
928
+ </div><!-- /.panel-left-scroll -->
 
929
 
930
+ <!-- Generate button (always pinned to the bottom) -->
931
  <button class="btn-primary" id="generate-btn" type="button" disabled>
932
  <svg class="btn-icon" id="generate-icon" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0L14.59 8.41 23 12 14.59 15.59 12 24 9.41 15.59 1 12 9.41 8.41Z"/></svg>
933
  <span id="generate-label">Generate</span>
 
957
  <div class="gen-progress-pct" id="gen-progress-pct"></div>
958
  </div>
959
  </div>
 
 
 
960
  </section>
961
 
962
  <!-- =============== RIGHT PANEL =============== -->