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>
572 lines
13 KiB
CSS
572 lines
13 KiB
CSS
/* The current-node panel (Node Assistant): one scrolling body of sections; prompts; the parameters
|
|
(saved sets as cards with their picture and source, or side by side). */
|
|
|
|
.anomalous-node-body {
|
|
display: flex;
|
|
flex: 1;
|
|
flex-direction: column;
|
|
min-height: 0;
|
|
overflow-y: auto;
|
|
padding-bottom: 16px;
|
|
}
|
|
|
|
.anomalous-node-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
margin: 14px 16px 0;
|
|
}
|
|
|
|
.anomalous-node-section-head {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 8px;
|
|
}
|
|
|
|
.anomalous-node-section-head h3 {
|
|
margin: 0;
|
|
color: var(--amb-text-muted);
|
|
font-size: 10px;
|
|
font-weight: 750;
|
|
letter-spacing: 0.1em;
|
|
text-transform: uppercase;
|
|
}
|
|
|
|
.anomalous-node-section-btn {
|
|
padding: 4px 10px;
|
|
border: 1px solid var(--amb-border-strong);
|
|
border-radius: 999px;
|
|
background: transparent;
|
|
color: var(--amb-text-soft);
|
|
font-size: 11.5px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-section-btn:hover {
|
|
border-color: color-mix(in srgb, var(--amb-link) 45%, transparent);
|
|
color: var(--amb-text-main);
|
|
}
|
|
|
|
.anomalous-node-param-search {
|
|
padding: 7px 10px;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 8px;
|
|
background: var(--amb-lt-sunken, rgba(0, 0, 0, 0.25));
|
|
color: var(--amb-text-main);
|
|
font-size: 12px;
|
|
}
|
|
|
|
.anomalous-node-param-tools {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
}
|
|
|
|
/* Cards or side by side. */
|
|
.anomalous-node-param-views {
|
|
display: inline-flex;
|
|
padding: 2px;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 999px;
|
|
}
|
|
|
|
.anomalous-node-param-views[hidden] { display: none; }
|
|
|
|
.anomalous-node-param-view {
|
|
padding: 3px 10px;
|
|
border: none;
|
|
border-radius: 999px;
|
|
background: transparent;
|
|
color: var(--amb-text-muted);
|
|
font-size: 11px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-param-view:hover { color: var(--amb-text-main); }
|
|
|
|
.anomalous-node-param-view.is-on {
|
|
background: color-mix(in srgb, var(--amb-link) 18%, transparent);
|
|
color: var(--amb-text-main);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.anomalous-node-param-list {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 8px;
|
|
}
|
|
|
|
/* On top: the set last put into this node and what changed since, or the set the values match. */
|
|
.anomalous-node-param-history {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
gap: 4px 8px;
|
|
padding: 9px 12px;
|
|
border: 1px solid color-mix(in srgb, var(--amb-link) 30%, var(--amb-border));
|
|
border-radius: 10px;
|
|
background: color-mix(in srgb, var(--amb-link) 7%, transparent);
|
|
color: var(--amb-text-muted);
|
|
font-size: 12px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.anomalous-node-param-history > .anomalous-node-param-icon {
|
|
width: 15px;
|
|
height: 15px;
|
|
color: var(--amb-link);
|
|
}
|
|
|
|
.anomalous-node-param-history-main { color: var(--amb-text-main); }
|
|
.anomalous-node-param-history-note.is-same { color: var(--amb-ok-text); }
|
|
.anomalous-node-param-history > .anomalous-node-param-link { margin-left: auto; }
|
|
|
|
/* The card (or column) of the set last put in. */
|
|
.anomalous-node-param-last {
|
|
flex-shrink: 0;
|
|
padding: 1px 7px;
|
|
border-radius: 999px;
|
|
background: color-mix(in srgb, var(--amb-link) 18%, transparent);
|
|
color: var(--amb-text-main);
|
|
font-size: 10px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.anomalous-node-param-table .anomalous-node-param-last {
|
|
display: inline-block;
|
|
margin-top: 3px;
|
|
}
|
|
|
|
.anomalous-node-param {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 10px;
|
|
padding: 12px;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 10px;
|
|
background: rgba(var(--amb-ink-rgb), 0.035);
|
|
}
|
|
|
|
/* The picture made with the values, and where they came from. */
|
|
.anomalous-node-param-top {
|
|
display: flex;
|
|
gap: 12px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.anomalous-node-param-thumb {
|
|
display: grid;
|
|
flex-shrink: 0;
|
|
place-items: center;
|
|
width: 52px;
|
|
height: 68px;
|
|
padding: 0;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 8px;
|
|
background: rgba(var(--amb-ink-rgb), 0.05);
|
|
color: var(--amb-text-dim);
|
|
overflow: hidden;
|
|
cursor: zoom-in;
|
|
}
|
|
|
|
.anomalous-node-param-thumb.is-empty { cursor: default; }
|
|
|
|
.anomalous-node-param-thumb > img {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
|
|
.anomalous-node-param-thumb > .anomalous-node-param-icon {
|
|
width: 20px;
|
|
height: 20px;
|
|
}
|
|
|
|
.anomalous-node-param-main {
|
|
display: flex;
|
|
flex: 1;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.anomalous-node-param-head {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.anomalous-node-param-name {
|
|
overflow: hidden;
|
|
color: var(--amb-text-main);
|
|
font-size: 13px;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.anomalous-node-param-role {
|
|
flex-shrink: 0;
|
|
padding: 1px 7px;
|
|
border-radius: 999px;
|
|
background: rgba(var(--amb-ink-rgb), 0.06);
|
|
color: var(--amb-link);
|
|
font-size: 10px;
|
|
}
|
|
|
|
.anomalous-node-param-role.is-positive { color: var(--amb-ok-text); }
|
|
.anomalous-node-param-role.is-negative { color: var(--amb-danger-text); }
|
|
|
|
.anomalous-node-param-icon {
|
|
display: inline-flex;
|
|
flex-shrink: 0;
|
|
width: 13px;
|
|
height: 13px;
|
|
}
|
|
|
|
.anomalous-node-param-icon > svg {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
/* Where a set came from: a chip per channel, each its own colour. */
|
|
.anomalous-node-param-sources {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
gap: 6px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.anomalous-node-param-source {
|
|
--source: var(--amb-text-soft);
|
|
display: inline-flex;
|
|
align-items: center;
|
|
gap: 4px;
|
|
height: 22px;
|
|
padding: 0 8px;
|
|
border: 1px solid color-mix(in srgb, var(--source) 35%, transparent);
|
|
border-radius: 7px;
|
|
background: color-mix(in srgb, var(--source) 12%, transparent);
|
|
color: var(--amb-text-main);
|
|
font: inherit;
|
|
font-size: 11.5px;
|
|
}
|
|
|
|
.anomalous-node-param-source.is-workflow { --source: var(--amb-link); }
|
|
.anomalous-node-param-source.is-combo { --source: var(--amb-warn); }
|
|
.anomalous-node-param-source.is-picture { --source: var(--amb-ok); }
|
|
.anomalous-node-param-source > .anomalous-node-param-icon { color: var(--source); }
|
|
button.anomalous-node-param-source { cursor: pointer; }
|
|
button.anomalous-node-param-source:hover { background: color-mix(in srgb, var(--source) 24%, transparent); }
|
|
.anomalous-node-param-source-count { font-weight: 700; }
|
|
.anomalous-node-param-source-go { color: var(--amb-text-soft); }
|
|
.anomalous-node-param-day { color: var(--amb-text-dim); font-size: 11px; }
|
|
|
|
.anomalous-node-param-link {
|
|
flex-shrink: 0;
|
|
padding: 0;
|
|
border: none;
|
|
background: none;
|
|
color: var(--amb-link);
|
|
font: inherit;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-param-link:hover {
|
|
text-decoration: underline;
|
|
text-underline-offset: 2px;
|
|
}
|
|
|
|
/* The values: the name, then a picture of the change (two bars for numbers, old → new otherwise). */
|
|
.anomalous-node-param-rows {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
}
|
|
|
|
.anomalous-node-param-row {
|
|
display: grid;
|
|
grid-template-columns: minmax(56px, 112px) minmax(48px, 200px) auto;
|
|
justify-content: start;
|
|
align-items: center;
|
|
gap: 10px;
|
|
min-width: 0;
|
|
color: var(--amb-text-soft);
|
|
font-size: 11.5px;
|
|
}
|
|
|
|
.anomalous-node-param-row.is-kept,
|
|
.anomalous-node-param-row.is-same {
|
|
grid-template-columns: minmax(56px, 112px) minmax(0, 1fr);
|
|
justify-content: stretch;
|
|
color: var(--amb-text-dim);
|
|
}
|
|
|
|
.anomalous-node-param-label {
|
|
overflow: hidden;
|
|
color: var(--amb-text-muted);
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.anomalous-node-param-bars {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 3px;
|
|
min-width: 40px;
|
|
}
|
|
|
|
.anomalous-node-param-bar {
|
|
height: 5px;
|
|
border-radius: 3px;
|
|
}
|
|
|
|
.anomalous-node-param-bar.is-now { background: rgba(var(--amb-ink-rgb), 0.22); }
|
|
.anomalous-node-param-bar.is-then { background: var(--amb-link); }
|
|
|
|
.anomalous-node-param-nums {
|
|
font-variant-numeric: tabular-nums;
|
|
white-space: nowrap;
|
|
}
|
|
|
|
.anomalous-node-param-nums > .is-now { color: var(--amb-text-dim); }
|
|
|
|
.anomalous-node-param-nums > strong {
|
|
color: var(--amb-text-main);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.anomalous-node-param-trend {
|
|
margin-left: 3px;
|
|
color: var(--amb-link);
|
|
}
|
|
|
|
.anomalous-node-param-swap {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
grid-column: 2 / -1;
|
|
align-items: center;
|
|
gap: 5px;
|
|
min-width: 0;
|
|
color: var(--amb-text-dim);
|
|
}
|
|
|
|
.anomalous-node-param-pill {
|
|
max-width: 100%;
|
|
padding: 1px 8px;
|
|
border-radius: 999px;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.anomalous-node-param-pill.is-now {
|
|
background: rgba(var(--amb-ink-rgb), 0.06);
|
|
color: var(--amb-text-dim);
|
|
text-decoration: line-through;
|
|
}
|
|
|
|
.anomalous-node-param-pill.is-then {
|
|
background: color-mix(in srgb, var(--amb-link) 16%, transparent);
|
|
color: var(--amb-text-main);
|
|
}
|
|
|
|
.anomalous-node-param-quiet {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 5px;
|
|
min-width: 0;
|
|
overflow: hidden;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
/* The one line on what stays, across the whole row. */
|
|
.anomalous-node-param-quiet:only-child {
|
|
grid-column: 1 / -1;
|
|
white-space: normal;
|
|
}
|
|
|
|
.anomalous-node-muted {
|
|
margin: 0;
|
|
color: var(--amb-text-muted);
|
|
font-size: 11px;
|
|
line-height: 1.5;
|
|
}
|
|
|
|
.anomalous-node-muted.is-error { color: var(--amb-danger-text); }
|
|
|
|
/* Show all, compare, delete, apply. */
|
|
.anomalous-node-param-actions {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
gap: 6px;
|
|
}
|
|
|
|
.anomalous-node-param-gap { flex: 1; }
|
|
|
|
.anomalous-node-param-more {
|
|
padding: 0;
|
|
border: none;
|
|
background: none;
|
|
color: var(--amb-text-muted);
|
|
font-size: 11.5px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-param-more:hover { color: var(--amb-text-main); }
|
|
|
|
.anomalous-node-param-secondary,
|
|
.anomalous-node-param-delete {
|
|
padding: 5px 10px;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 7px;
|
|
background: transparent;
|
|
color: var(--amb-text-muted);
|
|
font-size: 11.5px;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-param-secondary:hover {
|
|
border-color: color-mix(in srgb, var(--amb-link) 45%, transparent);
|
|
color: var(--amb-text-main);
|
|
}
|
|
|
|
.anomalous-node-param-delete:hover {
|
|
border-color: rgba(239, 68, 68, 0.5);
|
|
color: var(--amb-danger-text);
|
|
}
|
|
|
|
.anomalous-node-param-apply {
|
|
padding: 5px 12px;
|
|
border: 1px solid color-mix(in srgb, var(--amb-link) 45%, transparent);
|
|
border-radius: 7px;
|
|
background: color-mix(in srgb, var(--amb-link) 14%, transparent);
|
|
color: var(--amb-text-main);
|
|
font-size: 11.5px;
|
|
font-weight: 600;
|
|
white-space: nowrap;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.anomalous-node-param-apply:disabled {
|
|
border-color: var(--amb-border);
|
|
background: transparent;
|
|
color: var(--amb-text-dim);
|
|
cursor: default;
|
|
}
|
|
|
|
/* Side by side: a column for now and for each set, the values a set would put in marked. */
|
|
.anomalous-node-param-table-wrap {
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 10px;
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.anomalous-node-param-table {
|
|
width: 100%;
|
|
border-collapse: collapse;
|
|
font-size: 11.5px;
|
|
}
|
|
|
|
.anomalous-node-param-table th,
|
|
.anomalous-node-param-table td {
|
|
max-width: 150px;
|
|
padding: 6px 10px;
|
|
border-bottom: 1px solid var(--amb-border);
|
|
overflow: hidden;
|
|
color: var(--amb-text-soft);
|
|
text-align: left;
|
|
white-space: nowrap;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.anomalous-node-param-table th {
|
|
vertical-align: bottom;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.anomalous-node-param-table .is-now { color: var(--amb-text-muted); }
|
|
|
|
.anomalous-node-param-table td.is-change {
|
|
background: color-mix(in srgb, var(--amb-link) 13%, transparent);
|
|
color: var(--amb-text-main);
|
|
}
|
|
|
|
.anomalous-node-param-table td.is-same,
|
|
.anomalous-node-param-table td.is-none { color: var(--amb-text-dim); }
|
|
|
|
.anomalous-node-param-table td.is-seed,
|
|
.anomalous-node-param-table td.is-model,
|
|
.anomalous-node-param-table td.is-missing {
|
|
color: var(--amb-text-dim);
|
|
font-style: italic;
|
|
}
|
|
|
|
.anomalous-node-param-table-thumb {
|
|
display: block;
|
|
width: 44px;
|
|
height: 56px;
|
|
margin-bottom: 5px;
|
|
padding: 0;
|
|
border: none;
|
|
border-radius: 6px;
|
|
background: rgba(var(--amb-ink-rgb), 0.05);
|
|
overflow: hidden;
|
|
}
|
|
|
|
button.anomalous-node-param-table-thumb { cursor: zoom-in; }
|
|
|
|
.anomalous-node-param-table-thumb > img {
|
|
display: block;
|
|
width: 100%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
}
|
|
|
|
.anomalous-node-param-table-name {
|
|
display: block;
|
|
max-width: 130px;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
|
|
.anomalous-node-param-table-foot td { border-bottom: none; }
|
|
|
|
/* A prompt box of the node, with its translation. */
|
|
.anomalous-node-prompt {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 6px;
|
|
padding: 10px 12px;
|
|
border: 1px solid var(--amb-border);
|
|
border-radius: 10px;
|
|
background: rgba(var(--amb-ink-rgb), 0.035);
|
|
}
|
|
|
|
.anomalous-node-param-role.is-plain { color: var(--amb-text-soft); }
|
|
|
|
.anomalous-node-prompt-name {
|
|
color: var(--amb-text-dim);
|
|
font-size: 10.5px;
|
|
}
|
|
|
|
.anomalous-node-prompt-text {
|
|
display: -webkit-box;
|
|
margin: 0;
|
|
overflow: hidden;
|
|
color: var(--amb-text-main);
|
|
font-size: 12px;
|
|
line-height: 1.5;
|
|
overflow-wrap: anywhere;
|
|
-webkit-box-orient: vertical;
|
|
-webkit-line-clamp: 4;
|
|
}
|
|
|
|
.anomalous-node-prompt-text.is-empty { color: var(--amb-text-dim); }
|
|
|