/* LabDAQ — Industrial Dark Theme Palette: bg-base #0b0e13 bg-panel #111620 bg-card #161d2e bg-raised #1c2540 border #2a3558 accent #3b82f6 cyan #00d4ff green #22c55e text #e2e8f0 muted #8b9dc3 dim #64748b danger #ef4444 warning #f59e0b */ /* ── Global ─────────────────────────────────────────────────────── */ * { font-family: "IBM Plex Sans", "Segoe UI", Tahoma, sans-serif; font-size: 13px; color: #e2e8f0; } QMainWindow, QDialog { background-color: #0b0e13; } QWidget { color: #e2e8f0; } /* Containers inside scroll areas inherit dark bg */ QAbstractScrollArea > QWidget { background-color: #111620; } QAbstractScrollArea > QWidget > QWidget { background-color: #111620; } /* ── Toolbar ─────────────────────────────────────────────────────── */ QToolBar#mainToolbar { background-color: #0b0e13; border-bottom: 1px solid #2a3558; padding: 4px 8px; spacing: 6px; } QPushButton#runButton { background-color: #166534; color: #dcfce7; border: 1px solid #22c55e; border-radius: 4px; padding: 5px 16px; font-family: "IBM Plex Mono", monospace; font-weight: 600; letter-spacing: 0.5px; min-width: 90px; } QPushButton#runButton:checked { background-color: #7f1d1d; border-color: #ef4444; color: #fee2e2; } QPushButton#runButton:hover { background-color: #15803d; } QPushButton#runButton:checked:hover { background-color: #991b1b; } QPushButton#logButton { background-color: #1c2540; color: #8b9dc3; border: 1px solid #2a3558; border-radius: 4px; padding: 5px 14px; font-family: "IBM Plex Mono", monospace; min-width: 80px; } QPushButton#logButton:enabled { color: #e2e8f0; border-color: #3b82f6; } QPushButton#logButton:checked { background-color: #7c2d12; border-color: #ef4444; color: #fee2e2; } QPushButton#addDeviceButton { background-color: #1e3a5f; color: #93c5fd; border: 1px solid #3b82f6; border-radius: 4px; padding: 5px 14px; } QPushButton#addDeviceButton:hover { background-color: #1d4ed8; color: #eff6ff; } QPushButton#toolbarSectionBtn { background-color: #161d2e; color: #8b9dc3; border: 1px solid #2a3558; border-radius: 4px; padding: 5px 14px; font-weight: 600; } QPushButton#toolbarSectionBtn:hover { background-color: #1c2540; color: #c7d2fe; border-color: #3b82f6; } QPushButton#toolbarSectionBtn:checked { background-color: #1e3a5f; color: #93c5fd; border-color: #3b82f6; } QFrame#toolbarSep { color: #2a3558; max-width: 1px; margin: 4px 4px; } QLabel#timeLabel { font-family: "IBM Plex Mono", monospace; font-size: 16px; font-weight: 700; color: #00d4ff; letter-spacing: 2px; padding-right: 8px; } /* ── Panel headers ───────────────────────────────────────────────── */ QLabel#panelHeader { background-color: #0f1521; color: #8b9dc3; font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; letter-spacing: 2px; padding: 6px 10px; border-bottom: 1px solid #2a3558; } /* ── Device Cards ────────────────────────────────────────────────── */ QScrollArea#deviceScroll { background-color: #0b0e13; border: none; } QFrame#deviceCard { background-color: #161d2e; border: 1px solid #2a3558; border-radius: 6px; } QFrame#deviceCard:hover { border-color: #3b82f6; background-color: #1c2540; } QLabel#deviceIcon { font-size: 18px; } QLabel#deviceName { font-size: 13px; font-weight: 600; color: #e2e8f0; } QLabel#deviceSub { font-family: "IBM Plex Mono", monospace; font-size: 11px; color: #8b9dc3; } QLabel#deviceChannelCount { font-size: 11px; color: #3b82f6; } QPushButton#configButton { background-color: #1c2540; color: #8b9dc3; border: 1px solid #2a3558; border-radius: 3px; padding: 3px 10px; font-size: 12px; } QPushButton#configButton:hover { background-color: #1e3a5f; color: #93c5fd; border-color: #3b82f6; } /* ── GroupBox — the main fix ─────────────────────────────────────── */ QGroupBox { border: 1px solid #2a3558; border-radius: 5px; margin-top: 26px; padding-top: 6px; background-color: #111620; } QGroupBox::title { subcontrol-origin: margin; subcontrol-position: top left; left: 10px; top: 4px; background-color: #1c2540; color: #c7d2fe; font-size: 12px; font-weight: 700; letter-spacing: 0.5px; padding: 3px 10px; border: 1px solid #3b82f6; border-radius: 4px; } /* ── Form inputs ─────────────────────────────────────────────────── */ QLineEdit, QDoubleSpinBox, QSpinBox, QComboBox { background-color: #0b0e13; border: 1px solid #2a3558; border-radius: 3px; padding: 5px 8px; color: #e2e8f0; font-family: "IBM Plex Mono", monospace; font-size: 12px; min-height: 24px; } QLineEdit:focus, QDoubleSpinBox:focus, QSpinBox:focus, QComboBox:focus { border-color: #3b82f6; background-color: #0f1521; } QComboBox::drop-down { border: none; width: 20px; } QComboBox QAbstractItemView { background-color: #161d2e; border: 1px solid #3b82f6; selection-background-color: #1e3a5f; color: #e2e8f0; } QCheckBox { color: #c7d2fe; spacing: 7px; font-size: 13px; } QCheckBox::indicator { width: 15px; height: 15px; border: 1px solid #2a3558; border-radius: 3px; background-color: #0b0e13; } QCheckBox::indicator:checked { background-color: #3b82f6; border-color: #3b82f6; } QLabel { color: #c7d2fe; } /* ── Port list ───────────────────────────────────────────────────── */ QListWidget#portList { background-color: #0b0e13; border: 1px solid #2a3558; border-radius: 4px; color: #e2e8f0; font-family: "IBM Plex Mono", monospace; font-size: 12px; outline: none; } QListWidget#portList::item { padding: 5px 8px; border-bottom: 1px solid #1c2540; color: #e2e8f0; } QListWidget#portList::item:hover { background-color: #1c2540; color: #93c5fd; } QListWidget#portList::item:selected { background-color: #1e3a5f; color: #e0f2fe; border-left: 3px solid #3b82f6; } /* ── Channel table ───────────────────────────────────────────────── */ QTableWidget#channelTable { background-color: #0b0e13; gridline-color: #1c2540; border: 1px solid #2a3558; alternate-background-color: #111620; color: #e2e8f0; font-size: 12px; } QHeaderView::section { background-color: #161d2e; color: #8b9dc3; border: none; border-bottom: 1px solid #2a3558; padding: 5px 8px; font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; letter-spacing: 0.5px; } /* ── Floating window headers ─────────────────────────────────────── */ QWidget#devWindowTitleBar { background-color: #0f1521; border-bottom: 1px solid #2a3558; } QLabel#devWindowTitle { font-family: "IBM Plex Mono", monospace; font-size: 13px; font-weight: 700; letter-spacing: 1.5px; color: #c7d2fe; } QFrame#devWindowDivider { color: #2a3558; max-height: 1px; } QWidget#cfgTopBar { background-color: #0b0e13; border-bottom: 1px solid #2a3558; } QLabel#cfgTopBarTitle { font-family: "IBM Plex Mono", monospace; font-size: 13px; font-weight: 700; letter-spacing: 1.5px; color: #818cf8; } QWidget#cfgGlobalBar { background-color: #0f1521; border-bottom: 1px solid #1c2540; } QWidget#cfgBottomBar { background-color: #0b0e13; border-top: 1px solid #2a3558; } QDoubleSpinBox#cfgGlobalSpin { font-family: "IBM Plex Mono", monospace; font-size: 12px; background: #0b0e13; border: 1px solid #2a3558; border-radius: 3px; color: #e2e8f0; padding: 3px 6px; } /* ── Plot blocks ─────────────────────────────────────────────────── */ QFrame#plotBlock { background-color: #111620; border: 1px solid #2a3558; border-radius: 6px; } QFrame#plotBlock:hover { border-color: #4338ca; } QWidget#plotBlockHeader { background-color: #0d1117; border-radius: 5px 5px 0 0; border-bottom: 1px solid #2a3558; } QLineEdit#plotBlockTitle { font-family: "IBM Plex Mono", monospace; font-size: 13px; font-weight: 700; color: #c7d2fe; background: transparent; border: none; border-bottom: 1px solid transparent; padding: 2px 4px; } QLineEdit#plotBlockTitle:focus { border-bottom: 1px solid #4338ca; color: #e0e7ff; } QToolButton#plotMoveBtn { background: transparent; color: #64748b; border: none; font-size: 12px; border-radius: 3px; } QToolButton#plotMoveBtn:hover { background-color: #1c2540; color: #94a3b8; } QToolButton#plotRemoveBtn { background: transparent; color: #475569; border: none; font-size: 13px; border-radius: 3px; } QToolButton#plotRemoveBtn:hover { background-color: #450a0a; color: #ef4444; } QWidget#plotBlockSettings { background-color: #111620; border-bottom: 1px solid #1c2540; } QWidget#plotBlockTraces { background-color: #111620; border-radius: 0 0 5px 5px; } /* ── Trace rows ─────────────────────────────────────────────────── */ QFrame#traceRow { background-color: #161d2e; border: 1px solid #1c2540; border-radius: 4px; } QFrame#traceRow:hover { border-color: #2a3558; background-color: #1c2540; } QLabel#traceSource { font-family: "IBM Plex Mono", monospace; font-size: 12px; color: #8b9dc3; } QLineEdit#traceLabel { font-family: "IBM Plex Mono", monospace; font-size: 12px; background: #0b0e13; border: 1px solid #1c2540; border-radius: 3px; color: #c7d2fe; padding: 2px 6px; } QLineEdit#traceLabel:focus { border-color: #3b82f6; color: #e2e8f0; } QLineEdit#plotYLabelEdit { font-family: "IBM Plex Mono", monospace; font-size: 12px; background: #0b0e13; border: 1px solid #2a3558; border-radius: 3px; color: #8b9dc3; padding: 3px 6px; max-width: 140px; } QComboBox#traceStyleCb, QDoubleSpinBox#traceWidthSpin { font-family: "IBM Plex Mono", monospace; font-size: 11px; background: #0b0e13; border: 1px solid #1c2540; border-radius: 3px; color: #8b9dc3; padding: 2px 4px; } QToolButton#traceRemoveBtn { background: transparent; color: #334155; border: none; font-size: 13px; border-radius: 3px; } QToolButton#traceRemoveBtn:hover { background-color: #450a0a; color: #ef4444; } QPushButton#addTraceBtn { background-color: #1c2540; color: #8b9dc3; border: 1px dashed #2a3558; border-radius: 4px; padding: 5px 12px; font-size: 12px; } QPushButton#addTraceBtn:hover { background-color: #1e3a5f; color: #93c5fd; border-color: #3b82f6; border-style: solid; } QComboBox#channelPickerCb { font-family: "IBM Plex Mono", monospace; font-size: 12px; background: #0b0e13; border: 1px solid #2a3558; border-radius: 3px; color: #8b9dc3; padding: 4px 8px; } QComboBox#channelPickerCb:focus { border-color: #3b82f6; } /* ── Tabs ────────────────────────────────────────────────────────── */ QTabWidget::pane { background-color: #111620; border: 1px solid #2a3558; border-radius: 4px; } QTabBar::tab { background-color: #0b0e13; color: #8b9dc3; border: 1px solid #2a3558; padding: 7px 18px; margin-right: 2px; font-size: 12px; } QTabBar::tab:selected { background-color: #161d2e; color: #e2e8f0; border-bottom: 2px solid #3b82f6; } QTabBar::tab:hover { background-color: #111620; color: #c7d2fe; } QTabWidget#signalBuilderTabs QTabBar::tab { font-family: "IBM Plex Mono", monospace; font-size: 12px; letter-spacing: 0.5px; } QTabWidget#signalBuilderTabs QTabBar::tab:selected { color: #c7d2fe; border-bottom: 2px solid #818cf8; } /* ── Code editor ─────────────────────────────────────────────────── */ QTextEdit#codeEditor { font-family: "IBM Plex Mono", monospace; font-size: 13px; background-color: #060810; color: #e2e8f0; border: 1px solid #2a3558; border-radius: 4px; padding: 6px; selection-background-color: #1e3a5f; } QTextEdit#codeEditor:focus { border-color: #818cf8; } /* ── Scrollbars ───────────────────────────────────────────────────── */ QScrollBar:vertical { background: #0b0e13; width: 8px; margin: 0; } QScrollBar::handle:vertical { background: #2a3558; border-radius: 4px; min-height: 20px; } QScrollBar::handle:vertical:hover { background: #3b82f6; } QScrollBar::add-line:vertical, QScrollBar::sub-line:vertical { height: 0; } QScrollBar:horizontal { height: 8px; background: #0b0e13; } QScrollBar::handle:horizontal { background: #2a3558; border-radius: 4px; min-width: 20px; } QScrollBar::handle:horizontal:hover { background: #3b82f6; } QScrollBar::add-line:horizontal, QScrollBar::sub-line:horizontal { width: 0; } /* ── Splitter ─────────────────────────────────────────────────────── */ QSplitter::handle { background-color: #2a3558; } QSplitter::handle:hover { background-color: #3b82f6; } /* ── Status bar ───────────────────────────────────────────────────── */ QStatusBar { background-color: #0b0e13; border-top: 1px solid #2a3558; color: #8b9dc3; font-family: "IBM Plex Mono", monospace; font-size: 12px; } /* ── Default button ───────────────────────────────────────────────── */ QPushButton { background-color: #1c2540; color: #8b9dc3; border: 1px solid #2a3558; border-radius: 4px; padding: 5px 12px; font-size: 12px; } QPushButton:hover { background-color: #1e3a5f; color: #e2e8f0; } QPushButton:pressed { background-color: #172554; } QPushButton:disabled { color: #334155; border-color: #1c2540; } QPushButton#applyButton { background-color: #1e3a5f; color: #93c5fd; border: 1px solid #3b82f6; border-radius: 4px; padding: 6px 20px; font-weight: 600; font-size: 13px; } QPushButton#applyButton:hover { background-color: #1d4ed8; color: #eff6ff; } /* ── Control widgets ─────────────────────────────────────────────── */ QFrame#controlWidget { background-color: #161d2e; border: 1px solid #2a3558; border-radius: 6px; } QWidget#controlWidgetHeader { background-color: #0f1521; border-radius: 5px 5px 0 0; border-bottom: 1px solid #2a3558; } QLabel#controlWidgetIcon { font-size: 14px; color: #3b82f6; padding-right: 4px; } QLabel#controlWidgetTitle { font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; letter-spacing: 1.5px; color: #8b9dc3; } QWidget#controlWidgetBody { background-color: #161d2e; border-radius: 0 0 5px 5px; } QLabel#motorSpeedLbl { font-family: "IBM Plex Mono", monospace; font-size: 28px; font-weight: 700; color: #00d4ff; } QLabel#motorUnitLbl { font-family: "IBM Plex Mono", monospace; font-size: 12px; color: #64748b; padding-top: 12px; } QLabel#motorPctLbl { font-family: "IBM Plex Mono", monospace; font-size: 12px; color: #64748b; } QSlider#motorSlider::groove:horizontal, QSlider#pwmSlider::groove:horizontal { background: #1c2540; height: 6px; border-radius: 3px; } QSlider#motorSlider::handle:horizontal, QSlider#pwmSlider::handle:horizontal { background: #3b82f6; border: 2px solid #1d4ed8; width: 16px; height: 16px; margin: -5px 0; border-radius: 8px; } QSlider#motorSlider::sub-page:horizontal { background: #1d4ed8; border-radius: 3px; } QSlider#pwmSlider::sub-page:horizontal { background: #7c3aed; border-radius: 3px; } QPushButton#motorDirBtn { background-color: #1c2540; color: #8b9dc3; border: 1px solid #2a3558; border-radius: 4px; padding: 5px 10px; font-family: "IBM Plex Mono", monospace; font-size: 12px; } QPushButton#motorDirBtnRev { background-color: #2d1b69; color: #c4b5fd; border: 1px solid #7c3aed; border-radius: 4px; padding: 5px 10px; font-family: "IBM Plex Mono", monospace; font-size: 12px; } QPushButton#motorRunBtnOff { background-color: #1c2540; color: #64748b; border: 1px solid #2a3558; border-radius: 4px; padding: 5px 12px; font-family: "IBM Plex Mono", monospace; font-weight: 700; } QPushButton#motorRunBtnOn { background-color: #166534; color: #dcfce7; border: 1px solid #22c55e; border-radius: 4px; padding: 5px 12px; font-family: "IBM Plex Mono", monospace; font-weight: 700; } QPushButton#switchBtnOff, QPushButton#switchBtn { background-color: #1c2540; color: #475569; border: 2px solid #2a3558; border-radius: 6px; font-family: "IBM Plex Mono", monospace; font-size: 18px; font-weight: 800; letter-spacing: 4px; min-height: 52px; } QPushButton#switchBtnOn { background-color: #14532d; color: #dcfce7; border: 2px solid #22c55e; border-radius: 6px; font-family: "IBM Plex Mono", monospace; font-size: 18px; font-weight: 800; letter-spacing: 4px; min-height: 52px; } QLabel#switchIndicatorOff { font-size: 18px; color: #334155; } QLabel#switchIndicatorOn { font-size: 18px; color: #22c55e; } QLabel#switchStateLbl { font-family: "IBM Plex Mono", monospace; font-size: 10px; font-weight: 700; letter-spacing: 1px; color: #475569; } QLabel#spLabel { font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; color: #3b82f6; letter-spacing: 0.5px; } QLabel#pvLabel { font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; color: #22c55e; letter-spacing: 0.5px; } QLabel#errLabel { font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; color: #f59e0b; letter-spacing: 0.5px; } QLabel#pvValue, QLabel#errValue { font-family: "IBM Plex Mono", monospace; font-size: 12px; color: #8b9dc3; } QDoubleSpinBox#spSpinbox { font-family: "IBM Plex Mono", monospace; font-size: 13px; font-weight: 600; color: #e2e8f0; background-color: #0b0e13; border: 1px solid #3b82f6; border-radius: 3px; padding: 3px 6px; } QPushButton#spStepBtn { background-color: #1e3a5f; color: #93c5fd; border: 1px solid #3b82f6; border-radius: 3px; font-size: 16px; font-weight: 700; padding: 0; } QPushButton#spStepBtn:hover { background-color: #1d4ed8; color: #eff6ff; } QLabel#pwmLabel { font-family: "IBM Plex Mono", monospace; font-size: 11px; color: #8b9dc3; } QLabel#pwmValue { font-family: "IBM Plex Mono", monospace; font-size: 13px; font-weight: 700; color: #c4b5fd; } QSpinBox#pwmFreqSpin { font-family: "IBM Plex Mono", monospace; font-size: 12px; background-color: #0b0e13; border: 1px solid #2a3558; border-radius: 3px; color: #e2e8f0; padding: 3px 6px; } QPushButton#digitalOutBtn { background-color: #1c2540; color: #64748b; border: 1px solid #2a3558; border-radius: 4px; padding: 4px 14px; font-family: "IBM Plex Mono", monospace; min-width: 50px; } QPushButton#digitalOutBtn:checked { background-color: #166534; border-color: #22c55e; color: #dcfce7; } /* ── Devices window ──────────────────────────────────────────────── */ QWidget#devWindowTitleBar { background-color: #0f1521; border-bottom: 1px solid #2a3558; } QFrame#devWindowDivider { color: #2a3558; max-height: 1px; } QWidget#controlPanelHeader { background-color: #0f1521; border-bottom: 1px solid #2a3558; } QPushButton#devicesSmallBtn { background-color: transparent; color: #64748b; border: 1px solid #2a3558; border-radius: 3px; font-size: 13px; padding: 0; } QPushButton#devicesSmallBtn:hover { background-color: #1c2540; color: #94a3b8; border-color: #3b82f6; } /* ── Plot Config buttons ─────────────────────────────────────────── */ QPushButton#plotCfgButton { background-color: #1a1f35; color: #818cf8; border: 1px solid #4338ca; border-radius: 4px; padding: 5px 14px; font-weight: 600; } QPushButton#plotCfgButton:hover { background-color: #312e81; color: #e0e7ff; border-color: #6366f1; } QPushButton#plotCfgButton:checked { background-color: #312e81; color: #e0e7ff; border-color: #818cf8; } /* ── Signals window tabs ─────────────────────────────────────────── */ QCheckBox#cfgLiveChk { color: #8b9dc3; font-size: 12px; spacing: 5px; } QRadioButton#cfgLiveChk { color: #8b9dc3; font-size: 12px; spacing: 5px; } /* ── Settings window form labels ────────────────────────────────── */ QFormLayout QLabel { color: #c7d2fe; font-size: 12px; } /* ── FormLayout labels — ensure visibility inside GroupBoxes ────── */ QGroupBox QLabel { color: #c7d2fe; font-size: 12px; } QGroupBox QFormLayout QLabel { color: #8b9dc3; font-size: 12px; min-width: 90px; } /* ── Hint / info labels ──────────────────────────────────────────── */ QLabel#traceSource { color: #8b9dc3; font-family: "IBM Plex Mono", monospace; font-size: 12px; } /* ── File dialog ─────────────────────────────────────────────────── */ QFileDialog { background-color: #0b0e13; } QFileDialog QWidget { background-color: #0b0e13; color: #e2e8f0; } QFileDialog QTreeView, QFileDialog QListView { background-color: #111620; border: 1px solid #2a3558; color: #e2e8f0; alternate-background-color: #161d2e; } QFileDialog QTreeView::item:selected, QFileDialog QListView::item:selected { background-color: #1e3a5f; color: #e0f2fe; } QFileDialog QTreeView::item:hover, QFileDialog QListView::item:hover { background-color: #1c2540; } QFileDialog QHeaderView::section { background-color: #161d2e; color: #8b9dc3; border: none; border-bottom: 1px solid #2a3558; padding: 4px 8px; } QFileDialog QSplitter { background-color: #0b0e13; } QFileDialog QSplitter::handle { background-color: #2a3558; } QFileDialog QToolBar { background-color: #0b0e13; border-bottom: 1px solid #2a3558; } QFileDialog QToolButton { background-color: transparent; color: #8b9dc3; border: 1px solid transparent; border-radius: 3px; padding: 2px; } QFileDialog QToolButton:hover { background-color: #1c2540; border-color: #2a3558; color: #e2e8f0; } QFileDialog QComboBox { background-color: #0b0e13; border: 1px solid #2a3558; color: #e2e8f0; } /* ── Profile / File menu ─────────────────────────────────────────── */ QMenu#profileMenu { background-color: #111620; border: 1px solid #2a3558; border-radius: 4px; padding: 4px 0; color: #e2e8f0; font-size: 13px; } QMenu#profileMenu::item { padding: 7px 20px; color: #c7d2fe; } QMenu#profileMenu::item:selected { background-color: #1e3a5f; color: #e0f2fe; } QMenu#profileMenu::separator { height: 1px; background: #2a3558; margin: 3px 8px; } /* ── Control widget wrapper (edit/remove row) ────────────────────── */ QFrame#controlWidgetWrapper { background: transparent; border: none; } /* ── Layout canvas ───────────────────────────────────────────────── */ QWidget#layoutCanvasBar { background-color: #0f1521; border-bottom: 1px solid #1c2540; } QLabel#layoutCanvasLabel { font-family: "IBM Plex Mono", monospace; font-size: 10px; font-weight: 700; letter-spacing: 2px; color: #4338ca; padding: 0 2px; } QFrame#layoutCanvasWidget { background-color: #0b0e13; border: 1px solid #2a3558; border-radius: 4px; } QFrame#layoutTile { background-color: #1c2540; border: 1px solid #2a3558; border-radius: 5px; } QFrame#layoutTile:hover { border-color: #4338ca; background-color: #212c52; } QFrame#layoutTileDragging { background-color: #1e3a5f; border: 2px solid #3b82f6; border-radius: 5px; } QLabel#layoutTileLabel { font-family: "IBM Plex Mono", monospace; font-size: 11px; font-weight: 700; color: #8b9dc3; background: transparent; }