From 0d8d1630813e6f5d63d20099bc99e45c48b1344d Mon Sep 17 00:00:00 2001 From: DemonGatanjieu <1027066412@qq.com> Date: Wed, 16 Sep 2026 18:39:08 +0800 Subject: [PATCH] feat(ui): restore colorful emoji icons and expand toolbox layout into spacious 2x2 grid --- ARCHITECTURE.md | 2 +- web/modules/ui_sidebar.js | 9 +- web/styles.css | 947 +++++++++++++++++--------------------- 3 files changed, 440 insertions(+), 518 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index d66279d..93a7c29 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -86,7 +86,7 @@ DOM or live LiteGraph state. - `sidebar_actions.js` owns the sidebar bottom action hover-reveal short labels (100ms), singleton dynamic DOM tooltip bubbles (`#anomalous-sidebar-tooltip-bubble`, 600ms), and anti-flicker pointer stability guards (opacity-based icon transitions, pointer-events isolation, fixed box model). - `tool_registry.js` centralizes metadata, SVG icons, and stable IDs for the 8 catalog tools and 2 fixed anchors (Toolbox and Settings). - `shortcut_layout.js` provides tool layout utilities and fallbacks. The bottom shortcut bar maintains the clean fixed 4-tool setup (`scan`, `doctor`, `assistant`, `materials`) plus two anchors (`toolbox`, `settings`), directly executable via click without drag complexity. -- `ui_sidebar.js`'s Toolbox modal strictly filters out all tools already present on the bottom bar, presenting a dedicated 2x2 utility catalog (`workflow-transfer`, `prompt-studio`, `prompt-translator`, `model-sources`) with native icons and direct execution. +- `ui_sidebar.js`'s Toolbox modal strictly filters out all tools already present on the bottom bar, presenting a dedicated spacious 2x2 utility catalog (`workflow-transfer`, `prompt-studio`, `prompt-translator`, `model-sources`) with recognizable color emoji icons and direct execution. - `ui_grid.js` and model-detail modules own model presentation; `ui_gallery.js` and `ui_gallery_detail.js` own generated-image browsing and inspection. - `ui_recipes.js` / `ui_recipe_detail.js`, `ui_notebooks.js`, and `ui_materials.js` diff --git a/web/modules/ui_sidebar.js b/web/modules/ui_sidebar.js index ce13f4e..77145d7 100644 --- a/web/modules/ui_sidebar.js +++ b/web/modules/ui_sidebar.js @@ -2116,6 +2116,13 @@ export function createDOM() { const allTools = [...CATALOG_TOOLS, ...(this.customToolboxItems || [])]; const toolboxTools = allTools.filter(tool => !outsideToolIds.has(tool.id)); + const COLOR_ICONS = { + 'workflow-transfer': '🔄', + 'prompt-studio': '🎛️', + 'prompt-translator': '🌐', + 'model-sources': '🔗', + }; + toolboxTools.forEach(tool => { const tile = document.createElement('div'); tile.className = 'anomalous-toolbox-tile anomalous-tooltip-target'; @@ -2125,7 +2132,7 @@ export function createDOM() { const iconEl = document.createElement('div'); iconEl.className = 'anomalous-toolbox-tile-icon'; - iconEl.innerHTML = tool.icon || '🔧'; + iconEl.innerHTML = COLOR_ICONS[tool.id] || tool.icon || '🔧'; tile.appendChild(iconEl); const labelEl = document.createElement('div'); diff --git a/web/styles.css b/web/styles.css index ebd1c9d..71da68f 100644 --- a/web/styles.css +++ b/web/styles.css @@ -1036,21 +1036,21 @@ html:not(.anomalous-floating-entry-enabled) [data-setting-id="Anomalous.ModelBro position: absolute; bottom: 50px; left: 10px; - width: 236px; + width: 248px; min-height: auto; box-sizing: border-box; background: rgba(22, 22, 26, 0.98); backdrop-filter: blur(20px); -webkit-backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.12); - border-radius: 10px; - padding: 10px 10px 8px; + border-radius: 12px; + padding: 12px 12px 10px; box-shadow: 0 16px 40px rgba(0, 0, 0, 0.85), 0 0 0 1px rgba(255, 255, 255, 0.05); z-index: 999999 !important; transition: left 0.25s cubic-bezier(0.2, 0.8, 0.2, 1), bottom 0.25s cubic-bezier(0.2, 0.8, 0.2, 1); display: none; flex-direction: column; - gap: 6px; + gap: 8px; overflow: hidden !important; scrollbar-width: none !important; -ms-overflow-style: none !important; @@ -1070,8 +1070,8 @@ html:not(.anomalous-floating-entry-enabled) [data-setting-id="Anomalous.ModelBro .anomalous-toolbox-grid { display: grid; grid-template-columns: repeat(2, 1fr); - gap: 6px; - margin: 2px 0 2px; + gap: 10px; + margin: 4px 0 6px; align-content: start; flex: 1; } @@ -1082,23 +1082,23 @@ html:not(.anomalous-floating-entry-enabled) [data-setting-id="Anomalous.ModelBro align-items: center; justify-content: center; text-align: center; - padding: 8px 3px 6px; - min-height: 54px; + padding: 14px 6px 12px; + min-height: 72px; box-sizing: border-box; - background: rgba(255, 255, 255, 0.035); - border: 1px solid rgba(255, 255, 255, 0.06); - border-radius: 8px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.07); + border-radius: 10px; cursor: pointer; position: relative; user-select: none; - transition: all 0.15s cubic-bezier(0.16, 1, 0.3, 1); + transition: all 0.18s cubic-bezier(0.16, 1, 0.3, 1); } .anomalous-toolbox-tile:hover { - background: rgba(255, 255, 255, 0.08); - border-color: rgba(255, 255, 255, 0.18); - transform: translateY(-1px); - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.35); + background: rgba(255, 255, 255, 0.09); + border-color: rgba(255, 255, 255, 0.2); + transform: translateY(-2px); + box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4); } .anomalous-toolbox-tile:active { @@ -1106,18 +1106,19 @@ html:not(.anomalous-floating-entry-enabled) [data-setting-id="Anomalous.ModelBro } .anomalous-toolbox-tile-icon { - font-size: 18px; + font-size: 26px; line-height: 1; - margin-bottom: 5px; + margin-bottom: 7px; display: flex; align-items: center; justify-content: center; + user-select: none; } .anomalous-toolbox-tile-label { - font-size: 11px; + font-size: 11.5px; font-weight: 500; - color: #d4d4d8; + color: #e2e8f0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -1141,6 +1142,15 @@ html:not(.anomalous-floating-entry-enabled) [data-setting-id="Anomalous.ModelBro box-shadow: 0 0 5px rgba(16, 185, 129, 0.75); } +.anomalous-toolbox-footer-row { + display: flex; + align-items: center; + justify-content: space-between; + padding: 6px 4px 2px; + margin-top: 4px; + border-top: 1px solid rgba(255, 255, 255, 0.06); +} + .anomalous-sidebar-closed #anomalous-sidebar-actions { flex-direction: column !important; } @@ -11862,49 +11872,49 @@ button:hover .anomalous-btn-icon { filter: none; } -#anomalous-sidebar-actions { - position: relative; - overflow: visible; - display: flex; - align-items: center; - justify-content: space-around; - padding: 10px 8px; - gap: 4px; - box-sizing: border-box; -} - -#anomalous-sidebar-actions button { - position: relative; - display: inline-flex !important; - align-items: center !important; - justify-content: center !important; - width: 32px !important; - height: 32px !important; - border-radius: 6px !important; - box-sizing: border-box !important; - vertical-align: middle !important; - color: var(--amb-text-muted, #9ca3af) !important; - background: transparent !important; - border: 1px solid transparent !important; - cursor: pointer !important; - overflow: hidden !important; - pointer-events: auto !important; - transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease; -} - -#anomalous-sidebar-actions button:hover { - color: #ffffff !important; - background: rgba(255, 255, 255, 0.08) !important; - border: 1px solid rgba(255, 255, 255, 0.16) !important; - transform: none; - box-shadow: none; -} - -#anomalous-sidebar-actions button svg { - pointer-events: none !important; - transition: opacity 0.15s ease; -} - +#anomalous-sidebar-actions { + position: relative; + overflow: visible; + display: flex; + align-items: center; + justify-content: space-around; + padding: 10px 8px; + gap: 4px; + box-sizing: border-box; +} + +#anomalous-sidebar-actions button { + position: relative; + display: inline-flex !important; + align-items: center !important; + justify-content: center !important; + width: 32px !important; + height: 32px !important; + border-radius: 6px !important; + box-sizing: border-box !important; + vertical-align: middle !important; + color: var(--amb-text-muted, #9ca3af) !important; + background: transparent !important; + border: 1px solid transparent !important; + cursor: pointer !important; + overflow: hidden !important; + pointer-events: auto !important; + transition: color 0.15s ease, background-color 0.15s ease, border-color 0.15s ease; +} + +#anomalous-sidebar-actions button:hover { + color: #ffffff !important; + background: rgba(255, 255, 255, 0.08) !important; + border: 1px solid rgba(255, 255, 255, 0.16) !important; + transform: none; + box-shadow: none; +} + +#anomalous-sidebar-actions button svg { + pointer-events: none !important; + transition: opacity 0.15s ease; +} + /* Abyssal Scarlet Mode overrides for Task 8 icon buttons (Sharp Borders & Inner Shadow) */ .theme-abyssal-scarlet #anomalous-doctor-btn:hover { color: #f43f5e !important; @@ -13118,25 +13128,25 @@ button:hover .anomalous-btn-icon { flex-shrink: 0; } -.anomalous-source-card-label { - display: flex; - flex-direction: column; - min-width: 0; - flex: 1; -} - -.anomalous-source-origin, -.anomalous-source-sync-status { - color: var(--amb-text-muted, #94a3b8); - font-size: 0.68rem; - overflow-wrap: anywhere; -} - -.anomalous-source-sync-status { - padding: 4px 12px; -} - -.anomalous-source-card-name { +.anomalous-source-card-label { + display: flex; + flex-direction: column; + min-width: 0; + flex: 1; +} + +.anomalous-source-origin, +.anomalous-source-sync-status { + color: var(--amb-text-muted, #94a3b8); + font-size: 0.68rem; + overflow-wrap: anywhere; +} + +.anomalous-source-sync-status { + padding: 4px 12px; +} + +.anomalous-source-card-name { font-size: 0.76rem; font-weight: 500; color: #f1f5f9; @@ -13952,437 +13962,342 @@ button:hover .anomalous-btn-icon { font-size: 0.9rem; } -/* ============================================================================= - UPDATE GUIDE NOTICE INDICATOR (CLEAN MONOCHROME TECH) - ============================================================================= */ -/* Header skin uses important padding/colors; keep this control square within that skin. */ -#anomalous-header button.anomalous-update-notice-btn { - width: 32px; - min-width: 32px; - padding: 0 !important; - background: transparent !important; - border-color: rgba(255, 255, 255, 0.15) !important; - color: var(--amb-text-primary, #e2e8f0) !important; -} -#anomalous-header button.anomalous-update-notice-btn:hover { - background: rgba(255, 255, 255, 0.08) !important; -} -.anomalous-update-notice-icon { - display: inline-flex; - align-items: center; - justify-content: center; - width: 16px; - height: 16px; - border: 1px solid currentColor; - border-radius: 50%; - font: 700 12px/1 system-ui, sans-serif; -} -#anomalous-help-replay-guide-btn { - padding: 8px 14px; - background: rgba(255, 255, 255, 0.05); - color: #cbd5e1; - border: 1px solid rgba(255, 255, 255, 0.16); - border-radius: 4px; - cursor: pointer; - font-size: 12px; - font-weight: 500; -} -#anomalous-help-replay-guide-btn:hover { - background: rgba(255, 255, 255, 0.1); - border-color: rgba(255, 255, 255, 0.3); - color: #fff; -} -#anomalous-update-notice-btn:focus-visible, -#anomalous-help-replay-guide-btn:focus-visible, -.anomalous-update-guide button:focus-visible { - outline: 2px solid var(--amb-accent, #38bdf8); - outline-offset: 2px; -} - -/* ============================================================================= - SIDEBAR ACTIONS HOVER REVEAL & TOOLTIPS - ============================================================================= */ -#anomalous-sidebar-actions .anomalous-action-label { - position: absolute; - inset: 0; - display: inline-flex; - align-items: center; - justify-content: center; - font: 600 11px/1 system-ui, sans-serif; - color: #ffffff; - pointer-events: none !important; - white-space: nowrap; - opacity: 0; - transform: translateY(3px); - transition: opacity 0.12s ease, transform 0.12s ease; -} - -#anomalous-sidebar-actions button.anomalous-action-label-active > svg { - opacity: 0 !important; - pointer-events: none !important; -} - -#anomalous-sidebar-actions button.anomalous-action-label-active .anomalous-action-label { - opacity: 1 !important; - transform: translateY(0) !important; -} - -#anomalous-sidebar-actions button:focus-visible { - outline: 2px solid var(--amb-accent, #38bdf8); - outline-offset: 2px; -} - -@media (hover: none) { - #anomalous-sidebar-actions button > svg { opacity: 0 !important; } - #anomalous-sidebar-actions .anomalous-action-label { opacity: 1 !important; transform: none !important; } -} - -/* Suppress CSS pseudo-element tooltips on sidebar action buttons */ -#anomalous-sidebar-actions button::after, -#anomalous-sidebar-actions button::before { - display: none !important; -} - -/* ============================================================================= - SHARED SIDEBAR FLOATING TOOLTIP BUBBLE (SINGLETON DOM) - ============================================================================= */ -#anomalous-sidebar-tooltip-bubble { - position: fixed; - z-index: 1000001; - pointer-events: none; - display: none; - flex-direction: column; - align-items: center; - padding: 7px 11px; - max-width: 220px; - background: rgba(18, 20, 26, 0.98); - backdrop-filter: blur(16px); - -webkit-backdrop-filter: blur(16px); - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 6px; - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.75), 0 0 1px 1px rgba(255, 255, 255, 0.08); - box-sizing: border-box; - transition: opacity 0.15s ease; -} - -#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-title { - font-size: 11.5px; - font-weight: 600; - color: #ffffff; - margin-bottom: 2px; - text-align: center; - line-height: 1.3; -} - -#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-body { - font-size: 10.5px; - font-weight: 400; - color: #94a3b8; - line-height: 1.4; - text-align: center; - white-space: normal; - word-break: normal; - overflow-wrap: break-word; -} - -#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-arrow { - position: absolute; - bottom: -5px; - width: 0; - height: 0; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid rgba(18, 20, 26, 0.98); - transform: translateX(-50%); -} - -/* ============================================================================= - TOOLBOX CATALOG & SHORTCUT ORGANIZER - ============================================================================= */ -.anomalous-toolbox-tile { - position: relative; - user-select: none; - -webkit-user-select: none; - cursor: pointer; -} - -.anomalous-toolbox-tile-top { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - margin-bottom: 4px; -} - -.anomalous-pinned-badge { - font-size: 9px; - font-weight: 600; - color: #94a3b8; - background: rgba(255, 255, 255, 0.08); - border: 1px solid rgba(255, 255, 255, 0.12); - padding: 1px 5px; - border-radius: 3px; - line-height: 1.2; -} - -.anomalous-tool-more-btn { - background: transparent; - border: none; - color: #64748b; - font-size: 14px; - line-height: 1; - cursor: pointer; - padding: 2px 4px; - border-radius: 4px; - transition: all 0.15s ease; -} - -.anomalous-tool-more-btn:hover { - background: rgba(255, 255, 255, 0.1); - color: #ffffff; -} - -.anomalous-toolbox-dropzone { - display: flex; - align-items: center; - justify-content: center; - padding: 7px 10px; - margin-top: 6px; - border: 1px dashed rgba(255, 255, 255, 0.14); - border-radius: 6px; - font-size: 11px; - color: #64748b; - background: rgba(255, 255, 255, 0.02); - transition: all 0.18s ease; - text-align: center; - box-sizing: border-box; -} - -.anomalous-toolbox-dropzone.is-drag-over { - border-color: rgba(255, 255, 255, 0.45); - background: rgba(255, 255, 255, 0.08); - color: #f1f5f9; - box-shadow: inset 0 0 12px rgba(255, 255, 255, 0.05); -} - -.anomalous-toolbox-footer-row { - display: flex; - align-items: center; - justify-content: space-between; - padding: 6px 4px 2px; - margin-top: 4px; - border-top: 1px solid rgba(255, 255, 255, 0.06); -} - -.anomalous-toolbox-reset-shortcuts { - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.1); - color: #94a3b8; - font-size: 11px; - padding: 3px 8px; - border-radius: 4px; - cursor: pointer; - transition: all 0.15s ease; -} - -.anomalous-toolbox-reset-shortcuts:hover { - background: rgba(255, 255, 255, 0.08); - color: #ffffff; - border-color: rgba(255, 255, 255, 0.25); -} - -@media (prefers-reduced-motion: reduce) { - #anomalous-sidebar-actions button .anomalous-action-label { - animation: none !important; - transform: none !important; - } - #anomalous-sidebar-tooltip-bubble { - transition: none !important; - } -} - -/* ============================================================================= - UPDATE GUIDE MODAL (ELEGANT MONOCHROME OBSIDIAN GLASS) - ============================================================================= */ -dialog.anomalous-update-guide:not([open]) { - display: none !important; -} - -dialog.anomalous-update-guide[open] { - display: flex !important; - flex-direction: column; -} - -dialog.anomalous-update-guide { - position: fixed; - inset: 0; - margin: auto; - width: 480px; - max-width: calc(100vw - 32px); - height: fit-content; - max-height: 85vh; - padding: 0; - border: 1px solid rgba(255, 255, 255, 0.14); - border-radius: 16px; - background: linear-gradient(145deg, rgba(28, 30, 38, 0.98), rgba(16, 18, 24, 0.98)); - backdrop-filter: blur(24px); - -webkit-backdrop-filter: blur(24px); - box-shadow: 0 24px 70px rgba(0, 0, 0, 0.8), 0 0 1px 1px rgba(255, 255, 255, 0.12); - color: #f1f5f9; - outline: none; - overflow-y: auto; - box-sizing: border-box; - z-index: 1000000; - animation: anomalous-guide-pop 0.25s cubic-bezier(0.16, 1, 0.3, 1); -} - -dialog.anomalous-update-guide > * { flex-shrink: 0; } - -@keyframes anomalous-guide-pop { - from { - opacity: 0; - transform: scale(0.95); - } - to { - opacity: 1; - transform: scale(1); - } -} - -dialog.anomalous-update-guide::backdrop { - background: rgba(0, 0, 0, 0.65); - backdrop-filter: blur(6px); - -webkit-backdrop-filter: blur(6px); - animation: anomalous-fade-in 0.2s ease; -} - -@keyframes anomalous-fade-in { - from { opacity: 0; } - to { opacity: 1; } -} - -.anomalous-update-guide-header { - display: flex; - align-items: center; - justify-content: space-between; - padding: 14px 20px; - background: rgba(255, 255, 255, 0.02); - border-bottom: 1px solid rgba(255, 255, 255, 0.08); - font-size: 12px; - font-weight: 600; - letter-spacing: 0.5px; - color: #94a3b8; -} - -.anomalous-update-guide-close { - background: transparent; - border: none; - color: #94a3b8; - font-size: 20px; - line-height: 1; - cursor: pointer; - padding: 2px 6px; - border-radius: 6px; - transition: all 0.15s ease; -} - -.anomalous-update-guide-close:hover { - color: #ffffff; - background: rgba(255, 255, 255, 0.1); -} - -.anomalous-update-guide-icon { - width: 58px; - height: 58px; - margin: 24px auto 14px; - border-radius: 50%; - background: rgba(255, 255, 255, 0.05); - border: 1px solid rgba(255, 255, 255, 0.14); - box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); - display: flex; - align-items: center; - justify-content: center; - font-size: 24px; - color: #f1f5f9; - user-select: none; - flex-shrink: 0; -} - -#anomalous-update-guide-title { - margin: 0 24px 10px; - font-size: 17px; - font-weight: 600; - color: #ffffff; - text-align: center; - letter-spacing: 0.2px; -} - -#anomalous-update-guide-body { - margin: 0 24px 16px; - font-size: 13px; - line-height: 1.65; - color: #cbd5e1; - text-align: center; - min-height: 60px; -} - -.anomalous-update-guide-progress { - margin: 0 24px 20px; - font-size: 11px; - color: #64748b; - text-align: center; - font-weight: 500; - letter-spacing: 0.4px; -} - -.anomalous-update-guide-footer { - display: flex; - align-items: center; - justify-content: space-between; - flex-wrap: wrap; - padding: 14px 20px; - background: rgba(0, 0, 0, 0.28); - border-top: 1px solid rgba(255, 255, 255, 0.06); - gap: 10px; -} - -.anomalous-update-guide-footer .anomalous-btn-ghost { - padding: 7px 15px; - font-size: 12px; - border-radius: 6px; - color: #94a3b8; - background: transparent; - border: 1px solid rgba(255, 255, 255, 0.08); - cursor: pointer; - transition: all 0.15s ease; -} - -.anomalous-update-guide-footer .anomalous-btn-ghost:hover:not(:disabled) { - color: #ffffff; - background: rgba(255, 255, 255, 0.08); - border-color: rgba(255, 255, 255, 0.18); -} - -.anomalous-update-guide-footer .anomalous-btn-ghost:disabled { - opacity: 0.35; - cursor: not-allowed; -} - -.anomalous-update-guide-footer .anomalous-btn-primary { - padding: 7px 22px; - font-size: 12px; - font-weight: 600; - border-radius: 6px; - color: #0f172a; - background: #f1f5f9; - border: 1px solid #ffffff; - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); - cursor: pointer; - transition: all 0.15s ease; -} - -.anomalous-update-guide-footer .anomalous-btn-primary:hover { - background: #ffffff; - box-shadow: 0 4px 14px rgba(255, 255, 255, 0.25); - transform: translateY(-1px); -} +/* ============================================================================= + UPDATE GUIDE NOTICE INDICATOR (CLEAN MONOCHROME TECH) + ============================================================================= */ +/* Header skin uses important padding/colors; keep this control square within that skin. */ +#anomalous-header button.anomalous-update-notice-btn { + width: 32px; + min-width: 32px; + padding: 0 !important; + background: transparent !important; + border-color: rgba(255, 255, 255, 0.15) !important; + color: var(--amb-text-primary, #e2e8f0) !important; +} +#anomalous-header button.anomalous-update-notice-btn:hover { + background: rgba(255, 255, 255, 0.08) !important; +} +.anomalous-update-notice-icon { + display: inline-flex; + align-items: center; + justify-content: center; + width: 16px; + height: 16px; + border: 1px solid currentColor; + border-radius: 50%; + font: 700 12px/1 system-ui, sans-serif; +} +#anomalous-help-replay-guide-btn { + padding: 8px 14px; + background: rgba(255, 255, 255, 0.05); + color: #cbd5e1; + border: 1px solid rgba(255, 255, 255, 0.16); + border-radius: 4px; + cursor: pointer; + font-size: 12px; + font-weight: 500; +} +#anomalous-help-replay-guide-btn:hover { + background: rgba(255, 255, 255, 0.1); + border-color: rgba(255, 255, 255, 0.3); + color: #fff; +} +#anomalous-update-notice-btn:focus-visible, +#anomalous-help-replay-guide-btn:focus-visible, +.anomalous-update-guide button:focus-visible { + outline: 2px solid var(--amb-accent, #38bdf8); + outline-offset: 2px; +} + +/* ============================================================================= + SIDEBAR ACTIONS HOVER REVEAL & TOOLTIPS + ============================================================================= */ +#anomalous-sidebar-actions .anomalous-action-label { + position: absolute; + inset: 0; + display: inline-flex; + align-items: center; + justify-content: center; + font: 600 11px/1 system-ui, sans-serif; + color: #ffffff; + pointer-events: none !important; + white-space: nowrap; + opacity: 0; + transform: translateY(3px); + transition: opacity 0.12s ease, transform 0.12s ease; +} + +#anomalous-sidebar-actions button.anomalous-action-label-active > svg { + opacity: 0 !important; + pointer-events: none !important; +} + +#anomalous-sidebar-actions button.anomalous-action-label-active .anomalous-action-label { + opacity: 1 !important; + transform: translateY(0) !important; +} + +#anomalous-sidebar-actions button:focus-visible { + outline: 2px solid var(--amb-accent, #38bdf8); + outline-offset: 2px; +} + +@media (hover: none) { + #anomalous-sidebar-actions button > svg { opacity: 0 !important; } + #anomalous-sidebar-actions .anomalous-action-label { opacity: 1 !important; transform: none !important; } +} + +/* Suppress CSS pseudo-element tooltips on sidebar action buttons */ +#anomalous-sidebar-actions button::after, +#anomalous-sidebar-actions button::before { + display: none !important; +} + +/* ============================================================================= + SHARED SIDEBAR FLOATING TOOLTIP BUBBLE (SINGLETON DOM) + ============================================================================= */ +#anomalous-sidebar-tooltip-bubble { + position: fixed; + z-index: 1000001; + pointer-events: none; + display: none; + flex-direction: column; + align-items: center; + padding: 7px 11px; + max-width: 220px; + background: rgba(18, 20, 26, 0.98); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 6px; + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.75), 0 0 1px 1px rgba(255, 255, 255, 0.08); + box-sizing: border-box; + transition: opacity 0.15s ease; +} + +#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-title { + font-size: 11.5px; + font-weight: 600; + color: #ffffff; + margin-bottom: 2px; + text-align: center; + line-height: 1.3; +} + +#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-body { + font-size: 10.5px; + font-weight: 400; + color: #94a3b8; + line-height: 1.4; + text-align: center; + white-space: normal; + word-break: normal; + overflow-wrap: break-word; +} + +#anomalous-sidebar-tooltip-bubble .anomalous-tooltip-arrow { + position: absolute; + bottom: -5px; + width: 0; + height: 0; + border-left: 5px solid transparent; + border-right: 5px solid transparent; + border-top: 5px solid rgba(18, 20, 26, 0.98); + transform: translateX(-50%); +} + +@media (prefers-reduced-motion: reduce) { + #anomalous-sidebar-actions button .anomalous-action-label { + animation: none !important; + transform: none !important; + } + #anomalous-sidebar-tooltip-bubble { + transition: none !important; + } +} + +/* ============================================================================= + UPDATE GUIDE MODAL (ELEGANT MONOCHROME OBSIDIAN GLASS) + ============================================================================= */ +dialog.anomalous-update-guide:not([open]) { + display: none !important; +} + +dialog.anomalous-update-guide[open] { + display: flex !important; + flex-direction: column; +} + +dialog.anomalous-update-guide { + position: fixed; + inset: 0; + margin: auto; + width: 480px; + max-width: calc(100vw - 32px); + height: fit-content; + max-height: 85vh; + padding: 0; + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 16px; + background: linear-gradient(145deg, rgba(28, 30, 38, 0.98), rgba(16, 18, 24, 0.98)); + backdrop-filter: blur(24px); + -webkit-backdrop-filter: blur(24px); + box-shadow: 0 24px 70px rgba(0, 0, 0, 0.8), 0 0 1px 1px rgba(255, 255, 255, 0.12); + color: #f1f5f9; + outline: none; + overflow-y: auto; + box-sizing: border-box; + z-index: 1000000; + animation: anomalous-guide-pop 0.25s cubic-bezier(0.16, 1, 0.3, 1); +} + +dialog.anomalous-update-guide > * { flex-shrink: 0; } + +@keyframes anomalous-guide-pop { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } +} + +dialog.anomalous-update-guide::backdrop { + background: rgba(0, 0, 0, 0.65); + backdrop-filter: blur(6px); + -webkit-backdrop-filter: blur(6px); + animation: anomalous-fade-in 0.2s ease; +} + +@keyframes anomalous-fade-in { + from { opacity: 0; } + to { opacity: 1; } +} + +.anomalous-update-guide-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 14px 20px; + background: rgba(255, 255, 255, 0.02); + border-bottom: 1px solid rgba(255, 255, 255, 0.08); + font-size: 12px; + font-weight: 600; + letter-spacing: 0.5px; + color: #94a3b8; +} + +.anomalous-update-guide-close { + background: transparent; + border: none; + color: #94a3b8; + font-size: 20px; + line-height: 1; + cursor: pointer; + padding: 2px 6px; + border-radius: 6px; + transition: all 0.15s ease; +} + +.anomalous-update-guide-close:hover { + color: #ffffff; + background: rgba(255, 255, 255, 0.1); +} + +.anomalous-update-guide-icon { + width: 58px; + height: 58px; + margin: 24px auto 14px; + border-radius: 50%; + background: rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.14); + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4); + display: flex; + align-items: center; + justify-content: center; + font-size: 24px; + color: #f1f5f9; + user-select: none; + flex-shrink: 0; +} + +#anomalous-update-guide-title { + margin: 0 24px 10px; + font-size: 17px; + font-weight: 600; + color: #ffffff; + text-align: center; + letter-spacing: 0.2px; +} + +#anomalous-update-guide-body { + margin: 0 24px 16px; + font-size: 13px; + line-height: 1.65; + color: #cbd5e1; + text-align: center; + min-height: 60px; +} + +.anomalous-update-guide-progress { + margin: 0 24px 20px; + font-size: 11px; + color: #64748b; + text-align: center; + font-weight: 500; + letter-spacing: 0.4px; +} + +.anomalous-update-guide-footer { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + padding: 14px 20px; + background: rgba(0, 0, 0, 0.28); + border-top: 1px solid rgba(255, 255, 255, 0.06); + gap: 10px; +} + +.anomalous-update-guide-footer .anomalous-btn-ghost { + padding: 7px 15px; + font-size: 12px; + border-radius: 6px; + color: #94a3b8; + background: transparent; + border: 1px solid rgba(255, 255, 255, 0.08); + cursor: pointer; + transition: all 0.15s ease; +} + +.anomalous-update-guide-footer .anomalous-btn-ghost:hover:not(:disabled) { + color: #ffffff; + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.18); +} + +.anomalous-update-guide-footer .anomalous-btn-ghost:disabled { + opacity: 0.35; + cursor: not-allowed; +} + +.anomalous-update-guide-footer .anomalous-btn-primary { + padding: 7px 22px; + font-size: 12px; + font-weight: 600; + border-radius: 6px; + color: #0f172a; + background: #f1f5f9; + border: 1px solid #ffffff; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); + cursor: pointer; + transition: all 0.15s ease; +} + +.anomalous-update-guide-footer .anomalous-btn-primary:hover { + background: #ffffff; + box-shadow: 0 4px 14px rgba(255, 255, 255, 0.25); + transform: translateY(-1px); +}