css: centralize repeated transition tokens into CSS variables

This commit is contained in:
Dariusz L
2026-08-01 14:52:41 +02:00
parent a4bc220b0f
commit e732f9c408
4 changed files with 70 additions and 40 deletions
+26
View File
@@ -0,0 +1,26 @@
# Model Resolver - CSS Architecture & Design Tokens
This directory contains the core stylesheets and token system for the `comfyui-model-resolver` extension.
## Stylesheet Structure
- **`css-variables.css`**: Central design system token registry (`:root`). All colors, dimensions, spacing, typography, z-indexes, and animations MUST be defined here.
- **`resolver-main.css`**: Styles for the main dialog, missing models browser, tab contents, lists, and model details views.
- **`resolver-shell.css`**: Styles for the outer modal shell, sidebar docking panel, window controls, and queue drawer.
## Usage Guidelines
1. **Always Use CSS Variables**:
Avoid using raw hex colors (e.g. `#111111`, `#4caf50`) or hardcoded pixel values when a variable exists.
- Backgrounds: `var(--mr-bg)`, `var(--mr-bg-soft)`, `var(--mr-card-bg)`, `var(--mr-panel-bg)`
- Text Colors: `var(--mr-text)`, `var(--mr-text-muted)`, `var(--mr-text-dim)`, `var(--mr-text-soft)`
- Accent & Status: `var(--mr-accent)`, `var(--mr-warning)`, `var(--mr-color-civitai)`, `var(--mr-color-blue-info)`
- Fonts: `var(--mr-font-family-sans)`, `var(--mr-font-family-mono)`
- Shadows: `var(--mr-shadow-dialog)`, `var(--mr-shadow-card)`, `var(--mr-shadow-focus-ring)`
- Button Heights: `var(--mr-button-height-sm)` (26px), `var(--mr-button-height-md)` (30px)
2. **Fallbacks in `var(...)`**:
When specifying a fallback value inside `var(--mr-variable, fallback)`, make sure the fallback matches the exact value defined in `css-variables.css`.
3. **Node / Model Type Chips**:
Use `--mr-type-<model_type>-text` and `--mr-type-<model_type>-rgb` for model type badges and glow highlights.
+4
View File
@@ -107,6 +107,10 @@
--mr-transition-color: color 0.2s;
--mr-transition-border: border-color 0.2s;
--mr-transition-opacity: opacity 0.2s;
--mr-transition-smooth: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
--mr-transition-transform: transform 0.15s ease;
--mr-transition-width: width 0.2s ease;
--mr-transition-popover: opacity 0.15s ease, transform 0.15s ease;
--mr-shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.8);
--mr-gradient-dark: linear-gradient(135deg, var(--mr-color-bg-dark-1) 0%, var(--mr-color-bg-dark-2) 100%);
--mr-drag-color-reorder: var(--mr-color-primary);
+33 -33
View File
@@ -574,7 +574,7 @@
border-radius: var(--mr-missing-chip-radius);
background: rgba(255, 255, 255, 0.13);
transform: translateX(-50%);
transition: background 0.15s ease, box-shadow 0.15s ease;
transition: var(--mr-transition-smooth);
}
.mr-missing-browser-splitter:hover::before,
@@ -784,7 +784,7 @@
font-size: var(--mr-font-sm);
text-align: left;
contain: layout paint style;
transition: background 0.14s ease, box-shadow 0.14s ease, border-color 0.14s ease;
transition: var(--mr-transition-smooth);
}
#model-resolver-modal .mr-missing-list-row:hover {
@@ -1196,7 +1196,7 @@
border-radius: 0;
padding: var(--mr-spacing-10) var(--mr-spacing-12);
margin-bottom: var(--mr-spacing-4);
transition: background 0.18s ease, box-shadow 0.18s ease;
transition: var(--mr-transition-smooth);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.018);
font-family: var(--mr-font-family-sans);
}
@@ -1314,7 +1314,7 @@
color: #f1f1f1;
background: var(--mr-border);
border-color: rgba(255, 255, 255, 0.12);
transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease, transform 0.15s ease;
transition: var(--mr-missing-control-transition);
}
.mr-missing-browser .mr-node-chip.is-locatable {
@@ -1718,7 +1718,7 @@
}
.mr-inline-note-action {
transition: color 0.15s ease, background 0.15s ease;
transition: var(--mr-transition-bg);
}
.mr-inline-note-action:hover {
@@ -1795,7 +1795,7 @@
margin-bottom: var(--mr-spacing-4);
background: rgba(255, 255, 255, 0.016);
border: 1px solid transparent;
transition: background 0.15s ease, box-shadow 0.15s ease;
transition: var(--mr-transition-smooth);
}
.mr-missing-browser .mr-match-row {
@@ -1954,7 +1954,7 @@
cursor: pointer;
outline: none;
box-sizing: border-box;
transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
transition: var(--mr-missing-control-transition);
}
.mr-local-alternatives-toggle:hover {
@@ -1989,7 +1989,7 @@
border-right: 1px solid currentColor;
border-bottom: 1px solid currentColor;
transform: rotate(45deg) translateY(-1px);
transition: transform 0.15s ease;
transition: var(--mr-transition-transform);
}
.mr-local-alternatives-toggle[aria-expanded="true"] .mr-local-alternatives-chevron {
@@ -3020,7 +3020,7 @@
height: 100%;
background: var(--mr-accent);
border-radius: inherit;
transition: width 0.42s ease, background 0.2s ease;
transition: var(--mr-transition-bg);
}
.mr-search-progress-running .mr-search-progress-fill {
@@ -3082,7 +3082,7 @@
border-radius: var(--mr-radius-2xl);
font-size: var(--mr-font-md);
outline: none;
transition: border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease;
transition: var(--mr-transition-smooth);
}
.mr-missing-browser .mr-combo-input {
@@ -3127,7 +3127,7 @@
font-size: var(--mr-font-md);
color: var(--mr-text);
background: transparent;
transition: background 0.14s ease, color 0.14s ease;
transition: var(--mr-transition-smooth);
}
.mr-combo-option:last-child {
@@ -3270,7 +3270,7 @@
.mr-progress-fill {
height: 100%;
background: var(--mr-accent);
transition: width 0.3s ease;
transition: var(--mr-transition-width);
}
.mr-progress-text {
@@ -3438,7 +3438,7 @@
clip-path: polygon(50% 0, 100% 100%, 0 100%);
opacity: 0.78;
transform: rotate(0deg);
transition: transform 0.15s ease, opacity 0.15s ease;
transition: var(--mr-transition-popover);
}
.mr-footer-menu-button[aria-expanded="true"]::after {
@@ -3940,7 +3940,7 @@
font-size: var(--mr-font-md);
color: var(--mr-text, #e0e0e0);
cursor: pointer;
transition: background 0.15s ease;
transition: var(--mr-transition-bg);
}
.mr-context-menu-hidden,
@@ -4429,7 +4429,7 @@ button.mr-info-link:disabled {
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, rgba(114,211,138,0.74), rgba(100,181,246,0.82));
transition: width 150ms ease;
transition: var(--mr-transition-width);
}
.mr-info-hash-progress small {
@@ -4564,7 +4564,7 @@ button.mr-info-link:disabled {
padding: var(--mr-spacing-2) var(--mr-spacing-10);
font-size: var(--mr-font-sm);
cursor: pointer;
transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
transition: var(--mr-missing-control-transition);
}
.mr-info-copy-trained-words:hover:not(:disabled) {
@@ -4595,7 +4595,7 @@ button.mr-info-link:disabled {
font-size: var(--mr-font-md);
line-height: 1.2;
cursor: pointer;
transition: transform 0.14s ease, background 0.14s ease, border-color 0.14s ease, box-shadow 0.14s ease;
transition: var(--mr-transition-smooth);
}
.mr-info-trained-word:hover {
@@ -4713,7 +4713,7 @@ button.mr-info-link:disabled {
padding: var(--mr-spacing-4) var(--mr-spacing-12);
font-size: var(--mr-font-sm);
cursor: pointer;
transition: background 0.16s ease, border-color 0.16s ease, color 0.16s ease;
transition: var(--mr-missing-control-transition);
}
.mr-info-description-toggle:hover {
@@ -4776,7 +4776,7 @@ button.mr-info-link:disabled {
height: auto;
display: block;
object-fit: contain;
transition: transform 0.24s ease, filter 0.24s ease;
transition: var(--mr-transition-transform);
}
.mr-info-image-preview-label {
@@ -4795,7 +4795,7 @@ button.mr-info-link:disabled {
font-weight: 700;
opacity: 0;
transform: translateY(-4px);
transition: opacity 0.18s ease, transform 0.18s ease;
transition: var(--mr-transition-opacity);
pointer-events: none;
}
@@ -4817,7 +4817,7 @@ button.mr-info-link:disabled {
text-decoration: none;
opacity: 0;
transform: translateY(-4px);
transition: opacity 0.18s ease, transform 0.18s ease, background 0.18s ease, border-color 0.18s ease;
transition: var(--mr-transition-opacity);
}
.mr-info-image-civitai-badge:hover,
@@ -4848,7 +4848,7 @@ button.mr-info-link:disabled {
background: linear-gradient(180deg, rgba(7, 10, 14, 0) 0%, rgba(7, 10, 14, 0.82) 16%, rgba(7, 10, 14, 0.94) 100%);
opacity: 0;
transform: translateY(10px);
transition: opacity 0.2s ease, transform 0.2s ease;
transition: var(--mr-transition-opacity);
pointer-events: none;
}
@@ -4999,7 +4999,7 @@ button.mr-info-link:disabled {
background: rgba(255, 255, 255, 0.12);
color: #f4f4f4;
cursor: pointer;
transition: background 0.16s ease, transform 0.16s ease;
transition: var(--mr-transition-bg);
}
.mr-image-preview-icon-btn {
@@ -5912,7 +5912,7 @@ a.mr-image-preview-resource-name:hover {
border-right: 2px solid currentColor;
border-bottom: 2px solid currentColor;
transform: rotate(-45deg);
transition: transform 120ms ease;
transition: var(--mr-transition-transform);
}
.mr-model-details-file[open] .mr-model-details-file-chevron::before {
@@ -6086,7 +6086,7 @@ a.mr-image-preview-resource-name:hover {
cursor: pointer;
appearance: none;
-webkit-appearance: none;
transition: background 120ms ease, border-color 120ms ease;
transition: var(--mr-transition-smooth);
}
.mr-model-details-mirror:hover {
@@ -6605,7 +6605,7 @@ a.mr-image-preview-resource-name:hover {
color: var(--mr-text-secondary);
background: transparent;
box-shadow: none;
transition: transform 0.15s ease, color 0.15s ease;
transition: var(--mr-transition-color);
}
.mr-options-collapse-chevron svg {
@@ -7107,7 +7107,7 @@ a.mr-image-preview-resource-name:hover {
height: 100%;
border-radius: inherit;
background: var(--mr-accent);
transition: width 0.2s ease;
transition: var(--mr-transition-width);
}
.mr-options-build-current {
@@ -7204,7 +7204,7 @@ a.mr-image-preview-resource-name:hover {
height: 100%;
border-radius: inherit;
background: var(--mr-color-success);
transition: width 0.2s ease;
transition: var(--mr-transition-width);
}
.mr-options-history-action {
@@ -7839,7 +7839,7 @@ a.mr-image-preview-resource-name:hover {
border-radius: var(--mr-radius-xl);
font-size: var(--mr-font-base);
outline: none;
transition: border-color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease;
transition: var(--mr-transition-bg);
}
.mr-options-input:focus,
@@ -8149,7 +8149,7 @@ a.mr-image-preview-resource-name:hover {
border-right: none;
background: transparent;
cursor: pointer;
transition: background 0.16s ease;
transition: var(--mr-transition-bg);
min-width: 0;
}
@@ -8216,7 +8216,7 @@ a.mr-image-preview-resource-name:hover {
border-radius: var(--mr-missing-chip-radius);
background: var(--mr-color-gray-700);
border: 1px solid var(--mr-missing-control-bg-hover);
transition: background 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease;
transition: var(--mr-transition-smooth);
}
.mr-options-switch::after {
@@ -8229,7 +8229,7 @@ a.mr-image-preview-resource-name:hover {
border-radius: var(--mr-missing-chip-radius);
background: #f2f6fb;
box-shadow: 0 3px 8px rgba(0, 0, 0, 0.3);
transition: transform 0.16s ease;
transition: var(--mr-transition-transform);
}
.mr-options-switch-input:checked+.mr-options-switch {
@@ -8853,7 +8853,7 @@ a.mr-image-preview-resource-name:hover {
border-top: 4px solid transparent;
border-bottom: 4px solid transparent;
border-left: 5px solid currentColor;
transition: transform 140ms ease;
transition: var(--mr-transition-transform);
}
.mr-folder-browser-toggle.is-expanded .mr-folder-browser-chevron,
+7 -7
View File
@@ -28,7 +28,7 @@
border-radius: var(--mr-radius-xl);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04);
transform: translateX(-12px) scale(0.985);
transition: opacity 100ms ease, transform 100ms ease, visibility 0s linear 100ms;
transition: var(--mr-transition-popover);
contain: layout paint style;
}
@@ -51,7 +51,7 @@
border: 2px solid rgba(114, 211, 138, 0.72);
border-radius: var(--mr-radius-xl);
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04);
transition: opacity 100ms ease, visibility 0s linear 100ms;
transition: var(--mr-transition-opacity), visibility 0s linear 100ms;
contain: layout paint style;
}
@@ -319,7 +319,7 @@
border-radius: var(--mr-missing-chip-radius);
background: rgba(255, 255, 255, 0.13);
transform: translateX(-50%);
transition: background 0.15s ease, box-shadow 0.15s ease;
transition: var(--mr-transition-smooth);
}
#model-resolver-splitter:hover::before,
@@ -380,7 +380,7 @@
border-radius: var(--mr-missing-chip-radius);
background: rgba(255, 255, 255, 0.34);
transform: translateX(-50%);
transition: background 0.15s ease, box-shadow 0.15s ease, opacity 0.15s ease;
transition: var(--mr-transition-smooth);
}
#queue-toggle-icon:hover,
@@ -547,7 +547,7 @@
border-bottom: 1px solid rgba(255, 255, 255, 0.052);
border-radius: 0;
color: var(--mr-text, #f3f3f3);
transition: background 0.14s ease, box-shadow 0.14s ease;
transition: var(--mr-transition-smooth);
}
.mr-queue-item:last-child {
@@ -711,7 +711,7 @@
.model-resolver-floating-button {
cursor: pointer;
font-weight: 600;
transition: all 0.2s ease;
transition: var(--mr-transition-all);
white-space: nowrap;
}
@@ -744,7 +744,7 @@
}
.mr-resolved-entry {
transition: all 0.3s ease;
transition: var(--mr-transition-all);
background: rgba(76, 175, 80, 0.2);
border: 1px solid var(--mr-color-success-action);
border-radius: var(--mr-radius-lg);