From 9abcab2c6a5f30ff607a05c425fe8302906f93d9 Mon Sep 17 00:00:00 2001 From: Xujiacheng Date: Sat, 24 Jan 2026 01:34:24 +0800 Subject: [PATCH] =?UTF-8?q?style:=20=E6=9B=B4=E6=96=B0=E4=BA=86=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E7=9A=84=E6=A0=B7=E5=BC=8F=E5=92=8C=E4=B8=BB=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E6=95=B4=E4=BA=86=E9=A2=9C=E8=89=B2=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E4=BB=A5=E6=94=AF=E6=8C=81=E6=B7=B1=E8=89=B2=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/extension/extension-dist.zip | Bin 206804 -> 206797 bytes apps/extension/package.json | 2 +- apps/extension/public/manifest.json | 2 +- .../src/components/BbConfirmModal.vue | 29 ++-- apps/extension/src/content/main.js | 8 +- apps/extension/src/options/OptionsApp.vue | 5 +- .../src/options/pages/ImportExportPage.vue | 8 +- .../extension/src/options/pages/LoginPage.vue | 12 +- apps/extension/src/options/pages/MorePage.vue | 10 +- apps/extension/src/options/pages/MyPage.vue | 16 +-- .../src/options/pages/PublicPage.vue | 16 +-- apps/extension/src/popup/PopupApp.vue | 46 ++++--- apps/extension/src/style.css | 40 +++--- apps/web/package.json | 2 +- apps/web/src/App.vue | 47 ++++++- apps/web/src/components/BbModal.vue | 28 +++- apps/web/src/pages/AdminPage.vue | 9 +- apps/web/src/pages/MyPage.vue | 22 ++- apps/web/src/router.js | 3 - apps/web/src/style.css | 130 +++++++++++++++++- package-lock.json | 4 +- 21 files changed, 312 insertions(+), 127 deletions(-) diff --git a/apps/extension/extension-dist.zip b/apps/extension/extension-dist.zip index 8f6b94ed6467101187223d10c87157b4b6efcd38..9feb56d3cc3860d1f5d3877a206c3cad92307359 100644 GIT binary patch delta 11318 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 delta 10538 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 diff --git a/apps/extension/package.json b/apps/extension/package.json index 495b582..16fa839 100644 --- a/apps/extension/package.json +++ b/apps/extension/package.json @@ -1,7 +1,7 @@ { "name": "extension", "private": true, - "version": "1.0.3", + "version": "1.0.5", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/extension/public/manifest.json b/apps/extension/public/manifest.json index 982d352..07ccc76 100644 --- a/apps/extension/public/manifest.json +++ b/apps/extension/public/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "BrowserBookmark", - "version": "1.0.3", + "version": "1.0.5", "action": { "default_title": "Bookmarks", "default_popup": "popup.html" diff --git a/apps/extension/src/components/BbConfirmModal.vue b/apps/extension/src/components/BbConfirmModal.vue index 2f533bd..7135b5b 100644 --- a/apps/extension/src/components/BbConfirmModal.vue +++ b/apps/extension/src/components/BbConfirmModal.vue @@ -70,7 +70,7 @@ onBeforeUnmount(() => { .bb-modalBackdrop { position: absolute; inset: 0; - background: rgba(15, 23, 42, 0.38); + background: rgba(0, 0, 0, 0.75); backdrop-filter: blur(8px); } @@ -80,9 +80,9 @@ onBeforeUnmount(() => { max-height: min(84vh, 860px); overflow: auto; border-radius: 18px; - border: 1px solid rgba(255, 255, 255, 0.7); - background: rgba(255, 255, 255, 0.82); - box-shadow: 0 18px 60px rgba(15, 23, 42, 0.22); + border: 1px solid var(--bb-border); + background: var(--bb-panel); + box-shadow: 0 18px 60px rgba(0, 0, 0, 0.55); color: var(--bb-text); } @@ -92,7 +92,7 @@ onBeforeUnmount(() => { justify-content: space-between; gap: 10px; padding: 12px 14px; - border-bottom: 1px solid rgba(15, 23, 42, 0.1); + border-bottom: 1px solid rgba(148,163,184,0.18); } .bb-modalTitle { @@ -103,28 +103,21 @@ onBeforeUnmount(() => { width: 34px; height: 34px; border-radius: 12px; - border: 1px solid rgba(255, 255, 255, 0.6); - background: rgba(255, 255, 255, 0.5); + border: 1px solid var(--bb-border); + background: var(--bb-panel-hover); cursor: pointer; font-size: 20px; line-height: 1; - color: rgba(15, 23, 42, 0.75); + color: var(--bb-text); } -.bb-modalClose:hover { - background: rgba(255, 255, 255, 0.78); -} +.bb-modalClose:hover { background: var(--bb-panel); } .bb-modalBody { padding: 14px; } -.bb-modalMessage { - color: rgba(15, 23, 42, 0.78); - font-size: 13px; - line-height: 1.6; - white-space: pre-wrap; -} +.bb-modalMessage { color: var(--bb-muted); font-size: 13px; line-height: 1.6; white-space: pre-wrap; } .bb-modalActions { margin-top: 14px; @@ -143,7 +136,7 @@ onBeforeUnmount(() => { } .bb-btn--secondary { - background: rgba(255, 255, 255, 0.55); + background: var(--bb-panel-hover); color: var(--bb-text); border-color: var(--bb-border); } diff --git a/apps/extension/src/content/main.js b/apps/extension/src/content/main.js index 895173b..4c9b99d 100644 --- a/apps/extension/src/content/main.js +++ b/apps/extension/src/content/main.js @@ -55,11 +55,11 @@ function ensureStyles() { const style = document.createElement("style"); style.id = "bb-cred-style"; style.textContent = ` - .bb-cred-selector{position:fixed;z-index:2147483646;background:#fff;border:1px solid rgba(0,0,0,0.12);box-shadow:0 10px 24px rgba(0,0,0,0.15);border-radius:10px;padding:6px;min-width:240px;max-width:320px;} + .bb-cred-selector{position:fixed;z-index:2147483646;background:#2E2E2E;border:1px solid rgba(148,163,184,0.32);box-shadow:0 10px 28px rgba(0,0,0,0.55);border-radius:10px;padding:6px;min-width:240px;max-width:320px;color:#e2e8f0;} .bb-cred-item{display:flex;flex-direction:column;gap:4px;padding:8px;border-radius:8px;cursor:pointer;} - .bb-cred-item:hover{background:rgba(13,148,136,0.08);} - .bb-cred-site{font-size:12px;color:#64748b;} - .bb-cred-user{font-weight:700;color:#0f172a;} + .bb-cred-item:hover{background:rgba(34,197,94,0.16);} + .bb-cred-site{font-size:12px;color:rgba(226,232,240,0.72);} + .bb-cred-user{font-weight:700;color:#e2e8f0;} `; document.head.appendChild(style); } diff --git a/apps/extension/src/options/OptionsApp.vue b/apps/extension/src/options/OptionsApp.vue index 48ce335..421ba5c 100644 --- a/apps/extension/src/options/OptionsApp.vue +++ b/apps/extension/src/options/OptionsApp.vue @@ -21,16 +21,17 @@ body { margin: 0; } .nav { position: sticky; top: 0; - background: rgba(248, 250, 252, 0.82); + background: var(--bb-panel); border-bottom: 1px solid var(--bb-border); backdrop-filter: blur(10px); display: flex; justify-content: flex-start; padding: 10px 14px; gap: 10px; + color: var(--bb-text); } .brand { font-weight: 800; } -.content { max-width: 1100px; margin: 0 auto; padding: 14px; } +.content { max-width: 1100px; margin: 0 auto; padding: 14px; color: var(--bb-text); } a:focus-visible, button:focus-visible, diff --git a/apps/extension/src/options/pages/ImportExportPage.vue b/apps/extension/src/options/pages/ImportExportPage.vue index 53ea8d9..91cfc13 100644 --- a/apps/extension/src/options/pages/ImportExportPage.vue +++ b/apps/extension/src/options/pages/ImportExportPage.vue @@ -128,8 +128,8 @@ async function exportLocal() { diff --git a/apps/extension/src/options/pages/LoginPage.vue b/apps/extension/src/options/pages/LoginPage.vue index 5191cad..6a67155 100644 --- a/apps/extension/src/options/pages/LoginPage.vue +++ b/apps/extension/src/options/pages/LoginPage.vue @@ -66,12 +66,12 @@ async function submit() { diff --git a/apps/extension/src/options/pages/MorePage.vue b/apps/extension/src/options/pages/MorePage.vue index 8648f76..09ec975 100644 --- a/apps/extension/src/options/pages/MorePage.vue +++ b/apps/extension/src/options/pages/MorePage.vue @@ -79,8 +79,8 @@ onMounted(refresh); .h1 { margin: 0 0 10px; font-size: 18px; } .card { max-width: 560px; - border: 1px solid rgba(255,255,255,0.65); - background: var(--bb-card); + border: 1px solid var(--bb-border); + background: var(--bb-panel); border-radius: 18px; padding: 12px; display: grid; @@ -95,10 +95,10 @@ onMounted(refresh); cursor: pointer; } .btn--secondary { - background: rgba(255,255,255,0.55); + background: var(--bb-panel-hover); color: var(--bb-text); border-color: var(--bb-border); } -.muted { color: rgba(19, 78, 74, 0.72); font-size: 12px; } -.hint { color: rgba(19, 78, 74, 0.72); font-size: 12px; margin: 0; } +.muted { color: var(--bb-muted); font-size: 12px; } +.hint { color: var(--bb-muted); font-size: 12px; margin: 0; } diff --git a/apps/extension/src/options/pages/MyPage.vue b/apps/extension/src/options/pages/MyPage.vue index 7a96ac3..7977334 100644 --- a/apps/extension/src/options/pages/MyPage.vue +++ b/apps/extension/src/options/pages/MyPage.vue @@ -111,15 +111,15 @@ onMounted(load); diff --git a/apps/extension/src/options/pages/PublicPage.vue b/apps/extension/src/options/pages/PublicPage.vue index d67bb6b..9c88914 100644 --- a/apps/extension/src/options/pages/PublicPage.vue +++ b/apps/extension/src/options/pages/PublicPage.vue @@ -59,7 +59,7 @@ onMounted(load); diff --git a/apps/extension/src/popup/PopupApp.vue b/apps/extension/src/popup/PopupApp.vue index 4df6f95..8c90e7a 100644 --- a/apps/extension/src/popup/PopupApp.vue +++ b/apps/extension/src/popup/PopupApp.vue @@ -404,10 +404,11 @@ watch( diff --git a/apps/extension/src/style.css b/apps/extension/src/style.css index cf8e857..1ecc034 100644 --- a/apps/extension/src/style.css +++ b/apps/extension/src/style.css @@ -1,13 +1,16 @@ :root { - --bb-bg: #f8fafc; - --bb-text: #0f172a; - --bb-muted: rgba(15, 23, 42, 0.70); - --bb-primary: #2563eb; - --bb-primary-weak: rgba(37, 99, 235, 0.12); - --bb-cta: #f97316; - --bb-border: rgba(15, 23, 42, 0.14); - --bb-card: rgba(255, 255, 255, 0.88); - --bb-card-solid: #ffffff; + --bb-bg: #000000; + --bb-text: #e2e8f0; + --bb-muted: rgba(226, 232, 240, 0.82); + --bb-primary: #22c55e; + --bb-primary-weak: rgba(34, 197, 94, 0.25); + --bb-cta: #38bdf8; + --bb-border: rgba(148, 163, 184, 0.28); + --bb-panel: #2E2E2E; + --bb-panel-strong: #2E2E2E; + --bb-panel-hover: #3a3a3a; + --bb-card: #2E2E2E; + --bb-card-solid: #2E2E2E; font-family: ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, "Helvetica Neue", Arial; line-height: 1.5; @@ -27,34 +30,27 @@ html, body { } body { - background: - radial-gradient(900px 520px at 10% 0%, rgba(37, 99, 235, 0.12), rgba(0,0,0,0) 60%), - radial-gradient(900px 520px at 90% 0%, rgba(249, 115, 22, 0.12), rgba(0,0,0,0) 60%), - var(--bb-bg); + background: linear-gradient(180deg, #000000 0%, #050910 55%, #000000 100%); color: var(--bb-text); } -a { color: var(--bb-primary); text-decoration: none; } -a:hover { color: #1d4ed8; } +a { color: var(--bb-cta); text-decoration: none; } +a:hover { color: var(--bb-primary); } button, input, select, textarea { font: inherit; color: inherit; } -select, input, textarea { - background: rgba(255,255,255,0.92); -} +select, input, textarea { background: var(--bb-panel); border: 1px solid var(--bb-border); color: var(--bb-text); } -::placeholder { - color: rgba(15, 23, 42, 0.45); -} +::placeholder { color: rgba(226, 232, 240, 0.55); } a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible { - outline: 2px solid rgba(37, 99, 235, 0.55); + outline: 2px solid rgba(34, 197, 94, 0.55); outline-offset: 2px; } diff --git a/apps/web/package.json b/apps/web/package.json index e54cda6..2c172d6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -1,7 +1,7 @@ { "name": "web", "private": true, - "version": "0.0.0", + "version": "1.0.4", "type": "module", "scripts": { "dev": "vite", diff --git a/apps/web/src/App.vue b/apps/web/src/App.vue index f562cd8..eaae91f 100644 --- a/apps/web/src/App.vue +++ b/apps/web/src/App.vue @@ -10,6 +10,24 @@ const isAdmin = computed(() => userRef.value?.role === "admin"); const menuOpen = ref(false); +// theme: light | dark +const theme = ref( + (typeof localStorage !== "undefined" && localStorage.getItem("bb_theme")) || + (typeof window !== "undefined" && window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches + ? "dark" + : "light") +); + +function applyTheme(next) { + const isDark = (next || theme.value) === "dark"; + const root = document.documentElement; + root.classList.toggle("theme-dark", isDark); +} + +function toggleTheme() { + theme.value = theme.value === "dark" ? "light" : "dark"; +} + function toggleMenu() { menuOpen.value = !menuOpen.value; } @@ -62,6 +80,7 @@ function onDocPointerDown(e) { onMounted(() => { document.addEventListener("pointerdown", onDocPointerDown); + applyTheme(); }); watch( @@ -77,6 +96,15 @@ onMounted(() => { if (loggedIn.value) ensureMe(); }); +watch( + () => theme.value, + (next) => { + try { localStorage.setItem("bb_theme", next); } catch {} + applyTheme(next); + }, + { immediate: false } +); + onBeforeUnmount(() => { document.removeEventListener("pointerdown", onDocPointerDown); }); @@ -107,12 +135,15 @@ router.afterEach(() => { @@ -138,13 +169,13 @@ router.afterEach(() => { diff --git a/apps/web/src/pages/AdminPage.vue b/apps/web/src/pages/AdminPage.vue index 05574a9..fe9cb42 100644 --- a/apps/web/src/pages/AdminPage.vue +++ b/apps/web/src/pages/AdminPage.vue @@ -418,18 +418,19 @@ onMounted(async () => { text-align: left; padding: 10px 12px; border-radius: 16px; - border: 1px solid rgba(255,255,255,0.45); - background: rgba(255,255,255,0.35); + border: 1px solid var(--bb-border); + background: var(--bb-folder-bg); cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 10px; } -.bb-adminFolderHeader:hover { background: rgba(255,255,255,0.6); } +.bb-adminFolderHeader:hover { background: var(--bb-folder-hover); } .bb-adminFolderHeader .name { font-weight: 900; color: var(--bb-text); } -.bb-adminFolderHeader .meta { font-size: 12px; color: rgba(19, 78, 74, 0.72); } +.bb-adminFolderHeader .meta { font-size: 12px; color: var(--bb-muted); } .bb-adminFolderBody { margin-top: 10px; } .bb-adminFolderDel { white-space: nowrap; } .bb-adminActions { display: flex; gap: 8px; flex-wrap: wrap; } + diff --git a/apps/web/src/pages/MyPage.vue b/apps/web/src/pages/MyPage.vue index aaf3c9a..915432c 100644 --- a/apps/web/src/pages/MyPage.vue +++ b/apps/web/src/pages/MyPage.vue @@ -859,17 +859,17 @@ onBeforeUnmount(() => { text-align: left; padding: 8px 10px; border-radius: 16px; - border: 1px solid rgba(255,255,255,0.45); - background: rgba(255,255,255,0.35); + border: 1px solid var(--bb-border); + background: var(--bb-folder-bg); cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 10px; } -.bb-myFolderHeader:hover { background: rgba(255,255,255,0.6); } +.bb-myFolderHeader:hover { background: var(--bb-folder-hover); } .bb-myFolderHeader .name { font-weight: 900; color: var(--bb-text); flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } -.bb-myFolderHeader .meta { font-size: 12px; color: rgba(19, 78, 74, 0.72); } +.bb-myFolderHeader .meta { font-size: 12px; color: var(--bb-muted); } .bb-myFolderBody { margin-top: 10px; } /* Sticky open folder header (keeps the row visible while scrolling long lists) */ @@ -879,9 +879,9 @@ onBeforeUnmount(() => { z-index: 30; padding: 4px; border-radius: 18px; - background: rgba(255,255,255,0.72); + background: var(--bb-folder-bg); backdrop-filter: blur(12px); - border: 1px solid rgba(255,255,255,0.55); + border: 1px solid var(--bb-border); } .bb-folderDelete{ @@ -910,4 +910,14 @@ onBeforeUnmount(() => { .bb-dragHint:active { cursor: grabbing; } .bb-modalForm { display: grid; gap: 10px; } + +:global(.theme-dark) .bb-myFolder.is-open > .bb-myFolderHeaderRow { + background: var(--bb-dark-panel); + border-color: rgba(148,163,184,0.32); +} +:global(.theme-dark) .bb-dragHint { + background: #3a3a3a; + border-color: rgba(148,163,184,0.32); + color: #ffffff; +} diff --git a/apps/web/src/router.js b/apps/web/src/router.js index 34a0b20..5e2766d 100644 --- a/apps/web/src/router.js +++ b/apps/web/src/router.js @@ -22,9 +22,6 @@ export const router = createRouter({ router.beforeEach(async (to) => { const loggedIn = Boolean(tokenRef.value); - // 已登录访问首页时,跳转到个人页 - if (to.path === "/" && loggedIn) return { path: "/my" }; - // 已登录访问登录页:直接去“我的” if (to.path === "/login" && loggedIn) return { path: "/my" }; diff --git a/apps/web/src/style.css b/apps/web/src/style.css index 1245ab7..162125c 100644 --- a/apps/web/src/style.css +++ b/apps/web/src/style.css @@ -4,11 +4,23 @@ /* Educational-platform claymorphism palette (vibrant + friendly) */ --bb-bg: #f0fdfa; --bb-text: #134e4a; + --bb-muted: rgba(19, 78, 74, 0.72); --bb-primary: #0d9488; --bb-primary-weak: #2dd4bf; --bb-cta: #ea580c; --bb-border: rgba(19, 78, 74, 0.12); --bb-border-strong: rgba(19, 78, 74, 0.20); + --bb-panel: rgba(255,255,255,0.55); + --bb-panel-strong: rgba(255,255,255,0.82); + --bb-panel-hover: rgba(255,255,255,0.75); + --bb-menu-bg: rgba(255,255,255,0.72); + --bb-menu-item-bg: rgba(255,255,255,0.35); + --bb-menu-item-hover: rgba(255,255,255,0.6); + --bb-nav-bg: rgba(255,255,255,0.55); + --bb-modal-bg: rgba(255,255,255,0.82); + --bb-modal-border: rgba(255,255,255,0.65); + --bb-folder-bg: rgba(255,255,255,0.35); + --bb-folder-hover: rgba(255,255,255,0.6); --bb-font-heading: "Baloo 2", Inter, ui-sans-serif, system-ui; @@ -105,7 +117,7 @@ input:focus-visible { } .bb-muted { - color: rgba(19, 78, 74, 0.72); + color: var(--bb-muted); font-size: 12px; } @@ -983,3 +995,119 @@ input:focus-visible { .bb-card--interactive:hover { animation: bb-float 2.8s ease-in-out infinite; } + +/* --- Dark theme overrides --- */ +.theme-dark { + --bb-text: #e2e8f0; + --bb-muted: rgba(226,232,240,0.82); + --bb-border: rgba(148, 163, 184, 0.28); + --bb-border-strong: rgba(148, 163, 184, 0.45); + --bb-primary: #22c55e; + --bb-primary-weak: rgba(34, 197, 94, 0.25); + --bb-cta: #38bdf8; + --bb-dark-panel: #2E2E2E; + --bb-panel: #2E2E2E; + --bb-panel-strong: #2E2E2E; + --bb-panel-hover: #3a3a3a; + --bb-menu-bg: #2E2E2E; + --bb-menu-item-bg: #3a3a3a; + --bb-menu-item-hover: #444444; + --bb-nav-bg: #2E2E2E; + --bb-modal-bg: #2E2E2E; + --bb-modal-border: rgba(148,163,184,0.32); + --bb-folder-bg: #2E2E2E; + --bb-folder-hover: #3a3a3a; + --bb-gradient: linear-gradient(180deg, #000000 0%, #050910 55%, #000000 100%); + --bb-clay: linear-gradient(145deg, rgba(46, 46, 46, 0.95), rgba(36, 36, 36, 0.92)); + --bb-shadow-clay: 0 22px 60px rgba(0, 0, 0, 0.55), 0 2px 0 rgba(255,255,255,0.06) inset, 0 -2px 0 rgba(0,0,0,0.35) inset; +} + +.theme-dark body { + background: var(--bb-gradient); + color: var(--bb-text); +} + +.theme-dark a { color: #38bdf8; } +.theme-dark a:hover { color: #22c55e; } + +/* Navigation */ +.theme-dark .nav { background: var(--bb-nav-bg); border-bottom: 1px solid rgba(148,163,184,0.35); } +.theme-dark .link { background: var(--bb-dark-panel); border: 1px solid rgba(148,163,184,0.28); color: var(--bb-text); } +.theme-dark .link.router-link-active { box-shadow: 0 12px 30px rgba(0,0,0,0.55); } +.theme-dark .brandMark { background: var(--bb-dark-panel); border-color: rgba(148,163,184,0.35); } + +/* Menu */ +.theme-dark .menu { background: var(--bb-menu-bg); border: 1px solid rgba(148,163,184,0.28); box-shadow: 0 24px 80px rgba(0,0,0,0.65); } +.theme-dark .menuItem { background: var(--bb-menu-item-bg); border: 1px solid rgba(148,163,184,0.28); color: var(--bb-text); } +.theme-dark .menuItem:hover { background: var(--bb-menu-item-hover); } +.theme-dark .menuItem.danger { color: #fecaca; background: rgba(185, 28, 28, 0.35); border-color: rgba(248, 113, 113, 0.45); } + +/* Inputs / selects */ +.theme-dark .bb-input, +.theme-dark .bb-select, +.theme-dark .bb-fileName, +.theme-dark .bb-selectTrigger { background: var(--bb-dark-panel); border-color: rgba(148,163,184,0.32); color: var(--bb-text); } +.theme-dark .bb-selectMenu { background: var(--bb-dark-panel); border-color: rgba(148,163,184,0.32); box-shadow: 0 22px 60px rgba(0,0,0,0.65); } +.theme-dark .bb-selectOption { color: var(--bb-text); } +.theme-dark .bb-selectOption:hover { background: rgba(34, 197, 94, 0.16); } +.theme-dark .bb-selectPlaceholder { color: rgba(226,232,240,0.72); } + +/* Buttons */ +.theme-dark .bb-btn--secondary { background: #3a3a3a; color: #ffffff; border-color: rgba(148,163,184,0.32); } +.theme-dark .bb-btn--danger { background: #3b0a0a; color: #ffffff; border-color: rgba(248,113,113,0.55); } + +/* Cards / panels */ +.theme-dark .bb-card, +.theme-dark .bb-pill, +.theme-dark .bb-miniStat, +.theme-dark .bb-iconBubble, +.theme-dark .bb-footerInner, +.theme-dark .bb-ctaGhost, +.theme-dark .bb-stat, +.theme-dark .bb-empty { + background: var(--bb-dark-panel); + border-color: rgba(148,163,184,0.32); + color: var(--bb-text); +} + +.theme-dark .bb-alert { background: rgba(56,189,248,0.16); border-color: rgba(56,189,248,0.45); color: #e0f2fe; } +.theme-dark .bb-alert--ok { background: rgba(34,197,94,0.16); border-color: rgba(34,197,94,0.45); color: #d1fae5; } +.theme-dark .bb-alert--error { background: rgba(239,68,68,0.16); border-color: rgba(239,68,68,0.45); color: #fecaca; } + +.theme-dark .bb-muted, +.theme-dark .bb-label, +.theme-dark .bb-footerCol a, +.theme-dark .bb-heroSub { color: rgba(226,232,240,0.82); } + +.theme-dark ::placeholder { color: rgba(226,232,240,0.55); } +.theme-dark .bb-searchClear { background: #3a3a3a; border-color: rgba(148,163,184,0.32); color: rgba(226,232,240,0.82); } +.theme-dark .bb-searchClear:hover { background: #444444; } + +/* Folder headers + drag hints */ +.theme-dark .bb-myFolderHeader { background: var(--bb-folder-bg); border-color: rgba(148,163,184,0.32); color: var(--bb-text); } +.theme-dark .bb-myFolderHeader:hover { background: var(--bb-folder-hover); } +.theme-dark .bb-myFolderHeader .meta { color: var(--bb-muted); } +.theme-dark .bb-myFolder.is-open > .bb-myFolderHeaderRow { + background: var(--bb-dark-panel); + border-color: rgba(148,163,184,0.32); +} +.theme-dark .bb-dragHint { + background: #3a3a3a; + border-color: rgba(148,163,184,0.32); + color: #ffffff; +} + +/* Modal dark */ +.theme-dark .bb-modalBackdrop { background: rgba(0, 0, 0, 0.75); } +.theme-dark .bb-modalPanel { + background: var(--bb-modal-bg); + border-color: var(--bb-modal-border); + box-shadow: 0 18px 60px rgba(0,0,0,0.55); +} +.theme-dark .bb-modalHeader { border-bottom: 1px solid rgba(148,163,184,0.18); } +.theme-dark .bb-modalClose { + background: #3a3a3a; + border-color: rgba(148,163,184,0.32); + color: #ffffff; +} +.theme-dark .bb-modalClose:hover { background: #444444; } diff --git a/package-lock.json b/package-lock.json index 8227caa..48d7d35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ } }, "apps/extension": { - "version": "1.0.3", + "version": "1.0.5", "dependencies": { "@browser-bookmark/shared": "file:../../packages/shared", "vue": "^3.5.24", @@ -52,7 +52,7 @@ } }, "apps/web": { - "version": "0.0.0", + "version": "1.0.4", "dependencies": { "@browser-bookmark/shared": "file:../../packages/shared", "sortablejs": "^1.15.6",