@datum-cloud/datum-ui

中文文档
3.11.0发布于 2026/11/10MITTypeScriptES Module构建来源已验证近 30 天下载 6193
原始使用文档
文档目录29 节
  1. Install
  2. Requirements
  3. Setup
  4. 1. Import Styles
  5. 2. Add ThemeProvider
  6. Imports
  7. Shared Exports
  8. Grouped Exports
  9. Components
  10. Base Components
  11. Feature Components
  12. Usage Examples
  13. Avatar
  14. Button
  15. Typography
  16. Form with Validation
  17. Map
  18. Dialog
  19. Toast
  20. Task Queue
  21. Theming
  22. Peer Dependencies
  23. Required
  24. Optional (Component-Specific)
  25. Form Adapters
  26. Tech Stack
  27. Links
  28. License
  29. Optional: Canela font

@datum-cloud/datum-ui

Datum Cloud's React design system and component library. Themed, composable components built on shadcn/ui, Radix UI, and Tailwind CSS v4.

Install

npm install @datum-cloud/datum-ui
# or
yarn add @datum-cloud/datum-ui
# or
pnpm add @datum-cloud/datum-ui
# or
bun add @datum-cloud/datum-ui

Requirements

  • React 19
  • Tailwind CSS v4.0.7+ (v4.2.1+ recommended)

Setup

1. Import Styles

Add datum-ui styles to your CSS file, after Tailwind:

/* app.css */
@import 'tailwindcss';
@import '@datum-cloud/datum-ui/styles';

/* Optional — import only if you use these components */
@import '@datum-cloud/datum-ui/grid';
@import '@datum-cloud/datum-ui/nprogress';

datum-ui ships uncompiled CSS that is processed by your Tailwind build in a single pass. The styles import automatically configures Tailwind to scan datum-ui's components for class usage via @source, so utilities like bg-primary and text-foreground work out of the box.

2. Add ThemeProvider

Wrap your app with ThemeProvider for light/dark/system theme switching:

import { ThemeProvider } from '@datum-cloud/datum-ui/theme'

function App() {
  return (
    <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
      {/* your app */}
    </ThemeProvider>
  )
}

Imports

Each component has its own subpath export. Import only what you need:

import { Button } from '@datum-cloud/datum-ui/button'
import { Dialog } from '@datum-cloud/datum-ui/dialog'
import { Form, FormField, FormInput } from '@datum-cloud/datum-ui/form'

This keeps your bundle small. Some components require additional dependencies — check the component tables below for what to install.

Shared Exports

Import PathDescription
@datum-cloud/datum-uiRoot barrel — every component except the subpath-only picker family (./picker, ./date-picker); requires all peer deps
@datum-cloud/datum-ui/stylesCore CSS (fonts, tokens, theme variables, component styles)
@datum-cloud/datum-ui/gridGrid system CSS (optional — import if using Grid component)
@datum-cloud/datum-ui/nprogressNProgress CSS (optional — import if using NProgress component)
@datum-cloud/datum-ui/themeTheme utilities and types
@datum-cloud/datum-ui/hooksuseCopyToClipboard, useDebounce
@datum-cloud/datum-ui/iconsCloseIcon, IconWrapper, SpinnerIcon
@datum-cloud/datum-ui/utilscn (className merge utility)

Grouped Exports

Some components with shared heavy dependencies are grouped under a single subpath:

Import PathIncludesRequired Dependencies
@datum-cloud/datum-ui/pickerPicker.*, DateTimeRangePicker, DatePicker, DateRangePicker, TimePickerdate-fns, date-fns-tz
@datum-cloud/datum-ui/date-pickerCalendarDatePicker, TimeRangePicker (compat alias)react-day-picker, date-fns, date-fns-tz
@datum-cloud/datum-ui/mapMap, PlaceAutocomplete, + map controlsleaflet, react-leaflet, + leaflet plugins
@datum-cloud/datum-ui/dropzoneDropzone, FileInputButtonreact-dropzone
@datum-cloud/datum-ui/chartChartContainer, ChartTooltip, etc.recharts
@datum-cloud/datum-ui/formForm, FormField, FormInput, etc.See Form Adapters below

Components

Base Components

Thin wrappers around shadcn/Radix primitives with Datum styling. Radix UI dependencies are bundled — no additional installation required for these components.

ComponentAdditional DependenciesDescription
Alert, AlertTitle, AlertDescription—Status alert banners
Avatar, AvatarImage, AvatarFallback—User profile image with fallback support
Badge—Labels and status indicators with type and theme variants
Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbSeparator, BreadcrumbList, BreadcrumbPage, BreadcrumbEllipsis—Navigation breadcrumbs
Button—Button with type (primary/secondary/danger/warning/success) and theme (solid/outline/ghost/link) variants
ButtonGroup—Group buttons horizontally
Calendarreact-day-pickerDate picker calendar
Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter—Content container
Chart (ChartContainer, ChartTooltip, etc.)rechartsData visualization wrapper
Checkbox—Toggle checkbox
Collapsible, CollapsibleTrigger, CollapsibleContent—Expandable sections
Command, CommandInput, CommandList, CommandItem, CommandGroup—Command palette / search
Dialog, DialogTrigger, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, DialogClose—Modal dialog
HoverCard, HoverCardTrigger, HoverCardContent—Hover-triggered popover
Input—Text input
InputGroup, InputGroupInput, InputGroupText—Input with prefix/suffix elements
Label—Form label
Map, MapTileLayer, MapMarker, MapPopup, MapTooltip, MapZoomControl, MapFullscreenControl, MapLayers, MapLayersControl, MapLayerGroup, MapCircle, MapPolygon, MapRectangle, MapPolyline, MapDrawControl, MapDrawMarker, MapDrawPolyline, MapDrawCircle, MapDrawPolygon, MapDrawEdit, MapDrawDelete, MapDrawUndo, MapLocateControl, MapSearchControl, MapControlContainerleaflet, react-leaflet, leaflet-draw, leaflet.fullscreen, leaflet.markercluster, react-leaflet-markerclusterInteractive map (SSR-safe, lazy-loaded)
PlaceAutocomplete—Google Places address autocomplete
Popover, PopoverTrigger, PopoverContent—Click-triggered popover
RadioGroup, RadioGroupItem—Radio button group
Select, SelectTrigger, SelectContent, SelectItem, SelectValue, SelectGroup, SelectLabel, SelectSeparator—Dropdown select
Separator—Visual divider
Sheet, SheetTrigger, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter, SheetClose—Slide-out panel
Skeleton—Loading placeholder
Spinner—Loading spinner
Switch—Toggle switch
Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption—Data table
Tabs, TabsList, TabsTrigger, TabsContent—Tabbed interface
Textarea—Multi-line text input
Tooltip, TooltipTrigger, TooltipContent, TooltipProvider—Hover tooltip
Title, Text, Paragraph, Link, List, ListItem, Blockquote, Code—Typography components with level, size, weight, color, type variants
VisuallyHidden—Screen-reader only content

Feature Components

Complex, fully-customized components with significant business logic.

Each component's tree-shakeable subpath is the kebab-case of its directory, e.g. @datum-cloud/datum-ui/multi-select, @datum-cloud/datum-ui/app-navigation, @datum-cloud/datum-ui/grouped-table. The picker family lives under @datum-cloud/datum-ui/picker (see Grouped Exports).

ComponentAdditional DependenciesDescription
Autocomplete—Search autocomplete input
Autosearch—Search-first input with async results
AvatarStack—Stacked avatar display
CalendarDatePickerreact-day-picker, date-fnsDate/range picker with presets
CodeEditor, CodeEditorTabs@monaco-editor/react, monaco-editorMonaco-based code editor with VS Code UX
DataTable, DataTableColumnHeader, DataTablePagination, DataTableToolbar, DataTableViewOptions@tanstack/react-tableAdvanced data table with sorting/filtering
DateTimePicker, TimePickerdate-fns, date-fns-tzDate/time picker with timezone support
Dropdown, DropdownHeader, DropdownItem, DropdownSection—Dropdown menu
Dropzonereact-dropzoneFile drag-and-drop upload area
EmptyContent—Empty state placeholder
FileInputButton—File upload button
Form, FormField, FormInput, FormTextarea, FormSelect, FormCombobox (Form.Combobox), FormCheckbox, FormSwitch, FormRadioGroup, FormFieldArraySee Form Adapters belowForm system with pluggable adapter support. Form.Combobox is the searchable single-select field (delegates to Autocomplete)
Grid@tanstack/react-virtualVirtualized data grid
InputNumberreact-number-formatNumeric input with formatting
InputWithAddons—Input with prefix/suffix addons
LoaderOverlay—Full-screen loading overlay
MoreActions—Three-dot actions menu
NProgressnprogressPage navigation progress bar
PageTitle—Page header with breadcrumbs
Sidebar, SidebarHeader, SidebarContent, SidebarFooter, SidebarMenu, SidebarMenuItem, SidebarMenuButton—App sidebar navigation
Stepper@stepperize/reactMulti-step wizard
TagInput—Tag/chip input
TaskQueue, TaskQueueProvider, TaskQueueDropdown, TaskPanelHeader, TaskSummaryDialog—Background task queue with progress UI
TimeRangePickerdate-fns, date-fns-tzTime range selector with timezone support
Transfer—Dual-panel item selector with search
Toast, Toaster, useToastsonnerToast notifications
AppNavigation (@datum-cloud/datum-ui/app-navigation)—Application navigation menu
Logo (@datum-cloud/datum-ui/logo, themed via /logo/themed)—Datum logo (plain and theme-aware)
MultiSelect (@datum-cloud/datum-ui/multi-select)—Multi-value select with search
GroupedTable (@datum-cloud/datum-ui/grouped-table)@tanstack/react-tableTable with collapsible row groups
RichTextEditor (@datum-cloud/datum-ui/rich-text-editor)@tiptap/react, @tiptap/starter-kitTipTap-based rich text editor
Picker, DateTimeRangePicker, DateRangePicker, DatePicker, DateRangeTimePicker (@datum-cloud/datum-ui/picker)date-fns, date-fns-tzComposable date/time picker family (subpath-only)

Usage Examples

Avatar

import { Avatar, AvatarImage, AvatarFallback } from '@datum-cloud/datum-ui/avatar'

// With image and fallback
<Avatar>
  <AvatarImage src="https://example.com/avatar.jpg" alt="User Name" />
  <AvatarFallback>UN</AvatarFallback>
</Avatar>

// Custom size
<Avatar className="size-16">
  <AvatarImage src="https://example.com/avatar.jpg" alt="User Name" />
  <AvatarFallback className="text-lg">UN</AvatarFallback>
</Avatar>

// Fallback only (no image)
<Avatar>
  <AvatarFallback>AB</AvatarFallback>
</Avatar>

Button

import { Button } from '@datum-cloud/datum-ui/button'

// Variants: type × theme
<Button type="primary" theme="solid">Save</Button>
<Button type="danger" theme="outline">Delete</Button>
<Button type="secondary" theme="ghost">Cancel</Button>

Typography

import { Title, Text, Paragraph, Code } from '@datum-cloud/datum-ui/typography'

<Title level={1}>Page Title</Title>
<Title level={3} color="primary">Section</Title>
<Text size="sm" color="secondary">Subtitle text</Text>
<Paragraph>Body paragraph with default styling.</Paragraph>
<Code copyable>npm install @datum-cloud/datum-ui</Code>

Form with Validation

The form system uses a pluggable adapter pattern. Wrap your app with an adapter, then use Form.* components as usual:

import { Form } from '@datum-cloud/datum-ui/form'
import { ConformAdapter } from '@datum-cloud/datum-ui/form/adapters/conform'
// or: import { RHFAdapter } from '@datum-cloud/datum-ui/form/adapters/rhf'
import { z } from 'zod'

const schema = z.object({
  name: z.string().min(1, 'Name is required'),
  role: z.enum(['admin', 'user']),
})

// Wrap your app once with an adapter
function App() {
  return (
    <ConformAdapter>
      <MyForm />
    </ConformAdapter>
  )
}

// Form code is identical regardless of adapter
function MyForm() {
  return (
    <Form.Root schema={schema} onSubmit={handleSubmit}>
      <Form.Field name="name" label="Name" required>
        <Form.Input />
      </Form.Field>
      <Form.Field name="role" label="Role" required>
        <Form.Select placeholder="Select a role">
          <Form.SelectItem value="admin">Admin</Form.SelectItem>
          <Form.SelectItem value="user">User</Form.SelectItem>
        </Form.Select>
      </Form.Field>
      <Form.Submit>Save</Form.Submit>
    </Form.Root>
  )
}

Map

import {
  Map, MapTileLayer, MapMarker, MapPopup, MapZoomControl,
} from '@datum-cloud/datum-ui/map'

<div className="h-[500px] w-full">
  <Map center={[51.505, -0.09]} zoom={13}>
    <MapTileLayer />
    <MapZoomControl position="topright" />
    <MapMarker position={[51.505, -0.09]}>
      <MapPopup>Hello from London!</MapPopup>
    </MapMarker>
  </Map>
</div>

Dialog

import {
  Dialog, DialogTrigger, DialogContent,
  DialogHeader, DialogTitle, DialogDescription,
} from '@datum-cloud/datum-ui/dialog'

<Dialog>
  <DialogTrigger asChild>
    <Button>Open</Button>
  </DialogTrigger>
  <DialogContent>
    <DialogHeader>
      <DialogTitle>Confirm</DialogTitle>
      <DialogDescription>Are you sure?</DialogDescription>
    </DialogHeader>
  </DialogContent>
</Dialog>

Toast

import { ThemeProvider } from '@datum-cloud/datum-ui/theme'
import { Toaster, useToast } from '@datum-cloud/datum-ui/toast'

function App() {
  return (
    <ThemeProvider attribute="class" defaultTheme="system" enableSystem>
      <Toaster />
      <MyComponent />
    </ThemeProvider>
  )
}

function MyComponent() {
  const { toast } = useToast()
  return <Button onClick={() => toast.success('Saved!')}>Save</Button>
}

Task Queue

import {
  TaskQueueProvider, TaskQueueDropdown, useTaskQueue,
} from '@datum-cloud/datum-ui/task-queue'

<TaskQueueProvider config={{ concurrency: 3 }}>
  <TaskQueueDropdown />
  <MyComponent />
</TaskQueueProvider>

function MyComponent() {
  const { enqueue } = useTaskQueue()

  const handleUpload = () => {
    enqueue({
      id: 'upload-1',
      label: 'Uploading file.pdf',
      run: async () => { /* upload logic */ },
    })
  }

  return <Button onClick={handleUpload}>Upload</Button>
}

Theming

ThemeProvider supports light, dark, and system theme modes:

import { ThemeProvider } from '@datum-cloud/datum-ui/theme'

<ThemeProvider attribute="class" defaultTheme="system" enableSystem>
  {children}
</ThemeProvider>

Access the current theme:

import { useTheme } from '@datum-cloud/datum-ui/theme'

const { theme, setTheme, resolvedTheme } = useTheme()

Peer Dependencies

Required

These dependencies are required to use datum-ui:

npm install react react-dom tailwindcss lucide-react
  • React 19+ and React DOM 19+: Framework requirements
  • Tailwind CSS v4 (v4.0.7+, v4.2.1+ recommended): Required for styling
  • lucide-react: Icon library used throughout components

All Radix UI packages are bundled — you don't need to install them separately.

Optional (Component-Specific)

Many components require additional packages. Install only what you use:

Replace npm install with yarn add, pnpm add, or bun add for your package manager.

# Forms — Conform adapter
npm install @conform-to/react @conform-to/zod zod

# Forms — React Hook Form adapter (alternative)
npm install react-hook-form @hookform/resolvers zod

# Maps (Map, MapMarker, MapPopup, etc.)
npm install leaflet react-leaflet leaflet-draw leaflet.fullscreen leaflet.markercluster react-leaflet-markercluster

# Charts (ChartContainer, ChartTooltip, etc.)
npm install recharts

# Code editor (CodeEditor, CodeEditorTabs)
npm install @monaco-editor/react monaco-editor

# Date pickers (Calendar, CalendarDatePicker, TimeRangePicker)
npm install react-day-picker date-fns date-fns-tz

# File upload (Dropzone)
npm install react-dropzone

# Number formatting (InputNumber)
npm install react-number-format

# Stepper (multi-step flows)
npm install @stepperize/react

# Toast notifications (Toast, Toaster)
npm install sonner

# Progress bar (NProgress)
npm install nprogress

# Data grid (Grid - virtualized tables)
npm install @tanstack/react-virtual

# Data Table (DataTable component)
npm install @tanstack/react-table

# Data Table with URL state (optional)
npm install nuqs

# Animations (motion components)
npm install motion

Form Adapters

The form system supports pluggable adapters. Choose one and wrap your app:

AdapterImport PathDependencies
Conform.js@datum-cloud/datum-ui/form/adapters/conform@conform-to/react, @conform-to/zod, zod (>=4)
React Hook Form@datum-cloud/datum-ui/form/adapters/rhfreact-hook-form (>=7.55), @hookform/resolvers (>=5), zod (>=4)

The Form.* component API is identical with either adapter. Switch adapters by changing only the root provider -- no form code changes needed.

See the Form README for detailed documentation.

Tech Stack

  • React 19 with server component support
  • Tailwind CSS v4 (v4.0.7+) for styling — ships uncompiled CSS processed by consumer's build
  • Radix UI for accessible primitives
  • CVA (class-variance-authority) for variant-based component APIs
  • TypeScript — fully typed with exported types

License

MIT

Optional: Canela font

Datum-branded surfaces can opt into Canela Text for the font-title Tailwind utility:

import '@datum-cloud/datum-ui/styles/canela'

Consumers who do not import this file use the default system font stack declared in tokens — no visual degradation.

版本与发布记录

@datum-cloud/datum-ui 共发布 81 个版本,首次发布于 2026/02/19;过去 12 个月发布了 81 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
3.11.0latest2026/11/102 天前
3.10.02026/11/092 天前
3.8.02026/11/056 天前
3.7.12026/11/056 天前
3.7.02026/10/2418 天前
3.6.02026/10/2121 天前

其他发布通道:dev → 0.3.2-dev.5bd364b,alpha → 0.6.0-alpha.a37bf9a。

关于 @datum-cloud/datum-ui 的常见问题

如何安装 @datum-cloud/datum-ui?

在项目目录运行 npm install @datum-cloud/datum-ui,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:react(>=19.2.7 <20)、motion(>=13 <14)、react-dom(>=19.2.7 <20)、lucide-react(>=1 <2)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@datum-cloud/datum-ui 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@datum-cloud/datum-ui 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@datum-cloud/datum-ui 可以商用吗?

@datum-cloud/datum-ui 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@datum-cloud/datum-ui 的下载量有多少?

根据 npm 官方下载统计,@datum-cloud/datum-ui 在 2026/10/12 – 2026/11/10 这 30 天内被下载 6,193 次,日均约 206 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@datum-cloud/datum-ui 还在维护吗?

最新版本 3.11.0 发布于 2026/11/10(2 天前);至今共发布 81 个版本,其中过去 12 个月发布了 81 个;首次发布于 2026/02/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。