深入 `@scalar/themes`:掌握 Scalar 全系产品的 CSS 变量主题体系与 Tailwind 预设
深入scalar/themes掌握 Scalar 全系产品的 CSS 变量主题体系与 Tailwind 预设【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalarscalar/themes是 Scalar 开源 API 平台中的主题库它为 API Client、API References、Docs 等全部 Scalar 产品与组件提供统一的外观基础同时内置一套完整的 Scalar CSS 变量以及基于这些变量的 Tailwind 预设。本文将以 packages/themes/README.md 为主线结合该包源码packages/themes/src/与发布配置package.json系统讲解其双层 CSS Layer 架构、作用域隔离策略、三种接入方式CSS 导入、JavaScript 动态注入、Tailwind 配置以及从预设主题到自定义主题的完整落地路径帮助你在一小时之内为自己的 Scalar 应用或嵌入场景定制一套专属视觉方案。一、包概览Scalar 设计令牌的单一事实来源scalar/themes在 Scalar 生态中的定位非常清晰所有产品的 CSS 变量、默认主题与预设主题都收敛在这个包里任何依赖它的组件库只需引用这些变量就能保持跨产品一致的观感。从源码结构看该包的核心资产可分为四类类别文件位置作用基础样式packages/themes/src/base/reset.css、scrollbars.css、variables.css全局重置、自定义滚动条、核心 CSS 变量字体packages/themes/src/fonts/inter.css、mono.css默认字体 Inter 与 JetBrains Mono 的引入主题预设packages/themes/src/presets/14 个.css文件一套开箱即用的主题如 default、alternate、moon、purple 等Tailwind 预设packages/themes/src/tailwind/将 Scalar 变量映射为 Tailwind 的theme与工具类发布层面package.json 显示该包版本为0.17.4要求node 22采用 ESMtype: module并对外暴露了三个子路径入口scalar/themes/style.css、scalar/themes/tailwind.css与scalar/themes/fonts.css同时把主入口./dist/index.js留给 JavaScript API。也就是说无论你习惯纯 CSS 导入还是程序化注入样式这个包都提供了对等的入口。二、CSS Layers为什么主题能可覆盖又不互相污染scalar/themes的主题体系建立在两个 CSS 级联层之上这是理解整个包一切行为的前提scalar-base核心 Scalar CSS 变量和默认主题的副本相当于出厂设置scalar-theme可选的、用于覆盖scalar-base的主题样式相当于用户皮肤。层声明位于 src/style.csslayer scalar-base, scalar-theme; import ./base/reset.css; import ./base/scrollbars.css; import ./base/variables.css layer(scalar-base); import ./presets/default.css layer(scalar-base);可以看到reset.css与scrollbars.css不带layer()指定而variables.css与default.css被显式归入scalar-base层。而通过 JavaScript 方式注入主题时getThemeStyles会把主题样式整体包裹进layer scalar-theme见下文第四节从而实现基础变量 可选皮肤的分层结构。层机制带来的关键能力是任意性覆盖凡是写在层之外的样式优先级天然高于层内所有样式。因此当你想在某个页面上做局部微调时只需在层外例如自己的全局样式表中写普通 CSS 即可覆盖任何主题完全不需要!important或者更高特异度的选择器。三、Scopingscalar-app作用域类Scalar 的诸多应用API 参考文档、API Client 等经常被嵌入到第三方网站内部因此scalar/themes的重置样式只作用于带scalar-app类的根元素避免污染宿主页面。从 base/reset.css 可以看到重置逻辑全部收敛在:where(.scalar-app)之下且刻意使用:where()把选择器特异度压到 0方便外部样式轻松覆盖:where(.scalar-app) { font-family: var(--scalar-font); line-height: 1.15; color: var(--scalar-color-1); *, *:before, *:after { box-sizing: border-box; border-width: 0; border-style: solid; border-color: var(--scalar-border-color); /* ... 继承字体、颜色、边距、内边距等 */ } }这个重置本质上是 Tailwind Preflight 的定制版本覆盖了 body 边距、列表样式、表单控件边框与聚焦轮廓、img/svg/video的块级化、[hidden]行为等常见浏览器默认差异还顺带处理了 Safari 的summary标记、输入框自动填充的黄蓝底色、placeholder 颜色以及 RTL 书写方向下的text-align: start等细节。因此在使用主题前必须先将scalar-app类挂到应用根元素上。对于独立应用最简单的做法是加到bodybody classscalar-app !-- Your application content -- /body对于嵌入场景则把该类加到承载 Scalar 组件的最外层容器上。同理base/scrollbars.css 中的滚动条美化也只作用于.scalar-app下的.cm-scroller与.custom-scroll等类默认隐藏滚动条、悬停或激活时显示且支持通过.scalar-scrollbars-obtrusive强制常显——这些行为都可以通过--scalar-scrollbar-color与--scalar-scrollbar-color-active两个变量在浅色/深色模式下分别控制。四、三种接入方式4.1 安装pnpm i scalar/themes包采用 MIT 协议发布源码位于仓库 packages/themes 目录。4.2 方式一CSS 导入基础用法最简单的方式是直接导入style.css它会一次性引入重置样式、滚动条样式、一份基础 Scalar CSS 变量base/variables.css以及默认主题presets/default.cssimport scalar/themes/styles.css注意README 与历史版本中的写法是styles.css而当前 package.json 的 exports 中实际暴露的入口为./style.css请以scalar/themes/style.css为准。在此基础上只需再导入某个预设主题即可整体切换视觉风格import scalar/themes/presets/alternate.css4.3 方式二JavaScript 动态注入需要以编程方式例如根据用户设置动态切换主题生成样式时可以使用getThemeStyles函数。它返回一段 CSS 字符串你可以自行注入到文档头部import { getThemeStyles } from scalar/themes const styles getThemeStyles(alternate, { layer: scalar-theme }) document.head.insertAdjacentHTML(beforeend, style${styles}/style)从 src/index.ts 的实现可以看到该函数支持以下选项选项类型默认值说明themeIdThemeIddefault要应用的主题 ID缺省或传none时回退到默认主题opts.variablesbooleantrue是否包含基础变量含排版等在实现中对应字体控制opts.fontsbooleantrue是否包含默认字体Inter / JetBrains Mono的声明opts.layerstring \| falsescalar-theme主题样式挂载到的级联层传false则不包裹任何层实现逻辑src/index.ts非常直白把所选预设的主题 CSS 与可选默认字体 CSS 拼接成一段字符串若指定了layer则用layer ${layer} { ... }包裹后返回。也就是说通过layer: scalar-theme注入的样式正好落在第二节介绍的分层体系里天然具备低于层外自定义样式的优先级。4.4 方式三Tailwind 集成如果你使用 Tailwind CSSscalar/themes提供了一个完整的 Tailwind 预设把 Scalar 的 CSS 变量全部映射为 Tailwind 的主题令牌。接入分两步第一步先通过 CSS 或 JavaScript 导入基础样式见上文两种方式。第二步在 CSS 入口中引入 Tailwind 相关文件。Scalar 的 Tailwind 配置已经内置了 preflight 与一套基础的 Tailwind 主题tailwindcss/theme.css因此你只需要从 Tailwind 导入工具类即可import scalar/themes/style.css; /* 主题基础样式与重置 */ import scalar/themes/tailwind.css; /* Tailwind 主题 配置 */ import tailwindcss/utilities.css; /* 生成 Tailwind 工具类 */src/tailwind.css 内部按顺序导入了tailwindcss/theme.css归入scalar-base层、Scalar 自定义主题 tailwind/theme.css、变体、工具类以及 v3 重置样式。其中 tailwind/theme.css 是一个庞大的theme inline块把 Scalar 变量系统化地桥接给 Tailwind 工具类圆角rounded、rounded-md、rounded-lg、rounded-xl、rounded-2xl、rounded-3xl、rounded-full分别映射到--scalar-radius-*系列阴影shadow、shadow-md、shadow-lg映射到--scalar-shadow-1/2并额外提供shadow-border基于--scalar-border-width的 inset 描边字体font-sans/font-code映射到--scalar-font/--scalar-font-code字号与行高text-xs到text-xl映射到--scalar-font-size-*行高通过calc()由字号推导字重font-normal/font-medium/font-bold映射到--scalar-regular/--scalar-semibold/--scalar-bold并额外提供侧边栏专用的font-weight-sidebar系列颜色背景色bg-b-1、bg-b-2、bg-b-3、bg-b-accent、bg-b-btn、bg-b-tooltip、bg-b-danger、bg-b-alert对应--scalar-background-*前景色text-c-1/2/3、text-c-accent、text-c-ghost、text-c-disabled、text-c-btn对应--scalar-color-*侧边栏颜色sidebar-b-*、sidebar-c-*对应--scalar-sidebar-*系列语义色green/red/yellow/blue/orange/purple直接映射到--scalar-color-*间距、断点、容器与 z-index--spacing: 4px作为基础间距单位断点从xs: 400px到xl: 1200px容器宽度与工具类 z-index 也有完整定义。这套映射意味着在 Tailwind 项目中你可以写出bg-b-1 text-c-1 rounded这类工具类而它们的实际取值会跟随当前生效的 Scalar 主题浅色/深色自动变化主题切换时无需改动任何模板代码。五、内置主题预设清单scalar/themes提供了一组开箱即用的主题。完整的预设定义位于 src/index.ts 的presets对象中主题 ID 列表与对应的可读名称如下来源src/index.ts主题 IDthemeId显示名称说明defaultDefault默认 Scalar 主题alternateAlternate替代配色强调色直接复用主前景色moonMoon月球风格purplePurple紫色系solarizedSolarizedSolarized 配色bluePlanetBlue Planet蓝色星球deepSpaceDeep Space深空风格saturnSaturn土星风格keplerKepler-11e开普勒系风格marsMars火星风格laserwaveLaserwave霓虹激光风格elysiajsElysia.js面向 Elysia.js 生态的集成主题fastifyFastify面向 Fastify 生态的集成主题noneNone无主题加载基础变量但不应用任何皮肤代码层面每个预设都是一个符合Theme接口的对象src/index.ts包含四个字段export type Theme { uid: string // 全局唯一 ID创建后不可变更 name: string // 显示名称 description: string // 描述 theme: string // 主题 CSS 字符串由 vite 的 ?inline 导入编译而来 slug: string // 文本标识符用于在 scalar.config.ts 中指定主题 deprecated?: boolean // 已废弃的主题仍可加载但 UI 不再展示 }其中uid是静态生成的随机 ID如 default 为qTQR9jSM8E-LihpyZzPOi官方在注释中明确要求新建主题时静态 UID 一经分配就不得更改slug采用 kebab-case 且创建后同样不可变——这是为了保证存量配置如scalar.config.ts与数据库记录能稳定指向同一主题。elysiajs与fastify被单独抽成IntegrationThemeId类型src/index.ts对应仓库中两个框架集成包的官方主题其余预设则通过themePresetsObject.values(presets)批量暴露给平台使用。六、自定义主题从 starter 到完整的Theme对象内置预设之外scalar/themes还提供了一套自定义主题起步模板presets/custom-theme-starter.css它几乎是全部 Scalar CSS 变量的完整清单与注释文档覆盖布局与形状--scalar-border-width默认1px、--scalar-radius默认3px所有圆角由此派生设0即为直角风格、--scalar-header-height、--scalar-sidebar-width、--scalar-toc-width排版--scalar-font/--scalar-font-code、--scalar-heading-1~6、--scalar-paragraph、--scalar-small/--scalar-mini/--scalar-micro、字重--scalar-bold/--scalar-semibold/--scalar-regular浅色模式.light-mode与深色模式.dark-mode的颜色--scalar-color-1/2/3、--scalar-color-accent、--scalar-background-1/2/3/4、--scalar-border-color、滚动条颜色、阴影、按钮色、语义色green/red/yellow/blue/orange/purple等派生令牌--scalar-border由边框宽度与颜色组合而成、侧边栏.t-doc__sidebar、目录.t-doc__toc、文档头部.t-doc__header、编辑器内各类块级元素标题、段落、列表、引用、代码、按钮、callout、表格等的专属变量。以此模板为起点你可以复制出my-theme.css只改配色变量即可获得一个风格统一的全新主题。随后通过getStarterTheme(name)src/index.ts快速生成一个完整的Theme对象import { getStarterTheme } from scalar/themes const myTheme getStarterTheme(My Theme) // { // name: My Theme, // slug: my-theme, // 自动转 kebab-case、去特殊字符、截断至 255 字符 // description: , // uid: nanoid(), // 自动生成唯一 ID // theme: customThemeStarter // 起步模板的 CSS 字符串 // }slug会经过规范化处理NFC 归一化、小写、去除非字母/数字/空白/连字符的字符、合并空白与连字符确保得到合法的 kebab-case 标识符。理解核心变量圆角刻度与模式切换在自定义主题之前建议先读懂 base/variables.css 中两处全局杠杆设计圆角刻度variables.css。所有圆角令牌都由基础值--scalar-radius默认3px按倍数推导并统一被--scalar-radius-max默认20px封顶--scalar-radius: 3px; --scalar-radius-max: 20px; --scalar-radius-md: min(var(--scalar-radius), var(--scalar-radius-max)); /* 3px */ --scalar-radius-lg: min(calc(var(--scalar-radius) * 2), var(--scalar-radius-max)); /* 6px */ --scalar-radius-xl: min(calc(var(--scalar-radius) * 8 / 3), var(--scalar-radius-max)); /* 8px */ --scalar-radius-2xl: min(calc(var(--scalar-radius) * 4), var(--scalar-radius-max)); /* 12px */ --scalar-radius-3xl: min(calc(var(--scalar-radius) * 16 / 3), var(--scalar-radius-max)); /* 16px */ --scalar-radius-full: calc(var(--scalar-radius) * 9999); /* 胶囊形刻意不封顶 */这意味着只改--scalar-radius一个变量即可等比缩放整个界面的圆角设为0即全直角--scalar-radius-max保证超大圆角不会让内容容器变成月牙或体育场唯一的例外是--scalar-radius-full它专用于胶囊形元素故意不设上限。深浅色模式。变量文件通过.dark-mode与.light-mode两个类切换color-scheme、滚动条颜色、按钮主色、阴影与亮度系数等default预设presets/default.css则进一步定义背景三级色阶、前景三级文字色、强调色、边框色与语义色并利用supports (color: color(display-p3 ...))为支持 Display-P3 的屏幕提供更广色域的颜色值。七、工作原理小结与源码阅读路线回顾整个包的工作机制可以归纳为一条清晰的主线变量层base/variables.css定义全套设计令牌作为一切主题的地基基础层scalar-base装载变量、默认主题与重置/滚动条样式src/style.css主题层scalar-theme由getThemeStyles动态包裹并注入所选预设实现皮肤切换src/index.ts作用域所有样式限定在.scalar-app根元素内嵌入式场景互不干扰base/reset.cssTailwind 桥接theme inline把变量映射为工具类令牌让 Tailwind 项目零成本共享同一套设计系统tailwind/theme.css。如果你打算进一步研究推荐按以下路径阅读源码预设的组织方式与Theme类型packages/themes/src/index.ts圆角/排版/模式变量的完整注释packages/themes/src/base/variables.css重置样式的细节表单、RTL、focus-visible 等packages/themes/src/base/reset.css自定义主题的变量清单范本packages/themes/src/presets/custom-theme-starter.cssTailwind 令牌映射全表packages/themes/src/tailwind/theme.css这套变量定义 → 分层组织 → 作用域隔离 → 双入口消费CSS/JS→ Tailwind 桥接的设计正是 Scalar 能在保持高度一致性的同时支持任意主题扩展的底层原因。无论是嵌入第三方站点、构建白标产品还是在 Tailwind 项目中复用 Scalar 的设计语言scalar/themes都为你提供了完整且可控的路径。【免费下载链接】scalarScalar is an open-source API platform: Modern REST API Client Beautiful API References ✨ 1st-Class OpenAPI/Swagger Support项目地址: https://gitcode.com/GitHub_Trending/sc/scalar创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考