OwnUI
挑一种主色,
拿到一整套 UI
中性灰阶打底,主色只留一个可换的接口。下面这些组件都是真的——调色、换深浅色, 它们立刻跟着走;定下来之后,导出 CSS、Token、整个起步工程,连同一套让 AI 照着写的规范。
v1.0.0
零依赖 · 零构建
40+ 组件
AI 可读
调色台
改动直接写到
<html> 的 --ui-p-*;
组件引用的是语义层,所以下面全部一起跟随,不需要逐个改。
预设主色 / 自定义
主色标签
默认标签
进行中
提示条
浅底、描边、图标同样派生自主色。
深浅色用右上角开关切换,预览实时跟随
换肤机制怎么实现的
导出这一版
当前 中性墨黑 · 浅色,导出内容随主色与主题实时重算
starter.zip 解压即用:
library/ 五个文件 + 这一版主题 +
示例页 + 一页完整样板 + AGENTS.md 与组件契约。后两样是给 AI 看的——放进你的项目,它写的页面就自然是这套 UI。
「复制分享链接」会把当前主色与主题编码进 URL 的 hash,别人打开就是同一个配色。
starter.zip 暂时不可用。它要把
library/ 里的源码一起打包,
而浏览器不允许页面在 file:// 下读取本地文件
(这正是它比另外几个导出项多出来的依赖)。在项目根目录起一个本地服务再访问即可恢复,例如
python -m http.server 之后打开
http://localhost:8000/docs/。其余四项不读文件,任何环境下都能用。Getting started
三步接入
把三个文件拷进你的项目,按顺序引入。不需要构建工具,也不需要任何 npm 依赖—— Vue、React、Svelte、原生页面、服务端模板都一样用。
HTML · 引入顺序不可颠倒
<!-- 1. 设计 Token:颜色 / 字阶 / 间距 / 圆角 / 阴影 / 动效 -->
<link rel="stylesheet" href="library/tokens.css">
<!-- 2. 基础层:重置、排版、布局、工具类 -->
<link rel="stylesheet" href="library/base.css">
<!-- 3. 组件层:全部组件样式 -->
<link rel="stylesheet" href="library/components.css">
<!-- 4. 行为层:弹层、提示、标签页等交互(可选,纯原生) -->
<script src="library/components.js"></script>
两种用法
声明式:写 data 属性即可
<button class="ui-btn ui-btn--primary"
data-ui="modal" data-target="#demoModal">打开弹窗</button>
<div class="ui-modal" id="demoModal">…</div>
命令式:调 API
UI.toast({ message: '已保存', type: 'success' });
UI.modal.open('#demoModal');
const ok = await UI.confirm({
title: '确认删除该记录?',
description: '删除后不可恢复。'
});
与框架集成:所有行为都通过
ui:* 自定义事件对外广播(如 ui:submit、ui:change、ui:sort),
在任意框架里用原生事件监听即可接管,无需为组件库再包一层。
AI ready
让 AI 照着这套 UI 写
不写规范,AI 只会按它的先验生成 Bootstrap 或 Tailwind 的类名——类名不对、Token 不对、 状态方向也不对。所以这里把「怎么用」写成了四份机器可读的文件,随 starter.zip 一起进你的项目。
四份文件,各管一段
llms.txt
索引:这是什么、关键文件在哪
AGENTS.md
规则与禁止清单,AI 会自动读到
ownui.spec.json
每个组件的准确写法与代码片段
golden.html
一页完整样板,照抄改比读规则有效
禁止清单(节选)
AI 的默认先验在这套库里全是错的,必须明说。
不存在 container / row / col-* / d-flex
btn / btn-primary / el-button
不写裸色值 #2563EB / rgb(...)
不写非字阶字号 13px / 15px
不写 !important
不自己写 position:fixed 做弹层
规范不是手抄的:
ownui.spec.js 是唯一数据源,构建脚本从它生成
llms.txt 与 ownui.spec.json,
并反向校验components.css 里的真实类名——
声明了却没有、有却没收录,两个方向都会报。这样规范不会悄悄过期。