@fangxinyan/lumina 0.6.1 → 0.6.3

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 (270) hide show
  1. package/README.md +2 -1
  2. package/dist/{Alert-JJ7GB3UU.css → Alert-QBKIDY5H.css} +7 -0
  3. package/dist/Alert.cjs +3 -3
  4. package/dist/Alert.d.cts +3 -2
  5. package/dist/Alert.d.ts +3 -2
  6. package/dist/Alert.js +2 -2
  7. package/dist/AutoComplete.cjs +5 -4
  8. package/dist/AutoComplete.d.cts +1 -1
  9. package/dist/AutoComplete.d.ts +1 -1
  10. package/dist/AutoComplete.js +4 -3
  11. package/dist/Badge-DPGLV3D3.css +22 -0
  12. package/dist/Badge.cjs +10 -0
  13. package/dist/Badge.d.cts +19 -0
  14. package/dist/Badge.d.ts +19 -0
  15. package/dist/Badge.js +1 -0
  16. package/dist/{Button-SDQD25AG.css → Button-4Z3Q6KII.css} +56 -36
  17. package/dist/Button.cjs +3 -7
  18. package/dist/Button.d.cts +11 -15
  19. package/dist/Button.d.ts +11 -15
  20. package/dist/Button.js +2 -2
  21. package/dist/Calendar.cjs +3 -3
  22. package/dist/Calendar.js +2 -2
  23. package/dist/{Card-RG7ECXL2.css → Card-6RMVIHWX.css} +7 -13
  24. package/dist/Card.cjs +2 -6
  25. package/dist/Card.d.cts +7 -11
  26. package/dist/Card.d.ts +7 -11
  27. package/dist/Card.js +1 -1
  28. package/dist/{Cascader-VSYEKQCG.css → Cascader-3BLLA7EN.css} +77 -0
  29. package/dist/Cascader.cjs +5 -3
  30. package/dist/Cascader.d.cts +22 -4
  31. package/dist/Cascader.d.ts +22 -4
  32. package/dist/Cascader.js +4 -2
  33. package/dist/{Checkbox-SKJATVSN.css → Checkbox-U5EUDSYS.css} +5 -35
  34. package/dist/Checkbox.cjs +3 -7
  35. package/dist/Checkbox.d.cts +1 -18
  36. package/dist/Checkbox.d.ts +1 -18
  37. package/dist/Checkbox.js +2 -2
  38. package/dist/Collapse-66U5YJFY.css +53 -0
  39. package/dist/Collapse.cjs +11 -0
  40. package/dist/Collapse.d.cts +32 -0
  41. package/dist/Collapse.d.ts +32 -0
  42. package/dist/Collapse.js +2 -0
  43. package/dist/CommandPalette.cjs +5 -4
  44. package/dist/CommandPalette.js +4 -3
  45. package/dist/Drawer.cjs +3 -3
  46. package/dist/Drawer.js +2 -2
  47. package/dist/Empty-DC2LPORC.css +28 -0
  48. package/dist/Empty.cjs +2 -10
  49. package/dist/Empty.d.cts +1 -62
  50. package/dist/Empty.d.ts +1 -62
  51. package/dist/Empty.js +1 -1
  52. package/dist/Form.d.cts +1 -1
  53. package/dist/Form.d.ts +1 -1
  54. package/dist/Icon.cjs +187 -3
  55. package/dist/Icon.d.cts +104 -3
  56. package/dist/Icon.d.ts +104 -3
  57. package/dist/Icon.js +1 -1
  58. package/dist/{Image-4MN34O6P.css → Image-MRYQCRQ5.css} +78 -0
  59. package/dist/Image.cjs +12 -4
  60. package/dist/Image.d.cts +79 -6
  61. package/dist/Image.d.ts +79 -6
  62. package/dist/Image.js +2 -2
  63. package/dist/{Input-33CAH4O6.css → Input-HUBJ55OH.css} +25 -42
  64. package/dist/Input.cjs +6 -5
  65. package/dist/Input.d.cts +23 -26
  66. package/dist/Input.d.ts +23 -26
  67. package/dist/Input.js +3 -2
  68. package/dist/InputNumber.cjs +5 -4
  69. package/dist/InputNumber.d.cts +1 -1
  70. package/dist/InputNumber.d.ts +1 -1
  71. package/dist/InputNumber.js +4 -3
  72. package/dist/Message-2MZ3LFPU.css +45 -0
  73. package/dist/Message.cjs +23 -0
  74. package/dist/Message.d.cts +54 -0
  75. package/dist/Message.d.ts +54 -0
  76. package/dist/Message.js +2 -0
  77. package/dist/{Modal-XSDMU4XJ.css → Modal-2QNDW4SO.css} +27 -0
  78. package/dist/Modal.cjs +4 -4
  79. package/dist/Modal.d.cts +29 -4
  80. package/dist/Modal.d.ts +29 -4
  81. package/dist/Modal.js +3 -3
  82. package/dist/Pagination.cjs +7 -5
  83. package/dist/Pagination.js +6 -4
  84. package/dist/Popover.cjs +2 -2
  85. package/dist/Popover.d.cts +11 -3
  86. package/dist/Popover.d.ts +11 -3
  87. package/dist/Popover.js +1 -1
  88. package/dist/Radio-GVFDPAZM.css +97 -0
  89. package/dist/Radio.cjs +14 -0
  90. package/dist/Radio.d.cts +36 -0
  91. package/dist/Radio.d.ts +36 -0
  92. package/dist/Radio.js +1 -0
  93. package/dist/{Select-J3CCVFJ7.css → Select-Z5VYPEEY.css} +33 -24
  94. package/dist/Select.cjs +6 -4
  95. package/dist/Select.d.cts +29 -7
  96. package/dist/Select.d.ts +29 -7
  97. package/dist/Select.js +5 -3
  98. package/dist/Skeleton-CVWH2VWN.css +40 -0
  99. package/dist/Skeleton.cjs +10 -0
  100. package/dist/Skeleton.d.cts +30 -0
  101. package/dist/Skeleton.d.ts +30 -0
  102. package/dist/Skeleton.js +1 -0
  103. package/dist/Spin-3GJNMSIH.css +94 -0
  104. package/dist/Spin.cjs +10 -0
  105. package/dist/Spin.d.cts +20 -0
  106. package/dist/Spin.d.ts +20 -0
  107. package/dist/Spin.js +1 -0
  108. package/dist/{Table-2LPTOUIR.css → Table-ATJJQLKU.css} +0 -53
  109. package/dist/Table.cjs +9 -11
  110. package/dist/Table.d.cts +2 -21
  111. package/dist/Table.d.ts +2 -21
  112. package/dist/Table.js +8 -6
  113. package/dist/TablePro-3XVHYLSL.css +45 -0
  114. package/dist/TablePro.cjs +19 -0
  115. package/dist/TablePro.d.cts +21 -0
  116. package/dist/TablePro.d.ts +21 -0
  117. package/dist/TablePro.js +10 -0
  118. package/dist/{Tabs-RHK6XAFF.css → Tabs-BLSNI2T5.css} +0 -34
  119. package/dist/Tabs.cjs +2 -6
  120. package/dist/Tabs.d.cts +1 -16
  121. package/dist/Tabs.d.ts +1 -16
  122. package/dist/Tabs.js +1 -1
  123. package/dist/Tag-HDYCDPFS.css +42 -0
  124. package/dist/Tag.cjs +3 -7
  125. package/dist/Tag.d.cts +5 -14
  126. package/dist/Tag.d.ts +5 -14
  127. package/dist/Tag.js +2 -2
  128. package/dist/Textarea-YNET7IBH.css +54 -0
  129. package/dist/Textarea.cjs +15 -0
  130. package/dist/Textarea.d.cts +25 -0
  131. package/dist/Textarea.d.ts +25 -0
  132. package/dist/Textarea.js +2 -0
  133. package/dist/Theme.cjs +14 -10
  134. package/dist/Theme.d.cts +29 -6
  135. package/dist/Theme.d.ts +29 -6
  136. package/dist/Theme.js +1 -1
  137. package/dist/{Timeline-RHZAZKZ7.css → Timeline-3ZHOHPXT.css} +2 -2
  138. package/dist/Timeline.cjs +3 -3
  139. package/dist/Timeline.d.cts +1 -1
  140. package/dist/Timeline.d.ts +1 -1
  141. package/dist/Timeline.js +2 -2
  142. package/dist/Tooltip.cjs +2 -2
  143. package/dist/Tooltip.d.cts +17 -4
  144. package/dist/Tooltip.d.ts +17 -4
  145. package/dist/Tooltip.js +1 -1
  146. package/dist/Typography.cjs +7 -7
  147. package/dist/Typography.d.cts +1 -0
  148. package/dist/Typography.d.ts +1 -0
  149. package/dist/Typography.js +2 -2
  150. package/dist/{chunk-OVZTG5CP.cjs → chunk-2HQCUBA7.cjs} +2 -2
  151. package/dist/{chunk-X2U7EKCS.cjs → chunk-3YJU3D5S.cjs} +28 -5
  152. package/dist/chunk-45VJGBGN.js +25 -0
  153. package/dist/{chunk-3D77MQHO.js → chunk-46VXFTEC.js} +3 -3
  154. package/dist/chunk-47VG2P34.js +393 -0
  155. package/dist/{chunk-LZU33BX6.cjs → chunk-5DKRY67M.cjs} +4 -20
  156. package/dist/{chunk-TWGQZX2R.js → chunk-5H5YP2TB.js} +4 -19
  157. package/dist/chunk-5MN3PMF4.cjs +240 -0
  158. package/dist/{chunk-5A3RT4KD.js → chunk-5TKC6IEN.js} +4 -55
  159. package/dist/{chunk-N57NXCNC.cjs → chunk-6HMTV6P4.cjs} +3 -44
  160. package/dist/{chunk-RF2EY5JS.cjs → chunk-6ZXQJRAT.cjs} +153 -34
  161. package/dist/{chunk-OFGDUCT7.cjs → chunk-7AG524YZ.cjs} +3 -3
  162. package/dist/chunk-7IYKKLV3.js +283 -0
  163. package/dist/{chunk-73RQBWWW.js → chunk-AAGF7K3L.js} +2 -2
  164. package/dist/chunk-AXZ7ELMA.js +41 -0
  165. package/dist/{chunk-R6BIF3FF.js → chunk-BPOOVO5T.js} +5 -23
  166. package/dist/{chunk-OI3CWXT3.js → chunk-BVQ77VRY.js} +3 -3
  167. package/dist/{chunk-UXH5PH3S.js → chunk-CETNCRZ4.js} +2 -2
  168. package/dist/chunk-DG5VQ6BO.cjs +28 -0
  169. package/dist/chunk-DWAN57G4.js +243 -0
  170. package/dist/chunk-ELNT3CFO.js +64 -0
  171. package/dist/{chunk-ULOJ5UEY.js → chunk-ET6DYQVZ.js} +1 -1
  172. package/dist/chunk-F6RYCBQG.js +25 -0
  173. package/dist/{chunk-RPFMQZA5.js → chunk-FBYUZOZP.js} +42 -31
  174. package/dist/chunk-FGW5GJ22.cjs +132 -0
  175. package/dist/{chunk-6Y5WRCPW.js → chunk-FWPBORRB.js} +1 -1
  176. package/dist/chunk-GENABQYA.cjs +47 -0
  177. package/dist/{chunk-TGHBKKSS.js → chunk-GIZU3H6H.js} +3 -43
  178. package/dist/chunk-GMN74OEY.cjs +63 -0
  179. package/dist/{chunk-Y47YTYQ3.cjs → chunk-H4LGWZMH.cjs} +159 -8
  180. package/dist/chunk-HKF2V5MM.cjs +214 -0
  181. package/dist/chunk-HLFH5HWR.js +81 -0
  182. package/dist/{chunk-4WRE4HQP.js → chunk-HWFM4MAT.js} +18 -6
  183. package/dist/{chunk-GY3BSHHS.cjs → chunk-HZSIUOCN.cjs} +2 -55
  184. package/dist/{chunk-D46EM4EN.js → chunk-I5WTQ5Y3.js} +4 -4
  185. package/dist/chunk-J2HZTJO6.js +26 -0
  186. package/dist/{chunk-NN25YMOL.js → chunk-J5ZGYQZK.js} +153 -35
  187. package/dist/{chunk-WRDKOSSM.js → chunk-JCEHZ336.js} +1 -1
  188. package/dist/chunk-JVUVOR6S.js +110 -0
  189. package/dist/chunk-K5IGFBDR.js +113 -0
  190. package/dist/{chunk-Q2KG6SQK.cjs → chunk-K7FV7W6U.cjs} +5 -5
  191. package/dist/{chunk-PWW64ZWO.cjs → chunk-KD4YYIIO.cjs} +1 -32
  192. package/dist/chunk-KGSADAOD.cjs +170 -0
  193. package/dist/{chunk-54YLXXS2.js → chunk-ME5BZ2WA.js} +2 -2
  194. package/dist/chunk-MPVCYU2K.cjs +104 -0
  195. package/dist/{chunk-EEMWQX3C.cjs → chunk-NTS5L4NQ.cjs} +3 -3
  196. package/dist/{chunk-WBK6XIDJ.js → chunk-OBEKX4VR.js} +2 -32
  197. package/dist/{chunk-EBNRZRWY.cjs → chunk-P6EZG2R7.cjs} +5 -5
  198. package/dist/{chunk-KYEY2LIB.cjs → chunk-P6P4DGLF.cjs} +3 -3
  199. package/dist/{chunk-GOBWKQCX.cjs → chunk-PULGVK2I.cjs} +3 -3
  200. package/dist/chunk-Q5SZIU7Z.cjs +47 -0
  201. package/dist/chunk-QKQHZIF3.cjs +86 -0
  202. package/dist/{chunk-3TWNBJFI.cjs → chunk-QP3VCSRY.cjs} +6 -6
  203. package/dist/{chunk-6ODY6MGL.cjs → chunk-R2TEDH2F.cjs} +5 -5
  204. package/dist/{chunk-YRZGXXWA.js → chunk-SQGPSMSK.js} +14 -20
  205. package/dist/{chunk-IW5LW6XS.js → chunk-TEEFR2FD.js} +28 -5
  206. package/dist/chunk-TGL5BGMR.js +218 -0
  207. package/dist/{chunk-62GU4OHH.cjs → chunk-TP567B3L.cjs} +13 -20
  208. package/dist/chunk-UKS23N3L.js +191 -0
  209. package/dist/chunk-USQ43DJ5.js +147 -0
  210. package/dist/{chunk-G2K6ETP4.cjs → chunk-UUHFKIWP.cjs} +18 -6
  211. package/dist/{chunk-2MNAZRWE.cjs → chunk-V272XR3F.cjs} +271 -2
  212. package/dist/chunk-VFFIE2VO.cjs +271 -0
  213. package/dist/{chunk-FIO65XYG.cjs → chunk-X5GCOMC3.cjs} +49 -38
  214. package/dist/{chunk-Y3ZSG3SJ.cjs → chunk-XSN4TLN5.cjs} +11 -30
  215. package/dist/chunk-ZKE73UQF.cjs +138 -0
  216. package/dist/index.cjs +342 -132
  217. package/dist/index.d.cts +26 -20
  218. package/dist/index.d.ts +26 -20
  219. package/dist/index.js +35 -29
  220. package/dist/styles.css +515 -230
  221. package/docs/llms/alert.md +4 -3
  222. package/docs/llms/badge.md +3 -3
  223. package/docs/llms/button.md +11 -41
  224. package/docs/llms/card.md +6 -12
  225. package/docs/llms/cascader.md +22 -0
  226. package/docs/llms/{accordion.md → collapse.md} +13 -11
  227. package/docs/llms/drawer.md +1 -1
  228. package/docs/llms/form.md +1 -1
  229. package/docs/llms/image.md +72 -1
  230. package/docs/llms/input.md +28 -18
  231. package/docs/llms/message.md +63 -0
  232. package/docs/llms/modal.md +30 -0
  233. package/docs/llms/popover.md +18 -1
  234. package/docs/llms/radio.md +37 -1
  235. package/docs/llms/select.md +22 -2
  236. package/docs/llms/spin.md +59 -0
  237. package/docs/llms/table.md +3 -3
  238. package/docs/llms/tag.md +3 -2
  239. package/docs/llms/theme.md +41 -4
  240. package/docs/llms/tooltip.md +16 -3
  241. package/docs/llms.md +8 -8
  242. package/package.json +32 -52
  243. package/dist/Accordion-REMDCQUD.css +0 -44
  244. package/dist/Accordion.cjs +0 -11
  245. package/dist/Accordion.d.cts +0 -33
  246. package/dist/Accordion.d.ts +0 -33
  247. package/dist/Accordion.js +0 -2
  248. package/dist/Empty-NQ72W3D7.css +0 -160
  249. package/dist/Tag-FGDY3W7E.css +0 -51
  250. package/dist/Toast-YSACW3EM.css +0 -45
  251. package/dist/Toast.cjs +0 -15
  252. package/dist/Toast.d.cts +0 -26
  253. package/dist/Toast.d.ts +0 -26
  254. package/dist/Toast.js +0 -2
  255. package/dist/chunk-32HBMXXV.cjs +0 -208
  256. package/dist/chunk-3XTHKAEY.js +0 -39
  257. package/dist/chunk-5M26OVVY.js +0 -90
  258. package/dist/chunk-DOMYUGJY.js +0 -132
  259. package/dist/chunk-DPNDHNKK.js +0 -185
  260. package/dist/chunk-G2XK57I7.cjs +0 -116
  261. package/dist/chunk-HBWO3QKW.js +0 -74
  262. package/dist/chunk-JVS5ZALZ.js +0 -123
  263. package/dist/chunk-LIGHV4RC.cjs +0 -121
  264. package/dist/chunk-MCTIA6RZ.js +0 -99
  265. package/dist/chunk-NC4YUEXM.cjs +0 -145
  266. package/dist/chunk-NJ6B22YJ.js +0 -170
  267. package/dist/chunk-W64ARHLJ.cjs +0 -62
  268. package/dist/chunk-ZFW6OYAO.cjs +0 -100
  269. package/docs/llms/spinner.md +0 -58
  270. package/docs/llms/toast.md +0 -51
@@ -33,11 +33,36 @@
33
33
  flex: 1;
34
34
  min-width: 0;
35
35
  }
36
- .select-value > span {
36
+ .select-value-label {
37
37
  white-space: nowrap;
38
38
  overflow: hidden;
39
39
  text-overflow: ellipsis;
40
40
  }
41
+ .select-icon,
42
+ .menu-item-icon {
43
+ display: inline-flex;
44
+ align-items: center;
45
+ justify-content: center;
46
+ line-height: 0;
47
+ flex-shrink: 0;
48
+ }
49
+ .select-icon img,
50
+ .menu-item-icon img {
51
+ display: block;
52
+ width: 16px;
53
+ height: 16px;
54
+ object-fit: contain;
55
+ }
56
+ .select.sm .select-icon img,
57
+ .select.sm .menu-item-icon img {
58
+ width: 14px;
59
+ height: 14px;
60
+ }
61
+ .select.lg .select-icon img,
62
+ .select.lg .menu-item-icon img {
63
+ width: 18px;
64
+ height: 18px;
65
+ }
41
66
  .select.invalid .select-trigger {
42
67
  box-shadow: var(--neu-out-sm), 0 0 0 2px color-mix(in oklch, var(--danger) 30%, transparent);
43
68
  }
@@ -128,32 +153,12 @@
128
153
 
129
154
  /* Menu search — flush with menu, single subtle separator (no nested frame) */
130
155
  .menu-search {
131
- display: flex;
132
- align-items: center;
133
- gap: 8px;
134
- height: 32px;
135
- padding: 0 6px;
156
+ display: block;
157
+ padding: 4px 2px 8px;
136
158
  margin: -2px -2px 4px;
137
159
  border-bottom: 1px solid var(--divider);
138
- color: var(--fg-subtle);
139
- transition: color var(--dur) var(--ease);
140
- }
141
- .menu-search:focus-within { color: var(--accent); }
142
- .menu-search input {
143
- flex: 1;
144
- min-width: 0;
145
- border: none;
146
- outline: none;
147
- background: transparent;
148
- color: var(--fg);
149
- font-size: 13px;
150
- font-family: inherit;
151
- height: 100%;
152
- padding: 0;
153
160
  }
154
- .menu-search input::placeholder { color: var(--fg-subtle); }
155
- .menu-search input:focus,
156
- .menu-search input:focus-visible { box-shadow: none; }
161
+ .menu-search .input-wrap { width: 100%; }
157
162
 
158
163
  /* Menu state (loading / empty) */
159
164
  .menu-state {
@@ -179,8 +184,12 @@
179
184
  .menu-state .menu-state-ico .spinner {
180
185
  width: 16px;
181
186
  height: 16px;
187
+ display: inline-block;
188
+ border-radius: 999px;
189
+ border: 2px solid var(--accent);
182
190
  border-color: var(--accent);
183
191
  border-right-color: transparent;
192
+ animation: spin 0.8s linear infinite;
184
193
  }
185
194
 
186
195
  /* Option body — supports description line under label */
package/dist/Select.cjs CHANGED
@@ -1,13 +1,15 @@
1
1
  'use strict';
2
2
 
3
- var chunkFIO65XYG_cjs = require('./chunk-FIO65XYG.cjs');
4
- require('./chunk-LZU33BX6.cjs');
3
+ var chunkX5GCOMC3_cjs = require('./chunk-X5GCOMC3.cjs');
4
+ require('./chunk-5DKRY67M.cjs');
5
5
  require('./chunk-YB3IWIOJ.cjs');
6
- require('./chunk-2MNAZRWE.cjs');
6
+ require('./chunk-HKF2V5MM.cjs');
7
+ require('./chunk-MPVCYU2K.cjs');
8
+ require('./chunk-V272XR3F.cjs');
7
9
 
8
10
 
9
11
 
10
12
  Object.defineProperty(exports, "Select", {
11
13
  enumerable: true,
12
- get: function () { return chunkFIO65XYG_cjs.Select; }
14
+ get: function () { return chunkX5GCOMC3_cjs.Select; }
13
15
  });
package/dist/Select.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
- import { IconName } from './Icon.cjs';
2
+ import { IconSlot } from './Icon.cjs';
3
+ import 'react/jsx-runtime';
3
4
 
4
5
  interface SelectOption<T extends string | number = string> {
5
6
  value: T;
@@ -8,8 +9,8 @@ interface SelectOption<T extends string | number = string> {
8
9
  text?: string;
9
10
  /** Secondary line shown beneath the label. */
10
11
  description?: React.ReactNode;
11
- /** Leading icon. */
12
- icon?: IconName;
12
+ /** Leading icon. Accepts a built-in icon name or custom React node. */
13
+ icon?: IconSlot;
13
14
  disabled?: boolean;
14
15
  }
15
16
  interface SelectOptionGroup<T extends string | number = string> {
@@ -18,6 +19,13 @@ interface SelectOptionGroup<T extends string | number = string> {
18
19
  options: SelectOption<T>[];
19
20
  }
20
21
  type SelectItem<T extends string | number = string> = SelectOption<T> | SelectOptionGroup<T>;
22
+ type SelectFilterOption<T extends string | number = string> = boolean | ((input: string, option: SelectOption<T>) => boolean);
23
+ type SelectSingleChangeHandler<T extends string | number = string> = {
24
+ bivarianceHack(value: any): void;
25
+ }["bivarianceHack"];
26
+ type SelectMultiChangeHandler<T extends string | number = string> = {
27
+ bivarianceHack(value: T[]): void;
28
+ }["bivarianceHack"];
21
29
  interface BaseSelectProps<T extends string | number = string> extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
22
30
  /** Flat or mixed (groups + options) item list. */
23
31
  options: SelectItem<T>[];
@@ -28,10 +36,18 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
28
36
  invalid?: boolean;
29
37
  /** Show a small × to clear the selection (single mode) or all selections (multi). */
30
38
  clearable?: boolean;
39
+ /** Alias for `clearable`. */
40
+ allowClear?: boolean | {
41
+ clearIcon?: React.ReactNode;
42
+ };
31
43
  /** Add a search input at the top of the menu. */
32
44
  searchable?: boolean;
45
+ /** Alias for `searchable`. */
46
+ showSearch?: boolean;
33
47
  /** Custom filter — defaults to label/text/value substring match. */
34
- filterOption?: (input: string, option: SelectOption<T>) => boolean;
48
+ filterOption?: SelectFilterOption<T>;
49
+ /** Field used by the default filter. */
50
+ optionFilterProp?: "label" | "value" | "text" | string;
35
51
  /** Show spinner instead of options. */
36
52
  loading?: boolean;
37
53
  /** Custom empty content when no options match. */
@@ -43,12 +59,16 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
43
59
  className?: string;
44
60
  /** Class for the popped-out menu. */
45
61
  menuClassName?: string;
62
+ /** Alias for `menuClassName`. */
63
+ popupClassName?: string;
64
+ /** Additional alias for `menuClassName`. */
65
+ dropdownClassName?: string;
46
66
  }
47
67
  interface SingleSelectProps<T extends string | number = string> extends BaseSelectProps<T> {
48
68
  multiple?: false;
49
69
  value?: T;
50
70
  defaultValue?: T;
51
- onChange?: (value: T) => void;
71
+ onChange?: SelectSingleChangeHandler<T>;
52
72
  /** Fired when user clears the selection via the × button. */
53
73
  onClear?: () => void;
54
74
  }
@@ -56,7 +76,9 @@ interface MultiSelectProps<T extends string | number = string> extends BaseSelec
56
76
  multiple: true;
57
77
  value?: T[];
58
78
  defaultValue?: T[];
59
- onChange?: (value: T[]) => void;
79
+ onChange?: SelectMultiChangeHandler<T>;
80
+ /** Fired when user clears all selections via the × button. */
81
+ onClear?: () => void;
60
82
  /** Max selected items shown as tags before collapsing to "+N". */
61
83
  maxTagCount?: number;
62
84
  }
@@ -68,4 +90,4 @@ type SelectComponent = {
68
90
  /** `Select` — neumorphic dropdown. Set `multiple` for tag-style multi-select. */
69
91
  declare const Select: SelectComponent;
70
92
 
71
- export { type MultiSelectProps, Select, type SelectItem, type SelectOption, type SelectOptionGroup, type SelectProps, type SingleSelectProps };
93
+ export { type MultiSelectProps, Select, type SelectFilterOption, type SelectItem, type SelectMultiChangeHandler, type SelectOption, type SelectOptionGroup, type SelectProps, type SelectSingleChangeHandler, type SingleSelectProps };
package/dist/Select.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
- import { IconName } from './Icon.js';
2
+ import { IconSlot } from './Icon.js';
3
+ import 'react/jsx-runtime';
3
4
 
4
5
  interface SelectOption<T extends string | number = string> {
5
6
  value: T;
@@ -8,8 +9,8 @@ interface SelectOption<T extends string | number = string> {
8
9
  text?: string;
9
10
  /** Secondary line shown beneath the label. */
10
11
  description?: React.ReactNode;
11
- /** Leading icon. */
12
- icon?: IconName;
12
+ /** Leading icon. Accepts a built-in icon name or custom React node. */
13
+ icon?: IconSlot;
13
14
  disabled?: boolean;
14
15
  }
15
16
  interface SelectOptionGroup<T extends string | number = string> {
@@ -18,6 +19,13 @@ interface SelectOptionGroup<T extends string | number = string> {
18
19
  options: SelectOption<T>[];
19
20
  }
20
21
  type SelectItem<T extends string | number = string> = SelectOption<T> | SelectOptionGroup<T>;
22
+ type SelectFilterOption<T extends string | number = string> = boolean | ((input: string, option: SelectOption<T>) => boolean);
23
+ type SelectSingleChangeHandler<T extends string | number = string> = {
24
+ bivarianceHack(value: any): void;
25
+ }["bivarianceHack"];
26
+ type SelectMultiChangeHandler<T extends string | number = string> = {
27
+ bivarianceHack(value: T[]): void;
28
+ }["bivarianceHack"];
21
29
  interface BaseSelectProps<T extends string | number = string> extends Omit<React.HTMLAttributes<HTMLDivElement>, "onChange" | "defaultValue"> {
22
30
  /** Flat or mixed (groups + options) item list. */
23
31
  options: SelectItem<T>[];
@@ -28,10 +36,18 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
28
36
  invalid?: boolean;
29
37
  /** Show a small × to clear the selection (single mode) or all selections (multi). */
30
38
  clearable?: boolean;
39
+ /** Alias for `clearable`. */
40
+ allowClear?: boolean | {
41
+ clearIcon?: React.ReactNode;
42
+ };
31
43
  /** Add a search input at the top of the menu. */
32
44
  searchable?: boolean;
45
+ /** Alias for `searchable`. */
46
+ showSearch?: boolean;
33
47
  /** Custom filter — defaults to label/text/value substring match. */
34
- filterOption?: (input: string, option: SelectOption<T>) => boolean;
48
+ filterOption?: SelectFilterOption<T>;
49
+ /** Field used by the default filter. */
50
+ optionFilterProp?: "label" | "value" | "text" | string;
35
51
  /** Show spinner instead of options. */
36
52
  loading?: boolean;
37
53
  /** Custom empty content when no options match. */
@@ -43,12 +59,16 @@ interface BaseSelectProps<T extends string | number = string> extends Omit<React
43
59
  className?: string;
44
60
  /** Class for the popped-out menu. */
45
61
  menuClassName?: string;
62
+ /** Alias for `menuClassName`. */
63
+ popupClassName?: string;
64
+ /** Additional alias for `menuClassName`. */
65
+ dropdownClassName?: string;
46
66
  }
47
67
  interface SingleSelectProps<T extends string | number = string> extends BaseSelectProps<T> {
48
68
  multiple?: false;
49
69
  value?: T;
50
70
  defaultValue?: T;
51
- onChange?: (value: T) => void;
71
+ onChange?: SelectSingleChangeHandler<T>;
52
72
  /** Fired when user clears the selection via the × button. */
53
73
  onClear?: () => void;
54
74
  }
@@ -56,7 +76,9 @@ interface MultiSelectProps<T extends string | number = string> extends BaseSelec
56
76
  multiple: true;
57
77
  value?: T[];
58
78
  defaultValue?: T[];
59
- onChange?: (value: T[]) => void;
79
+ onChange?: SelectMultiChangeHandler<T>;
80
+ /** Fired when user clears all selections via the × button. */
81
+ onClear?: () => void;
60
82
  /** Max selected items shown as tags before collapsing to "+N". */
61
83
  maxTagCount?: number;
62
84
  }
@@ -68,4 +90,4 @@ type SelectComponent = {
68
90
  /** `Select` — neumorphic dropdown. Set `multiple` for tag-style multi-select. */
69
91
  declare const Select: SelectComponent;
70
92
 
71
- export { type MultiSelectProps, Select, type SelectItem, type SelectOption, type SelectOptionGroup, type SelectProps, type SingleSelectProps };
93
+ export { type MultiSelectProps, Select, type SelectFilterOption, type SelectItem, type SelectMultiChangeHandler, type SelectOption, type SelectOptionGroup, type SelectProps, type SelectSingleChangeHandler, type SingleSelectProps };
package/dist/Select.js CHANGED
@@ -1,4 +1,6 @@
1
- export { Select } from './chunk-RPFMQZA5.js';
2
- import './chunk-TWGQZX2R.js';
1
+ export { Select } from './chunk-FBYUZOZP.js';
2
+ import './chunk-5H5YP2TB.js';
3
3
  import './chunk-DUFRASGO.js';
4
- import './chunk-NJ6B22YJ.js';
4
+ import './chunk-UKS23N3L.js';
5
+ import './chunk-HLFH5HWR.js';
6
+ import './chunk-47VG2P34.js';
@@ -0,0 +1,40 @@
1
+ /* ============ Skeleton ============ */
2
+ .skeleton {
3
+ display: block;
4
+ background: color-mix(in oklch, var(--accent-soft) 55%, var(--bg-sunken));
5
+ border-radius: var(--r-sm);
6
+ }
7
+ .skeleton.wave {
8
+ background: linear-gradient(90deg,
9
+ color-mix(in oklch, var(--accent-soft) 35%, var(--bg-sunken)),
10
+ color-mix(in oklch, var(--accent-soft) 75%, var(--bg-sunken)),
11
+ color-mix(in oklch, var(--accent-soft) 35%, var(--bg-sunken)));
12
+ background-size: 200% 100%;
13
+ animation: skel-wave 1.4s ease-in-out infinite;
14
+ }
15
+ .skeleton.pulse { animation: skel-pulse 1.4s ease-in-out infinite; }
16
+ .skeleton.none { animation: none; }
17
+ .skeleton.circle { border-radius: 999px; }
18
+ @keyframes skel-wave { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
19
+ @keyframes skel-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.5; } }
20
+
21
+ .skeleton-box {
22
+ display: flex;
23
+ align-items: flex-start;
24
+ gap: 16px;
25
+ width: 100%;
26
+ }
27
+ .skeleton-content {
28
+ flex: 1;
29
+ min-width: 0;
30
+ display: flex;
31
+ flex-direction: column;
32
+ gap: 12px;
33
+ }
34
+ .skeleton-box .skeleton-title {
35
+ display: block;
36
+ margin-bottom: 4px;
37
+ }
38
+ .skeleton-box .skeleton-row {
39
+ display: block;
40
+ }
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var chunkHZSIUOCN_cjs = require('./chunk-HZSIUOCN.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "Skeleton", {
8
+ enumerable: true,
9
+ get: function () { return chunkHZSIUOCN_cjs.Skeleton; }
10
+ });
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+
3
+ interface SkeletonAvatarConfig {
4
+ shape?: "circle" | "square";
5
+ size?: "sm" | "md" | "lg";
6
+ }
7
+ interface SkeletonTitleConfig {
8
+ width?: number | string;
9
+ }
10
+ interface SkeletonParagraphConfig {
11
+ rows?: number;
12
+ width?: (number | string)[];
13
+ }
14
+ interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
15
+ width?: number | string;
16
+ height?: number | string;
17
+ circle?: boolean;
18
+ /** `wave` is a shimmer sweep; `pulse` fades opacity; `none` disables animation. */
19
+ animation?: "wave" | "pulse" | "none";
20
+ avatar?: boolean | SkeletonAvatarConfig;
21
+ title?: boolean | SkeletonTitleConfig;
22
+ paragraph?: boolean | SkeletonParagraphConfig;
23
+ className?: string;
24
+ }
25
+ /**
26
+ * `Skeleton` — content placeholder during loading.
27
+ */
28
+ declare const Skeleton: React.ForwardRefExoticComponent<SkeletonProps & React.RefAttributes<HTMLElement>>;
29
+
30
+ export { Skeleton, type SkeletonAvatarConfig, type SkeletonParagraphConfig, type SkeletonProps, type SkeletonTitleConfig };
@@ -0,0 +1,30 @@
1
+ import * as React from 'react';
2
+
3
+ interface SkeletonAvatarConfig {
4
+ shape?: "circle" | "square";
5
+ size?: "sm" | "md" | "lg";
6
+ }
7
+ interface SkeletonTitleConfig {
8
+ width?: number | string;
9
+ }
10
+ interface SkeletonParagraphConfig {
11
+ rows?: number;
12
+ width?: (number | string)[];
13
+ }
14
+ interface SkeletonProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
15
+ width?: number | string;
16
+ height?: number | string;
17
+ circle?: boolean;
18
+ /** `wave` is a shimmer sweep; `pulse` fades opacity; `none` disables animation. */
19
+ animation?: "wave" | "pulse" | "none";
20
+ avatar?: boolean | SkeletonAvatarConfig;
21
+ title?: boolean | SkeletonTitleConfig;
22
+ paragraph?: boolean | SkeletonParagraphConfig;
23
+ className?: string;
24
+ }
25
+ /**
26
+ * `Skeleton` — content placeholder during loading.
27
+ */
28
+ declare const Skeleton: React.ForwardRefExoticComponent<SkeletonProps & React.RefAttributes<HTMLElement>>;
29
+
30
+ export { Skeleton, type SkeletonAvatarConfig, type SkeletonParagraphConfig, type SkeletonProps, type SkeletonTitleConfig };
@@ -0,0 +1 @@
1
+ export { Skeleton } from './chunk-5TKC6IEN.js';
@@ -0,0 +1,94 @@
1
+ /* ============ Spin ============ */
2
+ .spin {
3
+ width: 14px;
4
+ height: 14px;
5
+ border-radius: 999px;
6
+ border: 2px solid currentColor;
7
+ border-right-color: transparent;
8
+ animation: spin 0.8s linear infinite;
9
+ display: inline-block;
10
+ }
11
+
12
+ .spin.accent { color: var(--accent); }
13
+ .spin.success { color: var(--success); }
14
+ .spin.warning { color: var(--warning); }
15
+ .spin.danger { color: var(--danger); }
16
+
17
+ .spin.ring {
18
+ position: relative;
19
+ display: inline-block;
20
+ border: none;
21
+ border-radius: 50%;
22
+ background: var(--bg);
23
+ box-shadow: var(--neu-in-sm);
24
+ animation: none;
25
+ }
26
+
27
+ .spin.ring::before {
28
+ content: "";
29
+ position: absolute;
30
+ inset: 0;
31
+ border-radius: inherit;
32
+ background: conic-gradient(from 0deg,
33
+ transparent 0deg,
34
+ color-mix(in oklch, currentColor 30%, transparent) 40deg,
35
+ color-mix(in oklch, currentColor 70%, transparent) 100deg,
36
+ currentColor 220deg,
37
+ currentColor 340deg,
38
+ transparent 360deg);
39
+ -webkit-mask: radial-gradient(circle, transparent 60%, currentColor 61%);
40
+ mask: radial-gradient(circle, transparent 60%, currentColor 61%);
41
+ animation: spin 0.9s linear infinite;
42
+ }
43
+
44
+ .spin.ring.accent::before,
45
+ .spin.ring.success::before,
46
+ .spin.ring.warning::before,
47
+ .spin.ring.danger::before {
48
+ filter: drop-shadow(0 0 4px color-mix(in oklch, currentColor 50%, transparent));
49
+ }
50
+
51
+ .spin.dots {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: 0.34em;
55
+ border: none;
56
+ background: none;
57
+ box-shadow: none;
58
+ width: auto;
59
+ height: auto;
60
+ animation: none;
61
+ line-height: 1;
62
+ }
63
+
64
+ .spin.dots i {
65
+ width: 0.4em;
66
+ height: 0.4em;
67
+ border-radius: 999px;
68
+ background: radial-gradient(circle at 32% 28%,
69
+ color-mix(in oklch, currentColor 40%, var(--bg)),
70
+ currentColor 62%,
71
+ color-mix(in oklch, currentColor 82%, var(--fg)) 100%);
72
+ box-shadow:
73
+ 0 0.06em 0.14em color-mix(in oklch, currentColor 45%, transparent),
74
+ 0 0 0.35em color-mix(in oklch, currentColor 50%, transparent);
75
+ display: inline-block;
76
+ animation: spin-dot-bounce 1.2s ease-in-out infinite;
77
+ }
78
+
79
+ .spin.dots i:nth-child(2) { animation-delay: 0.15s; }
80
+ .spin.dots i:nth-child(3) { animation-delay: 0.3s; }
81
+
82
+ @keyframes spin-dot-bounce {
83
+ 0%, 80%, 100% { transform: translateY(0); opacity: 0.5; }
84
+ 40% { transform: translateY(-30%); opacity: 1; }
85
+ }
86
+
87
+ .spin-wrap {
88
+ display: inline-flex;
89
+ align-items: center;
90
+ gap: 8px;
91
+ color: var(--fg-muted);
92
+ }
93
+
94
+ .spin-label { font-size: 12px; }
package/dist/Spin.cjs ADDED
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var chunkQKQHZIF3_cjs = require('./chunk-QKQHZIF3.cjs');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "Spin", {
8
+ enumerable: true,
9
+ get: function () { return chunkQKQHZIF3_cjs.Spin; }
10
+ });
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+
3
+ type SpinSize = "small" | "default" | "large" | number;
4
+ interface SpinProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ size?: SpinSize;
6
+ tone?: "accent" | "success" | "warning" | "danger" | "current";
7
+ /** Text rendered next to the indicator. */
8
+ tip?: React.ReactNode;
9
+ /** Same as `tip`; useful when a `label` prop reads better at call sites. */
10
+ label?: React.ReactNode;
11
+ /** `ring` is the default border spinner; `dots` is a three-dot bounce. */
12
+ variant?: "ring" | "dots";
13
+ /** Hide the indicator while preserving wrapper rendering. */
14
+ spinning?: boolean;
15
+ className?: string;
16
+ }
17
+ /** `Spin` — loading indicator. */
18
+ declare const Spin: React.ForwardRefExoticComponent<SpinProps & React.RefAttributes<HTMLSpanElement>>;
19
+
20
+ export { Spin, type SpinProps, type SpinSize };
package/dist/Spin.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import * as React from 'react';
2
+
3
+ type SpinSize = "small" | "default" | "large" | number;
4
+ interface SpinProps extends React.HTMLAttributes<HTMLSpanElement> {
5
+ size?: SpinSize;
6
+ tone?: "accent" | "success" | "warning" | "danger" | "current";
7
+ /** Text rendered next to the indicator. */
8
+ tip?: React.ReactNode;
9
+ /** Same as `tip`; useful when a `label` prop reads better at call sites. */
10
+ label?: React.ReactNode;
11
+ /** `ring` is the default border spinner; `dots` is a three-dot bounce. */
12
+ variant?: "ring" | "dots";
13
+ /** Hide the indicator while preserving wrapper rendering. */
14
+ spinning?: boolean;
15
+ className?: string;
16
+ }
17
+ /** `Spin` — loading indicator. */
18
+ declare const Spin: React.ForwardRefExoticComponent<SpinProps & React.RefAttributes<HTMLSpanElement>>;
19
+
20
+ export { Spin, type SpinProps, type SpinSize };
package/dist/Spin.js ADDED
@@ -0,0 +1 @@
1
+ export { Spin } from './chunk-ELNT3CFO.js';
@@ -1,10 +1,4 @@
1
1
  /* ============ Table ============ */
2
- .table-card {
3
- border-radius: var(--r-lg);
4
- background: var(--bg);
5
- box-shadow: var(--neu-out-sm);
6
- overflow: hidden;
7
- }
8
2
  .table-wrap {
9
3
  border-radius: var(--r-lg);
10
4
  background: var(--bg);
@@ -246,50 +240,3 @@
246
240
  .table-pagination {
247
241
  margin-top: 12px;
248
242
  }
249
-
250
- /* Pro: card-wrap with toolbar + table + footer */
251
- .table-card {
252
- border-radius: var(--r-lg);
253
- background: var(--bg);
254
- box-shadow: var(--neu-out-sm);
255
- overflow: hidden;
256
- }
257
- .table-card .table-wrap { background: transparent; box-shadow: none; border-radius: 0; }
258
- .table-card .table-wrap.joined { border-radius: 0; }
259
- /* When TablePro hosts the built-in pagination, seat it inside the card. */
260
- .table-card .table-pagination {
261
- margin-top: 0;
262
- padding: 6px 16px;
263
- border-top: 1px solid var(--divider);
264
- background: color-mix(in oklch, var(--bg-sunken) 30%, transparent);
265
- }
266
- .table-toolbar {
267
- display: flex;
268
- align-items: center;
269
- gap: var(--gap-3);
270
- padding: 14px 16px;
271
- border-bottom: 1px solid var(--divider);
272
- }
273
- .table-toolbar .table-title {
274
- font-size: 14px;
275
- font-weight: 600;
276
- margin-right: 8px;
277
- }
278
- .table-toolbar-main {
279
- flex: 1;
280
- display: flex;
281
- align-items: center;
282
- gap: 10px;
283
- min-width: 0;
284
- }
285
- .table-toolbar-actions {
286
- display: flex;
287
- align-items: center;
288
- gap: 8px;
289
- flex-shrink: 0;
290
- }
291
- .table-footer {
292
- padding: 10px 16px;
293
- border-top: 1px solid var(--divider);
294
- background: color-mix(in oklch, var(--bg-sunken) 30%, transparent);
295
- }
package/dist/Table.cjs CHANGED
@@ -1,20 +1,18 @@
1
1
  'use strict';
2
2
 
3
- var chunkY3ZSG3SJ_cjs = require('./chunk-Y3ZSG3SJ.cjs');
4
- require('./chunk-EBNRZRWY.cjs');
5
- require('./chunk-FIO65XYG.cjs');
6
- require('./chunk-LZU33BX6.cjs');
7
- require('./chunk-N57NXCNC.cjs');
3
+ var chunkXSN4TLN5_cjs = require('./chunk-XSN4TLN5.cjs');
4
+ require('./chunk-P6EZG2R7.cjs');
5
+ require('./chunk-X5GCOMC3.cjs');
6
+ require('./chunk-5DKRY67M.cjs');
7
+ require('./chunk-6HMTV6P4.cjs');
8
8
  require('./chunk-YB3IWIOJ.cjs');
9
- require('./chunk-2MNAZRWE.cjs');
9
+ require('./chunk-HKF2V5MM.cjs');
10
+ require('./chunk-MPVCYU2K.cjs');
11
+ require('./chunk-V272XR3F.cjs');
10
12
 
11
13
 
12
14
 
13
15
  Object.defineProperty(exports, "Table", {
14
16
  enumerable: true,
15
- get: function () { return chunkY3ZSG3SJ_cjs.Table; }
16
- });
17
- Object.defineProperty(exports, "TablePro", {
18
- enumerable: true,
19
- get: function () { return chunkY3ZSG3SJ_cjs.TablePro; }
17
+ get: function () { return chunkXSN4TLN5_cjs.Table; }
20
18
  });