Item 1
First grid item
Item 2
Second grid item
import { Grid, GridItem, Surface, Text } from "@cloudflare/kumo";
export function GridDemo() {
return (
<Grid variant="2up" gap="base">
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 1</Text>
<div className="mt-1">
<Text variant="secondary">First grid item</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 2</Text>
<div className="mt-1">
<Text variant="secondary">Second grid item</Text>
</div>
</Surface>
</GridItem>
</Grid>
);
}安装
import { Grid, GridItem } from "@cloudflare/kumo";Grid 变体
Grid 组件支持跨断点自适应响应的多种多列布局。
variant="2up"
1
2
variant="3up"
1
2
3
variant="4up"
1
2
3
4
import { Grid, GridItem, Surface, Text } from "@cloudflare/kumo";
export function GridVariantsDemo() {
return (
<div className="flex flex-col gap-8">
<div>
<p className="mb-2 text-kumo-subtle">variant="2up"</p>
<Grid variant="2up" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">variant="3up"</p>
<Grid variant="3up" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>3</Text>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">variant="4up"</p>
<Grid variant="4up" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>3</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>4</Text>
</Surface>
</GridItem>
</Grid>
</div>
</div>
);
}不对称布局
对于侧边栏/主内容布局,可使用不对称变体。
variant="2-1" (66% / 33%)
Main Content
Two-thirds width
Sidebar
One-third width
variant="1-2" (33% / 66%)
Sidebar
One-third width
Main Content
Two-thirds width
import { Grid, GridItem, Surface, Text } from "@cloudflare/kumo";
export function GridAsymmetricDemo() {
return (
<div className="flex flex-col gap-8">
<div>
<p className="mb-2 text-kumo-subtle">variant="2-1" (66% / 33%)</p>
<Grid variant="2-1" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Main Content</Text>
<div className="mt-1">
<Text variant="secondary">Two-thirds width</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Sidebar</Text>
<div className="mt-1">
<Text variant="secondary">One-third width</Text>
</div>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">variant="1-2" (33% / 66%)</p>
<Grid variant="1-2" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Sidebar</Text>
<div className="mt-1">
<Text variant="secondary">One-third width</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Main Content</Text>
<div className="mt-1">
<Text variant="secondary">Two-thirds width</Text>
</div>
</Surface>
</GridItem>
</Grid>
</div>
</div>
);
}间距大小
通过 gap 属性控制网格项之间的间距。
gap="none"
1
2
gap="sm"
1
2
gap="base" (default, responsive)
1
2
gap="lg"
1
2
import { Grid, GridItem, Surface, Text } from "@cloudflare/kumo";
export function GridGapDemo() {
return (
<div className="flex flex-col gap-8">
<div>
<p className="mb-2 text-kumo-subtle">gap="none"</p>
<Grid variant="side-by-side" gap="none">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">gap="sm"</p>
<Grid variant="side-by-side" gap="sm">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">
gap="base" (default, responsive)
</p>
<Grid variant="side-by-side" gap="base">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
</Grid>
</div>
<div>
<p className="mb-2 text-kumo-subtle">gap="lg"</p>
<Grid variant="side-by-side" gap="lg">
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>1</Text>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4 text-center">
<Text>2</Text>
</Surface>
</GridItem>
</Grid>
</div>
</div>
);
}移动端分隔线
可以使用 mobileDivider 属性在移动端各项目之间添加分隔线(仅适用于 4up 变体)。
Item 1
Has divider on mobile
Item 2
Has divider on mobile
Item 3
Has divider on mobile
Item 4
Has divider on mobile
import { Grid, GridItem, Surface, Text } from "@cloudflare/kumo";
export function GridMobileDividerDemo() {
return (
<Grid variant="4up" gap="base" mobileDivider>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 1</Text>
<div className="mt-1">
<Text variant="secondary">Has divider on mobile</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 2</Text>
<div className="mt-1">
<Text variant="secondary">Has divider on mobile</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 3</Text>
<div className="mt-1">
<Text variant="secondary">Has divider on mobile</Text>
</div>
</Surface>
</GridItem>
<GridItem>
<Surface className="rounded-lg p-4">
<Text bold>Item 4</Text>
<div className="mt-1">
<Text variant="secondary">Has divider on mobile</Text>
</div>
</Surface>
</GridItem>
</Grid>
);
}全部变体
可用网格变体一览:
| 变体 | 描述 |
|---|---|
2up | 移动端 1 列,中屏及以上 2 列 |
side-by-side | 始终 2 列 |
2-1 | 中屏及以上按 66%/33% 分栏 |
1-2 | 中屏及以上按 33%/66% 分栏 |
1-3up | 移动端 1 列,大屏及以上 3 列 |
3up | 移动端 1 列、中屏 2 列、大屏 3 列 |
4up | 渐进式:1 → 2 → 3 → 4 列 |
6up | 移动端 2 列,XL 屏最多 6 列 |
1-2-4up | 移动端 1 列、中屏 2 列、大屏 4 列 |
API 参考
Grid
| Prop | Type | Default | Description |
|---|---|---|---|
| children | ReactNode | - | Grid items to render. |
| className | string | - | Additional CSS classes merged via `cn()`. |
| id | string | - | - |
| lang | string | - | - |
| title | string | - | - |
| mobileDivider | boolean | - | Show dividers between grid items on mobile (only works with `"4up"` variant). |
| gap | "none" | "sm" | "base" | "lg" | "base" | Gap size between grid items. - `"none"` — No gap - `"sm"` — 12px gap - `"base"` — Responsive gap (8px → 24px → 32px) - `"lg"` — 32px gap |
| variant | "2up" | "side-by-side" | "2-1" | "1-2" | "1-3up" | "3up" | "4up" | "6up" | "1-2-4up" | - | Responsive column layout variant. - `"2up"` — 1 col → 2 cols at md - `"side-by-side"` — Always 2 cols - `"2-1"` — 66%/33% split at md - `"1-2"` — 33%/66% split at md - `"3up"` — 1 → 2 → 3 cols - `"4up"` — 1 → 2 → 3 → 4 cols - `"6up"` — 2 → 3 → 4 → 6 cols - `"1-2-4up"` — 1 → 2 → 4 cols |
GridItem
GridItem 是网格子项的包装组件。它接受标准 div 属性,包括 className 和 children。