@fangxinyan/lumina 0.1.6 → 0.2.1

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 (242) hide show
  1. package/README.md +18 -7
  2. package/dist/{Accordion-GSBY5T5U.css → Accordion-3TQPKNN3.css} +8 -1
  3. package/dist/Accordion.cjs +2 -2
  4. package/dist/Accordion.d.cts +12 -0
  5. package/dist/Accordion.d.ts +12 -0
  6. package/dist/Accordion.js +1 -1
  7. package/dist/{Alert-LSKBYDRI.css → Alert-JJ7GB3UU.css} +11 -0
  8. package/dist/Alert.cjs +2 -2
  9. package/dist/Alert.d.cts +4 -0
  10. package/dist/Alert.d.ts +4 -0
  11. package/dist/Alert.js +1 -1
  12. package/dist/{Avatar-OXDSG5Q6.css → Avatar-R5A4AFKZ.css} +4 -0
  13. package/dist/Avatar.cjs +2 -2
  14. package/dist/Avatar.d.cts +2 -0
  15. package/dist/Avatar.d.ts +2 -0
  16. package/dist/Avatar.js +1 -1
  17. package/dist/{Button-5UI7QXGU.css → Button-SDQD25AG.css} +2 -0
  18. package/dist/Button.cjs +3 -3
  19. package/dist/Button.d.cts +2 -0
  20. package/dist/Button.d.ts +2 -0
  21. package/dist/Button.js +1 -1
  22. package/dist/Calendar.cjs +2 -2
  23. package/dist/Calendar.d.cts +8 -0
  24. package/dist/Calendar.d.ts +8 -0
  25. package/dist/Calendar.js +1 -1
  26. package/dist/{Card-2CHHFD4Y.css → Card-RG7ECXL2.css} +11 -0
  27. package/dist/Card.cjs +3 -3
  28. package/dist/Card.d.cts +2 -0
  29. package/dist/Card.d.ts +2 -0
  30. package/dist/Card.js +1 -1
  31. package/dist/{Divider-Z37INS5E.css → Divider-OEE4Q2KS.css} +31 -0
  32. package/dist/Divider.cjs +2 -2
  33. package/dist/Divider.d.cts +7 -0
  34. package/dist/Divider.d.ts +7 -0
  35. package/dist/Divider.js +1 -1
  36. package/dist/{Empty-VM23UNLQ.css → Empty-NQ72W3D7.css} +22 -0
  37. package/dist/Empty.cjs +4 -4
  38. package/dist/Empty.d.cts +42 -2
  39. package/dist/Empty.d.ts +42 -2
  40. package/dist/Empty.js +1 -1
  41. package/dist/Input-33CAH4O6.css +134 -0
  42. package/dist/Input.cjs +3 -3
  43. package/dist/Input.d.cts +17 -1
  44. package/dist/Input.d.ts +17 -1
  45. package/dist/Input.js +1 -1
  46. package/dist/Modal.cjs +3 -3
  47. package/dist/Modal.js +2 -2
  48. package/dist/{Pagination-6FFOI4NM.css → Pagination-YIRYJUXP.css} +33 -0
  49. package/dist/Pagination.cjs +5 -2
  50. package/dist/Pagination.d.cts +14 -0
  51. package/dist/Pagination.d.ts +14 -0
  52. package/dist/Pagination.js +4 -1
  53. package/dist/Select.cjs +3 -3
  54. package/dist/Select.js +2 -2
  55. package/dist/{Slider-RE4HZQKF.css → Slider-X4PVA65R.css} +51 -2
  56. package/dist/Slider.cjs +2 -2
  57. package/dist/Slider.d.cts +20 -5
  58. package/dist/Slider.d.ts +20 -5
  59. package/dist/Slider.js +1 -1
  60. package/dist/Switch-36KJNDXM.css +92 -0
  61. package/dist/Switch.cjs +2 -2
  62. package/dist/Switch.d.cts +4 -0
  63. package/dist/Switch.d.ts +4 -0
  64. package/dist/Switch.js +1 -1
  65. package/dist/Table-YKVM42SW.css +295 -0
  66. package/dist/Table.cjs +7 -3
  67. package/dist/Table.d.cts +103 -7
  68. package/dist/Table.d.ts +103 -7
  69. package/dist/Table.js +5 -1
  70. package/dist/{Tabs-A27TSZOP.css → Tabs-RHK6XAFF.css} +7 -0
  71. package/dist/Tabs.cjs +3 -3
  72. package/dist/Tabs.d.cts +2 -0
  73. package/dist/Tabs.d.ts +2 -0
  74. package/dist/Tabs.js +1 -1
  75. package/dist/{Tag-EYOY3UWG.css → Tag-FGDY3W7E.css} +2 -0
  76. package/dist/Tag.cjs +3 -3
  77. package/dist/Tag.d.cts +5 -0
  78. package/dist/Tag.d.ts +5 -0
  79. package/dist/Tag.js +1 -1
  80. package/dist/chunk-437LB2V4.js +111 -0
  81. package/dist/chunk-437LB2V4.js.map +1 -0
  82. package/dist/chunk-4MR4GVTD.js +73 -0
  83. package/dist/chunk-4MR4GVTD.js.map +1 -0
  84. package/dist/{chunk-OXYFB2ZI.js → chunk-4U4OY5RA.js} +11 -5
  85. package/dist/chunk-4U4OY5RA.js.map +1 -0
  86. package/dist/{chunk-5EYI27B6.js → chunk-77BVQNAQ.js} +5 -3
  87. package/dist/chunk-77BVQNAQ.js.map +1 -0
  88. package/dist/{chunk-3QWHDCHJ.js → chunk-AJZKESHB.js} +13 -4
  89. package/dist/chunk-AJZKESHB.js.map +1 -0
  90. package/dist/{chunk-NZPJ7BUB.cjs → chunk-AXMEZGEG.cjs} +13 -4
  91. package/dist/chunk-AXMEZGEG.cjs.map +1 -0
  92. package/dist/{chunk-HTP6UEVR.js → chunk-BBPNQ44M.js} +22 -6
  93. package/dist/chunk-BBPNQ44M.js.map +1 -0
  94. package/dist/{chunk-QQXIWOI3.cjs → chunk-CCBHZYE6.cjs} +5 -5
  95. package/dist/{chunk-QQXIWOI3.cjs.map → chunk-CCBHZYE6.cjs.map} +1 -1
  96. package/dist/chunk-E6R63QOL.js +476 -0
  97. package/dist/chunk-E6R63QOL.js.map +1 -0
  98. package/dist/{chunk-KGYLUZOU.cjs → chunk-EPFYIR63.cjs} +5 -5
  99. package/dist/{chunk-KGYLUZOU.cjs.map → chunk-EPFYIR63.cjs.map} +1 -1
  100. package/dist/chunk-F7HW2PYR.cjs +119 -0
  101. package/dist/chunk-F7HW2PYR.cjs.map +1 -0
  102. package/dist/chunk-GIVMKGZN.js +39 -0
  103. package/dist/chunk-GIVMKGZN.js.map +1 -0
  104. package/dist/{chunk-FMG3ZPGK.js → chunk-H6FCIJOP.js} +5 -3
  105. package/dist/chunk-H6FCIJOP.js.map +1 -0
  106. package/dist/{chunk-ALFDP5WX.cjs → chunk-IDM6JJLP.cjs} +22 -6
  107. package/dist/chunk-IDM6JJLP.cjs.map +1 -0
  108. package/dist/{chunk-I2ERCHFV.cjs → chunk-JKLQOB2F.cjs} +11 -5
  109. package/dist/chunk-JKLQOB2F.cjs.map +1 -0
  110. package/dist/{chunk-IGHLSNXT.cjs → chunk-K7PVJLW4.cjs} +51 -4
  111. package/dist/chunk-K7PVJLW4.cjs.map +1 -0
  112. package/dist/chunk-LDENBYRC.cjs +210 -0
  113. package/dist/chunk-LDENBYRC.cjs.map +1 -0
  114. package/dist/{chunk-OOBSH7EL.js → chunk-LSLYY5FN.js} +3 -3
  115. package/dist/{chunk-OOBSH7EL.js.map → chunk-LSLYY5FN.js.map} +1 -1
  116. package/dist/chunk-NSUD5B22.js +187 -0
  117. package/dist/chunk-NSUD5B22.js.map +1 -0
  118. package/dist/{chunk-AAMYURWQ.cjs → chunk-OPTTHURA.cjs} +5 -3
  119. package/dist/chunk-OPTTHURA.cjs.map +1 -0
  120. package/dist/{chunk-F3NHM4GX.js → chunk-OYGFMXAA.js} +13 -4
  121. package/dist/chunk-OYGFMXAA.js.map +1 -0
  122. package/dist/chunk-PBBHUUXU.cjs +133 -0
  123. package/dist/chunk-PBBHUUXU.cjs.map +1 -0
  124. package/dist/chunk-RDLPX7RK.cjs +95 -0
  125. package/dist/chunk-RDLPX7RK.cjs.map +1 -0
  126. package/dist/chunk-SBMOIE5C.cjs +499 -0
  127. package/dist/chunk-SBMOIE5C.cjs.map +1 -0
  128. package/dist/{chunk-XFRP2MBR.js → chunk-TYQ5CN2C.js} +51 -4
  129. package/dist/chunk-TYQ5CN2C.js.map +1 -0
  130. package/dist/{chunk-7CKHWCEA.cjs → chunk-TZSWDH5T.cjs} +5 -3
  131. package/dist/chunk-TZSWDH5T.cjs.map +1 -0
  132. package/dist/{chunk-VMHNKD3N.cjs → chunk-URF6RBW6.cjs} +13 -4
  133. package/dist/chunk-URF6RBW6.cjs.map +1 -0
  134. package/dist/{chunk-G3UWXSNQ.js → chunk-V34OPWKZ.js} +5 -4
  135. package/dist/chunk-V34OPWKZ.js.map +1 -0
  136. package/dist/{chunk-ITGCHU3Y.cjs → chunk-VICGQC6G.cjs} +5 -4
  137. package/dist/chunk-VICGQC6G.cjs.map +1 -0
  138. package/dist/chunk-YEOARJKR.cjs +40 -0
  139. package/dist/chunk-YEOARJKR.cjs.map +1 -0
  140. package/dist/chunk-Z5X5AMLA.cjs +41 -0
  141. package/dist/chunk-Z5X5AMLA.cjs.map +1 -0
  142. package/dist/chunk-Z7P6QGMT.js +115 -0
  143. package/dist/chunk-Z7P6QGMT.js.map +1 -0
  144. package/dist/{chunk-OYH6A7IQ.js → chunk-ZVCMXDTP.js} +3 -3
  145. package/dist/{chunk-OYH6A7IQ.js.map → chunk-ZVCMXDTP.js.map} +1 -1
  146. package/dist/chunk-ZWP4LSS3.js +38 -0
  147. package/dist/chunk-ZWP4LSS3.js.map +1 -0
  148. package/dist/index.cjs +43 -43
  149. package/dist/index.cjs.map +1 -1
  150. package/dist/index.d.cts +4 -4
  151. package/dist/index.d.ts +4 -4
  152. package/dist/index.js +18 -18
  153. package/dist/index.js.map +1 -1
  154. package/dist/styles.css +455 -30
  155. package/docs/llms/accordion.md +66 -0
  156. package/docs/llms/alert.md +64 -0
  157. package/docs/llms/avatar.md +55 -0
  158. package/docs/llms/badge.md +41 -0
  159. package/docs/llms/button.md +122 -0
  160. package/docs/llms/calendar.md +44 -0
  161. package/docs/llms/card.md +68 -0
  162. package/docs/llms/cascader.md +33 -0
  163. package/docs/llms/checkbox.md +41 -0
  164. package/docs/llms/colorpicker.md +82 -0
  165. package/docs/llms/divider.md +69 -0
  166. package/docs/llms/drawer.md +70 -0
  167. package/docs/llms/empty.md +52 -0
  168. package/docs/llms/icon.md +34 -0
  169. package/docs/llms/image.md +39 -0
  170. package/docs/llms/input.md +127 -0
  171. package/docs/llms/intro.md +6 -0
  172. package/docs/llms/list.md +41 -0
  173. package/docs/llms/modal.md +89 -0
  174. package/docs/llms/pagination.md +82 -0
  175. package/docs/llms/popover.md +34 -0
  176. package/docs/llms/progress.md +58 -0
  177. package/docs/llms/radio.md +43 -0
  178. package/docs/llms/select.md +99 -0
  179. package/docs/llms/sidebar.md +43 -0
  180. package/docs/llms/skeleton.md +88 -0
  181. package/docs/llms/slider.md +72 -0
  182. package/docs/llms/spinner.md +58 -0
  183. package/docs/llms/switch.md +60 -0
  184. package/docs/llms/table.md +188 -0
  185. package/docs/llms/tablepro.md +56 -0
  186. package/docs/llms/tabs.md +50 -0
  187. package/docs/llms/tag.md +77 -0
  188. package/docs/llms/theme.md +165 -0
  189. package/docs/llms/titlebar.md +40 -0
  190. package/docs/llms/toast.md +51 -0
  191. package/docs/llms/tooltip.md +38 -0
  192. package/docs/llms/typography.md +103 -0
  193. package/docs/llms/windowcontrols.md +31 -0
  194. package/docs/llms.md +97 -0
  195. package/package.json +8 -2
  196. package/dist/Input-Z526ARZP.css +0 -66
  197. package/dist/Switch-NP7KKJOX.css +0 -44
  198. package/dist/Table-ZDPGWLH3.css +0 -139
  199. package/dist/chunk-2VA2HSL4.cjs +0 -121
  200. package/dist/chunk-2VA2HSL4.cjs.map +0 -1
  201. package/dist/chunk-2W2AJUZW.js +0 -118
  202. package/dist/chunk-2W2AJUZW.js.map +0 -1
  203. package/dist/chunk-3QWHDCHJ.js.map +0 -1
  204. package/dist/chunk-4AA22BOG.js +0 -63
  205. package/dist/chunk-4AA22BOG.js.map +0 -1
  206. package/dist/chunk-5EYI27B6.js.map +0 -1
  207. package/dist/chunk-77NP67ML.cjs +0 -70
  208. package/dist/chunk-77NP67ML.cjs.map +0 -1
  209. package/dist/chunk-7CKHWCEA.cjs.map +0 -1
  210. package/dist/chunk-7NM5BRUX.js +0 -91
  211. package/dist/chunk-7NM5BRUX.js.map +0 -1
  212. package/dist/chunk-7UJI437T.js +0 -49
  213. package/dist/chunk-7UJI437T.js.map +0 -1
  214. package/dist/chunk-AAMYURWQ.cjs.map +0 -1
  215. package/dist/chunk-ALFDP5WX.cjs.map +0 -1
  216. package/dist/chunk-F3NHM4GX.js.map +0 -1
  217. package/dist/chunk-FMG3ZPGK.js.map +0 -1
  218. package/dist/chunk-G3UWXSNQ.js.map +0 -1
  219. package/dist/chunk-HTP6UEVR.js.map +0 -1
  220. package/dist/chunk-I2ERCHFV.cjs.map +0 -1
  221. package/dist/chunk-IBZAGURN.cjs +0 -71
  222. package/dist/chunk-IBZAGURN.cjs.map +0 -1
  223. package/dist/chunk-IGHLSNXT.cjs.map +0 -1
  224. package/dist/chunk-ITGCHU3Y.cjs.map +0 -1
  225. package/dist/chunk-JNFCTYJT.cjs +0 -31
  226. package/dist/chunk-JNFCTYJT.cjs.map +0 -1
  227. package/dist/chunk-JWFVSBVX.cjs +0 -30
  228. package/dist/chunk-JWFVSBVX.cjs.map +0 -1
  229. package/dist/chunk-K67KIKX4.cjs +0 -67
  230. package/dist/chunk-K67KIKX4.cjs.map +0 -1
  231. package/dist/chunk-M6OTFXZA.js +0 -48
  232. package/dist/chunk-M6OTFXZA.js.map +0 -1
  233. package/dist/chunk-NWJW5KLN.js +0 -29
  234. package/dist/chunk-NWJW5KLN.js.map +0 -1
  235. package/dist/chunk-NZPJ7BUB.cjs.map +0 -1
  236. package/dist/chunk-OXYFB2ZI.js.map +0 -1
  237. package/dist/chunk-QT7SJITQ.cjs +0 -114
  238. package/dist/chunk-QT7SJITQ.cjs.map +0 -1
  239. package/dist/chunk-VMHNKD3N.cjs.map +0 -1
  240. package/dist/chunk-VXITDXLW.js +0 -28
  241. package/dist/chunk-VXITDXLW.js.map +0 -1
  242. package/dist/chunk-XFRP2MBR.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ # Drawer 抽屉
2
+
3
+ > 从屏幕边缘滑出的浮层。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Drawer } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础
14
+
15
+ ```tsx
16
+ <Drawer open={d} onClose={...} title="标题">...</Drawer>
17
+ ```
18
+
19
+ ### 标题右侧 extra
20
+
21
+ extra 渲染到标题右边,常用来放刷新 / 更多 / 保存按钮。
22
+
23
+ ```tsx
24
+ <Drawer
25
+ title="订单详情"
26
+ extra={<><IconButton icon="edit" tip="编辑" /><Button variant="primary">保存</Button></>}
27
+ />
28
+ ```
29
+
30
+ ### 四个方向
31
+
32
+ placement 控制滑出方向;top / bottom 用 size 控高度。
33
+
34
+ ```tsx
35
+ <Drawer placement="left" size={320} />
36
+ <Drawer placement="top" size={240} />
37
+ ```
38
+
39
+ ### 无遮罩 (mask={false})
40
+
41
+ 关闭遮罩的抽屉不阻塞页面其他交互,适合辅助面板。
42
+
43
+ ```tsx
44
+ <Drawer mask={false} />
45
+ ```
46
+
47
+ ## API
48
+
49
+ **Drawer**
50
+
51
+ | Prop | 类型 | 默认 | 说明 |
52
+ | --- | --- | --- | --- |
53
+ | open \* | `boolean` | — | 可见 |
54
+ | onClose | `() => void` | — | 关闭回调 |
55
+ | placement | `"left" | "right" | "top" | "bottom"` | `"right"` | 出现位置 |
56
+ | size | `number | string` | `380` | 宽度(左右)或高度(上下) |
57
+ | title / footer / children | `ReactNode` | — | 头/脚/主体 |
58
+ | extra | `ReactNode` | — | 标题右侧的附加操作区 |
59
+ | mask | `boolean` | `true` | 是否渲染遮罩 |
60
+ | maskClosable | `boolean` | `true` | 点击遮罩关闭 |
61
+ | keyboard | `boolean` | `true` | Esc 关闭 |
62
+ | closable | `boolean` | `true` | 右上角 × |
63
+ | closeIcon | `ReactNode` | — | 自定义关闭图标 |
64
+ | destroyOnClose | `boolean` | `false` | 关闭时卸载子树 |
65
+ | afterOpenChange | `(open: boolean) => void` | — | 动画结束回调 |
66
+ | zIndex | `number` | — | 覆盖 z-index |
67
+
68
+
69
+ ---
70
+ [← 回到索引](../llms.md)
@@ -0,0 +1,52 @@
1
+ # Empty 空状态
2
+
3
+ > 列表、页面或容器无数据时的占位。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Empty } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础
14
+
15
+ ```tsx
16
+ <Empty title="暂无项目" description="创建一个开始吧" action={<Button>新建</Button>} />
17
+ ```
18
+
19
+ ### Subtle 变体
20
+
21
+ 去掉凹陷图标框,用于嵌入已有卡片/对话框中。
22
+
23
+ ```tsx
24
+ <Empty variant="subtle" icon={<Icon name="search" size={28} />} title="未找到结果" />
25
+ ```
26
+
27
+ ### 尺寸
28
+
29
+ sm 适合列表内嵌,md 是默认,lg 用作整页占位。
30
+
31
+ ```tsx
32
+ <Empty size="sm" title="暂无数据" />
33
+ <Empty size="md" title="暂无数据" />
34
+ <Empty size="lg" title="暂无数据" />
35
+ ```
36
+
37
+ ## API
38
+
39
+ **Empty**
40
+
41
+ | Prop | 类型 | 默认 | 说明 |
42
+ | --- | --- | --- | --- |
43
+ | title | `ReactNode` | `"暂无内容"` | 标题 |
44
+ | description | `ReactNode` | — | 描述 |
45
+ | icon | `ReactNode` | — | 图标 |
46
+ | action | `ReactNode` | — | 底部操作 |
47
+ | size | `"sm" | "md" | "lg"` | `"md"` | 尺寸 |
48
+ | variant | `"default" | "subtle"` | `"default"` | 样式 |
49
+
50
+
51
+ ---
52
+ [← 回到索引](../llms.md)
@@ -0,0 +1,34 @@
1
+ # Icon 图标
2
+
3
+ > 线性图标集,继承当前文字颜色,可调整尺寸与描边。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Icon } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础用法
14
+
15
+ 通过 name 指定图标,size 控制尺寸,stroke 控制描边粗细。
16
+
17
+ ```tsx
18
+ <Icon name="search" size={16} />
19
+ <Icon name="heart" size={20} stroke={1.5} />
20
+ ```
21
+
22
+ ## API
23
+
24
+ **Icon**
25
+
26
+ | Prop | 类型 | 默认 | 说明 |
27
+ | --- | --- | --- | --- |
28
+ | name \* | `IconName` | — | 图标名 |
29
+ | size | `number` | `16` | 尺寸 (px) |
30
+ | stroke | `number` | `2` | 描边粗细 |
31
+
32
+
33
+ ---
34
+ [← 回到索引](../llms.md)
@@ -0,0 +1,39 @@
1
+ # Image 图片
2
+
3
+ > 凹陷外框包裹的图片容器,带预览、错误占位。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Image, ImageGrid } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础
14
+
15
+ ```tsx
16
+ <Image src={url} width={240} height={160} />
17
+ ```
18
+
19
+ ### 图片组
20
+
21
+ ```tsx
22
+ <ImageGrid images={images} />
23
+ ```
24
+
25
+ ## API
26
+
27
+ **Image**
28
+
29
+ | Prop | 类型 | 默认 | 说明 |
30
+ | --- | --- | --- | --- |
31
+ | src | `string` | — | 图片 URL |
32
+ | width / height | `number | string` | — | 尺寸 |
33
+ | preview | `boolean` | `true` | 支持点击全屏预览 |
34
+ | hover | `boolean` | `true` | 悬浮放大 |
35
+ | placeholder | `ReactNode` | — | 占位/错误时内容 |
36
+
37
+
38
+ ---
39
+ [← 回到索引](../llms.md)
@@ -0,0 +1,127 @@
1
+ # Input 输入框
2
+
3
+ > 凹陷凹槽式输入域,支持前后置图标、错误态、禁用态。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Input, Textarea } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础用法
14
+
15
+ ```tsx
16
+ const [v, setV] = useState("");
17
+ <Input placeholder="输入用户名" value={v} onChange={setV} leadingIcon="user" />
18
+ ```
19
+
20
+ ### 前后置图标
21
+
22
+ leadingIcon / trailingIcon。
23
+
24
+ ```tsx
25
+ <Input placeholder="搜索..." leadingIcon="search" />
26
+ ```
27
+
28
+ ### 密码切换
29
+
30
+ trailingIcon 可点击切换密码可见性。
31
+
32
+ ```tsx
33
+ <Input
34
+ type={showPw ? "text" : "password"}
35
+ trailingIcon={showPw ? "eyeOff" : "eye"}
36
+ onTrailingIconClick={() => setShowPw(s => !s)}
37
+ />
38
+ ```
39
+
40
+ ### 校验错误
41
+
42
+ invalid 触发红色凹槽。
43
+
44
+ ```tsx
45
+ <Input invalid hint="请输入有效的邮箱" />
46
+ ```
47
+
48
+ ### 可清除
49
+
50
+ allowClear 在值非空时显示 × 按钮,点击即清空。
51
+
52
+ ```tsx
53
+ <Input value={v} onChange={setV} allowClear placeholder="输入后右侧会出现 ×" />
54
+ ```
55
+
56
+ ### 前缀 / 后缀
57
+
58
+ prefix/suffix 在输入框内部以静态文本形式呈现,常用于单位或协议。
59
+
60
+ ```tsx
61
+ <Input prefix="https://" suffix=".com" defaultValue="lumina" />
62
+ <Input prefix="¥" suffix="元" defaultValue="1280" />
63
+ ```
64
+
65
+ ### 字数统计 + maxLength
66
+
67
+ showCount 显示当前字数,配合 maxLength 显示 N / max。
68
+
69
+ ```tsx
70
+ <Input
71
+ value={v}
72
+ onChange={setV}
73
+ maxLength={20}
74
+ showCount
75
+ placeholder="最多输入 20 个字"
76
+ />
77
+ ```
78
+
79
+ ### 多行文本
80
+
81
+ Textarea 与 Input 共享同款凹槽,也支持 allowClear / maxLength / showCount。
82
+
83
+ ```tsx
84
+ <Textarea
85
+ placeholder="..."
86
+ value={msg}
87
+ onChange={setMsg}
88
+ allowClear
89
+ maxLength={300}
90
+ showCount
91
+ />
92
+ ```
93
+
94
+ ## API
95
+
96
+ **Input**
97
+
98
+ | Prop | 类型 | 默认 | 说明 |
99
+ | --- | --- | --- | --- |
100
+ | value / defaultValue | `string` | — | 受控值 / 初值 |
101
+ | onChange | `(value: string, e) => void` | — | 变更回调 |
102
+ | placeholder | `string` | — | 占位文案 |
103
+ | leadingIcon / trailingIcon | `IconName` | — | 前/后置图标 |
104
+ | prefix | `ReactNode` | — | 左侧内嵌内容(在 leadingIcon 之后) |
105
+ | suffix | `ReactNode` | — | 右侧内嵌内容(在 trailingIcon 之前) |
106
+ | allowClear | `boolean` | `false` | 显示内置的清除按钮 |
107
+ | maxLength | `number` | — | 最大字符数,透传至原生 input |
108
+ | showCount | `boolean` | `false` | 在输入框下方显示字数统计 |
109
+ | size | `"sm" | "md" | "lg"` | `"md"` | 尺寸 |
110
+ | invalid | `boolean` | `false` | 错误态 |
111
+ | disabled | `boolean` | `false` | 禁用 |
112
+
113
+
114
+ **Textarea**
115
+
116
+ | Prop | 类型 | 默认 | 说明 |
117
+ | --- | --- | --- | --- |
118
+ | value / defaultValue | `string` | — | 受控值 / 初值 |
119
+ | onChange | `(value: string, e) => void` | — | 变更回调 |
120
+ | allowClear | `boolean` | `false` | 右上角显示清除按钮 |
121
+ | maxLength | `number` | — | 最大字符数 |
122
+ | showCount | `boolean` | `false` | 显示字数统计 |
123
+ | invalid | `boolean` | `false` | 错误态 |
124
+
125
+
126
+ ---
127
+ [← 回到索引](../llms.md)
@@ -0,0 +1,6 @@
1
+ # Lumina
2
+
3
+ > 为 Electron 应用定制的拟态风格 React 组件库。
4
+
5
+ ---
6
+ [← 回到索引](../llms.md)
@@ -0,0 +1,41 @@
1
+ # List 列表
2
+
3
+ > 承载一组结构化的同质化数据。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { List } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础列表
14
+
15
+ ```tsx
16
+ <List items={[{ key, title, description, avatar, actions }]} />
17
+ ```
18
+
19
+ ## API
20
+
21
+ **List**
22
+
23
+ | Prop | 类型 | 默认 | 说明 |
24
+ | --- | --- | --- | --- |
25
+ | items \* | `ListItem[]` | — | 数据列表 |
26
+ | dividers | `boolean` | `true` | 项之间显示分隔线 |
27
+
28
+
29
+ **ListItem**
30
+
31
+ | Prop | 类型 | 默认 | 说明 |
32
+ | --- | --- | --- | --- |
33
+ | key \* | `string` | — | 唯一键 |
34
+ | title / description | `ReactNode` | — | 标题/描述 |
35
+ | avatar | `ReactNode` | — | 前置图标或头像 |
36
+ | actions | `ReactNode` | — | 右侧操作区 |
37
+ | onClick | `() => void` | — | 点击回调 |
38
+
39
+
40
+ ---
41
+ [← 回到索引](../llms.md)
@@ -0,0 +1,89 @@
1
+ # Modal 对话框
2
+
3
+ > 在不离开当前页面的前提下处理事务。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Modal } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础
14
+
15
+ ```tsx
16
+ <Modal open={m} onClose={...} title="标题">...</Modal>
17
+ ```
18
+
19
+ ### 确认操作 (footer 自定义)
20
+
21
+ 用 footer 自定义底部按钮。传 null 可以去掉 footer。
22
+
23
+ ```tsx
24
+ <Modal footer={<><Button>取消</Button><Button danger>删除</Button></>}>...
25
+ ```
26
+
27
+ ### onOk / onCancel + 按钮定制
28
+
29
+ 用默认 footer 的 onOk / onCancel 区分动作,okText / cancelText 改文案,okButtonProps 透传样式。
30
+
31
+ ```tsx
32
+ <Modal
33
+ onOk={handleSave}
34
+ onCancel={() => setOpen(false)}
35
+ okText="发布"
36
+ cancelText="不发了"
37
+ okButtonProps={{ icon: "send" }}
38
+ />
39
+ ```
40
+
41
+ ### 异步 confirmLoading
42
+
43
+ 提交过程中 confirmLoading 显示按钮 spinner 并自动禁用;完成后外层再 setOpen(false)。
44
+
45
+ ```tsx
46
+ <Modal confirmLoading={submitting} onOk={async () => {
47
+ setSubmitting(true);
48
+ await api.save();
49
+ setSubmitting(false);
50
+ setOpen(false);
51
+ }} />
52
+ ```
53
+
54
+ ### 隐藏关闭按钮
55
+
56
+ closable={false} 隐藏右上角 ×,closeIcon 可自定义。
57
+
58
+ ```tsx
59
+ <Modal closable={false} />
60
+ <Modal closeIcon={<Icon name="chevDown" />} />
61
+ ```
62
+
63
+ ## API
64
+
65
+ **Modal**
66
+
67
+ | Prop | 类型 | 默认 | 说明 |
68
+ | --- | --- | --- | --- |
69
+ | open \* | `boolean` | — | 是否可见 |
70
+ | onClose | `() => void` | — | 关闭回调(遮罩/Esc/关闭按钮) |
71
+ | onOk | `() => void` | — | 默认 OK 按钮点击 |
72
+ | onCancel | `() => void` | — | 默认 Cancel 按钮 / Esc / 关闭 / 遮罩触发,缺省则用 onClose |
73
+ | title / description | `ReactNode` | — | 标题/说明 |
74
+ | footer | `ReactNode` | — | 自定义底部(null 去除) |
75
+ | okText / cancelText | `ReactNode` | `"确定" / "取消"` | 默认按钮文案 |
76
+ | okButtonProps / cancelButtonProps | `Partial<ButtonProps>` | — | 透传给默认按钮 |
77
+ | confirmLoading | `boolean` | `false` | OK 按钮显示 spinner 并禁用 |
78
+ | closable | `boolean` | `true` | 显示右上角 × |
79
+ | closeIcon | `ReactNode` | — | 自定义关闭图标 |
80
+ | maskClosable | `boolean` | `true` | 点击遮罩关闭 |
81
+ | escClosable | `boolean` | `true` | Esc 关闭 |
82
+ | width | `number | string` | `440` | 宽度 |
83
+ | destroyOnClose | `boolean` | `false` | 关闭时卸载子树 |
84
+ | afterOpenChange | `(open: boolean) => void` | — | 动画结束后回调 |
85
+ | zIndex | `number` | — | 覆盖遮罩 z-index |
86
+
87
+
88
+ ---
89
+ [← 回到索引](../llms.md)
@@ -0,0 +1,82 @@
1
+ # Pagination 分页
2
+
3
+ > 分页控件,支持快速跳转与每页条数切换。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Pagination } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础用法
14
+
15
+ ```tsx
16
+ <Pagination total={85} page={page} onChange={setPage} />
17
+ ```
18
+
19
+ ### 快速跳转
20
+
21
+ 启用 showQuickJumper,输入页码按 Enter 跳转,超出范围会被夹紧。
22
+
23
+ ```tsx
24
+ <Pagination
25
+ total={250}
26
+ page={jumpPage}
27
+ onChange={setJumpPage}
28
+ showQuickJumper
29
+ />
30
+ ```
31
+
32
+ ### 每页条数
33
+
34
+ 启用 showSizeChanger,切换条数会回到第 1 页并触发 onShowSizeChange + onChange(1)。
35
+
36
+ ```tsx
37
+ <Pagination
38
+ total={320}
39
+ page={sizePage}
40
+ pageSize={pageSize}
41
+ onChange={setSizePage}
42
+ showSizeChanger
43
+ onShowSizeChange={(_cur, size) => setPageSize(size)}
44
+ />
45
+ ```
46
+
47
+ ### 跳转 + 条数 + 自定义选项
48
+
49
+ 同时启用两项,并通过 pageSizeOptions 自定义候选条数。
50
+
51
+ ```tsx
52
+ <Pagination
53
+ total={999}
54
+ page={fullPage}
55
+ pageSize={fullPageSize}
56
+ onChange={setFullPage}
57
+ showQuickJumper
58
+ showSizeChanger
59
+ pageSizeOptions={[20, 50, 100, 200]}
60
+ onShowSizeChange={(_cur, size) => setFullPageSize(size)}
61
+ />
62
+ ```
63
+
64
+ ## API
65
+
66
+ **Pagination**
67
+
68
+ | Prop | 类型 | 默认 | 说明 |
69
+ | --- | --- | --- | --- |
70
+ | total \* | `number` | — | 数据总条数 |
71
+ | pageSize | `number` | `10` | 每页条数 |
72
+ | page / defaultPage | `number` | `1` | 受控/初始页码 |
73
+ | onChange | `(page: number) => void` | — | 页码变化回调 |
74
+ | siblings | `number` | `1` | 当前页两侧可见的页码数 |
75
+ | showQuickJumper | `boolean` | `false` | 显示跳转输入框,按 Enter 跳转 |
76
+ | showSizeChanger | `boolean` | `false` | 显示每页条数选择器,切换后回到第 1 页 |
77
+ | pageSizeOptions | `number[]` | `[10, 20, 50, 100]` | 每页条数候选项 |
78
+ | onShowSizeChange | `(current: number, size: number) => void` | — | 每页条数变更回调 |
79
+
80
+
81
+ ---
82
+ [← 回到索引](../llms.md)
@@ -0,0 +1,34 @@
1
+ # Popover 气泡卡片
2
+
3
+ > 比 Tooltip 更丰富,可承载交互内容。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Popover } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础
14
+
15
+ ```tsx
16
+ <Popover content={<>...</>}>
17
+ <Button>触发</Button>
18
+ </Popover>
19
+ ```
20
+
21
+ ## API
22
+
23
+ **Popover**
24
+
25
+ | Prop | 类型 | 默认 | 说明 |
26
+ | --- | --- | --- | --- |
27
+ | content \* | `ReactNode` | — | 浮层内容 |
28
+ | placement | `"top" | "bottom" | "left" | "right"` | `"bottom"` | 位置 |
29
+ | trigger | `"click" | "hover"` | `"click"` | 触发方式 |
30
+ | open / defaultOpen / onOpenChange | `—` | — | 受控显示 |
31
+
32
+
33
+ ---
34
+ [← 回到索引](../llms.md)
@@ -0,0 +1,58 @@
1
+ # Progress 进度
2
+
3
+ > 条形进度 Progress 与环形进度 Ring。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { Progress, Ring } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 条形进度
14
+
15
+ ```tsx
16
+ <Progress value={v} label="下载中" showValue />
17
+ ```
18
+
19
+ ### 尺寸
20
+
21
+ ```tsx
22
+ <Progress size="sm" value={60} />
23
+ <Progress value={60} />
24
+ <Progress size="lg" value={60} />
25
+ ```
26
+
27
+ ### 环形进度
28
+
29
+ ```tsx
30
+ <Ring value={65} />
31
+ <Ring value={90} tone="success" size={80}><strong>90%</strong></Ring>
32
+ ```
33
+
34
+ ## API
35
+
36
+ **Progress**
37
+
38
+ | Prop | 类型 | 默认 | 说明 |
39
+ | --- | --- | --- | --- |
40
+ | value \* | `number` | — | 0–max 之间 |
41
+ | max | `number` | `100` | 最大值 |
42
+ | tone | `"accent" | "success" | "warning" | "danger"` | `"accent"` | 色调 |
43
+ | size | `"sm" | "md" | "lg"` | `"md"` | 尺寸 |
44
+ | label | `ReactNode` | — | 顶部文案 |
45
+ | showValue | `boolean` | `false` | 显示百分比 |
46
+
47
+
48
+ **Ring**
49
+
50
+ | Prop | 类型 | 默认 | 说明 |
51
+ | --- | --- | --- | --- |
52
+ | value \* | `number` | — | 0–100 |
53
+ | size | `number` | `72` | 直径 (px) |
54
+ | tone | `"accent" | "success" | ...` | `"accent"` | 色调 |
55
+
56
+
57
+ ---
58
+ [← 回到索引](../llms.md)
@@ -0,0 +1,43 @@
1
+ # Radio 单选
2
+
3
+ > 在多个互斥选项中进行单项选择。
4
+
5
+ ## 导入
6
+
7
+ ```tsx
8
+ import { RadioGroup } from "@fangxinyan/lumina";
9
+ ```
10
+
11
+ ## 示例
12
+
13
+ ### 基础用法
14
+
15
+ ```tsx
16
+ <RadioGroup value={v} onChange={setV} options={[
17
+ { value: "daily", label: "每日" },
18
+ { value: "weekly", label: "每周" },
19
+ ]} />
20
+ ```
21
+
22
+ ### 水平排列
23
+
24
+ direction='horizontal'。
25
+
26
+ ```tsx
27
+ <RadioGroup direction="horizontal" ... />
28
+ ```
29
+
30
+ ## API
31
+
32
+ **RadioGroup**
33
+
34
+ | Prop | 类型 | 默认 | 说明 |
35
+ | --- | --- | --- | --- |
36
+ | options \* | `{ value, label, disabled? }[]` | — | 选项数组 |
37
+ | value / defaultValue | `T` | — | 受控/初始 |
38
+ | onChange | `(value: T) => void` | — | 变更 |
39
+ | direction | `"vertical" | "horizontal"` | `"vertical"` | 方向 |
40
+
41
+
42
+ ---
43
+ [← 回到索引](../llms.md)