cherry-studio/packages/ui
Phantom 5ac09d5311
refactor: migrate to toast from antd message (#10233)
* style(eslint): reorganize eslint config comments and rules

Move comments to consistent positions above their corresponding rules
Update antd import restriction to include 'message' component

* fix(eslint): reorganize eslint config to enable custom rules

* fix(eslint): update antd import restriction to include message

Prevent direct imports of both Flex and message from antd, enforcing usage of custom components

* feat(migration): add toast utilities to migrate and test apps

Initialize toast utilities on window object for both migration and test applications to enable toast notifications

* build(ui): add path aliases for types and utils modules

* refactor(toast): move toast utilities to ui package for better reusability

Centralize toast utilities in the @cherrystudio/ui package to improve code organization and reuse across multiple components. This change includes:
- Moving toast implementation to ui package
- Updating all imports to use the new location
- Adding proper type definitions

* refactor: replace antd message with window.toast for consistency

Replace all instances of antd's message component with window.toast throughout the application to maintain consistent notification behavior. Also add an ignore rule for dataRefactorTest files in eslint config.
2025-09-20 16:58:41 +08:00
..
.storybook feat(ui): integrate @storybook/addon-themes and enhance CustomCollapse component 2025-09-17 14:53:34 +08:00
src refactor: migrate to toast from antd message (#10233) 2025-09-20 16:58:41 +08:00
stories style(Selector.stories): simplify Selector component stories by condensing JSX structure 2025-09-17 18:33:14 +08:00
.gitignore feat: update UI package with Storybook integration and Tailwind CSS v4 configuration 2025-09-15 19:26:23 +08:00
MIGRATION_STATUS_EN.md refactor: migrate Flex from antd to custom Flex component (#10083) 2025-09-17 18:17:17 +08:00
MIGRATION_STATUS.md refactor: migrate Flex from antd to custom Flex component (#10083) 2025-09-17 18:17:17 +08:00
package.json Merge remote-tracking branch 'origin/main' into v2 2025-09-17 18:37:22 +08:00
README.md feat: update UI package with Storybook integration and Tailwind CSS v4 configuration 2025-09-15 19:26:23 +08:00
tsconfig.json refactor: migrate to toast from antd message (#10233) 2025-09-20 16:58:41 +08:00
tsdown.config.ts refactor(ui): update migration status and enhance component implementations 2025-09-16 19:20:04 +08:00

@cherrystudio/ui

Cherry Studio UI 组件库 - 为 Cherry Studio 设计的 React 组件集合

特性

  • 🎨 基于 Tailwind CSS 的现代化设计
  • 📦 支持 ESM 和 CJS 格式
  • 🔷 完整的 TypeScript 支持
  • 🚀 可以作为 npm 包发布
  • 🔧 开箱即用的常用 hooks 和工具函数

安装

# 安装组件库
npm install @cherrystudio/ui

# 安装必需的 peer dependencies
npm install @heroui/react framer-motion react react-dom tailwindcss

配置

1. Tailwind CSS v4 配置

本组件库使用 Tailwind CSS v4配置方式已改变。在你的主 CSS 文件(如 src/styles/tailwind.css)中:

@import 'tailwindcss';

/* 必须扫描组件库文件以提取类名 */
@source '../node_modules/@cherrystudio/ui/dist/**/*.{js,mjs}';

/* 你的应用源文件 */
@source './src/**/*.{js,ts,jsx,tsx}';

/*
 * 如果你的应用直接使用 HeroUI 组件,需要添加:
 * @source '../node_modules/@heroui/theme/dist/**/*.{js,ts,jsx,tsx}';
 * @plugin '@heroui/react/plugin';
 */

/* 自定义主题配置(可选) */
@theme {
  /* 你的主题扩展 */
}

注意Tailwind CSS v4 不再使用 tailwind.config.js 文件,所有配置都在 CSS 中完成。

2. Provider 配置

在你的 App 根组件中添加 HeroUI Provider

import { HeroUIProvider } from '@heroui/react'

function App() {
  return (
    <HeroUIProvider>
      {/* 你的应用内容 */}
    </HeroUIProvider>
  )
}

使用

基础组件

import { Button, Input } from '@cherrystudio/ui'

function App() {
  return (
    <div>
      <Button variant="primary" size="md">
        点击我
      </Button>
      <Input
        type="text"
        placeholder="请输入内容"
        onChange={(value) => console.log(value)}
      />
    </div>
  )
}

分模块导入

// 只导入组件
import { Button } from '@cherrystudio/ui/components'

// 只导入 hooks
import { useDebounce, useLocalStorage } from '@cherrystudio/ui/hooks'

// 只导入工具函数
import { cn, formatFileSize } from '@cherrystudio/ui/utils'

开发

# 安装依赖
yarn install

# 开发模式(监听文件变化)
yarn dev

# 构建
yarn build

# 类型检查
yarn type-check

# 运行测试
yarn test

目录结构

src/
├── components/          # React 组件
│   ├── Button/         # 按钮组件
│   ├── Input/          # 输入框组件
│   └── index.ts        # 组件导出
├── hooks/              # React Hooks
├── utils/              # 工具函数
├── types/              # 类型定义
└── index.ts            # 主入口文件

组件列表

Button 按钮

支持多种变体和尺寸的按钮组件。

Props:

  • variant: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'
  • size: 'sm' | 'md' | 'lg'
  • loading: boolean
  • fullWidth: boolean
  • leftIcon / rightIcon: React.ReactNode

Input 输入框

带有错误处理和密码显示切换的输入框组件。

Props:

  • type: 'text' | 'password' | 'email' | 'number'
  • error: boolean
  • errorMessage: string
  • onChange: (value: string) => void

Hooks

useDebounce

防抖处理,延迟执行状态更新。

useLocalStorage

本地存储的 React Hook 封装。

useClickOutside

检测点击元素外部区域。

useCopyToClipboard

复制文本到剪贴板。

工具函数

cn(...inputs)

基于 clsx 的类名合并工具,支持条件类名。

formatFileSize(bytes)

格式化文件大小显示。

debounce(func, delay)

防抖函数。

throttle(func, delay)

节流函数。

许可证

MIT