mengrru/spherse/spherse-create-ui-theme
Claude Code and agent skill by mengrru/spherse
- community
Checking that the SKILL.md file is still in the repository.
指导用户创建自定义 UI 主题,通过 .spherse/theme.css 覆盖 CSS 变量实现视觉定制
Install
npx vskill@latest install mengrru/spherse/spherse-create-ui-themeSKILL.md
自定义 UI 主题
Spherse 支持通过项目级 CSS 变量覆盖来自定义 UI 外观。在项目根目录创建 .spherse/theme.css,覆盖对应的 CSS 变量即可生效。
所有 design token 统一使用 --sp-* 前缀(Spherse 自有命名空间)。只覆盖你想修改的变量,未覆盖的保持默认。
可用变量
所有变量都支持浅色和深色两套值(深色值由 OS prefers-color-scheme 驱动)。
页面与容器
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-background | #fafafa | #171717 | 页面背景 | |
--sp-foreground | #171717 | #fafafa | 页面主文字色 | |
--sp-card | #ffffff | #262626 | 卡片/面板背景 | |
--sp-card-foreground | #171717 | #fafafa | 卡片内文字色 |
弹出层
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-popover | #ffffff | #262626 | 弹窗/下拉菜单背景 | |
--sp-popover-foreground | #171717 | #fafafa | 弹窗内文字色 |
交互元素
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-primary | #171717 | #fafafa | 主操作按钮背景、选中态 | |
--sp-primary-foreground | #fafafa | #171717 | 主操作按钮文字色 | |
--sp-secondary | #f5f5f5 | #262626 | 次要按钮背景 | |
--sp-secondary-foreground | #171717 | #fafafa | 次要按钮文字色 | |
--sp-accent | #f5f5f5 | #262626 | 悬停/选中背景 | |
--sp-accent-foreground | #171717 | #fafafa | 悬停/选中文字色 |
文字层级
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-muted | #f5f5f5 | #262626 | 弱化背景 | |
--sp-muted-foreground | #737373 | #a3a3a3 | 次要/辅助文字色 |
边框与输入
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-border | #e5e5e5 | #404040 | 通用边框色 | |
--sp-input | #e5e5e5 | #404040 | 输入框边框色 | |
--sp-ring | #a3a3a3 | #737373 | 聚焦环色 |
语义色
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-destructive | #dc2626 | #f87171 | 危险/错误色 | |
--sp-success | #16a34a | #22c55e | 成功/确认色 | |
--sp-success-foreground | #ffffff | #052e16 | 成功色上的文字色 | |
--sp-warning | #ea580c | #f97316 | 警告色 | |
--sp-warning-foreground | #ffffff | #1c1917 | 警告色上的文字色 | |
--sp-diff-added | #16a34a | #22c55e | diff/文件查看器中新增内容 |
圆角
| 变量 | 默认值 | 用途 | |
|---|---|---|---|
--sp-radius | 0.5rem | 全局圆角基数(Tailwind 的 rounded-sm/md/lg/xl 基于此派生) |
滚动条
应用内所有可滚动区域(聊天消息列表、文件树、内容浏览器、下拉菜单、对话框等)统一使用细滚动条,存在感弱,可在浅色/深色下自动适配。size 控制宽高,thumb / thumb-hover 是滑块常态与悬停色,track 是轨道背景(默认透明)。
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-scrollbar-size | 10px | 10px | 滚动条宽度/高度 | |
--sp-scrollbar-thumb | rgba(115,115,115,0.4) | rgba(163,163,163,0.4) | 滑块颜色(常态) | |
--sp-scrollbar-thumb-hover | rgba(115,115,115,0.65) | rgba(163,163,163,0.65) | 滑块颜色(悬停) | |
--sp-scrollbar-track | transparent | transparent | 轨道背景 |
变量遵循 CSS 级联,因此可在特定容器作用域内覆盖,实现局部定制。例如只让聊天窗口的滚动条变色:```css/ .spherse/theme.css —— 仅聊天窗口滚动条变色 /[data-chat-root] {--sp-scrollbar-thumb: rgba(201, 160, 74, 0.6);--sp-scrollbar-thumb-hover: rgba(201, 160, 74, 0.85);}```如需完全自定义滚动条(如不同方向不同样式、动画),直接在.spherse/theme.css中以更高优先级或相同特异性重写::-webkit-scrollbar系列伪元素规则即可(项目主题 CSS 在应用样式之后注入,相同特异性下胜出)。
侧边栏
| 变量 | 默认浅色 | 默认深色 | 用途 | |
|---|---|---|---|---|
--sp-sidebar | #ffffff | #1f1f1f | 侧边栏背景 | |
--sp-sidebar-foreground | #171717 | #fafafa | 侧边栏文字色 | |
--sp-sidebar-primary | #171717 | #fafafa | 侧边栏主要操作 | |
--sp-sidebar-primary-foreground | #fafafa | #171717 | 侧边栏主要操作文字 | |
--sp-sidebar-accent | #f5f5f5 | #262626 | 侧边栏悬停/选中 | |
--sp-sidebar-accent-foreground | #171717 | #fafafa | 侧边栏悬停文字 | |
--sp-sidebar-border | #e5e5e5 | #404040 | 侧边栏边框 | |
--sp-sidebar-ring | #a3a3a3 | #737373 | 侧边栏聚焦环 |
示例
暖色调主题
增大圆角
钩子与作用域
- 共享交互组件使用 Base UI,不是 Radix。
- 以语义
data-*钩子和data-slot为样式入口,具体对象与状态见各节,可自由组合 CSS 定制外观。 - Portal 浮层位于触发位置的 DOM 层级之外,用自身钩子定制;全局配色放在
:root,便于主布局与浮层共同继承。
应用根容器 / 全局装饰
data-app-root 是应用主布局的根容器,铺满视口(100vh,已 position: relative 且 overflow: hidden),包含 activity bar、项目面板、主内容区与内嵌聊天窗口。它适合用 ::before / ::after 叠加全局背景、噪点纹理、边角装饰等,但不是所有可见 UI 的 DOM 共同祖先:通过 Portal 渲染的对话框、菜单、提示与聊天浮窗等位于其外部,需用各自的钩子定制。
| 钩子 | 作用对象 | |
|---|---|---|
data-app-root | 应用主布局根容器(铺满视口,position: relative;不包含外部 Portal 浮层) |
示例:
-[data-app-root]已是定位上下文,::before/::after默认已被应用设为position: absolute; pointer-events: none(相对整窗定位、不挡交互),因此只需写装饰属性即可,漏写也不会进入 flex 流导致整窗偏移;如需固定层(position: fixed)或可交互叠层(pointer-events: auto),显式覆盖即可。overflow: hidden会自动裁剪超出窗口的部分。- 装饰默认处于内容之下:内容区的背景多为半透明或--sp-background,叠在最外层根容器上的装饰会从内容半透明处透出。若要让装饰盖在内容之上,给伪元素或固定层显式设较高的z-index并加pointer-events: none,避免遮挡交互。- 根容器内的高z-index不保证盖过外部 Portal 浮层;不要通过改变应用根的transform/filter等属性来假设所有浮层会一起定位或装饰。- 本地图片用相对路径(url('./assets/x.png')基于项目.spherse/目录解析),或远程 URL(项目主题同样以<link>从 preview 路由载入,相对url()解析到项目文件)。
侧边区域
| 钩子 | 作用对象 | |
|---|---|---|
data-activity-bar | 项目切换栏。定制背景、边框与内部间距 | |
data-side-panel | 桌面侧边区域,包含项目切换栏与项目面板 | |
data-side-panel-drawer | 移动端侧边抽屉,包含项目切换栏与项目面板 |
桌面容器与移动端抽屉是不同渲染分支,不是嵌套关系;抽屉遮罩是独立的兄弟元素,不在 data-side-panel-drawer 内。面板隐藏通过 inert 与位移处理,没有专用的 data-open / data-pinned 属性,定制时保留定位与收起动画。
data-activity-bar 的外层还独立保留了 52px 宽度,只修改该钩子的宽度不会同步改变布局占位。侧边区域内部各面板有自己的背景,修改外层背景不一定可见。
Activity Bar 项目头像
应用最左侧 activity bar 上的项目头像暴露了语义钩子,可在项目级 .spherse/theme.css 中定制其外观(背景、边框、圆角、选中/未选中态等)。
| 钩子 | 作用对象 | |
|---|---|---|
data-project-avatar | 项目头像根容器(含 fallback 字母) | |
[data-project-avatar][data-active] | 当前选中项目的头像(data-active 仅在选中态存在) |
示例:
头像默认选中态为opacity-100、未选中态为opacity-30,均通过 class 而非 inline style 控制,可被相同或更高特异性的主题规则覆盖。
项目面板与内容浏览器
除了聊天窗口,项目级 .spherse/theme.css 还可以定制项目面板和内容浏览器的背景与外观。
| 钩子 | 作用对象 | |
|---|---|---|
data-project-panel | 项目侧边面板(agent/session 列表 + 文件树的容器,默认 --sp-sidebar 背景) | |
data-content-browser | 内容浏览器(文档/代码查看区根容器,包含 header 与内容滚动区) | |
data-tab-bar | 内容区标签栏(位于内容区左栏最上方,开启分窗时不跨越右侧分窗;用户可在设置中关闭;默认 bg-muted/40 + 底边框) | |
data-tab-scroll | 标签栏内可横向滚动的标签列表(welcome tab 固定在它外面,不随横向滚动移动) | |
data-tab(值为 welcome / chat / file / browser,活跃项带 data-active="true") | 标签栏中的单个标签(活跃标签默认 --sp-background 背景) | |
data-tab-drop-indicator | 拖拽排序时插入位置的竖线指示条(仅拖拽悬停时存在,默认 --sp-primary 色、贴标签起始边) | |
data-split-layout | 内容区横向容器(包住左栏、分隔条与右侧分窗) | |
data-split-main | 内容区左栏(标签栏 + 当前页面;无分窗时占满内容区) | |
data-split-divider | 左右分窗之间的可拖拽分隔条(默认 1px --sp-border,拖动中带 data-dragging) | |
data-split-pane | 右侧分窗(内部内容浏览器根仍为 data-content-browser,对 [data-content-browser] 的定制同样生效;可用 [data-split-pane] [data-content-browser] 单独定制分窗) |
示例:
> 项目面板内部使用 shadcn/ui sidebar 组件(--sp-sidebar 系列变量控制纯色背景)。设 background / background-image 可覆盖纯色实现图片/渐变背景。
标签栏定制
标签默认是直角矩形,仅靠右侧边框分隔;形状、间距、活跃态都可在 .spherse/theme.css 中改写。项目主题以无层(unlayered)CSS 注入,普通选择器即可覆盖应用内置的 Tailwind 样式,无需 !important。标签外层有一个 display: contents 的右键菜单包装元素(不产生盒、不影响布局),主题选择器请用后代选择器(如 [data-tab-scroll] [data-tab]),不要对标签用直接子选择器。
注意事项:
- 纵向会被裁剪:标签栏固定高度(约 36px)且纵向
overflow: hidden(data-tab-scroll内横向可滚动)。向外的投影、transform: translateY上浮等超出标签栏上下边界的效果会被裁掉——优先用 inset 阴影、内边距;确需外溢时同时覆盖[data-tab-bar]的height/padding - 标签间距加在滚动容器上:
[data-tab-bar]的gap只作用于欢迎页标签与[data-tab-scroll]之间,各内容标签的间距需对[data-tab-scroll]设置 - 伪元素可自由使用:
[data-tab]自身是定位上下文(position: relative),::before/::after均未被占用,装饰伪元素记得写position: absolute,避免挤压标签内容 - 标签内部元素无专属钩子:文字按钮与关闭按钮暂未暴露
data-*钩子,如需微调只能用[data-tab] > button之类的结构选择器,应用更新时可能失效,尽量只在[data-tab]层定制 - 欢迎页标签:
[data-tab="welcome"]固定在首位且无关闭按钮,位于[data-tab-scroll]外、横向滚动时常驻可见,可用该选择器单独设计 - 标签栏在聊天窗口之外,agent 主题不影响它,只能在项目级
.spherse/theme.css定制
设置页签(Tabs)
设置与 Agent 编辑表单使用共享 Tabs 组件,与上文文档/会话标签栏的 [data-tab] 不是同一套钩子。
| 选择器 | 作用对象 | |
|---|---|---|
[data-slot="tabs"] | 页签组根容器 | |
[data-slot="tabs-list"] | 页签按钮列表 | |
[data-slot="tabs-trigger"] | 单个页签按钮 | |
[data-slot="tabs-trigger"][data-active] | 当前选中的页签按钮 | |
[data-slot="tabs-content"] | 页签内容面板 |
选中态使用 [data-active],不是 [data-active="true"] 或 [data-state="active"]。列表的 data-variant="line" 变体使用按钮的 ::after 作为指示线,定制伪元素时避免覆盖它。
对话框(Dialog)
使用共享 Dialog 组件的对话框通过 data-slot 暴露样式入口,没有额外的 data-dialog-* 钩子。可在项目级 .spherse/theme.css 中用以下选择器统一定制:
| 选择器 | 作用对象 | |
|---|---|---|
[data-slot="dialog-content"] | 弹窗主体。定制 background、text color、border-radius、box-shadow | |
[data-slot="dialog-overlay"] | 背景遮罩。定制 background、backdrop-filter | |
[data-slot="dialog-header"] | 头部。定制间距与布局 | |
[data-slot="dialog-title"] | 标题。定制字体与颜色 | |
[data-slot="dialog-description"] | 描述文字。定制字体与颜色 | |
[data-slot="dialog-footer"] | 底部操作区。定制间距与布局 | |
[data-slot="dialog-close"] | 关闭按钮。定制图标颜色、hover 态 | |
[data-slot="dialog-trigger"] | 使用 DialogTrigger 的打开弹窗触发元素 |
弹窗主体默认使用 --sp-popover / --sp-popover-foreground 配色(见「弹出层」变量表)。这些选择器会匹配所有使用对应组件的对话框,不仅是主题设置弹窗。
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingpackages/presets/skills/spherse-create-ui-theme/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/mengrru/spherse/spherse-create-ui-theme)