# RustUI A modern React component library. ## Install ```bash npm install rustui ``` ```bash pnpm add rustui ``` ```bash yarn add rustui ``` ## Usage ```tsx import { Button, Input, Modal } from 'rustui' import 'rustui/styles' function App() { return (
) } ``` ## Theme RustUI supports light and dark themes via `ConfigProvider`: ```tsx import { ConfigProvider } from 'rustui' function App() { return ( {/* your app content */} ) } ``` ## Components ### Common | Component | Description | |-----------|-------------| | `Button` | Button component with multiple variants and sizes | | `Icon` | Icon component with 100+ built-in icons | | `Typography` | Typography with Text, Title, Paragraph, Link | | `Affix` | Affix component to fix element on scroll | | `Anchor` | Anchor navigation with links | | `App` | App wrapper providing Message, Modal, Notification context | | `BackTop` | Back to top button | | `ConfigProvider` | Global configuration provider for theme and locale | | `FloatButton` | Floating action button with group support | | `Watermark` | Watermark overlay | ### Layout | Component | Description | |-----------|-------------| | `Layout` | Page layout with Header, Footer, Content, Sider | | `Divider` | Divider line | | `Flex` | Flexbox layout | | `HStack` | Horizontal stack layout | | `VStack` | Vertical stack layout | | `Row` / `Col` | Grid system with 24 columns | | `Masonry` | Masonry/waterfall layout | | `Space` | Consistent spacing between elements | | `Splitter` | Resizable split panels | | `Stack` | Stack layout | ### Navigation | Component | Description | |-----------|-------------| | `Breadcrumb` | Breadcrumb navigation | | `Dropdown` | Dropdown menu | | `Menu` | Navigation menu | | `Pagination` | Pagination controls | | `Steps` | Step-by-step navigation | | `Tabs` | Tabbed content | ### Data Entry | Component | Description | |-----------|-------------| | `Form` | Form with validation support | | `Input` | Text input with password and search variants | | `TextArea` | Multi-line text input | | `InputNumber` | Numeric input with step controls | | `AutoComplete` | Input with autocomplete suggestions | | `Select` | Dropdown selector | | `Cascader` | Cascading selector | | `TreeSelect` | Tree-structured selector | | `Checkbox` | Checkbox with group support | | `Radio` | Radio button with group support | | `Switch` | Toggle switch | | `Slider` | Slider input | | `Transfer` | Dual-list transfer | | `DatePicker` | Date picker | | `RangePicker` | Date range picker | | `TimePicker` | Time picker | | `Upload` | File upload with drag support | | `Rate` | Star rating | | `Mention` | @ mention input | ### Feedback | Component | Description | |-----------|-------------| | `Alert` | Alert banner | | `Drawer` | Side drawer panel | | `Message` | Global message toast | | `Modal` | Dialog modal | | `Notification` | Notification notification box | | `Popconfirm` | Popover confirmation | | `Progress` | Progress indicator | | `Result` | Result page | | `Skeleton` | Content placeholder skeleton | | `Spin` | Loading spinner | ### Display | Component | Description | |-----------|-------------| | `Avatar` / `AvatarGroup` | User avatar with group | | `Badge` / `BadgeRibbon` | Status badge and ribbon | | `Tag` / `CheckableTag` | Tag label | | `Tooltip` | Tooltip on hover | | `Popover` | Popover card | | `Card` / `CardGrid` / `CardMeta` | Content card | | `Empty` | Empty state placeholder | | `Statistic` / `StatisticTimer` | Statistic number display | | `Collapse` | Collapsible panels | | `Timeline` | Timeline display | | `Descriptions` | Key-value description list | | `Segmented` | Segmented control | | `Table` | Data table with sorting, filtering, selection | | `Tree` | Tree view | | `Carousel` | Image/content carousel | | `Image` / `ImagePreviewGroup` | Image with preview | | `Calendar` | Calendar view | | `QRCode` | QR code generator | | `Tour` | Guided tour | | `List` | Data list | ## API Reference ### Button | Prop | Type | Default | Description | |------|------|---------|-------------| | `variant` | `'primary' \| 'default' \| 'dashed' \| 'text' \| 'link'` | `'default'` | Button style variant | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Button size | | `disabled` | `boolean` | `false` | Whether the button is disabled | | `loading` | `boolean` | `false` | Show loading spinner | | `danger` | `boolean` | `false` | Danger style | | `block` | `boolean` | `false` | Full width button | | `icon` | `ReactNode` | - | Icon element | | `onClick` | `(e: MouseEvent) => void` | - | Click handler | ### Input | Prop | Type | Default | Description | |------|------|---------|-------------| | `value` | `string` | - | Input value (controlled) | | `defaultValue` | `string` | - | Default value | | `placeholder` | `string` | - | Placeholder text | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Input size | | `status` | `'default' \| 'error' \| 'warning'` | `'default'` | Validation status | | `disabled` | `boolean` | `false` | Whether the input is disabled | | `readOnly` | `boolean` | `false` | Read only | | `prefix` | `ReactNode` | - | Prefix icon/element | | `suffix` | `ReactNode` | - | Suffix icon/element | | `onChange` | `(e: ChangeEvent) => void` | - | Change handler | ### Modal | Prop | Type | Default | Description | |------|------|---------|-------------| | `open` | `boolean` | `false` | Whether the modal is visible | | `title` | `ReactNode` | - | Modal title | | `footer` | `ReactNode \| null` | - | Footer content, `null` to hide | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Modal size | | `closable` | `boolean` | `true` | Show close button | | `centered` | `boolean` | `false` | Vertically center the modal | | `mask` | `boolean` | `true` | Show mask overlay | | `maskClosable` | `boolean` | `true` | Close on mask click | | `keyboard` | `boolean` | `true` | Close on ESC key | | `confirmLoading` | `boolean` | `false` | Loading state for confirm button | | `okText` | `ReactNode` | - | Confirm button text | | `cancelText` | `ReactNode` | - | Cancel button text | | `onOk` | `(e: MouseEvent) => void` | - | Confirm handler | | `onCancel` | `(e: MouseEvent) => void` | - | Cancel handler | ### Form | Prop | Type | Default | Description | |------|------|---------|-------------| | `initialValues` | `Record` | - | Initial form values | | `onFinish` | `(values: Record) => void` | - | Submit handler (validation passed) | | `onFinishFailed` | `(errors: FormErrorInfo) => void` | - | Submit handler (validation failed) | | `layout` | `'horizontal' \| 'vertical' \| 'inline'` | `'horizontal'` | Form layout | #### Form.Item | Prop | Type | Default | Description | |------|------|---------|-------------| | `name` | `string` | - | Field name | | `label` | `ReactNode` | - | Field label | | `rules` | `ValidationRule[]` | - | Validation rules | | `required` | `boolean` | `false` | Whether the field is required | ### Select | Prop | Type | Default | Description | |------|------|---------|-------------| | `value` | `string \| string[]` | - | Selected value (controlled) | | `options` | `SelectOption[]` | - | Options list | | `mode` | `'single' \| 'multiple' \| 'tags'` | `'single'` | Selection mode | | `placeholder` | `string` | - | Placeholder text | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Select size | | `disabled` | `boolean` | `false` | Whether the select is disabled | | `showSearch` | `boolean` | `false` | Enable search filtering | | `showClear` | `boolean` | `false` | Show clear button | | `onChange` | `(value, option) => void` | - | Change handler | ### Table | Prop | Type | Default | Description | |------|------|---------|-------------| | `dataSource` | `T[]` | `[]` | Data array | | `columns` | `ColumnType[]` | - | Column definitions | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Table size | | `variant` | `'bordered' \| 'borderless'` | `'bordered'` | Table variant | | `loading` | `boolean` | `false` | Loading state | | `rowKey` | `string \| ((record) => string)` | - | Row key field | | `rowSelection` | `RowSelectionConfig` | - | Row selection config | | `pagination` | `PaginationConfig \| false` | - | Pagination config | ### Message ```tsx import { Message } from 'rustui' Message.success('Operation completed') Message.error('Something went wrong') Message.warning('Warning message') Message.info('Info message') Message.loading('Loading...') ``` | Method | Description | |--------|-------------| | `Message.success(content, duration?)` | Success message | | `Message.error(content, duration?)` | Error message | | `Message.warning(content, duration?)` | Warning message | | `Message.info(content, duration?)` | Info message | | `Message.loading(content, duration?)` | Loading message | ### Notification ```tsx import { Notification } from 'rustui' Notification.open({ message: 'Title', description: 'Description' }) Notification.success({ message: 'Success', description: 'Operation completed' }) ``` ### Icon RustUI includes 100+ built-in icons. All icons follow the `XxxOutlined` / `XxxFilled` / `XxxTwoTone` naming convention: ```tsx import { SearchOutlined, StarFilled, HeartTwoTone } from 'rustui' ``` | Prop | Type | Default | Description | |------|------|---------|-------------| | `spin` | `boolean` | `false` | Rotate icon animation | | `rotate` | `number` | `0` | Rotation degrees | | `style` | `CSSProperties` | - | Custom styles | | `onClick` | `(e: MouseEvent) => void` | - | Click handler | Custom icon from SVG: ```tsx import { Icon } from 'rustui' const SvgIcon = () => ( ...} /> ) ``` Icon from iconfont: ```tsx import { createFromIconfontCN } from 'rustui' const IconFont = createFromIconfontCN({ scriptUrl: '//at.alicdn.com/t/font_xxx.js' }) ``` ### ConfigProvider | Prop | Type | Default | Description | |------|------|---------|-------------| | `theme` | `'light' \| 'dark'` | `'light'` | Theme mode | | `locale` | `Locale` | - | Locale configuration | | `prefixCls` | `string` | - | CSS class prefix | ### DatePicker | Prop | Type | Default | Description | |------|------|---------|-------------| | `value` | `string \| null` | - | Selected date value (controlled), format `YYYY-MM-DD` | | `defaultValue` | `string \| null` | - | Default date value | | `placeholder` | `string` | `'选择日期'` | Placeholder text | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Picker size | | `status` | `'default' \| 'error' \| 'warning'` | `'default'` | Validation status | | `disabled` | `boolean` | `false` | Whether the picker is disabled | | `showTime` | `boolean` | `false` | Show time selection | | `disabledDate` | `(date: Date) => boolean` | - | Disable specific dates | | `onChange` | `(value: string, date: Date) => void` | - | Date change handler | ### Upload | Prop | Type | Default | Description | |------|------|---------|-------------| | `action` | `string` | - | Upload URL | | `method` | `string` | `'post'` | HTTP method | | `accept` | `string` | - | Accepted file types | | `multiple` | `boolean` | `false` | Allow multiple file selection | | `draggable` | `boolean` | `false` | Enable drag-and-drop upload | | `disabled` | `boolean` | `false` | Whether the upload is disabled | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Upload area size | | `showUploadList` | `boolean` | `true` | Show file list | | `fileList` | `UploadFile[]` | - | File list (controlled) | | `defaultFileList` | `UploadFile[]` | `[]` | Default file list | | `maxCount` | `number` | - | Max upload count | | `onChange` | `(file: UploadFile, fileList: UploadFile[]) => void` | - | File status change handler | | `onRemove` | `(file: UploadFile) => boolean \| void` | - | File remove handler, return `false` to prevent | | `beforeUpload` | `(file: File, fileList: File[]) => boolean \| void \| Promise` | - | Pre-upload hook, return `false` to cancel | #### UploadFile | Field | Type | Description | |-------|------|-------------| | `uid` | `string` | Unique file identifier | | `name` | `string` | File name | | `status` | `'pending' \| 'uploading' \| 'success' \| 'error'` | Upload status | | `percent` | `number` | Upload progress (0-100) | | `url` | `string` | File access URL | | `response` | `unknown` | Upload response data | | `error` | `string` | Error message | ### Drawer | Prop | Type | Default | Description | |------|------|---------|-------------| | `open` | `boolean` | `false` | Whether the drawer is visible | | `title` | `ReactNode` | - | Drawer title | | `footer` | `ReactNode \| null` | - | Footer content, `null` to hide | | `placement` | `'top' \| 'right' \| 'bottom' \| 'left'` | `'right'` | Drawer placement | | `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | Drawer size (378/480/736px) | | `width` | `number \| string` | - | Custom width (for left/right placement) | | `height` | `number \| string` | - | Custom height (for top/bottom placement) | | `closable` | `boolean` | `true` | Show close button | | `closeIcon` | `ReactNode` | - | Custom close icon | | `mask` | `boolean` | `true` | Show mask overlay | | `maskClosable` | `boolean` | `true` | Close on mask click | | `keyboard` | `boolean` | `true` | Close on ESC key | | `loading` | `boolean` | `false` | Loading state | | `extra` | `ReactNode` | - | Extra content in header | | `destroyOnClose` | `boolean` | `false` | Destroy content when closed | | `forceRender` | `boolean` | `false` | Force render content even when hidden | | `push` | `boolean \| { distance?: number \| string }` | `false` | Push behavior when nested drawers | | `zIndex` | `number` | - | Z-index of the drawer | | `onClose` | `(e: MouseEvent) => void` | - | Close handler | | `afterOpenChange` | `(open: boolean) => void` | - | Callback after open state changed | ## Development ```bash # Install dependencies pnpm install # Start dev server pnpm dev # Build pnpm build # Run tests pnpm test # Lint pnpm lint # Format pnpm format ``` ## License MIT