diff --git a/web/linker.js b/web/linker.js index 9d9c1b9..1188aa5 100644 --- a/web/linker.js +++ b/web/linker.js @@ -2728,103 +2728,182 @@ class LinkerManagerDialog extends ComfyDialog { } .ml-options-wrap { - max-width: 760px; + max-width: 1120px; margin: 0 auto; + padding: 0 0 18px 0; + } + .ml-options-shell { + display: grid; + grid-template-columns: 240px minmax(0, 1fr); + gap: 0; + border: 1px solid rgba(255,255,255,0.08); + border-radius: 22px; + overflow: hidden; + background: #171717; + } + .ml-options-sidebar { + display: grid; + align-content: start; + gap: 18px; + padding: 18px 14px; + background: #242424; + border-right: 1px solid rgba(255,255,255,0.08); + } + .ml-options-sidebar-title { + margin: 0; + font-size: 17px; + font-weight: 700; + color: var(--ml-text); + } + .ml-options-sidebar-group { + display: grid; + gap: 8px; + } + .ml-options-sidebar-label { + font-size: 11px; + font-weight: 700; + letter-spacing: 0.04em; + text-transform: uppercase; + color: rgba(255,255,255,0.45); + } + .ml-options-nav { + display: grid; + gap: 6px; + } + .ml-options-nav-btn { display: flex; - flex-direction: column; - gap: 16px; + align-items: center; + justify-content: space-between; + gap: 10px; + width: 100%; + padding: 12px 14px; + border-radius: 8px; + border: 1px solid transparent; + background: transparent; + color: var(--ml-text-muted); + font-size: 14px; + font-weight: 600; + text-align: left; + cursor: pointer; + transition: background 0.16s ease, color 0.16s ease; + } + .ml-options-nav-btn:hover { + color: var(--ml-text); + background: rgba(255,255,255,0.04); + } + .ml-options-nav-btn.is-active { + color: #ffffff; + background: #3a3a40; + } + .ml-options-nav-meta { + font-size: 11px; + font-weight: 600; + color: rgba(255,255,255,0.42); + } + .ml-options-nav-btn.is-active .ml-options-nav-meta { + color: rgba(255,255,255,0.65); + } + .ml-options-main { + display: grid; + gap: 0; + padding: 18px 26px 24px 26px; + background: #171717; } .ml-options-card { - background: var(--ml-card-bg); - border: 1px solid var(--ml-border); - border-radius: var(--ml-radius-lg); - padding: 18px; - box-shadow: 0 6px 20px rgba(0,0,0,0.14); + background: transparent; + border: none; + border-radius: 0; + padding: 0; + box-shadow: none; } .ml-options-title { + margin: 0; + font-size: 17px; + font-weight: 700; + color: var(--ml-text); + } + .ml-options-section { + display: grid; + gap: 0; + scroll-margin-top: 24px; + } + .ml-options-section + .ml-options-section { + margin-top: 36px; + padding-top: 4px; + } + .ml-options-section-head { + display: block; + padding: 0 0 10px 0; + } + .ml-options-section-title { + margin: 0; + font-size: 20px; + font-weight: 700; + color: var(--ml-text); + } + .ml-options-grid { + display: grid; + grid-template-columns: 1fr; + gap: 0; + } + .ml-options-stack { + display: grid; + gap: 0; + } + .ml-options-panel { + display: grid; + gap: 0; + padding: 0; + border: none; + background: transparent; + } + .ml-options-panel-title { margin: 0 0 6px 0; font-size: 16px; font-weight: 700; color: var(--ml-text); } - .ml-options-subtitle { - margin: 0 0 16px 0; - font-size: 12px; - color: var(--ml-text-muted); - line-height: 1.5; - } - .ml-options-grid { - display: grid; - gap: 14px; - } - .ml-options-section { - display: grid; - gap: 14px; - padding: 14px; - border: 1px solid rgba(255,255,255,0.08); - border-radius: 14px; - background: rgba(255,255,255,0.02); - } - .ml-options-section-title { - margin: 0; - font-size: 13px; - font-weight: 700; - color: var(--ml-text); - } - .ml-options-section-subtitle { - margin: -6px 0 0 0; - font-size: 12px; - color: var(--ml-text-muted); - line-height: 1.45; - } - .ml-options-stack { - display: grid; - gap: 14px; - } .ml-options-field { display: flex; flex-direction: column; - gap: 6px; + gap: 0; } .ml-options-label { - font-size: 12px; - font-weight: 700; - color: var(--ml-text); - } - .ml-options-help { - font-size: 12px; - color: var(--ml-text-muted); - line-height: 1.45; - } - .ml-checkbox-row { display: flex; align-items: center; + flex-wrap: wrap; gap: 8px; font-size: 13px; - color: var(--ml-text); - cursor: pointer; - user-select: none; + font-weight: 600; + color: #d8d8dd; } - .ml-checkbox-row input[type="checkbox"] { - width: 15px; - height: 15px; - margin: 0; - accent-color: #4ea1ff; + .ml-options-inline-link { + border: none; + background: none; + font-size: 11px; + font-weight: 700; + padding: 0; cursor: pointer; + text-decoration: none; + color: rgba(255,255,255,0.6); + } + .ml-options-inline-link:hover { + color: #ffffff; + text-decoration: underline; } .ml-tooltip-badge { position: relative; display: inline-flex; align-items: center; justify-content: center; - width: 16px; - height: 16px; + width: 18px; + height: 18px; border-radius: 999px; - border: 1px solid var(--ml-border); - color: var(--ml-text-muted); + border: 1px solid rgba(255,255,255,0.12); + color: rgba(255,255,255,0.7); font-size: 11px; font-weight: 700; - background: rgba(255,255,255,0.04); + background: rgba(255,255,255,0.03); cursor: help; flex: 0 0 auto; } @@ -2832,21 +2911,21 @@ class LinkerManagerDialog extends ComfyDialog { content: attr(data-tooltip); position: absolute; left: 50%; - bottom: calc(100% + 8px); + bottom: calc(100% + 10px); transform: translateX(-50%); min-width: 220px; max-width: 320px; - padding: 8px 10px; - border-radius: 8px; - background: rgba(18, 22, 28, 0.96); - border: 1px solid var(--ml-border); + padding: 9px 11px; + border-radius: 10px; + background: rgba(34, 34, 38, 0.98); + border: 1px solid rgba(255,255,255,0.08); color: var(--ml-text); font-size: 12px; font-weight: 400; - line-height: 1.45; + line-height: 1.5; white-space: normal; text-align: left; - box-shadow: 0 12px 28px rgba(0,0,0,0.28); + box-shadow: 0 12px 28px rgba(0,0,0,0.32); opacity: 0; pointer-events: none; visibility: hidden; @@ -2858,63 +2937,211 @@ class LinkerManagerDialog extends ComfyDialog { visibility: visible; } .ml-options-input-row { - display: flex; + display: grid; + grid-template-columns: minmax(220px, 1fr) minmax(260px, 380px) 42px; align-items: center; - gap: 8px; + gap: 10px; + padding: 14px 0; + border-bottom: 1px solid rgba(255,255,255,0.1); + } + .ml-options-input-row > .ml-options-label { + min-width: 0; + padding-right: 8px; } .ml-options-input { width: 100%; - padding: 10px 12px; - background: rgba(255,255,255,0.04); + min-height: 42px; + padding: 11px 14px; + background: #0f1013; color: var(--ml-text); - border: 1px solid var(--ml-border); - border-radius: 10px; + border: 1px solid rgba(255,255,255,0.16); + border-radius: 8px; font-size: 13px; outline: none; + transition: border-color 0.16s ease, background 0.16s ease, box-shadow 0.16s ease; } .ml-options-input:focus { + background: #0f1013; border-color: rgba(78,161,255,0.45); - box-shadow: 0 0 0 3px rgba(78,161,255,0.12); + box-shadow: none; } .ml-options-visibility-btn { - width: 38px; - min-width: 38px; - height: 38px; + width: 42px; + min-width: 42px; + height: 42px; display: inline-flex; align-items: center; justify-content: center; - border: 1px solid var(--ml-border); - border-radius: 10px; - background: rgba(255,255,255,0.04); + border: 1px solid rgba(255,255,255,0.14); + border-radius: 8px; + background: #0f1013; color: var(--ml-text-muted); cursor: pointer; transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease; } .ml-options-visibility-btn:hover { - background: rgba(255,255,255,0.08); + background: #15171b; color: var(--ml-text); - border-color: rgba(78,161,255,0.35); + border-color: rgba(255,255,255,0.2); } .ml-options-visibility-btn[aria-pressed="true"] { color: var(--ml-text); - border-color: rgba(78,161,255,0.35); + border-color: rgba(255,255,255,0.2); + background: #15171b; } .ml-options-visibility-btn svg { width: 18px; height: 18px; display: block; } + .ml-options-toggle-list { + display: grid; + gap: 0; + } + .ml-options-toggle-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 16px 0; + border-bottom: 1px solid rgba(255,255,255,0.1); + border-radius: 0; + border-top: none; + border-left: none; + border-right: none; + background: transparent; + cursor: pointer; + transition: background 0.16s ease; + } + .ml-options-toggle-row:hover { + background: transparent; + } + .ml-options-toggle-copy { + display: grid; + gap: 0; + min-width: 0; + } + .ml-options-toggle-title { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 8px; + font-size: 13px; + font-weight: 500; + color: #d8d8dd; + } + .ml-options-toggle-control { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 46px; + padding-top: 1px; + flex: 0 0 auto; + } + .ml-options-switch-input { + position: absolute; + opacity: 0; + pointer-events: none; + } + .ml-options-switch { + position: relative; + width: 46px; + height: 26px; + border-radius: 999px; + background: #555560; + border: 1px solid rgba(255,255,255,0.06); + transition: background 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease; + } + .ml-options-switch::after { + content: ""; + position: absolute; + top: 2px; + left: 2px; + width: 20px; + height: 20px; + border-radius: 999px; + background: #f2f6fb; + box-shadow: 0 3px 8px rgba(0,0,0,0.3); + transition: transform 0.16s ease; + } + .ml-options-switch-input:checked + .ml-options-switch { + background: #4c97ff; + border-color: #4c97ff; + box-shadow: none; + } + .ml-options-switch-input:checked + .ml-options-switch::after { + transform: translateX(20px); + } + .ml-options-number-row { + display: grid; + grid-template-columns: minmax(220px, 1fr) 118px; + gap: 12px; + align-items: center; + padding: 16px 0; + border-bottom: 1px solid rgba(255,255,255,0.1); + } + .ml-options-number-copy { + display: grid; + gap: 0; + min-width: 0; + } + .ml-options-number-row .ml-options-input { + width: 100%; + min-width: 0; + } .ml-options-actions { display: flex; - gap: 8px; + align-items: center; + justify-content: space-between; + gap: 16px; flex-wrap: wrap; - margin-top: 8px; + padding-top: 18px; } .ml-options-status { - margin-top: 10px; font-size: 12px; color: var(--ml-text-muted); } + .ml-options-status.is-dirty { + color: #ffd48a; + } + .ml-options-status.is-saved { + color: #9dd8a9; + } + @media (max-width: 980px) { + .ml-options-shell { + grid-template-columns: 1fr; + border-radius: 16px; + } + .ml-options-sidebar { + border-right: none; + border-bottom: 1px solid rgba(255,255,255,0.08); + } + } + @media (max-width: 640px) { + .ml-options-section-head, + .ml-options-actions, + .ml-options-toggle-row, + .ml-options-number-row { + grid-template-columns: 1fr; + flex-direction: column; + align-items: flex-start; + } + .ml-options-toggle-control { + min-width: 0; + } + .ml-options-number-row { + grid-template-columns: 1fr; + } + .ml-options-input { + width: 100%; + } + .ml-options-input-row { + grid-template-columns: 1fr; + } + .ml-options-input-row > .ml-options-label { + padding-right: 0; + } + } .ml-download-target { margin-top: 10px; padding-top: 10px; @@ -3778,129 +4005,162 @@ class LinkerManagerDialog extends ComfyDialog { const tokens = this.getStoredTokens(); this.contentElement.innerHTML = `