Beekeeper Studio UI Kit 组件定制指南:用 CSS 与主题变量深度打造数据库界面外观
【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studio
@beekeeperstudio/ui-kit是 Beekeeper Studio 开源仓库中独立发布的 Web Components 组件库,提供 Table(数据表格)、Entity List(实体树列表)、Text Editor / SQL Text Editor(基于 LSP 的文本编辑器)与 Data Editor(前者的组合体)等数据库应用核心组件。本文以 apps/ui-kit/docs/customizing.md 为主线,系统讲解如何在不改动组件源码的前提下,通过常规 CSS 选择器与组件暴露的 CSS 变量完成外观定制,并结合仓库内真实样式源码与示例工程,给出可复制、可运行的深色/彩色主题方案。读完本文,你将掌握BksTable、BksSqlTextEditor、BksEntityList、BksDataEditor四大组件的定制入口、全部可用的主题变量清单,以及图标无法通过 CSS 替换这一关键限制的应对思路。
定制总览:为什么用 CSS 而不是改源码
UI Kit 组件以自定义元素(Custom Elements)形式对外暴露,渲染后的 DOM 结构带有稳定、统一命名的类名。官方定制的核心思路是:不提供主题 API,而是直接暴露稳定的 CSS 类与 CSS 变量,让宿主应用用自己的样式表覆盖默认外观。
customizing.md明确指出:CSS 变量目前尚未在所有组件中大规模铺开,因此常规 CSS 选择器依然是定制组件外观的基础手段。两者配合使用的策略是:
- 组件根类(如
.BksTable)已声明了一批语义清晰的 CSS 变量,覆盖这些变量是最优雅的定制方式; - 对于变量尚未覆盖的细节(如 hover 态、内部结构间距),则直接针对渲染出的嵌套 DOM 结构写 CSS 选择器;
- 为隔离作用域,推荐把定制规则挂在宿主应用自己的容器类(如
.custom-theme)之下,避免污染全局。
官方文档给出的基础示例完整如下:
/* General component styling */ .BksTable { background-color: white; --bks-table-header-bg-color: #ffffff; } .BksSqlTextEditor { background-color: #fafafa; } .BksEntityList .entity-item:hover { background-color: rgba(0, 0, 0, 0.05); }这段代码同时展示了两种定制手法:直接修改组件背景色(针对.BksSqlTextEditor),以及通过覆盖--bks-table-header-bg-color变量修改表头颜色(针对.BksTable)。
主题化四步流程
结合 getting-started.md 与定制文档,完整主题化流程如下:
安装组件库:
npm install @beekeeperstudio/ui-kit导入默认样式。UI Kit 将全部组件的 SCSS 编译为一份独立样式文件(入口见 lib/style.scss,它依次引入了 context-menu、data-editor、sql-text-editor、table、entity-list、text-editor、mongo-shell 的样式):
import "@beekeeperstudio/ui-kit/style.css";注意:必须先导入默认样式,再导入你的定制样式,否则定制规则会被默认样式覆盖。
编写定制 CSS:既可以用独立样式表,也可以使用宿主框架(Vue / React)自带的样式系统(如 CSS Modules、styled-components、Tailwind 的
@layer等)。仓库内的 examples/html/custom-theme.css 就是一个完整的主题覆盖范例,examples/react/src/App.tsx 展示了在 React 工程中引入组件的方式。按组件类精准定位:针对
BksTable、BksSqlTextEditor、BksEntityList、BksDataEditor等根类编写规则。所有组件类都以Bks前缀开头,见下文详解。
提示:组件以自定义元素标签出现(如
<bks-table>),而渲染出的根 DOM 节点使用BksTable这样的 PascalCase 类名,两者是不同的命名空间,定制时务必使用后者。
关键组件类与对应样式源码
官方文档列出了四大关键组件类,下面是它们对应的仓库内样式源码路径,方便你按需查阅:
| 组件类 | 组件说明 | 样式源码 | API 文档 |
|---|---|---|---|
.BksTable | 表格组件,基于 Tabulator,带类电子表格的框选、编辑 | apps/ui-kit/lib/components/table/table.scss | table.md |
.BksSqlTextEditor | SQL 文本编辑器,具备语法高亮、补全、查询高亮 | apps/ui-kit/lib/components/sql-text-editor/sql-text-editor.scss | sql-text-editor.md |
.BksEntityList | 数据库实体(表/视图/例程)树形列表 | apps/ui-kit/lib/components/entity-list/entity-list.scss | entity-list.md |
.BksDataEditor | 数据编辑器,整合实体列表、SQL 编辑与表格 | apps/ui-kit/lib/components/data-editor/data-editor.scss | data-editor.md |
以.BksDataEditor为例,其默认布局样式(来自>.BksDataEditor { height: 40rem; } .BksDataEditor .BksEntityList { min-width: 20rem; } .BksDataEditor-right-container { min-width: 26rem; }
.BksSqlTextEditor本身只追加了查询高亮规则(.cm-query-highlight { font-weight: bold; }),其余全部继承自.BksTextEditor(见 text-editor.scss),因此针对.BksSqlTextEditor的定制实际作用于 CodeMirror 6 的渲染结构(.cm-editor、.cm-scroller等)。
利用 CSS 变量做精准主题覆盖
虽然文档强调"常规 CSS 选择器为主",但从源码看,仓库实际上为多个组件声明了完整、可覆盖的 CSS 变量体系,这是当前最推荐、最不易被内部 DOM 变更破坏的定制方式。
BksTextEditor / BksSqlTextEditor 主题变量
在 text-editor.scss 的:root中声明了超过 90 个--bks-text-editor-*变量,覆盖编辑器背景、前景、光标、行号、选区以及几乎全部语法高亮 token。核心变量如下:
| 变量 | 默认值 | 作用 |
|---|---|---|
--bks-text-editor-bg-color | 查询编辑器背景色(默认白) | 编辑器背景 |
--bks-text-editor-fg-color | 深色文字 | 默认文字颜色 |
--bks-text-editor-keyword-fg-color | 品红色 | SQL 关键字 |
--bks-text-editor-string-fg-color | 绿色系 | 字符串字面量 |
--bks-text-editor-number-fg-color | 橙色 | 数字字面量 |
--bks-text-editor-comment-fg-color | 灰褐色 | 注释 |
--bks-text-editor-selected-bg-color | 半透明主题色 | 选中文本背景 |
--bks-text-editor-linenumber-fg-color | 低透明度黑 | 行号颜色 |
--bks-text-editor-cursor-bg-color | 深色 | 光标颜色 |
--bks-text-editor-font-size | 0.875rem(见.cm-editor处var(--bks-text-editor-font-size, 0.875rem)) | 编辑器字号 |
--bks-text-editor-context-menu-bg-color | 深色 | 右键菜单背景 |
仓库的 React 示例 custom-theme.css 演示了一个"高对比怪诞风"覆盖,可直接借鉴结构:
.custom-theme .BksSqlTextEditor { --bks-text-editor-bg-color: #00ff00; --bks-text-editor-fg-color: #ff0000; --bks-text-editor-keyword-fg-color: #ff00ff; --bks-text-editor-string-fg-color: #00ffff; --bks-text-editor-number-fg-color: #ffff00; --bks-text-editor-comment-fg-color: #ff8800; --bks-text-editor-variable-fg-color: #8800ff; --bks-text-editor-property-fg-color: #ff0088; --bks-text-editor-bracket-fg-color: #88ff00; --bks-text-editor-selected-bg-color: rgba(255, 0, 0, 0.5); padding: 10px; font-family: "Comic Sans MS", cursive; border: 3px dashed #ff00ff; }注意变量的声明位置(:root)意味着默认值全局生效;在.custom-theme .BksSqlTextEditor这样更具体的选择器上覆盖,可以实现"仅容器内部生效"的作用域隔离。
BksTable 主题变量
表格组件在 table.scss 的.BksTable根类上声明了约 20 个--bks-table-*变量,并在文件后段通过var(...)将其应用到 Tabulator 的 header、row、cell、tooltip 等结构上:
| 变量 | 作用 |
|---|---|
--bks-table-bg-color | 表格整体背景 |
--bks-table-fg-color | 表格整体文字色 |
--bks-table-header-bg-color | 表头背景 |
--bks-table-header-bg-color-selected | 表头被选中(范围选择)时背景 |
--bks-table-header-bg-color-highlight | 表头高亮背景 |
--bks-table-header-fg-color | 表头文字色 |
--bks-table-header-border-color | 表头下边框色 |
--bks-table-header-col-bg-color | 列头背景 |
--bks-table-row-odd-bg-color | 奇数行背景 |
--bks-table-cell-fg-color | 单元格文字色 |
--bks-table-cell-bg-color-hover | 单元格 hover 背景 |
--bks-table-cell-bg-color-selected | 单元格被选中背景 |
--bks-table-sorter-fg-color-active | 排序列激活箭头色 |
--bks-table-sorter-fg-color-inactive | 排序列未激活箭头色 |
--bks-table-range-border-color | 范围选择边框色 |
--bks-table-tooltip-bg-color/--bks-table-tooltip-fg-color | 单元格 tooltip 背景/文字 |
示例(来自 examples/html/custom-theme.css 的完整覆盖):
.custom-theme .BksTable { --bks-table-bg-color: #ffff00; --bks-table-fg-color: #0000ff; --bks-table-header-bg-color: #ff8800; --bks-table-header-bg-color-selected: #ff00ff; --bks-table-header-bg-color-highlight: #00ffff; --bks-table-header-fg-color: #0000ff; --bks-table-header-fg-color-selected: #ffff00; --bks-table-header-fg-color-highlight: #ff0000; --bks-table-header-border-color: #ff00ff; --bks-table-header-col-bg-color: #ff8800; --bks-table-header-col-border-color: #ff0000; --bks-table-row-odd-bg-color: #ff88ff; --bks-table-cell-fg-color: #0000ff; --bks-table-cell-bg-color-hover: #00ff00; --bks-table-cell-bg-color-selected: #ff00ff; --bks-table-sorter-fg-color-active: #00ffff; --bks-table-sorter-fg-color-inactive: #888800; --bks-table-range-border-color: #ff0088; --bks-table-tooltip-bg-color: #ff00ff; --bks-table-tooltip-fg-color: #00ff00; }表格样式基于 Tabulator,因此你还可以像示例中那样深入 Tabulator 的内部类做细节定制,例如修改主键列前的钥匙图标颜色:
.custom-theme .BksTable .tabulator-header .tabulator-col.primary-key:before { color: #ff0088; }深入组件内部结构定制
CSS 变量覆盖的是"变量已暴露"的部分,其余外观细节需要借助组件渲染出的内部类。以下是各组件在源码中可确认的内部结构与可定制点。
BksEntityList 内部结构
entity-list.scss 中可确认的内部结构类包括:
.filter/.filter-wrap/.filter-input:顶部实体过滤输入框;.list-group:分组列表容器,支持.pinned(置顶分组);.list-item/.list-item-btn:单个实体条目;.selected与.active两种选中态使用不同的背景透明度;.item-icon:实体类型图标(宽度由 Sass 变量$sidebar-icon-w决定,默认1.4rem);.badge:行内数量徽标;.actions:hover 时才显示的条目操作按钮组(源码中visibility: hidden,仅在:hover时显示);.BksEntityList-modal-container:隐藏实体弹窗的遮罩与对话框结构。
官方文档示例中的.BksEntityList .entity-item:hover属于自定义扩展写法(组件内部实际类为.list-item等),但完全合法——只要你的应用给实体条目追加了entity-item类即可命中。更贴合组件本身的 hover 定制是:
.custom-theme .BksEntityList { background-color: #0000ff; color: #ffff00; border: 3px solid #00ff00; } .custom-theme .BksEntityList .item-icon { color: #ff00ff; }BksDataEditor 内部结构
data-editor.scss 定义了以下可定制结构:
.BksDataEditor:整体容器(display: flex,默认高33rem);.BksDataEditor-right-container:右侧纵向布局容器,内部依次为 SQL 编辑器与表格;.BksDataEditor-sql-editor/.BksDataEditor-run:SQL 编辑器区域与"运行"按钮条;.BksDataEditor-gutter:分隔条(outline: 1px solid #eee);.BksDataEditor-initial-placeholder:初始占位内容。
官方示例中定制运行按钮的写法:
.custom-theme .BksDataEditor-run button { background-color: #ff00ff; color: #00ff00; border: 2px dashed #ffff00; }字体与全局令牌
组件的字体族、间距、品牌色等全局令牌定义在 lib/styles/_variables.scss(Sass 变量,编译期生效),包括$font-family、$font-family-mono、$gutter-w(0.8rem)、$gutter-h(0.4rem)、$brand-info、$brand-success、$brand-warning、$brand-danger等。这些是组件默认外观的最终来源;运行时定制仍以 CSS 变量与选择器覆盖为主。
参考示例工程
仓库提供两套可直接运行的定制示例,适合对照学习:
- 纯 HTML 示例apps/ui-kit/examples/html/:在 index.html 中依次引入
style.css与custom-theme.css,并在.custom-theme容器内渲染第二个bks-data-editor,直观对比默认外观与定制外观的差异; - React 示例apps/ui-kit/examples/react/:在 src/App.tsx 与 src/Components.tsx 中分别挂载
BksTable、BksEntityList、BksSqlTextEditor、BksTextEditor、BksDataEditor五个组件,定制样式位于 src/custom-theme.css。
组件外观参考图可在 apps/ui-kit/docs/assets/images/ 查看:table.png(表格组件)、sql-text-editor.png(SQL 编辑器)、entity-list.png(实体列表)、data-editor.png(数据编辑器),定制前先对照这些截图确认目标组件形态。
图标限制与应对方案
customizing.md明确指出当前版本存在一项关键限制:
目前 UI Kit不支持图标自定义。图标内置于组件的 HTML 结构中,无法通过 CSS 或 props 修改。
这一点在源码中得到印证:表格组件的主键/外键/只读列图标来自 Material Icons 字体(如vpn_key、edit_off、bolt,见 table.scss 中.foreign-key:before、.read-only-field:before的content定义),UI Kit 自身还打包了一套bk-icons字体(apps/ui-kit/lib/assets/fonts/beekeeper/),实体列表的图标同样由内部结构注入。这意味着:
- 无法通过向组件传 prop 或写 CSS 替换
content之外的内置图标; - 可以对图标字符应用颜色、字号等文本样式(如本文示例中修改
.item-icon颜色、修改主键图标颜色均可行),但不能替换为其他图标字形; - 如果需要完全自定义图标(如换成 SVG 图标集),从源码结构看,可行路径是将
display: none隐藏原图标并绝对定位覆盖自己的元素,或以组件为基底做二次封装,但这需要根据你的具体场景在宿主层实现。
实践清单与避坑要点
最后,把本文要点归纳为可直接执行的清单:
- 先导入默认样式再导入定制样式,保证覆盖顺序正确;
- 优先覆盖 CSS 变量(
--bks-table-*、--bks-text-editor-*),它们语义清晰且不易被组件内部 DOM 变更破坏; - 变量未覆盖的细节用类选择器,注意组件根类为
BksXxx(PascalCase),自定义元素标签为bks-xxx(kebab-case),两者不要混淆; - 用
.custom-theme之类的宿主容器类做作用域隔离,避免定制规则泄漏到无关页面; - 知晓图标限制:内置图标(Material Icons 与
bk-icons字体)无法通过 CSS 或 props 替换,只能改颜色与字号; - 深入源码排查样式时,直接阅读 apps/ui-kit/lib/components/ 下各组件目录的
.scss文件,它们与组件 Vue/TS 实现一一对应,是最权威的样式事实来源。
【免费下载链接】beekeeper-studioModern and easy to use SQL client for MySQL, Postgres, SQLite, SQL Server, and more. Linux, MacOS, and Windows.项目地址: https://gitcode.com/GitHub_Trending/be/beekeeper-studio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考