@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
package/dist/Table.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
 
4
+ type RowKey = string | number;
5
+ interface TableColumnFilterItem {
6
+ text: React.ReactNode;
7
+ value: string | number;
8
+ }
4
9
  interface TableColumn<Row = any> {
5
10
  key: string;
6
11
  title: React.ReactNode;
@@ -10,12 +15,78 @@ interface TableColumn<Row = any> {
10
15
  width?: number | string;
11
16
  align?: "left" | "center" | "right";
12
17
  sortable?: boolean;
18
+ /** Filter options shown in header dropdown. Requires `onFilter` (or data index match). */
19
+ filters?: TableColumnFilterItem[];
20
+ /**
21
+ * Predicate to decide whether a row matches a given filter value.
22
+ * If omitted, falls back to strict equality on `row[dataIndex]`.
23
+ */
24
+ onFilter?: (value: string | number, row: Row) => boolean;
25
+ /**
26
+ * Default active filter values. When `filteredValue` is controlled externally via
27
+ * `Table.filteredValue`, prefer managing it at the table level.
28
+ */
29
+ defaultFilteredValue?: (string | number)[];
30
+ /** Controlled filter selection — when provided, makes the column's filter controlled. */
31
+ filteredValue?: (string | number)[];
13
32
  }
14
33
  type TableVariant = "default" | "striped" | "embossed" | "cards";
34
+ interface PaginationConfig {
35
+ /** Current page (1-indexed). Makes pagination controlled. */
36
+ current?: number;
37
+ /** Uncontrolled initial page. */
38
+ defaultCurrent?: number;
39
+ /** Items per page. */
40
+ pageSize?: number;
41
+ /** Default items per page (uncontrolled). */
42
+ defaultPageSize?: number;
43
+ /** Total item count. Defaults to `data.length` when omitted. */
44
+ total?: number;
45
+ /** Fired when user picks a page or changes page size. */
46
+ onChange?: (page: number, pageSize: number) => void;
47
+ /** Reserved for future: jump-to-page input. */
48
+ showQuickJumper?: boolean;
49
+ /** Reserved for future: page size dropdown. */
50
+ showSizeChanger?: boolean;
51
+ /** Reserved for future: selectable page sizes. */
52
+ pageSizeOptions?: number[];
53
+ }
54
+ interface RowSelectionConfig<Row = any> {
55
+ /** "checkbox" (default) allows multi-select; "radio" allows only one row at a time. */
56
+ type?: "checkbox" | "radio";
57
+ /** Controlled list of selected row keys. */
58
+ selectedRowKeys?: RowKey[];
59
+ /** Uncontrolled initial selection. */
60
+ defaultSelectedRowKeys?: RowKey[];
61
+ /** Fired on selection change; receives the new keys and matching rows. */
62
+ onChange?: (selectedRowKeys: RowKey[], selectedRows: Row[]) => void;
63
+ /** Per-row switch toggling checkbox disabled state. */
64
+ getCheckboxProps?: (row: Row) => {
65
+ disabled?: boolean;
66
+ };
67
+ }
68
+ interface ExpandableConfig<Row = any> {
69
+ /** Controlled expanded row keys. */
70
+ expandedRowKeys?: RowKey[];
71
+ /** Uncontrolled initial expanded row keys. */
72
+ defaultExpandedRowKeys?: RowKey[];
73
+ /** Fired when a row expands / collapses. */
74
+ onExpand?: (expanded: boolean, row: Row) => void;
75
+ /** Render function for the expanded panel. When omitted, no expand UI renders. */
76
+ expandedRowRender?: (row: Row, index: number) => React.ReactNode;
77
+ /** Decide whether a given row can be expanded. */
78
+ rowExpandable?: (row: Row) => boolean;
79
+ }
80
+ interface TableScrollConfig {
81
+ /** Horizontal scroll: min-width of the inner table. */
82
+ x?: number | string;
83
+ /** Vertical scroll: max body height (with sticky header). */
84
+ y?: number | string;
85
+ }
15
86
  interface TableProps<Row = any> {
16
87
  columns: TableColumn<Row>[];
17
88
  data: Row[];
18
- rowKey?: keyof Row | ((row: Row) => string | number);
89
+ rowKey?: keyof Row | ((row: Row) => RowKey);
19
90
  /** Visual variant. */
20
91
  variant?: TableVariant;
21
92
  /** Hoverable rows. */
@@ -26,10 +97,32 @@ interface TableProps<Row = any> {
26
97
  sortKey?: string;
27
98
  sortDir?: "asc" | "desc";
28
99
  onSort?: (key: string) => void;
29
- /** Row selection — controlled list of selected row keys. */
100
+ /**
101
+ * Row selection config — preferred API (antd-style).
102
+ * When provided, takes precedence over `selectable` / `selected` / `onSelect`.
103
+ */
104
+ rowSelection?: RowSelectionConfig<Row>;
105
+ /**
106
+ * @deprecated Use `rowSelection` instead. Kept for backwards compatibility.
107
+ */
30
108
  selectable?: boolean;
31
- selected?: (string | number)[];
32
- onSelect?: (keys: (string | number)[]) => void;
109
+ /**
110
+ * @deprecated Use `rowSelection.selectedRowKeys` instead.
111
+ */
112
+ selected?: RowKey[];
113
+ /**
114
+ * @deprecated Use `rowSelection.onChange` instead.
115
+ */
116
+ onSelect?: (keys: RowKey[]) => void;
117
+ /** Expandable row config. */
118
+ expandable?: ExpandableConfig<Row>;
119
+ /**
120
+ * Pagination config — `false` disables pagination; otherwise renders a bottom
121
+ * pagination bar and slices the data accordingly.
122
+ */
123
+ pagination?: false | PaginationConfig;
124
+ /** Horizontal / vertical scroll config. */
125
+ scroll?: TableScrollConfig;
33
126
  /** Called when user clicks a row. */
34
127
  onRowClick?: (row: Row, index: number) => void;
35
128
  /** Empty state. */
@@ -37,13 +130,13 @@ interface TableProps<Row = any> {
37
130
  className?: string;
38
131
  }
39
132
  /** `Table` — neumorphic data table with sorting, selection and visual variants. */
40
- declare function Table<Row extends Record<string, any> = any>({ columns, data, rowKey, variant, hoverable, striped, sortKey, sortDir, onSort, selectable, selected, onSelect, onRowClick, empty, className, }: TableProps<Row>): react_jsx_runtime.JSX.Element;
133
+ declare function Table<Row extends Record<string, any> = any>({ columns, data, rowKey, variant, hoverable, striped, sortKey, sortDir, onSort, rowSelection, selectable, selected, onSelect, expandable, pagination, scroll, onRowClick, empty, className, }: TableProps<Row>): react_jsx_runtime.JSX.Element;
41
134
  interface TableProProps<Row = any> extends TableProps<Row> {
42
135
  /** Toolbar slot — search input, filter, etc. */
43
136
  toolbar?: React.ReactNode;
44
137
  /** Right-aligned actions slot in toolbar. */
45
138
  actions?: React.ReactNode;
46
- /** Footer slot — usually <Pagination />. */
139
+ /** Footer slot — usually <Pagination />. Optional now that `pagination` is built-in. */
47
140
  footer?: React.ReactNode;
48
141
  /** Title shown above the toolbar. */
49
142
  title?: React.ReactNode;
@@ -51,7 +144,10 @@ interface TableProProps<Row = any> extends TableProps<Row> {
51
144
  /**
52
145
  * `TablePro` — full-featured table card with toolbar, sortable/selectable rows,
53
146
  * variants, and a footer slot for pagination.
147
+ *
148
+ * Prefer the built-in `pagination` prop over rendering a `<Pagination />` in the
149
+ * `footer` slot; `footer` still works for custom footers.
54
150
  */
55
151
  declare function TablePro<Row extends Record<string, any> = any>({ toolbar, actions, footer, title, className, ...tableProps }: TableProProps<Row>): react_jsx_runtime.JSX.Element;
56
152
 
57
- export { Table, type TableColumn, TablePro, type TableProProps, type TableProps, type TableVariant };
153
+ export { type ExpandableConfig, type PaginationConfig, type RowKey, type RowSelectionConfig, Table, type TableColumn, type TableColumnFilterItem, TablePro, type TableProProps, type TableProps, type TableScrollConfig, type TableVariant };
package/dist/Table.js CHANGED
@@ -1,5 +1,9 @@
1
- export { Table, TablePro } from './chunk-2W2AJUZW.js';
1
+ export { Table, TablePro } from './chunk-E6R63QOL.js';
2
+ import './chunk-TYQ5CN2C.js';
3
+ import './chunk-ZVCMXDTP.js';
4
+ import './chunk-AJZKESHB.js';
2
5
  import './chunk-M6CGYGEO.js';
6
+ import './chunk-V2DIQ3RH.js';
3
7
  import './chunk-GEYMWUW6.js';
4
8
  //# sourceMappingURL=Table.js.map
5
9
  //# sourceMappingURL=Table.js.map
@@ -58,6 +58,13 @@
58
58
  box-shadow: 0 0 8px var(--accent-glow);
59
59
  }
60
60
 
61
+ /* Centered nav — works for pill / segmented (self-align) and line (flex-center) */
62
+ .tabs.centered .tabs-nav { align-self: center; }
63
+ .tabs.centered.line .tabs-nav,
64
+ .tabs.centered.underline .tabs-nav { align-self: stretch; justify-content: center; }
65
+ .tabs.centered.line .tabs-nav .tab,
66
+ .tabs.centered.underline .tabs-nav .tab { margin-right: 11px; margin-left: 11px; }
67
+
61
68
  .tabs-content { padding: var(--gap-2) 0; }
62
69
 
63
70
  /* Segmented (owned by Tabs.tsx — Segmented is co-exported) */
package/dist/Tabs.cjs CHANGED
@@ -1,16 +1,16 @@
1
1
  'use strict';
2
2
 
3
- var chunkITGCHU3Y_cjs = require('./chunk-ITGCHU3Y.cjs');
3
+ var chunkVICGQC6G_cjs = require('./chunk-VICGQC6G.cjs');
4
4
 
5
5
 
6
6
 
7
7
  Object.defineProperty(exports, "Segmented", {
8
8
  enumerable: true,
9
- get: function () { return chunkITGCHU3Y_cjs.Segmented; }
9
+ get: function () { return chunkVICGQC6G_cjs.Segmented; }
10
10
  });
11
11
  Object.defineProperty(exports, "Tabs", {
12
12
  enumerable: true,
13
- get: function () { return chunkITGCHU3Y_cjs.Tabs; }
13
+ get: function () { return chunkVICGQC6G_cjs.Tabs; }
14
14
  });
15
15
  //# sourceMappingURL=Tabs.cjs.map
16
16
  //# sourceMappingURL=Tabs.cjs.map
package/dist/Tabs.d.cts CHANGED
@@ -13,6 +13,8 @@ interface TabsProps {
13
13
  defaultActiveKey?: string;
14
14
  onChange?: (key: string) => void;
15
15
  variant?: "line" | "pill" | "segmented";
16
+ /** Center-align the tab bar horizontally. */
17
+ centered?: boolean;
16
18
  className?: string;
17
19
  }
18
20
  /** `Tabs` — switchable sections. */
package/dist/Tabs.d.ts CHANGED
@@ -13,6 +13,8 @@ interface TabsProps {
13
13
  defaultActiveKey?: string;
14
14
  onChange?: (key: string) => void;
15
15
  variant?: "line" | "pill" | "segmented";
16
+ /** Center-align the tab bar horizontally. */
17
+ centered?: boolean;
16
18
  className?: string;
17
19
  }
18
20
  /** `Tabs` — switchable sections. */
package/dist/Tabs.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Segmented, Tabs } from './chunk-G3UWXSNQ.js';
1
+ export { Segmented, Tabs } from './chunk-V34OPWKZ.js';
2
2
  //# sourceMappingURL=Tabs.js.map
3
3
  //# sourceMappingURL=Tabs.js.map
@@ -22,7 +22,9 @@
22
22
  .tag.solid.success { background: var(--success); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--success) 35%, transparent); }
23
23
  .tag.solid.warning { background: var(--warning); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--warning) 35%, transparent); }
24
24
  .tag.solid.danger { background: var(--danger); color: white; box-shadow: 0 2px 6px color-mix(in oklch, var(--danger) 35%, transparent); }
25
+ .tag.borderless { background: transparent; box-shadow: none; }
25
26
  .tag .dot { width: 6px; height: 6px; border-radius: 999px; background: currentColor; }
27
+ .tag .tag-ico { color: currentColor; display: inline-flex; }
26
28
  .tag .x { cursor: pointer; color: var(--fg-subtle); margin-left: 2px; display: inline-flex; }
27
29
  .tag .x:hover { color: var(--fg); }
28
30
 
package/dist/Tag.cjs CHANGED
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkVMHNKD3N_cjs = require('./chunk-VMHNKD3N.cjs');
3
+ var chunkURF6RBW6_cjs = require('./chunk-URF6RBW6.cjs');
4
4
  require('./chunk-YVO7XO4W.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "Badge", {
9
9
  enumerable: true,
10
- get: function () { return chunkVMHNKD3N_cjs.Badge; }
10
+ get: function () { return chunkURF6RBW6_cjs.Badge; }
11
11
  });
12
12
  Object.defineProperty(exports, "Tag", {
13
13
  enumerable: true,
14
- get: function () { return chunkVMHNKD3N_cjs.Tag; }
14
+ get: function () { return chunkURF6RBW6_cjs.Tag; }
15
15
  });
16
16
  //# sourceMappingURL=Tag.cjs.map
17
17
  //# sourceMappingURL=Tag.cjs.map
package/dist/Tag.d.cts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { IconName } from './Icon.cjs';
2
3
 
3
4
  type TagTone = "neutral" | "accent" | "info" | "success" | "warning" | "danger";
4
5
  interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
@@ -6,9 +7,13 @@ interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
6
7
  solid?: boolean;
7
8
  /** Render a leading colored dot. */
8
9
  dot?: boolean;
10
+ /** Leading icon (uses the built-in `Icon` component). */
11
+ icon?: IconName;
9
12
  /** Show a close button. */
10
13
  removable?: boolean;
11
14
  onRemove?: () => void;
15
+ /** Whether to render the tag outline/flat shadow. Defaults to `true`. */
16
+ bordered?: boolean;
12
17
  children?: React.ReactNode;
13
18
  }
14
19
  /** `Tag` — small label/pill. */
package/dist/Tag.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import * as React from 'react';
2
+ import { IconName } from './Icon.js';
2
3
 
3
4
  type TagTone = "neutral" | "accent" | "info" | "success" | "warning" | "danger";
4
5
  interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
@@ -6,9 +7,13 @@ interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {
6
7
  solid?: boolean;
7
8
  /** Render a leading colored dot. */
8
9
  dot?: boolean;
10
+ /** Leading icon (uses the built-in `Icon` component). */
11
+ icon?: IconName;
9
12
  /** Show a close button. */
10
13
  removable?: boolean;
11
14
  onRemove?: () => void;
15
+ /** Whether to render the tag outline/flat shadow. Defaults to `true`. */
16
+ bordered?: boolean;
12
17
  children?: React.ReactNode;
13
18
  }
14
19
  /** `Tag` — small label/pill. */
package/dist/Tag.js CHANGED
@@ -1,4 +1,4 @@
1
- export { Badge, Tag } from './chunk-3QWHDCHJ.js';
1
+ export { Badge, Tag } from './chunk-AJZKESHB.js';
2
2
  import './chunk-GEYMWUW6.js';
3
3
  //# sourceMappingURL=Tag.js.map
4
4
  //# sourceMappingURL=Tag.js.map
@@ -0,0 +1,111 @@
1
+ import './tokens-HWQ7KWPG.css';
2
+ import './shared-NJHRNLRH.css';
3
+ import './Slider-X4PVA65R.css';
4
+ import * as React from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ // src/components/Slider/Slider.tsx
8
+ var asArray = (v, fallback) => {
9
+ if (v === void 0) return [fallback];
10
+ return Array.isArray(v) ? [...v] : [v];
11
+ };
12
+ var Slider = (props) => {
13
+ const {
14
+ min = 0,
15
+ max = 100,
16
+ step = 1,
17
+ disabled,
18
+ showValue,
19
+ tone = "accent",
20
+ marks,
21
+ className = ""
22
+ } = props;
23
+ const range = props.range === true;
24
+ const value = props.value;
25
+ const defaultValue = props.defaultValue;
26
+ const onChange = props.onChange;
27
+ const initial = React.useMemo(() => {
28
+ if (defaultValue !== void 0) return asArray(defaultValue, 0);
29
+ return range ? [min, max] : [0];
30
+ }, []);
31
+ const [inner, setInner] = React.useState(initial);
32
+ const isControlled = value !== void 0;
33
+ const nums = isControlled ? asArray(value, range ? min : 0) : inner;
34
+ const pctOf = (n) => (n - min) / (max - min) * 100;
35
+ const emit = (arr) => {
36
+ if (range) {
37
+ onChange?.([arr[0], arr[1]]);
38
+ } else {
39
+ onChange?.(arr[0]);
40
+ }
41
+ };
42
+ const updateAt = (index, next) => {
43
+ const clamped = Math.max(min, Math.min(max, next));
44
+ const out = [...nums];
45
+ out[index] = clamped;
46
+ if (range && out.length === 2 && out[0] > out[1]) {
47
+ out.sort((a, b) => a - b);
48
+ }
49
+ if (!isControlled) setInner(out);
50
+ emit(out);
51
+ };
52
+ const handleMarkClick = (mark) => {
53
+ if (disabled) return;
54
+ if (!range) {
55
+ updateAt(0, mark);
56
+ return;
57
+ }
58
+ const [a, b] = nums;
59
+ const closerIndex = Math.abs(a - mark) <= Math.abs(b - mark) ? 0 : 1;
60
+ updateAt(closerIndex, mark);
61
+ };
62
+ const fillLeft = range ? pctOf(Math.min(nums[0], nums[1])) : 0;
63
+ const fillRight = range ? 100 - pctOf(Math.max(nums[0], nums[1])) : 100 - pctOf(nums[0]);
64
+ return /* @__PURE__ */ jsxs("div", { className: `slider ${tone} ${disabled ? "disabled" : ""} ${marks ? "has-marks" : ""} ${className}`, children: [
65
+ /* @__PURE__ */ jsx("div", { className: "slider-track", children: /* @__PURE__ */ jsx(
66
+ "div",
67
+ {
68
+ className: "slider-fill",
69
+ style: { left: `${fillLeft}%`, right: `${fillRight}%` }
70
+ }
71
+ ) }),
72
+ nums.map((n, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
73
+ /* @__PURE__ */ jsx("div", { className: "slider-thumb", style: { left: `${pctOf(n)}%` } }),
74
+ /* @__PURE__ */ jsx(
75
+ "input",
76
+ {
77
+ type: "range",
78
+ min,
79
+ max,
80
+ step,
81
+ value: n,
82
+ disabled,
83
+ onChange: (e) => updateAt(i, Number(e.target.value))
84
+ }
85
+ )
86
+ ] }, i)),
87
+ showValue && /* @__PURE__ */ jsx("span", { className: "slider-value", children: range ? `${nums[0]} \u2013 ${nums[1]}` : nums[0] }),
88
+ marks && /* @__PURE__ */ jsx("div", { className: "slider-marks", children: Object.entries(marks).map(([k, label]) => {
89
+ const n = Number(k);
90
+ const left = pctOf(n);
91
+ const active = range ? n >= Math.min(nums[0], nums[1]) && n <= Math.max(nums[0], nums[1]) : n <= nums[0];
92
+ return /* @__PURE__ */ jsxs(
93
+ "span",
94
+ {
95
+ className: `slider-mark ${active ? "active" : ""}`,
96
+ style: { left: `${left}%` },
97
+ onClick: () => handleMarkClick(n),
98
+ children: [
99
+ /* @__PURE__ */ jsx("span", { className: "slider-mark-dot" }),
100
+ /* @__PURE__ */ jsx("span", { className: "slider-mark-label", children: label })
101
+ ]
102
+ },
103
+ k
104
+ );
105
+ }) })
106
+ ] });
107
+ };
108
+
109
+ export { Slider };
110
+ //# sourceMappingURL=chunk-437LB2V4.js.map
111
+ //# sourceMappingURL=chunk-437LB2V4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Slider/Slider.tsx"],"names":[],"mappings":"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","file":"chunk-437LB2V4.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Slider.css\";\nimport * as React from \"react\";\n\nexport type SliderSingleValue = number;\nexport type SliderRangeValue = [number, number];\nexport type SliderValue = SliderSingleValue | SliderRangeValue;\n\ninterface SliderBaseProps {\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n showValue?: boolean;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n /** Tick marks with labels. Clicking a mark snaps to it. */\n marks?: Record<number, React.ReactNode>;\n className?: string;\n}\n\nexport interface SliderSingleProps extends SliderBaseProps {\n range?: false;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n}\n\nexport interface SliderRangeProps extends SliderBaseProps {\n range: true;\n value?: SliderRangeValue;\n defaultValue?: SliderRangeValue;\n onChange?: (value: SliderRangeValue) => void;\n}\n\nexport type SliderProps = SliderSingleProps | SliderRangeProps;\n\nconst asArray = (v: SliderValue | undefined, fallback: number): number[] => {\n if (v === undefined) return [fallback];\n return Array.isArray(v) ? [...v] : [v];\n};\n\n/** `Slider` — neumorphic range input with grooved track. */\nexport const Slider: React.FC<SliderProps> = (props) => {\n const {\n min = 0,\n max = 100,\n step = 1,\n disabled,\n showValue,\n tone = \"accent\",\n marks,\n className = \"\",\n } = props;\n\n const range = (props as SliderRangeProps).range === true;\n const value = (props as { value?: SliderValue }).value;\n const defaultValue = (props as { defaultValue?: SliderValue }).defaultValue;\n const onChange = (props as { onChange?: (v: SliderValue) => void }).onChange;\n\n const initial = React.useMemo<number[]>(() => {\n if (defaultValue !== undefined) return asArray(defaultValue, 0);\n return range ? [min, max] : [0];\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const [inner, setInner] = React.useState<number[]>(initial);\n const isControlled = value !== undefined;\n const nums = isControlled ? asArray(value, range ? min : 0) : inner;\n\n const pctOf = (n: number) => ((n - min) / (max - min)) * 100;\n\n const emit = (arr: number[]) => {\n if (range) {\n onChange?.([arr[0], arr[1]] as SliderRangeValue);\n } else {\n onChange?.(arr[0]);\n }\n };\n\n const updateAt = (index: number, next: number) => {\n const clamped = Math.max(min, Math.min(max, next));\n const out = [...nums];\n out[index] = clamped;\n if (range && out.length === 2 && out[0] > out[1]) {\n out.sort((a, b) => a - b);\n }\n if (!isControlled) setInner(out);\n emit(out);\n };\n\n const handleMarkClick = (mark: number) => {\n if (disabled) return;\n if (!range) {\n updateAt(0, mark);\n return;\n }\n const [a, b] = nums;\n const closerIndex = Math.abs(a - mark) <= Math.abs(b - mark) ? 0 : 1;\n updateAt(closerIndex, mark);\n };\n\n const fillLeft = range ? pctOf(Math.min(nums[0], nums[1])) : 0;\n const fillRight = range\n ? 100 - pctOf(Math.max(nums[0], nums[1]))\n : 100 - pctOf(nums[0]);\n\n return (\n <div className={`slider ${tone} ${disabled ? \"disabled\" : \"\"} ${marks ? \"has-marks\" : \"\"} ${className}`}>\n <div className=\"slider-track\">\n <div\n className=\"slider-fill\"\n style={{ left: `${fillLeft}%`, right: `${fillRight}%` }}\n />\n </div>\n {nums.map((n, i) => (\n <React.Fragment key={i}>\n <div className=\"slider-thumb\" style={{ left: `${pctOf(n)}%` }} />\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={n}\n disabled={disabled}\n onChange={(e) => updateAt(i, Number(e.target.value))}\n />\n </React.Fragment>\n ))}\n {showValue && (\n <span className=\"slider-value\">\n {range ? `${nums[0]} – ${nums[1]}` : nums[0]}\n </span>\n )}\n {marks && (\n <div className=\"slider-marks\">\n {Object.entries(marks).map(([k, label]) => {\n const n = Number(k);\n const left = pctOf(n);\n const active = range\n ? n >= Math.min(nums[0], nums[1]) && n <= Math.max(nums[0], nums[1])\n : n <= nums[0];\n return (\n <span\n key={k}\n className={`slider-mark ${active ? \"active\" : \"\"}`}\n style={{ left: `${left}%` }}\n onClick={() => handleMarkClick(n)}\n >\n <span className=\"slider-mark-dot\" />\n <span className=\"slider-mark-label\">{label}</span>\n </span>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,73 @@
1
+ import { Icon } from './chunk-GEYMWUW6.js';
2
+ import './tokens-HWQ7KWPG.css';
3
+ import './shared-NJHRNLRH.css';
4
+ import './Accordion-3TQPKNN3.css';
5
+ import * as React from 'react';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ var Accordion = ({
9
+ items,
10
+ multiple = false,
11
+ accordion = false,
12
+ collapsible = "header",
13
+ activeKeys,
14
+ defaultActiveKeys = [],
15
+ onChange,
16
+ className = ""
17
+ }) => {
18
+ const [inner, setInner] = React.useState(defaultActiveKeys);
19
+ const isControlled = activeKeys !== void 0;
20
+ const keys = isControlled ? activeKeys : inner;
21
+ const singleOpen = accordion || !multiple;
22
+ const toggle = (k, itemDisabled) => {
23
+ if (collapsible === "disabled" || itemDisabled) return;
24
+ const next = keys.includes(k) ? keys.filter((x) => x !== k) : singleOpen ? [k] : [...keys, k];
25
+ if (!isControlled) setInner(next);
26
+ onChange?.(next);
27
+ };
28
+ return /* @__PURE__ */ jsx("div", { className: `accordion ${className}`, children: items.map((it) => {
29
+ const open = keys.includes(it.key);
30
+ const isDisabled = it.disabled || collapsible === "disabled";
31
+ const headerClickable = collapsible === "header" && !isDisabled;
32
+ return /* @__PURE__ */ jsxs(
33
+ "div",
34
+ {
35
+ className: `accordion-item ${open ? "open" : ""} ${isDisabled ? "disabled" : ""} ${collapsible === "icon" ? "icon-only" : ""}`,
36
+ children: [
37
+ /* @__PURE__ */ jsxs(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ className: "accordion-head",
42
+ disabled: isDisabled,
43
+ onClick: () => headerClickable && toggle(it.key, it.disabled),
44
+ "aria-expanded": open,
45
+ children: [
46
+ /* @__PURE__ */ jsx("span", { children: it.title }),
47
+ /* @__PURE__ */ jsx(
48
+ "span",
49
+ {
50
+ className: `accordion-chev${collapsible === "icon" ? " clickable" : ""}`,
51
+ onClick: (e) => {
52
+ if (collapsible === "icon" && !isDisabled) {
53
+ e.stopPropagation();
54
+ toggle(it.key, it.disabled);
55
+ }
56
+ },
57
+ children: /* @__PURE__ */ jsx(Icon, { name: "chevDown", size: 16 })
58
+ }
59
+ )
60
+ ]
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsx("div", { className: "accordion-body", children: /* @__PURE__ */ jsx("div", { className: "accordion-body-inner", children: it.content }) })
64
+ ]
65
+ },
66
+ it.key
67
+ );
68
+ }) });
69
+ };
70
+
71
+ export { Accordion };
72
+ //# sourceMappingURL=chunk-4MR4GVTD.js.map
73
+ //# sourceMappingURL=chunk-4MR4GVTD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":[],"mappings":"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","file":"chunk-4MR4GVTD.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Accordion.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface AccordionItem {\n key: string;\n title: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** If true, multiple sections can be open at once. */\n multiple?: boolean;\n /**\n * Accordion mode — at most one item open at a time. Takes precedence over `multiple`\n * when both are set.\n */\n accordion?: boolean;\n /**\n * What triggers expansion.\n * - `\"header\"` (default): clicking anywhere on the header toggles.\n * - `\"icon\"`: only the chevron icon is clickable.\n * - `\"disabled\"`: the panel cannot be toggled.\n */\n collapsible?: \"header\" | \"icon\" | \"disabled\";\n activeKeys?: string[];\n defaultActiveKeys?: string[];\n onChange?: (keys: string[]) => void;\n className?: string;\n}\n\n/** `Accordion` — collapsible sections. */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n multiple = false,\n accordion = false,\n collapsible = \"header\",\n activeKeys,\n defaultActiveKeys = [],\n onChange,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultActiveKeys);\n const isControlled = activeKeys !== undefined;\n const keys = isControlled ? activeKeys! : inner;\n\n // accordion takes precedence over multiple\n const singleOpen = accordion || !multiple;\n\n const toggle = (k: string, itemDisabled?: boolean) => {\n if (collapsible === \"disabled\" || itemDisabled) return;\n const next = keys.includes(k)\n ? keys.filter((x) => x !== k)\n : singleOpen\n ? [k]\n : [...keys, k];\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n return (\n <div className={`accordion ${className}`}>\n {items.map((it) => {\n const open = keys.includes(it.key);\n const isDisabled = it.disabled || collapsible === \"disabled\";\n const headerClickable = collapsible === \"header\" && !isDisabled;\n return (\n <div\n key={it.key}\n className={`accordion-item ${open ? \"open\" : \"\"} ${isDisabled ? \"disabled\" : \"\"} ${collapsible === \"icon\" ? \"icon-only\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"accordion-head\"\n disabled={isDisabled}\n onClick={() => headerClickable && toggle(it.key, it.disabled)}\n aria-expanded={open}\n >\n <span>{it.title}</span>\n <span\n className={`accordion-chev${collapsible === \"icon\" ? \" clickable\" : \"\"}`}\n onClick={(e) => {\n if (collapsible === \"icon\" && !isDisabled) {\n e.stopPropagation();\n toggle(it.key, it.disabled);\n }\n }}\n >\n <Icon name=\"chevDown\" size={16} />\n </span>\n </button>\n <div className=\"accordion-body\">\n <div className=\"accordion-body-inner\">{it.content}</div>\n </div>\n </div>\n );\n })}\n </div>\n );\n};\n"]}
@@ -1,13 +1,19 @@
1
1
  import './tokens-HWQ7KWPG.css';
2
2
  import './shared-NJHRNLRH.css';
3
- import './Card-2CHHFD4Y.css';
3
+ import './Card-RG7ECXL2.css';
4
4
  import * as React from 'react';
5
5
  import { jsx, jsxs } from 'react/jsx-runtime';
6
6
 
7
7
  // src/components/Card/Card.tsx
8
8
  var Card = React.forwardRef(
9
- ({ variant = "raised", padding = "md", className = "", children, ...rest }, ref) => {
10
- const cls = ["card", variant, padding !== "md" && `pad-${padding}`, className].filter(Boolean).join(" ");
9
+ ({ variant = "raised", padding = "md", hoverable, className = "", children, ...rest }, ref) => {
10
+ const cls = [
11
+ "card",
12
+ variant,
13
+ padding !== "md" && `pad-${padding}`,
14
+ hoverable && "hoverable",
15
+ className
16
+ ].filter(Boolean).join(" ");
11
17
  return /* @__PURE__ */ jsx("div", { ref, className: cls, ...rest, children });
12
18
  }
13
19
  );
@@ -31,5 +37,5 @@ var Panel = ({
31
37
  ] });
32
38
 
33
39
  export { Card, Panel };
34
- //# sourceMappingURL=chunk-OXYFB2ZI.js.map
35
- //# sourceMappingURL=chunk-OXYFB2ZI.js.map
40
+ //# sourceMappingURL=chunk-4U4OY5RA.js.map
41
+ //# sourceMappingURL=chunk-4U4OY5RA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Card/Card.tsx"],"names":[],"mappings":";;;;;;;AAkBO,IAAM,IAAA,GAAa,KAAA,CAAA,UAAA;AAAA,EACxB,CAAC,EAAE,OAAA,GAAU,QAAA,EAAU,OAAA,GAAU,IAAA,EAAM,SAAA,EAAW,SAAA,GAAY,EAAA,EAAI,QAAA,EAAU,GAAG,IAAA,IAAQ,GAAA,KAAQ;AAC7F,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,KAAY,IAAA,IAAQ,CAAA,IAAA,EAAO,OAAO,CAAA,CAAA;AAAA,MAClC,SAAA,IAAa,WAAA;AAAA,MACb;AAAA,KACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,IAAA,2BACG,KAAA,EAAA,EAAI,GAAA,EAAU,WAAW,GAAA,EAAM,GAAG,MAChC,QAAA,EACH,CAAA;AAAA,EAEJ;AACF;AACA,IAAA,CAAK,WAAA,GAAc,MAAA;AAYZ,IAAM,QAA8B,CAAC;AAAA,EAC1C,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,0BACG,KAAA,EAAA,EAAI,SAAA,EAAW,SAAS,SAAS,CAAA,CAAA,EAAK,GAAG,IAAA,EACtC,QAAA,EAAA;AAAA,EAAA,CAAA,KAAA,IAAS,OAAA,qBACT,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EACb,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,cAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,aAAA,EAAe,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC7C,WAAA,oBAAe,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAc,QAAA,EAAA,WAAA,EAAY;AAAA,KAAA,EAC3D,CAAA;AAAA,IACC,OAAA,oBAAW,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAiB,QAAA,EAAA,OAAA,EAAQ;AAAA,GAAA,EACtD,CAAA;AAAA,kBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,YAAA,EAAc,QAAA,EAAS;AAAA,CAAA,EACxC","file":"chunk-4U4OY5RA.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Card.css\";\nimport * as React from \"react\";\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Visual variant. `raised` protrudes; `sunken` recesses; `flat` is subtle. */\n variant?: \"raised\" | \"sunken\" | \"flat\";\n /** Inner padding. */\n padding?: \"none\" | \"sm\" | \"md\" | \"lg\";\n /** When true, the card raises and lifts on hover. */\n hoverable?: boolean;\n children?: React.ReactNode;\n}\n\n/**\n * `Card` — neumorphic surface container. Use to group related content.\n */\nexport const Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ variant = \"raised\", padding = \"md\", hoverable, className = \"\", children, ...rest }, ref) => {\n const cls = [\n \"card\",\n variant,\n padding !== \"md\" && `pad-${padding}`,\n hoverable && \"hoverable\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <div ref={ref} className={cls} {...rest}>\n {children}\n </div>\n );\n }\n);\nCard.displayName = \"Card\";\n\nexport interface PanelProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n description?: React.ReactNode;\n actions?: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * `Panel` — a titled `Card` with optional actions row.\n */\nexport const Panel: React.FC<PanelProps> = ({\n title,\n description,\n actions,\n children,\n className = \"\",\n ...rest\n}) => (\n <div className={`panel ${className}`} {...rest}>\n {(title || actions) && (\n <div className=\"panel-head\">\n <div className=\"panel-titles\">\n {title && <div className=\"panel-title\">{title}</div>}\n {description && <div className=\"panel-desc\">{description}</div>}\n </div>\n {actions && <div className=\"panel-actions\">{actions}</div>}\n </div>\n )}\n <div className=\"panel-body\">{children}</div>\n </div>\n);\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Icon } from './chunk-GEYMWUW6.js';
2
2
  import './tokens-HWQ7KWPG.css';
3
3
  import './shared-NJHRNLRH.css';
4
- import './Button-5UI7QXGU.css';
4
+ import './Button-SDQD25AG.css';
5
5
  import * as React from 'react';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
 
@@ -13,6 +13,7 @@ var Button = React.forwardRef(
13
13
  icon,
14
14
  trailingIcon,
15
15
  loading,
16
+ block,
16
17
  disabled,
17
18
  className = "",
18
19
  type = "button",
@@ -23,6 +24,7 @@ var Button = React.forwardRef(
23
24
  variant,
24
25
  size !== "md" && size,
25
26
  loading && "loading",
27
+ block && "block",
26
28
  disabled && "disabled",
27
29
  className
28
30
  ].filter(Boolean).join(" ");
@@ -60,5 +62,5 @@ var IconButton = React.forwardRef(
60
62
  IconButton.displayName = "IconButton";
61
63
 
62
64
  export { Button, IconButton };
63
- //# sourceMappingURL=chunk-5EYI27B6.js.map
64
- //# sourceMappingURL=chunk-5EYI27B6.js.map
65
+ //# sourceMappingURL=chunk-77BVQNAQ.js.map
66
+ //# sourceMappingURL=chunk-77BVQNAQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx"],"names":[],"mappings":";;;;;;;AAsCO,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EAC1B,CACE;AAAA,IACE,QAAA;AAAA,IACA,OAAA,GAAU,SAAA;AAAA,IACV,IAAA,GAAO,IAAA;AAAA,IACP,IAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,IAAA,GAAO,QAAA;AAAA,IACP,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,MAAM,GAAA,GAAM;AAAA,MACV,KAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAS,IAAA,IAAQ,IAAA;AAAA,MACjB,OAAA,IAAW,SAAA;AAAA,MACX,KAAA,IAAS,OAAA;AAAA,MACT,QAAA,IAAY,UAAA;AAAA,MACZ;AAAA,KACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AAEX,IAAA,uBACE,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,UAAU,QAAA,IAAY,OAAA;AAAA,QACrB,GAAG,IAAA;AAAA,QAEH,QAAA,EAAA;AAAA,UAAA,OAAA,mBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAU,eAAW,IAAA,EAAC,CAAA,GACpC,IAAA,mBACF,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,IAAI,CAAA,GAC1B,IAAA;AAAA,UACH,QAAA;AAAA,UACA,gCAAgB,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,YAAA,EAAc,MAAM,EAAA,EAAI;AAAA;AAAA;AAAA,KACvD;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA;AAYd,IAAM,UAAA,GAAmB,KAAA,CAAA,UAAA;AAAA,EAC9B,CAAC,EAAE,IAAA,EAAM,GAAA,EAAK,YAAY,EAAA,EAAI,GAAG,IAAA,EAAK,EAAG,GAAA,qBACvC,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,SAAA,EAAW,QAAQ,SAAS,CAAA,CAAA;AAAA,MAC5B,YAAA,EAAY,GAAA,IAAO,IAAA,CAAK,YAAY,CAAA,IAAK,IAAA;AAAA,MACzC,KAAA,EAAO,GAAA;AAAA,MACN,GAAG,IAAA;AAAA,MAEJ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,EAAA,EAAI;AAAA;AAAA;AAGlC;AACA,UAAA,CAAW,WAAA,GAAc,YAAA","file":"chunk-77BVQNAQ.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Button.css\";\nimport * as React from \"react\";\nimport type { IconName } from \"../Icon\";\nimport { Icon } from \"../Icon\";\n\nexport type ButtonVariant = \"default\" | \"primary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\" | \"lg\";\n\nexport interface ButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"type\"> {\n /** Visual variant. `primary` uses the accent color; `ghost` is borderless; `danger` is red. */\n variant?: ButtonVariant;\n /** Control height preset. */\n size?: ButtonSize;\n /** Leading icon. */\n icon?: IconName;\n /** Trailing icon. */\n trailingIcon?: IconName;\n /** Show spinner + disable interaction. */\n loading?: boolean;\n /** Make the button fill the container's width. */\n block?: boolean;\n /** Button type attribute. Defaults to \"button\" to avoid accidental form submits. */\n type?: \"button\" | \"submit\" | \"reset\";\n /** Extra class names. */\n className?: string;\n children?: React.ReactNode;\n}\n\n/**\n * `Button` — the primary action surface.\n *\n * @example\n * <Button variant=\"primary\" icon=\"plus\">新建</Button>\n * <Button variant=\"ghost\" loading>保存</Button>\n */\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n children,\n variant = \"default\",\n size = \"md\",\n icon,\n trailingIcon,\n loading,\n block,\n disabled,\n className = \"\",\n type = \"button\",\n ...rest\n },\n ref\n ) => {\n const cls = [\n \"btn\",\n variant,\n size !== \"md\" && size,\n loading && \"loading\",\n block && \"block\",\n disabled && \"disabled\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <button\n ref={ref}\n type={type}\n className={cls}\n disabled={disabled || loading}\n {...rest}\n >\n {loading ? (\n <span className=\"spinner\" aria-hidden />\n ) : icon ? (\n <Icon name={icon} size={15} />\n ) : null}\n {children}\n {trailingIcon && <Icon name={trailingIcon} size={15} />}\n </button>\n );\n }\n);\nButton.displayName = \"Button\";\n\nexport interface IconButtonProps\n extends Omit<ButtonProps, \"icon\" | \"children\"> {\n icon: IconName;\n tip?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * `IconButton` — square button containing just an icon. Pair with a tooltip.\n */\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(\n ({ icon, tip, className = \"\", ...rest }, ref) => (\n <Button\n ref={ref}\n className={`icon ${className}`}\n aria-label={tip || rest[\"aria-label\"] || icon}\n title={tip}\n {...rest}\n >\n <Icon name={icon} size={16} />\n </Button>\n )\n);\nIconButton.displayName = \"IconButton\";\n"]}