ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Beekeeper Studio 图标字体子集化实践:Material Symbols 可变字体与 dock 图标按需加载

Beekeeper Studio 图标字体子集化实践:Material Symbols 可变字体与 dock 图标按需加载 Beekeeper Studio 图标字体子集化实践Material Symbols 可变字体与 dock 图标按需加载【免费下载链接】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-studioMaterial Symbols 是 Beekeeper Studio 界面图标的核心来源而 apps/studio/src/assets/fonts/material-symbols/NOTE.md 正是这份字体的子集配置说明它仅以 400 字重、fill 0..1 的可变字体设置嵌入dock_to_left与dock_to_right两个字形。本文以这份说明为骨架结合仓库中font-face定义、标题栏组件、Vuex 侧边栏状态模块与 Playwright E2E 测试完整解析这套图标字体的引入方式、可变字体轴FILL的运作用法以及它如何驱动应用主/次侧边栏的切换交互。一、NOTE.md 说了什么一份克制而明确的字体子集说明NOTE.md全文只有三行却精准刻画了这份字体的全部技术边界The material-symbols font uses settings of 400 weight, fill 0..1, and contains the following:dock_to_leftdock_to_right逐条拆解其中的信息声明技术含义400 weight字体仅使用常规字重Regular的轮廓数据不包含 100/200/300/500/600/700 等其他字重fill 0..1该字体是可变字体Variable Font保留了FILL轴取值区间为 0 到 1用于在空心0与实心1轮廓之间连续过渡dock_to_left / dock_to_right字体文件经过子集化subsetting只嵌入了这两个字形glyph未包含 Material Symbols 全套数千个图标这一设计直接决定了本仓库中字体的体积与用途它不是通用图标库而是为侧边栏停靠方向这一具体交互定制的微型图标资源。与仓库中另一套完整图标字体 apps/studio/src/assets/fonts/beekeeper/bk-icons.svg含 ttf/woff 全量字体形成分工——后者承担通用图标前者专责可变填充状态图标。配套文件 apps/studio/src/assets/fonts/material-symbols/LICENSE 表明该字体以 Apache License 2.0 分发随仓库保留了完整的许可文本符合字体再分发时须附带许可的合规要求。二、font-face 声明如何把这个子集字体接入应用字体的实际接入点在样式文件 apps/studio/src/assets/styles/app/vendor/material-symbols.scssfont-face { font-family: Material Symbols Outlined; font-style: normal; font-weight: 400; src: url(/assets/fonts/material-symbols/material-symbols-outlined.woff2) format(woff2); } .material-symbols-outlined { font-family: Material Symbols Outlined; font-weight: normal; font-style: normal; font-size: 24px; line-height: 1; letter-spacing: normal; text-transform: none; display: inline-block; white-space: nowrap; word-wrap: normal; direction: ltr; -webkit-font-feature-settings: liga; -webkit-font-smoothing: antialiased; }几个值得注意的实现细节单一 woff2 源只声明了 woff2 一种格式指向 apps/studio/src/assets/fonts/material-symbols/material-symbols-outlined.woff2说明该文件已经过 Web 字体压缩浏览器覆盖率足够无需再提供 ttf/otf 回退。font-weight: 400与 NOTE.md 一一对应font-face中明确声明该字体仅供 400 字重使用与 NOTE.md 的 settings of 400 weight 严格一致配合 CSS 规则里的font-weight: normal即 400确保渲染时不会发生字重合成的伪粗体。liga特性-webkit-font-feature-settings: liga开启连字ligatures特性这是图标字体以文本方式渲染的关键——图标通过字形名称直接书写成文字内容。别名解析/assets/...由 Vite 配置解析到apps/studio/src/构建时该 woff2 会被作为资源一并打包。该文件通过 apps/studio/src/assets/styles/vendor.scss 第 12 行的import ./app/vendor/material-symbols.scss;与 xel、tabulator、codemirror 等第三方样式一同引入属于应用级全局样式的一部分。三、FILL 轴在实践中的用法用 0 与 1 表达开关状态NOTE.md 中 fill 0..1 的真正价值体现在 apps/studio/src/components/Titlebar.vue 对可变字体轴的动态控制上。标题栏右侧的额外操作区titlebar-actions-extra放置了两个侧边栏切换按钮button classbtn btn-link dblclick.prevent.stop click.preventtogglePrimarySidebar titleToggle Primary Sidebar v-ifconnected i classmaterial-symbols-outlined :style{ font-variation-settings: primarySidebarOpen ? FILL 1 : FILL 0 } dock_to_right/i /button button classbtn btn-link dblclick.prevent.stop click.preventtoggleSecondarySidebar titleToggle Secondary Sidebar v-ifconnected i classmaterial-symbols-outlined :style{ font-variation-settings: secondarySidebarOpen ? FILL 1 : FILL 0 } dock_to_left/i /button这里有三层设计值得展开字形名即图标i标签的文本内容就是字形名dock_to_right/dock_to_left配合liga连字特性渲染为图标这正是 NOTE.md 列出两个字形名的直接原因。FILL 轴驱动视觉状态通过内联样式动态写入font-variation-settings: FILL 1侧边栏展开实心图标或FILL 0侧边栏收起空心图标一个字形承载两种视觉状态无需准备两套图标文件——这正是fill 0..1被保留下来的工程收益。图标方向与侧边栏位置对应左侧主侧边栏Primary Sidebar使用dock_to_right图标右侧次侧边栏Secondary Sidebar使用dock_to_left图标方向语义与侧边栏所在屏幕边缘相反直观表达停靠到对侧的隐喻。按钮的点击行为分别触发togglePrimarySidebar()与toggleSecondarySidebar()最终通过trigger(AppEvent.togglePrimarySidebar)/trigger(AppEvent.toggleSecondarySidebar)派发全局事件由侧边栏模块响应见 apps/studio/src/common/AppEvent.ts。两个按钮仅在connected已建立数据库连接时渲染。四、状态从哪来Vuex 侧边栏模块与本地持久化图标填充状态FILL 1/0绑定的是 Vuex 中的primarySidebarOpen与secondarySidebarOpen两个布尔状态定义于 apps/studio/src/store/modules/SidebarModule.ts。该模块的核心设计const PRIMARY_SIDEBAR_OPEN_KEY primarySidebarOpen-v2 const SECONDARY_SIDEBAR_OPEN_KEY secondarySidebarOpen-v2 // state 初始化 primarySidebarOpen: SmartLocalStorage.getBool(PRIMARY_SIDEBAR_OPEN_KEY, true), secondarySidebarOpen: SmartLocalStorage.getBool(SECONDARY_SIDEBAR_OPEN_KEY, false),默认值主侧边栏默认打开true次侧边栏默认收起false持久化开合状态通过SmartLocalStorage落盘setBoolkey 带-v2版本后缀便于未来迁移应用重启后图标填充状态与侧边栏布局保持一致宽度记忆模块还同时持久化了primarySidebarWidth-v3/secondarySidebarWidth-v3初始宽度均为 240px即位置 宽度整体布局记忆命名空间模块注册为 namespacedTitlebar.vue 通过...mapState(sidebar, [secondarySidebarOpen, primarySidebarOpen])直接读取。从源码结构可以推断这种按钮触发事件 → 侧边栏模块响应并持久化 → 图标 FILL 轴回显的闭环让可变字体的 fill 轴与业务状态形成了一一映射是典型的设计令牌驱动 UI 状态实践。五、E2E 测试如何验证这套图标交互图标字体以文本渲染的特性使其天然可被可访问性工具与测试框架定位。仓库的 Playwright 测试封装 apps/studio/e2e/pageComponents/SideBarToggle.ts 直接以字形名作为可访问名称this.rightSideBarButton this.page.getByRole(button, { name: dock_to_right }); this.leftSideBarButton this.page.getByRole(button, { name: dock_to_left });由于i内的文本dock_to_right/dock_to_left会作为按钮的 accessible name 暴露给辅助技术getByRole(button, { name: ... })可以稳定命中这两个按钮——测试不依赖 CSS 类名或 DOM 层级而是依赖字形名这一稳定契约。这一事实反过来印证了 NOTE.md 记录两个字形名的另一个作用它是 E2E 测试可读的图标语义清单。配套测试可参考 apps/studio/e2e/tests/queryResultPane.test.ts 等用例它们通过userActions完成新建连接、执行查询后即可对侧边栏按钮进行操作验证详见 apps/studio/e2e/pageActions 目录下的封装。六、从这份 NOTE.md 可复用的实践要点回顾整个链路这份三行 NOTE.md 背后是一套完整的图标工程方法论可直接迁移到其他 Electron/Vue 项目按需子集化只嵌入业务用到的字形本仓库仅 2 个将数千字形缩减到 KB 级避免全量字体文件的加载开销保留可变轴当图标需要表达离散状态开/关、激活/未激活时保留 FILL 这类可变轴而非准备多套静态图标一个字形即一种状态的两种形态文档即契约用简短说明记录字体设置字重、轴范围、字形清单同时让字形名成为可访问名称供样式、业务组件与 E2E 测试三方对齐状态持久化闭环图标状态与业务状态侧边栏开合绑定并通过本地存储记忆用户偏好避免每次启动重置布局。如需扩展这套字体体系可在 apps/studio/src/assets/fonts/material-symbols/ 目录下追加字形并同步更新 NOTE.md 清单样式入口固定在 apps/studio/src/assets/styles/vendor.scss新增字形无需改动组件代码即可复用.material-symbols-outlined类的全部排版规范。【免费下载链接】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),仅供参考
返回列表