Files
DemonGatanjieu-Anomalous_Mo…/web/styles/27-param-compare.css
T
DemonGatanjieuandClaude Opus 5.5 b323d82220 Focus values: mark what matters most in a workflow
- Every node value under the details' "every node's values" has a star; marked values show at
  the top of the workflow's own values and of each set as tiles (node, value, a note, and on a
  set the default when it differs). Set rows list them first; the comparison window leads its
  key values with them and their note.
- Kept in the recipe's params as focusParams [{node, type, widget, note}]; the server refuses
  any other shape (at most 12, short strings, notes up to 120 characters). Kept while the node
  of that id and type is there, also when the workflow is updated from the canvas.
- compareParams' isKey now also receives the node ids, so a mark holds for one node only.
- Tests: tests/recipe_focus.mjs, focus values in test_recipe_roundtrip.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 01:03:40 +08:00

569 lines
13 KiB
CSS

/* Comparing parameters (ui_param_compare.js): the gallery card's ⇄, the pick bar, the window,
the canvas-vs-newest-picture buttons; a parameter set's key values (ui_param_set_keys.js). */
.anomalous-gallery-toolbar {
display: flex;
flex-shrink: 0;
align-items: center;
gap: 8px;
margin: 12px 20px 0;
}
.anomalous-gallery-toolbar .anomalous-gallery-search {
flex: 1 1 auto;
min-width: 0;
margin: 0;
}
.anomalous-gallery-newest,
.anomalous-activity-newest {
flex: 0 0 auto;
padding: 5px 12px;
border: 1px solid var(--amb-border-strong);
border-radius: 999px;
background: var(--amb-bg-card);
color: var(--amb-text-soft);
font-size: 12px;
white-space: nowrap;
cursor: pointer;
}
.anomalous-activity-newest { margin-left: auto; }
.anomalous-gallery-newest:hover,
.anomalous-activity-newest:hover {
border-color: var(--amb-link);
color: var(--amb-text-main);
}
.anomalous-gallery-newest:disabled,
.anomalous-activity-newest:disabled { opacity: 0.6; cursor: default; }
.anomalous-gallery-compare {
position: absolute;
right: 8px;
bottom: 8px;
z-index: 2;
display: flex;
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
border: 1px solid var(--amb-border-strong);
border-radius: 50%;
color: var(--amb-text-main);
background: rgba(15, 20, 30, 0.78);
font-size: 15px;
line-height: 1;
cursor: pointer;
opacity: 0;
transition: opacity 0.2s, transform 0.2s;
}
.anomalous-gallery-card:hover .anomalous-gallery-compare,
.anomalous-gallery-card:focus-within .anomalous-gallery-compare,
.anomalous-gallery-card.is-compare-picked .anomalous-gallery-compare {
opacity: 1;
}
.anomalous-gallery-compare:hover { transform: scale(1.08); }
.anomalous-gallery-card.is-compare-picked {
border-color: var(--amb-link);
box-shadow: 0 0 0 2px color-mix(in srgb, var(--amb-link) 45%, transparent);
}
.anomalous-gallery-card.is-compare-picked .anomalous-gallery-compare {
border-color: var(--amb-link);
color: var(--amb-link);
}
#anomalous-gallery-panel.is-cover-selecting .anomalous-gallery-compare,
#anomalous-gallery-panel.is-cover-selecting .anomalous-compare-bar {
display: none;
}
.anomalous-compare-bar {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin: 0 12px 10px;
padding: 8px 12px;
border: 1px solid color-mix(in srgb, var(--amb-link) 45%, transparent);
border-radius: var(--amb-radius-card);
background: color-mix(in srgb, var(--amb-link) 10%, var(--amb-bg-panel));
color: var(--amb-text-main);
font-size: 12.5px;
}
.anomalous-compare-bar-text {
flex: 1 1 200px;
min-width: 0;
overflow-wrap: anywhere;
}
.anomalous-compare-bar-btn,
.anomalous-compare-done,
.anomalous-compare-apply {
padding: 6px 12px;
border: 1px solid var(--amb-border-strong);
border-radius: var(--amb-radius-control);
background: var(--amb-bg-card);
color: var(--amb-text-main);
font-size: 12.5px;
cursor: pointer;
}
.anomalous-compare-bar-btn:hover,
.anomalous-compare-done:hover { background: var(--amb-bg-card-hover); }
.anomalous-compare-bar-btn.is-quiet {
border-color: transparent;
background: transparent;
color: var(--amb-text-muted);
}
.anomalous-compare-overlay {
position: fixed;
inset: 0;
z-index: 1000001;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
box-sizing: border-box;
background: var(--amb-scrim);
backdrop-filter: blur(4px);
}
.anomalous-compare-dialog {
--amb-compare-a: var(--amb-link);
--amb-compare-b: var(--amb-warn);
display: flex;
flex-direction: column;
gap: 12px;
width: min(760px, 100%);
max-height: 90vh;
padding: 18px 20px;
box-sizing: border-box;
border: 1px solid var(--amb-border-strong);
border-radius: 16px;
background: var(--amb-bg-panel);
color: var(--amb-text-main);
box-shadow: 0 24px 70px rgba(var(--amb-shadow-rgb), 0.55);
}
.anomalous-compare-head {
display: flex;
align-items: center;
justify-content: space-between;
}
.anomalous-compare-title {
margin: 0;
font-size: 1.05rem;
}
.anomalous-compare-close {
border: none;
background: transparent;
color: var(--amb-text-muted);
font-size: 22px;
line-height: 1;
cursor: pointer;
}
.anomalous-compare-close:hover { color: var(--amb-text-main); }
.anomalous-compare-sides {
display: grid;
grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
align-items: center;
gap: 10px;
}
.anomalous-compare-side {
display: flex;
align-items: center;
gap: 10px;
min-width: 0;
padding: 8px;
border: 1px solid var(--amb-border);
border-radius: var(--amb-radius-card);
background: var(--amb-bg-card);
}
.anomalous-compare-thumb {
flex: 0 0 auto;
width: 56px;
height: 56px;
border-radius: var(--amb-radius-control);
object-fit: cover;
background: var(--amb-bg-sunken);
}
.anomalous-compare-thumb.is-canvas {
display: flex;
align-items: center;
justify-content: center;
color: var(--amb-text-muted);
font-size: 24px;
}
.anomalous-compare-side-name {
min-width: 0;
overflow: hidden;
font-size: 12.5px;
font-weight: 600;
text-overflow: ellipsis;
white-space: nowrap;
}
.anomalous-compare-swap {
width: 32px;
height: 32px;
border: 1px solid var(--amb-border-strong);
border-radius: 50%;
background: var(--amb-bg-card);
color: var(--amb-text-main);
cursor: pointer;
}
.anomalous-compare-swap:hover { background: var(--amb-bg-card-hover); }
.anomalous-compare-summary {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
color: var(--amb-text-soft);
font-size: 12.5px;
}
.anomalous-compare-summary.is-error { color: var(--amb-danger-text); }
.anomalous-compare-same-toggle {
display: inline-flex;
align-items: center;
gap: 5px;
margin-left: auto;
color: var(--amb-text-muted);
font-size: 12px;
cursor: pointer;
}
.anomalous-compare-badge {
padding: 2px 8px;
border-radius: 999px;
font-size: 11.5px;
font-weight: 600;
}
.anomalous-compare-badge.is-same {
background: color-mix(in srgb, var(--amb-ok) 16%, transparent);
color: var(--amb-ok-text);
}
.anomalous-compare-badge.is-other {
background: color-mix(in srgb, var(--amb-warn) 16%, transparent);
color: var(--amb-warn-text);
}
.anomalous-compare-body {
display: flex;
flex-direction: column;
gap: 10px;
min-height: 0;
overflow-y: auto;
}
.anomalous-compare-node {
padding: 8px 10px;
border: 1px solid var(--amb-border);
border-radius: var(--amb-radius-card);
background: var(--amb-bg-card);
}
.anomalous-compare-node-title {
margin-bottom: 4px;
color: var(--amb-text-muted);
font-size: 11.5px;
font-weight: 600;
}
.anomalous-compare-row {
display: grid;
grid-template-columns: minmax(90px, 0.8fr) minmax(0, 1fr) minmax(0, 1fr);
align-items: start;
gap: 10px;
padding: 4px 0;
font-size: 12.5px;
}
.anomalous-compare-row + .anomalous-compare-row { border-top: 1px solid var(--amb-border); }
.anomalous-compare-row.is-head {
padding: 0 11px;
color: var(--amb-text-dim);
font-size: 11px;
font-weight: 600;
}
.anomalous-compare-name {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
color: var(--amb-text-soft);
overflow-wrap: anywhere;
}
.anomalous-compare-label {
display: flex;
align-items: center;
gap: 6px;
min-width: 0;
overflow-wrap: anywhere;
}
.anomalous-compare-prefix {
color: var(--amb-text-dim);
font-size: 11.5px;
}
.anomalous-compare-prefix::after { content: ' ·'; }
.anomalous-compare-star {
flex: 0 0 auto;
padding: 0;
border: none;
background: transparent;
color: var(--amb-text-dim);
font-size: 14px;
line-height: 1;
cursor: pointer;
}
.anomalous-compare-star:hover,
.anomalous-compare-star.is-on { color: var(--amb-warn-text); }
.anomalous-compare-node.is-keys {
border-color: color-mix(in srgb, var(--amb-warn) 40%, transparent);
background: color-mix(in srgb, var(--amb-warn) 6%, var(--amb-bg-card));
}
.anomalous-compare-row.is-same .anomalous-compare-value { color: var(--amb-text-muted); }
.anomalous-compare-value.is-both { grid-column: 2 / -1; }
.anomalous-compare-key-hint {
color: var(--amb-text-dim);
font-size: 12px;
}
.anomalous-compare-role {
padding: 0 6px;
border-radius: 999px;
font-size: 11px;
white-space: nowrap;
background: var(--amb-bg-sunken);
color: var(--amb-text-muted);
}
/* A focus value's mark and note, on its own line under the value (the grid's full width). */
.anomalous-compare-focus {
grid-column: 1 / -1;
order: 1;
margin-top: -4px;
color: var(--amb-link);
font-size: 11.5px;
overflow-wrap: anywhere;
}
.anomalous-compare-role.is-positive { color: var(--amb-ok-text); }
.anomalous-compare-role.is-negative { color: var(--amb-danger-text); }
/* Values wrap whole: a model's name often differs only at its end. */
.anomalous-compare-value {
min-width: 0;
color: var(--amb-text-main);
overflow-wrap: anywhere;
}
.anomalous-compare-letter {
display: inline-flex;
flex: 0 0 auto;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
border-radius: 5px;
font-size: 11px;
font-weight: 700;
line-height: 1;
}
.anomalous-compare-letter.is-a {
background: color-mix(in srgb, var(--amb-compare-a) 22%, transparent);
color: var(--amb-compare-a);
}
.anomalous-compare-letter.is-b {
background: color-mix(in srgb, var(--amb-compare-b) 22%, transparent);
color: var(--amb-compare-b);
}
.anomalous-compare-text {
grid-column: 2 / -1;
display: flex;
flex-direction: column;
gap: 6px;
min-width: 0;
}
.anomalous-compare-text-line {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 4px 6px;
line-height: 1.6;
overflow-wrap: anywhere;
}
.anomalous-compare-text-body { min-width: 0; flex: 1 1 0; }
.anomalous-compare-line-label {
color: var(--amb-text-muted);
font-size: 11.5px;
}
.anomalous-compare-text-line mark {
border-radius: 3px;
padding: 0 2px;
color: inherit;
}
.anomalous-compare-text-line.is-a mark,
.anomalous-compare-text-line.is-a .anomalous-compare-tag {
background: color-mix(in srgb, var(--amb-compare-a) 20%, transparent);
}
.anomalous-compare-text-line.is-b mark,
.anomalous-compare-text-line.is-b .anomalous-compare-tag {
background: color-mix(in srgb, var(--amb-compare-b) 20%, transparent);
}
.anomalous-compare-more {
padding: 1px 8px;
border: 1px solid var(--amb-border-strong);
border-radius: 999px;
background: transparent;
color: var(--amb-text-muted);
font-size: 12px;
cursor: pointer;
}
.anomalous-compare-more:hover { color: var(--amb-text-main); }
.anomalous-compare-tag {
padding: 1px 7px;
border-radius: 999px;
font-size: 12px;
}
.anomalous-compare-structure-list {
color: var(--amb-text-soft);
font-size: 12.5px;
overflow-wrap: anywhere;
}
.anomalous-compare-seeds summary {
color: var(--amb-text-muted);
font-size: 12px;
cursor: pointer;
}
.anomalous-compare-seeds .anomalous-compare-node { margin-top: 6px; }
.anomalous-compare-empty {
padding: 14px;
color: var(--amb-text-muted);
font-size: 12.5px;
text-align: center;
}
.anomalous-compare-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
justify-content: flex-end;
gap: 8px;
}
.anomalous-compare-hint {
flex: 1 1 220px;
color: var(--amb-text-muted);
font-size: 12px;
}
.anomalous-compare-apply {
border-color: transparent;
background: var(--amb-btn-primary-bg);
color: var(--amb-btn-primary-text);
font-weight: 600;
}
.anomalous-compare-apply:hover:not(:disabled) { background: var(--amb-btn-primary-hover); }
.anomalous-compare-apply:disabled { opacity: 0.5; cursor: default; }
.anomalous-recipe-set-chip {
flex: 0 0 auto;
align-self: flex-start;
padding: 1px 8px;
white-space: nowrap;
border: 1px solid var(--amb-border-strong);
border-radius: 999px;
background: var(--amb-bg-sunken);
color: var(--amb-text-soft);
font-size: 11.5px;
cursor: pointer;
}
.anomalous-recipe-set-chip:hover {
border-color: var(--amb-link);
color: var(--amb-text-main);
}
/* A parameter set's card: its key values, marked where they differ from the recipe's. */
.anomalous-preset-item-keys {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 4px;
margin-top: 5px;
}
.anomalous-preset-key-chip {
padding: 1px 6px;
border-radius: 999px;
background: var(--amb-bg-sunken);
color: var(--amb-text-muted);
font-size: 11px;
}
.anomalous-preset-key-chip.is-differs {
background: color-mix(in srgb, var(--amb-warn) 18%, transparent);
color: var(--amb-warn-text);
}
.anomalous-preset-key-chip.is-focus { box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--amb-link) 55%, transparent); }
.anomalous-preset-key-count {
color: var(--amb-text-dim);
font-size: 11px;
}
@media (max-width: 560px) {
.anomalous-compare-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.anomalous-compare-name { grid-column: 1 / -1; }
}