spacexerq пре 2 недеља
родитељ
комит
c05598c190

+ 13 - 2
apps/gui/src/app_window.py

@@ -322,12 +322,23 @@ class LFMRIWindow(QMainWindow):
         self._btn_theme_dark.setStyleSheet(lang_css)
         self._btn_theme_light.setStyleSheet(lang_css)
 
-        sb_bg    = "#0c0c1a" if dark else "#e4e4f0"
-        sb_color = "#555577" if dark else "#666688"
+        sb_bg    = "#0c0c1a" if dark else "#dce0f0"
+        sb_color = "#555577" if dark else "#787faa"
         self.statusBar().setStyleSheet(
             f"QStatusBar {{ background: {sb_bg}; color: {sb_color}; font-size: 11px; }}"
         )
 
+        # Propagate to all tabs
+        for tab in (
+            self._scanning_tab,
+            self._seq_tab,
+            self._scanner_tab,
+            self._spectroscopy_tab,
+            self._fid_tab,
+        ):
+            if hasattr(tab, "apply_theme"):
+                tab.apply_theme()
+
     # ------------------------------------------------------------------ #
     #  Navigation                                                          #
     # ------------------------------------------------------------------ #

+ 18 - 4
apps/gui/src/gui/plot_panel.py

@@ -28,6 +28,7 @@ from src.gui.adapters import (
     BlockRow, gate_to_step, build_block_rows, find_block_at_time,
 )
 from src.gui.scheme_panel import system_is_dark
+from src import theme
 
 # Waveform / overlay colours (used for curve pens and region fills)
 _C = {
@@ -88,11 +89,11 @@ class PlotPanel(QWidget):
     def __init__(self, parent: QWidget | None = None):
         super().__init__(parent)
 
-        _dark = system_is_dark()
+        p = theme.palette()
         pg.setConfigOptions(
             antialias=True,
-            background=QColor("#1a1a2e") if _dark else QColor("#f0f0f8"),
-            foreground=QColor("#ddddff") if _dark else QColor("#1a1a2e"),
+            background=QColor(p["bg"]),
+            foreground=QColor(p["text"]),
         )
 
         root = QVBoxLayout(self)
@@ -103,7 +104,7 @@ class PlotPanel(QWidget):
         self._btn_bar = QWidget()
         self._btn_bar.setObjectName("PlotBtnBar")
         self._btn_bar.setStyleSheet(
-            "#PlotBtnBar { background: #16162a; border-bottom: 1px solid #333355; }"
+            f"#PlotBtnBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
         )
         self._btn_lay = QHBoxLayout(self._btn_bar)
         self._btn_lay.setContentsMargins(6, 3, 6, 3)
@@ -141,6 +142,19 @@ class PlotPanel(QWidget):
     #  Public API                                                          #
     # ------------------------------------------------------------------ #
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        self._btn_bar.setStyleSheet(
+            f"#PlotBtnBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
+        )
+        pg.setConfigOptions(
+            antialias=True,
+            background=QColor(p["bg"]),
+            foreground=QColor(p["text"]),
+        )
+        for pw in self._plot_widgets.values():
+            pw.setBackground(p["bg"])
+
     def plot_all(self, seq_data: dict, sync_data: dict) -> None:
         self._clear()
         self._block_rows = build_block_rows(seq_data, sync_data)

+ 12 - 2
apps/gui/src/tabs/fid_tab.py

@@ -27,7 +27,7 @@ from PySide6.QtWidgets import (
 
 from src.gui.plot_panel import PlotPanel
 from src.gui.workers import LoadInterpWorker
-from src import i18n
+from src import i18n, theme
 
 _GAMMA = 42.576e6   # Hz/T, proton
 _G_AMP_MAX_MT_M = 5.0
@@ -111,11 +111,20 @@ class FidTab(QWidget):
     #  Toolbar                                                             #
     # ================================================================== #
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        self._toolbar.setStyleSheet(
+            f"#FidToolBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
+        )
+        if hasattr(self, "_plots"):
+            self._plots.apply_theme()
+
     def _build_toolbar(self) -> QWidget:
         bar = QWidget()
         bar.setObjectName("FidToolBar")
+        p = theme.palette()
         bar.setStyleSheet(
-            "#FidToolBar { background: #16162a; border-bottom: 1px solid #333355; }"
+            f"#FidToolBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
         )
         lay = QHBoxLayout(bar)
         lay.setContentsMargins(6, 4, 6, 4)
@@ -153,6 +162,7 @@ class FidTab(QWidget):
         self._progress.setVisible(False)
         lay.addWidget(self._progress)
 
+        self._toolbar = bar
         return bar
 
     # ================================================================== #

+ 17 - 3
apps/gui/src/tabs/scanner_tab.py

@@ -19,7 +19,7 @@ from PySide6.QtWidgets import (
 
 from src.clients.orchestrator_client import OrchestratorClient, OrchestratorError
 from src.gui.workers import OrchestratorWorker
-from src import i18n
+from src import i18n, theme
 
 
 _STATUS_COLORS = {
@@ -136,6 +136,15 @@ class ScannerTab(QWidget):
         self._seq_info_label.setText("\n".join(summary_lines) if summary_lines else "-")
         self._append_log("Sequence info received from Sequence tab.")
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        self._services_bar.setStyleSheet(
+            f"QWidget {{ background: {p['surface']}; border-radius: 4px; }}"
+        )
+        self._svc_title_lbl.setStyleSheet(
+            f"color: {p['text_muted']}; font-size: 11px; background: transparent;"
+        )
+
     def retranslate_ui(self) -> None:
         self._url_label.setText(i18n.tr("url_label"))
         self._btn_connect.setText(i18n.tr("btn_connect"))
@@ -180,15 +189,20 @@ class ScannerTab(QWidget):
     def _build_services_bar(self) -> QWidget:
         """Horizontal strip showing live status of every microservice."""
         bar = QWidget()
+        p = theme.palette()
         bar.setStyleSheet(
-            "QWidget { background: #1a1a2e; border-radius: 4px; }"
+            f"QWidget {{ background: {p['surface']}; border-radius: 4px; }}"
         )
         lay = QHBoxLayout(bar)
         lay.setContentsMargins(8, 4, 8, 4)
         lay.setSpacing(0)
 
         title = QLabel("Сервисы:")
-        title.setStyleSheet("color: #555577; font-size: 11px; background: transparent;")
+        title.setStyleSheet(
+            f"color: {p['text_muted']}; font-size: 11px; background: transparent;"
+        )
+        self._services_bar = bar
+        self._svc_title_lbl = title
         lay.addWidget(title)
         lay.addSpacing(10)
 

+ 130 - 42
apps/gui/src/tabs/scanning_tab.py

@@ -33,7 +33,7 @@ try:
 except ImportError:
     _HAS_HTTPX = False
 
-from src import i18n
+from src import i18n, theme
 
 # -- colour palette -------------------------------------------------------------
 _BG_DARK      = "#1a1a2e"
@@ -544,7 +544,8 @@ class ScanningTab(QWidget):
 
     def __init__(self, parent: QWidget | None = None) -> None:
         super().__init__(parent)
-        self.setStyleSheet(f"background: {_BG_DARK};")
+        p = theme.palette()
+        self.setStyleSheet(f"background: {p['bg']};")
 
         self._viewers:          list[MriViewerWidget]          = []
         self._scan_tick:        int                            = 0
@@ -560,13 +561,15 @@ class ScanningTab(QWidget):
         root.setContentsMargins(0, 0, 0, 0)
         root.setSpacing(0)
 
-        vsplit = QSplitter(Qt.Vertical)
-        vsplit.setStyleSheet("QSplitter::handle { background: #333344; height: 3px; }")
-        vsplit.addWidget(self._build_upper_area())
-        vsplit.addWidget(self._build_bottom_panel())
-        vsplit.setSizes([700, 140])
-        vsplit.setChildrenCollapsible(False)
-        root.addWidget(vsplit, stretch=1)
+        self._vsplit = QSplitter(Qt.Vertical)
+        self._vsplit.setStyleSheet(
+            f"QSplitter::handle {{ background: {p['border2']}; height: 3px; }}"
+        )
+        self._vsplit.addWidget(self._build_upper_area())
+        self._vsplit.addWidget(self._build_bottom_panel())
+        self._vsplit.setSizes([700, 140])
+        self._vsplit.setChildrenCollapsible(False)
+        root.addWidget(self._vsplit, stretch=1)
 
         self._setup_animation()
         self._update_matrix_display()
@@ -606,25 +609,88 @@ class ScanningTab(QWidget):
 
     # -- layout builders ----------------------------------------------------
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        dark = theme.is_dark()
+        self.setStyleSheet(f"background: {p['bg']};")
+        self._vsplit.setStyleSheet(
+            f"QSplitter::handle {{ background: {p['border2']}; height: 3px; }}"
+        )
+        self._upper_container.setStyleSheet(f"background: {p['bg']};")
+        self._hsplit.setStyleSheet(
+            f"QSplitter::handle {{ background: {p['border2']}; width: 3px; }}"
+        )
+        self._protocol_container.setStyleSheet(f"background: {p['panel']};")
+        self._image_grid_container.setStyleSheet(f"background: {p['bg']};")
+        self._bottom_panel.setStyleSheet(
+            f"background: {p['surface']}; border-top: 1px solid {p['border2']};"
+        )
+        self._action_bar.setStyleSheet(
+            f"background: {p['surface']}; border-top: 1px solid {p['border']};"
+        )
+        self._param_tabs.setStyleSheet(f"""
+            QTabWidget::pane  {{ border: none; background: {p['surface']}; }}
+            QTabBar::tab {{
+                background: {p['bg']}; color: {p['text_dim']};
+                padding: 5px 14px; border: 1px solid {p['border']};
+                border-bottom: none; margin-right: 2px; font-size: 11px;
+            }}
+            QTabBar::tab:selected {{ background: {p['surface']}; color: {p['text']}; }}
+            QTabBar::tab:hover:!selected {{ background: {p['panel']}; }}
+        """)
+        self._status_label.setStyleSheet(f"color: {p['text_muted']}; font-size: 11px;")
+        scan_btn_css: str
+        if dark:
+            scan_btn_css = (
+                "QPushButton {"
+                "  background: #1a3a1a; color: #88ee88;"
+                "  border: 1px solid #336633; border-radius: 4px;"
+                "  font-size: 12px; font-weight: bold; padding: 5px 16px;"
+                "}"
+                "QPushButton:checked {"
+                "  background: #3a1a1a; color: #ee8888; border-color: #663333;"
+                "}"
+                "QPushButton:hover:!checked { background: #1e4a1e; }"
+            )
+        else:
+            scan_btn_css = (
+                "QPushButton {"
+                "  background: #e8f5e9; color: #1b5e20;"
+                "  border: 1px solid #4caf50; border-radius: 4px;"
+                "  font-size: 12px; font-weight: bold; padding: 5px 16px;"
+                "}"
+                "QPushButton:checked {"
+                "  background: #ffebee; color: #b71c1c; border-color: #ef5350;"
+                "}"
+                "QPushButton:hover:!checked { background: #c8e6c9; }"
+            )
+        self._btn_scan.setStyleSheet(scan_btn_css)
+
     def _build_upper_area(self) -> QWidget:
+        p = theme.palette()
         container = QWidget()
-        container.setStyleSheet(f"background: {_BG_DARK};")
+        container.setStyleSheet(f"background: {p['bg']};")
+        self._upper_container = container
         lay = QVBoxLayout(container)
         lay.setContentsMargins(0, 0, 0, 0)
         lay.setSpacing(0)
 
-        hsplit = QSplitter(Qt.Horizontal)
-        hsplit.setStyleSheet("QSplitter::handle { background: #333344; width: 3px; }")
-        hsplit.addWidget(self._build_protocol_panel())
-        hsplit.addWidget(self._build_image_grid())
-        hsplit.setSizes([220, 980])
-        hsplit.setChildrenCollapsible(False)
-        lay.addWidget(hsplit)
+        self._hsplit = QSplitter(Qt.Horizontal)
+        self._hsplit.setStyleSheet(
+            f"QSplitter::handle {{ background: {p['border2']}; width: 3px; }}"
+        )
+        self._hsplit.addWidget(self._build_protocol_panel())
+        self._hsplit.addWidget(self._build_image_grid())
+        self._hsplit.setSizes([220, 980])
+        self._hsplit.setChildrenCollapsible(False)
+        lay.addWidget(self._hsplit)
         return container
 
     def _build_protocol_panel(self) -> QWidget:
+        p = theme.palette()
         container = QWidget()
-        container.setStyleSheet(f"background: {_PANEL_BG};")
+        container.setStyleSheet(f"background: {p['panel']};")
+        self._protocol_container = container
         lay = QVBoxLayout(container)
         lay.setContentsMargins(0, 0, 0, 0)
         lay.setSpacing(0)
@@ -718,8 +784,10 @@ class ScanningTab(QWidget):
         return container
 
     def _build_image_grid(self) -> QWidget:
+        p = theme.palette()
         container = QWidget()
-        container.setStyleSheet(f"background: {_BG_DARK};")
+        container.setStyleSheet(f"background: {p['bg']};")
+        self._image_grid_container = container
         grid = QGridLayout(container)
         grid.setContentsMargins(6, 6, 6, 6)
         grid.setSpacing(6)
@@ -734,8 +802,12 @@ class ScanningTab(QWidget):
         return container
 
     def _build_bottom_panel(self) -> QWidget:
+        p = theme.palette()
         panel = QWidget()
-        panel.setStyleSheet("background: #16162a; border-top: 1px solid #333355;")
+        panel.setStyleSheet(
+            f"background: {p['surface']}; border-top: 1px solid {p['border2']};"
+        )
+        self._bottom_panel = panel
 
         outer = QVBoxLayout(panel)
         outer.setContentsMargins(0, 0, 0, 0)
@@ -743,15 +815,15 @@ class ScanningTab(QWidget):
 
         # -- parameter tabs -------------------------------------------------
         self._param_tabs = QTabWidget()
-        self._param_tabs.setStyleSheet("""
-            QTabWidget::pane  { border: none; background: #16162a; }
-            QTabBar::tab {
-                background: #1e1e38; color: #aaaacc;
-                padding: 5px 14px; border: 1px solid #333355;
+        self._param_tabs.setStyleSheet(f"""
+            QTabWidget::pane  {{ border: none; background: {p['surface']}; }}
+            QTabBar::tab {{
+                background: {p['bg']}; color: {p['text_dim']};
+                padding: 5px 14px; border: 1px solid {p['border']};
                 border-bottom: none; margin-right: 2px; font-size: 11px;
-            }
-            QTabBar::tab:selected { background: #252545; color: #ffffff; }
-            QTabBar::tab:hover:!selected { background: #222240; }
+            }}
+            QTabBar::tab:selected {{ background: {p['surface']}; color: {p['text']}; }}
+            QTabBar::tab:hover:!selected {{ background: {p['panel']}; }}
         """)
 
         _placeholder_keys = ["tab_main", "tab_contrast", "tab_resolution", "tab_system"]
@@ -773,30 +845,46 @@ class ScanningTab(QWidget):
 
         # -- bottom action bar ----------------------------------------------
         action_bar = QWidget()
-        action_bar.setStyleSheet("background: #16162a; border-top: 1px solid #2a2a4a;")
+        self._action_bar = action_bar
+        action_bar.setStyleSheet(
+            f"background: {p['surface']}; border-top: 1px solid {p['border']};"
+        )
         action_lay = QHBoxLayout(action_bar)
         action_lay.setContentsMargins(12, 6, 12, 6)
         action_lay.setSpacing(12)
 
         self._status_label = QLabel(i18n.tr("no_data"))
-        self._status_label.setStyleSheet("color: #666688; font-size: 11px;")
+        self._status_label.setStyleSheet(f"color: {p['text_muted']}; font-size: 11px;")
         action_lay.addWidget(self._status_label)
         action_lay.addStretch()
 
         self._btn_scan = QPushButton(i18n.tr("btn_scan"))
         self._btn_scan.setCheckable(True)
         self._btn_scan.setMinimumWidth(140)
-        self._btn_scan.setStyleSheet(
-            "QPushButton {"
-            "  background: #1a3a1a; color: #88ee88;"
-            "  border: 1px solid #336633; border-radius: 4px;"
-            "  font-size: 12px; font-weight: bold; padding: 5px 16px;"
-            "}"
-            "QPushButton:checked {"
-            "  background: #3a1a1a; color: #ee8888; border-color: #663333;"
-            "}"
-            "QPushButton:hover:!checked { background: #1e4a1e; }"
-        )
+        if theme.is_dark():
+            self._btn_scan.setStyleSheet(
+                "QPushButton {"
+                "  background: #1a3a1a; color: #88ee88;"
+                "  border: 1px solid #336633; border-radius: 4px;"
+                "  font-size: 12px; font-weight: bold; padding: 5px 16px;"
+                "}"
+                "QPushButton:checked {"
+                "  background: #3a1a1a; color: #ee8888; border-color: #663333;"
+                "}"
+                "QPushButton:hover:!checked { background: #1e4a1e; }"
+            )
+        else:
+            self._btn_scan.setStyleSheet(
+                "QPushButton {"
+                "  background: #e8f5e9; color: #1b5e20;"
+                "  border: 1px solid #4caf50; border-radius: 4px;"
+                "  font-size: 12px; font-weight: bold; padding: 5px 16px;"
+                "}"
+                "QPushButton:checked {"
+                "  background: #ffebee; color: #b71c1c; border-color: #ef5350;"
+                "}"
+                "QPushButton:hover:!checked { background: #c8e6c9; }"
+            )
         self._btn_scan.toggled.connect(self._on_scan_toggled)
         action_lay.addWidget(self._btn_scan)
 
@@ -805,7 +893,7 @@ class ScanningTab(QWidget):
 
     def _build_geometry_tab(self) -> QWidget:
         w = QWidget()
-        w.setStyleSheet("background: #16162a;")
+        w.setStyleSheet(f"background: {theme.palette()['surface']};")
         lay = QHBoxLayout(w)
         lay.setContentsMargins(12, 8, 12, 8)
         lay.setSpacing(16)

+ 17 - 4
apps/gui/src/tabs/seq_interp_tab.py

@@ -33,7 +33,7 @@ from src.gui.workers import (
     SeqInterpHttpWorker,
 )
 from src.clients.seq_interp_client import SeqInterpClient
-from src import i18n
+from src import i18n, theme
 
 # -- loading-state style maps (light / dark) -----------------------------------
 
@@ -119,6 +119,15 @@ class SeqInterpTab(QWidget):
         self._btn_run.setEnabled(True)
         self._log(f"Sequence loaded: {path}")
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        bar_css = f"background: {p['surface']}; border-bottom: 1px solid {p['border2']};"
+        self._button_bar.setStyleSheet(f"#ButtonBar {{ {bar_css} }}")
+        self._seq_status_bar.setStyleSheet(f"#SeqStatus {{ {bar_css} }}")
+        self._seq_status.setStyleSheet(f"color: {p['text_dim']};")
+        if hasattr(self, "_plots"):
+            self._plots.apply_theme()
+
     def retranslate_ui(self) -> None:
         self._btn_load_seq .setText(i18n.tr("btn_load_seq"))
         self._btn_load_hw  .setText(i18n.tr("btn_hw_config"))
@@ -140,8 +149,9 @@ class SeqInterpTab(QWidget):
     def _build_button_bar(self) -> QWidget:
         bar = QWidget()
         bar.setObjectName("ButtonBar")
+        p = theme.palette()
         bar.setStyleSheet(
-            "#ButtonBar { background: #16162a; border-bottom: 1px solid #333355; }"
+            f"#ButtonBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
         )
         lay = QHBoxLayout(bar)
         lay.setContentsMargins(6, 4, 6, 4)
@@ -190,21 +200,24 @@ class SeqInterpTab(QWidget):
         self._progress.setVisible(False)
         lay.addWidget(self._progress)
 
+        self._button_bar = bar
         return bar
 
     def _build_seq_status_bar(self) -> QWidget:
         bar = QWidget()
         bar.setObjectName("SeqStatus")
+        p = theme.palette()
         bar.setStyleSheet(
-            "#SeqStatus { background: #16162a; border-bottom: 1px solid #333355; }"
+            f"#SeqStatus {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
         )
         lay = QHBoxLayout(bar)
         lay.setContentsMargins(8, 2, 8, 2)
         self._seq_status = QLabel(f"  o  {i18n.tr('no_file_selected')}")
         self._seq_status.setFont(QFont("Arial", 9))
-        self._seq_status.setStyleSheet("color: #9e9e9e;")
+        self._seq_status.setStyleSheet(f"color: {theme.palette()['text_dim']};")
         lay.addWidget(self._seq_status)
         lay.addStretch()
+        self._seq_status_bar = bar
         return bar
 
     # ================================================================== #

+ 22 - 8
apps/gui/src/tabs/spectroscopy_tab.py

@@ -38,7 +38,7 @@ from PySide6.QtWidgets import (
 from src.clients.spectroscopy_client import SpectroscopyClient, SpectroscopyError
 from src.gui.workers import OrchestratorWorker
 from src.gui.scheme_panel import system_is_dark
-from src import i18n
+from src import i18n, theme
 
 
 # -- Colour palette -------------------------------------------------------------
@@ -160,14 +160,26 @@ class SpectroscopyTab(QWidget):
 
     # -- Toolbar -----------------------------------------------------------
 
+    def apply_theme(self) -> None:
+        p = theme.palette()
+        self._toolbar.setStyleSheet(
+            f"#SpecToolBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
+        )
+        pg.setConfigOptions(
+            antialias=True,
+            background=QColor(p["bg"]),
+            foreground=QColor(p["text"]),
+        )
+        for pw in (self._raw_widget, self._raw_fft_widget,
+                   self._dem_widget, self._sp_widget):
+            pw.setBackground(p["bg"])
+
     def _build_toolbar(self) -> QWidget:
         bar = QWidget()
         bar.setObjectName("SpecToolBar")
+        p = theme.palette()
         bar.setStyleSheet(
-            "#SpecToolBar {"
-            "  background: #16162a;"
-            "  border-bottom: 1px solid #333355;"
-            "}"
+            f"#SpecToolBar {{ background: {p['surface']}; border-bottom: 1px solid {p['border2']}; }}"
         )
         lay = QHBoxLayout(bar)
         lay.setContentsMargins(6, 4, 6, 4)
@@ -219,6 +231,7 @@ class SpectroscopyTab(QWidget):
         self._progress.setVisible(False)
         lay.addWidget(self._progress)
 
+        self._toolbar = bar
         return bar
 
     # -- Main splitter -----------------------------------------------------
@@ -354,12 +367,13 @@ class SpectroscopyTab(QWidget):
     # -- Plots panel -------------------------------------------------------
 
     def _build_plots_panel(self) -> QSplitter:
-        _dark = system_is_dark()
+        p = theme.palette()
         pg.setConfigOptions(
             antialias=True,
-            background=QColor("#1a1a2e") if _dark else QColor("#f0f0f8"),
-            foreground=QColor("#ddddff") if _dark else QColor("#1a1a2e"),
+            background=QColor(p["bg"]),
+            foreground=QColor(p["text"]),
         )
+        _dark = theme.is_dark()
         _cross = pg.mkPen(
             "#ffffff50" if _dark else "#00000050", width=1, style=Qt.DashLine
         )

+ 15 - 14
apps/gui/src/theme.py

@@ -56,21 +56,22 @@ def palette() -> dict[str, str]:
             "scrollbar_bg":     "#1a1a2e",
             "scrollbar_handle": "#3a3a5a",
         }
+    # Light — "Clinical Interface": cool blue-grey tones, professional medical aesthetic
     return {
-        "bg_deep":          "#e4e4f0",
-        "bg":               "#f0f0f8",
-        "panel":            "#ffffff",
-        "surface":          "#f5f5fc",
-        "border":           "#d0d0e0",
-        "border2":          "#aaaacc",
-        "accent":           "#c09000",
-        "text":             "#1a1a2e",
-        "text_dim":         "#444466",
-        "text_muted":       "#777799",
-        "btn_bg":           "#e8e8f4",
-        "input_bg":         "#ffffff",
-        "scrollbar_bg":     "#e0e0ef",
-        "scrollbar_handle": "#aaaacc",
+        "bg_deep":          "#dce0f0",   # deep bg: status strips, bottom bars
+        "bg":               "#f3f5fc",   # main window background
+        "panel":            "#ffffff",   # pure white content panels
+        "surface":          "#e8ecf7",   # toolbar/header bg (replaces dark #16162a)
+        "border":           "#c8ceeb",   # light separator lines
+        "border2":          "#a0aad6",   # input borders, stronger dividers
+        "accent":           "#8b6200",   # dark amber — brand-consistent, WCAG AA on white
+        "text":             "#1a1e32",   # near-black with blue tint
+        "text_dim":         "#48507a",   # secondary labels
+        "text_muted":       "#787faa",   # placeholder / dimmed
+        "btn_bg":           "#eaecf8",   # button backgrounds
+        "input_bg":         "#ffffff",   # input field bg
+        "scrollbar_bg":     "#dce0f0",
+        "scrollbar_handle": "#a0aad6",
     }