starry-sky-ui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +644 -0
- package/dist/ChatInput/index.d.ts +23 -0
- package/dist/ChatInput/index.d.ts.map +1 -0
- package/dist/ChatInput/index.js +50 -0
- package/dist/ChatInput/index.js.map +1 -0
- package/dist/ChatInput/index.scss +170 -0
- package/dist/ContentRenderer/index.d.ts +15 -0
- package/dist/ContentRenderer/index.d.ts.map +1 -0
- package/dist/ContentRenderer/index.js +73 -0
- package/dist/ContentRenderer/index.js.map +1 -0
- package/dist/ContentRenderer/index.scss +203 -0
- package/dist/Input/Textarea.d.ts +46 -0
- package/dist/Input/Textarea.d.ts.map +1 -0
- package/dist/Input/Textarea.js +42 -0
- package/dist/Input/Textarea.js.map +1 -0
- package/dist/Input/index.d.ts +57 -0
- package/dist/Input/index.d.ts.map +1 -0
- package/dist/Input/index.js +87 -0
- package/dist/Input/index.js.map +1 -0
- package/dist/Input/index.scss +498 -0
- package/dist/Message/index.d.ts +36 -0
- package/dist/Message/index.d.ts.map +1 -0
- package/dist/Message/index.js +184 -0
- package/dist/Message/index.js.map +1 -0
- package/dist/Message/index.scss +147 -0
- package/dist/Modal/index.d.ts +57 -0
- package/dist/Modal/index.d.ts.map +1 -0
- package/dist/Modal/index.js +99 -0
- package/dist/Modal/index.js.map +1 -0
- package/dist/Modal/index.scss +250 -0
- package/dist/Pagination/index.d.ts +37 -0
- package/dist/Pagination/index.d.ts.map +1 -0
- package/dist/Pagination/index.js +98 -0
- package/dist/Pagination/index.js.map +1 -0
- package/dist/Pagination/index.scss +393 -0
- package/dist/Select/index.d.ts +56 -0
- package/dist/Select/index.d.ts.map +1 -0
- package/dist/Select/index.js +153 -0
- package/dist/Select/index.js.map +1 -0
- package/dist/Select/index.scss +251 -0
- package/dist/Starfield/index.d.ts +20 -0
- package/dist/Starfield/index.d.ts.map +1 -0
- package/dist/Starfield/index.js +39 -0
- package/dist/Starfield/index.js.map +1 -0
- package/dist/Starfield/index.scss +61 -0
- package/dist/Table/index.d.ts +72 -0
- package/dist/Table/index.d.ts.map +1 -0
- package/dist/Table/index.js +192 -0
- package/dist/Table/index.js.map +1 -0
- package/dist/Table/index.scss +377 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +57 -0
package/README.md
ADDED
|
@@ -0,0 +1,644 @@
|
|
|
1
|
+
# Starry Sky UI — 轻量级 React UI 组件库
|
|
2
|
+
|
|
3
|
+
[](LICENSE)
|
|
4
|
+
[](https://gitee.com/qqqsdx/starry-sky-ui)
|
|
5
|
+
|
|
6
|
+
一套轻量级 React UI 组件库,API 参考 Ant Design 标准,提供基础通用组件。
|
|
7
|
+
适用于博客、后台管理、个人项目等场景。
|
|
8
|
+
|
|
9
|
+
📖 **文档地址:[https://www.adai.org.cn/ad-ui](https://www.adai.org.cn/ad-ui)**
|
|
10
|
+
🏠 **码云仓库:[https://gitee.com/qqqsdx/starry-sky-ui](https://gitee.com/qqqsdx/starry-sky-ui)**
|
|
11
|
+
|
|
12
|
+
## 安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install starry-sky-ui
|
|
16
|
+
# 或
|
|
17
|
+
yarn add starry-sky-ui
|
|
18
|
+
# 或
|
|
19
|
+
pnpm add starry-sky-ui
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 快速开始
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Message, message, Select, Modal } from 'starry-sky-ui';
|
|
26
|
+
import type { SelectOption, ModalProps } from 'starry-sky-ui';
|
|
27
|
+
|
|
28
|
+
function App() {
|
|
29
|
+
return (
|
|
30
|
+
<div>
|
|
31
|
+
<Message />
|
|
32
|
+
<Select options={[{ label: '选项一', value: '1' }]} />
|
|
33
|
+
<button onClick={() => message.success('Hello Starry Sky UI!')}>
|
|
34
|
+
提示
|
|
35
|
+
</button>
|
|
36
|
+
</div>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 目录结构
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
src/components/ad-ui/
|
|
45
|
+
├── Message/
|
|
46
|
+
│ ├── index.tsx
|
|
47
|
+
│ └── index.scss
|
|
48
|
+
├── Modal/
|
|
49
|
+
│ ├── index.tsx
|
|
50
|
+
│ └── index.scss
|
|
51
|
+
├── Select/
|
|
52
|
+
│ ├── index.tsx
|
|
53
|
+
│ └── index.scss
|
|
54
|
+
├── Starfield/
|
|
55
|
+
│ ├── index.tsx
|
|
56
|
+
│ └── index.scss
|
|
57
|
+
├── Table/
|
|
58
|
+
│ ├── index.tsx
|
|
59
|
+
│ └── index.scss
|
|
60
|
+
├── Pagination/
|
|
61
|
+
│ ├── index.tsx
|
|
62
|
+
│ └── index.scss
|
|
63
|
+
├── types.ts # 公共类型导出
|
|
64
|
+
├── index.ts # 统一导出入口
|
|
65
|
+
└── README.md
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Message — 消息提示
|
|
71
|
+
|
|
72
|
+
全局消息提示,支持 `info`、`success`、`error`、`warning`、`loading` 五种类型,自动消失。
|
|
73
|
+
|
|
74
|
+
### 基本用法
|
|
75
|
+
|
|
76
|
+
```tsx
|
|
77
|
+
import { Message, message } from 'starry-sky-ui';
|
|
78
|
+
|
|
79
|
+
// 1. 在应用根节点挂载 Message 组件
|
|
80
|
+
function App() {
|
|
81
|
+
return (
|
|
82
|
+
<div>
|
|
83
|
+
<Message />
|
|
84
|
+
{/* your app */}
|
|
85
|
+
</div>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 2. 通过 message 对象调用
|
|
90
|
+
message.success('操作成功');
|
|
91
|
+
message.error('操作失败');
|
|
92
|
+
message.warning('警告提示');
|
|
93
|
+
message.info('这是一条提示');
|
|
94
|
+
message.loading('加载中...', 0); // duration=0 不自动消失
|
|
95
|
+
|
|
96
|
+
// 返回的 MessageInstance 支持 then 语法
|
|
97
|
+
message.loading('提交中...');
|
|
98
|
+
await submitForm();
|
|
99
|
+
message.success('提交成功');
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 通用 open 方法
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
message.open({
|
|
106
|
+
type: 'success',
|
|
107
|
+
content: '自定义消息',
|
|
108
|
+
duration: 5000,
|
|
109
|
+
className: 'my-custom-class',
|
|
110
|
+
style: { fontSize: 16 },
|
|
111
|
+
onClose: () => console.log('closed'),
|
|
112
|
+
});
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### 全局配置
|
|
116
|
+
|
|
117
|
+
```tsx
|
|
118
|
+
message.config({
|
|
119
|
+
top: 100, // 距离顶部距离,默认 20
|
|
120
|
+
duration: 5000, // 默认显示时长,默认 3000ms
|
|
121
|
+
maxCount: 3, // 最大显示数量,超出时移除最早的消息
|
|
122
|
+
getContainer: () => document.getElementById('msg-area')!,
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 销毁所有消息
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
message.destroy();
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### API 速查
|
|
133
|
+
|
|
134
|
+
| 方法 | 说明 |
|
|
135
|
+
|------|------|
|
|
136
|
+
| `message.info(content, duration?, onClose?)` | 信息提示 |
|
|
137
|
+
| `message.success(content, duration?, onClose?)` | 成功提示 |
|
|
138
|
+
| `message.error(content, duration?, onClose?)` | 错误提示 |
|
|
139
|
+
| `message.warning(content, duration?, onClose?)` | 警告提示 |
|
|
140
|
+
| `message.loading(content, duration?, onClose?)` | 加载提示 |
|
|
141
|
+
| `message.open(config)` | 通用打开(支持 className/style) |
|
|
142
|
+
| `message.config(config)` | 全局配置 |
|
|
143
|
+
| `message.destroy()` | 销毁所有消息 |
|
|
144
|
+
|
|
145
|
+
| 配置项 | 类型 | 默认值 | 说明 |
|
|
146
|
+
|--------|------|--------|------|
|
|
147
|
+
| `top` | `number` | `20` | 消息距离顶部距离 |
|
|
148
|
+
| `duration` | `number` | `3000` | 默认自动消失时长(ms),0 为不消失 |
|
|
149
|
+
| `maxCount` | `number` | `Infinity` | 最大显示数量 |
|
|
150
|
+
| `getContainer` | `() => HTMLElement` | — | 自定义挂载容器 |
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Select — 下拉选择器
|
|
155
|
+
|
|
156
|
+
通用下拉选择框,支持搜索、清除、受控/非受控、键盘导航、尺寸调整。
|
|
157
|
+
|
|
158
|
+
### 基本用法
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
import { Select } from 'starry-sky-ui';
|
|
162
|
+
import type { SelectOption } from 'starry-sky-ui';
|
|
163
|
+
|
|
164
|
+
const options: SelectOption[] = [
|
|
165
|
+
{ label: 'React', value: 'react' },
|
|
166
|
+
{ label: 'Vue', value: 'vue', disabled: true },
|
|
167
|
+
{ label: 'Angular', value: 'angular' },
|
|
168
|
+
];
|
|
169
|
+
|
|
170
|
+
// 非受控
|
|
171
|
+
<Select
|
|
172
|
+
options={options}
|
|
173
|
+
defaultValue="react"
|
|
174
|
+
onChange={(val, option) => console.log(val, option)}
|
|
175
|
+
/>
|
|
176
|
+
|
|
177
|
+
// 受控
|
|
178
|
+
<Select
|
|
179
|
+
options={options}
|
|
180
|
+
value={value}
|
|
181
|
+
onChange={(val) => setValue(String(val))}
|
|
182
|
+
placeholder="请选择框架"
|
|
183
|
+
/>
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 搜索 & 清除
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
<Select
|
|
190
|
+
options={options}
|
|
191
|
+
showSearch // 启用搜索
|
|
192
|
+
allowClear // 启用清除按钮
|
|
193
|
+
filterOption={(input, opt) => // 自定义过滤
|
|
194
|
+
opt.label.includes(input) || opt.value.toString().includes(input)
|
|
195
|
+
}
|
|
196
|
+
notFoundContent={<span>未找到匹配项</span>}
|
|
197
|
+
/>
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### 受控展开
|
|
201
|
+
|
|
202
|
+
```tsx
|
|
203
|
+
<Select
|
|
204
|
+
options={options}
|
|
205
|
+
open={open}
|
|
206
|
+
onOpenChange={(o) => setOpen(o)}
|
|
207
|
+
/>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Props
|
|
211
|
+
|
|
212
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
213
|
+
|------|------|--------|------|
|
|
214
|
+
| `options` | `SelectOption[]` | — | 选项列表 |
|
|
215
|
+
| `value` | `string \| number` | — | 受控:当前选中值 |
|
|
216
|
+
| `defaultValue` | `string \| number` | — | 非受控:默认选中值 |
|
|
217
|
+
| `onChange` | `(value, option) => void` | — | 选中回调 |
|
|
218
|
+
| `placeholder` | `string` | `'请选择'` | 占位文本 |
|
|
219
|
+
| `disabled` | `boolean` | `false` | 禁用 |
|
|
220
|
+
| `size` | `'small' \| 'middle' \| 'large'` | `'middle'` | 尺寸 |
|
|
221
|
+
| `allowClear` | `boolean` | `false` | 显示清除按钮 |
|
|
222
|
+
| `showSearch` | `boolean` | `false` | 支持搜索过滤 |
|
|
223
|
+
| `filterOption` | `(input, option) => boolean` | 按 label 匹配 | 自定义过滤逻辑 |
|
|
224
|
+
| `notFoundContent` | `ReactNode` | `'暂无数据'` | 空数据内容 |
|
|
225
|
+
| `bordered` | `boolean` | `true` | 是否显示边框 |
|
|
226
|
+
| `open` | `boolean` | — | 受控:是否展开 |
|
|
227
|
+
| `onOpenChange` | `(open) => void` | — | 展开变化回调 |
|
|
228
|
+
| `dropdownMatchSelectWidth` | `boolean` | `true` | 下拉菜单匹配选择器宽度 |
|
|
229
|
+
| `listHeight` | `number` | `256` | 下拉菜单最大高度 |
|
|
230
|
+
| `className` | `string` | `''` | 自定义类名 |
|
|
231
|
+
| `style` | `CSSProperties` | — | 自定义样式 |
|
|
232
|
+
| `dropdownClassName` | `string` | `''` | 下拉菜单类名 |
|
|
233
|
+
| `onBlur` | `() => void` | — | 失焦回调 |
|
|
234
|
+
| `onFocus` | `() => void` | — | 聚焦回调 |
|
|
235
|
+
| `getPopupContainer` | `() => HTMLElement` | — | 自定义下拉容器 |
|
|
236
|
+
|
|
237
|
+
### 类型
|
|
238
|
+
|
|
239
|
+
```tsx
|
|
240
|
+
interface SelectOption {
|
|
241
|
+
label: string;
|
|
242
|
+
value: string | number;
|
|
243
|
+
disabled?: boolean;
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
## Modal — 弹窗
|
|
250
|
+
|
|
251
|
+
通用模态弹窗,支持标题、底部按钮、动画、确认/取消、loading 态。
|
|
252
|
+
|
|
253
|
+
### 基本用法
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
import { Modal } from 'starry-sky-ui';
|
|
257
|
+
import { useState } from 'react';
|
|
258
|
+
|
|
259
|
+
const [open, setOpen] = useState(false);
|
|
260
|
+
|
|
261
|
+
<Modal open={open} onClose={() => setOpen(false)} title="提示">
|
|
262
|
+
<p>弹窗内容</p>
|
|
263
|
+
</Modal>
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### 确认弹窗
|
|
267
|
+
|
|
268
|
+
```tsx
|
|
269
|
+
<Modal
|
|
270
|
+
open={open}
|
|
271
|
+
title="确认删除"
|
|
272
|
+
onOk={async () => {
|
|
273
|
+
await deleteItem();
|
|
274
|
+
setOpen(false);
|
|
275
|
+
}}
|
|
276
|
+
onCancel={() => setOpen(false)}
|
|
277
|
+
confirmLoading
|
|
278
|
+
okText="删除"
|
|
279
|
+
cancelText="取消"
|
|
280
|
+
centered
|
|
281
|
+
>
|
|
282
|
+
<p>确定要删除此项吗?删除后不可恢复。</p>
|
|
283
|
+
</Modal>
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 自定义底部 & 隐藏关闭按钮
|
|
287
|
+
|
|
288
|
+
```tsx
|
|
289
|
+
<Modal
|
|
290
|
+
open={open}
|
|
291
|
+
onClose={() => setOpen(false)}
|
|
292
|
+
title="自定义"
|
|
293
|
+
closable={false} // 隐藏关闭按钮
|
|
294
|
+
footer={null} // 隐藏底部
|
|
295
|
+
>
|
|
296
|
+
{/* 自定义内容 */}
|
|
297
|
+
</Modal>
|
|
298
|
+
|
|
299
|
+
<Modal
|
|
300
|
+
open={open}
|
|
301
|
+
title="自定义底部"
|
|
302
|
+
footer={
|
|
303
|
+
<div style={{ textAlign: 'center' }}>
|
|
304
|
+
<button onClick={() => setOpen(false)}>我知道了</button>
|
|
305
|
+
</div>
|
|
306
|
+
}
|
|
307
|
+
>
|
|
308
|
+
<p>内容</p>
|
|
309
|
+
</Modal>
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### 无遮罩 & 禁止遮罩关闭
|
|
313
|
+
|
|
314
|
+
```tsx
|
|
315
|
+
<Modal
|
|
316
|
+
open={open}
|
|
317
|
+
mask={false} // 无遮罩
|
|
318
|
+
maskClosable={false} // 禁止点击遮罩关闭
|
|
319
|
+
keyboard={false} // 禁止 ESC 关闭
|
|
320
|
+
>
|
|
321
|
+
<p>必须通过按钮关闭</p>
|
|
322
|
+
</Modal>
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### destroyOnClose
|
|
326
|
+
|
|
327
|
+
```tsx
|
|
328
|
+
<Modal open={open} destroyOnClose>
|
|
329
|
+
{/* 关闭后子节点会被销毁,适合包含表单等需要重置的场景 */}
|
|
330
|
+
<ExpensiveForm />
|
|
331
|
+
</Modal>
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### afterClose
|
|
335
|
+
|
|
336
|
+
```tsx
|
|
337
|
+
<Modal
|
|
338
|
+
open={open}
|
|
339
|
+
onClose={() => setOpen(false)}
|
|
340
|
+
afterClose={() => console.log('弹窗已完全关闭')}
|
|
341
|
+
>
|
|
342
|
+
<p>内容</p>
|
|
343
|
+
</Modal>
|
|
344
|
+
```
|
|
345
|
+
|
|
346
|
+
### Props
|
|
347
|
+
|
|
348
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
349
|
+
|------|------|--------|------|
|
|
350
|
+
| `open` | `boolean` | `false` | 是否显示 |
|
|
351
|
+
| `onClose` | `() => void` | — | 关闭回调 |
|
|
352
|
+
| `onOk` | `() => void \| Promise<void>` | — | 确认回调(支持 async) |
|
|
353
|
+
| `onCancel` | `() => void` | — | 取消回调 |
|
|
354
|
+
| `afterClose` | `() => void` | — | 关闭动画完成后回调 |
|
|
355
|
+
| `title` | `ReactNode` | — | 标题 |
|
|
356
|
+
| `children` | `ReactNode` | — | 内容 |
|
|
357
|
+
| `footer` | `ReactNode \| null` | 默认确定/取消按钮 | 底部,`null` 隐藏 |
|
|
358
|
+
| `closeButton` | `ReactNode` | — | 自定义关闭按钮 |
|
|
359
|
+
| `width` | `number \| string` | `520` | 宽度(数字为 px) |
|
|
360
|
+
| `height` | `number \| string` | — | 高度 |
|
|
361
|
+
| `centered` | `boolean` | `false` | 垂直居中 |
|
|
362
|
+
| `mask` | `boolean` | `true` | 是否显示遮罩 |
|
|
363
|
+
| `maskClosable` | `boolean` | `true` | 点击遮罩是否关闭 |
|
|
364
|
+
| `closable` | `boolean` | `true` | 是否显示关闭按钮 |
|
|
365
|
+
| `keyboard` | `boolean` | `true` | 是否支持 ESC 关闭 |
|
|
366
|
+
| `confirmLoading` | `boolean` | `false` | 确认按钮 loading 态 |
|
|
367
|
+
| `destroyOnClose` | `boolean` | `false` | 关闭时销毁子节点 |
|
|
368
|
+
| `zIndex` | `number` | `1000` | 自定义 z-index |
|
|
369
|
+
| `okText` | `string` | `'确定'` | 确定按钮文案 |
|
|
370
|
+
| `cancelText` | `string` | `'取消'` | 取消按钮文案 |
|
|
371
|
+
| `className` | `string` | `''` | 自定义类名 |
|
|
372
|
+
| `style` | `CSSProperties` | — | 自定义样式 |
|
|
373
|
+
| `bodyStyle` | `CSSProperties` | — | 内容区样式 |
|
|
374
|
+
| `getContainer` | `() => HTMLElement` | — | 自定义容器 |
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Table — 表格
|
|
379
|
+
|
|
380
|
+
功能丰富的表格组件,支持排序、分页、行选择、自定义渲染、固定表头、加载态等。
|
|
381
|
+
|
|
382
|
+
### 基本用法
|
|
383
|
+
|
|
384
|
+
```tsx
|
|
385
|
+
import { Table } from 'starry-sky-ui';
|
|
386
|
+
import type { ColumnType } from 'starry-sky-ui';
|
|
387
|
+
|
|
388
|
+
const columns: ColumnType[] = [
|
|
389
|
+
{ title: '名称', dataIndex: 'name', key: 'name', sorter: (a, b) => a.name.localeCompare(b.name) },
|
|
390
|
+
{ title: '版本', dataIndex: 'version', key: 'version' },
|
|
391
|
+
{ title: '使用率', dataIndex: 'usage', key: 'usage', render: (val) => <ProgressBar value={val} /> },
|
|
392
|
+
];
|
|
393
|
+
|
|
394
|
+
const data = [
|
|
395
|
+
{ key: '1', name: 'React', version: '18.3.1', usage: '81%' },
|
|
396
|
+
{ key: '2', name: 'Vue', version: '3.4.0', usage: '65%' },
|
|
397
|
+
];
|
|
398
|
+
|
|
399
|
+
<Table
|
|
400
|
+
columns={columns}
|
|
401
|
+
dataSource={data}
|
|
402
|
+
rowKey="key"
|
|
403
|
+
pagination={{ pageSize: 10, showTotal: true }}
|
|
404
|
+
/>
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
### 排序
|
|
408
|
+
|
|
409
|
+
在 ColumnType 中设置 `sorter` 即可启用排序,支持传入排序函数或 `true`:
|
|
410
|
+
|
|
411
|
+
```tsx
|
|
412
|
+
const columns: ColumnType[] = [
|
|
413
|
+
{ title: '名称', dataIndex: 'name', sorter: (a, b) => a.name.localeCompare(b.name) },
|
|
414
|
+
{ title: '版本', dataIndex: 'version', sorter: true },
|
|
415
|
+
];
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
> 传 `true` 时会尝试默认比较,推荐传入具体的比较函数以获得准确排序。
|
|
419
|
+
|
|
420
|
+
### 行选择
|
|
421
|
+
|
|
422
|
+
```tsx
|
|
423
|
+
const [selectedKeys, setSelectedKeys] = useState<string[]>([]);
|
|
424
|
+
|
|
425
|
+
<Table
|
|
426
|
+
columns={columns}
|
|
427
|
+
dataSource={data}
|
|
428
|
+
rowKey="key"
|
|
429
|
+
rowSelection={{
|
|
430
|
+
selectedRowKeys: selectedKeys,
|
|
431
|
+
onChange: (keys, rows) => setSelectedKeys(keys),
|
|
432
|
+
getCheckboxProps: (record) => ({ disabled: record.name === 'Angular' }),
|
|
433
|
+
}}
|
|
434
|
+
/>
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
### 加载态 & 空态
|
|
438
|
+
|
|
439
|
+
```tsx
|
|
440
|
+
// 加载中
|
|
441
|
+
<Table columns={columns} dataSource={[]} loading />
|
|
442
|
+
|
|
443
|
+
// 空数据
|
|
444
|
+
<Table columns={columns} dataSource={[]} emptyText="暂无数据" />
|
|
445
|
+
|
|
446
|
+
// 自定义空态
|
|
447
|
+
<Table columns={columns} dataSource={[]} emptyText={<Empty description="暂无数据" />} />
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
### Props
|
|
451
|
+
|
|
452
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
453
|
+
|------|------|--------|------|
|
|
454
|
+
| `columns` | `ColumnType[]` | — | 列定义 |
|
|
455
|
+
| `dataSource` | `T[]` | — | 数据源 |
|
|
456
|
+
| `rowKey` | `string \| (record) => string` | `key` 或 `id` | 行唯一标识 |
|
|
457
|
+
| `pagination` | `false \| PaginationConfig` | 默认分页 | 分页配置,`false` 禁用 |
|
|
458
|
+
| `loading` | `boolean` | `false` | 加载中 |
|
|
459
|
+
| `emptyText` | `ReactNode` | `'暂无数据'` | 空数据展示 |
|
|
460
|
+
| `size` | `'small' \| 'middle' \| 'large'` | `'large'` | 表格尺寸 |
|
|
461
|
+
| `bordered` | `boolean` | `false` | 是否显示列边框 |
|
|
462
|
+
| `showHeader` | `boolean` | `true` | 是否显示表头 |
|
|
463
|
+
| `rowSelection` | `RowSelectionType` | — | 行选择配置 |
|
|
464
|
+
| `scroll` | `{ y?: number }` | — | 设置 `y` 固定表头 |
|
|
465
|
+
| `defaultSortBy` | `{ columnKey, order }` | — | 默认排序 |
|
|
466
|
+
| `onChange` | `(pagination, sorter) => void` | — | 分页/排序变化回调 |
|
|
467
|
+
| `onRow` | `(record) => { onClick, style, className }` | — | 行事件与样式 |
|
|
468
|
+
| `className` | `string` | `''` | 自定义类名 |
|
|
469
|
+
|
|
470
|
+
### PaginationConfig
|
|
471
|
+
|
|
472
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
473
|
+
|------|------|--------|------|
|
|
474
|
+
| `current` | `number` | — | 受控当前页 |
|
|
475
|
+
| `defaultCurrent` | `number` | `1` | 默认当前页 |
|
|
476
|
+
| `pageSize` | `number` | — | 受控每页条数 |
|
|
477
|
+
| `defaultPageSize` | `number` | `10` | 默认每页条数 |
|
|
478
|
+
| `total` | `number` | `dataSource.length` | 数据总量 |
|
|
479
|
+
| `showSizeChanger` | `boolean` | `false` | 显示每页条数切换 |
|
|
480
|
+
| `pageSizeOptions` | `number[]` | `[10, 20, 50, 100]` | 可选的每页条数 |
|
|
481
|
+
| `showTotal` | `boolean` | `false` | 显示总条数 |
|
|
482
|
+
| `simple` | `boolean` | `false` | 简洁模式 |
|
|
483
|
+
| `onChange` | `(page, pageSize) => void` | — | 分页变化回调 |
|
|
484
|
+
|
|
485
|
+
### ColumnType
|
|
486
|
+
|
|
487
|
+
| 属性 | 类型 | 说明 |
|
|
488
|
+
|------|------|------|
|
|
489
|
+
| `title` | `string` | 列标题 |
|
|
490
|
+
| `dataIndex` | `string` | 数据字段 |
|
|
491
|
+
| `key` | `string` | 列唯一标识 |
|
|
492
|
+
| `render` | `(value, record, index) => ReactNode` | 自定义渲染 |
|
|
493
|
+
| `width` | `number \| string` | 列宽度 |
|
|
494
|
+
| `align` | `'left' \| 'center' \| 'right'` | 对齐方式 |
|
|
495
|
+
| `sorter` | `boolean \| (a, b) => number` | 排序函数(启用排序) |
|
|
496
|
+
| `className` | `string` | 列类名 |
|
|
497
|
+
| `fixed` | `'left' \| 'right'` | 固定列 |
|
|
498
|
+
| `visible` | `boolean` | 是否显示 |
|
|
499
|
+
| `minWidth` | `number` | 最小宽度 |
|
|
500
|
+
|
|
501
|
+
### RowSelectionType
|
|
502
|
+
|
|
503
|
+
| 属性 | 类型 | 说明 |
|
|
504
|
+
|------|------|------|
|
|
505
|
+
| `selectedRowKeys` | `string[]` | 受控选中 key 列表 |
|
|
506
|
+
| `defaultSelectedRowKeys` | `string[]` | 默认选中 key 列表 |
|
|
507
|
+
| `onChange` | `(keys, rows) => void` | 选中变化回调 |
|
|
508
|
+
| `getCheckboxProps` | `(record) => { disabled }` | 复选框属性 |
|
|
509
|
+
| `columnWidth` | `number \| string` | 选择列宽度 |
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Pagination — 分页
|
|
514
|
+
|
|
515
|
+
分页组件,支持受控/非受控、简洁模式、每页条数切换、快速跳转、禁用态和小尺寸。
|
|
516
|
+
|
|
517
|
+
### 基本用法
|
|
518
|
+
|
|
519
|
+
```tsx
|
|
520
|
+
import { Pagination } from 'starry-sky-ui';
|
|
521
|
+
|
|
522
|
+
<Pagination
|
|
523
|
+
total={200}
|
|
524
|
+
defaultCurrent={1}
|
|
525
|
+
defaultPageSize={10}
|
|
526
|
+
showTotal
|
|
527
|
+
showSizeChanger
|
|
528
|
+
onChange={(page, pageSize) => console.log(page, pageSize)}
|
|
529
|
+
/>
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 受控模式
|
|
533
|
+
|
|
534
|
+
```tsx
|
|
535
|
+
const [page, setPage] = useState(1);
|
|
536
|
+
const [pageSize, setPageSize] = useState(10);
|
|
537
|
+
|
|
538
|
+
<Pagination
|
|
539
|
+
current={page}
|
|
540
|
+
pageSize={pageSize}
|
|
541
|
+
total={500}
|
|
542
|
+
showTotal
|
|
543
|
+
onChange={(p, s) => { setPage(p); setPageSize(s); }}
|
|
544
|
+
/>
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
### 简洁模式
|
|
548
|
+
|
|
549
|
+
```tsx
|
|
550
|
+
<Pagination total={100} simple />
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
### 快速跳转
|
|
554
|
+
|
|
555
|
+
```tsx
|
|
556
|
+
<Pagination total={500} showQuickJumper />
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
### 小尺寸
|
|
560
|
+
|
|
561
|
+
```tsx
|
|
562
|
+
<Pagination total={200} size="small" showTotal showSizeChanger />
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
### Props
|
|
566
|
+
|
|
567
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
568
|
+
|------|------|--------|------|
|
|
569
|
+
| `current` | `number` | — | 受控:当前页数 |
|
|
570
|
+
| `defaultCurrent` | `number` | `1` | 非受控:默认当前页数 |
|
|
571
|
+
| `pageSize` | `number` | — | 受控:每页条数 |
|
|
572
|
+
| `defaultPageSize` | `number` | `10` | 非受控:默认每页条数 |
|
|
573
|
+
| `total` | `number` | — | 数据总数(必填) |
|
|
574
|
+
| `onChange` | `(page, pageSize) => void` | — | 页码或 pageSize 变化回调 |
|
|
575
|
+
| `showSizeChanger` | `boolean` | `false` | 是否显示每页条数切换器 |
|
|
576
|
+
| `pageSizeOptions` | `number[]` | `[10, 20, 50, 100]` | 每页条数可选值 |
|
|
577
|
+
| `showTotal` | `boolean` | `false` | 是否显示总条数 |
|
|
578
|
+
| `showTotalRender` | `(total, range) => ReactNode` | — | 总条数自定义渲染 |
|
|
579
|
+
| `simple` | `boolean` | `false` | 简洁模式(仅显示翻页 + 输入框) |
|
|
580
|
+
| `disabled` | `boolean` | `false` | 禁用 |
|
|
581
|
+
| `showQuickJumper` | `boolean` | `false` | 是否显示快速跳转输入框 |
|
|
582
|
+
| `size` | `'default' \| 'small'` | `'default'` | 尺寸 |
|
|
583
|
+
| `className` | `string` | `''` | 自定义类名 |
|
|
584
|
+
|
|
585
|
+
---
|
|
586
|
+
|
|
587
|
+
## Starfield — 星空背景
|
|
588
|
+
|
|
589
|
+
星空背景组件,在容器内生成随机分布的闪烁星星,支持自定义数量、颜色和闪烁速度。
|
|
590
|
+
|
|
591
|
+
### 基本用法
|
|
592
|
+
|
|
593
|
+
```tsx
|
|
594
|
+
import { Starfield } from 'starry-sky-ui';
|
|
595
|
+
|
|
596
|
+
// 使用默认参数(350 颗星星,紫/蓝/白三色,3s 闪烁)
|
|
597
|
+
<Starfield />
|
|
598
|
+
|
|
599
|
+
// 自定义参数
|
|
600
|
+
<Starfield
|
|
601
|
+
starCount={500}
|
|
602
|
+
starColors={['#ff6b6b', '#ffd93d', '#6bcb77']}
|
|
603
|
+
time={5}
|
|
604
|
+
className="my-starfield"
|
|
605
|
+
/>
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
### 性能
|
|
609
|
+
|
|
610
|
+
- 使用 `DocumentFragment` 批量追加 DOM,仅触发一次 reflow
|
|
611
|
+
- 通过 CSS 自定义属性(`--star-color`, `--star-glow`)传递颜色,避免动态生成大量样式类
|
|
612
|
+
- 清理时使用 `innerHTML` 一次性清除所有子节点
|
|
613
|
+
|
|
614
|
+
### Props
|
|
615
|
+
|
|
616
|
+
| 属性 | 类型 | 默认值 | 说明 |
|
|
617
|
+
|------|------|--------|------|
|
|
618
|
+
| `starCount` | `number` | `350` | 星星数量 |
|
|
619
|
+
| `starColors` | `string[]` | `['#8b5cf6', '#3b82f6', '#ffffff']` | 颜色列表,支持任意 CSS 合法颜色值 |
|
|
620
|
+
| `time` | `number` | `3` | 闪烁动画最大延迟时间(秒) |
|
|
621
|
+
| `className` | `string` | `''` | 自定义类名 |
|
|
622
|
+
|
|
623
|
+
---
|
|
624
|
+
|
|
625
|
+
## 类型导出
|
|
626
|
+
|
|
627
|
+
所有组件类型均可从 `starry-sky-ui` 直接导入:
|
|
628
|
+
|
|
629
|
+
```tsx
|
|
630
|
+
import type {
|
|
631
|
+
SelectOption,
|
|
632
|
+
SelectProps,
|
|
633
|
+
ModalProps,
|
|
634
|
+
MessageInstance,
|
|
635
|
+
MessageOpenConfig,
|
|
636
|
+
MessageGlobalConfig,
|
|
637
|
+
ColumnType,
|
|
638
|
+
TableProps,
|
|
639
|
+
PaginationConfig,
|
|
640
|
+
RowSelectionType,
|
|
641
|
+
PaginationProps,
|
|
642
|
+
StarfieldProps,
|
|
643
|
+
} from 'starry-sky-ui';
|
|
644
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './index.scss';
|
|
3
|
+
export interface ChatInputProps {
|
|
4
|
+
/** 发送消息回调 */
|
|
5
|
+
onSend: (message: string) => void;
|
|
6
|
+
/** 是否正在加载(禁用发送) */
|
|
7
|
+
loading?: boolean;
|
|
8
|
+
/** 占位文本 */
|
|
9
|
+
placeholder?: string;
|
|
10
|
+
/** 是否禁用 */
|
|
11
|
+
disabled?: boolean;
|
|
12
|
+
/** 自定义类名 */
|
|
13
|
+
className?: string;
|
|
14
|
+
/** 最大行数 */
|
|
15
|
+
maxRows?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* AI 聊天输入框组件
|
|
19
|
+
* 仿 DeepSeek 风格,支持多行输入、回车发送、Shift+Enter 换行
|
|
20
|
+
*/
|
|
21
|
+
declare const ChatInput: React.FC<ChatInputProps>;
|
|
22
|
+
export default ChatInput;
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ChatInput/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,aAAa;IACb,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,mBAAmB;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAiBD;;;GAGG;AACH,QAAA,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA+EvC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|