html, body { width: 100%; height: 100%; height: var(--app-height, 100dvh); overflow: hidden; -webkit-text-size-adjust: 100%; } body { overflow: hidden; } /* ---- Layout ---- */ .layout { display: grid; grid-template-columns: 280px minmax(0, 1fr); grid-template-rows: 52px minmax(0, 1fr); width: 100%; height: calc(var(--app-height, 100dvh) - 40px); overflow: hidden; } /* ---- Topbar ---- */ .topbar { grid-column: 1 / -1; display: flex; align-items: center; gap: 0.75rem; padding: 0 1.5rem; border-bottom: 1px solid var(--border); background: var(--nav-bg); backdrop-filter: blur(12px) saturate(120%); -webkit-backdrop-filter: blur(12px) saturate(120%); min-width: 0; transition: background 0.3s ease; } .menu-button { display: none; background: transparent; color: var(--ink); border: 1px solid var(--border); border-radius: 2px; padding: 0.4rem 0.65rem; font-size: 0.72rem; font-weight: 500; letter-spacing: 0.1em; text-transform: uppercase; cursor: pointer; transition: border-color 0.2s, color 0.2s; } .menu-button:hover { border-color: var(--ink-muted); } .topbar-brand { display: inline-flex; align-items: baseline; gap: 0.35rem; white-space: nowrap; font-weight: 700; font-size: 1rem; letter-spacing: -0.02em; color: var(--ink); text-decoration: none; } .topbar-brand:hover { color: var(--accent); border-bottom: none; } [data-theme="macchiato"] .topbar-brand { color: #cad3f5; text-shadow: 0 0 8px rgba(138, 173, 244, 0.25); } .topbar-brand .brand-sep { font-weight: 300; color: var(--ink-dim); } .topbar-brand .brand-sub { font-weight: 400; font-size: 0.72rem; letter-spacing: 0.18em; text-transform: uppercase; color: var(--ink-muted); } .topbar-timer { display: inline-flex; align-items: center; justify-content: center; margin-left: auto; font-size: 0.72rem; font-weight: 500; letter-spacing: 0.08em; color: var(--danger-text); background: var(--danger-soft); padding: 0.3rem 0.7rem; border-radius: 2px; border: 1px solid var(--danger); white-space: nowrap; } .drawer-backdrop { display: none; position: fixed; inset: 0; background: rgba(0, 0, 0, 0.45); z-index: 40; backdrop-filter: blur(2px); } /* ---- Sidebar ---- */ .sidebar { grid-column: 1; grid-row: 2; border-right: 1px solid var(--border); background: var(--bg-panel); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); display: flex; flex-direction: column; overflow: hidden; min-width: 0; transition: background 0.3s ease; } .sidebar-header { padding: 1rem; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 0.75rem; justify-content: space-between; } .sidebar-title { font-size: 0.65rem; font-weight: 500; text-transform: uppercase; letter-spacing: 0.2em; color: var(--ink-dim); } .close-sidebar { display: none; background: transparent; border: 1px solid var(--border); color: var(--ink-muted); border-radius: 2px; padding: 0.35rem 0.6rem; cursor: pointer; font-size: 0.68rem; font-weight: 500; letter-spacing: 0.1em; text-transform: uppercase; } .close-sidebar:hover { color: var(--ink); border-color: var(--ink-muted); } #session-list { flex: 1; overflow-y: auto; padding: 0.5rem; display: flex; flex-direction: column; gap: 0.25rem; -webkit-overflow-scrolling: touch; } #session-list::-webkit-scrollbar, #supporter-messages::-webkit-scrollbar { width: 3px; height: 3px; } #session-list::-webkit-scrollbar-thumb, #supporter-messages::-webkit-scrollbar-thumb { background: var(--border); border-radius: 2px; } .session-item { width: 100%; text-align: left; background: transparent; border: 1px solid transparent; border-radius: 2px; padding: 0.7rem 0.75rem; cursor: pointer; color: var(--ink); font-size: 0.85rem; transition: background 0.15s, border-color 0.15s; display: flex; flex-direction: column; gap: 0.3rem; } .session-item:hover { background: var(--surface-hover); border-color: var(--border); } .session-item.selected { background: var(--surface-hover); border-color: var(--accent); } .session-name { font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.85rem; } .session-meta { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; } .session-badge { font-size: 0.6rem; padding: 0.12rem 0.45rem; border-radius: 2px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.1em; } .status-waiting { background: var(--status-waiting-bg); color: var(--status-waiting-ink); } .status-active { background: var(--status-active-bg); color: var(--status-active-ink); } .status-closed { background: var(--status-closed-bg); color: var(--status-closed-ink); } .session-count { font-size: 0.7rem; color: var(--ink-dim); } .session-id { font-size: 0.65rem; color: var(--ink-dim); letter-spacing: 0.04em; } .no-sessions { padding: 1.5rem 1rem; font-size: 0.82rem; color: var(--ink-dim); text-align: center; line-height: 1.6; } /* ---- Main panel ---- */ .main-panel { grid-column: 2; grid-row: 2; display: flex; flex-direction: column; align-items: center; justify-content: stretch; overflow: hidden; min-width: 0; background: var(--bg); padding: 1rem; } .chat-shell { display: flex; flex-direction: column; width: min(860px, 100%); height: 100%; background: var(--bg-panel); backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); border: 1px solid var(--border); border-radius: 3px; overflow: hidden; box-shadow: 0 8px 30px rgba(26, 29, 34, 0.06); transition: background 0.3s ease, border-color 0.3s ease; } .main-header { display: flex; align-items: center; gap: 0.55rem; padding: 0.8rem 1rem; border-bottom: 1px solid var(--border); min-height: 50px; flex-shrink: 0; } .active-copy { min-width: 0; display: flex; flex-direction: column; gap: 0.1rem; } #active-session-name { font-weight: 700; font-size: 0.88rem; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } #active-session-meta { font-size: 0.65rem; color: var(--ink-dim); white-space: nowrap; letter-spacing: 0.04em; } /* ---- Messages ---- */ #supporter-messages { flex: 1; min-height: 0; overflow-y: auto; padding: 0.9rem; display: flex; flex-direction: column; gap: 0.5rem; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; } .empty-state { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: var(--ink-dim); gap: 0.4rem; font-size: 0.85rem; text-align: center; padding: 1rem; line-height: 1.6; } .msg-wrap { display: flex; } .msg-user-wrap { justify-content: flex-start; } .msg-supporter-wrap { justify-content: flex-end; } .msg-user, .msg-supporter { max-width: 78%; padding: 0.55rem 0.8rem; border-radius: 12px; font-size: 0.85rem; line-height: 1.55; overflow-wrap: anywhere; } .msg-user { background: var(--peer-bubble); color: var(--peer-bubble-ink); border-bottom-left-radius: 3px; } .msg-supporter { background: var(--own-bubble); color: var(--own-bubble-ink); border-bottom-right-radius: 3px; } .msg-label { display: block; font-size: 0.62rem; font-weight: 500; opacity: 0.7; margin-bottom: 2px; text-transform: uppercase; letter-spacing: 0.12em; } .msg-text { margin: 0; } .msg-time { display: block; font-size: 0.6rem; opacity: 0.5; margin-top: 4px; text-align: right; letter-spacing: 0.04em; } .msg-system-wrap { display: flex; justify-content: center; margin: 0.25rem 0; } .msg-system-text { font-size: 0.7rem; color: var(--ink-dim); background: var(--input-bg); padding: 0.25rem 0.75rem; border-radius: 2px; text-align: center; letter-spacing: 0.04em; } /* ---- Typing bubble ---- */ .typing-bubble { display: none; padding: 0 0.9rem 0.55rem; justify-content: flex-start; flex-shrink: 0; } .typing-bubble.visible { display: flex; } .typing-bubble-inner { position: relative; display: inline-flex; align-items: center; gap: 4px; min-width: 48px; padding: 0.55rem 0.75rem; background: var(--peer-bubble); border-radius: 12px; border-bottom-left-radius: 3px; } .typing-dot { width: 5px; height: 5px; border-radius: 50%; background: var(--ink-dim); animation: typing-bounce 1.1s infinite ease-in-out; } .typing-dot:nth-child(2) { animation-delay: 0.16s; } .typing-dot:nth-child(3) { animation-delay: 0.32s; } /* ---- Reply area ---- */ #reply-area { border-top: 1px solid var(--border); padding: 0.6rem 0.85rem max(0.75rem, env(safe-area-inset-bottom)); display: none; flex-shrink: 0; } #reply-area.visible { display: flex; gap: 0.45rem; } #reply-area input[type="text"] { flex: 1; min-width: 0; padding: 0.55rem 0.8rem; background: var(--input-bg); border: 1px solid var(--border); border-radius: 3px; color: var(--ink); font-size: 0.85rem; line-height: 1.25; outline: none; transition: border-color 0.2s; } #reply-area input[type="text"]:focus { border-color: var(--accent); } #reply-area input[type="text"]::placeholder { color: var(--ink-dim); } #reply-area button { padding: 0.55rem 0.9rem; background: var(--accent); color: var(--bg); border: none; border-radius: 3px; font-weight: 700; font-size: 0.78rem; letter-spacing: 0.08em; text-transform: uppercase; cursor: pointer; transition: opacity 0.2s; white-space: nowrap; } #reply-area button:hover { opacity: 0.85; } /* ---- Mobile ---- */ @media (max-width: 820px) { .layout { grid-template-columns: minmax(0, 1fr); grid-template-rows: 52px minmax(0, 1fr); } .topbar { padding: 0 0.75rem; } .menu-button { display: inline-flex; } .drawer-backdrop.visible { display: block; } .sidebar { position: fixed; top: 0; left: 0; bottom: 0; height: 100%; height: var(--app-height, 100dvh); width: min(88vw, 320px); border-right: 1px solid var(--border); z-index: 50; transform: translateX(-102%); transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1); box-shadow: 12px 0 35px rgba(0, 0, 0, 0.25); } .sidebar.open { transform: translateX(0); } .close-sidebar { display: inline-flex; } .main-panel { grid-column: 1; grid-row: 2; padding: 0.65rem; align-items: stretch; justify-content: stretch; } .chat-shell { width: 100%; max-width: none; height: 100%; } .main-header { padding: 0.75rem 0.85rem; } .msg-user, .msg-supporter { max-width: 86%; } #reply-area.visible { gap: 0.4rem; } #reply-area button { padding-inline: 0.75rem; } } @media (max-width: 460px) { .topbar-brand .brand-sub { display: none; } .topbar-brand .brand-sep { display: none; } .main-panel { padding: 0.45rem; } .main-header { min-height: 46px; } #supporter-messages { padding: 0.75rem; } .theme-toggle { width: 20px; height: 20px; bottom: 1rem; right: 0.75rem; } } @keyframes typing-bounce { 0%, 75%, 100% { transform: translateY(0); opacity: 0.45; } 35% { transform: translateY(-4px); opacity: 1; } }