diff --git a/resources/web/dialog/ExportPresetDialog/index.html b/resources/web/dialog/ExportPresetDialog/index.html index e46147f236..8d262b7af9 100644 --- a/resources/web/dialog/ExportPresetDialog/index.html +++ b/resources/web/dialog/ExportPresetDialog/index.html @@ -7,7 +7,7 @@ - + diff --git a/resources/web/dialog/ExportPresetDialog/styles.css b/resources/web/dialog/ExportPresetDialog/styles.css index fd4d14946b..78bf8d6f27 100644 --- a/resources/web/dialog/ExportPresetDialog/styles.css +++ b/resources/web/dialog/ExportPresetDialog/styles.css @@ -1,23 +1,11 @@ :root { - --cbr-border-color: #d2d2d7; - --cbr-header-bg: #f6f7f9; - --cbr-panel-bg: #ffffff; - --cbr-input-bg: #ffffff; - --cbr-input-focus-bg: #f2f8f7; - --cbr-label-color: #7b7b84; - --cbr-icon-color: #75757f; -} - -@media (prefers-color-scheme: dark) { - :root { - --cbr-border-color: #4a4a51; - --cbr-header-bg: #2f2f34; - --cbr-panel-bg: #2d2d31; - --cbr-input-bg: #2d2d31; - --cbr-input-focus-bg: #3b3b41; - --cbr-label-color: #b9b9bc; - --cbr-icon-color: #b9b9bc; - } + --cbr-border-color: var(--border); + --cbr-header-bg: var(--panel); + --cbr-panel-bg: var(--bg); + --cbr-input-bg: var(--bg); + --cbr-input-focus-bg: var(--row-hover); + --cbr-label-color: var(--muted); + --cbr-icon-color: var(--muted); } .cbr-browser-container { diff --git a/resources/web/dialog/PluginsDialog/index.html b/resources/web/dialog/PluginsDialog/index.html index 916eae3232..5b647f3d3b 100644 --- a/resources/web/dialog/PluginsDialog/index.html +++ b/resources/web/dialog/PluginsDialog/index.html @@ -7,7 +7,7 @@ - + diff --git a/resources/web/dialog/PluginsDialog/styles.css b/resources/web/dialog/PluginsDialog/styles.css index acd567d450..ce9d4f3a3d 100644 --- a/resources/web/dialog/PluginsDialog/styles.css +++ b/resources/web/dialog/PluginsDialog/styles.css @@ -1,36 +1,3 @@ -:root { - --bg: #ffffff; - --panel: #ffffff; - --border: #d8d8d8; - --border-strong: #e6e6e6; - --col-sep: #e1e1e1; - --text: #1f2328; - --muted: #6f7782; - --row-hover: #f7f9fb; - --row-selected: #eaf2ff; - --row-selected-outline: #b7d0ff; - --border-soft: #f0f0f0; - --danger: #b42318; - --ok: #137333; - --warn: #a15c00; - --plugin-status-danger: var(--danger); - --plugin-status-ok: var(--ok); - --plugin-status-warn: var(--warn); - --plugin-status-inactive: var(--muted); - --plugin-status-danger-bg: rgba(180, 35, 24, 0.12); - --plugin-status-ok-bg: rgba(19, 115, 51, 0.12); - --plugin-status-warn-bg: rgba(199, 122, 22, 0.12); - --plugin-status-inactive-bg: #edf1f5; - --plugin-status-inactive-text: #44505c; - --plugin-source-mine-bg: rgba(0, 137, 123, 0.12); - --plugin-source-mine-text: #00897b; - --plugin-source-neutral-bg: #edf1f5; - --plugin-source-neutral-text: #44505c; - --plugin-source-subscribed-bg: rgba(37, 99, 170, 0.12); - --plugin-source-subscribed-text: #2563aa; - --plugin-link-text: #00796b; -} - html, body { width: 100% !important; @@ -929,9 +896,9 @@ body { width: 12px; height: 12px; box-sizing: border-box; - border: 1px solid #4a4a51; + border: 1px solid var(--border); border-radius: 2px; - background: #2d2d31; + background: var(--bg); } .plugin-checkbox-input:checked + .plugin-checkbox-mark { diff --git a/resources/web/dialog/PresetBundleDialog/index.html b/resources/web/dialog/PresetBundleDialog/index.html index db0b45eeb1..6a2d39ae57 100644 --- a/resources/web/dialog/PresetBundleDialog/index.html +++ b/resources/web/dialog/PresetBundleDialog/index.html @@ -8,7 +8,7 @@ - + diff --git a/resources/web/dialog/PresetBundleDialog/styles.css b/resources/web/dialog/PresetBundleDialog/styles.css index aa6ad9138b..1baecde655 100644 --- a/resources/web/dialog/PresetBundleDialog/styles.css +++ b/resources/web/dialog/PresetBundleDialog/styles.css @@ -1,26 +1,3 @@ -:root { - --bg: #ffffff; - --panel: #ffffff; - --border: #d8d8d8; - --border-strong: #e6e6e6; - --border-soft: #f0f0f0; - --col-sep: #e1e1e1; - - --text: #1f2328; - --row-hover: #f7f9fb; - --row-selected: #eaf2ff; - --row-selected-outline: #b7d0ff; - - --footer-bg: #fafafa; - --btn-bg: #ffffff; - --btn-border: #cccccc; - --btn-hover: #f0f0f0; - - --ctx-bg: #ffffff; - --ctx-border: #cccccc; - --ctx-hover: #efefef; -} - html, body { height: 100%; margin: 0; diff --git a/resources/web/dialog/TerminalDialog/index.html b/resources/web/dialog/TerminalDialog/index.html index 291910dbd7..5476b0ea51 100644 --- a/resources/web/dialog/TerminalDialog/index.html +++ b/resources/web/dialog/TerminalDialog/index.html @@ -7,7 +7,7 @@ - + diff --git a/resources/web/dialog/TerminalDialog/index.js b/resources/web/dialog/TerminalDialog/index.js index 3d2505f773..c4e09bcb64 100644 --- a/resources/web/dialog/TerminalDialog/index.js +++ b/resources/web/dialog/TerminalDialog/index.js @@ -1,6 +1,40 @@ let term = null; let fitAddon = null; +// ANSI palettes for the xterm theme — the standard VS Code dark/light sets, picked by +// data-orca-theme. Constant data, so defined once at module scope. +const ANSI_DARK = { + black:"#000000", red:"#cd3131", green:"#0dbc79", yellow:"#e5e510", blue:"#2472c8", + magenta:"#bc3fbc", cyan:"#11a8cd", white:"#e5e5e5", + brightBlack:"#666666", brightRed:"#f14c4c", brightGreen:"#23d18b", brightYellow:"#f5f543", + brightBlue:"#3b8eea", brightMagenta:"#d670d6", brightCyan:"#29b8db", brightWhite:"#ffffff" +}; +const ANSI_LIGHT = { + black:"#000000", red:"#cd3131", green:"#107c10", yellow:"#949800", blue:"#0451a5", + magenta:"#bc05bc", cyan:"#0598bc", white:"#555555", + brightBlack:"#8a8a8a", brightRed:"#cd3131", brightGreen:"#14ce14", brightYellow:"#b5ba00", + brightBlue:"#0451a5", brightMagenta:"#bc05bc", brightCyan:"#0598bc", brightWhite:"#a5a5a5" +}; + +// The xterm.js theme is a plain JS object (it cannot read CSS variables), so build it +// from the host contract: background/foreground come from the injected --orca-* colors; +// the ANSI palette is the fixed light or dark set chosen by data-orca-theme. +function XtermTheme() { + var cs = getComputedStyle(document.documentElement); + var bg = (cs.getPropertyValue('--orca-bg') || '#1e1e1e').trim(); + var fg = (cs.getPropertyValue('--orca-fg') || '#d4d4d4').trim(); + var dark = document.documentElement.getAttribute('data-orca-theme') !== 'light'; + return Object.assign({ background: bg, foreground: fg, cursor: fg }, dark ? ANSI_DARK : ANSI_LIGHT); +} + +// Re-apply the xterm theme when the host flips data-orca-theme (live re-theme). +function WatchXtermTheme() { + var obs = new MutationObserver(function () { + if (term) term.options.theme = XtermTheme(); + }); + obs.observe(document.documentElement, { attributes: true, attributeFilter: ['data-orca-theme'] }); +} + function OnInit() { if (typeof TranslatePage === "function") TranslatePage(); @@ -9,30 +43,12 @@ function OnInit() { cursorBlink: true, fontSize: 13, fontFamily: '"Cascadia Code", "Fira Code", "JetBrains Mono", monospace', - theme: { - background: "#1e1e1e", - foreground: "#d4d4d4", - cursor: "#ffffff", - black: "#000000", - red: "#cd3131", - green: "#0dbc79", - yellow: "#e5e510", - blue: "#2472c8", - magenta: "#bc3fbc", - cyan: "#11a8cd", - white: "#e5e5e5", - brightBlack: "#666666", - brightRed: "#f14c4c", - brightGreen: "#23d18b", - brightYellow: "#f5f543", - brightBlue: "#3b8eea", - brightMagenta: "#d670d6", - brightCyan: "#29b8db", - brightWhite: "#ffffff" - }, + theme: XtermTheme(), allowProposedApi: true }); + WatchXtermTheme(); + fitAddon = new (FitAddon.FitAddon || FitAddon)(); term.loadAddon(fitAddon); diff --git a/resources/web/dialog/TerminalDialog/styles.css b/resources/web/dialog/TerminalDialog/styles.css index aa69780457..64b4b3e5b5 100644 --- a/resources/web/dialog/TerminalDialog/styles.css +++ b/resources/web/dialog/TerminalDialog/styles.css @@ -7,8 +7,8 @@ html, body { height: 100%; overflow: hidden; - background: #1e1e1e; - color: #d4d4d4; + background: var(--bg); + color: var(--text); } .app { @@ -41,34 +41,34 @@ html, body { #cmd-input { flex: 1; padding: 6px 10px; - border: 1px solid #444; + border: 1px solid var(--border); border-radius: 4px; - background: #2d2d2d; - color: #d4d4d4; + background: var(--bg); + color: var(--text); font-family: inherit; font-size: 13px; outline: none; } #cmd-input:focus { - border-color: #666; + border-color: var(--orca-accent); } #run-btn { padding: 6px 20px; border: none; border-radius: 4px; - background: #0e639c; - color: #fff; + background: var(--orca-accent); + color: var(--orca-accent-fg); font-size: 13px; cursor: pointer; } #run-btn:hover { - background: #1177bb; + filter: brightness(1.1); } #run-btn:disabled { - background: #555; + opacity: .5; cursor: not-allowed; } diff --git a/resources/web/dialog/css/dark.css b/resources/web/dialog/css/dark.css deleted file mode 100644 index 6bec2895f4..0000000000 --- a/resources/web/dialog/css/dark.css +++ /dev/null @@ -1,116 +0,0 @@ -:root { - --bg: #1b1f24; - --panel: #242a31; - --border: #3a424d; - --border-strong: #3a424d; - --border-soft: #313843; - --col-sep: #3a424d; - - --text: #e6ebf0; - --muted: #b9c0c8; - --row-hover: #2b3340; - --row-selected: #244945; - --row-selected-outline: #00bfa5; - - --plugin-status-danger: #ff7b72; - --plugin-status-ok: #37c871; - --plugin-status-warn: #f0b45a; - --plugin-status-inactive: #b9c0c8; - --plugin-status-danger-bg: rgba(255, 123, 114, 0.16); - --plugin-status-ok-bg: rgba(55, 200, 113, 0.16); - --plugin-status-warn-bg: rgba(240, 180, 90, 0.18); - --plugin-status-inactive-bg: #36363b; - --plugin-status-inactive-text: #c7ccd2; - --plugin-source-mine-bg: rgba(0, 150, 136, 0.18); - --plugin-source-mine-text: #8de5d6; - --plugin-source-neutral-bg: #36363b; - --plugin-source-neutral-text: #c7ccd2; - --plugin-source-subscribed-bg: rgba(88, 166, 255, 0.18); - --plugin-source-subscribed-text: #8fc0f0; - --plugin-link-text: #62d8ca; - - --footer-bg: #20262d; - --btn-bg: #2a313a; - --btn-border: #4b5664; - --btn-hover: #333c47; - - --ctx-bg: #2a313a; - --ctx-border: #4b5664; - --ctx-hover: #3a4451; -} - -* -{ - color: #efeff0; - border-color: #B9B9BC; -} - -body -{ - background-color:#2D2D31; /* ORCA match background color */ - color: #efeff0; -} - -.ZScrol::-webkit-scrollbar-thumb {/*滚动条里面小方块*/ - background-color: #939594; -} - -.ZScrol::-webkit-scrollbar-track {/*滚动条里面轨道*/ - background: #161817; -} - -#Title div -{ - color: #009688; -} - -.search>input[type=text]{ - background-color:#2D2D31; -} - -/*---Checkboxes ORCA---*/ -input[type=checkbox]{ - background-color:#2D2D31; - border-color:#4A4A51; -} - -input[type=checkbox]:checked{ - background-color:#009688; -} - -/*-------Text------*/ - -.TextS1 -{ - -} - -.TextS2 -{ - color:#B9B9BC; -} - -/*---Policy---*/ -.TextArea1 -{ - background-color: #4A4A51; - color: #BEBEC0; -} - -/*----Region---*/ -.RegionItem:hover -{ - background-color:#4C4C55; -} - -.RegionSelected:hover -{ - background-color:#009688; - color: #fff; -} - -/*----Menu----*/ -#Title div.TitleUnselected -{ - color: #BEBEC0; -} diff --git a/resources/web/dialog/css/theme.css b/resources/web/dialog/css/theme.css new file mode 100644 index 0000000000..665f0c941a --- /dev/null +++ b/resources/web/dialog/css/theme.css @@ -0,0 +1,100 @@ +/* Shared theme for resources/web/dialog/* pages. + * + * App-matched roles are pulled from the host theme "contract" (:root{--orca-*}), + * injected from live C++ app colors by WebViewHostDialog. Web-only semantics (row + * selection, status/source badges, footer/button/context surfaces) have no native + * equivalent, so they are curated here for light and selected for dark by the + * [data-orca-theme="dark"] attribute the host sets — the single authoritative theme + * signal on all platforms (prefers-color-scheme is intentionally not used). + * + * This file is linked AFTER common.css so its element rules re-theme the shared chrome + * via variables (replacing the retired dark.css). It replaces each page's own :root + * palette and the dark.css . */ + +:root { + /* --- app-matched roles (from the injected contract) --- */ + --bg: var(--orca-bg); + --panel: var(--orca-bg); + --text: var(--orca-fg); + --muted: var(--orca-muted); + --border: var(--orca-border); + --border-strong: var(--orca-border); + --border-soft: var(--orca-border); + --col-sep: var(--orca-border); + --row-selected-outline: var(--orca-accent); + --main-color: var(--orca-accent); + --main-color-hover: var(--orca-accent); + --plugin-link-text: var(--orca-accent); + + /* --- web-only semantics: LIGHT --- */ + --row-hover: #f7f9fb; + --row-selected: #eaf2ff; + --plugin-status-danger: #b42318; + --plugin-status-ok: #137333; + --plugin-status-warn: #a15c00; + --plugin-status-inactive: var(--muted); + --plugin-status-danger-bg: rgba(180, 35, 24, 0.12); + --plugin-status-ok-bg: rgba(19, 115, 51, 0.12); + --plugin-status-warn-bg: rgba(199, 122, 22, 0.12); + --plugin-status-inactive-bg: #edf1f5; + --plugin-status-inactive-text: #44505c; + --plugin-source-mine-bg: rgba(0, 137, 123, 0.12); + --plugin-source-mine-text: #00897b; + --plugin-source-neutral-bg: #edf1f5; + --plugin-source-neutral-text: #44505c; + --plugin-source-subscribed-bg: rgba(37, 99, 170, 0.12); + --plugin-source-subscribed-text: #2563aa; + --footer-bg: #fafafa; + --btn-bg: #ffffff; + --btn-border: #cccccc; + --btn-hover: #f0f0f0; + --ctx-bg: #ffffff; + --ctx-border: #cccccc; + --ctx-hover: #efefef; +} + +:root[data-orca-theme="dark"] { + /* The app-injected border (var(--orca-border) ≈ #36363B in dark) sits almost on top of + the dark panels; lift the border roles a touch so dividers/outlines stay visible. */ + --border: #4a4a51; + --border-strong: #4a4a51; + --border-soft: #4a4a51; + --col-sep: #4a4a51; + --row-hover: #2b3340; + --row-selected: #244945; + --plugin-status-danger: #ff7b72; + --plugin-status-ok: #37c871; + --plugin-status-warn: #f0b45a; + --plugin-status-inactive: #b9c0c8; + --plugin-status-danger-bg: rgba(255, 123, 114, 0.16); + --plugin-status-ok-bg: rgba(55, 200, 113, 0.16); + --plugin-status-warn-bg: rgba(240, 180, 90, 0.18); + --plugin-status-inactive-bg: #36363b; + --plugin-status-inactive-text: #c7ccd2; + --plugin-source-mine-bg: rgba(0, 150, 136, 0.18); + --plugin-source-mine-text: #8de5d6; + --plugin-source-neutral-bg: #36363b; + --plugin-source-neutral-text: #c7ccd2; + --plugin-source-subscribed-bg: rgba(88, 166, 255, 0.18); + --plugin-source-subscribed-text: #8fc0f0; + --footer-bg: #20262d; + --btn-bg: #2a313a; + --btn-border: #4b5664; + --btn-hover: #333c47; + --ctx-bg: #2a313a; + --ctx-border: #4b5664; + --ctx-hover: #3a4451; +} + +/* Re-theme the shared common.css chrome through variables (replaces dark.css's + * hardcoded element overrides). Placed after common.css in every page's
. */ +html { background: var(--bg); } +body { background: var(--bg); color: var(--text); } +#Content { color: var(--text); } +#Title div, #Title div.TitleUnselected { color: var(--orca-accent); } +.HyperLink { color: var(--orca-accent); } +.ZScrol::-webkit-scrollbar-thumb { background-color: var(--border); } +.ZScrol::-webkit-scrollbar-track { background: var(--bg); } +input[type="checkbox"] { background-color: var(--bg); border-color: var(--border); } +input[type="checkbox"]:checked { background-color: var(--orca-accent); border-color: var(--orca-accent); } +input[type="checkbox"]::before { box-shadow: inset 1em 1em var(--orca-accent-fg); } diff --git a/resources/web/dialog/js/globalapi.js b/resources/web/dialog/js/globalapi.js index 2463dbe537..f78f1e928b 100644 --- a/resources/web/dialog/js/globalapi.js +++ b/resources/web/dialog/js/globalapi.js @@ -336,4 +336,4 @@ function ExecuteDarkMode( DarkCssPath ) } } -SwitchDarkMode( "../css/dark.css" ); \ No newline at end of file +// Dialog pages are themed by the injected --orca-* contract + theme.css; the legacy dark.css poll is fully retired. \ No newline at end of file diff --git a/src/slic3r/GUI/ExportPresetBundleDialog.cpp b/src/slic3r/GUI/ExportPresetBundleDialog.cpp index 3c0f75d4b8..6d642ee1c1 100644 --- a/src/slic3r/GUI/ExportPresetBundleDialog.cpp +++ b/src/slic3r/GUI/ExportPresetBundleDialog.cpp @@ -1,5 +1,4 @@ #include "ExportPresetBundleDialog.hpp" -#include