Spaces:
Running on Zero
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>
- index.html +51 -66
|
@@ -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(
|
| 24 |
-
--text: #
|
| 25 |
-
--text-secondary: #
|
| 26 |
-
--text-muted: #
|
| 27 |
-
--text-faint: #
|
| 28 |
-
--accent: #
|
| 29 |
-
--accent-
|
| 30 |
-
--accent-
|
| 31 |
-
--accent-
|
|
|
|
|
|
|
| 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(
|
| 68 |
-
radial-gradient(ellipse at 85% 75%, rgba(255,
|
| 69 |
-
radial-gradient(ellipse at 50% 50%, rgba(
|
| 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, #
|
| 117 |
-webkit-background-clip: text;
|
| 118 |
-webkit-text-fill-color: transparent;
|
| 119 |
background-clip: text;
|
| 120 |
-
letter-spacing: -0.
|
| 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(--
|
| 150 |
-
background: var(--
|
| 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(
|
| 249 |
background: var(--accent-subtle);
|
| 250 |
}
|
| 251 |
#upload-area.drag-over {
|
| 252 |
border-color: var(--accent);
|
| 253 |
-
background: rgba(
|
| 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(
|
| 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(
|
| 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:
|
| 485 |
-
background: linear-gradient(135deg,
|
| 486 |
border: none;
|
| 487 |
border-radius: var(--radius-md);
|
| 488 |
-
color:
|
| 489 |
font-family: inherit;
|
| 490 |
font-size: 14px;
|
| 491 |
-
font-weight:
|
| 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.
|
| 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(
|
| 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,
|
| 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(
|
| 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,
|
| 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 |
-
|
|
|
|
|
|
|
| 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">
|
| 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 |
-
<
|
| 871 |
-
|
| 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 |
-
<!--
|
| 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 · scroll to zoom · 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 =============== -->
|