:root { --toolbar-bg: rgba(251, 251, 254, 0.82); --toolbar-border: rgba(0, 0, 0, 0.08); --toolbar-shadow: 0 1px 3px rgba(0, 0, 0, 0.04), 0 8px 24px rgba(0, 0, 0, 0.06); --bar-bg: rgba(0, 0, 0, 0.04); --bar-bg-hover: rgba(0, 0, 0, 0.06); --bar-border: rgba(0, 0, 0, 0.08); --bar-focus-ring: rgba(59, 130, 246, 0.4); --bar-focus-bg: #fff; --text-primary: #1a1a1a; --text-secondary: rgba(0, 0, 0, 0.45); --text-tertiary: rgba(0, 0, 0, 0.3); --nav-hover: rgba(0, 0, 0, 0.06); --nav-active: rgba(0, 0, 0, 0.1); --stage-bg: #f5f5f7; --status-bg: rgba(255, 255, 255, 0.88); --status-border: rgba(0, 0, 0, 0.06); --accent: #007aff; --accent-text: #0066d6; --loading-bar: #007aff; color-scheme: light dark; } @media (prefers-color-scheme: dark) { :root { --toolbar-bg: rgba(40, 40, 44, 0.82); --toolbar-border: rgba(255, 255, 255, 0.08); --toolbar-shadow: 0 1px 3px rgba(0, 0, 0, 0.2), 0 8px 24px rgba(0, 0, 0, 0.15); --bar-bg: rgba(255, 255, 255, 0.07); --bar-bg-hover: rgba(255, 255, 255, 0.1); --bar-border: rgba(255, 255, 255, 0.1); --bar-focus-ring: rgba(100, 160, 255, 0.4); --bar-focus-bg: rgba(30, 30, 34, 0.95); --text-primary: #f0f0f0; --text-secondary: rgba(255, 255, 255, 0.5); --text-tertiary: rgba(255, 255, 255, 0.25); --nav-hover: rgba(255, 255, 255, 0.08); --nav-active: rgba(255, 255, 255, 0.14); --stage-bg: #1c1c1e; --status-bg: rgba(44, 44, 48, 0.9); --status-border: rgba(255, 255, 255, 0.08); --accent: #4da3ff; --accent-text: #6bb3ff; --loading-bar: #4da3ff; } } * { box-sizing: border-box; margin: 0; padding: 0; } html, body { height: 100%; overflow: hidden; } body { font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "Segoe UI", system-ui, sans-serif; font-size: 13px; line-height: 1; color: var(--text-primary); background: transparent; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } button, input { font: inherit; } button { cursor: pointer; border: 0; background: none; } /* ── Shell ── */ .browser-shell { position: relative; height: 100vh; display: flex; flex-direction: column; } /* ── Toolbar ── */ .toolbar { position: relative; z-index: 10; flex-shrink: 0; background: var(--toolbar-bg); backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px); border-bottom: 0.5px solid var(--toolbar-border); box-shadow: var(--toolbar-shadow); padding: 0 14px; } .toolbar-row { display: flex; align-items: center; gap: 8px; height: 48px; } /* ── Navigation ── */ .nav-group { display: flex; align-items: center; gap: 2px; -webkit-app-region: no-drag; } .nav-btn { width: 30px; height: 30px; border-radius: 6px; display: flex; align-items: center; justify-content: center; color: var(--text-primary); transition: background 0.12s ease, opacity 0.12s ease; } .nav-btn:not(:disabled):hover { background: var(--nav-hover); } .nav-btn:not(:disabled):active { background: var(--nav-active); } .nav-btn:disabled { opacity: 0.28; cursor: default; } /* ── Address Bar ── */ .address-bar-wrapper { flex: 1; min-width: 0; -webkit-app-region: no-drag; } .address-bar { position: relative; display: flex; align-items: center; height: 34px; border-radius: 8px; background: var(--bar-bg); border: 1px solid transparent; transition: background 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease; overflow: hidden; } .address-bar:hover { background: var(--bar-bg-hover); } .address-bar.focused { background: var(--bar-focus-bg); border-color: var(--accent); box-shadow: 0 0 0 3px var(--bar-focus-ring); } .address-icon { display: flex; align-items: center; justify-content: center; width: 32px; flex-shrink: 0; color: var(--text-tertiary); transition: color 0.2s ease; } .address-bar.secure .address-icon { color: var(--accent-text); } .address-icon .icon-globe { display: block; } .address-icon .icon-lock { display: none; } .address-bar.secure .address-icon .icon-globe { display: none; } .address-bar.secure .address-icon .icon-lock { display: block; } #url-input { flex: 1; min-width: 0; height: 100%; border: 0; outline: 0; background: transparent; color: var(--text-primary); font-size: 13px; font-weight: 400; letter-spacing: 0.01em; padding: 0 2px; text-overflow: ellipsis; } #url-input::placeholder { color: var(--text-tertiary); } #url-input::selection { background: rgba(59, 130, 246, 0.25); } .reload-btn { width: 34px; height: 100%; display: flex; align-items: center; justify-content: center; flex-shrink: 0; color: var(--text-secondary); border-radius: 0 7px 7px 0; transition: color 0.12s ease, background 0.12s ease; } .reload-btn svg { flex-shrink: 0; } .reload-btn:hover { color: var(--text-primary); background: var(--nav-hover); } .reload-btn:active { background: var(--nav-active); } .reload-btn .icon-stop { display: none; } .address-bar.loading .reload-btn .icon-reload { display: none; } .address-bar.loading .reload-btn .icon-stop { display: block; } /* ── Suggestions ── */ .address-bar-wrapper { position: relative; } .suggestions { position: absolute; top: calc(100% + 4px); left: 0; right: 0; z-index: 100; max-height: 280px; overflow-y: auto; overscroll-behavior: contain; border-radius: 10px; background: var(--status-bg); backdrop-filter: saturate(180%) blur(20px); -webkit-backdrop-filter: saturate(180%) blur(20px); border: 0.5px solid var(--toolbar-border); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.14), 0 1px 3px rgba(0, 0, 0, 0.06); padding: 4px; animation: suggestions-in 0.15s ease; } .suggestions[hidden] { display: none; } @keyframes suggestions-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: translateY(0); } } .suggestion { display: flex; align-items: center; gap: 10px; padding: 7px 10px; border-radius: 7px; cursor: pointer; transition: background 0.08s ease; } .suggestion:hover, .suggestion.active { background: var(--nav-hover); } .suggestion-icon { flex-shrink: 0; width: 16px; height: 16px; display: flex; align-items: center; justify-content: center; color: var(--text-tertiary); } .suggestion-url { flex: 1; min-width: 0; font-size: 13px; color: var(--text-primary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .suggestion-url mark { background: none; color: var(--accent); font-weight: 600; } .suggestion-host { flex-shrink: 0; font-size: 11px; color: var(--text-tertiary); } /* ── Loading Bar ── */ .loading-bar { position: absolute; bottom: 0; left: 0; height: 2px; width: 0; background: var(--loading-bar); border-radius: 0 1px 1px 0; opacity: 0; transition: opacity 0.3s ease; pointer-events: none; } .address-bar.loading .loading-bar { opacity: 1; animation: loading-progress 2.5s cubic-bezier(0.4, 0, 0.2, 1) forwards; } @keyframes loading-progress { 0% { width: 0; } 10% { width: 25%; } 30% { width: 50%; } 50% { width: 70%; } 70% { width: 82%; } 90% { width: 90%; } 100% { width: 94%; } } .address-bar.load-complete .loading-bar { width: 100% !important; opacity: 0; transition: width 0.2s ease, opacity 0.4s ease 0.2s; animation: none; } /* ── Page Stage ── */ .page-stage { flex: 1; display: flex; align-items: center; justify-content: center; background: transparent; } .empty-state { display: flex; flex-direction: column; align-items: center; gap: 10px; color: var(--text-tertiary); user-select: none; } .empty-state[hidden] { display: none; } .empty-icon { margin-bottom: 4px; animation: pulse-ring 3s ease-in-out infinite; } @keyframes pulse-ring { 0%, 100% { opacity: 0.7; transform: scale(1); } 50% { opacity: 1; transform: scale(1.04); } } .empty-title { font-size: 15px; font-weight: 600; color: var(--text-secondary); letter-spacing: -0.01em; } .empty-sub { font-size: 12px; line-height: 1.4; } /* ── Error State ── */ .error-state { display: flex; flex-direction: column; align-items: center; gap: 8px; user-select: none; animation: error-in 0.3s ease; } .error-state[hidden] { display: none; } @keyframes error-in { from { opacity: 0; transform: scale(0.97); } to { opacity: 1; transform: scale(1); } } .error-icon { margin-bottom: 6px; color: var(--text-tertiary); } .error-title { font-size: 17px; font-weight: 600; color: var(--text-primary); letter-spacing: -0.02em; } .error-detail { font-size: 13px; line-height: 1.5; color: var(--text-secondary); text-align: center; max-width: 320px; } .error-retry { margin-top: 8px; padding: 7px 20px; border-radius: 7px; border: 0; font-size: 13px; font-weight: 500; color: #fff; background: var(--accent); cursor: pointer; transition: filter 0.12s ease; } .error-retry:hover { filter: brightness(1.1); } .error-retry:active { filter: brightness(0.9); } /* ── Status Bar ── */ .status-bar { position: fixed; left: 8px; bottom: 8px; z-index: 20; max-width: min(480px, calc(100vw - 16px)); padding: 5px 10px; border-radius: 6px; background: var(--status-bg); backdrop-filter: saturate(160%) blur(12px); -webkit-backdrop-filter: saturate(160%) blur(12px); border: 0.5px solid var(--status-border); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08); font-size: 11px; color: var(--text-secondary); opacity: 1; transform: translateY(0); transition: opacity 0.3s ease, transform 0.3s ease; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .status-bar.hidden { opacity: 0; transform: translateY(4px); pointer-events: none; }