Looseleaf 是一套把 shadcn/ui 画成纸张与手绘笔触的 React 组件库:按钮有马克笔填色,卡片像便笺,标签、贴纸和图标也延续同一种画法。它面向 React 19、Tailwind CSS v4 和 Radix 项目,通过 shadcn registry 把组件源码加入你的代码库,适合想让笔记、学习工具或轻量产品带一点纸面质感的开发者。

手绘感从哪里来
纸面有纹理,轮廓会表现笔触,主要按钮用实色填充,次要按钮像荧光笔划过的纸片,链接则带手写下划线。Kevin Sans 手写字体又按界面文字、标题和印章三种用途安排,让控件与内容看起来出自同一本笔记。

这些外观下面仍是实际 DOM 控件。绘图层使用 SVG,文字标签保留为真实文本;绘图函数由种子值决定,同一个种子在服务端和浏览器里得到同样的线条。悬停、按下和聚焦状态通过 CSS 切换预先绘好的图层。
项目保留 shadcn/ui 的部件、props 和 data-slot 名称,也为键盘操作、焦点提示、减少动态效果和高对比度模式提供了适配。它把手绘当作表现层,控件仍沿用常规交互语义;具体页面改造后的可用性,还要结合自己的内容和布局检查。
从按钮到便笺界面
当前仓库列出 123 个组件和 61 个组合区块。日常 UI 部件之外,还有纸张、索引卡、胶带、印章、涂鸦、贴纸、绘图板和聊天输入框。它的用途可以很小:给一个空状态加贴纸、把提示做成便笺;也可以从完整区块开始拼页面。
例如 Notes app 区块把笔记本做成侧边分类,把页面摘要做成一叠索引卡,编辑页则使用带标记工具的横线纸。下面是官方演示中的笔记列表,搜索框、分类、标题和摘要都沿用纸张视觉。

区块提供的是前端界面和示例交互。拿 Notes app 做自己的产品时,账号、数据持久化和同步等业务部分需要另接。登录、仪表盘、定价和聊天区块同样适合用作布局起点,数据与服务需要自己接入。
接入现有项目
先确认项目具备 React 19、Tailwind CSS v4、shadcn CLI 4.x,以及 @/* 路径别名。已有 shadcn 项目可以继续使用现有配置;新项目先完成 npx shadcn@latest init。Vite 项目需要同时配置 TypeScript 与打包器别名,Next.js 的 App Router 则要把 Provider 放在客户端组件中。
在现有 components.json 中合并这一条 registry 配置,保留其他字段:
{
"registries": {
"@looseleaf": "https://kevintngo.github.io/looseleaf/r/{name}.json"
}
}
接着添加一个按钮作为最小尝试:
npx shadcn@latest add @looseleaf/button
CLI 会把按钮、绘图配方及相关依赖加入项目。组件以源码形式落在 components/ui/、lib/ink/ 等目录,你可以直接修改。随后在演示入口使用它:
import { InkProvider } from "@/lib/ink/react"
import { Button } from "@/components/ui/button"
export default function App() {
return (
<InkProvider>
<Button>Save changes</Button>
</InkProvider>
)
}
在 Next.js 中,这段演示要放入带 "use client" 的组件文件。跑起项目后,应能看到带手绘轮廓的按钮;若一直只有普通边框,先检查 InkProvider、路径别名和主题 CSS 是否加载。出现字体不对的情况,再检查主题及字体配置。
按需安装与整套主题的影响不同。安装单个组件会保留已有颜色令牌,并补充缺少的 Looseleaf 令牌。npx shadcn@latest add @looseleaf/looseleaf 会安装主题、字体、绘图引擎与全部组件,同时将配色替换为 Notebook 调色板,CLI 会先询问。已有品牌色的项目更适合先试单个组件,并查看生成文件和样式改动。
需要完整布局时,可继续添加 npx shadcn@latest add @looseleaf/login-01。这类区块及其依赖会放入项目源码,区块目录为 components/blocks/,后续表单逻辑和接口由项目自己维护。
迁移前看清边界
相近的组件接口可以减少 JSX 改动,但原来的 Tailwind 装饰类不一定全部照搬。比如 Button 支持用 rounded-full 画成胶囊形,其他 rounded-* 类不会改变它的轮廓,因为轮廓本身是一幅绘图。已有组件做过较多样式定制时,需要逐个对照这些差异。
截至 2026 年 11 月 4 日,文档明确说明 Notebook 是浅色主题,尚未提供对应的深色主题;不能仅加一个 .dark 类就期待整套纸张、笔色和阴影自动完成切换。项目依赖现代浏览器的 :has()、SVG 裁切和混合模式,旧版运行环境也应先验证。
纸张与贴纸很适合笔记、学习内容和有个人气质的轻量应用。数据密集的后台,则更需要控制视觉噪声:可以尝试 InkProvider 的 density="calm",使用更细的轮廓并减少抖动,把层次留给内容。是否整体采用它,主要看产品是否需要这套纸面表达,以及现有技术栈是否符合要求。
许可与项目状态
Looseleaf 的代码、图形素材和 Kevin Sans 使用 MIT 许可证,随附的 IBM Plex Mono 使用 SIL OFL 1.1。复用、修改或分发时,需要保留对应的版权及许可声明,不能把所有随附字体都按同一种许可处理。
本次核验时仓库尚未发布 GitHub Release,组件主要通过 registry 获取,最近一次提交为 2026 年 11 月 1 日。本文查看了官方文档和在线预览,未在独立业务项目中安装验证;需要接入时,以自己的框架、已有组件和样式改动作为验收对象。
项目与示例入口
- GitHub:kevintngo/looseleaf
- 官方文档与组件预览:https://kevintngo.github.io/looseleaf/
- 安装指南:https://kevintngo.github.io/looseleaf/#/getting-started
- 组合区块:https://kevintngo.github.io/looseleaf/#/blocks