/* ============================================================= Base Application Styles Controls, panels, music, party effects, settings, auth, canvas ============================================================= */ /* Update Banner — floating notice popup */ #update-banner { display: none; position: fixed; top: 80px; left: 50%; transform: translateX(-50%); z-index: 9999; background: var(--bg-elevated, #1a1a2e); border: 1px solid #ff4444; border-radius: 8px; padding: 10px 16px; font-size: 13px; white-space: nowrap; box-shadow: 0 4px 16px rgba(255, 68, 68, 0.3); } #update-banner.visible { display: flex; align-items: center; gap: 12px; animation: update-fade-in 0.3s ease; } @keyframes update-fade-in { from { opacity: 0; transform: translateX(-50%) translateY(-10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } } .update-banner-status { display: flex; align-items: center; gap: 8px; } .update-banner-actions { display: flex; align-items: center; gap: 6px; } .update-banner-title { color: #ff4444; font-weight: 600; } .update-spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid rgba(255, 68, 68, 0.2); border-top-color: #ff4444; border-radius: 50%; animation: update-spin 0.8s linear infinite; flex-shrink: 0; } @keyframes update-spin { to { transform: rotate(360deg); } } .update-banner-btn { padding: 4px 12px; border: none; border-radius: 4px; font-size: 12px; cursor: pointer; transition: opacity 0.15s; } .update-banner-btn:hover { opacity: 0.85; } .update-banner-btn:disabled { opacity: 0.5; cursor: wait; } .update-banner-btn.update-btn { background: #ff4444; color: #fff; font-weight: 600; } .update-banner-btn.dismiss-btn { background: transparent; color: rgba(255, 255, 255, 0.4); padding: 4px 8px; } @media (max-width: 500px) { #update-banner { white-space: normal; max-width: 90vw; top: 60px; } } /* Update instructions modal */ #update-instructions-overlay { position: fixed; inset: 0; z-index: 10001; background: rgba(0,0,0,0.6); display: flex; align-items: center; justify-content: center; } .update-instructions-modal { background: var(--bg-elevated, #1a1a2e); border: 1px solid rgba(255,255,255,0.1); border-radius: 12px; padding: 24px 28px; max-width: 440px; width: 90vw; } .update-instructions-modal h3 { margin: 0 0 12px; color: #fff; font-size: 16px; } .update-instructions-modal p { color: rgba(255,255,255,0.6); font-size: 13px; margin: 0 0 12px; } .update-instructions-modal pre { background: rgba(0,0,0,0.4); border: 1px solid rgba(255,255,255,0.08); border-radius: 6px; padding: 12px 14px; margin: 0 0 12px; overflow-x: auto; } .update-instructions-modal code { color: #ff6464; font-size: 13px; font-family: var(--font-mono, monospace); } .update-instructions-modal .update-instructions-note { font-size: 12px; color: rgba(255,255,255,0.35); } .update-instructions-modal button { margin-top: 8px; padding: 6px 18px; background: #ff4444; color: #fff; border: none; border-radius: 4px; font-size: 13px; cursor: pointer; font-weight: 600; } .update-instructions-modal button:hover { opacity: 0.85; } /* Canvas padded mode — OS-style inset for external URLs */ #canvas-container.canvas-padded { background: var(--bg-deep, #0d0f1a) !important; } #canvas-container.canvas-padded #canvas-iframe { position: absolute !important; top: 40px !important; left: 40px !important; right: 40px !important; bottom: 40px !important; width: auto !important; height: auto !important; border-radius: var(--radius-lg) !important; box-shadow: 0 0 40px rgba(0,0,0,0.6) !important; } @media (max-width: 768px) { #canvas-container.canvas-padded #canvas-iframe { top: 8px !important; left: 4px !important; right: 4px !important; bottom: 4px !important; border-radius: var(--radius-md) !important; } } /* Control buttons — Edge Tabs (Concept A) */ .controls-left, .controls-right { position: fixed; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 4px; z-index: 100; } .controls-left { left: 0; } .controls-right { right: 0; } .edge-tab { width: 44px; height: 52px; background: rgba(0, 136, 255, 0.08); border: 1px solid rgba(0, 136, 255, 0.25); display: flex; align-items: center; justify-content: center; font-size: 20px; color: var(--blue); backdrop-filter: blur(8px); cursor: pointer; transition: all 0.3s; } .edge-tab.left { border-left: none; border-radius: 0 var(--radius-lg) var(--radius-lg) 0; } .edge-tab.right { border-right: none; border-radius: var(--radius-lg) 0 0 var(--radius-lg); } /* Hover-capable pointers only — on touch devices a tap leaves the element in a sticky :hover state that overrides state classes (e.g. .ptt-mode orange) until the user taps elsewhere. @media (hover: hover) keeps hover styling off phones/tablets entirely. */ @media (hover: hover) { .edge-tab:hover { background: rgba(0, 136, 255, 0.18); border-color: var(--blue-bright); box-shadow: 0 0 15px rgba(0, 136, 255, 0.2); width: 52px; } } /* Active states per button type */ .edge-tab.call-button.active { background: rgba(0, 255, 102, 0.18); border-color: rgba(0, 255, 102, 0.6); color: var(--green); box-shadow: 0 0 25px rgba(0, 255, 102, 0.5), 0 0 50px rgba(0, 255, 102, 0.2); } .edge-tab.call-button.connecting { background: rgba(255, 221, 0, 0.12); border-color: rgba(255, 221, 0, 0.4); color: var(--yellow); box-shadow: 0 0 20px rgba(255, 221, 0, 0.3); } .edge-tab.wake-button.active { background: rgba(0, 255, 102, 0.12); border-color: rgba(0, 255, 102, 0.4); color: var(--green); box-shadow: 0 0 20px rgba(0, 255, 102, 0.3); } .edge-tab.wake-button.listening { background: rgba(255, 221, 0, 0.12); border-color: rgba(255, 221, 0, 0.4); color: var(--yellow); box-shadow: 0 0 20px rgba(255, 221, 0, 0.3); animation: yellow-pulse-glow 1.5s ease-in-out infinite; } .edge-tab.camera-button.active { background: rgba(0, 136, 255, 0.18); border-color: var(--blue-bright); } .edge-tab.music-button.active { background: rgba(0, 136, 255, 0.18); border-color: var(--blue-bright); box-shadow: 0 0 20px rgba(0, 136, 255, 0.3); } .edge-tab.canvas-button.active { background: rgba(0, 255, 255, 0.12); border-color: var(--cyan); box-shadow: 0 0 15px rgba(0, 255, 255, 0.3); } .edge-tab.face-button.active { background: rgba(0, 255, 102, 0.12); border-color: rgba(0, 255, 102, 0.4); color: var(--green); box-shadow: 0 0 15px rgba(0, 255, 102, 0.3); } .edge-tab.mode-button.active { background: rgba(0, 136, 255, 0.18); border-color: rgba(0, 136, 255, 0.6); color: var(--blue-bright); box-shadow: 0 0 20px rgba(0, 136, 255, 0.4); } .edge-tab.ptt-button { touch-action: none; user-select: none; } .edge-tab.ptt-button.ptt-mode { background: rgba(255, 160, 0, 0.12); border-color: rgba(255, 160, 0, 0.4); color: var(--orange); } .edge-tab.ptt-button.holding { background: rgba(239, 68, 68, 0.25); border-color: rgba(239, 68, 68, 0.7); color: var(--red); box-shadow: 0 0 25px rgba(239, 68, 68, 0.5), 0 0 50px rgba(239, 68, 68, 0.2); animation: ptt-pulse 0.8s ease-in-out infinite; } @keyframes ptt-pulse { 0%,100% { box-shadow: 0 0 25px rgba(239,68,68,0.5); } 50% { box-shadow: 0 0 40px rgba(239,68,68,0.8), 0 0 60px rgba(239,68,68,0.3); } } /* Face Recognition Panel */ .face-panel { position: fixed; right: -320px; top: 50%; transform: translateY(-50%); width: 300px; max-height: 80vh; background: rgba(10, 10, 20, 0.95); backdrop-filter: blur(12px); border: 1px solid var(--blue); border-right: none; border-radius: var(--radius-lg) 0 0 var(--radius-lg); padding: 15px; z-index: 150; transition: right 0.3s ease; overflow-y: auto; } .face-panel.open { right: 0; } .fp-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; color: var(--blue-bright); font-size: 14px; font-weight: 600; } .fp-close { background: none; border: none; color: var(--text-dim); font-size: 20px; cursor: pointer; } .fp-close:hover { color: var(--text-primary); } .fp-face-list { list-style: none; padding: 0; margin: 0 0 12px 0; } .fp-face-list li { padding: 6px 10px; font-size: 13px; display: flex; justify-content: space-between; align-items: center; color: var(--blue); border-bottom: 1px solid rgba(255,255,255,0.04); } .fp-face-list .confidence { font-size: 11px; } .fp-face-list .confidence.high { color: var(--green); } .fp-face-list .confidence.medium { color: var(--yellow); } .fp-face-list .confidence.low { color: #ff6b35; } .fp-actions { margin-bottom: 10px; } .fp-btn { padding: 8px 14px; background: transparent; border: 1px solid var(--blue); border-radius: var(--radius-md); color: var(--blue); cursor: pointer; font-size: 12px; transition: all 0.2s; } .fp-btn:hover { background: rgba(0, 136, 255, 0.15); border-color: var(--blue-bright); } .fp-btn.fp-upload { border-color: var(--green); color: var(--green); } .fp-btn.fp-upload:hover { background: rgba(0, 255, 102, 0.12); } .fp-status { font-size: 12px; color: var(--cyan); margin-top: 6px; min-height: 18px; } .fp-register { border-top: 1px solid rgba(0, 136, 255, 0.15); padding-top: 10px; margin-top: 8px; } .fp-register input[type="text"] { width: 100%; padding: 8px; background: rgba(0, 0, 0, 0.4); border: 1px solid var(--blue); border-radius: var(--radius-md); color: var(--text-primary); font-size: 13px; margin-bottom: 8px; } .fp-register-btns { display: flex; gap: 8px; margin-bottom: 8px; } .fp-photos { display: flex; flex-wrap: wrap; gap: 5px; } .fp-photos .photo-item { position: relative; width: 50px; height: 50px; } .fp-photos .photo-item img { width: 100%; height: 100%; object-fit: cover; border-radius: var(--radius-sm); border: 1px solid var(--blue); } .fp-photos .photo-item .delete-photo { position: absolute; top: -5px; right: -5px; width: 18px; height: 18px; background: var(--red); border: none; border-radius: var(--radius-full); color: var(--text-primary); font-size: 10px; cursor: pointer; display: none; align-items: center; justify-content: center; } .fp-photos .photo-item:hover .delete-photo { display: flex; } /* Mode Picker Popup */ .mode-picker { position: fixed; left: 52px; top: 50%; transform: translateY(-50%); width: 230px; background: rgba(10, 8, 20, 0.97); backdrop-filter: blur(14px); border: 1px solid rgba(0, 136, 255, 0.35); border-radius: var(--radius-lg); padding: 8px 6px; z-index: 200; display: none; flex-direction: column; gap: 2px; box-shadow: 0 8px 32px rgba(0,0,0,0.6), 0 0 0 1px rgba(0, 136, 255, 0.1); } .mode-picker.open { display: flex; } .mode-picker-label { font-size: 10px; font-weight: 700; letter-spacing: 0.1em; color: rgba(0, 136, 255, 0.6); padding: 4px 10px 6px; text-transform: uppercase; } .mode-option { display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 10px; background: transparent; border: none; border-radius: var(--radius-md); cursor: pointer; transition: background 0.15s; text-align: left; } .mode-option:hover { background: rgba(0, 136, 255, 0.1); } .mode-option.active { background: rgba(0, 136, 255, 0.12); } .mode-opt-icon { font-size: 18px; flex-shrink: 0; width: 24px; text-align: center; } .mode-opt-info { display: flex; flex-direction: column; flex: 1; gap: 1px; } .mode-opt-name { font-size: 13px; font-weight: 600; color: var(--text-primary); } .mode-opt-desc { font-size: 11px; color: var(--text-dim); } .mode-opt-check { font-size: 12px; color: var(--blue-bright); width: 14px; text-align: center; flex-shrink: 0; } /* Agent-to-Agent Panel — slides out from left edge */ .a2a-panel { position: fixed; left: -340px; top: 50%; transform: translateY(-50%); width: 320px; max-height: 85vh; background: rgba(10, 8, 20, 0.96); backdrop-filter: blur(12px); border: 1px solid rgba(0, 136, 255, 0.4); border-left: none; border-radius: 0 var(--radius-lg) var(--radius-lg) 0; padding: 16px; z-index: 150; transition: left 0.3s ease; overflow-y: auto; display: flex; flex-direction: column; gap: 12px; } .a2a-panel.open { left: 0; } .a2a-header { display: flex; justify-content: space-between; align-items: center; color: var(--blue-bright); font-size: 14px; font-weight: 600; } .a2a-close { background: none; border: none; color: var(--text-dim); font-size: 20px; cursor: pointer; } .a2a-close:hover { color: var(--text-primary); } .a2a-config { display: flex; flex-direction: column; gap: 6px; } .a2a-label { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; } .a2a-config select { background: rgba(0, 136, 255, 0.08); border: 1px solid rgba(0, 136, 255, 0.3); color: var(--blue-bright); padding: 7px 10px; border-radius: var(--radius-md); font-size: 13px; width: 100%; } .a2a-status-row { display: flex; justify-content: space-between; align-items: center; padding: 8px 10px; background: rgba(0, 136, 255, 0.06); border: 1px solid rgba(0, 136, 255, 0.15); border-radius: var(--radius-md); } .a2a-turn-indicator { display: flex; align-items: center; gap: 7px; font-size: 13px; color: var(--text-muted); } .a2a-dot { width: 8px; height: 8px; border-radius: var(--radius-full); background: var(--neutral-700); transition: background 0.3s, box-shadow 0.3s; } .a2a-dot.active { background: var(--blue-bright); box-shadow: 0 0 8px rgba(0, 136, 255, 0.8); } .a2a-dot.speaking { background: var(--green); box-shadow: 0 0 8px rgba(74, 222, 128, 0.8); animation: a2a-speaking-pulse 0.6s ease-in-out infinite; } .a2a-dot.waiting { background: var(--yellow); box-shadow: 0 0 8px rgba(250, 204, 21, 0.6); } @keyframes a2a-speaking-pulse { 0%,100% { transform: scale(1); } 50% { transform: scale(1.4); } } .a2a-room-id { font-size: 10px; color: var(--text-disabled); font-family: monospace; } .a2a-controls { display: flex; gap: 8px; } .a2a-btn { flex: 1; padding: 9px 12px; border-radius: var(--radius-md); border: 1px solid rgba(0, 136, 255, 0.4); background: rgba(0, 136, 255, 0.1); color: var(--blue-bright); font-size: 13px; cursor: pointer; transition: all 0.2s; } .a2a-btn:hover { background: rgba(0, 136, 255, 0.2); border-color: var(--blue-bright); } .a2a-btn.a2a-stop { border-color: rgba(239, 68, 68, 0.4); background: rgba(239, 68, 68, 0.1); color: var(--red); } .a2a-btn.a2a-stop:hover { background: rgba(239, 68, 68, 0.2); } .a2a-transcript { flex: 1; min-height: 120px; max-height: 300px; overflow-y: auto; padding: 8px; background: rgba(0, 0, 0, 0.3); border: 1px solid rgba(0, 136, 255, 0.1); border-radius: var(--radius-md); font-size: 12px; line-height: 1.5; } .a2a-transcript-empty { color: var(--neutral-700); font-style: italic; text-align: center; padding: 20px 0; } .a2a-msg { margin-bottom: 8px; padding-bottom: 8px; border-bottom: 1px solid rgba(255,255,255,0.04); } .a2a-msg:last-child { border-bottom: none; margin-bottom: 0; } .a2a-msg-who { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 2px; } .a2a-msg-who.assistant { color: var(--blue-bright); } .a2a-msg-who.pgai { color: var(--blue-bright); } .a2a-msg-who.human { color: var(--green); } .a2a-msg-text { color: var(--text-secondary); } /* ===== Listen Mode Panel — slides out from right edge ===== */ .listen-panel { position: fixed; right: -360px; top: 0; bottom: 0; width: 340px; background: rgba(12, 18, 24, 0.97); border-left: 1px solid rgba(20, 184, 166, 0.3); z-index: 200; display: flex; flex-direction: column; padding: 16px; gap: 12px; transition: right 0.3s ease; backdrop-filter: blur(12px); } .listen-panel.open { right: 44px; } /* leave room for right edge controls */ .listen-header { display: flex; justify-content: space-between; align-items: center; font-size: 13px; font-weight: 600; color: var(--cyan); text-transform: uppercase; letter-spacing: 0.08em; } .listen-close { background: none; border: none; color: var(--text-disabled); font-size: 18px; cursor: pointer; padding: 0 4px; line-height: 1; transition: color 0.2s; } .listen-close:hover { color: var(--text-secondary); } .listen-meta { display: flex; justify-content: space-between; align-items: center; font-size: 11px; color: var(--text-disabled); } #listen-word-count { font-family: monospace; } .listen-clear-btn { background: none; border: 1px solid rgba(255,255,255,0.08); color: var(--text-disabled); font-size: 11px; cursor: pointer; padding: 2px 8px; border-radius: var(--radius-sm); transition: all 0.2s; } .listen-clear-btn:hover { border-color: rgba(239,68,68,0.4); color: var(--red); } .listen-transcript { flex: 1; overflow-y: auto; font-size: 13px; color: var(--text-secondary); line-height: 1.6; scrollbar-width: thin; } .listen-empty { color: var(--neutral-700); font-style: italic; text-align: center; padding: 20px 0; } .listen-sentence { margin-bottom: 4px; padding-bottom: 4px; animation: listen-fade-in 0.2s ease; } @keyframes listen-fade-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } } .listen-interim { display: none; } /* interim now renders inline in the transcript */ .listen-title-input { background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.1); border-radius: var(--radius-md); color: var(--text-secondary); font-size: 13px; padding: 7px 10px; outline: none; width: 100%; box-sizing: border-box; transition: border-color 0.2s; } .listen-title-input:focus { border-color: rgba(20,184,166,0.5); } .listen-title-input::placeholder { color: var(--neutral-700); } .listen-actions { display: flex; gap: 6px; } .listen-action-btn { flex: 1; padding: 11px 12px; background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.1); border-radius: var(--radius-md); color: var(--text-muted); font-size: 12px; font-weight: 500; cursor: pointer; transition: all 0.2s; white-space: nowrap; } .listen-action-btn:hover:not(:disabled) { background: rgba(255,255,255,0.08); border-color: rgba(255,255,255,0.2); color: var(--text-secondary); } .listen-action-btn:disabled { opacity: 0.35; cursor: not-allowed; } .listen-save-btn:hover:not(:disabled) { background: rgba(20,184,166,0.12); border-color: rgba(20,184,166,0.35); color: var(--cyan); } .listen-send-btn:hover:not(:disabled) { background: rgba(59,130,246,0.12); border-color: rgba(59,130,246,0.35); color: var(--blue-bright); } .listen-talk-btn { background: rgba(20, 184, 166, 0.12); border-color: rgba(20, 184, 166, 0.35); color: var(--cyan); } .listen-talk-btn:hover:not(:disabled) { background: rgba(20, 184, 166, 0.22); border-color: var(--cyan); } .listen-talk-btn.saving { color: var(--yellow); border-color: rgba(250,204,21,0.4); } .listen-send-btn.sending { color: var(--yellow); border-color: rgba(250,204,21,0.4); } .listen-save-status { font-size: 11px; color: var(--text-disabled); text-align: center; min-height: 16px; } .listen-save-status.ok { color: var(--green); } .listen-save-status.err { color: var(--red); } /* ── Theme presets (data-theme-preset on body) ── */ /* Each preset overrides the default blue accent with a profile colour. */ body[data-theme-preset="green"] { --theme-accent: 0,255,102; --theme-accent-hex: #00ff66; } body[data-theme-preset="deep-ocean"] { --theme-accent: 0,68,204; --theme-accent-hex: #0044cc; } body[data-theme-preset="red"] { --theme-accent: 255,60,60; --theme-accent-hex: #ff3c3c; } body[data-theme-preset="orange"] { --theme-accent: 255,140,0; --theme-accent-hex: #ff8c00; } body[data-theme-preset="blue"] { --theme-accent: 0,136,255; --theme-accent-hex: #0088ff; } /* Apply preset to edge tabs and listen panel accent colour */ body[data-theme-preset] .edge-tab { background: rgba(var(--theme-accent),0.08); border-color: rgba(var(--theme-accent),0.25); color: var(--theme-accent-hex); } /* (hover: hover) — this rule's specificity (0,3,1) beats state classes like .ptt-button.ptt-mode (0,3,0), so a sticky touch-hover here masked the PTT orange state on mobile until the next tap elsewhere. */ @media (hover: hover) { body[data-theme-preset] .edge-tab:hover { background: rgba(var(--theme-accent),0.14); border-color: rgba(var(--theme-accent),0.5); } } body[data-theme-preset] .listen-panel { border-color: rgba(var(--theme-accent),0.35); } /* ── Profile mode badge ── */ /* Shown bottom-right when profile.ui.show_mode_badge = true */ .profile-mode-badge { position: fixed; bottom: 12px; right: 12px; z-index: 50; font-size: 10px; font-weight: 600; letter-spacing: 0.08em; text-transform: uppercase; color: rgba(255,255,255,0.5); background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.12); border-radius: var(--radius-sm); padding: 3px 8px; pointer-events: none; } /* PTT mode indicator on status bar (optional future use) */ .ptt-mode-active-badge { display: none; font-size: 11px; color: var(--orange); background: rgba(255,160,0,0.1); border: 1px solid rgba(255,160,0,0.3); border-radius: var(--radius-sm); padding: 2px 6px; } .ptt-mode-active-badge.visible { display: inline-block; } /* Action Console button - bottom left floating */ .console-button { position: fixed; bottom: 10px; left: 10px; width: 40px; height: 40px; border-radius: var(--radius-full); border: 1px solid var(--green); background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 20px; transition: all 0.3s; z-index: 200; font-family: monospace; color: var(--green); } .console-button:hover { border-color: #00ff88; box-shadow: 0 0 15px rgba(0, 255, 102, 0.3); transform: scale(1.05); } .console-button.active { border-color: var(--cyan); box-shadow: 0 0 15px rgba(0, 255, 255, 0.3); } .console-button .unread-dot { position: absolute; top: 8px; right: 8px; width: 10px; height: 10px; background: var(--green); border-radius: var(--radius-full); display: none; } /* Action Console panel */ #action-console { position: fixed; bottom: 60px; left: 10px; width: 400px; max-height: 50vh; z-index: 200; background: rgba(0, 0, 0, 0.95); backdrop-filter: blur(10px); border: 1px solid rgba(0, 255, 102, 0.3); border-radius: var(--radius-lg); display: none; flex-direction: column; overflow: hidden; } #action-console .ac-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid rgba(0, 255, 102, 0.15); font-size: 13px; color: var(--green); letter-spacing: 1px; text-transform: uppercase; font-family: monospace; } #action-console .ac-close { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 18px; padding: 0 4px; } #action-console .ac-close:hover { color: var(--text-primary); } #action-console .ac-clear { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 11px; padding: 2px 8px; text-transform: uppercase; letter-spacing: 0.5px; } #action-console .ac-clear:hover { color: var(--green); } #action-console .ac-entries { flex: 1; overflow-y: auto; padding: 8px; display: flex; flex-direction: column; gap: 2px; font-family: monospace; font-size: 12px; } #action-console .ac-entry { padding: 4px 8px; border-radius: var(--radius-sm); color: var(--text-muted); border-left: 3px solid transparent; line-height: 1.4; } #action-console .ac-entry.tool { border-left-color: var(--orange); color: var(--text-secondary); } #action-console .ac-entry.lifecycle { border-left-color: var(--blue-bright); color: var(--text-muted); } #action-console .ac-entry.system { border-left-color: var(--green); color: var(--green); } #action-console .ac-entry.error { border-left-color: var(--red); color: var(--red); } #action-console .ac-entry.chat { border-left-color: var(--cyan); color: var(--text-muted); } #action-console .ac-ts { color: var(--text-disabled); margin-right: 6px; } #action-console .ac-icon { margin-right: 4px; } #action-console .ac-detail { color: var(--text-muted); font-size: 11px; margin-left: 24px; display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: calc(100% - 30px); font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', monospace; } /* Action console edge tabs — right side of panel */ .ac-side-tabs { position: absolute; right: -37px; top: 50%; transform: translateY(-50%); display: flex; flex-direction: column; gap: 4px; } .ac-tab { width: 36px; height: 42px; background: rgba(0, 136, 255, 0.08); border: 1px solid rgba(0, 136, 255, 0.25); border-right: none; border-radius: 0 var(--radius-md) var(--radius-md) 0; display: flex; align-items: center; justify-content: center; font-size: 15px; color: var(--blue); backdrop-filter: blur(8px); cursor: pointer; transition: all 0.3s; } .ac-tab:hover { background: rgba(0, 136, 255, 0.18); border-color: var(--blue-bright); box-shadow: 0 0 12px rgba(0, 136, 255, 0.2); width: 42px; } .ac-tab.danger:hover { background: rgba(255, 80, 80, 0.18); border-color: rgba(255, 80, 80, 0.5); color: var(--red); box-shadow: 0 0 12px rgba(255, 80, 80, 0.2); } .ac-tab .ac-tab-tooltip { display: none; position: absolute; right: 44px; white-space: nowrap; background: rgba(0, 0, 0, 0.9); border: 1px solid rgba(0, 255, 102, 0.3); padding: 4px 10px; border-radius: var(--radius-md); font-size: 11px; color: var(--text-secondary); font-family: monospace; pointer-events: none; } .ac-tab:hover .ac-tab-tooltip { display: block; } @media (max-width: 500px) { #action-console { width: calc(100vw - 20px); left: 10px; } } @media (max-width: 768px) { .console-button { width: 36px; height: 36px; font-size: 16px; bottom: 8px; left: 8px; } } /* Transcript button - bottom right floating */ .transcript-button { position: fixed; bottom: 10px; right: 10px; width: 40px; height: 40px; border-radius: var(--radius-full); border: 1px solid var(--blue); background: transparent; cursor: pointer; display: flex; align-items: center; justify-content: center; font-size: 24px; transition: all 0.3s; z-index: 9999; } .transcript-button:hover { border-color: var(--blue-bright); box-shadow: 0 0 15px rgba(0, 136, 255, 0.3); transform: scale(1.05); } .transcript-button.active { border-color: var(--cyan); box-shadow: 0 0 15px rgba(0, 255, 255, 0.3); } .transcript-button .unread-dot { position: absolute; top: 8px; right: 8px; width: 10px; height: 10px; background: var(--cyan); border-radius: var(--radius-full); display: none; } /* Transcript panel */ #transcript-panel { position: fixed; bottom: 60px; right: 10px; width: 380px; /* grows with the conversation up to the top of the screen (60px offset + 10px margin) */ max-height: calc(100vh - 70px); max-height: calc(100dvh - 70px); z-index: 9999; background: rgba(0, 0, 0, 0.95); backdrop-filter: blur(10px); border: 1px solid rgba(0, 136, 255, 0.3); border-radius: var(--radius-lg); display: none; flex-direction: column; overflow: hidden; } #transcript-panel .tp-header { display: flex; justify-content: space-between; align-items: center; padding: 10px 14px; border-bottom: 1px solid rgba(0, 136, 255, 0.15); font-size: 13px; color: var(--cyan); letter-spacing: 1px; text-transform: uppercase; } #transcript-panel .tp-header-controls { display: flex; align-items: center; gap: 8px; } #transcript-panel .tp-mode-toggle { display: flex; align-items: center; gap: 5px; padding: 3px 10px; border-radius: 12px; border: 1px solid rgba(34, 197, 94, 0.4); background: rgba(34, 197, 94, 0.1); color: #22c55e; cursor: pointer; font-size: 11px; font-weight: 600; letter-spacing: 0.5px; text-transform: uppercase; transition: all 0.2s ease; min-width: 80px; justify-content: center; } #transcript-panel .tp-mode-toggle:hover { background: rgba(34, 197, 94, 0.2); } #transcript-panel .tp-mode-toggle.text-mode { border-color: rgba(59, 130, 246, 0.4); background: rgba(59, 130, 246, 0.1); color: #3b82f6; } #transcript-panel .tp-mode-toggle.text-mode:hover { background: rgba(59, 130, 246, 0.2); } #transcript-panel .tp-mode-icon { font-size: 12px; } #transcript-panel .tp-close { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 18px; padding: 0 4px; } #transcript-panel .tp-close:hover { color: var(--text-primary); } #transcript-panel form.tp-input-bar { margin: 0; } /* Size + move (2026-11-01). Grip = fat, centred on the top border, thumb-sized touch zone. */ #transcript-panel .tp-grip { flex: 0 0 auto; height: 18px; display: flex; align-items: center; justify-content: center; cursor: ns-resize; touch-action: none; /* the drag must not scroll the page */ } #transcript-panel .tp-grip-bar { width: 56px; height: 6px; border-radius: var(--radius-full); background: rgba(0, 136, 255, 0.45); transition: background 0.2s, width 0.2s; } #transcript-panel .tp-grip:hover .tp-grip-bar, #transcript-panel.tp-resizing .tp-grip-bar { background: var(--cyan); width: 72px; } #transcript-panel.tp-resizing { transition: none !important; user-select: none; } #transcript-panel .tp-dock { display: none; background: none; border: none; color: var(--text-secondary); font-size: 16px; cursor: pointer; padding: 0 4px; } #transcript-panel .tp-dock:hover { color: var(--text-primary); } #transcript-panel.tp-detached .tp-dock { display: inline-block; } #transcript-panel.tp-detached { resize: both; min-width: 260px; min-height: 140px; } @media (pointer: fine) and (min-width: 769px) { #transcript-panel .tp-header { cursor: move; touch-action: none; } } @media (pointer: coarse) { #transcript-panel .tp-grip { height: 28px; } /* thumb target with the header below it */ #transcript-panel .tp-grip-bar { width: 64px; height: 7px; } } #transcript-panel .tp-messages { flex: 1; overflow-y: auto; padding: 10px; display: flex; flex-direction: column; gap: 8px; } #transcript-panel .tp-msg { max-width: 85%; padding: 8px 12px; border-radius: var(--radius-md); font-size: 13px; line-height: 1.4; word-wrap: break-word; overflow-wrap: break-word; } #transcript-panel .tp-msg.user { align-self: flex-end; background: rgba(0, 136, 255, 0.15); border: 1px solid rgba(0, 136, 255, 0.2); } #transcript-panel .tp-msg.assistant { align-self: flex-start; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.08); } #transcript-panel .tp-meta { font-size: 10px; color: var(--text-dim); margin-bottom: 3px; } #transcript-panel .tp-text { color: var(--text-secondary); } #transcript-panel .tp-text strong { color: var(--text-primary); } #transcript-panel .tp-text code { background: rgba(0, 255, 255, 0.1); padding: 1px 4px; border-radius: var(--radius-sm); font-size: 12px; } #transcript-panel .tp-img-icon { width: 28px; height: 28px; border-radius: var(--radius-sm); object-fit: cover; vertical-align: middle; margin-right: 6px; border: 1px solid rgba(255, 255, 255, 0.15); cursor: pointer; } #transcript-panel .tp-img-icon:hover { border-color: rgba(0, 229, 255, 0.5); box-shadow: 0 0 6px rgba(0, 229, 255, 0.3); } #transcript-panel .tp-dragover { outline: 2px dashed rgba(0, 229, 255, 0.5); outline-offset: -4px; } @media (max-width: 500px) { #transcript-panel { width: calc(100vw - 40px); right: 20px; } .controls-left, .controls-right { gap: 2px; } .edge-tab { width: 44px; min-width: 44px; height: 48px; min-height: 48px; font-size: 16px; } @media (hover: hover) { .edge-tab:hover { width: 48px; } } #canvas-menu-button { width: 36px; height: 36px; font-size: 14px; } .transcript-button { width: 36px; height: 36px; font-size: 16px; } } @media (max-width: 768px) { /* face-box uses smooth vw scaling — no override needed */ /* Tighter edge tabs */ .controls-left, .controls-right { gap: 3px; } .edge-tab { width: 38px; height: 46px; font-size: 16px; } .edge-tab:hover { width: 44px; } /* Corner buttons - slightly bigger than sides but smaller than desktop */ #canvas-menu-button { width: 36px; height: 36px; font-size: 16px; top: 8px; left: 8px; } #auth-section { top: 8px; right: 8px; } .transcript-button { width: 36px; height: 36px; font-size: 20px; bottom: 8px; right: 8px; } } /* Transcript thinking indicator */ #transcript-panel .tp-msg.tp-thinking { background: rgba(0, 170, 255, 0.08); border: 1px solid rgba(0, 170, 255, 0.15); } /* Transcript thinking dots */ .tp-dots { display: flex; gap: 6px; padding: 8px 0; } .tp-dots span { width: 8px; height: 8px; background: rgba(0, 170, 255, 0.8); border-radius: var(--radius-full); animation: tp-bounce 1.4s ease-in-out infinite; } .tp-dots span:nth-child(2) { animation-delay: 0.2s; } .tp-dots span:nth-child(3) { animation-delay: 0.4s; } @keyframes tp-bounce { 0%, 80%, 100% { transform: translateY(0); opacity: 0.4; } 40% { transform: translateY(-8px); opacity: 1; } } /* Camera preview in edge tab */ .camera-button { position: relative; overflow: hidden; } .camera-button video { position: absolute; width: 100%; height: 100%; object-fit: cover; border-radius: 0 var(--radius-lg) var(--radius-lg) 0; opacity: 0; transition: opacity 0.3s; } .camera-button.active video { opacity: 1; } .camera-button.active .camera-icon { display: none; } /* Transcript input bar */ .tp-input-bar { display: flex; align-items: center; gap: 6px; padding: 8px 10px; border-top: 1px solid rgba(0, 136, 255, 0.15); background: rgba(0, 0, 0, 0.3); } .tp-text-input { flex: 1; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(0, 136, 255, 0.2); border-radius: var(--radius-md); color: var(--text-secondary); padding: 8px 10px; font-size: 13px; font-family: inherit; outline: none; min-width: 0; } .tp-text-input:focus { border-color: rgba(0, 229, 255, 0.5); } .tp-text-input::placeholder { color: rgba(255, 255, 255, 0.25); } .tp-send-btn { background: none; border: none; color: var(--cyan); cursor: pointer; font-size: 18px; padding: 4px; opacity: 0.7; transition: opacity 0.2s; } .tp-send-btn:hover { opacity: 1; } .tp-upload-btn { cursor: pointer; font-size: 16px; padding: 4px; opacity: 0.5; transition: opacity 0.2s; line-height: 1; } .tp-upload-btn:hover { opacity: 1; } .tp-file-preview { display: flex; align-items: center; gap: 4px; background: rgba(0, 136, 255, 0.12); border: 1px solid rgba(0, 136, 255, 0.25); border-radius: var(--radius-md); padding: 3px 8px; font-size: 11px; color: var(--cyan); max-width: 140px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .tp-file-clear { background: none; border: none; color: var(--text-dim); cursor: pointer; font-size: 12px; padding: 0 2px; flex-shrink: 0; } .tp-file-clear:hover { color: var(--text-primary); } /* Error message */ .error-message { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); background: rgba(255, 0, 0, 0.2); border: 1px solid var(--red); color: var(--red); padding: 10px 20px; border-radius: var(--radius-md); display: none; z-index: 1000; } .error-message.visible { display: block; } /* Face notification */ .face-notification { position: fixed; top: 15%; left: 50%; transform: translateX(-50%); background: var(--panel-bg); border: 1px solid var(--green); color: var(--green); padding: 10px 20px; border-radius: var(--radius-md); opacity: 0; transition: opacity 0.3s; z-index: 1000; } .face-notification.visible { opacity: 1; } /* Agent Activity Chip — live agent state indicator (top-center, below settings) */ .agent-activity-chip { position: fixed; top: 34px; left: 50%; transform: translateX(-50%) translateY(-4px) scale(0.96); background: rgba(50, 55, 65, 0.95); border: 1px solid rgba(180, 190, 210, 0.3); color: var(--text-primary); padding: 5px 14px 5px 10px; border-radius: 0 0 var(--radius-lg) var(--radius-lg); display: none; align-items: center; gap: 7px; font-size: 11px; font-family: var(--font-mono, monospace); box-shadow: 0 2px 12px rgba(0, 0, 0, 0.6), inset 0 1px 0 rgba(255,255,255,0.07); overflow: hidden; opacity: 0; transition: opacity 0.2s ease, transform 0.2s ease; pointer-events: none; z-index: 1400; max-width: 340px; } .agent-activity-chip.visible { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); } .agent-activity-chip .chip-icon { font-family: var(--font-mono, monospace); font-size: 9px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--blue-bright); background: rgba(59, 130, 246, 0.18); border: 1px solid rgba(59, 130, 246, 0.3); padding: 1px 5px; border-radius: var(--radius-sm); flex-shrink: 0; min-width: 24px; text-align: center; } .agent-activity-chip .chip-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-muted); font-size: 10px; } @keyframes chip-update { 0% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); } 35% { opacity: 0.2; transform: translateX(-50%) translateY(-2px) scale(0.95); } 100% { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); } } .agent-activity-chip.updating { animation: chip-update 0.22s ease; } /* ===== MUSIC PANEL — Slide-up card (Concept T) ===== */ .music-panel { position: fixed; bottom: 0; left: 50%; max-width: 520px; width: calc(100% - 128px); background: rgba(5, 10, 20, 0.97); border: 1px solid rgba(0, 229, 255, 0.25); border-bottom: none; border-radius: var(--radius-lg) var(--radius-lg) 0 0; transform: translateX(-50%) translateY(100%); transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1); z-index: 200; overflow: hidden; box-shadow: 0 -4px 25px rgba(0, 229, 255, 0.25), 0 0 40px rgba(0, 229, 255, 0.12), inset 0 1px 0 rgba(0, 229, 255, 0.1); } .music-panel.open { transform: translateX(-50%) translateY(0); } /* --- Full view --- */ .mp-full { position: relative; padding: 10px 16px 8px; display: flex; flex-direction: column; gap: 5px; } .mp-waveform-bg { position: absolute; bottom: 0; left: 0; right: 0; height: 40px; display: flex; align-items: flex-end; gap: 2px; padding: 0 10px; opacity: 0; pointer-events: none; transition: opacity 0.4s; } .music-panel.playing .mp-waveform-bg { opacity: 0.12; } .mp-waveform-bg .bar { flex: 1; background: var(--cyan); border-radius: 1px 1px 0 0; min-width: 2px; transform-origin: bottom; animation: mp-eq-bounce var(--d, 0.8s) ease-in-out infinite alternate; animation-play-state: paused; } .music-panel.playing .mp-waveform-bg .bar { animation-play-state: running; } @keyframes mp-eq-bounce { 0% { transform: scaleY(0.3); opacity: 0.4; } 100% { transform: scaleY(1); opacity: 1; } } .mp-collapse { position: absolute; top: -12px; right: -12px; width: 24px; height: 24px; background: rgba(5, 10, 20, 0.95); border: 1px solid rgba(0, 229, 255, 0.3); border-radius: var(--radius-full); color: var(--blue-dim); font-size: 0.7rem; cursor: pointer; padding: 0; z-index: 3; display: flex; align-items: center; justify-content: center; transition: all 0.2s; box-shadow: 0 0 8px rgba(0, 229, 255, 0.15); line-height: 1; } .mp-collapse:hover { color: var(--cyan); border-color: var(--cyan); box-shadow: 0 0 12px rgba(0, 229, 255, 0.3); } .mp-info-row { display: flex; align-items: center; gap: 10px; position: relative; z-index: 1; } .mp-track-info { display: flex; flex-direction: column; min-width: 0; flex: 1; } .mp-track-info .track-label { font-size: 0.6rem; color: var(--blue-dim); text-transform: uppercase; letter-spacing: 0.5px; line-height: 1.1; } .mp-track-info .track-name { color: var(--cyan); font-size: 0.8rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; line-height: 1.3; } .mp-timeline-row { display: flex; align-items: center; gap: 6px; position: relative; z-index: 1; } .mp-time { font-size: 0.6rem; color: var(--blue-dim); min-width: 28px; text-align: center; font-variant-numeric: tabular-nums; } .mp-timeline-wrap { flex: 1; position: relative; height: 4px; } .mp-timeline { width: 100%; height: 4px; -webkit-appearance: none; appearance: none; background: rgba(0, 229, 255, 0.15); border-radius: 2px; cursor: pointer; position: relative; z-index: 2; margin: 0; } .mp-timeline::-webkit-slider-thumb { -webkit-appearance: none; width: 10px; height: 10px; border-radius: var(--radius-full); background: var(--cyan); cursor: pointer; box-shadow: 0 0 6px rgba(0, 229, 255, 0.5); } .mp-timeline-fill { position: absolute; top: 0; left: 0; height: 4px; background: var(--cyan); border-radius: 2px; pointer-events: none; z-index: 1; } .mp-controls-row { display: flex; align-items: center; justify-content: center; gap: 8px; position: relative; z-index: 1; } .mp-controls-row button, .mp-mini button { background: none; border: 1px solid var(--blue-dim); color: var(--blue); width: 28px; height: 28px; min-width: 28px; min-height: 28px; border-radius: var(--radius-full); cursor: pointer; font-size: 0.8rem; transition: all 0.2s; padding: 0; line-height: 1; flex-shrink: 0; } .mp-controls-row button:hover, .mp-mini button:hover { border-color: var(--cyan); color: var(--cyan); } .mp-controls-row .mp-play, .mp-mini .mp-play { width: 34px; height: 34px; min-width: 34px; min-height: 34px; font-size: 1rem; border-color: var(--cyan); color: var(--cyan); box-shadow: 0 0 8px rgba(0, 229, 255, 0.3); } .mp-vol { width: 50px; height: 4px; -webkit-appearance: none; background: var(--blue-dim); border-radius: 2px; cursor: pointer; } .mp-vol::-webkit-slider-thumb { -webkit-appearance: none; width: 12px; height: 12px; border-radius: var(--radius-full); background: var(--cyan); cursor: pointer; } .mp-toggle { display: flex; align-items: center; gap: 4px; } .mp-toggle label { color: var(--text-dim); font-size: 0.65rem; cursor: pointer; } .mp-toggle input[type="checkbox"] { width: 14px; height: 14px; cursor: pointer; accent-color: var(--cyan); } /* --- Mini view: no container, just floating buttons --- */ .music-panel.state-mini { background: none; border-color: transparent; box-shadow: none; } .mp-mini { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 6px 16px; } .mp-mini .mp-mini-vol { width: 55px; } .mp-expand { background: none !important; border: 1px solid rgba(0, 229, 255, 0.3) !important; color: var(--blue-dim) !important; font-size: 0.7rem; cursor: pointer; padding: 0; width: 24px !important; min-width: 24px !important; height: 24px !important; min-height: 24px !important; border-radius: var(--radius-full) !important; display: flex; align-items: center; justify-content: center; transition: all 0.2s; } .mp-expand:hover { color: var(--cyan) !important; border-color: var(--cyan) !important; box-shadow: 0 0 8px rgba(0, 229, 255, 0.3); } /* --- Music panel responsive --- */ @media (max-width: 600px) { .music-panel { width: calc(100% - 100px); } .mp-full { padding: 8px 12px 6px; } .mp-track-info .track-name { font-size: 0.75rem; } } @media (max-width: 500px) { .music-panel { width: calc(100% - 92px); } .mp-mini .mp-mini-vol { display: none; } .mp-vol { width: 40px; } .mp-controls-row .mp-toggle { display: none; } } @media (max-width: 400px) { .music-panel { width: calc(100% - 88px); } .mp-full { padding: 6px 8px 4px; gap: 3px; } .mp-mini { padding: 4px 10px; gap: 6px; } } /* Playlist selector in music panel */ .mp-full select { background: rgba(5, 10, 20, 0.9); border: 1px solid var(--blue-dim); color: var(--cyan); padding: 3px 6px; border-radius: var(--radius-md); font-size: 0.7rem; cursor: pointer; outline: none; transition: all 0.2s; flex-shrink: 0; } .mp-full select:hover, .mp-full select:focus { border-color: var(--cyan); box-shadow: 0 0 8px rgba(0, 255, 255, 0.3); } .mp-full select option { background: #0a0a14; color: var(--cyan); } /* ===== PARTY EFFECTS ===== */ .party-effects-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; opacity: 0; transition: opacity 0.5s ease; } .party-effects-container.active { opacity: 1; } /* Center glow */ .center-glow { position: absolute; top: 50%; left: 50%; width: 400px; height: 400px; transform: translate(-50%, -50%); background: radial-gradient(circle, rgba(0, 200, 255, 0.3) 0%, transparent 70%); border-radius: var(--radius-full); opacity: 0.5; transition: all 0.1s ease; } /* ===== PARTY EFFECTS - EXACT FROM ai-eyes ===== */ .party-effects-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 0; overflow: hidden; opacity: 0; transition: opacity 0.3s ease; } .party-effects-container.active { opacity: 1; } /* Center Glow - pulses behind face with audio. Softness is baked into the gradient stops (was filter: blur(60px) — a huge GPU blur re-run every frame while JS also rebuilt the gradient). JS now animates only transform/opacity/hue-rotate over this fixed hue-180 gradient. */ .center-glow { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 600px; height: 600px; border-radius: var(--radius-full); background: radial-gradient(circle, hsla(180, 90%, 50%, 0.40) 0%, hsla(165, 90%, 40%, 0.18) 35%, hsla(150, 90%, 30%, 0.08) 55%, transparent 78%); pointer-events: none; z-index: 0; will-change: transform, opacity, filter; } /* Beat Flash - screen flash on bass hits */ .beat-flash { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: radial-gradient(circle, rgba(0, 255, 255, 0.3), transparent 70%); pointer-events: none; opacity: 0; z-index: 1; } /* Screen shake on bass */ .shake { animation: screenShake 0.1s ease-out; } @keyframes screenShake { 0%, 100% { transform: translate(0, 0); } 25% { transform: translate(calc(var(--shake-amount, 5px) * -1), var(--shake-amount, 5px)); } 50% { transform: translate(var(--shake-amount, 5px), calc(var(--shake-amount, 5px) * -1)); } 75% { transform: translate(calc(var(--shake-amount, 5px) * -1), calc(var(--shake-amount, 5px) * -1)); } } /* Ripple container */ .ripple-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .sound-ripple { position: absolute; border: 2px solid var(--cyan); border-radius: 50%; opacity: 0; animation: ripple-expand 1s ease-out forwards; } @keyframes ripple-expand { 0% { width: 0; height: 0; opacity: 0.6; } 100% { width: 300px; height: 300px; opacity: 0; } } /* Explosion container */ .explosion-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .explosion-particle { position: absolute; width: 8px; height: 8px; background: var(--orange); border-radius: 50%; pointer-events: none; } /* Fireworks container */ .fireworks-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .firework-particle { position: absolute; width: 6px; height: 6px; border-radius: 50%; pointer-events: none; } /* Particles - orbit around center */ .party-particle-container { position: absolute; width: 100%; height: 100%; pointer-events: none; } .party-particle { position: absolute; width: 6px; height: 6px; background: var(--cyan); border-radius: 50%; opacity: 0; will-change: transform; } /* Disco Dots - orbit and react */ .disco-container { position: absolute; width: 100%; height: 100%; pointer-events: none; } .disco-dot { position: absolute; width: 15px; height: 15px; background: white; border-radius: 50%; filter: blur(3px); opacity: 0; /* moved via transform now (left/top never change after init); audio-reactive opacity lives on .disco-container */ will-change: transform; } /* Waveform oscilloscope - FULL SCREEN background effect */ .oscilloscope-container { position: fixed; top: 0; left: 0; width: 100vw; height: 100vh; opacity: 0; pointer-events: none; z-index: 0; transition: opacity 0.3s; } .oscilloscope-container.active { opacity: 1; } #oscilloscope-canvas { width: 100%; height: 100%; /* halo is drawn as layered strokes in-canvas — the old double drop-shadow here forced a fullscreen GPU blur pass every frame */ } /* Settings Drawer (top-center dropdown) */ .settings-drawer { position: fixed; top: 0; left: 50%; transform: translateX(-50%); z-index: 1500; display: flex; flex-direction: column; align-items: center; pointer-events: none; } .settings-drawer .settings-tab, .settings-drawer.open .settings-panel { pointer-events: auto; } .settings-tab { padding: 5px 18px; background: var(--panel-bg); border: 1px solid var(--blue-dim); border-top: none; border-radius: 0 0 var(--radius-md) var(--radius-md); cursor: pointer; color: var(--text-muted); font-size: 11px; letter-spacing: 1px; transition: all 0.2s; user-select: none; display: flex; align-items: center; gap: 6px; } .settings-tab:hover { background: var(--blue-dim); color: var(--text-primary); } .settings-drawer.open .settings-tab { background: var(--blue-dim); color: var(--text-primary); } .settings-panel { background: var(--panel-bg); border: 1px solid var(--blue-dim); border-top: none; border-radius: 0 0 var(--radius-md) var(--radius-md); padding: 16px; width: 240px; display: flex; flex-direction: column; gap: 14px; transform: scaleY(0); transform-origin: top; opacity: 0; pointer-events: none; transition: transform 0.25s ease, opacity 0.2s ease; } .settings-drawer.open .settings-panel { transform: scaleY(1); opacity: 1; pointer-events: auto; } .settings-panel label { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 1px; } .settings-panel select { width: 100%; background: var(--neutral-700); color: var(--text-primary); border: 1px solid var(--border-default); padding: 6px 10px; border-radius: var(--radius-sm); cursor: pointer; font-size: 13px; } .settings-panel select:hover { border-color: var(--blue); } .settings-group { display: flex; flex-direction: column; gap: 4px; } .provider-status { font-size: 11px; color: var(--green); } .settings-divider { border-top: 1px solid var(--neutral-700); } .settings-version { font-size: 10px; color: var(--text-dim); text-align: center; padding: 4px 0 0; letter-spacing: 0.5px; opacity: 0.6; } .settings-version a { color: var(--cyan); text-decoration: none; } .settings-version a:hover { text-decoration: underline; } .settings-version .update-dot { display: inline-block; width: 6px; height: 6px; background: #22c55e; border-radius: 50%; margin-left: 4px; animation: pulse-dot 2s infinite; } @keyframes pulse-dot { 0%, 100% { opacity: 1; } 50% { opacity: 0.3; } } /* PTT Hotkey row */ .ptt-hotkey-row { display: flex; align-items: center; gap: 6px; margin-top: 4px; } .ptt-hotkey-label { flex: 1; font-size: 12px; font-weight: 600; color: var(--text-primary); background: rgba(255,255,255,0.05); border: 1px solid var(--neutral-700); border-radius: var(--radius-sm); padding: 4px 8px; min-width: 80px; text-align: center; font-family: var(--font-mono); } .ptt-hotkey-btn { background: rgba(0,136,255,0.1); color: var(--blue); border: 1px solid rgba(0,136,255,0.3); border-radius: var(--radius-sm); padding: 4px 10px; font-size: 11px; cursor: pointer; white-space: nowrap; } .ptt-hotkey-btn:hover { background: rgba(0,136,255,0.2); } .ptt-hotkey-clear { color: var(--text-muted); border-color: var(--border-default); background: transparent; } .ptt-hotkey-clear:hover { color: var(--red); border-color: var(--red); background: transparent; } .settings-btn { background: var(--neutral-700); color: var(--blue); border: 1px solid var(--blue-dim); padding: 6px 12px; border-radius: var(--radius-sm); cursor: pointer; font-size: 12px; transition: all 0.2s; } .settings-btn:hover { background: var(--blue-dim); color: var(--text-primary); } .face-id-status { font-size: 12px; color: var(--text-muted); } .face-id-status.identified { color: var(--green); } .face-id-known { font-size: 11px; color: var(--text-dim); max-height: 80px; overflow-y: auto; } /* Supertonic TTS UI */ .supertonic-ui { position: fixed; bottom: 100px; left: 50%; transform: translateX(-50%); background: var(--panel-bg); border: 1px solid var(--blue); padding: 15px 20px; border-radius: var(--radius-lg); display: flex; gap: 10px; align-items: center; z-index: 100; } .tts-input { background: var(--neutral-700); color: var(--text-primary); border: 1px solid var(--border-default); padding: 10px 15px; border-radius: var(--radius-md); font-family: var(--font-mono); font-size: 14px; width: 300px; } .tts-input:focus { outline: none; border-color: var(--blue); } .tts-speak-btn { background: var(--blue); color: var(--text-primary); border: none; padding: 10px 20px; border-radius: var(--radius-md); cursor: pointer; font-family: var(--font-mono); font-size: 14px; transition: background 0.2s; } .tts-speak-btn:hover { background: var(--blue-bright); } .tts-voice-select { background: var(--neutral-700); color: var(--text-primary); border: 1px solid var(--border-default); padding: 10px; border-radius: var(--radius-md); cursor: pointer; font-family: var(--font-mono); } /* Wake Word Detection - yellow glow when listening for trigger */ @keyframes yellow-pulse-glow { 0%, 100% { box-shadow: 0 0 20px rgba(255, 221, 0, 0.4); transform: scale(1); } 50% { box-shadow: 0 0 40px rgba(255, 221, 0, 0.8); transform: scale(1.05); } } /* Green glow when triggered/active */ @keyframes green-pulse-glow { 0%, 100% { box-shadow: 0 0 20px rgba(0, 255, 102, 0.4); transform: scale(1); } 50% { box-shadow: 0 0 40px rgba(0, 255, 102, 0.8); transform: scale(1.05); } } /* Auto-triggered call button - yellow flash then green */ .call-button.auto-triggered { animation: auto-trigger-flash 0.5s ease-out; } @keyframes auto-trigger-flash { 0% { border-color: var(--yellow); box-shadow: 0 0 0 0 rgba(255, 221, 0, 0.8); } 100% { border-color: var(--green); box-shadow: 0 0 0 20px rgba(255, 221, 0, 0); } } /* Auth section */ #auth-section { position: fixed; top: 10px; right: 10px; z-index: 1000; } /* Custom User Menu */ .user-menu-container { position: relative; z-index: 100; } .user-avatar-btn { width: 38px; height: 38px; border-radius: 50%; border: 2px solid var(--blue-dim); padding: 0; cursor: pointer; overflow: hidden; background: var(--bg-panel); transition: border-color 0.2s, box-shadow 0.2s; display: flex; align-items: center; justify-content: center; } .user-avatar-btn:hover { border-color: var(--blue); box-shadow: 0 0 12px rgba(0, 136, 255, 0.4); } .user-avatar-btn img { width: 100%; height: 100%; object-fit: cover; border-radius: 50%; } .avatar-fallback { width: 100%; height: 100%; display: flex; align-items: center; justify-content: center; font-size: 13px; font-weight: bold; color: var(--blue); background: rgba(0, 136, 255, 0.15); border-radius: 50%; } .user-dropdown { position: absolute; top: 46px; right: 0; width: 260px; background: var(--bg-panel); border: 1px solid var(--border-strong); border-radius: var(--radius-lg); box-shadow: 0 8px 40px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--border-subtle); display: none; overflow: hidden; animation: dropdownFade 0.18s ease; max-height: 80vh; overflow-y: auto; z-index: 10000; } .user-dropdown.open { display: block; } @keyframes dropdownFade { from { opacity: 0; transform: translateY(-6px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } } .user-dropdown-header { padding: 14px; display: flex; align-items: center; gap: 12px; background: linear-gradient(135deg, rgba(0, 136, 255, 0.08) 0%, rgba(0, 255, 255, 0.04) 100%); border-bottom: 1px solid rgba(0, 136, 255, 0.15); } .udh-avatar { width: 42px; height: 42px; border-radius: 50%; border: 2px solid var(--blue); overflow: hidden; flex-shrink: 0; display: flex; align-items: center; justify-content: center; background: var(--bg-panel); } .udh-avatar img { width: 100%; height: 100%; object-fit: cover; } .user-dropdown-info { flex: 1; min-width: 0; } .user-dropdown-name { color: var(--text-primary); font-size: 14px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; letter-spacing: 0.2px; } .user-dropdown-email { color: var(--text-dim); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; margin-top: 2px; } .udm-section-label { padding: 10px 14px 4px; font-size: 10px; font-weight: 700; letter-spacing: 1.2px; text-transform: uppercase; color: var(--text-disabled); } .user-dropdown-item { display: flex; align-items: center; gap: 10px; padding: 9px 14px; color: var(--text-muted); cursor: pointer; transition: background 0.12s, color 0.12s; font-size: 13px; line-height: 1.3; } .user-dropdown-item:hover { background: var(--border-subtle); color: var(--text-primary); } .udi-icon { font-size: 15px; width: 20px; text-align: center; flex-shrink: 0; opacity: 0.85; } .user-dropdown-item.danger { color: var(--red); } .user-dropdown-item.danger:hover { background: rgba(255, 34, 68, 0.08); color: var(--red); } .user-dropdown-divider { height: 1px; background: rgba(255, 255, 255, 0.05); margin: 4px 0; } #login-btn { background: var(--blue); color: var(--text-primary); border: none; padding: 8px 16px; border-radius: var(--radius-md); cursor: pointer; font-family: var(--font-mono); } #login-btn:hover { background: var(--blue-bright); } /* Mode Selector (now inside settings drawer) */ .mode-selector { display: none; } /* Clawdbot Chat UI */ .clawdbot-container { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); width: 90%; max-width: 600px; z-index: 100; display: none; } .clawdbot-container.active { display: flex; flex-direction: column; } .chat-history { background: var(--bg-panel); border-radius: var(--radius-lg); border: 1px solid var(--blue-dim); padding: 16px; max-height: 300px; overflow-y: auto; margin-bottom: 12px; color: var(--text-primary); font-family: var(--font-mono); } /* chat-history scrollbar inherits from global theme */ .message { margin-bottom: 12px; padding: 10px 14px; border-radius: var(--radius-md); line-height: 1.4; word-wrap: break-word; } .message-user { background: rgba(0, 136, 255, 0.2); border-left: 3px solid var(--blue); color: var(--text-secondary); } .message-assistant { background: rgba(0, 255, 102, 0.1); border-left: 3px solid var(--green); color: var(--text-secondary); } .message-system { background: rgba(255, 255, 255, 0.05); color: var(--text-muted); font-style: italic; text-align: center; } .input-container { display: flex; gap: 8px; } .input-container input { flex: 1; padding: 14px 18px; border-radius: var(--radius-md); border: 1px solid var(--border-default); background: var(--bg-panel); color: var(--text-primary); font-size: 16px; font-family: var(--font-mono); outline: none; transition: border-color 0.2s, box-shadow 0.2s; } .input-container input:focus { border-color: var(--blue); box-shadow: 0 0 10px rgba(0, 136, 255, 0.3); } .input-container input::placeholder { color: var(--text-dim); } .input-container button { padding: 14px 28px; border-radius: var(--radius-md); border: none; background: linear-gradient(135deg, var(--blue) 0%, var(--blue-dim) 100%); color: var(--text-primary); font-size: 16px; font-family: var(--font-mono); font-weight: bold; cursor: pointer; transition: transform 0.2s, box-shadow 0.2s; } .input-container button:hover { transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0, 136, 255, 0.4); } .input-container button:active { transform: translateY(0); } .input-container button:disabled { background: var(--border-default); cursor: not-allowed; transform: none; box-shadow: none; } /* Connection status indicator for Clawdbot */ .clawdbot-status { display: flex; align-items: center; gap: 6px; font-size: 12px; padding: 6px 10px; background: rgba(0, 0, 0, 0.5); border-radius: var(--radius-sm); margin-bottom: 8px; } .clawdbot-status-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--red); animation: pulse 2s infinite; } .clawdbot-status-dot.connected { background: var(--green); animation: none; } .clawdbot-status-dot.connecting { background: var(--yellow); } /* ===== CANVAS MENU SYSTEM ===== */ /* Canvas Menu Button - Top Left Corner */ #canvas-menu-button { position: fixed; top: 10px; left: 10px; width: 40px; height: 40px; border-radius: 50%; background: var(--bg-panel); border: 1px solid rgba(74, 158, 255, 0.5); color: var(--text-primary); font-size: 20px; cursor: pointer; z-index: 200; display: flex; align-items: center; justify-content: center; transition: all 0.2s; } #canvas-menu-button:hover { background: rgba(74, 158, 255, 0.3); border-color: rgba(74, 158, 255, 0.8); transform: scale(1.1); } #canvas-menu-button.active { background: rgba(74, 158, 255, 0.4); border-color: var(--blue-bright); } /* Canvas Menu Modal */ .canvas-menu-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 250; display: flex; align-items: center; justify-content: center; } .cmm-backdrop { position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.7); } .cmm-content { position: relative; z-index: 1; width: 600px; max-width: 90vw; max-height: 80vh; background: var(--bg-panel); border: 2px solid rgba(74, 158, 255, 0.4); border-radius: var(--radius-lg); display: flex; flex-direction: column; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); } .cmm-header { padding: 16px; border-bottom: 1px solid rgba(255, 255, 255, 0.1); display: flex; gap: 12px; } #canvas-search { flex: 1; padding: 10px 14px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: var(--radius-md); color: var(--text-primary); font-size: 14px; } #canvas-search:focus { outline: none; border-color: rgba(74, 158, 255, 0.6); } .cmm-close { width: 36px; height: 36px; background: transparent; border: 1px solid rgba(255, 255, 255, 0.2); border-radius: var(--radius-md); color: var(--text-primary); font-size: 24px; cursor: pointer; transition: all 0.2s; } .cmm-close:hover { background: rgba(255, 255, 255, 0.1); border-color: rgba(255, 255, 255, 0.3); } .cmm-quick-actions { padding: 8px 16px; display: flex; gap: 8px; border-bottom: 1px solid rgba(255, 255, 255, 0.05); } .cmm-qa { padding: 6px 12px; background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.1); border-radius: var(--radius-md); color: var(--text-muted); font-size: 12px; cursor: pointer; transition: all 0.2s; } .cmm-qa:hover { background: rgba(255, 255, 255, 0.1); color: var(--text-primary); } .cmm-qa.active { background: rgba(74, 158, 255, 0.2); border-color: rgba(74, 158, 255, 0.5); color: var(--text-primary); } .cmm-categories { flex: 1; overflow-y: auto; padding: 12px; } .cmm-category { margin-bottom: 8px; } .cmm-cat-header { display: flex; align-items: center; padding: 10px 12px; background: rgba(255, 255, 255, 0.03); border-radius: var(--radius-md); cursor: pointer; user-select: none; transition: background 0.2s; } .cmm-cat-header:hover { background: rgba(255, 255, 255, 0.06); } .cmm-cat-icon { margin-right: 8px; font-size: 16px; } .cmm-cat-name { flex: 1; font-weight: 500; color: var(--text-primary); } .cmm-cat-count { color: var(--text-dim); font-size: 12px; margin-right: 8px; } .cmm-cat-expand { color: var(--text-dim); font-size: 10px; transition: transform 0.2s; } .cmm-category.expanded .cmm-cat-expand { transform: rotate(180deg); } .cmm-cat-pages { max-height: 0; overflow: hidden; transition: max-height 0.3s ease-out; } .cmm-category.expanded .cmm-cat-pages { max-height: 500px; } .cmm-page { display: flex; align-items: center; padding: 8px 12px 8px 36px; border-radius: var(--radius-sm); cursor: pointer; transition: background 0.15s; } .cmm-page:hover { background: var(--border-default); } .cmm-page-star { margin-right: 8px; opacity: 0.3; cursor: pointer; font-size: 12px; transition: opacity 0.2s; } .cmm-page-star:hover { opacity: 0.7; } .cmm-page-star.active { opacity: 1; color: var(--yellow); } .cmm-page-name { flex: 1; font-size: 14px; color: var(--text-secondary); } .cmm-page-time { color: var(--text-dim); font-size: 11px; } .cmm-footer { padding: 12px 16px; border-top: 1px solid rgba(255, 255, 255, 0.1); display: flex; justify-content: space-between; align-items: center; } #cmm-page-count { color: var(--text-dim); font-size: 12px; } #cmm-edit-mode { padding: 6px 12px; background: transparent; border: 1px solid rgba(255, 255, 255, 0.2); border-radius: var(--radius-md); color: var(--text-muted); font-size: 12px; cursor: pointer; transition: all 0.2s; } #cmm-edit-mode:hover { background: rgba(255, 255, 255, 0.1); color: var(--text-primary); } #cmm-edit-mode.active { background: rgba(74, 158, 255, 0.2); border-color: rgba(74, 158, 255, 0.5); color: var(--text-primary); } /* Empty state */ .cmm-empty { padding: 40px; text-align: center; color: var(--text-dim); } /* Loading state */ .cmm-loading { padding: 40px; text-align: center; color: var(--text-dim); } /* Drag and drop states */ .cmm-page.dragging { opacity: 0.5; background: rgba(74, 158, 255, 0.3); transform: scale(1.02); } .cmm-cat-pages.drag-over { background: rgba(74, 158, 255, 0.1); border: 2px dashed rgba(74, 158, 255, 0.5); border-radius: var(--radius-sm); margin: 4px 0; } .cmm-category.dragging { opacity: 0.7; transform: scale(0.98); } .cmm-categories.drag-over-top { padding-top: 40px; position: relative; } .cmm-categories.drag-over-top::before { content: 'Drop here'; position: absolute; top: 10px; left: 50%; transform: translateX(-50%); color: var(--blue-bright); font-size: 12px; padding: 8px 16px; border: 2px dashed var(--blue-bright); border-radius: var(--radius-sm); } /* Edit mode styles */ .cmm-content.edit-mode .cmm-page { cursor: grab; } .cmm-content.edit-mode .cmm-page:active { cursor: grabbing; } .cmm-content.edit-mode .cmm-cat-header { cursor: grab; } .cmm-content.edit-mode .cmm-cat-header:active { cursor: grabbing; } /* Delete button on pages - always visible but dim */ .cmm-page-delete { margin-left: auto; opacity: 0.25; cursor: pointer; font-size: 16px; color: var(--text-dim); transition: all 0.2s; padding: 2px 8px; border-radius: var(--radius-sm); font-weight: bold; } .cmm-page:hover .cmm-page-delete { opacity: 0.6; } .cmm-page-delete:hover { opacity: 1 !important; color: var(--red); background: rgba(255, 92, 92, 0.15); } /* Confirmation modal */ .cmm-confirm-modal { position: fixed; top: 0; left: 0; right: 0; bottom: 0; z-index: 300; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.8); } .cmm-confirm-box { background: var(--bg-panel); border: 2px solid rgba(255, 92, 92, 0.5); border-radius: var(--radius-lg); padding: 24px; max-width: 400px; text-align: center; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.5); } .cmm-confirm-icon { font-size: 48px; margin-bottom: 16px; } .cmm-confirm-title { font-size: 18px; font-weight: 600; color: var(--red); margin-bottom: 12px; } .cmm-confirm-message { color: var(--text-muted); font-size: 14px; margin-bottom: 8px; line-height: 1.5; } .cmm-confirm-page-name { color: var(--text-primary); font-weight: 500; word-break: break-word; margin-bottom: 20px; padding: 8px; background: rgba(255, 255, 255, 0.05); border-radius: var(--radius-sm); } .cmm-confirm-buttons { display: flex; gap: 12px; justify-content: center; } .cmm-confirm-btn { padding: 10px 24px; border-radius: var(--radius-md); font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.2s; border: none; } .cmm-confirm-btn.cancel { background: rgba(255, 255, 255, 0.1); color: var(--text-muted); } .cmm-confirm-btn.cancel:hover { background: rgba(255, 255, 255, 0.15); color: var(--text-primary); } .cmm-confirm-btn.delete { background: rgba(255, 92, 92, 0.2); color: var(--red); } .cmm-confirm-btn.delete:hover { background: rgba(255, 92, 92, 0.35); } /* Drop zone indicator */ .cmm-drop-zone { height: 40px; border: 2px dashed rgba(74, 158, 255, 0.3); border-radius: var(--radius-sm); margin: 4px 0; display: flex; align-items: center; justify-content: center; color: var(--blue-bright); font-size: 12px; transition: all 0.2s; } .cmm-drop-zone.active { border-color: rgba(74, 158, 255, 0.8); background: rgba(74, 158, 255, 0.1); } /* ── Canvas Menu: Mobile ── */ @media (max-width: 640px) { /* Slide up as a bottom sheet */ .canvas-menu-modal { align-items: flex-end !important; } .cmm-content { width: 100vw !important; max-width: 100vw !important; max-height: 92vh !important; border-radius: 16px 16px 0 0 !important; margin: 0 !important; } /* Quick actions: wrap so they don't overflow */ .cmm-quick-actions { flex-wrap: wrap; gap: 6px; } /* Bigger touch targets */ .cmm-cat-header { padding: 14px 12px; min-height: 52px; } .cmm-page { padding: 12px 12px 12px 36px; min-height: 48px; } .cmm-page-name { font-size: 15px; } /* Give category pages room to expand */ .cmm-category.expanded .cmm-cat-pages { max-height: 3000px !important; } /* Search input: full-width, bigger */ #canvas-search { font-size: 16px; /* prevents iOS auto-zoom on focus */ padding: 12px 14px; } .cmm-close { width: 44px; height: 44px; font-size: 20px; } .cmm-header { padding: 14px 12px; } /* Footer: stack on small screens */ .cmm-footer { flex-wrap: wrap; gap: 8px; } } /* ================================================================ Issue Report Button + Modal ================================================================ */ /* Caution triangle button — top, halfway between center and right edge */ .issue-report-btn { position: fixed; top: 8px; left: 75%; transform: translateX(-50%); background: transparent; border: 1px solid rgba(245, 158, 11, 0.0); color: rgba(245, 158, 11, 0.35); width: 30px; height: 30px; border-radius: var(--radius-md); cursor: pointer; display: flex; align-items: center; justify-content: center; z-index: 1200; transition: color 0.2s, background 0.2s, border-color 0.2s, box-shadow 0.2s; padding: 0; } .issue-report-btn:hover { color: rgba(245, 158, 11, 0.9); background: rgba(245, 158, 11, 0.10); border-color: rgba(245, 158, 11, 0.4); box-shadow: 0 0 12px rgba(245, 158, 11, 0.2); } /* Modal backdrop */ .issue-report-modal { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.65); backdrop-filter: blur(4px); z-index: 3000; display: flex; align-items: center; justify-content: center; padding: 16px; } /* Modal box */ .irm-box { background: var(--bg-panel); border: 1px solid rgba(245, 158, 11, 0.4); border-radius: var(--radius-lg); width: 100%; max-width: 420px; box-shadow: 0 8px 40px rgba(0, 0, 0, 0.7), 0 0 0 1px rgba(245,158,11,0.08); display: flex; flex-direction: column; overflow: hidden; } .irm-header { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px 12px; border-bottom: 1px solid rgba(255, 255, 255, 0.07); } .irm-title { font-size: 13px; font-weight: 600; color: var(--text-primary); letter-spacing: 0.02em; } .irm-close { background: none; border: none; color: var(--text-dim); font-size: 20px; cursor: pointer; line-height: 1; padding: 0 2px; transition: color 0.15s; } .irm-close:hover { color: var(--text-secondary); } .irm-body { padding: 16px; display: flex; flex-direction: column; gap: 12px; } .irm-field { display: flex; flex-direction: column; gap: 5px; } .irm-label { font-size: 11px; color: var(--text-muted); letter-spacing: 0.04em; text-transform: uppercase; } .irm-select, .irm-textarea { background: rgba(255, 255, 255, 0.05); border: 1px solid rgba(255, 255, 255, 0.12); border-radius: var(--radius-md); color: var(--text-secondary); font-size: 13px; padding: 8px 10px; font-family: inherit; transition: border-color 0.2s; outline: none; width: 100%; box-sizing: border-box; } .irm-select:focus, .irm-textarea:focus { border-color: rgba(245, 158, 11, 0.5); } .irm-textarea { resize: vertical; min-height: 90px; line-height: 1.5; } .irm-context-row { display: flex; gap: 6px; align-items: flex-start; flex-wrap: wrap; } .irm-context-label { font-size: 10px; color: var(--text-disabled); white-space: nowrap; padding-top: 1px; } .irm-context-value { font-size: 10px; color: var(--text-disabled); font-family: var(--font-mono); word-break: break-all; } .irm-footer { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; border-top: 1px solid rgba(255, 255, 255, 0.07); gap: 10px; } .irm-status { font-size: 11px; color: var(--text-dim); flex: 1; } .irm-status.success { color: var(--green); } .irm-status.error { color: var(--red); } .irm-btns { display: flex; gap: 8px; } .irm-btn { padding: 7px 16px; border-radius: var(--radius-md); font-size: 12px; font-weight: 600; cursor: pointer; border: 1px solid transparent; transition: all 0.15s; letter-spacing: 0.02em; } .irm-cancel { background: transparent; border-color: rgba(255,255,255,0.15); color: var(--text-muted); } .irm-cancel:hover { border-color: rgba(255,255,255,0.3); color: var(--text-primary); } .irm-submit { background: rgba(245, 158, 11, 0.15); border-color: rgba(245, 158, 11, 0.5); color: var(--orange); } .irm-submit:hover { background: rgba(245, 158, 11, 0.25); border-color: rgba(245, 158, 11, 0.8); } .irm-submit:disabled { opacity: 0.4; cursor: not-allowed; } @media (max-width: 768px) { .issue-report-btn { left: 75%; top: 8px; } }