diff --git a/lib/admin_taxonomy.php b/lib/admin_taxonomy.php
index 9fa9a5c..f745a1d 100644
--- a/lib/admin_taxonomy.php
+++ b/lib/admin_taxonomy.php
@@ -538,7 +538,11 @@ function fb_admin_taxonomy_page($pdo, $editSw, $editCat) {
// 主题色:前台按软件换色,用短链接进不同软件一眼就能区分
$curColor = $esw ? fb_color_norm((string)$esw['color']) : '';
$sugColor = $curColor !== '' ? $curColor : fb_color_default_for($esw ? (int)$esw['id'] : 0);
- $presets = ['#0057B8', '#2E7D5B', '#B4553C', '#6A4C93', '#0E7C86', '#A02C5A', '#8A6D1F', '#3A5A8C'];
+ /* 🔴 必须用 fb_color_palette(),不要再在这里写死一份数组。
+ * 以前这里硬编码了另外 8 个色值,和 util.php 的调色板完全不同步 ——
+ * 结果后台只能选那 8 个,用户在后台挑不到新颜色,
+ * 而他从没配置过的软件却会被分到「调色板里另一批」颜色。 */
+ $presets = fb_color_palette();
echo '
主题色前台进这个软件时整体配色跟着变,用来区分不同软件';
echo '
';
echo ' ';
diff --git a/lib/util.php b/lib/util.php
index bb47338..774ea28 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -255,10 +255,42 @@ function fb_color_variants($hex) {
/**
* 给某个软件挑一个默认主题色(未配置时用)。
- * 按软件的排序位次从调色板里取,保证同一站点里不同软件颜色不撞。
+ * 按软件的 id 从调色板里取,保证同一站点里不同软件颜色不撞。
+ *
+ * 🔴 2026-11-04 按色相环**整体重排**为 12 色(用户:颜色快不够分了)。
+ *
+ * 选色规则,改之前先读:
+ * ① **色相均匀分布**:360° 切成 12 段,相邻至少差 22°(实测最小 22°)。
+ * 旧调色板有 3 个蓝挤在 185°/212°/217°,并排看几乎同色 —— 这是重排的原因;
+ * ② **对比度落在 4.76~6.19 的窄带**:白底上文字都够看清(WCAG AA 要 ≥4.5),
+ * 又不会某个颜色特别深、显得比其他刺眼;
+ * ③ **避开纯红/纯绿**:会与「待处理/已解决」状态色打架,所以红取 2°、绿取 122°;
+ * ④ 黄/黄绿饱和度压到 50%(再高就荧光),蓝/靛蓝也压到 62%/50%。
+ *
+ * ⚠️ 这个数组和 lib/admin_taxonomy.php 里的 $presets **必须保持一致**。
+ * 以前是两份独立硬编码,早就不同步了 —— 后台只给 8 个可选色,
+ * 实际调色板却是另一批,用户在后台根本选不到新增颜色。
+ * 改这里记得同步改那边(见 fb_color_palette() 统一出口)。
*/
+function fb_color_palette() {
+ return [
+ '#B53530', // 1 红 2°
+ '#9D6525', // 2 橙 32°
+ '#747728', // 3 黄 62°
+ '#517E2A', // 4 黄绿 92°
+ '#2B822E', // 5 绿 122°
+ '#2D8059', // 6 青绿 152°
+ '#267E7B', // 7 青 178°
+ '#2678A1', // 8 天蓝 200°
+ '#4154D2', // 9 蓝 232°
+ '#7A44C1', // 10 靛蓝 266°
+ '#943BA0', // 11 紫 293°
+ '#AD3470', // 12 玫红 330°
+ ];
+}
+
function fb_color_default_for($softwareId) {
- $palette = ['#0057B8', '#2E7D5B', '#B4553C', '#6A4C93', '#0E7C86', '#A02C5A', '#8A6D1F', '#3A5A8C'];
+ $palette = fb_color_palette();
$id = max(0, (int)$softwareId);
return $palette[$id % count($palette)];
}