Sabaki 用户样式(userstyle)完全指南:用 styles.css 定制棋盘与棋子外观
桌面应用【免费下载链接】SabakiAn elegant Go board and SGF editor for a more civilized age.项目地址https://gitcode.com/gh_mirrors/sa/Sabaki点击查看免费下载本篇基于 Sabaki 仓库内的 Userstyle Tutorial 展开讲解如何在不替换任何程序文件、且升级后不会被覆盖的前提下通过一个名为styles.css的自定义样式文件改变 Sabaki 的棋盘、棋子与整体外观。读完本篇你将能够定位各平台下的styles.css实际路径理解它在渲染进程中的注入位置与 CSS 层叠优先级并利用开发者工具DevTools结合 Shudan 组件的选择器完成纹理定制。什么是 userstyle它为什么比改文件更可靠Sabaki 的界面基于 HTML、CSS 与 JavaScript 构建Electron 应用。官方默认的棋盘与棋子纹理是内置样式的一部分但并非不可更改。原文档给出的核心观点是userstyle 是改变 Sabaki 外观的最简单方式你只需维护一个纯 CSS 文件无需替换任何重要文件important files由于样式文件存放在用户数据目录而非程序安装目录Sabaki 下一次更新更新只替换程序本体不会回滚你的修改。从源码结构看这个“不被覆盖”的承诺有明确的机制支撑styles.css由主进程在首次启动时于用户数据目录中自动创建程序自带的样式见 index.html 中加载的 style/app.css、style/index.css、style/comments.css全部位于打包后的应用内部两者物理隔离。第一步确定 styles.css 的位置原文档列出了三个平台下的配置设置目录平台目录Windows%APPDATA%\SabakiLinux$XDG_CONFIG_HOME/Sabaki未设置该环境变量时为~/.config/SabakimacOS~/Library/Application Support/Sabaki该目录内存在一个名为styles.css的文件其中任何 CSS 声明都会在 Sabaki 启动时被加载。源码印证路径如何被计算上述路径并非文档凭空约定而是主进程启动时确定的。见 src/setting.jsexports.userDataDirectory portableDir ? path.join(portableDir, Sabaki) : app.getPath(userData) // ... exports.stylesPath path.join(exports.userDataDirectory, styles.css)这里有两个值得注意的实现细节默认情况app.getPath(userData)是 Electron API返回的就是文档中列出的三个平台标准目录。便携模式可从源码看出的补充信息当环境变量PORTABLE_EXECUTABLE_DIR存在时即从压缩包直接运行的便携版构建userDataDirectory会变为便携版根目录/Sabakistyles.css也随之落在该目录内。也就是说便携版用户的 userstyle 文件不在上述三个位置而在便携版文件夹里的Sabaki/子目录中。启动时自动创建 styles.csssrc/setting.js 在模块加载阶段就检查并创建该文件if (!fs.existsSync(exports.stylesPath)) { fs.writeFileSync( exports.stylesPath, /* This stylesheet is loaded when ${app.name} starts up. */, ) }因此即使你从未手动创建过它第一次启动 Sabaki 后该文件就已经存在内容是一条自述注释。你可以直接用任意文本编辑器打开它开始写 CSS。渲染进程如何拿到 stylesPathElectron 主进程与渲染进程之间的路径传递链路如下均可在源码中验证主进程通过 IPC 同步接口暴露路径见 src/main.jsipcMain.on(setting:getPathsSync, (e) { try { e.returnValue { themesDirectory: setting.themesDirectory, stylesPath: setting.stylesPath, userDataDirectory: setting.userDataDirectory, themes: setting.getThemes(), } } catch (err) { // 出错时回退为空字符串避免渲染进程崩溃 } })预加载脚本在渲染进程加载之前同步取回并缓存见 src/preload.jslet pathsCache try { pathsCache ipcRenderer.sendSync(setting:getPathsSync) } catch (e) { pathsCache { themesDirectory: , stylesPath: , /* ... */ } }并在 src/preload.js 中挂到window.sabaki.setting上stylesPath、themesDirectory、userDataDirectory三者一并暴露给渲染层。CSS 的注入顺序与优先级这是理解 userstyle 生效方式的关键。渲染入口 index.html 先加载三张内置样式表link relstylesheet typetext/css href./style/app.css / link relstylesheet typetext/css href./style/index.css / link relstylesheet typetext/css href./style/comments.css /之后React此处为 Preact应用启动src/components/App.js 挂载了ThemeManager组件。src/components/ThemeManager.js 的render按以下顺序插入link标签当前主题theme的样式表currentTheme.main || styles.css指向themes 目录/主题名/package.json中声明的主 CSS用户自定义样式href: setting.stylesPath即你编辑的那个styles.css。// Theme stylesheet currentTheme ! null h(link, { rel: stylesheet, type: text/css, href: join(currentTheme.path, currentTheme.main || styles.css), }), // ... // Userstyles h(link, { rel: stylesheet, type: text/css, href: setting.stylesPath, }),由注入顺序可以推断出实际优先级userstyle 始终排在主题样式之后同源、同优先级时后声明者胜出因此你可以用styles.css覆盖已安装主题的任意规则而不必重新打包主题。反过来主题的 CSS 也会覆盖内置的app.css等样式表。主题本身的发现逻辑在 src/setting.js 的loadThemes主进程扫描userData/themes目录见 src/setting.js 中themesDirectory的定义把每个子目录当作一个主题候选并读取其package.json在 src/components/drawers/PreferencesDrawer.js 中偏好设置页选择主题时使用的文件过滤器正是extensions: [asar]即安装主题 把一个.asar包放入themes目录。userstyle 与 theme 的关系可概括为theme 是一个 userstyle 加资源文件的再分发打包格式详见 Create Themes。如何修改棋盘与棋子Shudan 的选择器钩子Sabaki 的棋盘 UI 并非自绘 DOM而是复用了 Shudan 组件库。从源码看棋盘组件直接引入自该库src/components/Goban.jsimport {BoundedGoban} from sabaki/shudanSabaki 自身在 src/components/ThemeManager.js 中给出的自定义图片样式就是典型的 Shudan 选择器用法你可以把这些类名与 CSS 变量当作 userstyle 的主要攻击面/* 替换黑子/白子图片sign_1 黑子、sign_-1 白子 */ .shudan-stone-image.shudan-sign_1 { background-image: url(...); } .shudan-stone-image.shudan-sign_-1 { background-image: url(...); } /* 棋盘图片 */ .shudan-goban-image { background-image: url(...); } /* 相关 CSS 变量Sabaki 在启用自定义图片时会自动写入 */ .shudan-goban { --shudan-board-background-color: ...; --shudan-black-background-color: ...; --shudan-white-foreground-color: ...; }原文档建议若要系统地了解如何更换 board/stone 图片应阅读 Shudan 项目的 styling 文档Shudan 是该组件的维护者仓库可查阅其 Styling 章节。此外Sabaki 自身的通用样式如字体、#busy遮罩、#main布局等可以在 style/app.css 中查阅选择器与默认值为你的 userstyle 提供参考——注意它是打包进应用的你只应阅读它而不是修改它。用开发者工具检查 DOM原文档提示排查选择器时打开开发者工具查看 DOM 会有帮助。具体步骤参照仓库内的 Debugging 指南必要时先关闭 Sabaki打开上节所述的设置目录中的settings.json找到键debug.dev_tools其默认值为false可在 src/setting.js 的默认设置表中确认将其改为true并保存重新启动 Sabaki主菜单会多出 Developer 项点击 Toggle Developer Tools。在 Elements 面板中定位.shudan-goban、.shudan-stone-image等节点在 Console/Styles 面板验证你的styles.css规则是否命中、是否被更高优先级的规则压制例如是否需要!important或更具体的选择器。实战示例一段可复用的 userstyle 骨架将以下内容写入styles.css路径见前文并重启 Sabaki可看到自定义生效。图片文件建议放在用户数据目录下的子目录中CSS 中引用相对路径即可渲染页从file://加载绝对路径亦可/* 1. 更换棋盘纹理图片与 sabaki 用户目录同级或任意可达位置 */ .shudan-goban-image { background-image: url(my-theme/board.png); } /* 2. 更换黑白棋子纹理 */ .shudan-stone-image.shudan-sign_1 { background-image: url(my-theme/black.png); } .shudan-stone-image.shudan-sign_-1 { background-image: url(my-theme/white.png); } /* 3. 通过 Shudan 的 CSS 变量微调棋盘背景/前景色 */ .shudan-goban { --shudan-board-background-color: #e8c882; }注意事项需要重启生效styles.css是以link静态注入的见 ThemeManager 实现Sabaki 启动时加载该文件编辑后请重启应用验证不要修改settings.json以外的程序内部文件userstyle 的全部意义就在于只维护这一个 CSS 文件版本兼容性Sabaki 在不同大版本中调整过 DOM 结构旧版主题/userstyle 的选择器可能失效——同仓库的 theme-directory.md 就明确指出v0.40.0 对 DOM 结构做过变更v0.30.x 时代的主题在 v0.40.0 及以后可能不再适用。升级 Sabaki 后若 userstyle 失效优先用 DevTools 重新核对类名。进阶从 userstyle 到可分发的 theme当你的 userstyle 稳定后可以按 Create Themes 的流程把它和素材打包成.asar主题目录内放styles.css与图片资源另加一个仅含name、version、main等字段的package.json用asar pack打包即可在 Sabaki 偏好设置中安装并分发给他人。此时它会被 src/setting.js 的loadThemes扫描到并由 src/components/ThemeManager.js 以main字段指定的样式表加载。小结styles.css位于各平台的 Sabaki 用户数据目录Windows%APPDATA%\Sabaki、Linux~/.config/Sabaki、macOS~/Library/Application Support/Sabaki便携版则位于便携目录下的Sabaki/子目录由主进程在首次启动时自动创建src/setting.js它经 IPC 路径缓存传入渲染进程src/main.js、src/preload.js由 src/components/ThemeManager.js 以link形式注入且位于主题样式之后因而拥有最高的覆盖优先级定制棋盘/棋子的核心是 Shudan 组件的选择器.shudan-goban-image、.shudan-stone-image.shudan-sign_±1及一组--shudan-*CSS 变量必要时按 Debugging 打开开发者工具核对 DOM想分享给他人时按 create-themes.md 用asar将 userstyle 打包为正式 theme 即可。赞分享桌面应用【免费下载链接】SabakiAn elegant Go board and SGF editor for a more civilized age.项目地址https://gitcode.com/gh_mirrors/sa/Sabaki点击查看免费下载相关推荐Sabaki围棋软件专业级棋盘与棋谱编辑完整指南Sabaki围棋软件专业级棋盘与棋谱编辑完整指南 在围棋爱好者的数字工具库中Sabaki凭借其优雅的界面设计和强大的SGF编辑功能脱颖而出。这款跨平台围棋软桌面应用Rust类型系统强化Frunk库的高级特性与最佳实践Rust类型系统强化Frunk库的高级特性与最佳实践 Frunk是Rust生态中专注于类型级编程的强大库提供了HList、Coproduct、Generic如何快速掌握Sabaki围棋对弈与棋谱编辑的完整使用指南如何快速掌握Sabaki围棋对弈与棋谱编辑的完整使用指南 在当今数字化围棋时代拥有一款功能全面且界面优雅的围棋软件至关重要。Sabaki作为一款跨平台的围棋桌面应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

开源软件Tracker:从下载到跑通,一个被低估的桌面检索利器

开源软件Tracker:从下载到跑通,一个被低估的桌面检索利器

简介:这份资源是开源文件跟踪软件Tracker的完整下载包,面向开发者、数据分析师及需要监控文件活动与数据流的运维人员。Tracker支持Windows、Linux与Mac OS多平台,提供文件系统监控、网络流量分析、进程追踪等实用功能,并附带无需…

2026/10/14 23:05:12 阅读更多 →
基于Flask与MediaPipe的AI科普互动平台开发实战——从可视化到人脸识别

基于Flask与MediaPipe的AI科普互动平台开发实战——从可视化到人脸识别

这阵子有朋友跟我聊起,他们那边的科普基地想上一套人工智能主题的互动展项,需求是“要能看、能聊、还能玩”,具体拆下来就是:用大屏展示AI知识体系,旁边配一个智能问答客服,最好再放一个能现场识别人脸的体…

2026/10/14 23:05:12 阅读更多 →
基于.NET的C#网络数据包嗅探分析器实战:从抓包到性能优化

基于.NET的C#网络数据包嗅探分析器实战:从抓包到性能优化

简介:这是一份基于.NET框架、使用C#编写的网络数据包嗅探分析器源码,面向对网络协议与底层通信感兴趣的C#初学者及进阶开发者,可用于网络诊断、安全审计与性能测试等场景的学习实践。项目围绕数据包捕获与解析展开,核心模块涵盖TC…

2026/10/14 23:05:12 阅读更多 →

最新新闻

守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

有一年年初,我给自己的投资研究体系编了个内部代号,就叫“投资-408”。编号本身没什么特殊含义,纯粹是项目管理习惯,但一整年跑下来,这个代号越来越像一句提醒:真正让账户曲线变得平滑的,往往不…

2026/10/14 23:50:17 阅读更多 →
JNPF低代码平台实战:从功能手册到生产环境配置的完整避坑指南

JNPF低代码平台实战:从功能手册到生产环境配置的完整避坑指南

简介:JNPF软件开发平台V3.4.2操作手册由福建引迈信息技术有限公司发布,面向使用该低代码平台的开发者与实施人员,帮助其系统掌握产品各项功能。手册围绕在线开发、门户设计、大屏设计、代码生成与系统管理五大模块展开,其中在线开…

2026/10/14 23:50:17 阅读更多 →
挑战一周速通Spring+SpringBoot+SpringCloud!

挑战一周速通Spring+SpringBoot+SpringCloud!

Spring框架自从诞生以来就一直备受开发者青睐,它涵盖了Spring、Springboot、SpringCloud等诸多解决方案,一般我们都会统称为Spring全家桶!出于Spring框架在Java开发者心中中的统治地位,所以不管是面试还是工作,Spring都…

2026/10/14 23:50:17 阅读更多 →
从10秒到0.9秒:前端首屏加载性能优化实战全记录

从10秒到0.9秒:前端首屏加载性能优化实战全记录

前端性能优化这件事,我做了不少年头。最近接手这个后台项目时,首屏加载要10秒。10秒的概念,放在2026年的网络环境下,基本就是劝退用户。用户不会等一个页面转10秒才看到内容,大部分人3秒内没反应就会直接关掉页面。这个…

2026/10/14 23:50:17 阅读更多 →
Unity旋转与朝向控制:从欧拉角到四元数的实战指南

Unity旋转与朝向控制:从欧拉角到四元数的实战指南

1. 从一次“翻车”说起:为什么旋转和朝向值得单独拎出来讲刚接触Unity那会儿,我做过一个特别简单的需求:让场景里的一架小飞机沿着一条预设的路径飞,机头始终朝着前进方向。当时我的想法很朴素——算一下下一个路径点和当前位置的…

2026/10/14 23:50:17 阅读更多 →
AI提效后的人往哪放?转向获客侧完整落地指南

AI提效后的人往哪放?转向获客侧完整落地指南

我去年一直在折腾一个特别实际的问题:AI 把团队的重复劳动吃掉之后,省下来的这批人到底应该往哪放?一开始我也跟大多数人想的一样,觉得放着就行,反正效率高了嘛。后来发现完全不是这么回事,人一旦没有明确的…

2026/10/14 23:49:10 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →