/* ════════════════════════════════════════════════════════════ modal.css — overlay, panel, and all settings controls ════════════════════════════════════════════════════════════ */ /* ── Overlay ─────────────────────────────────────────────── */ .modal-overlay { position: fixed; inset: 0; z-index: 200; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.28); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); /* Hidden by default */ opacity: 0; pointer-events: none; transition: opacity 0.26s ease; } .modal-overlay.modal-visible { opacity: 1; pointer-events: all; } /* ── Panel ───────────────────────────────────────────────── */ .modal { width: 310px; background: var(--modal-surface); border: 1px solid var(--modal-border); border-radius: 18px; overflow: hidden; /* Glass blur effect */ backdrop-filter: blur(48px) saturate(1.5); -webkit-backdrop-filter: blur(48px) saturate(1.5); box-shadow: 0 32px 80px rgba(0, 0, 0, 0.45), 0 2px 12px rgba(0, 0, 0, 0.30); /* Entry animation: rises and scales into place */ transform: translateY(18px) scale(0.96); transition: transform 0.32s cubic-bezier(0.16, 1, 0.3, 1); will-change: transform; } .modal-overlay.modal-visible .modal { transform: translateY(0) scale(1); } /* ── Header ──────────────────────────────────────────────── */ .modal-header { display: flex; align-items: center; justify-content: space-between; padding: 18px 20px 15px; border-bottom: 1px solid var(--modal-divider); } .modal-title { font-family: var(--font-mono); font-size: 0.65rem; font-weight: 400; letter-spacing: 0.18em; text-transform: lowercase; color: var(--text-lo); user-select: none; } .modal-close { appearance: none; background: transparent; border: none; outline: none; cursor: pointer; padding: 0; -webkit-tap-highlight-color: transparent; width: 26px; height: 26px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 1.15rem; line-height: 1; color: var(--text-lo); transition: color 0.18s ease, background 0.18s ease; } .modal-close:hover { color: var(--text-hi); background: var(--surface-tint); } .modal-close:focus-visible { outline: 2px solid rgba(255, 255, 255, 0.4); outline-offset: 2px; } /* ── Body ────────────────────────────────────────────────── */ .modal-body { padding: 20px; display: flex; flex-direction: column; gap: 0; max-height: calc(90vh - 60px); overflow-y: auto; scrollbar-width: none; } .modal-body::-webkit-scrollbar { display: none; } /* ── Settings section (visual group) ─────────────────────── */ .settings-section { padding: 16px 0; display: flex; flex-direction: column; gap: 14px; } .settings-section + .settings-section { border-top: 1px solid var(--modal-divider); } .settings-section__label { font-family: var(--font-mono); font-size: 0.56rem; font-weight: 400; letter-spacing: 0.18em; text-transform: uppercase; color: var(--text-lo); opacity: 0.5; user-select: none; margin: 0; } /* ── Setting group (label + control) ─────────────────────── */ .setting-group { display: flex; flex-direction: column; gap: 10px; } .setting-label { font-family: var(--font-mono); font-size: 0.60rem; font-weight: 400; letter-spacing: 0.15em; text-transform: lowercase; color: var(--text-lo); user-select: none; } /* ══════════════════════════════════════════════════════════ Color Picker ══════════════════════════════════════════════════════════ */ .color-input-wrapper { display: flex; align-items: center; gap: 14px; } .color-picker { width: 52px; height: 30px; padding: 3px; border: 1px solid var(--modal-border); border-radius: 8px; background: transparent; cursor: pointer; outline: none; transition: border-color 0.18s ease; } .color-picker:hover { border-color: rgba(255, 255, 255, 0.22); } /* Remove inner chrome swatch border on WebKit */ .color-picker::-webkit-color-swatch-wrapper { padding: 0; } .color-picker::-webkit-color-swatch { border: none; border-radius: 5px; } .color-picker::-moz-color-swatch { border: none; border-radius: 5px; } .color-value { font-family: var(--font-mono); font-size: 0.72rem; letter-spacing: 0.06em; color: var(--text-hi); } /* ══════════════════════════════════════════════════════════ Speed Slider ══════════════════════════════════════════════════════════ */ .slider-wrapper { display: flex; align-items: center; gap: 10px; } .slider-label { font-family: var(--font-mono); font-size: 0.56rem; letter-spacing: 0.09em; color: var(--text-lo); user-select: none; min-width: 26px; } .slider-label:last-child { text-align: right; } .slider-current { font-family: var(--font-mono); font-size: 0.72rem; /* larger for better legibility */ letter-spacing: 0.09em; color: #fff !important; /* always white for readability */ text-shadow: 0 0 2px rgba(0,0,0,0.8); user-select: none; /* remove background so only text remains */ background: transparent; padding: 0 2px; border-radius: 2px; width: 3ch; /* fixed column width */ text-align: right; } .slider-wrapper { display: grid; /* columns: current-value fixed width, first label auto, slider flex, last label auto */ grid-template-columns: 3ch auto 1fr auto; align-items: center; gap: 10px; min-height: 28px; /* ensure consistent row height */ } /* Reset */ .slider { flex: 1; -webkit-appearance: none; appearance: none; background: transparent; border: none; outline: none; cursor: pointer; height: 18px; /* tap target height */ display: flex; align-items: center; } /* Track — WebKit */ .slider::-webkit-slider-runnable-track { height: 2px; border-radius: 1px; background: rgba(255, 255, 255, 0.15); } /* Thumb — WebKit */ .slider::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 14px; height: 14px; margin-top: -6px; border-radius: 50%; background: rgba(255, 255, 255, 0.88); cursor: pointer; transition: transform 0.15s ease, background 0.15s ease; } .slider::-webkit-slider-thumb:hover { transform: scale(1.35); background: #fff; } /* Track — Firefox */ .slider::-moz-range-track { height: 2px; border-radius: 1px; background: rgba(255, 255, 255, 0.15); } /* Thumb — Firefox */ .slider::-moz-range-thumb { width: 14px; height: 14px; border-radius: 50%; background: rgba(255, 255, 255, 0.88); border: none; cursor: pointer; } /* ══════════════════════════════════════════════════════════ Toggle Switch ══════════════════════════════════════════════════════════ */ .toggle-wrapper { display: flex; align-items: center; gap: 10px; } .toggle-label { font-family: var(--font-mono); font-size: 0.56rem; letter-spacing: 0.09em; color: var(--text-lo); user-select: none; } /* The