/* * Say — Голосовой ассистент * Дизайн-система Nubes (как в ipwhitelist-app) */ /* ========================================================================== CSS Variables — точь-в-точь ipwhitelist-app ========================================================================== */ :root { --bg: #f5f5f5; --card: #ffffff; --text: #1a1a1a; --muted: #6b7280; --border: #d1d5db; --grey-light: #f3f4f6; --blue: #2563eb; --blue-h: #1d4ed8; --red: #dc2626; --red-h: #b91c1c; --green: #16a34a; --amber: #d97706; } /* ========================================================================== Reset & Base ========================================================================== */ * { box-sizing: border-box; margin: 0; padding: 0; } body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg); color: var(--text); font-size: 14px; line-height: 1.5; } /* ========================================================================== Topbar (header) — 48px, белый, как в ipwhitelist-app ========================================================================== */ .topbar { background: #fff; border-bottom: 1px solid var(--border); height: 48px; display: flex; align-items: center; padding: 0 1.5rem; } .topbar-inner { display: flex; align-items: center; gap: 0.75rem; width: 100%; } .topbar-logo { display: flex; align-items: center; text-decoration: none; } .topbar-logo img { display: block; } .topbar-sep { color: var(--muted); font-size: 1rem; user-select: none; } .topbar-title { font-size: 0.9rem; color: var(--muted); } /* ========================================================================== Page Container ========================================================================== */ .page { max-width: 900px; margin: 1.5rem auto; padding: 0 1rem; } /* ========================================================================== Cards — точь-в-точь ipwhitelist-app ========================================================================== */ .card { background: var(--card); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 1px 2px rgba(0,0,0,.04); margin-bottom: 1rem; overflow: hidden; } .card-header { background: var(--grey-light); padding: .75rem 1rem; font-weight: 600; font-size: 1rem; border-bottom: 1px solid var(--border); } .card-body { padding: 1rem; } /* ========================================================================== Alerts — точь-в-точь ipwhitelist-app ========================================================================== */ .alert { padding: .75rem 1rem; border-radius: 8px; margin-bottom: 1rem; border: 1px solid; } .alert-error { background: #fecaca; color: #991b1b; border-color: #fca5a5; } .alert-success { background: #dcfce7; color: #166534; border-color: #bbf7d0; } /* ========================================================================== Buttons — точь-в-точь ipwhitelist-app ========================================================================== */ .btn { display: inline-flex; align-items: center; gap: .35rem; padding: .5rem 1rem; border: 1px solid var(--border); border-radius: 6px; font-size: .85rem; font-weight: 500; background: #fff; cursor: pointer; transition: background .15s; white-space: nowrap; } .btn:hover { background: var(--grey-light); } .btn-primary { background: var(--blue); color: #fff; border-color: var(--blue); } .btn-primary:hover { background: var(--blue-h); } .btn-primary:disabled { background: #93c5fd; border-color: #93c5fd; cursor: not-allowed; } /* ========================================================================== LLM Cards — список моделей ========================================================================== */ .llm-card { display: flex; align-items: center; gap: 1rem; padding: .75rem 0; border-bottom: 1px solid var(--border); } .llm-card:last-child { border-bottom: none; } .llm-info { flex: 1; min-width: 0; } .llm-name { font-weight: 600; font-size: .95rem; } .llm-desc { font-size: .8rem; color: var(--muted); margin-top: .15rem; } .rec-status { font-size: .8rem; color: var(--muted); min-width: 80px; text-align: right; } /* Кнопка в режиме записи */ .record-btn.recording { background: var(--red); border-color: var(--red); animation: pulse-rec 1.2s infinite; } .record-btn.recording:hover { background: var(--red-h); } @keyframes pulse-rec { 0%, 100% { box-shadow: 0 0 0 0 rgba(220,38,38,.4); } 50% { box-shadow: 0 0 0 6px rgba(220,38,38,0); } } /* ========================================================================== Result Section ========================================================================== */ .result-section { margin-bottom: 1rem; } .result-section:last-child { margin-bottom: 0; } .result-label { font-size: .8rem; font-weight: 500; color: var(--muted); text-transform: uppercase; letter-spacing: .5px; margin-bottom: .35rem; } .result-text { font-size: 1rem; line-height: 1.6; white-space: pre-wrap; word-break: break-word; } /* ========================================================================== Loading ========================================================================== */ .loading { color: var(--muted); font-size: .9rem; padding: 1rem 0; } /* ========================================================================== Footer — точь-в-точь ipwhitelist-app ========================================================================== */ .footer { text-align: center; font-size: .72rem; color: var(--muted); padding: 1rem; }