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.
Files changed (59) hide show
  1. package/README.md +644 -0
  2. package/dist/ChatInput/index.d.ts +23 -0
  3. package/dist/ChatInput/index.d.ts.map +1 -0
  4. package/dist/ChatInput/index.js +50 -0
  5. package/dist/ChatInput/index.js.map +1 -0
  6. package/dist/ChatInput/index.scss +170 -0
  7. package/dist/ContentRenderer/index.d.ts +15 -0
  8. package/dist/ContentRenderer/index.d.ts.map +1 -0
  9. package/dist/ContentRenderer/index.js +73 -0
  10. package/dist/ContentRenderer/index.js.map +1 -0
  11. package/dist/ContentRenderer/index.scss +203 -0
  12. package/dist/Input/Textarea.d.ts +46 -0
  13. package/dist/Input/Textarea.d.ts.map +1 -0
  14. package/dist/Input/Textarea.js +42 -0
  15. package/dist/Input/Textarea.js.map +1 -0
  16. package/dist/Input/index.d.ts +57 -0
  17. package/dist/Input/index.d.ts.map +1 -0
  18. package/dist/Input/index.js +87 -0
  19. package/dist/Input/index.js.map +1 -0
  20. package/dist/Input/index.scss +498 -0
  21. package/dist/Message/index.d.ts +36 -0
  22. package/dist/Message/index.d.ts.map +1 -0
  23. package/dist/Message/index.js +184 -0
  24. package/dist/Message/index.js.map +1 -0
  25. package/dist/Message/index.scss +147 -0
  26. package/dist/Modal/index.d.ts +57 -0
  27. package/dist/Modal/index.d.ts.map +1 -0
  28. package/dist/Modal/index.js +99 -0
  29. package/dist/Modal/index.js.map +1 -0
  30. package/dist/Modal/index.scss +250 -0
  31. package/dist/Pagination/index.d.ts +37 -0
  32. package/dist/Pagination/index.d.ts.map +1 -0
  33. package/dist/Pagination/index.js +98 -0
  34. package/dist/Pagination/index.js.map +1 -0
  35. package/dist/Pagination/index.scss +393 -0
  36. package/dist/Select/index.d.ts +56 -0
  37. package/dist/Select/index.d.ts.map +1 -0
  38. package/dist/Select/index.js +153 -0
  39. package/dist/Select/index.js.map +1 -0
  40. package/dist/Select/index.scss +251 -0
  41. package/dist/Starfield/index.d.ts +20 -0
  42. package/dist/Starfield/index.d.ts.map +1 -0
  43. package/dist/Starfield/index.js +39 -0
  44. package/dist/Starfield/index.js.map +1 -0
  45. package/dist/Starfield/index.scss +61 -0
  46. package/dist/Table/index.d.ts +72 -0
  47. package/dist/Table/index.d.ts.map +1 -0
  48. package/dist/Table/index.js +192 -0
  49. package/dist/Table/index.js.map +1 -0
  50. package/dist/Table/index.scss +377 -0
  51. package/dist/index.d.ts +22 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +11 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/types.d.ts +12 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +3 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +57 -0
package/README.md ADDED
@@ -0,0 +1,644 @@
1
+ # Starry Sky UI — 轻量级 React UI 组件库
2
+
3
+ [![license](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
+ [![Gitee](https://img.shields.io/badge/Gitee-仓库-red)](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"}