diff --git a/cmd/creator-web/static/assets/console.css b/cmd/creator-web/static/assets/console.css index 6fe659a..ab3858f 100644 --- a/cmd/creator-web/static/assets/console.css +++ b/cmd/creator-web/static/assets/console.css @@ -1,12 +1,12 @@ :root { - --ink: #e9eee7; - --muted: #8c9a91; - --faint: #58645d; - --base: #0b100e; - --panel: #101714; - --panel-high: #151e1a; - --line: #2a352f; - --line-soft: #1d2822; + --ink: #eef2ec; + --muted: #a7b2aa; + --faint: #718078; + --base: #0f1512; + --panel: #17201b; + --panel-high: #202b25; + --line: #34423a; + --line-soft: #26332c; --signal: #c9a85f; --signal-bright: #e7c97b; --good: #78c6a3; @@ -22,12 +22,12 @@ * { box-sizing: border-box; } [hidden] { display: none !important; } html { background: var(--base); color: var(--ink); font-family: var(--sans); } -body { margin: 0; min-width: 320px; min-height: 100vh; background: radial-gradient(circle at 73% -10%, rgba(83, 123, 101, .15), transparent 38%), var(--base); } +body { margin: 0; min-width: 320px; min-height: 100vh; background: radial-gradient(circle at 73% -10%, rgba(83, 123, 101, .13), transparent 38%), var(--base); } button, input, textarea { font: inherit; } button { color: inherit; } button:focus-visible, input:focus-visible, textarea:focus-visible { outline: 2px solid var(--signal-bright); outline-offset: 3px; } -.grain { position: fixed; inset: 0; pointer-events: none; opacity: .18; z-index: 10; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.16'/%3E%3C/svg%3E"); } +.grain { position: fixed; inset: 0; pointer-events: none; opacity: .045; z-index: 10; background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.16'/%3E%3C/svg%3E"); } .eyebrow, .rail-index { margin: 0 0 12px; color: var(--signal); font: 600 11px/1 var(--mono); letter-spacing: .18em; text-transform: uppercase; } .login-shell { min-height: 100vh; display: grid; place-items: center; padding: 32px 20px; position: relative; overflow: hidden; } @@ -90,9 +90,9 @@ button:focus-visible, input:focus-visible, textarea:focus-visible { outline: 2px .session-stamp span { margin-top: 8px; color: var(--faint); font: 9px/1 var(--mono); letter-spacing: .14em; } .session-stamp strong { overflow: hidden; color: var(--muted); font: 10px/1.4 var(--mono); text-overflow: ellipsis; } -.workspace { grid-column: 2; grid-row: 2; padding: clamp(28px, 4vw, 58px); min-width: 0; } +.workspace { grid-column: 2; grid-row: 2; width: min(100%, 1740px); justify-self: start; padding: 42px clamp(24px, 3vw, 48px) 64px; min-width: 0; } .workspace-head { display: flex; align-items: end; justify-content: space-between; gap: 24px; margin-bottom: 34px; } -.workspace-head h1 { margin: 0; font: 400 clamp(36px, 5vw, 58px)/1 var(--serif); letter-spacing: -.035em; } +.workspace-head h1 { margin: 0; font: 400 clamp(34px, 4vw, 50px)/1 var(--serif); letter-spacing: -.035em; } .last-update { color: var(--faint); font: 10px/1.4 var(--mono); text-align: right; } .signal-strip { display: grid; grid-template-columns: repeat(4, 1fr); margin-bottom: 18px; border: 1px solid var(--line); background: var(--panel); } .signal-strip div { padding: 16px 18px; display: flex; align-items: center; justify-content: space-between; gap: 12px; border-right: 1px solid var(--line); } diff --git a/cmd/creator-web/static/assets/console.js b/cmd/creator-web/static/assets/console.js index 3eb6830..8e88043 100644 --- a/cmd/creator-web/static/assets/console.js +++ b/cmd/creator-web/static/assets/console.js @@ -65,7 +65,9 @@ async function request(path, options = {}) { } if (!response.ok) { const detail = (await response.text()).trim(); - throw new Error(detail || `Ошибка ${response.status}`); + const error = new Error(detail || `Ошибка ${response.status}`); + error.status = response.status; + throw error; } return response.json(); } @@ -335,8 +337,9 @@ async function runDiagnostics() { try { await run(); return {label, key, state: "ok", detail: `Ответ получен · ${Math.round(performance.now() - started)} мс`}; - } catch (_) { - return {label, key, state: "error", detail: "Сервис или контекст недоступен"}; + } catch (error) { + const detail = error?.status === 400 ? "Нужны параметры рабочего контекста" : error?.status === 401 ? "Сессия истекла" : error?.status >= 500 ? "Сервис временно недоступен" : "Проверка не пройдена"; + return {label, key, state: "error", detail}; } })); list.replaceChildren(...results.map((result) => createDiagnosticItem(result.label, result.key, result.state, result.detail)));