diff --git a/assets/style.css b/assets/style.css index 4b009e6..e7e67d5 100644 --- a/assets/style.css +++ b/assets/style.css @@ -2,6 +2,14 @@ :root{ --fg:#1f2329; --muted:#6b7280; --line:#e5e7eb; --line-strong:#d7dbe0; --bg:#f5f6f8; --card:#ffffff; --brand:#0057B8; --brand-600:#004a9e; --brand-soft:#e8f0f9; + /* 主题色的两档浅色,供下拉项 hover / 选中使用。 + * 有软件时由 layout.php 按该软件主题色覆写;这里给默认蓝色的一套, + * 保证后台、首页这类"无当前软件"的页面也有值可用。 + * 为什么不用 CSS color-mix():实测它配 var(--brand) 在 Chrome 里 + * 会解析成透明(oklab(0 0 0 / 0)),规则匹配上却不生效。 */ + --brand-tint-1:#ecf3fa; /* hover:与白混 91% */ + --brand-tint-2:#cfe0f1; /* 选中:与白混 80% */ + --brand-tint-3:#b9d1ea; /* 选中+hover:与白混 72% */ /* 顶栏品牌图标:与官网首页同一枚应用图标(内联,离线预览也能显示) */ --icon-mark:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAADsOAAA7DgHMtqGDAAADj0lEQVR4nO1b205TQRTdGB/UB78B0BdfRNA3NUT/QPHMHIgaP0BeMPqoog8mJqDyCfoBImJnDuCFyEWhIGiUegONimkFodYEaqpj9qEEwZbS0zOXXlaykqZNO2uvM9M9Z8/ZABkhysBy9gLhl4Dwh0B5CAj7CZQLo4iaCJtwNRLWDITVZI4tY+CMAOGvtQfnnSGwnWNuLFmBBnYAZU8NCMAvDoLlVGwseCtwAAgLGyDaZ7IZsJ3D6wdP+CEg7Jd+sdIYBytQm+bKOxVAecQAkfJngsV3rolelBXYms/EgdV/jJRTA0SpJeF1K1c/v1OdRwPYxFL8dtc+7WJ00Q5U4/S/rF2INrKLkNzeiqIkYfcBCHujXYg+hgAoixkgRBNZDHL5gU22IxraxsXdkYiYnlsUid9/hGzgGDhWRzAi6tvGXQ05mQAev1jZ2CtGp6JCN0Ymo64WpQZUNvaKSDQuTEE4GhcVXk0AD9PehCu/FsH3UW/LAbL8Aq55U2HfGJNvQOdoRJiKO8GwfAO+zi0KU/Hl+6J8AxIKUp1XoDbpBqTCp9kFsftsf/aDe2TVuX7xeXYhpRYtBrR0TikLfpmt9z6YY8DQu3mx5XiXsuC3nuh2054xBiBwe9rzYkZ0P5dLHGO9P2JtBpiCkgG0NANEQaTBbSe7xdWOyfxYAi2S0uD2Uz35YcCQpDRoXRvLDwNkpMEnb+c9bbu1GWAKSgbQ0gwQUpdAIsW69JoGNzc4oq71mW+32Epuh6dT7MNzTYNY2fUDeIss3YCOYMTXNIjV3NhCwhcDbg8pKInVpymKekmDj17O+hY8gl5XUBTdZDu+TVk/MayqLA7JgxE8jDAFqKX8tKKDEfhn7aaryqi+8p5PhWgOBiwvBzyMwHo8lqRVHY7iWO3DYXfNazscBQ88cyuUMcCmmyFlekC1Acgr7env8fEz1XpA+YDJ88WP31bq+vga39OhBbQMmtwG72p67BJf69IB2gY2haBbgG4C5T+0i9BFwqNQlI/JrnpclrIHxf6gZLN2Ifp4Hg2oKd4ZwKuSzRI8VHzBs1crDRPYWqZbkGragSNrWmb4oHZRysj6/u8lpKy8aJqmsC8yTc9grdtapl2kNMaBsoMZeged/QXbOIl9kRuC5fYQDhRQ8H3uEs8OArvJ6tztovYAckh1lB2FnGEHqt0GI9w6uoaY2GXCYkvt86iRXwDL2bOR0P4Cy8Hrhv+SooQAAAAASUVORK5CYII="); --ok:#0f9d58; --ok-soft:#e9f7ef; --warn:#b7791f; --warn-soft:#fff8e6; @@ -941,22 +949,38 @@ select:hover{ } .sel-btn:hover{border-color:#c3c9d1} .sel-btn:focus-visible{outline:none; border-color:var(--brand); box-shadow:var(--ctl-shadow-focus)} -.sel-btn.is-open{border-color:var(--brand); box-shadow:var(--ctl-shadow-focus)} +/* 「打开态」样式统一在下方 .sel-btn.is-open 处定义(含主题色底) */ .sel-txt{ flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } /* 未选择任何值时(如「全部状态」)文字用次要色,弱化存在感 */ .sel-btn.is-placeholder .sel-txt{color:var(--muted)} -/* 自绘箭头 */ +/* 自绘箭头:默认灰,**打开或有选中值时用主题色** —— + * 让下拉在视觉上跟当前软件一致(用户要的就是这个)。 */ .sel-caret{ width:11px; height:7px; flex:none; background:currentColor; opacity:.55; -webkit-mask:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='7' viewBox='0 0 11 7'%3E%3Cpath d='M1 1.2 5.5 5.8 10 1.2' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat; mask:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='11' height='7' viewBox='0 0 11 7'%3E%3Cpath d='M1 1.2 5.5 5.8 10 1.2' fill='none' stroke='black' stroke-width='1.7' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat; - transition:transform .16s; + transition:transform .16s, background .12s, opacity .12s; } -.sel-btn.is-open .sel-caret{transform:rotate(180deg); opacity:.85} +/* 打开时箭头转 180° 并变成主题色 —— 明确"这个下拉是激活的", + * 同时和主题色呼应。 */ +.sel-btn.is-open .sel-caret{ + transform:rotate(180deg); + background:var(--brand); + opacity:1; +} +/* 打开时按钮整体也染上主题色: + * 浅主题底 + 主题边框,不用再靠外圈光晕强调。 */ +.sel-btn.is-open{ + border-color:var(--brand); + background:var(--brand-soft); + color:var(--brand-600); + box-shadow:var(--ctl-shadow-focus); +} +.sel-btn.is-open .sel-txt{color:var(--brand-600); font-weight:600} /* 浮层:fixed 定位,不被任何 overflow 容器裁切。 * 用白底 + 细边框 + 柔和阴影,而不是浏览器默认的灰块。 */ @@ -988,16 +1012,27 @@ select:hover{ } .sel-item-txt{flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis} -/* hover / 键盘高亮:中性浅灰,**不要用 --brand-soft**。 - * 🔴 踩过:最初选中项用 var(--brand-soft),但那个变量会被软件主题色覆盖 —— - * 同步日历是砖红色,--brand-soft 就成了 #ffe8e9(粉红), - * 下拉里一片粉,很难看。下拉是**工具性控件**,不该跟着软件换色, - * 统一用中性色才耐看。 */ -.sel-item:hover, .sel-item.is-active{background:#f1f3f6; color:var(--fg)} +/* hover / 键盘高亮:主题色最浅一档。 + * 用户 2026-11-04:「下拉框就用那个软件的主题颜色,挺好看的。」 + * (上一版我误判成中性灰,已改回主题色系。) + * ⚠️ 用 PHP 算好输出的 --brand-tint-1,不用 color-mix(): + * 实测 color-mix(in srgb, var(--brand) 9%, #fff) 在此环境解析成透明。 */ +.sel-item:hover, .sel-item.is-active{ + background:var(--brand-tint-1); + color:var(--brand-600); +} -/* 选中项:浅灰蓝底 + 深色文字 + 右侧对勾(不依赖主题色) */ -.sel-item.on{background:#eef1f5; color:var(--fg); font-weight:600} -.sel-item.on:hover, .sel-item.on.is-active{background:#e6eaf0; color:var(--fg)} +/* 选中项:比 hover 深一档 + 主题色文字 + 右侧对勾, + * 一眼看出当前选的是哪个,也让"我在哪个软件的反馈系统里"更明确。 */ +.sel-item.on{ + background:var(--brand-tint-2); + color:var(--brand-600); + font-weight:600; +} +.sel-item.on:hover, .sel-item.on.is-active{ + background:var(--brand-tint-3); + color:var(--brand-600); +} .sel-item-ck{ width:13px; height:10px; flex:none; background:currentColor; diff --git a/lib/bootstrap.php b/lib/bootstrap.php index f07b501..30b0ea2 100644 --- a/lib/bootstrap.php +++ b/lib/bootstrap.php @@ -8,7 +8,7 @@ if (!defined('FB_ROOT')) { define('FB_ROOT', dirname(__DIR__)); // 静态资源版本号:改 assets/ 下的 css/js 后把这个数字 +1, // 让浏览器与 CDN 缓存失效。全站只此一处,别再往页面里写死数字。 - if (!defined('FB_ASSET_V')) { define('FB_ASSET_V', 49); } + if (!defined('FB_ASSET_V')) { define('FB_ASSET_V', 52); } } /* ------------------------------------------------------------------ diff --git a/lib/layout.php b/lib/layout.php index a94c41e..4f82f00 100644 --- a/lib/layout.php +++ b/lib/layout.php @@ -40,11 +40,24 @@ function fb_layout_head($title, array $opt = []) { - + diff --git a/lib/util.php b/lib/util.php index 774ea28..7d285d8 100644 --- a/lib/util.php +++ b/lib/util.php @@ -253,6 +253,31 @@ function fb_color_variants($hex) { return [$hex, $dark, $soft]; } +/** + * 按「与白色混合的比例」生成主题色的浅色档位。 + * + * 🔴 为什么在 PHP 里算,而不用 CSS 的 color-mix(): + * 实测 Chrome 里 `color-mix(in srgb, var(--brand) 9%, #fff)` 配合 + * 自定义属性会解析成透明(oklab(0 0 0 / 0))—— 规则匹配上了却不生效。 + * 直接在 PHP 把值算好、以 CSS 变量输出最稳,也不依赖浏览器版本。 + * + * @param string $hex 主题色 + * @param float $ratio 与白色混合的比例(0=原色 1=纯白) + * @return string + */ +function fb_color_tint($hex, $ratio) { + $hex = fb_color_norm($hex); + if ($hex === '') { return ''; } + $r = hexdec(substr($hex, 1, 2)); + $g = hexdec(substr($hex, 3, 2)); + $b = hexdec(substr($hex, 5, 2)); + $ratio = max(0.0, min(1.0, (float)$ratio)); + return sprintf('#%02x%02x%02x', + (int)round($r + (255 - $r) * $ratio), + (int)round($g + (255 - $g) * $ratio), + (int)round($b + (255 - $b) * $ratio)); +} + /** * 给某个软件挑一个默认主题色(未配置时用)。 * 按软件的 id 从调色板里取,保证同一站点里不同软件颜色不撞。