From 9896e4f716e50ecf3845a3fa909faef96aaf23c2 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sat, 29 Aug 2026 15:26:54 +0300 Subject: [PATCH] feat: redesign Domovoy chat as calm dark cockpit --- cmd/creator-web/static/assets/chat.css | 260 +++++++++++++------------ cmd/creator-web/static/assets/chat.js | 15 ++ cmd/creator-web/static/chat.html | 36 +++- 3 files changed, 181 insertions(+), 130 deletions(-) diff --git a/cmd/creator-web/static/assets/chat.css b/cmd/creator-web/static/assets/chat.css index db45089..836370d 100644 --- a/cmd/creator-web/static/assets/chat.css +++ b/cmd/creator-web/static/assets/chat.css @@ -1,148 +1,168 @@ :root { - --ink: #e9eee7; - --muted: #93a096; - --base: #0b100e; - --panel: #101714; - --line: #2a352f; - --signal: #c9a85f; - --bad: #de816f; - --good: #78c6a3; - --radius: 3px; - --sans: "Bahnschrift", "Aptos Narrow", "Segoe UI", sans-serif; - --serif: Georgia, "Times New Roman", serif; - --mono: "Cascadia Mono", Consolas, monospace; + --ink: #e6edf4; + --muted: #8494a4; + --faint: #5d6e7f; + --base: #0b1119; + --panel: #111b27; + --panel-raised: #172331; + --panel-soft: #0f1925; + --line: #263544; + --line-strong: #34485c; + --lime: #c5ef91; + --lime-ink: #142014; + --blue: #8fc7ef; + --yellow: #d8b86c; + --good: #8ed7ad; + --bad: #ee9292; + --radius: 8px; + --sans: "Manrope", "Segoe UI", sans-serif; + --mono: "DM Mono", "Cascadia Mono", Consolas, monospace; } - * { box-sizing: border-box; } [hidden] { display: none !important; } body { margin: 0; min-width: 320px; min-height: 100vh; color: var(--ink); background: var(--base); font-family: var(--sans); } button, input, textarea { font: inherit; } button { cursor: pointer; color: inherit; border-radius: var(--radius); } +a { color: inherit; } .chat-shell { min-height: 100vh; display: grid; } -.login-panel { width: min(100% - 32px, 420px); margin: auto; padding: 46px 40px; border: 1px solid var(--line); background: var(--panel); } -.brand-mark { width: 46px; height: 46px; display: grid; place-items: center; color: var(--base); background: var(--signal); font: 700 24px/1 var(--serif); clip-path: polygon(50% 0, 92% 22%, 92% 76%, 50% 100%, 8% 76%, 8% 22%); } -h1 { margin: 30px 0; font: 400 58px/.95 var(--serif); letter-spacing: -.02em; } -label { display: block; margin: 16px 0 8px; color: var(--muted); font: 600 10px/1 var(--mono); letter-spacing: .12em; text-transform: uppercase; } -input, textarea { width: 100%; border: 1px solid var(--line); border-radius: var(--radius); color: var(--ink); background: #0b110e; } -input { height: 48px; padding: 0 12px; } -textarea { resize: vertical; min-height: 84px; max-height: 240px; padding: 14px; line-height: 1.45; } -.login-form button, .composer button { border: 0; color: #11150f; background: var(--signal); font-weight: 700; } -.login-form button { width: 100%; height: 50px; margin-top: 18px; } +.login-panel { width: min(100% - 32px, 420px); margin: auto; padding: 40px; border: 1px solid var(--line); border-radius: 12px; background: var(--panel); box-shadow: 0 24px 80px rgba(0,0,0,.28); } +.brand-mark { width: 42px; height: 42px; display: grid; place-items: center; color: var(--lime-ink); background: var(--lime); border-radius: 10px; font: 700 22px/1 var(--sans); } +h1, h2 { margin: 0; letter-spacing: -.03em; } +.login-panel h1 { margin: 26px 0; font-size: 42px; font-weight: 650; } +label { display: block; margin: 16px 0 8px; color: var(--muted); font: 600 10px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; } +input, textarea { width: 100%; border: 1px solid var(--line); border-radius: var(--radius); color: var(--ink); background: var(--panel-soft); outline: none; } +input:focus, textarea:focus { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(143,199,239,.12); } +input { height: 46px; padding: 0 12px; } +textarea { resize: vertical; min-height: 84px; max-height: 240px; padding: 13px; line-height: 1.45; } +.login-form button, .composer button { border: 0; color: var(--lime-ink); background: var(--lime); font-weight: 750; } +.login-form button { width: 100%; height: 46px; margin-top: 18px; } #login-error { min-height: 20px; color: var(--bad); font-size: 13px; } -.chat-view { width: 100%; min-width: 0; height: 100vh; min-height: 0; display: grid; grid-template-rows: 64px minmax(0, 1fr); overflow: hidden; } -.chat-header { min-width: 0; display: flex; align-items: center; gap: 14px; padding: 0 22px; border-bottom: 1px solid var(--line); background: rgba(16, 23, 20, .98); } -.chat-header a { color: var(--ink); text-decoration: none; font: 400 24px/1 var(--serif); } -#active-focus { color: var(--good); } +.chat-view { width: 100%; min-width: 0; height: 100vh; min-height: 0; display: grid; grid-template-rows: 60px minmax(0, 1fr); overflow: hidden; } +.chat-header { min-width: 0; display: flex; align-items: center; gap: 14px; padding: 0 20px; border-bottom: 1px solid var(--line); background: rgba(17,27,39,.97); } +.chat-header > a:first-child { color: var(--ink); text-decoration: none; font-size: 18px; font-weight: 750; letter-spacing: -.02em; } .cognitive-status { display: inline-flex; align-items: center; gap: 7px; white-space: nowrap; } -.chat-header .cognitive-status { width: auto; height: auto; padding: 0; border: 0; background: transparent; color: var(--muted); font: 10px/1 var(--mono); letter-spacing: .1em; text-transform: uppercase; } -.chat-header .cognitive-status { max-width: min(30vw, 320px); margin-left: auto; overflow: hidden; text-overflow: ellipsis; } -.cognitive-status::before { content: ""; width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: var(--signal); } +.chat-header .cognitive-status { width: auto; height: auto; max-width: min(30vw, 340px); margin-left: auto; padding: 0; overflow: hidden; border: 0; background: transparent; color: var(--muted); font: 10px/1 var(--mono); letter-spacing: .04em; text-overflow: ellipsis; text-transform: uppercase; } +.cognitive-status::before { content: ""; width: 7px; height: 7px; flex: 0 0 7px; border-radius: 50%; background: var(--yellow); } .cognitive-status[data-state="available"] { color: var(--good); } .cognitive-status[data-state="available"]::before { background: var(--good); } .cognitive-status[data-state="unavailable"] { color: var(--bad); } .cognitive-status[data-state="unavailable"]::before { background: var(--bad); } -.cognitive-console-link { color: var(--signal); font: 10px/1 var(--mono); letter-spacing: .08em; text-transform: uppercase; white-space: nowrap; } -.build-meta { display: grid; gap: 3px; flex: 0 0 auto; color: var(--muted); font: 9px/1 var(--mono); letter-spacing: .08em; text-align: right; text-transform: uppercase; white-space: nowrap; } -.build-meta time { color: #68776d; font-size: 8px; } -.chat-header button { width: 38px; height: 38px; border: 1px solid var(--line); background: transparent; } -.human-nav { display: grid; gap: 8px; } -.nav-tab, .operator-link { height: 34px; padding: 0 12px; display: inline-flex; align-items: center; border: 1px solid var(--line); color: var(--muted); background: #0b110e; text-decoration: none; font: 11px/1 var(--mono); text-transform: uppercase; letter-spacing: .08em; } -.chat-left .nav-tab { height: auto; min-height: 58px; padding: 10px 12px; display: grid; grid-template-columns: 28px 1fr; gap: 2px 8px; align-items: center; text-align: left; } -.chat-left .nav-tab b { grid-row: span 2; color: var(--signal); font: 11px/1 var(--mono); } -.chat-left .nav-tab span { color: var(--ink); font: 600 13px/1 var(--sans); text-transform: none; letter-spacing: 0; } -.chat-left .nav-tab small { color: var(--muted); font: 10px/1 var(--mono); text-transform: none; letter-spacing: 0; } -.nav-tab.active { color: #11150f; border-color: var(--signal); background: var(--signal); } -.operator-link { color: var(--good); } -.chat-header > .operator-link { flex: 0 0 auto; } -.chat-layout { min-height: 0; height: 100%; display: grid; grid-template-columns: minmax(220px, 280px) minmax(0, 1fr) minmax(250px, 320px); } -.chat-side { min-width: 0; min-height: 0; padding: 28px 20px; overflow-y: auto; background: #0e1512; } -.generated-image { display: block; max-width: min(100%, 640px); height: auto; margin-top: 12px; border: 1px solid var(--line); } +.cognitive-console-link { color: var(--blue); font: 10px/1 var(--mono); letter-spacing: .04em; white-space: nowrap; } +.build-meta { display: grid; gap: 3px; flex: 0 0 auto; color: var(--muted); font: 9px/1 var(--mono); letter-spacing: .04em; text-align: right; text-transform: uppercase; white-space: nowrap; } +.build-meta time { color: var(--faint); font-size: 8px; } +.chat-header button { width: 34px; height: 34px; border: 1px solid var(--line); background: transparent; } +.operator-link { height: 32px; padding: 0 11px; display: inline-flex; align-items: center; border: 1px solid var(--line); color: var(--blue); background: transparent; text-decoration: none; font: 10px/1 var(--mono); letter-spacing: .04em; text-transform: uppercase; } +.chat-layout { min-height: 0; height: 100%; display: grid; grid-template-columns: minmax(220px, 258px) minmax(0, 1fr) minmax(270px, 320px); } +.chat-side { min-width: 0; min-height: 0; padding: 22px 18px; overflow-y: auto; background: var(--panel); scrollbar-color: var(--line-strong) transparent; } .chat-left { border-right: 1px solid var(--line); } .chat-right { border-left: 1px solid var(--line); } -.side-intro h1, .side-intro h2 { margin: 12px 0; font: 400 clamp(28px, 2.5vw, 40px)/.95 var(--serif); letter-spacing: -.03em; } -.side-intro p:not(.side-index) { color: var(--muted); line-height: 1.5; } -.side-index, .side-focus span, .side-note span, .ai-info-card span { color: var(--signal); font: 10px/1 var(--mono); letter-spacing: .12em; text-transform: uppercase; } -.side-focus, .side-note, .ai-info-card { margin-top: 28px; padding: 14px 0; border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); } -.side-focus strong, .side-note strong, .ai-info-card strong { display: block; margin-top: 9px; color: var(--ink); font: 600 14px/1.3 var(--sans); } -.side-note small, .ai-info-card p, .ai-data-form small { display: block; margin-top: 9px; color: var(--muted); line-height: 1.45; } -.chat-main { min-width: 0; min-height: 0; overflow: hidden; display: grid; } +.side-intro h1, .side-intro h2 { margin: 9px 0 10px; font-size: clamp(25px, 2.4vw, 34px); line-height: 1.05; font-weight: 680; } +.side-intro p:not(.side-index) { margin: 0; color: var(--muted); font-size: 12px; line-height: 1.5; } +.side-index, .section-label, .ai-info-card span, .insight-card span { color: var(--faint); font: 600 9px/1 var(--mono); letter-spacing: .12em; text-transform: uppercase; } +.side-section, .side-note, .ai-info-card { margin-top: 20px; padding: 13px 0; border-top: 1px solid var(--line); } +.side-focus strong, .side-note strong { display: block; margin-top: 8px; color: var(--blue); font-size: 13px; font-weight: 650; line-height: 1.35; } +.side-note { border-bottom: 0; } +.side-note strong { color: var(--good); } +.side-note small, .ai-info-card p, .ai-data-form small { display: block; margin-top: 8px; color: var(--muted); font-size: 11px; line-height: 1.45; } +.context-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 10px; } +.context-list span { padding: 5px 8px; border: 1px solid var(--line); border-radius: 6px; color: var(--muted); font-size: 11px; } +.quick-context { padding-bottom: 3px; } +.human-nav { display: grid; gap: 6px; margin-top: 8px; } +.nav-tab { width: 100%; min-height: 50px; padding: 8px 10px; display: grid; grid-template-columns: 26px 1fr; gap: 2px 7px; align-items: center; border: 1px solid transparent; color: var(--muted); background: transparent; text-align: left; } +.chat-left .nav-tab b { grid-row: span 2; color: var(--faint); font: 10px/1 var(--mono); } +.chat-left .nav-tab span { color: var(--ink); font-size: 12px; font-weight: 650; } +.chat-left .nav-tab small { color: var(--faint); font: 10px/1 var(--mono); } +.nav-tab:hover, .nav-tab:focus-visible { border-color: var(--line-strong); outline: none; } +.nav-tab.active { border-color: rgba(197,239,145,.42); background: rgba(197,239,145,.1); } +.nav-tab.active b { color: var(--lime); } +.quiet-state { margin: 9px 0 0; color: var(--faint); font-size: 11px; } +.new-conversation { width: 100%; min-height: 34px; margin-top: 9px; border: 1px solid var(--line-strong); color: var(--ink); background: transparent; font-size: 11px; } +.new-conversation:hover, .new-conversation:focus-visible { border-color: var(--lime); color: var(--lime); outline: none; } +.side-build { margin-top: 14px; padding-top: 14px; text-align: left; } +.chat-main { min-width: 0; min-height: 0; overflow: hidden; display: grid; background: var(--base); } .surface-panel { min-height: 0; position: relative; overflow-y: auto; } -.active-panel { display: grid; grid-template-rows: minmax(0, 1fr) auto auto; min-height: 0; background: radial-gradient(circle at 50% 0%, rgba(201, 168, 95, .045), transparent 42%); } -.messages { width: min(100%, 920px); min-height: 0; margin: 0 auto; padding: clamp(28px, 5vh, 56px) 18px 24px; display: flex; flex-direction: column; gap: 14px; overflow-y: auto; scrollbar-color: #39483f transparent; } -.message { max-width: min(720px, 92%); padding: 13px 16px 14px; border: 1px solid var(--line); border-radius: var(--radius); line-height: 1.45; } -.message.user { align-self: flex-end; background: #18221c; border-color: #3a493d; } -.message.assistant { align-self: flex-start; background: #111a15; box-shadow: 0 8px 20px rgba(0, 0, 0, .12); } -.message-head { display: flex; align-items: baseline; gap: 9px; margin-bottom: 8px; } -.message-role { color: var(--signal); font: 600 10px/1 var(--mono); letter-spacing: .08em; text-transform: uppercase; } -.message.user .message-role { color: var(--good); } -.message-time { color: #68776d; font: 9px/1 var(--mono); } -.message-content { white-space: pre-wrap; overflow-wrap: anywhere; } -.message small { display: block; margin-top: 8px; color: var(--muted); font: 10px/1 var(--mono); text-transform: uppercase; } -.composer { width: min(100%, 920px); margin: 0 auto; padding: 10px 18px 8px; display: grid; grid-template-columns: minmax(0, 1fr) 130px; gap: 12px; border-top: 1px solid rgba(42, 53, 47, .85); background: linear-gradient(var(--base), rgba(11, 16, 14, .98)); } -.composer-input-wrap { min-width: 0; border: 1px solid #3a493f; border-radius: 5px; background: #101813; transition: border-color .15s ease, box-shadow .15s ease; } -.composer-input-wrap:focus-within { border-color: var(--signal); box-shadow: 0 0 0 3px rgba(201, 168, 95, .12); } -.composer textarea { min-height: 48px; max-height: 220px; resize: none; border: 0; background: transparent; } -.composer-hint { display: flex; justify-content: space-between; gap: 12px; padding: 0 12px 8px; color: #68776d; font: 9px/1 var(--mono); } +.active-panel { display: grid; grid-template-rows: minmax(0, 1fr) auto auto; min-height: 0; } +.messages { width: min(100%, 900px); min-height: 0; margin: 0 auto; padding: clamp(24px, 5vh, 52px) 22px 20px; display: flex; flex-direction: column; gap: 10px; overflow-y: auto; scrollbar-color: var(--line-strong) transparent; } +.message { max-width: min(700px, 92%); padding: 11px 14px 12px; border: 1px solid var(--line); border-radius: 10px; line-height: 1.5; } +.message.user { align-self: flex-end; background: #162231; border-color: #30465b; } +.message.assistant { align-self: flex-start; background: #121d2a; } +.message-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; } +.message-role { color: var(--blue); font: 650 9px/1 var(--mono); letter-spacing: .08em; text-transform: uppercase; } +.message.user .message-role { color: var(--lime); } +.message-time { color: var(--faint); font: 9px/1 var(--mono); } +.message-content { white-space: pre-wrap; overflow-wrap: anywhere; font-size: 13px; } +.message small { display: block; margin-top: 8px; color: var(--faint); font: 9px/1.2 var(--mono); letter-spacing: .03em; text-transform: none; } +.composer { width: min(100%, 900px); margin: 0 auto; padding: 10px 22px 7px; display: grid; grid-template-columns: minmax(0, 1fr) 106px; gap: 9px; border-top: 1px solid var(--line); background: var(--base); } +.composer-input-wrap { min-width: 0; border: 1px solid var(--line-strong); border-radius: 9px; background: var(--panel-soft); transition: border-color .15s ease, box-shadow .15s ease; } +.composer-input-wrap:focus-within { border-color: var(--blue); box-shadow: 0 0 0 3px rgba(143,199,239,.1); } +.composer textarea { min-height: 46px; max-height: 200px; resize: none; border: 0; background: transparent; } +.composer-hint { display: flex; justify-content: space-between; gap: 12px; padding: 0 12px 7px; color: var(--faint); font: 9px/1 var(--mono); } .composer-hint output { color: var(--muted); white-space: nowrap; } -.composer button { height: 48px; align-self: end; display: inline-flex; align-items: center; justify-content: space-between; gap: 8px; padding-inline: 15px; } -.composer button[aria-busy="true"] { color: #4b432d; background: #ad9353; } -.composer button span:last-child { opacity: .65; font: 16px/1 var(--mono); } -.composer button:disabled { cursor: wait; filter: saturate(.3); } -.media-tools { width: min(100%, 920px); margin: 0 auto; padding: 0 18px 10px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--muted); font: 10px/1 var(--mono); text-transform: uppercase; letter-spacing: .06em; } -.media-tools label { display: inline-flex; align-items: center; gap: 6px; min-height: 30px; padding: 0 8px; border: 1px solid var(--line); color: var(--ink); cursor: pointer; } -.media-tools input { max-width: 150px; font: 10px var(--mono); } -.media-tools span { color: var(--signal); } -.conversation-starters { width: min(100%, 920px); margin: -4px auto 0; padding: 0 18px 18px; display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--muted); font: 10px/1 var(--mono); letter-spacing: .06em; text-transform: uppercase; } -.conversation-starters button { min-height: 32px; padding: 0 10px; border: 1px solid var(--line); color: var(--ink); background: #101814; font: 10px/1 var(--mono); } -.conversation-starters button:hover, .conversation-starters button:focus-visible { border-color: var(--signal); color: var(--signal); outline: none; } -.ai-data-form { margin-top: 24px; } -.ai-data-form textarea { min-height: 150px; resize: vertical; } -.ai-data-form button { width: 100%; min-height: 42px; margin-top: 12px; border: 0; color: #11150f; background: var(--signal); font-weight: 700; } -.ai-data-error { margin: 10px 0 0; color: var(--bad); font-size: 12px; line-height: 1.4; } -.side-console-link { display: flex; justify-content: space-between; margin-top: 26px; padding-top: 16px; border-top: 1px solid var(--line); color: var(--signal) !important; font: 11px/1.3 var(--mono) !important; text-transform: uppercase; letter-spacing: .06em; } -.attention-surface, .history-surface { width: min(100%, 920px); margin: 0 auto; padding: 34px 18px; align-content: start; gap: 18px; } -.surface-heading { display: flex; align-items: end; justify-content: space-between; gap: 16px; border-bottom: 1px solid var(--line); padding-bottom: 16px; } -.surface-heading p { margin: 0; font: 400 36px/.95 var(--serif); } -.surface-heading span, .attention-card small, .history-item span { color: var(--muted); font: 10px/1 var(--mono); text-transform: uppercase; letter-spacing: .1em; } -.surface-heading button { height: 36px; padding: 0 12px; border: 1px solid var(--line); background: transparent; } -.attention-list, .history-list { display: grid; gap: 12px; } -.attention-card, .history-item { border: 1px solid var(--line); background: #0f1613; padding: 16px; } -.attention-card time { color: var(--signal); font: 12px/1 var(--mono); } -.attention-card h2 { margin: 10px 0 8px; font: 400 24px/1.1 var(--serif); } -.attention-card p, .history-item p { margin: 0 0 10px; color: var(--ink); line-height: 1.45; } -.attention-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 14px; } -.attention-actions button { height: 34px; padding: 0 12px; border: 1px solid var(--line); background: #151e1a; color: var(--ink); font: 11px/1 var(--mono); text-transform: uppercase; letter-spacing: .08em; } -.attention-actions button:first-child { border-color: var(--good); color: var(--good); } -.history-item.user { border-color: #34443c; background: #151e1a; } -.history-item strong { display: block; margin-bottom: 8px; color: var(--signal); } -.empty-state { margin: 24px 0 0; color: var(--muted); } +.composer button { height: 46px; align-self: end; display: inline-flex; align-items: center; justify-content: space-between; gap: 7px; padding: 0 13px; } +.composer button[aria-busy="true"] { color: #384529; background: #a6ca7a; } +.composer button span:last-child { opacity: .65; font: 15px/1 var(--mono); } +.composer button:disabled { cursor: wait; filter: saturate(.35); } +.media-tools, .conversation-starters { width: min(100%, 900px); margin: 0 auto; padding: 0 22px 9px; display: flex; flex-wrap: wrap; align-items: center; gap: 6px; color: var(--muted); font: 9px/1 var(--mono); letter-spacing: .03em; text-transform: uppercase; } +.media-tools label { display: inline-flex; align-items: center; gap: 5px; min-height: 28px; margin: 0; padding: 0 7px; border: 1px solid var(--line); border-radius: 6px; color: var(--muted); cursor: pointer; } +.media-tools input { max-width: 125px; font: 9px var(--mono); } +.media-tools span { color: var(--yellow); } +.conversation-starters { margin-top: -2px; padding-bottom: 15px; } +.conversation-starters button { min-height: 29px; padding: 0 9px; border: 1px solid var(--line); border-radius: 6px; color: var(--muted); background: transparent; font: 9px/1 var(--mono); } +.conversation-starters button:hover, .conversation-starters button:focus-visible { border-color: var(--lime); color: var(--lime); outline: none; } +.insight-grid { display: grid; gap: 7px; margin-top: 19px; } +.insight-card { padding: 11px; border: 1px solid var(--line); border-radius: 8px; background: var(--panel-soft); } +.insight-card strong { display: block; margin-top: 7px; color: var(--ink); font-size: 12px; font-weight: 650; line-height: 1.3; } +.insight-card small { display: block; margin-top: 5px; color: var(--faint); font-size: 10px; line-height: 1.35; } +.ai-info-card { padding-bottom: 0; } +.ai-info-card strong { display: block; margin-top: 8px; font-size: 12px; } +.ai-data-form { margin-top: 18px; } +.ai-data-form textarea { min-height: 126px; } +.ai-data-form button { width: 100%; min-height: 38px; margin-top: 9px; border: 1px solid rgba(197,239,145,.3); border-radius: 7px; color: var(--lime); background: rgba(197,239,145,.1); font-size: 11px; font-weight: 700; } +.ai-data-form button:hover { background: rgba(197,239,145,.16); } +.ai-data-error { margin: 9px 0 0; color: var(--bad); font-size: 11px; line-height: 1.4; } +.side-console-link { display: flex; justify-content: space-between; margin-top: 20px; padding-top: 13px; border-top: 1px solid var(--line); color: var(--blue) !important; font: 10px/1.3 var(--mono) !important; text-decoration: none; letter-spacing: .03em; text-transform: uppercase; } +.attention-surface, .history-surface { width: min(100%, 900px); margin: 0 auto; padding: 28px 22px; align-content: start; gap: 15px; } +.surface-heading { display: flex; align-items: end; justify-content: space-between; gap: 16px; border-bottom: 1px solid var(--line); padding-bottom: 13px; } +.surface-heading p { margin: 0; font-size: 27px; font-weight: 680; } +.surface-heading span, .attention-card small, .history-item span { color: var(--muted); font: 9px/1 var(--mono); text-transform: uppercase; letter-spacing: .08em; } +.surface-heading button { height: 31px; padding: 0 10px; border: 1px solid var(--line); background: transparent; font-size: 11px; } +.attention-list, .history-list { display: grid; gap: 9px; } +.attention-card, .history-item { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); padding: 13px; } +.attention-card time { color: var(--yellow); font: 10px/1 var(--mono); } +.attention-card h2 { margin: 8px 0 6px; font-size: 18px; font-weight: 650; } +.attention-card p, .history-item p { margin: 0 0 8px; color: var(--ink); font-size: 12px; line-height: 1.5; } +.attention-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 11px; } +.attention-actions button { height: 30px; padding: 0 10px; border: 1px solid var(--line); background: var(--panel-raised); color: var(--ink); font: 10px/1 var(--mono); } +.attention-actions button:first-child { border-color: rgba(142,215,173,.5); color: var(--good); } +.history-item.user { border-color: #30465b; background: #162231; } +.history-item strong { display: block; margin-bottom: 6px; color: var(--blue); font-size: 12px; } +.empty-state { margin: 20px 0 0; color: var(--muted); font-size: 12px; } .empty-state.error { color: var(--bad); } -@media (max-width: 640px) { +@media (max-width: 780px) { .chat-view { height: auto; min-height: 100vh; overflow: visible; display: block; } + .chat-header { position: sticky; top: 0; z-index: 3; min-height: 58px; padding: 0 12px; } + .chat-header .cognitive-status { flex: 1 1 100px; min-width: 0; max-width: 150px; } + .chat-header .cognitive-console-link, .chat-header > .operator-link, .chat-header .build-meta { display: none; } + .chat-header > #logout { flex: 0 0 34px; } + .chat-layout { height: auto; display: flex; flex-direction: column; } + .chat-main { order: 1; height: 72vh; min-height: 530px; } + .chat-side { min-height: auto; max-height: none; overflow: visible; } + .chat-left { order: 2; border: 0; border-top: 1px solid var(--line); } + .chat-right { order: 3; border: 0; border-top: 1px solid var(--line); } + .messages { padding-inline: 12px; } .composer { grid-template-columns: 1fr; padding-inline: 12px; } .composer button { width: 100%; } .composer-hint { font-size: 8px; } - .conversation-starters { align-items: stretch; } + .media-tools, .conversation-starters { padding-inline: 12px; } .conversation-starters span { width: 100%; } - .chat-header { gap: 10px; padding: 0 12px; } - .chat-header .cognitive-status { display: inline-flex; flex: 1 1 110px; min-width: 0; max-width: 110px; overflow: hidden; text-overflow: ellipsis; } - .chat-header .cognitive-console-link { flex: 0 1 110px; min-width: 0; overflow: hidden; text-overflow: ellipsis; } - .chat-header > .operator-link, .build-meta { display: none; } - .chat-header > #logout { flex: 0 0 38px; } + .side-build { display: none; } +} +@media (max-width: 640px) { .chat-layout { height: auto; display: block; } - .chat-layout { display: flex; flex-direction: column; } - .chat-main { order: 1; } - .chat-side, .chat-main { min-height: auto; max-height: none; overflow: visible; } - .chat-left, .chat-right { border: 0; border-bottom: 1px solid var(--line); } - .chat-left { order: 2; } - .chat-right { order: 3; } - .chat-main { height: 70vh; min-height: 520px; } - .chat-left { padding-bottom: 20px; } - .chat-right { padding-top: 20px; } - .operator-link, .nav-tab { padding: 0 9px; } + .chat-header > .operator-link, .build-meta { display: none; } + .chat-header .cognitive-console-link { flex: 0 1 110px; min-width: 0; overflow: hidden; text-overflow: ellipsis; } } -@media (min-width: 641px) and (max-width: 1100px) { - .chat-layout { grid-template-columns: 210px minmax(0, 1fr) 245px; } +@media (min-width: 781px) and (max-width: 1100px) { + .chat-layout { grid-template-columns: 218px minmax(0, 1fr) 260px; } .chat-side { padding-inline: 14px; } - .side-intro h1, .side-intro h2 { font-size: 30px; } } diff --git a/cmd/creator-web/static/assets/chat.js b/cmd/creator-web/static/assets/chat.js index a9bb14d..7787e76 100644 --- a/cmd/creator-web/static/assets/chat.js +++ b/cmd/creator-web/static/assets/chat.js @@ -10,6 +10,8 @@ const sendLabel = document.querySelector("#send-label"); const messageCount = document.querySelector("#message-count"); const logoutButton = document.querySelector("#logout"); const activeFocus = document.querySelector("#active-focus"); +const rightFocus = document.querySelector("#right-focus"); +const newConversationButton = document.querySelector(".new-conversation"); const cognitiveStatus = document.querySelector("#cognitive-status"); const cognitiveConsoleLink = document.querySelector("#cognitive-console-link"); const todayList = document.querySelector("#today-list"); @@ -154,6 +156,19 @@ function updateActiveFocus(value, provenance = "") { if (!activeFocus) return; activeFocus.textContent = value ? `Сейчас обсуждаем: ${value}` : ""; activeFocus.hidden = !value; + if (rightFocus) rightFocus.textContent = value || "не выбран"; +} + +if (newConversationButton) { + newConversationButton.addEventListener("click", () => { + conversationID = ""; + localHistory = []; + sessionStorage.removeItem("domovoy.chat.conversation"); + messages.replaceChildren(); + updateActiveFocus(""); + appendMessage("assistant", "Новый разговор готов. Чем займёмся?"); + messageInput.focus(); + }); } async function api(path, options = {}) { diff --git a/cmd/creator-web/static/chat.html b/cmd/creator-web/static/chat.html index f494e27..0018d71 100644 --- a/cmd/creator-web/static/chat.html +++ b/cmd/creator-web/static/chat.html @@ -38,20 +38,30 @@
@@ -85,9 +95,15 @@
-