主题化组件系统 · 新资源

Skeleton 设计系统.

通过完整的阅读桌面体验,比较 Skeleton 5.0.1 的 Cerberus、Mint 和 Rose 真实主题,并实时检查设计令牌、暗色界面表面组合及可逆的本地状态。

OpenDesign 指南8 个章节40 条参考条目原始应用指南
01

Skeleton 设计系统界面预览

更改主题和外观,同时保留已保存的阅读状态;查看解析后的值。

查看三种完整的 Skeleton 主题打开完整示例
Skeleton 5.0.1 CSS 使用 Tailwind 4 编译的工具类和主题;原创 JavaScript 控件。 · 实现参考
02

Skeleton 设计系统设计参考

固定使用 Skeleton 5.0.1 主题文件、经编译的 CSS 实用类行为,以及明确标注的原创组合方式。

Cerberus 主题值

来源
名称 / 规则值 / 配置用途
--spacing0.25rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--radius-base0.5rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-base--font-familysystem-ui实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-heading--font-weightbold实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-100oklch(0.84 0.08 254.62)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-300oklch(0.7 0.15 254.36)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-500oklch(0.57 0.21 258.29)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-700oklch(0.46 0.17 257.78)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-900oklch(0.34 0.11 257.14)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-50oklch(0.99 0 0)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-950oklch(0.18 0 0)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。

Mint 主题值

来源
名称 / 规则值 / 配置用途
--spacing0.25rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--radius-base0.375rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-base--font-familysystem-ui, sans-serif实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-heading--font-weightnormal实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-100oklch(89.8% 0.08 156.34deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-300oklch(86.28% 0.13 151.76deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-500oklch(83.57% 0.18 148.98deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-700oklch(71.28% 0.15 148.61deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-900oklch(58.17% 0.13 148.16deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-50oklch(89.13% 0.03 155.27deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-950oklch(21.88% 0.02 186.33deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。

Rose 主题值

来源
名称 / 规则值 / 配置用途
--spacing0.25rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--radius-base0.375rem实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-base--font-familySeravek, 'Gill Sans Nova', Ubuntu, Calibri, 'DejaVu Sans', source-sans-pro, sans-serif实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--typo-heading--font-weightnormal实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-100oklch(92.93% 0.03 340.64deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-300oklch(81.16% 0.08 345.32deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-500oklch(69.89% 0.13 348.12deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-700oklch(57.25% 0.1 346.44deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-primary-900oklch(43.55% 0.07 343deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-50oklch(96.76% 0.01 318.08deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。
--color-surface-950oklch(25.82% 0.01 304.87deg)实际主题声明。data-theme 选择此导入主题时,这些值会一并更改;原有阅读状态保持不变。

CSS 集成与语义配色组合

来源
名称 / 规则值 / 配置用途
Foundation import@import "@skeletonlabs/skeleton"在 Tailwind 之后加载,以便编译实用类定义。
Theme selectiondata-theme="cerberus" / "mint" / "rose"只有导入的主题才能提供其变量。
Class-based appearance@custom-variant dark (&:where(.dark, .dark *))让原有外观按钮能够影响实际编译的深色变体。
Surface pairingslight-dark(light value, dark value)Skeleton 的全局样式设置了 color-scheme;只更改类而没有匹配的变体是不够的。
Filled actionbtn preset-filled-primary-500将原生按钮的几何样式与适配主题的预设相结合。
Supporting actionbtn preset-tonal-primary使用适合当前外观的色调组合。
Disclosuredetails.disclosure > summary使用 Skeleton CSS 控制浏览器原生的打开状态;无需初始化 Svelte 组件。
03

Skeleton 设计系统完整指南

实用指南,介绍如何为真实界面选择、应用和评审此系统。

DESIGN-skeleton.md

完整指导、实现起点和源代码链接。

下载指南

Skeleton 设计系统:CSS 基础与框架层

选择实际运行的层

阅读桌面使用 @skeletonlabs/skeleton 5.0.1、其 Tailwind CSS 实用类和附带的三种主题。它不加载 skeleton-svelte 或 skeleton-react。按钮、徽章、标签、卡片和折叠面板的呈现使用的是真正的 CSS 实用类;主题选择器和已保存状态逻辑则为原创 JavaScript。这样的职责划分使完整示例可以作为一个小型 Vite 页面运行,同时不会让人误以为它使用了框架组件运行时。

摘自本 OpenDesign 指南

编译实用类,而非在浏览器中导入原始 CSS

Skeleton 的源文件包含 @utility 和 @variant 等 Tailwind 指令。提供的 Vite 配置包含 @tailwindcss/vite,样式表会先导入 Tailwind,再导入 Skeleton 和所选主题。直接链接到源代码包无法还原编译后的样式。这里包含完整的构建源代码,因此预览不依赖隐藏的生成文件 CSS。

  1. 导入 Tailwind CSS。
  2. 导入 Skeleton 工具类。
  3. 显式导入要选择的每个主题。
  4. 使用 Tailwind Vite 插件编译样式表。

Skeleton 设计系统主题选择与实际值

显式导入每个可用主题

Cerberus、Mint 和 Rose 均从软件包的 themes 路径导入。选择主题名称会更改根元素上的 data-theme,从而选用相应的变量声明。参考内容列出了每个主题的实际主色调样本、表面颜色的明暗极值、间距、圆角和字体声明。这些值读取自固定版本的文件,而非通过替换单一强调色生成。

  • 初始呈现使用 Cerberus。
  • Mint 和 Rose 是分别实际导入的主题。
  • 主题选择会更改 data-theme,而不会复制内容树。

比较时保持完整内容不变

切换主题时,阅读卡片、清单和保存状态都会保持不变。每次选择主题后,侧面板都会读取根元素上计算后的变量,显示浏览器实际解析出的值。这样比较才有意义:读者可以在内容和状态相同的情况下,评估字体排印、形状和配色的变化。

Skeleton 设计系统深色外观与 color-scheme

将深色变体连接到实际控件

样式表定义了基于类的深色变体,可匹配根元素本身或其后代上的 .dark。Skeleton 的全局规则使用该变体设置 color-scheme。因此,外观按钮会改变 light-dark() 表面配对所依据的条件。如果切换按钮只更改类名,却不调整 Tailwind 默认的基于媒体查询的变体,那么界面可能显示“深色”,实际表面却仍是浅色。

使用保持易读性的预设

外观操作使用 preset-tonal-primary,阅读操作使用 preset-filled-primary-500。预设控制表面与前景色之间的关系;单独的颜色令牌并不能确保对比度足以保证可读性。切换到 Rose 后,我们检查了实际渲染的深色状态,包括控件文本和说明内容,而不是假定成功更改类名就代表视觉效果正确。

Skeleton 设计系统字体排印、形状与布局

区分主题声明与原有层级

Cerberus 声明了系统字体,Rose 则包含不同的备用字体栈。本示例不会加载远程字体;浏览器会使用所选字体栈中本机可用的字体。原始布局明确将页面标题设为 36px,阅读标题设为 28px。这些布局选择与主题自身的字体系列和字重声明彼此独立。

圆角和间距由主题决定

Skeleton 设计系统阅读状态与外观重置

让保存操作保持本地且可撤销

阅读操作会切换 aria-pressed、更新标签,并显示易读的状态消息。它仅为当前页面保存一个内存中的布尔值,不涉及账户、持久化存储或网络请求。切换主题后,该状态仍会显示,方便读者比较不同配色下的激活状态。

重置外观,但不删除阅读状态

重置外观会恢复 Cerberus 主题和浅色外观,但有意保留已保存的布尔值。它的标签明确说明了操作范围。另一个独立操作可以从本地桌面移除阅读卡片。混淆这两个操作,会导致一个无害的视觉重置意外丢弃用户当前的选择。

Skeleton 设计系统原生折叠内容与真实内容

使用浏览器的 details 元素

辅助说明采用真正的 details/summary 结构和 disclosure 实用类。键盘和指针交互由浏览器提供,Skeleton则负责其呈现。这不是 Skeleton Svelte Accordion 组件,也没有虚构任何组件 API 或事件。段落具体说明了哪些内容会变化、哪些内容保持不变。

过渡结束后检查展开状态

样式表可以为折叠内容的尺寸添加动画。视觉检查会等待过渡结束后再捕获展开状态;如果立即截图,内容可能还处于展开过程中。布局验证会纳入展开后的段落和较长的计算字体栈,确保侧边面板不会仅在大量内容隐藏时才通过检查。

Skeleton 设计系统响应式主题检查

让窄屏上的值清晰易读

工作台会在视口宽度低于 720px 时改为纵向堆叠,外边距缩小至 16px。每个计算令牌名称及其值各占一行,因此较长的字体栈和 OKLCH 字符串可以换行显示,无需横向滚动。五个颜色样本仍以紧凑网格呈现,主题控件也会换行排列。

测试主题与状态组合

浏览器测试会先保存阅读卡片,再依次切换到 Mint 和 Rose、启用深色外观、展开折叠内容,最后重置呈现效果。整个过程中,已保存状态都必须保留。测试已在窄至 280px 的视口下完成,因此覆盖了实际的长文本值和展开内容,而不只是初始主题的单张截图。

Skeleton 设计系统完整 Vite 源码

保存全部四个源文件

示例包含 index.html、style.css、main.js 和 vite.config.mjs。安装固定版本的 Skeleton、Tailwind 和 Vite 依赖,然后在该目录中运行 Vite。显式的 @source 指向包含实用类的 HTML,确保编译后的输出包含阅读工作台使用的类。无需补充缺失的框架脚手架。

需要时分别选择框架组件

Skeleton 设计系统组件示例

index.html

完整阅读内容、原生 CSS 组件和自定义控件。

html
<!doctype html><html lang="en" data-theme="cerberus"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Theme reading desk</title></head><body><main><header><div><p class="text-sm font-bold">SKELETON / THEME READING DESK</p><h1>The same content, three themes.</h1><p class="intro">Inspect actual Skeleton 5.0.1 palettes, surface pairings and native CSS components while keeping a complete reading card in view.</p></div><span class="badge preset-tonal-primary">Original OpenDesign study</span></header><div class="controls"><label for="theme">Theme<select id="theme" class="select"><option value="cerberus">Cerberus</option><option value="mint">Mint</option><option value="rose">Rose</option></select></label><button id="mode" class="btn preset-tonal-primary">Use dark appearance</button><button id="reset" class="btn preset-tonal-surface">Reset presentation</button></div><div class="workbench"><article class="card preset-outlined-surface-200-800 reading"><span class="chip preset-tonal-primary">Reading / 4 minutes</span><h2 class="mt-6">Make the next step easier to see</h2><p>A useful interface explains the next action without making every detail compete for attention. Start with a complete piece of content, then inspect how its hierarchy survives a change of theme.</p><ul><li>Keep the heading clear in both appearances.</li><li>Use a supporting surface to group related information.</li><li>Repeat an important state in text, not color alone.</li></ul><button id="bookmark" class="btn preset-filled-primary-500 bookmark" aria-pressed="false">Save to this reading desk</button><p id="message" role="status">This reading card is not saved.</p></article><aside class="card preset-tonal-surface side"><h2 class="text-xl font-bold">Current theme values</h2><div class="palette" aria-label="Primary palette samples"><div class="swatch" style="background:var(--color-primary-100)"></div><div class="swatch" style="background:var(--color-primary-300)"></div><div class="swatch" style="background:var(--color-primary-500)"></div><div class="swatch" style="background:var(--color-primary-700)"></div><div class="swatch" style="background:var(--color-primary-900)"></div></div><dl class="tokens" id="tokens"></dl><details class="disclosure mt-6"><summary class="preset-tonal-primary">What changes with the theme?</summary><p>The imported theme changes palette, typography declarations and shape variables. The reading text and local saved state stay the same. Dark appearance changes surface pairings; it is not a second copy of the content.</p></details></aside></div><p class="scope">Uses Skeleton’s actual Tailwind CSS utilities and three shipped themes. The page logic is original plain JavaScript; no Skeleton Svelte or React component runtime is loaded. Saving changes this page only and sends nothing.</p></main><script type="module" src="./main.js"></script></body></html>

代码参考

  • 将全部四个源文件保存在同一个项目目录中。

style.css

主题导入、基于类的深色变体和响应式组合。

css
@import 'tailwindcss';
@import '@skeletonlabs/skeleton';
@import '@skeletonlabs/skeleton/themes/cerberus';
@import '@skeletonlabs/skeleton/themes/mint';
@import '@skeletonlabs/skeleton/themes/rose';
@source './index.html';
@custom-variant dark (&:where(.dark, .dark *));
body{margin:0}*{box-sizing:border-box}main{max-width:1080px;margin:auto;padding:32px}header{display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap;align-items:flex-start}h1{font-size:36px;line-height:1.15;font-weight:700;margin:16px 0}.intro{max-width:66ch;line-height:1.6}.controls{display:flex;gap:16px;align-items:end;flex-wrap:wrap;margin:32px 0}.controls label{display:grid;gap:8px}.workbench{display:grid;grid-template-columns:1.25fr 1fr;gap:24px}.reading{padding:32px}.reading h2{font-size:28px;line-height:1.25;font-weight:700}.reading p{line-height:1.7;margin:24px 0}.reading ul{list-style:disc;padding-left:24px}.reading li{margin:12px 0}.palette{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;margin:24px 0}.swatch{height:72px;border-radius:var(--radius-base)}.tokens{display:grid;gap:12px;font-size:13px}.tokens div{display:grid;gap:8px;padding-bottom:12px;border-bottom:1px solid currentColor}.tokens dd{overflow-wrap:anywhere}.side{padding:24px}.disclosure p{padding:16px;line-height:1.6}.scope{font-size:13px;line-height:1.6;margin-top:32px}.bookmark{margin-top:24px}#message{font-size:14px;margin-top:16px}:focus-visible{outline:3px solid var(--color-primary-500);outline-offset:3px}@media(max-width:720px){main{padding:16px}.workbench{grid-template-columns:1fr}.reading{padding:24px}.palette{gap:4px}.swatch{height:56px}}

.workbench>*{min-width:0}.bookmark{max-width:100%;white-space:normal;height:auto;min-height:2rem;text-align:center}.disclosure summary{white-space:normal}

代码参考

  • 将全部四个源文件保存在同一个项目目录中。

main.js

计算令牌检查,以及相互独立的阅读状态和呈现状态。

javascript
import './style.css';
const root=document.documentElement;let saved=false;function inspect(){const style=getComputedStyle(root);const keys=['--color-primary-500','--radius-base','--spacing','--typo-base--font-family'];document.querySelector('#tokens').replaceChildren(...keys.map(key=>{const row=document.createElement('div'),dt=document.createElement('dt'),dd=document.createElement('dd');dt.textContent=key;dd.textContent=style.getPropertyValue(key).trim();row.append(dt,dd);return row}));}document.querySelector('#theme').addEventListener('change',e=>{root.dataset.theme=e.target.value;inspect()});document.querySelector('#mode').addEventListener('click',e=>{let dark=root.classList.toggle('dark');e.currentTarget.textContent=dark?'Use light appearance':'Use dark appearance';inspect()});document.querySelector('#bookmark').addEventListener('click',e=>{saved=!saved;e.currentTarget.setAttribute('aria-pressed',String(saved));e.currentTarget.textContent=saved?'Remove from this reading desk':'Save to this reading desk';document.querySelector('#message').textContent=saved?'Saved in this preview only.':'This reading card is not saved.'});document.querySelector('#reset').addEventListener('click',()=>{root.dataset.theme='cerberus';root.classList.remove('dark');document.querySelector('#theme').value='cerberus';document.querySelector('#mode').textContent='Use dark appearance';inspect()});inspect();

代码参考

  • 将全部四个源文件保存在同一个项目目录中。

vite.config.mjs

接入实际的 Tailwind 编译器。

javascript
import{defineConfig}from'vite';import tailwindcss from'@tailwindcss/vite';export default defineConfig({plugins:[tailwindcss()],base:'./',build:{cssCodeSplit:false}});

代码参考

  • 将全部四个源文件保存在同一个项目目录中。
04

Skeleton 设计系统 Agent 设置

实现起点

先保存所提供的四个文件。这是 CSS 实用类层,无需 Svelte 或 React 运行时。

sh
npm init -y
npm install @skeletonlabs/[email protected]
npm install --save-dev [email protected] @tailwindcss/[email protected] [email protected]
npx vite --host 127.0.0.1

适用于你项目的提示词

Agent 提示词
使用实际的 CSS 实用类和 Cerberus/Mint/Rose 主题导入,完整实现 Skeleton 5.0.1 阅读工作台。保留基于类的深色配色方案、易读的计算令牌行、完整内容、本地保存状态,以及不会删除该状态的呈现重置功能。请将 CSS 层与框架组件 API 区分开来。
05

Skeleton 设计系统来源与范围

采用实际的 Skeleton Tailwind CSS 实用类和内置主题,并保留原生纯 JavaScript 页面行为。不加载 Skeleton Svelte 或 React 运行时。