Files
DemonGatanjieu-Anomalous_Mo…/web/styles/40-ai-side.css
T
DemonGatanjieuandClaude Opus 5.5 d778aec946 Fix what a walk through every page found before 1.63
Every page in both languages, all themes and at 480:
- Give the window its own text colour: text with none took ComfyUI's, white on the light theme (Tidy headings and file names, the site chip).
- Keep a task's link chip in its row, its x in reach, and colour the next-task chip.
- Let choices in Settings wrap, the Models search shrink, and a workflow's preset row go to two lines.
- Add --amb-on-link for text on the accent: pale in the dark themes, so white was hard to read.
- Lists and colons follow the language (listSeparator, wordColon); tests/words_in_language.mjs keeps it so.
- Right plurals in English, "AI" on the rail, one line left in Chinese translated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 03:18:07 +08:00

614 lines
17 KiB
CSS

/* The AI workbench's stage (ui_ai_side.js): the panels on the right, the tabs of a narrow window,
the task list folded away. The side column is as wide as its grip set (--ai-side-w). */
.anomalous-ai.has-stage {
grid-template-columns: minmax(200px, 250px) minmax(0, 1fr) var(--ai-side-w, 440px);
}
.anomalous-ai.tasks-collapsed {
grid-template-columns: minmax(0, 1fr);
}
.anomalous-ai.tasks-collapsed.has-stage {
grid-template-columns: minmax(0, 1fr) var(--ai-side-w, 440px);
}
/* Folded away, the task list stays laid out out of sight (45-ai-side-views.css slides it in), so
bringing it back has nothing to lay out first. */
.anomalous-ai.tasks-collapsed:not(.is-narrow) .anomalous-ai-tasks {
position: absolute;
z-index: 30;
top: 8px;
bottom: 8px;
left: 8px;
width: 270px;
border: 1px solid var(--amb-border);
border-radius: 14px;
background: var(--amb-bg-panel);
box-shadow: 0 18px 50px rgba(0, 0, 0, 0.45);
opacity: 0;
visibility: hidden;
transform: translateX(-14px);
transition: opacity 0.1s linear, transform 0.12s ease-out, visibility 0s linear 0.12s;
will-change: transform;
}
/* Too narrow for three columns: the timeline and the stage take turns in one. */
.anomalous-ai.is-tabbed {
grid-template-columns: minmax(200px, 250px) minmax(0, 1fr);
}
.anomalous-ai.is-tabbed.tasks-collapsed,
.anomalous-ai.is-tabbed.is-narrow {
grid-template-columns: minmax(0, 1fr);
}
.anomalous-ai.is-tabbed .anomalous-ai-stage {
grid-column: -2 / -1;
grid-row: 1;
}
.anomalous-ai.is-tabbed:not(.shows-stage) .anomalous-ai-stage,
.anomalous-ai.is-tabbed.shows-stage .anomalous-ai-task,
.anomalous-ai:not(.has-stage) .anomalous-ai-stage,
.anomalous-ai.is-narrow:not(.shows-task, .peeks) .anomalous-ai-stage {
display: none;
}
/* No room for the column (ui_ai_workbench.js layout): the timeline and every view as tabs with words. */
.anomalous-ai-tabs {
display: none;
flex-wrap: wrap;
gap: 2px;
margin-bottom: 8px;
padding: 3px;
border: 1px solid var(--amb-border);
border-radius: 9px;
background: rgba(var(--amb-ink-rgb), 0.04);
}
.anomalous-ai.uses-tabs .anomalous-ai-tabs { display: flex; }
.anomalous-ai-tabs .anomalous-ai-side-btn { flex: 1 1 auto; justify-content: center; padding: 5px 8px; }
.anomalous-ai-tabs .anomalous-ai-side-btn .anomalous-tb-icon { display: none; }
.anomalous-ai-tabs .anomalous-ai-side-btn-label { display: inline; }
/* The tabs say what is shown and lead away from it. */
.anomalous-ai.uses-tabs .anomalous-ai-stage-title,
.anomalous-ai.uses-tabs .anomalous-ai-stage-close { display: none; }
/* ---------- the stage ---------- */
.anomalous-ai-stage {
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
min-height: 0;
margin: 10px 10px 10px 14px; /* the gap on the left is the grip's (45-ai-side-views.css) */
padding: 16px 18px 18px;
border: 1px solid var(--amb-border);
border-radius: 14px;
background: linear-gradient(180deg, color-mix(in srgb, #a487f5 5%, transparent), transparent 220px), rgba(var(--amb-ink-rgb), 0.025);
box-shadow: 0 8px 28px rgba(0, 0, 0, 0.18);
}
.anomalous-ai.is-tabbed .anomalous-ai-stage {
margin: 0;
border: none;
border-radius: 0;
background: none;
box-shadow: none;
}
.anomalous-ai-stage-head {
display: flex;
align-items: center;
gap: 8px;
margin-bottom: 12px;
}
.anomalous-ai-stage-title {
color: var(--amb-text-main);
font-size: 14px;
font-weight: 700;
}
.anomalous-ai-gap {
flex: 1;
}
.anomalous-ai-stage-count {
color: var(--amb-text-soft);
font-size: 12px;
}
.anomalous-ai-stage-close {
flex: 0 0 30px;
height: 30px;
padding: 0;
border: none;
border-radius: 7px;
background: transparent;
color: var(--amb-text-soft);
font: inherit;
font-size: 22px;
cursor: pointer;
}
.anomalous-ai-stage-close:hover,
.anomalous-ai-stage-close:focus-visible {
background: rgba(var(--amb-ink-rgb), 0.08);
color: var(--amb-text-main);
}
/* Whether a new panel opens the column (ui_ai_side.js autoSwitch). */
.anomalous-ai-stage-auto {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 6px;
border: none;
border-radius: 7px;
background: none;
color: var(--amb-text-dim);
font: inherit;
font-size: 11.5px;
cursor: pointer;
}
.anomalous-ai-stage-auto:hover, .anomalous-ai-stage-auto:focus-visible { background: rgba(var(--amb-ink-rgb), 0.06); color: var(--amb-text-main); }
.anomalous-ai-stage-auto-track {
position: relative;
flex: none;
width: 26px;
height: 15px;
border-radius: 999px;
background: rgba(var(--amb-ink-rgb), 0.18);
transition: background 0.15s;
}
.anomalous-ai-stage-auto-track::after {
content: '';
position: absolute;
top: 2px;
left: 2px;
width: 11px;
height: 11px;
border-radius: 50%;
background: #fff;
transition: transform 0.15s;
}
.anomalous-ai-stage-auto.is-on .anomalous-ai-stage-auto-track { background: #a487f5; }
.anomalous-ai-stage-auto.is-on .anomalous-ai-stage-auto-track::after { transform: translateX(11px); }
.anomalous-ai.is-tabbed .anomalous-ai-stage-auto-label { display: none; }
.anomalous-ai-stage-new {
padding: 4px 10px;
border: none;
border-radius: 999px;
background: var(--amb-btn-primary-bg, var(--amb-link));
color: var(--amb-btn-primary-text, #fff);
font: inherit;
font-size: 12px;
cursor: pointer;
}
/* The panels one under the other, oldest first, each with its step's number. */
.anomalous-ai-stage-body {
display: flex;
flex-direction: column;
gap: 18px;
}
.anomalous-ai-stage-item {
display: flex;
flex-direction: column;
gap: 6px;
border-radius: 16px;
}
.anomalous-ai-stage-item-step {
color: var(--amb-text-dim);
font-size: 11.5px;
font-weight: 600;
}
.anomalous-ai-stage-item.is-flash > .anomalous-ai-panel {
animation: anomalous-ai-flash 1.2s ease-out;
}
@keyframes anomalous-ai-flash {
0% { box-shadow: 0 0 0 3px color-mix(in srgb, var(--amb-link) 70%, transparent); }
100% { box-shadow: 0 10px 30px rgba(0, 0, 0, 0.18); }
}
.anomalous-ai-stage-body {
flex: 1;
min-height: 0;
overflow-y: auto;
padding: 2px 2px 20px;
}
.anomalous-ai-stage-empty {
padding: 30px 0;
color: var(--amb-text-dim);
font-size: 13px;
text-align: center;
}
/* ---------- a panel's card in the timeline (ui_ai_side.js panelLine) ---------- */
.anomalous-ai-panel-line {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px 10px;
padding: 8px 10px;
border: 1px solid color-mix(in srgb, #a487f5 40%, transparent);
border-radius: 10px;
background: color-mix(in srgb, #a487f5 8%, transparent);
color: var(--amb-text-main);
cursor: pointer;
}
.anomalous-ai-panel-line:hover {
background: color-mix(in srgb, #a487f5 14%, transparent);
}
.anomalous-ai-panel-line.is-shown {
border-color: color-mix(in srgb, var(--amb-ok) 60%, transparent);
}
.anomalous-ai-panel-line-icon {
display: inline-flex;
flex: none;
align-items: center;
justify-content: center;
width: 34px;
height: 34px;
border-radius: 8px;
background: color-mix(in srgb, #a487f5 16%, transparent);
color: #b9a3f7;
}
.anomalous-ai-panel-line-words {
display: flex;
flex: 1 1 140px;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.anomalous-ai-panel-line-title {
overflow: hidden;
font-size: 13px;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.anomalous-ai-panel-line-gist {
color: var(--amb-text-dim);
font-size: 11.5px;
}
/* The way to the right: the stage's colour, an icon of the column; "on the right now" while its panel is in view there. */
.anomalous-ai-side-open {
display: inline-flex;
flex: none;
align-items: center;
gap: 6px;
padding: 5px 12px;
border: 1px solid color-mix(in srgb, #a487f5 70%, transparent);
border-radius: 999px;
background: color-mix(in srgb, #a487f5 22%, transparent);
color: var(--amb-text-main);
font: inherit;
font-size: 12px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s;
}
.anomalous-ai-side-open:hover,
.anomalous-ai-side-open:focus-visible {
background: color-mix(in srgb, #a487f5 38%, transparent);
}
.anomalous-ai-side-open .anomalous-tb-icon { display: inline-flex; }
.anomalous-ai-panel-line-here {
display: none;
flex: none;
align-items: center;
gap: 6px;
color: var(--amb-ok);
font-size: 12px;
}
.anomalous-ai-panel-line-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--amb-ok);
}
.anomalous-ai-panel-line.is-shown .anomalous-ai-side-open { display: none; }
.anomalous-ai-panel-line.is-shown .anomalous-ai-panel-line-here { display: inline-flex; }
.anomalous-ai-panel-line-asks {
padding: 1px 8px;
border-radius: 999px;
background: color-mix(in srgb, var(--amb-warn) 20%, transparent);
color: var(--amb-warn-text);
font-size: 11px;
}
/* ---------- new task, the ways in, which AI came last ---------- */
.anomalous-ai-tasks-actions {
display: flex;
flex-direction: column;
gap: 8px;
padding: 0 14px 12px;
}
.anomalous-ai-new-task {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 7px;
height: 36px;
padding: 0 16px;
border: 0;
border-radius: 10px;
background: var(--amb-btn-primary-bg, var(--amb-link));
color: var(--amb-btn-primary-text, #fff);
font: inherit;
font-size: 13px;
font-weight: 700;
cursor: pointer;
transition: filter 0.15s, transform 0.15s;
}
.anomalous-ai-new-task:hover { filter: brightness(1.08); transform: translateY(-1px); }
.anomalous-ai-tasks-ways { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.anomalous-ai-way {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 6px;
height: 30px;
border: 1px solid var(--amb-border);
border-radius: 9px;
background: none;
color: var(--amb-text-soft);
font: inherit;
font-size: 12.5px;
cursor: pointer;
}
.anomalous-ai-way:hover { border-color: var(--amb-border-strong); background: rgba(var(--amb-ink-rgb), 0.06); color: var(--amb-text-main); }
.anomalous-ai-visit { display: flex; align-items: center; gap: 7px; min-width: 0; color: var(--amb-text-dim); font-size: 11.5px; }
.anomalous-ai-visit-dot { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--amb-text-dim); opacity: 0.6; }
.anomalous-ai-visit.is-known .anomalous-ai-visit-dot { background: var(--amb-ok); opacity: 1; }
.anomalous-ai-visit-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.anomalous-ai-state-icon.is-waiting {
background: color-mix(in srgb, var(--amb-link) 20%, transparent);
color: var(--amb-link);
}
/* A task waiting for an AI (ui_ai_ready.js): one thing to do, in the middle of the column. */
.anomalous-ai-waiting {
display: flex;
flex-direction: column;
align-items: center;
width: 100%;
max-width: 600px;
margin: clamp(16px, 9vh, 72px) auto 0;
text-align: center;
}
.anomalous-ai-waiting-art { flex: none; width: 104px; height: 104px; object-fit: contain; animation: anomalous-ai-waiting-float 4s ease-in-out infinite; }
@keyframes anomalous-ai-waiting-float { 50% { transform: translateY(-6px); } }
.anomalous-ai-waiting-title {
margin-top: 10px;
color: var(--amb-text-main);
font-size: 20px;
font-weight: 800;
}
.anomalous-ai-waiting-body {
margin: 6px 0 18px;
color: var(--amb-text-soft);
font-size: 13.5px;
line-height: 1.7;
}
.anomalous-ai-waiting > .anomalous-ai-hint { width: 100%; margin-bottom: 22px; }
.anomalous-ai-waiting > .anomalous-ai-copy { flex-direction: column; gap: 14px; width: 100%; padding: 16px 18px; border-radius: 14px; }
.anomalous-ai-waiting > .anomalous-ai-copy .anomalous-ai-copy-text { flex: none; width: 100%; color: var(--amb-text-soft); word-break: normal; overflow-wrap: anywhere; }
.anomalous-ai-waiting > .anomalous-ai-copy .anomalous-ai-copy-button { justify-content: center; min-width: 200px; height: 40px; padding: 0 22px; font-size: 14px; font-weight: 700; }
.anomalous-ai-ready-label { color: var(--amb-text-dim); font-size: 12px; font-weight: 650; }
.anomalous-ai-ready-done { display: flex; flex-direction: column; gap: 8px; width: 100%; min-width: 0; margin-top: 24px; text-align: left; }
/* The card for an AI not connected yet (ui_ai_connect.js connectHint). */
.anomalous-ai-hint {
display: flex;
flex-direction: column;
gap: 14px;
padding: 16px 18px;
border: 1px solid color-mix(in srgb, var(--amb-link) 30%, var(--amb-border));
border-radius: 16px;
background: color-mix(in srgb, var(--amb-link) 7%, transparent);
text-align: left;
}
.anomalous-ai-hint-row { display: flex; align-items: center; gap: 18px; }
.anomalous-ai-hint-art { flex: none; width: 132px; height: 88px; object-fit: contain; }
.anomalous-ai-hint-words { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; min-width: 0; }
.anomalous-ai-hint-title { color: var(--amb-text-main); font-size: 14.5px; font-weight: 700; }
.anomalous-ai-hint-body { margin: 0; color: var(--amb-text-soft); font-size: 12.5px; line-height: 1.65; }
.anomalous-ai-hint-open {
display: inline-flex;
align-items: center;
gap: 6px;
height: 30px;
margin-top: 2px;
padding: 0 12px;
border: 1px solid color-mix(in srgb, var(--amb-link) 55%, transparent);
border-radius: 9px;
background: color-mix(in srgb, var(--amb-link) 14%, transparent);
color: var(--amb-text-main);
font: inherit;
font-size: 12.5px;
cursor: pointer;
}
.anomalous-ai-hint-open:hover { background: color-mix(in srgb, var(--amb-link) 24%, transparent); }
.anomalous-ai-hint-guide { padding-top: 14px; border-top: 1px solid var(--amb-border); }
@media (max-width: 640px) {
.anomalous-ai-hint-row { flex-direction: column; text-align: center; }
.anomalous-ai-hint-words { align-items: center; }
}
@media (prefers-reduced-motion: reduce) { .anomalous-ai-waiting-art { animation: none; } }
.anomalous-ai-connect {
display: flex;
flex-direction: column;
gap: 8px;
text-align: left;
}
.anomalous-ai-connect-step,
.anomalous-ai-connect-app {
margin-top: 4px;
color: var(--amb-text-main);
font-size: 12.5px;
font-weight: 600;
}
.anomalous-ai-connect-app {
font-weight: 500;
color: var(--amb-text-soft);
}
.anomalous-ai-connect-note {
color: var(--amb-text-dim);
font-size: 12px;
line-height: 1.6;
}
.anomalous-ai-connect-apps > summary {
color: var(--amb-link);
font-size: 12.5px;
cursor: pointer;
}
.anomalous-ai-connect-apps > summary:hover { text-decoration: underline; }
.anomalous-ai-connect-apps[open] {
display: flex;
flex-direction: column;
gap: 6px;
}
.anomalous-ai-copy {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 10px;
border: 1px solid var(--amb-border);
border-radius: 8px;
background: rgba(var(--amb-ink-rgb), 0.05);
}
.anomalous-ai-copy-text {
flex: 1;
min-width: 0;
color: var(--amb-text-main);
font-size: 12.5px;
line-height: 1.6;
word-break: break-all;
}
.anomalous-ai-copy.is-rules { align-items: flex-start; }
.anomalous-ai-copy.is-rules .anomalous-ai-copy-text { white-space: pre-line; word-break: normal; overflow-wrap: anywhere; }
.anomalous-ai-copy.is-code .anomalous-ai-copy-text {
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
font-size: 12px;
}
.anomalous-ai-copy-button {
display: inline-flex;
flex: none;
align-items: center;
gap: 6px;
height: 32px;
padding: 0 12px;
border: 0;
border-radius: 9px;
background: var(--amb-link);
color: var(--amb-on-link);
font: inherit;
font-size: 12.5px;
font-weight: 600;
cursor: pointer;
transition: filter 0.15s, background 0.15s;
}
.anomalous-ai-copy-button:hover { filter: brightness(1.15); box-shadow: 0 0 0 3px color-mix(in srgb, var(--amb-link) 28%, transparent); }
.anomalous-ai-copy-button.is-done { background: var(--amb-ok); }
.anomalous-ai-connect-overlay {
position: fixed;
inset: 0;
z-index: 1000001; /* as ui_dialog.js's dialogs: above the image inspector it can open from (Hand to AI) */
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
background: var(--amb-scrim, rgba(0, 0, 0, 0.55));
}
.anomalous-ai-connect-dialog {
display: flex;
flex-direction: column;
gap: 10px;
width: min(620px, 100%);
max-height: 88vh;
overflow-y: auto;
padding: 20px 22px;
border: 1px solid var(--amb-border-strong);
border-radius: 16px;
background: var(--amb-bg-dialog, var(--amb-bg-panel, #17171c));
color: var(--amb-text-main);
}
.anomalous-ai-connect-head {
display: flex;
align-items: center;
justify-content: space-between;
}
.anomalous-ai-connect-title {
font-size: 16px;
font-weight: 700;
}
.anomalous-ai-connect-close {
border: none;
background: none;
color: var(--amb-text-soft);
font-size: 20px;
cursor: pointer;
}
.anomalous-ai-welcome .anomalous-ai-hint { width: 100%; }