From 74bc1e03f77fc85843da48a0ced4b3462d6a3ebb Mon Sep 17 00:00:00 2001 From: Dariusz L Date: Wed, 27 May 2026 00:10:39 +0200 Subject: [PATCH] UI improvements: refine missing browser styling, dialog appearance, and minor text fix --- web/css/linker-main.css | 285 ++++++++++++++++++++++++++++++--------- web/css/linker-shell.css | 54 ++++---- web/linker.js | 2 +- 3 files changed, 251 insertions(+), 90 deletions(-) diff --git a/web/css/linker-main.css b/web/css/linker-main.css index 396e21b..e7b74df 100644 --- a/web/css/linker-main.css +++ b/web/css/linker-main.css @@ -223,14 +223,21 @@ } .ml-missing-browser { + --ml-missing-surface: rgba(255,255,255,0.024); + --ml-missing-surface-raised: rgba(255,255,255,0.04); + --ml-missing-surface-muted: rgba(255,255,255,0.016); + --ml-missing-line: rgba(255,255,255,0.062); + --ml-missing-line-strong: rgba(255,255,255,0.105); + --ml-missing-radius: 7px; + --ml-missing-control-radius: 7px; display: grid; grid-template-columns: minmax(360px, 1.1fr) minmax(320px, 0.9fr); - gap: 10px; + gap: 0; height: 100%; min-height: 0; overflow: hidden; - border: 1px solid rgba(255,255,255,0.08); - background: rgba(255,255,255,0.015); + border: 1px solid var(--ml-missing-line); + background: #111; } .ml-missing-list-pane, .ml-missing-detail-pane { @@ -241,8 +248,8 @@ .ml-missing-list-pane { display: grid; grid-template-rows: auto auto minmax(0, 1fr); - border-right: 1px solid rgba(255,255,255,0.08); - background: rgba(20,20,20,0.92); + border-right: 1px solid var(--ml-missing-line); + background: transparent; } .ml-missing-list-toolbar { display: flex; @@ -250,7 +257,8 @@ justify-content: space-between; gap: 12px; padding: 12px 14px; - border-bottom: 1px solid rgba(255,255,255,0.07); + border-bottom: 1px solid var(--ml-missing-line); + background: rgba(255,255,255,0.012); } .ml-missing-list-title { font-size: 14px; @@ -275,8 +283,8 @@ min-height: 20px; padding: 2px 7px; border-radius: 999px; - background: rgba(255,255,255,0.055); - border: 1px solid rgba(255,255,255,0.08); + background: var(--ml-missing-surface-raised); + border: 1px solid var(--ml-missing-line); color: var(--ml-text-muted); font-size: 10px; font-weight: 700; @@ -297,8 +305,8 @@ } .ml-missing-list-head { padding: 8px 10px 8px 6px; - border-bottom: 1px solid rgba(255,255,255,0.08); - background: rgba(255,255,255,0.035); + border-bottom: 1px solid var(--ml-missing-line); + background: var(--ml-missing-surface); color: var(--ml-text-muted); font-size: 10px; font-weight: 700; @@ -307,13 +315,14 @@ min-height: 0; overflow-y: auto; scrollbar-width: auto; + background: linear-gradient(180deg, transparent 0%, rgba(255,255,255,0.006) 100%); } #model-linker-modal .ml-missing-list-row { width: 100%; min-height: 50px; padding: 7px 10px 7px 6px; border: 0; - border-bottom: 1px solid rgba(255,255,255,0.055); + border-bottom: 1px solid rgba(255,255,255,0.052); border-radius: 0; background: transparent; color: var(--ml-text); @@ -321,13 +330,13 @@ font-family: inherit; font-size: 11px; text-align: left; - transition: background 0.14s ease, box-shadow 0.14s ease; + transition: background 0.14s ease, box-shadow 0.14s ease, border-color 0.14s ease; } #model-linker-modal .ml-missing-list-row:hover { - background: rgba(255,255,255,0.04); + background: rgba(255,255,255,0.035); } #model-linker-modal .ml-missing-list-row.is-selected { - background: rgba(114,211,138,0.09); + background: rgba(114,211,138,0.085); box-shadow: inset 3px 0 0 rgba(114,211,138,0.92); } .ml-missing-row-index { @@ -376,7 +385,7 @@ text-overflow: ellipsis; white-space: nowrap; border-radius: 999px; - background: rgba(255,255,255,0.065); + background: var(--ml-missing-surface-raised); color: #d4d4d4; font-size: 9px; font-weight: 800; @@ -396,7 +405,7 @@ min-height: 18px; padding: 2px 6px; border-radius: 999px; - background: rgba(255,255,255,0.065); + background: var(--ml-missing-surface-raised); font-size: 10px; font-weight: 800; line-height: 1; @@ -435,8 +444,8 @@ width: 20px; height: 20px; border-radius: 999px; - background: rgba(255,255,255,0.035); - border: 1px solid rgba(255,255,255,0.12); + background: var(--ml-missing-surface); + border: 1px solid var(--ml-missing-line-strong); color: rgba(255,255,255,0.42); font-size: 9px; font-weight: 800; @@ -468,22 +477,37 @@ } .ml-missing-detail-pane { overflow-y: auto; - background: rgba(18,18,18,0.9); + background: transparent; } .ml-missing-detail-pane .ml-card { margin: 0; - padding: 14px; + padding: 16px; background: transparent; box-shadow: none; } .ml-missing-detail-pane .ml-card:hover { box-shadow: none; } +.ml-missing-detail-pane .ml-card-header { + margin-bottom: 10px; +} +.ml-missing-detail-pane .ml-card-title { + font-size: 15px; + letter-spacing: 0; +} +.ml-missing-detail-pane .ml-card-subtitle { + margin-top: 1px; +} .ml-missing-detail-pane .ml-columns { grid-template-columns: minmax(0, 1fr); + gap: 10px; } .ml-missing-detail-pane .ml-column { - border-radius: 8px; + padding: 11px; + background: rgba(255,255,255,0.021); + border: 1px solid var(--ml-missing-line); + border-radius: var(--ml-missing-radius); + box-shadow: none; } @media (max-width: 980px) { @@ -609,6 +633,21 @@ white-space: nowrap; flex-shrink: 0; } +.ml-missing-browser .ml-node-chip, +.ml-missing-browser .ml-category-chip, +.ml-missing-browser .ml-search-source-pill { + background: var(--ml-missing-surface-raised, rgba(255,255,255,0.04)); + border-color: var(--ml-missing-line, rgba(255,255,255,0.075)); + box-shadow: none; +} +.ml-missing-browser .ml-badge { + border-radius: 999px; + box-shadow: none; +} +.ml-missing-browser .ml-badge-neutral { + background: var(--ml-missing-surface-raised, rgba(255,255,255,0.04)); + border-color: var(--ml-missing-line, rgba(255,255,255,0.075)); +} .ml-node-chip.is-locatable { cursor: pointer; padding-right: 9px; @@ -617,12 +656,22 @@ 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; } +.ml-missing-browser .ml-node-chip.is-locatable { + background: var(--ml-missing-surface-raised, rgba(255,255,255,0.04)); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + transform: none; +} .ml-node-chip.is-locatable:hover { background: rgba(255,255,255,0.12); border-color: rgba(255,255,255,0.18); color: #ffffff; transform: translateY(-1px); } +.ml-missing-browser .ml-node-chip.is-locatable:hover { + background: rgba(255,255,255,0.06); + border-color: rgba(255,255,255,0.18); + transform: none; +} .ml-node-chip-icon { display: inline-flex; align-items: center; @@ -716,6 +765,21 @@ color: var(--ml-text-muted); font-size: var(--ml-font-sm); } +.ml-missing-browser .ml-column-header { + margin-bottom: 9px; + padding-bottom: 8px; + border-bottom: 1px solid var(--ml-missing-line, var(--ml-divider)); + color: #bdbdbd; + font-size: 10px; + letter-spacing: 0.08em; +} +.ml-missing-browser .ml-muted-note, +.ml-missing-browser .ml-no-matches { + padding: 9px 10px; + background: var(--ml-missing-surface-muted, rgba(255,255,255,0.018)); + border: 1px solid transparent; + border-radius: var(--ml-missing-control-radius, var(--ml-ui-radius-sm)); +} .ml-inline-note-action { transition: color 0.15s ease, background 0.15s ease; } @@ -790,14 +854,33 @@ border: 1px solid transparent; transition: background 0.15s ease, box-shadow 0.15s ease; } +.ml-missing-browser .ml-match-row { + min-height: 38px; + margin-bottom: 6px; + padding: 8px 9px; + background: var(--ml-missing-surface-muted, rgba(255,255,255,0.016)); + border: 1px solid var(--ml-missing-line, transparent); + border-radius: var(--ml-missing-control-radius, var(--ml-ui-radius-sm)); + box-shadow: none; +} .ml-match-row:hover { background: rgba(255,255,255,0.032); box-shadow: inset 0 0 0 1px rgba(255,255,255,0.08); } +.ml-missing-browser .ml-match-row:hover { + background: rgba(255,255,255,0.032); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + box-shadow: none; +} .ml-match-row.ml-best-match { background: rgba(114,211,138,0.08); box-shadow: inset 0 0 0 1px rgba(114,211,138,0.16); } +.ml-missing-browser .ml-match-row.ml-best-match { + background: rgba(114,211,138,0.085); + border-color: rgba(114,211,138,0.24); + box-shadow: none; +} .ml-match-filename { flex: 1; min-width: 0; @@ -808,6 +891,9 @@ font-size: 11.5px; color: var(--ml-text-soft); } +.ml-missing-browser .ml-match-filename { + color: var(--ml-text-soft); +} /* Buttons */ .ml-btn { @@ -827,6 +913,13 @@ text-decoration: none; box-sizing: border-box; } +.ml-missing-browser .ml-btn { + border-radius: var(--ml-missing-control-radius, var(--ml-ui-radius-sm)); + box-shadow: none; +} +.ml-missing-browser .ml-btn:hover:not(:disabled) { + transform: none; +} .ml-btn:disabled { opacity: 0.5; cursor: not-allowed; @@ -844,11 +937,20 @@ border-color: rgba(255,255,255,0.1); box-shadow: inset 0 1px 0 rgba(255,255,255,0.02); } +.ml-missing-browser .ml-btn-secondary { + background: rgba(255,255,255,0.035); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); +} .ml-btn-secondary:hover:not(:disabled) { background: rgba(255,255,255,0.05); border-color: rgba(255,255,255,0.16); transform: translateY(-1px); } +.ml-missing-browser .ml-btn-secondary:hover:not(:disabled) { + background: rgba(255,255,255,0.055); + border-color: rgba(255,255,255,0.18); + transform: none; +} .ml-btn-link { background: rgba(255,255,255,0.03); color: var(--ml-text); @@ -957,6 +1059,14 @@ border: 1px solid transparent; box-shadow: inset 0 0 0 1px rgba(255,255,255,0.05); } +.ml-missing-browser .ml-download-section { + padding: 10px; + gap: 10px; + background: rgba(255,255,255,0.012); + border: 1px solid rgba(255,255,255,0.045); + border-radius: var(--ml-missing-control-radius, var(--ml-ui-radius-sm)); + box-shadow: none; +} .ml-status-inline { display: flex; align-items: center; @@ -969,6 +1079,12 @@ margin-top: 0; line-height: 1.55; } +.ml-missing-browser .ml-status-inline { + gap: 7px; +} +.ml-missing-browser .ml-download-info { + font-size: 11px; +} .ml-download-size { color: var(--ml-text-dim); margin-left: var(--ml-spacing-8); @@ -988,6 +1104,9 @@ font-size: 12px; line-height: 1; } +.ml-missing-browser .ml-download-section .ml-search-source-bar > .ml-btn { + border-radius: var(--ml-missing-control-radius, 7px); +} .ml-search-source-picker { display: grid; grid-template-columns: auto minmax(0, 1fr); @@ -1020,6 +1139,11 @@ appearance: none; box-sizing: border-box; } +.ml-missing-browser .ml-search-source-select { + background: rgba(255,255,255,0.035); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + border-radius: var(--ml-missing-control-radius, 7px); +} .ml-search-source-select:focus { border-color: rgba(114,211,138,0.4); box-shadow: 0 0 0 3px rgba(114,211,138,0.12); @@ -1043,6 +1167,11 @@ border: 1px solid var(--ml-border); border-radius: 8px; } +.ml-missing-browser .ml-search-results-table-wrap { + background: rgba(255,255,255,0.018); + border-color: rgba(255,255,255,0.052); + border-radius: var(--ml-missing-radius, 7px); +} .ml-search-results-table { width: 100%; min-width: var(--ml-table-min, 520px); @@ -1063,6 +1192,10 @@ text-align: left; background: rgba(255,255,255,0.035); } +.ml-missing-browser .ml-search-results-table th { + background: var(--ml-missing-surface-raised, rgba(255,255,255,0.04)); + color: #bdbdbd; +} .ml-search-results-table tr:last-child td { border-bottom: 0; } @@ -1230,6 +1363,10 @@ padding: 3px 8px; border-radius: 999px; } +.ml-missing-browser .ml-search-progress-list-compact .ml-search-progress-item { + background: var(--ml-missing-surface, rgba(255,255,255,0.024)); + border-color: var(--ml-missing-line, rgba(255,255,255,0.075)); +} .ml-search-progress-list-compact .ml-search-progress-item::before { content: ""; flex: 0 0 6px; @@ -1322,6 +1459,9 @@ padding-top: 8px; border-top: 1px solid var(--ml-divider); } +.ml-missing-browser .ml-combo-section { + border-top-color: var(--ml-missing-line, var(--ml-divider)); +} .ml-combo-row { display: flex; align-items: center; @@ -1350,6 +1490,12 @@ outline: none; transition: border-color 0.16s ease, box-shadow 0.16s ease, background 0.16s ease; } +.ml-missing-browser .ml-combo-input { + min-height: 34px; + background: rgba(255,255,255,0.035); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + border-radius: var(--ml-missing-control-radius, 7px); +} .ml-combo-input:focus { border-color: rgba(114,211,138,0.4); box-shadow: 0 0 0 3px rgba(114,211,138,0.12); @@ -1369,6 +1515,12 @@ border-radius: 12px; box-shadow: var(--ml-shadow-elevated); } +.ml-missing-browser .ml-combo-list { + background: #1b1b1b; + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + border-radius: var(--ml-missing-radius, 7px); + box-shadow: 0 16px 36px rgba(0,0,0,0.3); +} .ml-combo-option { padding: 8px 10px; cursor: pointer; @@ -1492,26 +1644,26 @@ align-items: center; gap: 10px; flex-wrap: wrap; - padding: 5px 18px; - background: linear-gradient(to top, rgba(18,18,18,0.98) 0%, rgba(18,18,18,0.92) 70%, transparent 100%); - border-top: 1px solid var(--ml-border); + padding: 7px 14px; + background: rgba(255,255,255,0.014); + border-top: 1px solid rgba(255,255,255,0.08); } .ml-footer-btn { min-height: 32px; - min-width: 144px; - padding: 7px 13px; + min-width: 138px; + padding: 0 13px; font-size: 12px; - border-radius: 9px; + border-radius: 7px; line-height: 1; - backdrop-filter: blur(10px); + backdrop-filter: none; } .ml-btn.ml-footer-btn, .ml-btn.ml-btn-primary.ml-footer-btn, .ml-btn.ml-btn-download.ml-footer-btn { - background: rgba(255,255,255,0.03); + background: rgba(255,255,255,0.035); color: var(--ml-text); - border-color: rgba(255,255,255,0.1); - box-shadow: inset 0 1px 0 rgba(255,255,255,0.02); + border-color: rgba(255,255,255,0.11); + box-shadow: none; } .ml-btn.ml-footer-btn:hover:not(:disabled), .ml-btn.ml-btn-primary.ml-footer-btn:hover:not(:disabled), @@ -1519,56 +1671,52 @@ background: rgba(255,255,255,0.05); color: var(--ml-text); border-color: rgba(255,255,255,0.16); - box-shadow: inset 0 1px 0 rgba(255,255,255,0.02); - transform: translateY(-1px); + box-shadow: none; + transform: none; } /* Tabs */ .ml-tabs { display: flex; align-items: flex-end; - gap: 6px; - padding: 7px 16px 0 16px; + gap: 4px; + padding: 8px 14px 0; margin-bottom: 0; - background: - linear-gradient(180deg, rgba(255,255,255,0.02) 0%, rgba(255,255,255,0.005) 100%); + background: rgba(255,255,255,0.012); position: relative; z-index: 2; - border-bottom: 1px solid var(--ml-border); + border-bottom: 1px solid rgba(255,255,255,0.08); } .ml-tab { position: relative; - padding: 8px 13px 9px 13px; - background: linear-gradient(180deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0.015) 100%); - border: 1px solid rgba(255,255,255,0.1); + min-height: 32px; + padding: 0 12px; + background: transparent; + border: 1px solid transparent; border-bottom: none; - border-top-left-radius: 11px; - border-top-right-radius: 11px; + border-top-left-radius: 7px; + border-top-right-radius: 7px; color: var(--ml-text-muted, #888); font-size: 12px; font-weight: 600; cursor: pointer; - box-shadow: inset 0 1px 0 rgba(255,255,255,0.03); - transform: translateY(4px); - opacity: 0.8; - transition: transform 0.18s ease, opacity 0.18s ease, color 0.18s ease, background 0.18s ease, box-shadow 0.18s ease, border-color 0.18s ease; + box-shadow: none; + transform: none; + opacity: 0.82; + transition: opacity 0.16s ease, color 0.16s ease, background 0.16s ease, border-color 0.16s ease; } .ml-tab:hover { - color: var(--ml-text-muted, #888); - background: linear-gradient(180deg, rgba(255,255,255,0.03) 0%, rgba(255,255,255,0.015) 100%); - border-color: rgba(255,255,255,0.14); - transform: translateY(2px); - opacity: 0.96; + color: var(--ml-text, #eef2f7); + background: rgba(255,255,255,0.035); + border-color: rgba(255,255,255,0.08); + opacity: 1; } .ml-tab.ml-tab-active { color: var(--ml-text, #eef2f7); background: var(--ml-bg); - border-color: rgba(255,255,255,0.16); - box-shadow: - 0 -8px 18px rgba(0,0,0,0.1), - 0 6px 10px rgba(0,0,0,0.08), - inset 0 1px 0 rgba(255,255,255,0.03); - transform: translateY(1px); + border-color: rgba(255,255,255,0.105); + box-shadow: none; + transform: none; opacity: 1; z-index: 3; } @@ -1577,11 +1725,9 @@ position: absolute; left: 0; right: 0; - bottom: -6px; - height: 8px; + bottom: -2px; + height: 3px; background: var(--ml-bg); - border-bottom-left-radius: 8px; - border-bottom-right-radius: 8px; } /* Loaded Models Tab */ @@ -2681,6 +2827,9 @@ display: grid; gap: 8px; } +.ml-missing-browser .ml-download-target { + border-top-color: var(--ml-missing-line, rgba(255,255,255,0.075)); +} .ml-download-target-grid { display: grid; grid-template-columns: minmax(120px, 33%) minmax(0, 1fr); @@ -2725,6 +2874,12 @@ outline: none; box-sizing: border-box; } +.ml-missing-browser .ml-download-target-input, +.ml-missing-browser .ml-download-target-select { + background: rgba(255,255,255,0.035); + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + border-radius: var(--ml-missing-control-radius, 7px); +} .ml-download-target-select { appearance: none; -webkit-appearance: none; @@ -2765,6 +2920,12 @@ border-radius: 12px; box-shadow: var(--ml-shadow-elevated); } +.ml-missing-browser .ml-download-target-list { + background: #1b1b1b; + border-color: var(--ml-missing-line-strong, rgba(255,255,255,0.12)); + border-radius: var(--ml-missing-radius, 7px); + box-shadow: 0 16px 36px rgba(0,0,0,0.3); +} .ml-download-target-option { padding: 8px 10px; cursor: pointer; diff --git a/web/css/linker-shell.css b/web/css/linker-shell.css index 5bbc214..11f3f25 100644 --- a/web/css/linker-shell.css +++ b/web/css/linker-shell.css @@ -25,10 +25,10 @@ resize: both; z-index: var(--ml-z-dialog); color: var(--input-text, #fff); - background: var(--comfy-menu-bg, #202020); - border: 2px solid var(--border-color, #555); - border-radius: var(--ml-ui-radius-sm); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.8); + background: var(--ml-bg, #121212); + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 7px; + box-shadow: 0 18px 46px rgba(0, 0, 0, 0.42); } .ml-context-menu { @@ -54,9 +54,10 @@ display: flex; justify-content: space-between; align-items: center; - padding: var(--ml-spacing-5); - border-bottom: 1px solid var(--border-color); - background: var(--comfy-menu-bg, #202020); + min-height: 34px; + padding: 4px 8px; + border-bottom: 1px solid rgba(255, 255, 255, 0.09); + background: rgba(255, 255, 255, 0.018); } .ml-dialog-brand, @@ -71,19 +72,20 @@ display: flex; align-items: center; justify-content: center; - height: var(--ml-spacing-24); - padding: 0 var(--ml-spacing-6); - opacity: 0.9; + height: 24px; + padding: 0 7px; + opacity: 0.82; cursor: grab; user-select: none; - border: 1px solid var(--border-color); - border-radius: var(--ml-radius-md); + border: 1px solid rgba(255, 255, 255, 0.11); + border-radius: 6px; + background: rgba(255, 255, 255, 0.025); } .ml-dialog-title { margin: 0; color: var(--input-text); - font-size: var(--ml-font-2xl); + font-size: 14px; font-weight: 600; } @@ -93,36 +95,34 @@ justify-content: center; color: var(--input-text); cursor: pointer; - border-radius: var(--ml-radius-md); + border-radius: 6px; + background: rgba(255, 255, 255, 0.025); + border: 1px solid rgba(255, 255, 255, 0.11); } .ml-window-btn--fullscreen { - min-width: var(--ml-spacing-32); - height: 30px; - padding: var(--ml-spacing-2) var(--ml-spacing-8); - font-size: var(--ml-font-xl); - background: none; - border: 1px solid var(--border-color); + min-width: 28px; + height: 26px; + padding: 0 7px; + font-size: 13px; } .ml-window-btn--close { - width: 30px; - height: 30px; + width: 26px; + height: 26px; padding: 0; - font-size: var(--ml-font-4xl); - background: none; - border: none; + font-size: 18px; } #model-linker-body { display: flex; gap: var(--ml-spacing-12); - padding: var(--ml-spacing-10) var(--ml-spacing-5) var(--ml-spacing-5); + padding: 8px 6px 6px; flex: 1; min-height: 0; align-items: stretch; position: relative; - background: var(--ml-bg, #222); + background: var(--ml-bg, #121212); } #model-linker-content { diff --git a/web/linker.js b/web/linker.js index 91e0bee..8e9b43f 100644 --- a/web/linker.js +++ b/web/linker.js @@ -2198,7 +2198,7 @@ class LinkerManagerDialog extends ComfyDialog { 'upscale_models': 'upscale_model', 'latent_upscale_models': 'latent_upscale_model', 'diffusion_models': 'unet', - 'text_encoders': 'text_encoders (also scans clip)', + 'text_encoders': 'text encoders', 'clip': 'clip', 'clip_vision': 'clip_vision', 'hypernetworks': 'hypernetwork'