:root { --bg: #fbfbfd; --surface: #ffffff; --surface-2: #f5f5f7; --ink: #1d1d1f; --ink-soft: #515154; --ink-faint: #86868b; --line: rgba(0, 0, 0, 0.1); --line-strong: rgba(0, 0, 0, 0.18); --accent: #0071e3; --accent-hover: #0062c4; --accent-soft: rgba(0, 113, 227, 0.1); --green: #34c759; --yellow: #ff9f0a; --red: #ff3b30; --danger: #ff3b30; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.04), 0 1px 3px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.06), 0 1px 3px rgba(0, 0, 0, 0.04); --panel-radius: 14px; --control-radius: 10px; --font-system: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text', system-ui, 'Segoe UI', Roboto, sans-serif; } * { box-sizing: border-box; } body { margin: 0; color: var(--ink); font-family: var(--font-system); font-feature-settings: 'ss01', 'ss02'; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; background: #000; } #root { min-height: 100vh; } /* Fullscreen stage: the splat preview fills the viewport and everything else floats over it (DialKit panel + overlays). */ .stage { position: fixed; inset: 0; overflow: hidden; background: #000; } /* Preview panel becomes edge-to-edge; its panel chrome is stripped. */ .preview-panel { position: absolute; inset: 0; margin: 0; padding: 0; border: none; border-radius: 0; background: #000; } .splat-canvas-shell { position: absolute; inset: 0; min-height: 0; border-radius: 0; overflow: hidden; background: #000; } .splat-canvas-host { position: absolute; inset: 0; } .splat-canvas-host canvas { width: 100% !important; height: 100% !important; display: block; } .splat-empty { position: absolute; inset: 0; display: grid; place-items: center; color: rgba(255, 255, 255, 0.7); font-size: 0.95rem; padding: 1.5rem; text-align: center; z-index: 3; } /* The preview component's own toolbar becomes a subtle viewer-status hint. */ .preview-toolbar { position: absolute; bottom: 16px; left: 50%; transform: translateX(-50%); display: flex; align-items: center; gap: 0.5rem; max-width: min(90vw, 520px); padding: 0.4rem 0.8rem; border-radius: 999px; background: rgba(20, 20, 22, 0.6); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.12); z-index: 4; pointer-events: none; } .preview-title { display: none; } .preview-status { color: rgba(255, 255, 255, 0.78); font-size: 0.76rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } /* Floating overlays over the preview. */ .overlays { position: absolute; inset: 0; z-index: 5; pointer-events: none; } .overlays a, .overlays button, .status-overlay, .thumb-overlay, .links-overlay { pointer-events: auto; } .status-overlay { position: absolute; top: 16px; left: 16px; max-width: 340px; display: flex; flex-direction: column; gap: 0.5rem; padding: 0.65rem 0.8rem; border-radius: 12px; background: rgba(20, 20, 22, 0.72); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid rgba(255, 255, 255, 0.12); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35); color: #fff; } .status-overlay-row { display: flex; align-items: center; gap: 0.5rem; } .status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--green); flex: 0 0 auto; } .status-dot.is-busy { background: var(--yellow); animation: status-pulse 1s ease-in-out infinite; } @keyframes status-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.35; } } .status-overlay-text { font-size: 0.8rem; line-height: 1.35; } .status-overlay-error { margin: 0; color: #ff6b6b; font-size: 0.76rem; line-height: 1.35; } .status-overlay-summary { margin: 0; color: rgba(255, 255, 255, 0.72); font-size: 0.74rem; } .status-overlay-save { margin: 0; color: var(--green); font-size: 0.74rem; } .progress-bar { height: 4px; border-radius: 999px; background: rgba(255, 255, 255, 0.16); overflow: hidden; } .progress-bar-fill { height: 100%; background: var(--accent); transition: width 0.2s ease; } .thumb-overlay { position: absolute; bottom: 16px; left: 16px; margin: 0; width: 168px; border-radius: 10px; overflow: hidden; background: rgba(0, 0, 0, 0.55); border: 1px solid rgba(255, 255, 255, 0.14); box-shadow: 0 8px 30px rgba(0, 0, 0, 0.35); } .thumb-overlay img { width: 100%; display: block; max-height: 130px; object-fit: cover; } .thumb-overlay figcaption { padding: 5px 7px; font-size: 0.66rem; color: rgba(255, 255, 255, 0.78); line-height: 1.3; } .links-overlay { position: absolute; bottom: 16px; right: 16px; display: flex; align-items: center; gap: 0.35rem; padding: 0.25rem 0.4rem; border-radius: 999px; background: rgba(20, 20, 22, 0.55); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid rgba(255, 255, 255, 0.1); } .links-overlay a { display: inline-grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; color: rgba(255, 255, 255, 0.72); text-decoration: none; transition: background-color 120ms ease, color 120ms ease; } .links-overlay a:hover { background: rgba(255, 255, 255, 0.1); color: #fff; } .links-overlay a svg { width: 17px; height: 17px; } .links-overlay-license { width: auto !important; padding: 0 0.5rem; font-size: 0.72rem; color: rgba(255, 255, 255, 0.6); } .links-overlay-license:hover { text-decoration: underline; } /* DialKit button accents (classes applied by App via label matching). */ .dialkit-button.dialkit-button--primary { background: var(--accent); color: #fff; font-weight: 600; box-shadow: 0 0 0 1px var(--accent), 0 6px 18px rgba(0, 113, 227, 0.35); } .dialkit-button.dialkit-button--primary:hover { background: var(--accent-hover); } .dialkit-button.dialkit-button--ok { color: var(--green); font-weight: 600; cursor: default; } @media (max-width: 640px) { .thumb-overlay { width: 120px; } .status-overlay { max-width: calc(100vw - 32px); } }