/* 10-cookbook - part of the former static/style.css. * * The stylesheet is split by area, but the split is mechanical: rules were * moved verbatim and NOT regrouped. The numeric prefix is the load order, and * that order is what preserves the cascade. A rule sits in the file its * original position fell into, so an area's rules are not all in its file and * a file is not only that area's rules. * * Do not reorder the tags in static/index.html, and do not move a rule * between files: with 1,151 redeclarations and 1,886 !important in this * cascade, either can change which declaration wins. * * static/index.html and the PRECACHE list in static/sw.js must agree on this * order. tests/test_static_stylesheet_manifest.py and * tests/test_css_computed_style_snapshot.py fail if that drifts. */ .scoreboard-table tbody tr:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); } #scoreboard-overlay svg { color: var(--accent, var(--red)); } /* ── Compare search results ── */ .compare-search-results { display: flex; flex-direction: column; gap: 2px; } .compare-search-result { padding: 6px 0; border-bottom: 1px solid color-mix(in srgb, var(--border) 30%, transparent); } .compare-search-result:last-child { border-bottom: none; } .search-result-title { color: var(--color-accent); text-decoration: none; font-weight: 500; font-size: 0.9em; display: block; line-height: 1.3; } .search-result-title:hover { color: var(--color-link-hover); text-decoration: underline; } .search-result-snippet { color: color-mix(in srgb, var(--fg) 70%, transparent); font-size: 0.82em; line-height: 1.4; margin-top: 2px; } .search-result-url { color: color-mix(in srgb, var(--fg) 35%, transparent); font-size: 0.75em; margin-top: 3px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } /* ── Cookbook Tool ── */ /* ── Cookbook ── */ .cookbook-serve-preset { display: flex; align-items: center; gap: 6px; padding: 4px 8px; border: 1px solid var(--border); border-radius: 6px; background: color-mix(in srgb, var(--fg) 3%, transparent); margin-bottom: 3px; cursor: pointer; transition: background 0.15s; } .cookbook-serve-preset:hover { background: color-mix(in srgb, var(--fg) 8%, transparent); } .cookbook-serve-preset-name { font-size: 11px; font-weight: 500; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cookbook-serve-preset-meta { font-size: 9px; font-family: 'Fira Code', monospace; color: var(--fg-muted); opacity: 0.5; } .cookbook-serve-preset-launch { background: none; border: none; color: #50fa7b; cursor: pointer; font-size: 10px; opacity: 0.6; padding: 0 2px; position: relative; top: -4px; } .cookbook-serve-preset-launch:hover { opacity: 1; } .cookbook-serve-preset-rm { background: none; border: none; color: var(--fg-muted); cursor: pointer; font-size: 10px; opacity: 0.3; padding: 0 2px; position: relative; top: -4px; } .cookbook-serve-preset-rm:hover { opacity: 0.8; color: var(--red); } .cookbook-body { display: flex; flex-direction: column; gap: 10px; overflow-y: auto; flex: 1; min-height: 0; scrollbar-width: thin; } #cookbook-modal .modal-content { display: flex; flex-direction: column; overflow: hidden; } #cookbook-modal .modal-header { flex: 0 0 auto; } #cookbook-modal .cookbook-body { min-height: 0; overflow-y: auto; overflow-x: hidden; } #cookbook-modal .cookbook-group { min-height: 0; } #cookbook-modal .cookbook-group > .admin-card { min-height: 0; /* Let .cookbook-body be the SINGLE scroll surface. Nesting another overflow:auto here trapped the wheel inside the cached-list when a serve panel expanded — the page couldn't scroll past the panel's bottom (Launch button got hidden). */ overflow: visible !important; } #cookbook-modal .cookbook-section-body { min-height: 0; } .cookbook-group { display: flex; flex-direction: column; gap: 8px; flex: 1; min-height: 0; } /* Cards — match admin-card */ .cookbook-card { background: var(--bg); border: 1px solid var(--border); border-radius: 8px; padding: 12px; display: flex; flex-direction: column; gap: 6px; } .cookbook-card-header { display: flex; align-items: center; justify-content: space-between; } .cookbook-card-header-actions { display: flex; gap: 4px; } .cookbook-card-title { font-size: 13px; font-weight: 600; } .cookbook-card-desc { font-size: 11px; color: color-mix(in srgb, var(--fg) 50%, transparent); } /* Fields grid */ .cookbook-fields { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 6px; margin-top: 4px; } .cookbook-field-label { display: flex; flex-direction: column; font-size: 11px; color: color-mix(in srgb, var(--fg) 60%, transparent); gap: 3px; } /* Inputs — match admin-add-form input */ .cookbook-field-input { padding: 5px 8px; font-size: 12px; font-family: inherit; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; outline: none; } .cookbook-field-input:focus { border-color: var(--red); } #hwfit-dl-server, #hwfit-usecase, #hwfit-server-select, #hwfit-cache-server, #serve-sort { height: 28px; width: 88px; } /* Serve tab — match Documents sizing, but leave room for the active "Cancel" label and center it vertically so the descenders don't clip. */ #hwfit-cache-select { min-width: 58px; height: 28px; position: relative; top: -3px; display: inline-flex; align-items: center; justify-content: center; line-height: 1; } /* Command preview */ .cookbook-cmd-preview { margin: 4px 0 0; padding: 8px 10px; background: color-mix(in srgb, var(--fg) 4%, transparent); border: 1px solid var(--border); border-radius: 6px; font-family: 'Fira Code', monospace; font-size: 11px; white-space: pre-wrap; word-break: break-all; color: var(--fg); } /* Buttons — match admin-btn-sm */ .cookbook-actions { display: flex; gap: 6px; margin-top: 2px; } .cookbook-btn { padding: 4px 10px; min-width: 54px; text-align: center; font-size: 11px; font-family: inherit; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); cursor: pointer; transition: all 0.15s; } .cookbook-btn:hover { background: var(--border); border-color: var(--accent); } .cookbook-btn:disabled { opacity: 0.5; cursor: not-allowed; } .cookbook-run-btn { background: var(--accent); color: var(--panel); border-color: var(--accent); font-weight: 600; } .cookbook-run-btn:hover { opacity: 0.85; } .cookbook-stop-btn { background: var(--color-error); border-color: var(--color-error); } /* Output */ .cookbook-output-wrap { position: relative; margin: 0; } .cookbook-output-kill { position: absolute; top: 4px; right: 34px; width: 22px; height: 22px; padding: 0; background: none; border: 1px solid transparent; border-radius: 4px; color: var(--fg-muted); font-size: 16px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity .15s, color .15s; display: flex; align-items: center; justify-content: center; } .cookbook-output-kill:hover { color: var(--color-error, var(--warn)); border-color: var(--border); } .cookbook-output-wrap .copy-code { position: absolute; top: 6px; right: 6px; } .cookbook-output-wrap:hover .copy-code { opacity: 0.7; } .cookbook-output-pre { margin: 0; padding: 8px 10px; background: color-mix(in srgb, var(--fg) 4%, transparent); border: 1px solid var(--border); border-radius: 6px; font-family: 'Fira Code', monospace; font-size: 11px; white-space: pre-wrap; word-break: break-all; max-height: 180px; overflow-y: auto; } .cookbook-output-error { color: var(--color-error); } /* Downloaded/cached models */ .hwfit-cached-item { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; padding: 6px 8px; margin: 2px 0; border-radius: 6px; border: 1px solid var(--border); background: color-mix(in srgb, var(--fg) 3%, transparent); cursor: default; font-size: 12px; } .hwfit-cached-item .hwfit-serve-panel { flex-basis: 100%; margin-top: 4px; } .hwfit-cached-item:hover { background: color-mix(in srgb, var(--fg) 6%, transparent); } .hwfit-cached-header { font-size: 10px; opacity: 0.4; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; border: none !important; background: none !important; padding: 2px 8px; cursor: default !important; } .hwfit-cached-header:hover { background: none !important; } .hwfit-cached-name { font-weight: 600; flex-shrink: 0; } .hwfit-cached-repo { flex: 1; color: var(--fg-muted); font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .hwfit-cached-size, .hwfit-cached-files { font-size: 10px; color: var(--fg-muted); white-space: nowrap; } .hwfit-cached-serve, .hwfit-cached-delete { flex-shrink: 0; } .hwfit-cached-delete { opacity: 0.4; font-size: 10px; } .hwfit-cached-delete:hover { opacity: 1; color: var(--color-error, var(--warn)); } .hwfit-cached-badge { font-size: 9px; padding: 1px 6px; border-radius: 3px; font-weight: 600; white-space: nowrap; } .hwfit-cached-ready { background: color-mix(in srgb, var(--color-success, #4caf50) 20%, transparent); color: var(--color-success, #4caf50); } .hwfit-cached-dl { background: color-mix(in srgb, var(--color-warning, #f0ad4e) 20%, transparent); color: var(--color-warning, #f0ad4e); } /* Cookbook notification dot */ #tool-cookbook-btn { position: relative; } #rail-cookbook { position: relative; } .cookbook-open-loading { display: inline-flex; align-items: center; justify-content: center; width: 14px; height: 14px; flex-shrink: 0; margin-left: 2px; color: var(--accent, var(--red)); opacity: 0.9; } .cookbook-open-loading .ai-spinner, .cookbook-open-loading .ai-spinner-whirlpool { display: inline-flex !important; width: 14px; height: 14px; margin: 0 !important; gap: 0 !important; } .cookbook-open-loading canvas { display: block; } .cookbook-section-loading-wp, .cookbook-section-loading-wp canvas { width: 22px !important; height: 22px !important; display: block !important; } #rail-cookbook .cookbook-open-loading { position: absolute; right: 2px; top: -2px; width: 12px; height: 12px; margin-left: 0; } /* The serve-list 'downloading' / 'download stalled' status text sits a hair low against the rest of the meta line on mobile — nudge it up 2px. */ @media (max-width: 768px) { .cookbook-dl-status { position: relative; top: -2px; } } .cookbook-notif-dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: 50%; background: var(--color-success, #4caf50); /* Drives the breathing glow in the keyframes (matches email's dot). */ --notif-glow: var(--color-success, #4caf50); animation: cookbook-notif-pulse 2s ease-in-out infinite; } .cookbook-notif-dot.cookbook-notif-error { background: var(--color-error, #f44); --notif-glow: var(--color-error, #f44); position: relative; left: -2px; top: -1px; } .rail-notify-error { color: var(--color-error, #f44) !important; } .cookbook-tab-error-dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%; background: var(--color-error, #f44); margin-left: 4px; vertical-align: middle; animation: cookbook-notif-pulse 2s ease-in-out infinite; } @keyframes cookbook-notif-pulse { 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 color-mix(in srgb, var(--notif-glow, var(--accent, var(--red))) 60%, transparent); } 50% { opacity: 0.85; box-shadow: 0 0 6px 2px color-mix(in srgb, var(--notif-glow, var(--accent, var(--red))) 55%, transparent); } } .cookbook-clear-btn { font-size: 10px !important; padding: 0 8px !important; height: 22px !important; border-radius: 6px !important; border: 1px solid var(--border) !important; color: color-mix(in srgb, var(--fg) 40%, transparent) !important; opacity: 1 !important; background: none !important; } .cookbook-clear-btn:hover { color: var(--red) !important; border-color: var(--red) !important; background: color-mix(in srgb, var(--red) 8%, transparent) !important; } .cookbook-bulk-bar { display: flex; align-items: center; gap: 6px; padding: 4px 8px; margin-bottom: 4px; background: color-mix(in srgb, var(--red) 6%, transparent); border: 1px solid color-mix(in srgb, var(--red) 20%, transparent); border-radius: 6px; font-size: 11px; } .cookbook-bulk-bar.hidden { display: none; } .serve-select-cb { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; cursor: pointer; background: var(--border); transition: background 0.15s; align-self: center; position: relative; top: -2px; } #serve-bulk-bar { position: relative; top: -6px; } #serve-bulk-bar #serve-bulk-cancel { top: -2px !important; display: inline-flex; align-items: center; justify-content: center; min-width: 28px; height: 24px; line-height: 1; } #serve-bulk-bar #serve-bulk-cancel svg { top: 0; } .serve-select-cb.selected { background: var(--red); } .serve-select-cb:hover { background: color-mix(in srgb, var(--red) 50%, transparent); } #hwfit-cache-select.active { background: var(--red); color: #fff; border-color: var(--red); } .cookbook-serve-dirs { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; } .cookbook-serve-dir-pill { font-size: 10px; font-family: 'Fira Code', monospace; padding: 2px 8px; border-radius: 4px; background: color-mix(in srgb, var(--fg) 6%, transparent); border: 1px solid color-mix(in srgb, var(--fg) 10%, transparent); color: var(--fg-muted); letter-spacing: 0.2px; } /* Status pills shown inline in a Serve-tab card title (next to the model name) when the model has a live serve / download task. Shared base class so "running" and "downloading" sit on the same row with the same chrome; only color varies. */ .cookbook-serve-running-pill, .cookbook-serve-downloading-pill { display: inline-block; margin-left: 6px; padding: 1px 7px; border-radius: 10px; font-size: 9px; font-weight: 500; text-transform: lowercase; letter-spacing: 0.3px; vertical-align: 2px; position: relative; top: 1px; /* nudged down 2px from the old -1px so it sits flush with the cap-height of the title text */ } .cookbook-serve-running-pill { color: var(--accent, var(--red)); background: color-mix(in srgb, var(--accent, var(--red)) 12%, transparent); border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 35%, transparent); } .cookbook-serve-downloading-pill { color: var(--accent, var(--red)); background: color-mix(in srgb, var(--accent, var(--red)) 12%, transparent); border: 1px solid color-mix(in srgb, var(--accent, var(--red)) 35%, transparent); opacity: 0.85; } .cookbook-serve-downloading-pill.is-stalled { /* Stalled downloads stay visible but read as warning, not progress. */ color: var(--fg-muted, #888); background: color-mix(in srgb, var(--fg-muted, #888) 10%, transparent); border-color: color-mix(in srgb, var(--fg-muted, #888) 30%, transparent); opacity: 1; } .cookbook-serve-running-pill.is-clickable { cursor: pointer; transition: background 0.12s, border-color 0.12s; } .cookbook-serve-running-pill.is-clickable:hover { background: color-mix(in srgb, var(--accent, var(--red)) 22%, transparent); border-color: color-mix(in srgb, var(--accent, var(--red)) 55%, transparent); } .cookbook-serve-dir-edit { font-size: 9px; color: var(--fg-muted); opacity: 0.4; cursor: pointer; text-decoration: underline; text-underline-offset: 2px; } .cookbook-serve-dir-edit:hover { opacity: 0.7; color: var(--accent, var(--red)); } .cookbook-gpu-group { display: flex; gap: 3px; margin-top: -4px; } .cookbook-gpu-btn { width: 30px; height: 30px; font-size: 12px; font-family: 'Fira Code', monospace; border: 1px solid var(--border); border-radius: 4px; background: none; color: var(--fg-muted); cursor: pointer; opacity: 0.4; transition: all 0.15s; padding: 0; display: flex; align-items: center; justify-content: center; } .cookbook-gpu-btn:hover { opacity: 0.7; border-color: var(--fg-muted); } .cookbook-gpu-btn.active { opacity: 1; background: color-mix(in srgb, var(--fg) 10%, transparent); border-color: color-mix(in srgb, var(--fg) 55%, transparent); color: var(--fg); font-weight: 600; } /* Probe annotation states (set by "Free?" button) */ .cookbook-gpu-btn.gpu-free { opacity: 1; border-color: #4ade80; color: #4ade80; } .cookbook-gpu-btn.gpu-busy { opacity: 0.85; border-color: color-mix(in srgb, var(--red) 70%, transparent); color: var(--red); background: color-mix(in srgb, var(--red) 8%, transparent); } .cookbook-gpu-btn.gpu-missing { opacity: 0.2; text-decoration: line-through; cursor: not-allowed; } /* "Clear Server" lives in the actions row next to "Probe GPUs". Inherits .cookbook-btn sizing; this rule just adds the destructive red tint on hover so the "this kills processes" cue stays. */ .cookbook-gpu-clear:hover:not(:disabled) { color: var(--red); border-color: color-mix(in srgb, var(--red) 60%, var(--border)); background: color-mix(in srgb, var(--red) 8%, transparent); } .cookbook-gpu-clear:disabled { opacity: 0.4; cursor: wait; } .cookbook-gpu-clear:disabled { opacity: 0.4; cursor: wait; } /* GPU probe popup — per-GPU process list with kill buttons */ .cookbook-gpu-popup { /* Fixed positioning (relative to viewport) so we never get pulled into a scrolling/transform stacking context from an ancestor. Z-index has to clear the cookbook modal (260) and the rest of the high-z UI layers (themed-confirm and various overlays sit around 9000-10000). */ position: fixed; z-index: 10010; min-width: 280px; max-width: 420px; background: var(--panel, #1a1a1a); border: 1px solid var(--border); border-radius: 6px; box-shadow: 0 8px 24px rgba(0,0,0,0.4); font-family: 'Fira Code', monospace; font-size: 11px; color: var(--fg); } .cookbook-gpu-popup-head { display: flex; align-items: center; gap: 8px; padding: 6px 10px; border-bottom: 1px solid var(--border); font-weight: 600; } .cookbook-gpu-popup-stats { flex: 1; font-weight: 400; color: var(--fg-muted); font-size: 10px; } .cookbook-gpu-popup-close { background: none; border: none; color: var(--fg-muted); cursor: pointer; font-size: 14px; padding: 0 4px; } .cookbook-gpu-popup-close:hover { color: var(--fg); } .cookbook-gpu-popup-body { padding: 4px 0; max-height: 320px; overflow-y: auto; } .cookbook-gpu-popup-empty { padding: 10px; color: var(--fg-muted); font-style: italic; } .cookbook-gpu-proc { display: flex; align-items: center; gap: 6px; padding: 4px 10px; } .cookbook-gpu-proc:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); } .cookbook-gpu-proc-info { flex: 1; display: flex; gap: 8px; align-items: center; min-width: 0; } .cookbook-gpu-proc-pid { color: var(--fg-muted); width: 56px; flex-shrink: 0; } .cookbook-gpu-proc-name { flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; } .cookbook-gpu-proc-mem { color: var(--fg-muted); flex-shrink: 0; } .cookbook-gpu-proc-actions { display: flex; gap: 4px; flex-shrink: 0; } .cookbook-gpu-kill { border: 1px solid color-mix(in srgb, var(--red) 60%, transparent); background: none; color: var(--red); border-radius: 3px; padding: 2px 8px; cursor: pointer; font-family: inherit; font-size: 10px; } .cookbook-gpu-kill[data-sig="KILL"] { background: color-mix(in srgb, var(--red) 12%, transparent); } .cookbook-gpu-kill:hover:not(:disabled) { background: color-mix(in srgb, var(--red) 20%, transparent); } .cookbook-gpu-kill:disabled { opacity: 0.4; cursor: wait; } .cookbook-serve-title { display: flex; align-items: center; gap: 4px; min-width: 0; } .cookbook-serve-title-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cookbook-hf-link { font-size: 9px; text-decoration: none; color: var(--fg-muted); opacity: 0.5; padding: 1px 5px; border: 1px solid color-mix(in srgb, var(--fg) 12%, transparent); border-radius: 3px; background: color-mix(in srgb, var(--fg) 4%, transparent); vertical-align: 1px; letter-spacing: 0.3px; font-weight: 600; flex-shrink: 0; } .cookbook-hf-link:hover { opacity: 0.8; border-color: var(--accent, var(--red)); color: var(--accent, var(--red)); } /* In the Trending models list the HF pill is the row's main affordance — tint it accent so it stands out next to the model name. */ #cookbook-hf-latest-list .cookbook-hf-link { color: var(--accent, var(--red)); opacity: 0.85; border-color: color-mix(in srgb, var(--accent, var(--red)) 30%, transparent); } /* Running tab sections */ .cookbook-saved-section, .cookbook-serve-section, .cookbook-dl-section { border: 1px solid var(--border); border-radius: 6px; margin-bottom: 6px; overflow: hidden; } /* Divider between server-group sections in the Active tab so the transition between e.g. local + remote-host server blocks reads visually instead of running into each other. */ .cookbook-group[data-backend-group="Running"] > [class*="cookbook-server-section-"] + [class*="cookbook-server-section-"] { margin-top: 14px; padding-top: 14px; border-top: 1px solid color-mix(in srgb, var(--border) 65%, transparent); } .cookbook-section-header { display: flex; align-items: center; gap: 6px; padding: 7px 10px; cursor: pointer; user-select: none; /* Persistent surface + border so it reads as a clickable bar instead of blending into the panel background. */ background: color-mix(in srgb, var(--fg) 5%, transparent); border: 1px solid var(--border); border-radius: 6px; transition: background 0.15s, border-color 0.15s; } .cookbook-section-header:hover { background: color-mix(in srgb, var(--fg) 9%, transparent); border-color: color-mix(in srgb, var(--fg) 22%, transparent); } .cookbook-section-header.has-server-color { color: var(--fg); border-color: color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 45%, var(--border)); background: color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 4%, var(--bg)); box-shadow: inset 6px 0 0 var(--cookbook-server-accent, var(--cookbook-server-color)); } .cookbook-section-header.has-server-color:hover { background: color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 7%, var(--bg)); border-color: color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 60%, var(--border)); } .cookbook-section-header.has-server-color .cookbook-section-title, .cookbook-section-header.has-server-color .cookbook-section-chevron { color: var(--cookbook-server-accent, var(--cookbook-server-color)); } .cookbook-section-header.has-server-color .cookbook-srv-status.ok { background: var(--cookbook-server-accent, var(--cookbook-server-color)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 18%, transparent), 0 0 8px color-mix(in srgb, var(--cookbook-server-accent, var(--cookbook-server-color)) 55%, transparent); } .cookbook-section-header .cookbook-clear-btn { margin-left: 0; position: relative; top: -3px; } @media (max-width: 768px) { .cookbook-section-header .cookbook-clear-btn { top: -3px; } .cookbook-task-check { top: 4px; } } /* "Stop all" sits just left of "Clear finished"; it carries the auto margin so the pair is pushed together to the right of the section title. */ .cookbook-section-header .cookbook-stop-all-btn { margin-left: auto; margin-right: 6px; position: relative; top: -3px; } .cookbook-stop-all-btn { font-size: 10px !important; padding: 0 8px !important; height: 22px !important; border-radius: 6px !important; border: 1px solid var(--border) !important; color: color-mix(in srgb, var(--fg) 40%, transparent) !important; opacity: 1 !important; background: none !important; } .cookbook-stop-all-btn:hover { color: var(--warn, #f0ad4e) !important; border-color: var(--warn, #f0ad4e) !important; background: color-mix(in srgb, var(--warn, #f0ad4e) 8%, transparent) !important; } .cookbook-section-chevron { flex-shrink: 0; opacity: 0.6; transition: transform 0.15s ease, opacity 0.15s ease; } .cookbook-section-body { padding: 0; } .cookbook-saved-toggle-header { font-size: 10px; font-weight: 600; color: var(--fg-muted); text-transform: uppercase; letter-spacing: 0.3px; margin-bottom: 4px; } .cookbook-saved-toggle:hover { color: var(--fg); } .cookbook-saved-item { margin: 2px 0; border-radius: 4px; font-size: 11px; } .cookbook-saved-header { display: flex; align-items: center; gap: 6px; padding: 4px 6px; border-radius: 4px; transition: background 0.08s; } .cookbook-saved-header:hover { background: color-mix(in srgb, var(--fg) 5%, transparent); } .cookbook-saved-item .hwfit-serve-panel { margin: 4px 0 4px 6px; } .cookbook-saved-host { font-size: 10px; color: var(--fg-muted); font-family: 'Fira Code', monospace; } .cookbook-saved-name { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .cookbook-saved-launch { font-size: 10px; padding: 2px 8px; } .cookbook-saved-del { background: none; border: none; color: var(--fg-muted); opacity: 0.3; cursor: pointer; font-size: 11px; padding: 0 2px; } .cookbook-saved-del:hover { opacity: 1; color: var(--color-error, var(--warn)); } /* Serve config panel */ .hwfit-serve-panel { margin-top: 6px; padding: 10px; border: 1px solid var(--border); border-radius: 6px; background: color-mix(in srgb, var(--fg) 3%, transparent); flex: 1; display: flex; flex-direction: column; position: relative; } .cookbook-serve-slots { display: flex; gap: 3px; justify-content: flex-end; margin-bottom: 4px; } /* When the Save split sits inside Row 1 (next to GPUs), align it with the input baseline (the row's grid cells stretch top-down; without this the Save buttons sit above the GPU button group). */ .hwfit-serve-row .cookbook-serve-slots { align-self: end; margin-bottom: 4px; } .cookbook-slot-btn { min-width: 22px; height: 28px; padding: 0 6px; font-size: 10px; font-weight: 600; border: 1px solid var(--border); border-radius: 4px; background: none; white-space: nowrap; max-width: 80px; overflow: hidden; text-overflow: ellipsis; color: var(--fg-muted); cursor: pointer; display: flex; align-items: center; justify-content: center; opacity: 0.5; transition: all 0.15s; } .cookbook-slot-btn:hover { opacity: 0.9; border-color: var(--fg-muted); } /* Saved-configs split button: "Save" + dropdown-arrow joined into one control, but each segment keeps its own style — Save uses the filled accent "Done"-button look; the arrow stays a subtle outlined menu trigger. */ .cookbook-saved-split { gap: 0; } .cookbook-saved-save, .cookbook-saved-arrow { max-width: none; } .cookbook-saved-save { padding: 0 10px; gap: 4px; background: var(--bg); color: var(--fg); border-color: var(--border); font-weight: 600; opacity: 1; border-top-right-radius: 0; border-bottom-right-radius: 0; } .cookbook-saved-save:hover { background: var(--border); border-color: var(--accent); opacity: 1; } .cookbook-saved-arrow { padding: 0 6px; background: var(--bg); color: var(--fg); border-color: var(--border); opacity: 1; border-top-left-radius: 0; border-bottom-left-radius: 0; border-left: none; } .cookbook-saved-menu .cookbook-saved-favorite { border-left: 3px solid var(--red); background: color-mix(in srgb, var(--red) 4%, transparent); } .cookbook-saved-fav-btn { width: 20px; height: 20px; padding: 0; border: 1px solid transparent; border-radius: 6px; background: none; color: var(--fg-muted); opacity: 0.55; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; } .cookbook-saved-fav-btn:hover, .cookbook-saved-fav-btn.active { color: var(--red); opacity: 1; background: color-mix(in srgb, var(--red) 10%, transparent); } .cookbook-saved-fav-badge { flex-shrink: 0; background: transparent; padding: 0; } .cookbook-serve-favorite-model { border-left-color: var(--red) !important; background: color-mix(in srgb, var(--red) 4%, transparent); } .cookbook-serve-fav-badge { display: inline-flex; align-items: center; vertical-align: 1px; margin-left: 5px; margin-right: 2px; background: transparent; padding: 0; } .cookbook-slot-saved { background: color-mix(in srgb, var(--accent) 10%, transparent); border-color: color-mix(in srgb, var(--accent) 30%, transparent); color: var(--accent); } .cookbook-slot-saved:hover { background: color-mix(in srgb, var(--accent) 20%, transparent); } .cookbook-slot-btn.active { opacity: 1; background: var(--accent); color: #fff; border-color: var(--accent); } .cookbook-slot-wrap { position: relative; display: inline-flex; } .cookbook-slot-del { position: absolute; top: -5px; right: -5px; width: 14px; height: 14px; padding: 0; border: 1px solid var(--border); border-radius: 50%; background: var(--bg, #1a1a1a); color: var(--fg-muted); font-size: 12px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 0.15s, color 0.15s, border-color 0.15s; display: flex; align-items: center; justify-content: center; } .cookbook-slot-del:hover { color: #f44; border-color: #f44; } .cookbook-card-backend { display: none; } /* Dependencies row — aligned tags */ .cookbook-dep-row { display: flex; align-items: center; gap: 6px; padding: 8px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--panel); } /* Let the deps list fill the available window height instead of being capped at the default .doclib-grid 400-px box. */ [data-backend-group="Dependencies"] #cookbook-deps-list { flex: 1; max-height: none; } /* Settings tab: stack the HF token + Servers cards as distinct blocks (matches the Download tab's block-per-section layout). */ .cookbook-settings-stack { display: flex; flex-direction: column; gap: 10px; flex: 1; /* Scroll the whole settings panel so the Servers card can grow to hold every server (it used to be a cramped internal scroll box that clipped them). */ overflow-y: auto; min-height: 0; } .cookbook-settings-stack.hidden { display: none; } .cookbook-dep-row.cookbook-dep-blocked { opacity: 0.4; } .cookbook-dep-info { flex: 1; min-width: 0; } .cookbook-dep-section { display: flex; align-items: baseline; gap: 8px; margin: 12px 2px 4px; } .cookbook-dep-section-title { font-size: 11px; font-weight: 600; letter-spacing: 0.03em; } .cookbook-dep-section-note { font-size: 10px; color: color-mix(in srgb, var(--fg) 50%, transparent); } .cookbook-dep-subgroup { margin: 6px 0 8px 12px; padding: 7px 8px 8px; border-left: 2px solid color-mix(in srgb, var(--accent, var(--red)) 45%, transparent); background: color-mix(in srgb, var(--fg) 3%, transparent); border-radius: 0 6px 6px 0; display: flex; flex-direction: column; gap: 6px; } .cookbook-dep-subgroup-title { display: flex; align-items: baseline; gap: 7px; margin: 0 1px 1px; font-size: 10.5px; font-weight: 700; color: color-mix(in srgb, var(--fg) 78%, transparent); } .cookbook-dep-subgroup-title em { font-size: 9.5px; font-style: normal; font-weight: 500; color: color-mix(in srgb, var(--fg) 48%, transparent); } .cookbook-dep-tag { font-size: 9px; padding: 0 8px; border-radius: 4px; white-space: nowrap; text-align: center; min-width: 62px; box-sizing: border-box; line-height: 1; /* Explicit height so the