Installation
@cloudflare/kumo

NPM 注册表

@cloudflare/kumo 包发布在公共 npm 注册表上,安装时无需任何特殊配置。

安装包

使用你偏好的包管理器安装 Kumo。当前版本为 v2.13.2

npm

npm install @cloudflare/kumo

pnpm

pnpm add @cloudflare/kumo

yarn

yarn add @cloudflare/kumo

对等依赖

Kumo 需要以下对等依赖。大多数 React 项目通常已经安装了这些依赖:

# Required peer dependencies
pnpm add react react-dom @phosphor-icons/react

导入组件

可以从主包导入组件,或使用细粒度导入以获得更好的 tree-shaking 效果:

主包导入

import { Button, Input, LayerCard } from "@cloudflare/kumo";

细粒度导入(推荐)

import { Button } from "@cloudflare/kumo/components/button";
import { Input } from "@cloudflare/kumo/components/input";

Base UI 原语

Kumo 基于 Base UI 构建,这是一个提供无样式、可访问特性的 React 组件库。如果你需要在高级场景中访问底层原语,Kumo 通过 barrel 导入和细粒度导入两种方式重新导出了全部 37 个 Base UI 组件:

Barrel 导入(更方便)

// Import multiple primitives at once
import { Popover, Slider, Accordion } from "@cloudflare/kumo/primitives";

细粒度导入(性能优先,推荐)

// Import individual primitives for better tree-shaking
import { Popover } from "@cloudflare/kumo/primitives/popover";
import { Slider } from "@cloudflare/kumo/primitives/slider";
import { Accordion } from "@cloudflare/kumo/primitives/accordion";

细粒度导入只包含你实际用到的原语,从而减小打包体积。

可用的原语(共 37 个): 布局 · Accordion, Collapsible, Separator, ScrollArea, Toolbar — 浮层 · AlertDialog, Dialog, Popover, PreviewCard, Tooltip, Toast — 菜单 · Menu, Menubar, ContextMenu, NavigationMenu — 表单控件 · Autocomplete, Button, Checkbox, CheckboxGroup, Combobox, Input, NumberField, Radio, RadioGroup, Select, Slider, Switch, Toggle, ToggleGroup — 表单结构 · Field, Fieldset, Form — 展示 · Avatar, Meter, Progress, Tabs

注意: 在有可用的 Kumo 样式组件时应优先使用它们。原语主要用于构建 Kumo 中尚未提供的自定义组件,或者需要精细控制样式和行为的场景。

导入样式

Kumo 根据你的项目配置提供两种 CSS 分发方式:

使用 Tailwind CSS(推荐)

如果你的应用使用 Tailwind CSS,请将 Kumo 的源文件加入内容配置并导入样式。导入顺序很重要 — Kumo 样式必须位于 @import "tailwindcss" 之前,这样才能先注册 Kumo 的主题令牌:

重要: Tailwind CSS v4 默认不会扫描 node_modules/。你必须添加 @source 指令,这样 Tailwind 才能发现 Kumo 组件使用的工具类。否则组件 可能以缺少样式的方式渲染(例如 Dialog 未居中)。

/* app.css or main.css */
@source "../node_modules/@cloudflare/kumo/dist/**/*.{js,jsx,ts,tsx}";
@import "@cloudflare/kumo/styles/tailwind";
@import "tailwindcss";

/* Your custom styles */

@source 路径是相对于你的 CSS 文件的。请根据你的项目结构调整 — 例如, 如果你的 CSS 位于 src/styles/,可能需要写成 ../../node_modules/@cloudflare/kumo/dist/**/*.{"{"}js,jsx,ts,tsx{"}"}

注意:你也可以使用默认导出 @cloudflare/kumo/styles,它等价于 styles/tailwind

不使用 Tailwind(独立构建)

如果你的应用不使用 Tailwind CSS,请使用已包含全部编译样式的独立构建:

// In your app entry point (e.g., main.tsx, index.tsx)
import "@cloudflare/kumo/styles/standalone";

独立构建预编译了所有 Tailwind 工具类和 Kumo 组件样式,无需进行任何 Tailwind 配置!

隔离应用根节点

Kumo 的浮层组件(SelectComboboxDropdownPopoverTooltipDialog 等)会通过 portal 把弹层渲染到 document.body 末尾。由于 Kumo 不会给这些弹层设置 z-index,你布局中任何正的 z-index(例如吸顶头部)都可能盖在打开的弹层之上。

为避免这种情况,请按 Base UI 的建议,给应用根元素添加 isolation: isolate

/* The element that wraps your entire app, e.g. #root or #app */
.root {
  isolation: isolate;
}

或者使用 Tailwind:

<div id="root" className="isolate">
  {/* Your app */}
</div>

这会为应用内容创建独立的层叠上下文,因此无论布局中使用什么 z-index 值,通过 portal 渲染的弹层始终显示在最顶层。请将此属性应用到包裹应用内容的元素上,而不是 <body> — 隔离 body 会让 portal 落入同一层叠上下文,从而失去效果。

如果你需要用 z-index 才能让 Kumo 弹层显示在你的界面之上,这说明某些 地方出了问题。解决办法几乎总是像上面那样隔离应用根节点,而不是提高弹层 的 z-index,或针对 Base UI 的内部 data 属性做处理。

使用示例

下面是一个结合 Tailwind CSS 使用 Kumo 组件的完整示例:

CSS 文件(app.css)

@source "../node_modules/@cloudflare/kumo/dist/**/*.{js,jsx,ts,tsx}";
@import "@cloudflare/kumo/styles/tailwind";
@import "tailwindcss";

注意:@source 路径是相对于你的 CSS 文件的,请根据你的项目结构调整。

组件文件(App.tsx)

import { Button, Input, LayerCard } from "@cloudflare/kumo";
import "./app.css";

export default function App() {
  return (
    <LayerCard className="rounded-lg p-6">
      <h1 className="mb-4 text-2xl font-bold">Welcome to Kumo</h1>
      <Input placeholder="Enter your name..." className="mb-4" />
      <Button variant="primary">Submit</Button>
    </LayerCard>
  );
}

块与组件

Kumo 为你的应用提供两种构建单元:

组件(NPM 导出)

组件以 NPM 导出的形式发布,可以直接从包中导入。它们是核心 UI 原语,例如 ButtonInputDialog

import { Button, Input, Dialog } from "@cloudflare/kumo";

当你需要与你的应用无缝集成、样式一致且预置的 UI 原语时,请使用组件。组件有版本管理、支持 tree-shaking,并会自动更新。

块(通过 CLI 安装)

块是更高级的组合(例如 PageHeaderResourceListPage),通过 Kumo CLI 安装。块把代码完全交给你,你可以根据自己的需求自由定制。


# Initialize Kumo configuration

npx @cloudflare/kumo init

# List available blocks

npx @cloudflare/kumo blocks

# Install a block

npx @cloudflare/kumo add PageHeader

安装后,块位于你的项目中(例如 src/components/kumo/),可按需定制。CLI 会自动把相对路径的导入转换为 @cloudflare/kumo,实现无缝集成。

import { PageHeader } from "src/components/kumo/page-header/page-header";
什么时候使用块:
  • 你需要超出 props 范围的定制
  • 你想完全掌控实现方式
  • 你在构建特定于应用的布局
  • 某些代码你更倾向于复制粘贴而不是依赖包

工具函数

Kumo 还导出了一些用于常见场景的工具函数:

import { cn, safeRandomId, LinkProvider } from "@cloudflare/kumo";

// Merge class names with Tailwind
const className = cn("base-class", condition && "conditional-class");

// Generate safe random IDs
const id = safeRandomId();

// Configure link component for your framework (maps href to your router)
<LinkProvider component={YourAppLink}>{/* Your app */}</LinkProvider>;