.loading-screen { position: fixed; inset: 0; z-index: 30; display: flex; align-items: center; justify-content: center; padding: 20px; background: radial-gradient(circle at 50% 42%, rgba(0, 122, 255, 0.22), rgba(0, 0, 0, 0.88) 58%); } .loading-screen.hidden, .hidden { display: none !important; } .loading-card { width: clamp(288px, 92vw, 420px); padding: 24px; pointer-events: auto; text-align: center; } .loading-ring { width: 96px; height: 96px; margin: 0 auto 18px; border: 2px solid rgba(255, 255, 255, 0.16); border-top-color: var(--accent); border-radius: 50%; animation: spin 1.2s linear infinite; } .caption { margin: 0 0 8px; color: var(--text-secondary); font: var(--font-caption); text-transform: uppercase; } .loading-card h1 { margin: 0 0 8px; font: var(--font-title1); } .loading-card p { margin: 0 0 18px; color: var(--text-secondary); font: var(--font-subheadline); } .progress-track { height: 4px; margin: 0 0 20px; overflow: hidden; border-radius: 99px; background: rgba(255, 255, 255, 0.12); } .progress-track span { display: block; width: 14%; height: 100%; border-radius: inherit; background: var(--accent); box-shadow: 0 0 18px var(--accent-glow); transition: width 0.25s ease; } .hud-toolbar { position: fixed; left: calc(12px + env(safe-area-inset-left)); right: calc(12px + env(safe-area-inset-right)); bottom: calc(14px + env(safe-area-inset-bottom)); z-index: 15; display: flex; justify-content: center; gap: 8px; padding: 10px; pointer-events: auto; overflow-x: auto; scrollbar-width: none; } .hud-toolbar::-webkit-scrollbar { display: none; } .status-panel { position: fixed; top: calc(12px + env(safe-area-inset-top)); left: calc(12px + env(safe-area-inset-left)); right: calc(12px + env(safe-area-inset-right)); z-index: 15; display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; padding: 10px 12px; pointer-events: none; } .status-panel span { display: block; margin-bottom: 3px; color: var(--text-tertiary); font: var(--font-caption); letter-spacing: 0.18em; text-transform: uppercase; } .status-panel strong { display: block; overflow: hidden; color: var(--accent); font: 500 12px/1.25 var(--font-mono); letter-spacing: 0.02em; text-overflow: ellipsis; text-transform: uppercase; white-space: nowrap; } .ar-panel { position: fixed; width: clamp(280px, 90vw, 400px); min-height: 220px; max-height: min(74vh, 640px); z-index: 12; padding: 18px; pointer-events: auto; transform: translate3d(16px, 96px, 0); transition: box-shadow 0.18s ease, transform 0.08s ease; } .ar-panel.active { box-shadow: var(--glass-shadow-deep), 0 0 42px var(--accent-glow); } .ar-panel header { height: 44px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding-left: 34px; } .ar-panel h2 { min-width: 0; margin: 0; overflow: hidden; font: var(--font-title3); text-overflow: ellipsis; white-space: nowrap; } .panel-minimize { width: 48px; height: 48px; flex: 0 0 48px; } .panel-body { max-height: calc(min(74vh, 640px) - 80px); overflow: auto; padding: 6px 2px 2px; scrollbar-width: thin; } .panel-body input, .panel-body select, .panel-body textarea { width: 100%; min-height: 46px; margin: 6px 0; padding: 12px 14px; border: 1px solid var(--separator); border-radius: 14px; outline: 0; background: rgba(0, 0, 0, 0.22); color: var(--text-primary); } .panel-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .panel-row { display: flex; gap: 8px; align-items: center; } .panel-action { min-height: 46px; padding: 10px 12px; border: 1px solid var(--glass-border); border-radius: 14px; background: rgba(255, 255, 255, 0.08); color: var(--text-primary); cursor: pointer; } .panel-action:active { background: var(--glass-bg-active); transform: scale(0.98); } .panel-list { display: grid; gap: 8px; margin: 12px 0; } .model-card { display: grid; grid-template-columns: 1fr auto; gap: 8px; align-items: center; min-height: 54px; padding: 10px; border: 1px solid var(--separator); border-radius: 14px; background: rgba(255, 255, 255, 0.06); } .model-card strong, .model-card span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .model-card span { color: var(--text-secondary); font: var(--font-caption); } .sketchfab-panel { display: grid; gap: 8px; margin: 12px 0; padding: 12px; border: 1px solid var(--separator); border-radius: 16px; background: rgba(255, 255, 255, 0.05); } .sketchfab-panel strong { font: var(--font-headline); } .panel-note { margin: 0; color: var(--text-secondary); font: var(--font-footnote); } .inline-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; align-items: center; } .inline-row .panel-action { min-width: 72px; } .sketchfab-results { max-height: 280px; overflow: auto; padding-right: 2px; } .sketchfab-card { grid-template-columns: 68px minmax(0, 1fr); align-items: stretch; } .sketchfab-card img { width: 68px; height: 68px; align-self: center; border-radius: 12px; object-fit: cover; background: rgba(0, 0, 0, 0.32); } .sketchfab-card > div:first-of-type { min-width: 0; display: grid; gap: 2px; } .sketchfab-card a { min-width: 0; overflow: hidden; color: var(--text-secondary); font: var(--font-caption); text-overflow: ellipsis; white-space: nowrap; } .model-actions { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .link-action { display: inline-flex; align-items: center; justify-content: center; min-height: 46px; text-decoration: none; } .jarvis-bubble { position: fixed; left: 50%; bottom: calc(98px + env(safe-area-inset-bottom)); z-index: 20; width: min(390px, calc(100vw - 24px)); padding: 14px 16px; pointer-events: none; transform: translateX(-50%); } .jarvis-bubble span { display: block; margin-bottom: 4px; color: var(--accent); font: 700 11px/1 var(--font); letter-spacing: 0.3em; text-transform: uppercase; } .jarvis-bubble p { margin: 0; color: var(--text-primary); font: var(--font-callout); } #error-host, #banner-host { position: fixed; left: 12px; right: 12px; z-index: 25; pointer-events: none; } #error-host { top: calc(14px + env(safe-area-inset-top)); } #banner-host { top: calc(78px + env(safe-area-inset-top)); } .error-panel, .banner-panel { width: min(520px, calc(100vw - 24px)); margin: 0 auto 8px; padding: 12px 14px; pointer-events: auto; } .error-panel { border-color: rgba(255, 59, 48, 0.45); box-shadow: var(--glass-shadow), 0 0 28px var(--destructive-glow); } .error-panel strong, .banner-panel strong { display: block; margin-bottom: 4px; font: var(--font-headline); } .error-panel p, .banner-panel p { margin: 0; color: var(--text-secondary); font: var(--font-footnote); } .error-panel a { color: var(--text-primary); } .context-menu { position: fixed; z-index: 22; display: grid; gap: 6px; width: 190px; padding: 8px; pointer-events: auto; } .context-menu button { min-height: 42px; border: 0; border-radius: 12px; background: rgba(255, 255, 255, 0.08); color: var(--text-primary); } .game-frame { width: 100%; height: 100%; border: 0; background: var(--bg-darker); }