- Remove WS_CAPTION via SetWindowLong to hide native Windows title bar - Keep WS_THICKFRAME for window resizing from edges - Add custom Win11-style window control buttons (minimize, maximize, close) - Close button turns red on hover (#c42b1c) matching Windows 11 - Title bar is draggable via -webkit-app-region: drag - Bind windowMinimize/windowMaximize/windowClose Go functions to JS - Center system status indicator in title bar Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
411 lines
16 KiB
CSS
411 lines
16 KiB
CSS
/* ============================================================
|
|
Driver Booster Pro - Windows 11 WinUI3 + PNG Icons
|
|
Mica/Acrylic materials, rounded corners, native look
|
|
============================================================ */
|
|
|
|
:root {
|
|
/* Windows 11 Dark Mica palette */
|
|
--bg: #202020;
|
|
--mica: #2c2c2c;
|
|
--surface: #2d2d2d;
|
|
--surface-light: #383838;
|
|
--surface-hover: #3a3a3a;
|
|
--card: #323232;
|
|
--border: rgba(255,255,255,0.0578);
|
|
--border-light: rgba(255,255,255,0.0837);
|
|
--border-top: rgba(255,255,255,0.093);
|
|
|
|
--text: #ffffffde;
|
|
--text-sec: #ffffffa0;
|
|
--text-dim: #ffffff60;
|
|
|
|
/* Windows 11 accent (Blue) */
|
|
--accent: #60cdff;
|
|
--accent-bg: #0078d4;
|
|
--accent-hover: #429ce3;
|
|
--accent-press: #005a9e;
|
|
--accent-subtle: rgba(96,205,255,0.08);
|
|
|
|
--green: #6ccb5f;
|
|
--green-bg: rgba(108,203,95,0.1);
|
|
--yellow: #fce100;
|
|
--yellow-bg: rgba(252,225,0,0.1);
|
|
--red: #ff99a4;
|
|
--red-bg: rgba(255,153,164,0.1);
|
|
|
|
--radius: 8px;
|
|
--radius-lg: 12px;
|
|
--radius-sm: 4px;
|
|
}
|
|
|
|
*{margin:0;padding:0;box-sizing:border-box}
|
|
|
|
body {
|
|
font-family:'Segoe UI Variable Display','Segoe UI Variable','Segoe UI',-apple-system,sans-serif;
|
|
background:var(--bg);
|
|
color:var(--text);
|
|
height:100vh;overflow:hidden;
|
|
font-size:14px;
|
|
-webkit-font-smoothing:antialiased;
|
|
}
|
|
|
|
/* ---- Shared icon sizes ---- */
|
|
.app-logo-img { width:24px; height:24px; }
|
|
.tab-img { width:32px; height:32px; }
|
|
.h2-icon { width:20px; height:20px; vertical-align:middle; margin-right:6px; }
|
|
.hdr-icon { width:14px; height:14px; vertical-align:middle; }
|
|
.pill-icon { width:12px; height:12px; vertical-align:middle; }
|
|
.mini-icon { width:20px; height:20px; }
|
|
.btn-icon { width:20px; height:20px; }
|
|
.placeholder-img { width:48px; height:48px; opacity:.35; }
|
|
.sys-head-icon { width:16px; height:16px; vertical-align:middle; }
|
|
.footer-icon { width:12px; height:12px; vertical-align:middle; }
|
|
.cta-icon { width:20px; height:20px; }
|
|
.drv-icon-img { width:24px; height:24px; }
|
|
.spinner-img { width:24px; height:24px; position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); }
|
|
|
|
/* ---- App Shell ---- */
|
|
.app { display:flex; flex-direction:column; height:100vh; background:var(--mica); }
|
|
|
|
/* ---- Custom Title Bar (frameless window) ---- */
|
|
.titlebar {
|
|
display:flex; align-items:center;
|
|
padding:0 0 0 12px;
|
|
height:38px;
|
|
background:var(--bg);
|
|
border-bottom:1px solid var(--border);
|
|
flex-shrink:0;
|
|
-webkit-app-region:drag;
|
|
user-select:none;
|
|
}
|
|
.titlebar-left { display:flex; align-items:center; gap:8px; -webkit-app-region:no-drag; flex-shrink:0; }
|
|
.titlebar-center { flex:1; display:flex; align-items:center; justify-content:center; }
|
|
.app-title { display:flex; align-items:center; gap:6px; }
|
|
.app-name { font-size:12px; font-weight:600; color:var(--text); letter-spacing:.3px; }
|
|
.app-edition {
|
|
font-size:9px; font-weight:600; color:var(--accent);
|
|
background:var(--accent-subtle); padding:1px 5px;
|
|
border-radius:var(--radius-sm); letter-spacing:.5px;
|
|
}
|
|
.sys-status { display:flex; align-items:center; gap:6px; font-size:11px; color:var(--text-dim); }
|
|
.status-led {
|
|
width:6px; height:6px; border-radius:50%;
|
|
background:var(--green); box-shadow:0 0 6px var(--green);
|
|
animation:pulse 2.5s ease-in-out infinite;
|
|
}
|
|
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
|
|
|
|
/* Window control buttons (Win11 style) */
|
|
.titlebar-controls {
|
|
display:flex; align-items:stretch;
|
|
height:38px; flex-shrink:0;
|
|
-webkit-app-region:no-drag;
|
|
}
|
|
.win-btn {
|
|
width:46px; height:38px;
|
|
display:flex; align-items:center; justify-content:center;
|
|
background:transparent; border:none;
|
|
color:var(--text-sec); cursor:pointer;
|
|
transition:background .1s ease;
|
|
font-family:inherit;
|
|
}
|
|
.win-btn:hover { background:rgba(255,255,255,0.06); color:var(--text); }
|
|
.win-btn:active { background:rgba(255,255,255,0.04); }
|
|
.win-close:hover { background:#c42b1c; color:white; }
|
|
.win-close:active { background:#b52a1c; }
|
|
|
|
/* ---- Toolbar (Win11 Tabs / NavigationView) ---- */
|
|
.toolbar {
|
|
display:flex; gap:2px; padding:6px 12px;
|
|
background:var(--mica);
|
|
border-bottom:1px solid var(--border);
|
|
flex-shrink:0;
|
|
}
|
|
.toolbar-tab {
|
|
display:flex; flex-direction:column; align-items:center; gap:4px;
|
|
padding:8px 20px;
|
|
border:none; border-radius:var(--radius);
|
|
background:transparent; color:var(--text-sec);
|
|
font-size:11px; font-weight:500;
|
|
cursor:pointer; transition:all .15s ease; font-family:inherit;
|
|
position:relative;
|
|
}
|
|
.toolbar-tab:hover { background:var(--surface-hover); color:var(--text); }
|
|
.toolbar-tab.active {
|
|
background:var(--surface);
|
|
color:var(--text);
|
|
border:1px solid var(--border-light);
|
|
border-top:1px solid var(--border-top);
|
|
}
|
|
.toolbar-tab.active::after {
|
|
content:'';
|
|
position:absolute; bottom:4px; left:50%; transform:translateX(-50%);
|
|
width:16px; height:3px; border-radius:2px;
|
|
background:var(--accent);
|
|
}
|
|
|
|
/* ---- Content ---- */
|
|
.content-area { flex:1; overflow:hidden; position:relative; }
|
|
.tab-page { display:none; height:100%; animation:fadeUp .25s ease; }
|
|
.tab-page.active { display:flex; flex-direction:column; }
|
|
@keyframes fadeUp{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}
|
|
|
|
/* ---- Scan Hero ---- */
|
|
.scan-hero {
|
|
flex:1; display:flex; align-items:center; justify-content:center;
|
|
gap:48px; padding:32px;
|
|
}
|
|
.scan-illustration { position:relative; flex-shrink:0; }
|
|
.hero-img { width:120px; height:120px; filter:drop-shadow(0 4px 16px rgba(0,0,0,0.3)); }
|
|
.hero-shield {
|
|
width:48px; height:48px; position:absolute; bottom:-6px; right:-12px;
|
|
filter:drop-shadow(0 2px 8px rgba(108,203,95,0.4));
|
|
animation:shieldBob 3s ease-in-out infinite;
|
|
}
|
|
@keyframes shieldBob{0%,100%{transform:translateY(0)}50%{transform:translateY(-5px)}}
|
|
|
|
.scan-info { max-width:360px; }
|
|
.scan-info h2 { font-size:28px; font-weight:600; margin-bottom:8px; }
|
|
.scan-info p { color:var(--text-sec); font-size:14px; line-height:1.5; margin-bottom:20px; }
|
|
|
|
.scan-stats { display:flex; gap:10px; margin-bottom:24px; }
|
|
.mini-stat {
|
|
display:flex; align-items:center; gap:8px;
|
|
background:var(--surface); border:1px solid var(--border);
|
|
border-radius:var(--radius); padding:10px 14px;
|
|
}
|
|
.mini-stat span { font-size:18px; font-weight:700; }
|
|
.mini-stat label { font-size:10px; color:var(--text-dim); text-transform:uppercase; letter-spacing:.4px; }
|
|
.mini-stat.warn span { color:var(--yellow); }
|
|
.mini-stat.danger span { color:var(--red); }
|
|
|
|
/* Win11 accent button */
|
|
.big-scan-btn {
|
|
display:flex; align-items:center; gap:10px;
|
|
padding:12px 40px;
|
|
background:var(--accent-bg); border:none;
|
|
border-radius:var(--radius); color:white;
|
|
font-size:14px; font-weight:600;
|
|
cursor:pointer; transition:all .15s ease; font-family:inherit;
|
|
}
|
|
.big-scan-btn:hover { background:var(--accent-hover); }
|
|
.big-scan-btn:active { background:var(--accent-press); transform:scale(0.98); }
|
|
|
|
/* ---- Step Bar ---- */
|
|
.step-bar {
|
|
display:flex; align-items:center; justify-content:center;
|
|
padding:12px 16px;
|
|
border-top:1px solid var(--border); background:var(--bg);
|
|
flex-shrink:0;
|
|
}
|
|
.step { display:flex; align-items:center; gap:6px; font-size:12px; color:var(--text-dim); font-weight:500; }
|
|
.step.active { color:var(--accent); }
|
|
.step.done { color:var(--green); }
|
|
.step-num {
|
|
width:22px; height:22px; border-radius:50%;
|
|
border:2px solid var(--text-dim);
|
|
display:flex; align-items:center; justify-content:center;
|
|
font-size:11px; font-weight:600;
|
|
}
|
|
.step.active .step-num { border-color:var(--accent-bg); background:var(--accent-bg); color:white; }
|
|
.step.done .step-num { border-color:var(--green); background:var(--green); color:#000; }
|
|
.step-line { width:48px; height:1px; background:var(--text-dim); margin:0 10px; opacity:.3; }
|
|
|
|
/* ---- Tab Header ---- */
|
|
.tab-header {
|
|
display:flex; justify-content:space-between; align-items:center;
|
|
padding:14px 20px; border-bottom:1px solid var(--border); flex-shrink:0;
|
|
}
|
|
.tab-header-left h2 { font-size:16px; font-weight:600; display:flex; align-items:center; }
|
|
.result-count { font-size:12px; color:var(--text-dim); margin-top:2px; }
|
|
.warn-text { color:var(--yellow); }
|
|
|
|
/* Win11 subtle button */
|
|
.header-btn {
|
|
display:flex; align-items:center; gap:5px;
|
|
padding:6px 14px; background:var(--surface);
|
|
border:1px solid var(--border); border-radius:var(--radius);
|
|
color:var(--text-sec); font-size:12px; font-weight:500;
|
|
cursor:pointer; transition:all .15s ease; font-family:inherit;
|
|
}
|
|
.header-btn:hover { background:var(--surface-hover); color:var(--text); }
|
|
|
|
/* ---- Filter ---- */
|
|
.filter-strip { display:flex; gap:4px; padding:8px 20px; border-bottom:1px solid var(--border); flex-shrink:0; }
|
|
.pill {
|
|
display:flex; align-items:center; gap:4px;
|
|
padding:4px 12px; border:1px solid var(--border); border-radius:var(--radius);
|
|
background:transparent; color:var(--text-dim);
|
|
font-size:12px; font-weight:500; cursor:pointer;
|
|
transition:all .12s ease; font-family:inherit;
|
|
}
|
|
.pill:hover { background:var(--surface-hover); color:var(--text); }
|
|
.pill.active { background:var(--accent-bg); border-color:var(--accent-bg); color:white; }
|
|
|
|
/* ---- Driver Scroll ---- */
|
|
.driver-scroll { flex:1; overflow-y:auto; padding:8px 20px; }
|
|
.driver-scroll::-webkit-scrollbar{width:6px}
|
|
.driver-scroll::-webkit-scrollbar-track{background:transparent}
|
|
.driver-scroll::-webkit-scrollbar-thumb{background:rgba(255,255,255,0.1);border-radius:3px}
|
|
.driver-scroll::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,0.15)}
|
|
|
|
.placeholder-msg { text-align:center; padding:64px 20px; color:var(--text-dim); }
|
|
.placeholder-msg p { font-size:14px; margin-top:8px; }
|
|
|
|
/* ---- Driver Row (WinUI3 ListItem) ---- */
|
|
.drv-row {
|
|
display:flex; align-items:center; gap:12px;
|
|
padding:10px 14px;
|
|
background:var(--card); border:1px solid var(--border);
|
|
border-radius:var(--radius); margin-bottom:4px;
|
|
transition:background .12s ease;
|
|
}
|
|
.drv-row:hover { background:var(--surface-hover); }
|
|
.drv-row.outdated { border-left:3px solid var(--yellow); }
|
|
.drv-row.error { border-left:3px solid var(--red); }
|
|
|
|
.drv-icon {
|
|
width:36px; height:36px; border-radius:var(--radius);
|
|
display:flex; align-items:center; justify-content:center; flex-shrink:0;
|
|
background:var(--accent-subtle);
|
|
}
|
|
|
|
.drv-info { flex:1; min-width:0; }
|
|
.drv-name { font-size:13px; font-weight:600; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
|
|
.drv-meta { font-size:11px; color:var(--text-dim); margin-top:1px; display:flex; align-items:center; gap:4px; flex-wrap:wrap; }
|
|
|
|
.drv-progress { width:100px; flex-shrink:0; }
|
|
.drv-bar { height:3px; background:rgba(255,255,255,0.06); border-radius:2px; overflow:hidden; }
|
|
.drv-bar-fill { height:100%; border-radius:2px; transition:width .5s ease; }
|
|
.drv-bar-fill.ok { background:var(--green); width:100%; }
|
|
.drv-bar-fill.warn { background:var(--yellow); width:60%; }
|
|
.drv-bar-fill.err { background:var(--red); width:30%; }
|
|
|
|
.drv-actions { display:flex; gap:4px; flex-shrink:0; }
|
|
.drv-btn {
|
|
display:flex; align-items:center; gap:4px;
|
|
padding:5px 10px; border-radius:var(--radius);
|
|
border:1px solid var(--border); background:var(--surface);
|
|
color:var(--text-sec); font-size:11px; font-weight:500;
|
|
cursor:pointer; transition:all .12s ease; font-family:inherit;
|
|
}
|
|
.drv-btn img { width:13px; height:13px; }
|
|
.drv-btn:hover { background:var(--surface-hover); color:var(--text); }
|
|
|
|
.drv-btn.install-btn {
|
|
background:var(--accent-bg); border-color:var(--accent-bg); color:white;
|
|
}
|
|
.drv-btn.install-btn:hover { background:var(--accent-hover); }
|
|
|
|
.drv-btn.ok-btn {
|
|
background:var(--green-bg); border-color:rgba(108,203,95,0.2);
|
|
color:var(--green); cursor:default;
|
|
}
|
|
|
|
.drv-badge {
|
|
font-size:10px; font-weight:500; padding:1px 6px; border-radius:var(--radius-sm);
|
|
display:inline-flex; align-items:center; gap:3px;
|
|
}
|
|
.drv-badge.signed { background:var(--green-bg); color:var(--green); }
|
|
.drv-badge.unsigned { background:var(--red-bg); color:var(--red); }
|
|
|
|
/* ---- CTA Bar ---- */
|
|
.cta-bar {
|
|
padding:12px 20px; border-top:1px solid var(--border);
|
|
background:var(--bg); display:flex; justify-content:center; flex-shrink:0;
|
|
}
|
|
.cta-btn {
|
|
display:flex; align-items:center; gap:8px;
|
|
padding:10px 36px;
|
|
background:var(--accent-bg); border:none;
|
|
border-radius:var(--radius); color:white;
|
|
font-size:14px; font-weight:600;
|
|
cursor:pointer; transition:all .15s ease; font-family:inherit;
|
|
}
|
|
.cta-btn:hover { background:var(--accent-hover); }
|
|
.cta-btn:active { background:var(--accent-press); transform:scale(.98); }
|
|
.cta-count { background:rgba(255,255,255,0.15); padding:2px 8px; border-radius:var(--radius-sm); font-size:11px; }
|
|
|
|
/* ---- Update Rows ---- */
|
|
.upd-row {
|
|
padding:10px 14px; background:var(--card); border:1px solid var(--border);
|
|
border-radius:var(--radius); margin-bottom:4px; transition:background .12s ease;
|
|
}
|
|
.upd-row:hover { background:var(--surface-hover); }
|
|
.upd-row.pending { border-left:3px solid var(--accent-bg); }
|
|
.upd-row.done { opacity:.45; }
|
|
.upd-title { font-size:13px; font-weight:600; margin-bottom:3px; }
|
|
.upd-meta { display:flex; gap:12px; flex-wrap:wrap; font-size:11px; color:var(--text-dim); }
|
|
.upd-tag { display:flex; align-items:center; gap:3px; }
|
|
.upd-tag img { width:12px; height:12px; }
|
|
.upd-section { font-size:12px; font-weight:600; margin:12px 0 6px; display:flex; align-items:center; gap:6px; }
|
|
.upd-section img { width:14px; height:14px; }
|
|
.upd-section.pend { color:var(--accent); }
|
|
.upd-section.inst { color:var(--green); }
|
|
|
|
/* ---- System Grid ---- */
|
|
.sys-grid { display:grid; grid-template-columns:1fr 1fr; gap:8px; padding:12px 20px; overflow-y:auto; flex:1; }
|
|
.sys-card { background:var(--card); border:1px solid var(--border); border-radius:var(--radius); overflow:hidden; }
|
|
.sys-card-head {
|
|
display:flex; align-items:center; gap:6px;
|
|
padding:10px 14px; background:rgba(255,255,255,0.02);
|
|
border-bottom:1px solid var(--border);
|
|
font-size:12px; font-weight:600; color:var(--text-sec);
|
|
}
|
|
.sys-row { display:flex; justify-content:space-between; padding:7px 14px; font-size:12px; border-bottom:1px solid var(--border); }
|
|
.sys-row:last-of-type { border-bottom:none; }
|
|
.sys-row span:first-child { color:var(--text-dim); }
|
|
.sys-row span:last-child { font-weight:600; max-width:55%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
|
|
.sys-bar-wrap { padding:6px 14px 10px; }
|
|
.sys-bar { height:4px; background:rgba(255,255,255,0.06); border-radius:2px; overflow:hidden; }
|
|
.sys-bar-fill { height:100%; border-radius:2px; transition:width .8s ease; }
|
|
.ram-bar { background:linear-gradient(90deg,var(--green),#6ccb5f); }
|
|
.disk-bar { background:linear-gradient(90deg,var(--accent-bg),var(--accent)); }
|
|
|
|
/* ---- Footer ---- */
|
|
.app-footer {
|
|
display:flex; justify-content:space-between; align-items:center;
|
|
padding:6px 16px; border-top:1px solid var(--border);
|
|
background:var(--bg); font-size:11px; color:var(--text-dim); flex-shrink:0;
|
|
}
|
|
.footer-right { display:flex; gap:2px; }
|
|
.footer-btn {
|
|
display:flex; align-items:center; gap:4px; padding:3px 8px;
|
|
background:transparent; border:1px solid transparent; border-radius:var(--radius-sm);
|
|
color:var(--text-dim); font-size:11px; cursor:pointer;
|
|
font-family:inherit; transition:all .12s ease;
|
|
}
|
|
.footer-btn:hover { color:var(--text-sec); background:var(--surface-hover); }
|
|
.credit-link { color:var(--accent); text-decoration:none; font-weight:600; }
|
|
.credit-link:hover { text-decoration:underline; }
|
|
|
|
/* ---- Loading ---- */
|
|
.loading-overlay {
|
|
position:fixed; inset:0;
|
|
background:rgba(32,32,32,0.85); backdrop-filter:blur(20px);
|
|
display:flex; align-items:center; justify-content:center; z-index:1000;
|
|
}
|
|
.loading-card {
|
|
text-align:center; padding:36px 48px;
|
|
background:var(--card); border:1px solid var(--border-light);
|
|
border-radius:var(--radius-lg);
|
|
box-shadow:0 8px 32px rgba(0,0,0,.5);
|
|
}
|
|
.loading-spinner { width:56px; height:56px; margin:0 auto 16px; position:relative; }
|
|
.spinner-ring {
|
|
position:absolute; inset:0;
|
|
border:3px solid var(--border);
|
|
border-top-color:var(--accent-bg);
|
|
border-radius:50%; animation:spin .9s linear infinite;
|
|
}
|
|
@keyframes spin{to{transform:rotate(360deg)}}
|
|
.loading-title { font-size:14px; font-weight:600; margin-bottom:10px; }
|
|
.loading-dots { display:flex; justify-content:center; gap:4px; }
|
|
.loading-dots span {
|
|
width:4px; height:4px; border-radius:50%; background:var(--accent-bg);
|
|
animation:dotPulse 1.4s ease-in-out infinite;
|
|
}
|
|
.loading-dots span:nth-child(2){animation-delay:.2s}
|
|
.loading-dots span:nth-child(3){animation-delay:.4s}
|
|
@keyframes dotPulse{0%,80%,100%{opacity:.3;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}
|