@fangxinyan/lumina 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/dist/Accordion.cjs +3 -3
  2. package/dist/Accordion.d.cts +2 -2
  3. package/dist/Accordion.d.ts +2 -2
  4. package/dist/Accordion.js +2 -2
  5. package/dist/Alert.cjs +3 -3
  6. package/dist/Alert.d.cts +2 -2
  7. package/dist/Alert.d.ts +2 -2
  8. package/dist/Alert.js +2 -2
  9. package/dist/AppShell.cjs +5 -5
  10. package/dist/AppShell.d.cts +8 -8
  11. package/dist/AppShell.d.ts +8 -8
  12. package/dist/AppShell.js +1 -1
  13. package/dist/AutoComplete.cjs +5 -5
  14. package/dist/AutoComplete.d.cts +1 -4
  15. package/dist/AutoComplete.d.ts +1 -4
  16. package/dist/AutoComplete.js +4 -4
  17. package/dist/Avatar.cjs +2 -2
  18. package/dist/Avatar.d.cts +1 -1
  19. package/dist/Avatar.d.ts +1 -1
  20. package/dist/Avatar.js +1 -1
  21. package/dist/Button.cjs +4 -4
  22. package/dist/Button.js +2 -2
  23. package/dist/Calendar.cjs +3 -3
  24. package/dist/Calendar.d.cts +2 -2
  25. package/dist/Calendar.d.ts +2 -2
  26. package/dist/Calendar.js +2 -2
  27. package/dist/Cascader.cjs +4 -4
  28. package/dist/Cascader.d.cts +2 -2
  29. package/dist/Cascader.d.ts +2 -2
  30. package/dist/Cascader.js +3 -3
  31. package/dist/Checkbox.cjs +4 -4
  32. package/dist/Checkbox.d.cts +5 -5
  33. package/dist/Checkbox.d.ts +5 -5
  34. package/dist/Checkbox.js +2 -2
  35. package/dist/ColorPicker.cjs +3 -3
  36. package/dist/ColorPicker.d.cts +1 -3
  37. package/dist/ColorPicker.d.ts +1 -3
  38. package/dist/ColorPicker.js +2 -2
  39. package/dist/CommandPalette.cjs +4 -4
  40. package/dist/CommandPalette.d.cts +2 -2
  41. package/dist/CommandPalette.d.ts +2 -2
  42. package/dist/CommandPalette.js +3 -3
  43. package/dist/ContextMenu.cjs +2 -2
  44. package/dist/ContextMenu.d.cts +2 -2
  45. package/dist/ContextMenu.d.ts +2 -2
  46. package/dist/ContextMenu.js +1 -1
  47. package/dist/Divider.cjs +2 -2
  48. package/dist/Divider.d.cts +1 -1
  49. package/dist/Divider.d.ts +1 -1
  50. package/dist/Divider.js +1 -1
  51. package/dist/Drawer.cjs +3 -3
  52. package/dist/Drawer.d.cts +2 -2
  53. package/dist/Drawer.d.ts +2 -2
  54. package/dist/Drawer.js +2 -2
  55. package/dist/Empty.cjs +4 -4
  56. package/dist/Empty.d.cts +6 -6
  57. package/dist/Empty.d.ts +6 -6
  58. package/dist/Empty.js +1 -1
  59. package/dist/Form.cjs +4 -4
  60. package/dist/Form.d.cts +2 -2
  61. package/dist/Form.d.ts +2 -2
  62. package/dist/Form.js +1 -1
  63. package/dist/Icon.cjs +3 -3
  64. package/dist/Icon.d.cts +2 -2
  65. package/dist/Icon.d.ts +2 -2
  66. package/dist/Icon.js +1 -1
  67. package/dist/Image.cjs +4 -4
  68. package/dist/Image.d.cts +4 -4
  69. package/dist/Image.d.ts +4 -4
  70. package/dist/Image.js +2 -2
  71. package/dist/Input.cjs +4 -4
  72. package/dist/Input.js +2 -2
  73. package/dist/InputNumber.cjs +4 -4
  74. package/dist/InputNumber.d.cts +1 -5
  75. package/dist/InputNumber.d.ts +1 -5
  76. package/dist/InputNumber.js +3 -3
  77. package/dist/List.cjs +2 -2
  78. package/dist/List.d.cts +2 -2
  79. package/dist/List.d.ts +2 -2
  80. package/dist/List.js +1 -1
  81. package/dist/Modal.cjs +4 -4
  82. package/dist/Modal.d.cts +2 -2
  83. package/dist/Modal.d.ts +2 -2
  84. package/dist/Modal.js +3 -3
  85. package/dist/Pagination.cjs +6 -6
  86. package/dist/Pagination.d.cts +2 -2
  87. package/dist/Pagination.d.ts +2 -2
  88. package/dist/Pagination.js +5 -5
  89. package/dist/Popover-DVGQGWX6.css +103 -0
  90. package/dist/Popover.cjs +3 -3
  91. package/dist/Popover.d.cts +25 -3
  92. package/dist/Popover.d.ts +25 -3
  93. package/dist/Popover.js +2 -2
  94. package/dist/Progress-CHV7DN6Y.css +80 -0
  95. package/dist/Progress.cjs +2 -6
  96. package/dist/Progress.d.cts +5 -13
  97. package/dist/Progress.d.ts +5 -13
  98. package/dist/Progress.js +1 -1
  99. package/dist/Select.cjs +5 -5
  100. package/dist/Select.d.cts +6 -3
  101. package/dist/Select.d.ts +6 -3
  102. package/dist/Select.js +4 -4
  103. package/dist/Splitter.cjs +2 -2
  104. package/dist/Splitter.d.cts +2 -2
  105. package/dist/Splitter.d.ts +2 -2
  106. package/dist/Splitter.js +1 -1
  107. package/dist/StatusBar.cjs +3 -3
  108. package/dist/StatusBar.d.cts +3 -2
  109. package/dist/StatusBar.d.ts +3 -2
  110. package/dist/StatusBar.js +1 -1
  111. package/dist/Switch.cjs +2 -2
  112. package/dist/Switch.d.cts +2 -2
  113. package/dist/Switch.d.ts +2 -2
  114. package/dist/Switch.js +1 -1
  115. package/dist/Table.cjs +9 -9
  116. package/dist/Table.d.cts +4 -3
  117. package/dist/Table.d.ts +4 -3
  118. package/dist/Table.js +7 -7
  119. package/dist/Tabs.cjs +3 -3
  120. package/dist/Tabs.d.cts +5 -5
  121. package/dist/Tabs.d.ts +5 -5
  122. package/dist/Tabs.js +1 -1
  123. package/dist/Tag.cjs +4 -4
  124. package/dist/Tag.d.cts +2 -2
  125. package/dist/Tag.d.ts +2 -2
  126. package/dist/Tag.js +2 -2
  127. package/dist/Timeline-RHZAZKZ7.css +136 -0
  128. package/dist/Timeline.cjs +13 -0
  129. package/dist/Timeline.cjs.map +1 -0
  130. package/dist/Timeline.d.cts +38 -0
  131. package/dist/Timeline.d.ts +38 -0
  132. package/dist/Timeline.js +4 -0
  133. package/dist/Timeline.js.map +1 -0
  134. package/dist/{Toast-6PVSAXQ5.css → Toast-YSACW3EM.css} +2 -2
  135. package/dist/Toast.cjs +4 -4
  136. package/dist/Toast.d.cts +2 -2
  137. package/dist/Toast.d.ts +2 -2
  138. package/dist/Toast.js +2 -2
  139. package/dist/{Tooltip-ST24GY4S.css → Tooltip-DMKUPC24.css} +1 -0
  140. package/dist/Tooltip.cjs +3 -3
  141. package/dist/Tooltip.d.cts +2 -2
  142. package/dist/Tooltip.d.ts +2 -2
  143. package/dist/Tooltip.js +2 -2
  144. package/dist/Typography.cjs +7 -7
  145. package/dist/Typography.js +2 -2
  146. package/dist/{chunk-QVFEKGKI.cjs → chunk-2K5HZLXW.cjs} +6 -3
  147. package/dist/chunk-2K5HZLXW.cjs.map +1 -0
  148. package/dist/chunk-2LIX7ZHX.js +29 -0
  149. package/dist/chunk-2LIX7ZHX.js.map +1 -0
  150. package/dist/{chunk-N73JGXYZ.cjs → chunk-2TNJ7TC4.cjs} +22 -12
  151. package/dist/chunk-2TNJ7TC4.cjs.map +1 -0
  152. package/dist/chunk-3EGZ6TBF.cjs +65 -0
  153. package/dist/chunk-3EGZ6TBF.cjs.map +1 -0
  154. package/dist/{chunk-RFU5HN4E.js → chunk-3LJO33HI.js} +25 -7
  155. package/dist/chunk-3LJO33HI.js.map +1 -0
  156. package/dist/{chunk-RZ2E3XEU.cjs → chunk-3XIDJEYR.cjs} +21 -6
  157. package/dist/chunk-3XIDJEYR.cjs.map +1 -0
  158. package/dist/{chunk-UQB5OHMO.js → chunk-44AVDO3T.js} +27 -19
  159. package/dist/chunk-44AVDO3T.js.map +1 -0
  160. package/dist/chunk-474MXYO5.cjs +108 -0
  161. package/dist/chunk-474MXYO5.cjs.map +1 -0
  162. package/dist/{chunk-XCYE4OQV.js → chunk-4DNHASZU.js} +10 -8
  163. package/dist/chunk-4DNHASZU.js.map +1 -0
  164. package/dist/{chunk-OM76QWUN.js → chunk-4JHFGSNH.js} +24 -13
  165. package/dist/chunk-4JHFGSNH.js.map +1 -0
  166. package/dist/{chunk-6Z24VO3K.js → chunk-4XSP4HHZ.js} +18 -8
  167. package/dist/chunk-4XSP4HHZ.js.map +1 -0
  168. package/dist/{chunk-CTYW42GG.js → chunk-5VIOJW6M.js} +142 -129
  169. package/dist/chunk-5VIOJW6M.js.map +1 -0
  170. package/dist/{chunk-O7C6S644.js → chunk-6CAEGNCK.js} +10 -8
  171. package/dist/chunk-6CAEGNCK.js.map +1 -0
  172. package/dist/{chunk-JXHMJUVI.js → chunk-6FSOJLY6.js} +3 -3
  173. package/dist/{chunk-JXHMJUVI.js.map → chunk-6FSOJLY6.js.map} +1 -1
  174. package/dist/{chunk-LLNEDEST.cjs → chunk-6TRVGFFX.cjs} +18 -7
  175. package/dist/chunk-6TRVGFFX.cjs.map +1 -0
  176. package/dist/{chunk-7T2SLRNL.cjs → chunk-74VZZAUT.cjs} +14 -7
  177. package/dist/chunk-74VZZAUT.cjs.map +1 -0
  178. package/dist/{chunk-GR5STMOA.js → chunk-A3IJM7IX.js} +76 -50
  179. package/dist/chunk-A3IJM7IX.js.map +1 -0
  180. package/dist/{chunk-V2DIQ3RH.js → chunk-ANAQER3T.js} +21 -6
  181. package/dist/chunk-ANAQER3T.js.map +1 -0
  182. package/dist/{chunk-WZ73TWB2.cjs → chunk-AXRABZLY.cjs} +25 -7
  183. package/dist/chunk-AXRABZLY.cjs.map +1 -0
  184. package/dist/{chunk-QOGROEVD.js → chunk-BSHHQOFY.js} +27 -21
  185. package/dist/chunk-BSHHQOFY.js.map +1 -0
  186. package/dist/{chunk-JSDQVVQB.js → chunk-CVEGVB2C.js} +17 -12
  187. package/dist/chunk-CVEGVB2C.js.map +1 -0
  188. package/dist/{chunk-LXNR6TQK.js → chunk-D242UJZO.js} +14 -11
  189. package/dist/chunk-D242UJZO.js.map +1 -0
  190. package/dist/{chunk-AESLEYST.js → chunk-DB5JMXOI.js} +11 -9
  191. package/dist/chunk-DB5JMXOI.js.map +1 -0
  192. package/dist/{chunk-OWNVDXRQ.js → chunk-DCX36FYD.js} +23 -10
  193. package/dist/chunk-DCX36FYD.js.map +1 -0
  194. package/dist/{chunk-YCHUHMNP.cjs → chunk-DH4NYYJP.cjs} +46 -20
  195. package/dist/chunk-DH4NYYJP.cjs.map +1 -0
  196. package/dist/{chunk-ZFJHUOFU.js → chunk-DUNQNSVK.js} +21 -11
  197. package/dist/chunk-DUNQNSVK.js.map +1 -0
  198. package/dist/{chunk-5PREWYTB.js → chunk-E6K6GYUC.js} +21 -27
  199. package/dist/chunk-E6K6GYUC.js.map +1 -0
  200. package/dist/{chunk-IHACXMOI.js → chunk-EARCKSI7.js} +6 -3
  201. package/dist/chunk-EARCKSI7.js.map +1 -0
  202. package/dist/chunk-EHZXEZI2.cjs +78 -0
  203. package/dist/chunk-EHZXEZI2.cjs.map +1 -0
  204. package/dist/{chunk-HJIKU6MF.cjs → chunk-FBQLNAUI.cjs} +11 -9
  205. package/dist/chunk-FBQLNAUI.cjs.map +1 -0
  206. package/dist/chunk-FCIPCZAK.cjs +53 -0
  207. package/dist/chunk-FCIPCZAK.cjs.map +1 -0
  208. package/dist/{chunk-7M7NAMR5.js → chunk-FSOJHDXH.js} +18 -7
  209. package/dist/chunk-FSOJHDXH.js.map +1 -0
  210. package/dist/{chunk-BCPAY65C.cjs → chunk-HHSVGNJA.cjs} +7 -7
  211. package/dist/chunk-HHSVGNJA.cjs.map +1 -0
  212. package/dist/{chunk-WVBFQB26.cjs → chunk-HQO7EZNQ.cjs} +24 -14
  213. package/dist/chunk-HQO7EZNQ.cjs.map +1 -0
  214. package/dist/{chunk-MDQNUKCP.cjs → chunk-IL523MTN.cjs} +146 -133
  215. package/dist/chunk-IL523MTN.cjs.map +1 -0
  216. package/dist/{chunk-SMHXSEBD.cjs → chunk-JAGJQDAV.cjs} +22 -13
  217. package/dist/chunk-JAGJQDAV.cjs.map +1 -0
  218. package/dist/{chunk-RWHWEQQX.cjs → chunk-JF2WNLPF.cjs} +6 -6
  219. package/dist/{chunk-RWHWEQQX.cjs.map → chunk-JF2WNLPF.cjs.map} +1 -1
  220. package/dist/chunk-JS6U7UQS.js +86 -0
  221. package/dist/chunk-JS6U7UQS.js.map +1 -0
  222. package/dist/{chunk-TZXEZFCI.cjs → chunk-KA3XLPQJ.cjs} +34 -9
  223. package/dist/chunk-KA3XLPQJ.cjs.map +1 -0
  224. package/dist/{chunk-NS3C2ZSE.js → chunk-KWE2PXJQ.js} +8 -5
  225. package/dist/chunk-KWE2PXJQ.js.map +1 -0
  226. package/dist/{chunk-E62JFAHW.js → chunk-LSQD2GFA.js} +4 -4
  227. package/dist/chunk-LSQD2GFA.js.map +1 -0
  228. package/dist/{chunk-77TZHI76.cjs → chunk-MU4GGX6C.cjs} +14 -12
  229. package/dist/chunk-MU4GGX6C.cjs.map +1 -0
  230. package/dist/{chunk-IOWREUEP.js → chunk-MXIWTYNC.js} +17 -7
  231. package/dist/chunk-MXIWTYNC.js.map +1 -0
  232. package/dist/{chunk-5EAVXFFD.cjs → chunk-NRP3X3PE.cjs} +17 -12
  233. package/dist/chunk-NRP3X3PE.cjs.map +1 -0
  234. package/dist/{chunk-VQBZKRIB.cjs → chunk-P4CGE5C7.cjs} +19 -9
  235. package/dist/chunk-P4CGE5C7.cjs.map +1 -0
  236. package/dist/{chunk-TZLM5GF4.js → chunk-PX5ABNKV.js} +19 -10
  237. package/dist/chunk-PX5ABNKV.js.map +1 -0
  238. package/dist/{chunk-RQV7SMIZ.cjs → chunk-QCNHDDSD.cjs} +36 -13
  239. package/dist/chunk-QCNHDDSD.cjs.map +1 -0
  240. package/dist/{chunk-5N7347MI.js → chunk-QRSPBK3X.js} +8 -6
  241. package/dist/chunk-QRSPBK3X.js.map +1 -0
  242. package/dist/{chunk-6XZ362VL.js → chunk-RHZOBQON.js} +36 -15
  243. package/dist/chunk-RHZOBQON.js.map +1 -0
  244. package/dist/chunk-RNVE2LMJ.cjs +162 -0
  245. package/dist/chunk-RNVE2LMJ.cjs.map +1 -0
  246. package/dist/{chunk-TQLCIXCK.cjs → chunk-RXL26GSI.cjs} +28 -5
  247. package/dist/chunk-RXL26GSI.cjs.map +1 -0
  248. package/dist/{chunk-NN7WMXY4.cjs → chunk-S3OSBW7R.cjs} +19 -14
  249. package/dist/chunk-S3OSBW7R.cjs.map +1 -0
  250. package/dist/{chunk-33TIL25B.cjs → chunk-SREMTSVI.cjs} +47 -19
  251. package/dist/chunk-SREMTSVI.cjs.map +1 -0
  252. package/dist/{chunk-6GNFRP2H.js → chunk-SWB57EA2.js} +9 -7
  253. package/dist/chunk-SWB57EA2.js.map +1 -0
  254. package/dist/{chunk-KW7Z4IQC.js → chunk-T7ZBJJC4.js} +12 -7
  255. package/dist/chunk-T7ZBJJC4.js.map +1 -0
  256. package/dist/chunk-TC5ZL2OS.cjs +165 -0
  257. package/dist/chunk-TC5ZL2OS.cjs.map +1 -0
  258. package/dist/{chunk-XYVJ3FBQ.cjs → chunk-V24B7KWT.cjs} +12 -10
  259. package/dist/chunk-V24B7KWT.cjs.map +1 -0
  260. package/dist/{chunk-3BZ47QNV.cjs → chunk-V5KSJITO.cjs} +7 -7
  261. package/dist/{chunk-3BZ47QNV.cjs.map → chunk-V5KSJITO.cjs.map} +1 -1
  262. package/dist/{chunk-YFBHVTKN.cjs → chunk-WFFWVQK4.cjs} +7 -7
  263. package/dist/{chunk-YFBHVTKN.cjs.map → chunk-WFFWVQK4.cjs.map} +1 -1
  264. package/dist/{chunk-I7WLFADD.js → chunk-WLFMOWUY.js} +3 -3
  265. package/dist/{chunk-I7WLFADD.js.map → chunk-WLFMOWUY.js.map} +1 -1
  266. package/dist/{chunk-I2HHC6QW.js → chunk-X3QINITU.js} +17 -6
  267. package/dist/chunk-X3QINITU.js.map +1 -0
  268. package/dist/{chunk-2ENTRT7R.cjs → chunk-XMFVAYBP.cjs} +20 -9
  269. package/dist/chunk-XMFVAYBP.cjs.map +1 -0
  270. package/dist/{chunk-HXSAH4Y6.cjs → chunk-XMINE4TN.cjs} +28 -17
  271. package/dist/chunk-XMINE4TN.cjs.map +1 -0
  272. package/dist/{chunk-YZ2I7CDF.cjs → chunk-XXE5TQ7I.cjs} +9 -7
  273. package/dist/chunk-XXE5TQ7I.cjs.map +1 -0
  274. package/dist/chunk-XYGRVPUA.js +140 -0
  275. package/dist/chunk-XYGRVPUA.js.map +1 -0
  276. package/dist/chunk-Y7BZMMAV.cjs +51 -0
  277. package/dist/chunk-Y7BZMMAV.cjs.map +1 -0
  278. package/dist/{chunk-FFZLSY2N.js → chunk-YRAQRENN.js} +40 -13
  279. package/dist/chunk-YRAQRENN.js.map +1 -0
  280. package/dist/{chunk-IJA26LRY.cjs → chunk-YVSZLQTQ.cjs} +19 -9
  281. package/dist/chunk-YVSZLQTQ.cjs.map +1 -0
  282. package/dist/{chunk-OZVPJWXO.cjs → chunk-ZA36BJIY.cjs} +41 -14
  283. package/dist/chunk-ZA36BJIY.cjs.map +1 -0
  284. package/dist/{chunk-47Z4NIU4.js → chunk-ZHCQEJ2Z.js} +14 -7
  285. package/dist/chunk-ZHCQEJ2Z.js.map +1 -0
  286. package/dist/{chunk-T4PI2ZX7.cjs → chunk-ZM4P6ELG.cjs} +46 -25
  287. package/dist/chunk-ZM4P6ELG.cjs.map +1 -0
  288. package/dist/{chunk-PKXXR76Q.js → chunk-ZN6VS6SO.js} +18 -13
  289. package/dist/chunk-ZN6VS6SO.js.map +1 -0
  290. package/dist/{chunk-FXQGPHK2.js → chunk-ZPDMAMWC.js} +21 -11
  291. package/dist/chunk-ZPDMAMWC.js.map +1 -0
  292. package/dist/{chunk-WUOFJPZ4.js → chunk-ZZXNHPF3.js} +3 -3
  293. package/dist/{chunk-WUOFJPZ4.js.map → chunk-ZZXNHPF3.js.map} +1 -1
  294. package/dist/index.cjs +98 -97
  295. package/dist/index.cjs.map +1 -1
  296. package/dist/index.d.cts +3 -2
  297. package/dist/index.d.ts +3 -2
  298. package/dist/index.js +38 -37
  299. package/dist/index.js.map +1 -1
  300. package/dist/styles.css +136 -36
  301. package/docs/llms/appshell.md +36 -0
  302. package/docs/llms/popover.md +138 -6
  303. package/docs/llms/progress.md +10 -18
  304. package/docs/llms/timeline.md +140 -0
  305. package/docs/llms.md +9 -6
  306. package/package.json +80 -1
  307. package/dist/Popover-NYEKT5CQ.css +0 -10
  308. package/dist/Progress-IXRSO5TW.css +0 -63
  309. package/dist/chunk-2ENTRT7R.cjs.map +0 -1
  310. package/dist/chunk-33TIL25B.cjs.map +0 -1
  311. package/dist/chunk-3UU2PUK4.js +0 -66
  312. package/dist/chunk-3UU2PUK4.js.map +0 -1
  313. package/dist/chunk-47Z4NIU4.js.map +0 -1
  314. package/dist/chunk-5BFETKVP.cjs +0 -52
  315. package/dist/chunk-5BFETKVP.cjs.map +0 -1
  316. package/dist/chunk-5EAVXFFD.cjs.map +0 -1
  317. package/dist/chunk-5N7347MI.js.map +0 -1
  318. package/dist/chunk-5PREWYTB.js.map +0 -1
  319. package/dist/chunk-6GNFRP2H.js.map +0 -1
  320. package/dist/chunk-6XZ362VL.js.map +0 -1
  321. package/dist/chunk-6Z24VO3K.js.map +0 -1
  322. package/dist/chunk-77TZHI76.cjs.map +0 -1
  323. package/dist/chunk-7M7NAMR5.js.map +0 -1
  324. package/dist/chunk-7T2SLRNL.cjs.map +0 -1
  325. package/dist/chunk-7YQWG7HR.cjs +0 -45
  326. package/dist/chunk-7YQWG7HR.cjs.map +0 -1
  327. package/dist/chunk-AESLEYST.js.map +0 -1
  328. package/dist/chunk-BCPAY65C.cjs.map +0 -1
  329. package/dist/chunk-CTYW42GG.js.map +0 -1
  330. package/dist/chunk-E62JFAHW.js.map +0 -1
  331. package/dist/chunk-FFZLSY2N.js.map +0 -1
  332. package/dist/chunk-FXQGPHK2.js.map +0 -1
  333. package/dist/chunk-GR5STMOA.js.map +0 -1
  334. package/dist/chunk-HJIKU6MF.cjs.map +0 -1
  335. package/dist/chunk-HXSAH4Y6.cjs.map +0 -1
  336. package/dist/chunk-I2HHC6QW.js.map +0 -1
  337. package/dist/chunk-IHACXMOI.js.map +0 -1
  338. package/dist/chunk-IJA26LRY.cjs.map +0 -1
  339. package/dist/chunk-IOWREUEP.js.map +0 -1
  340. package/dist/chunk-IZDJCEMF.cjs +0 -31
  341. package/dist/chunk-IZDJCEMF.cjs.map +0 -1
  342. package/dist/chunk-JSDQVVQB.js.map +0 -1
  343. package/dist/chunk-KW7Z4IQC.js.map +0 -1
  344. package/dist/chunk-LLNEDEST.cjs.map +0 -1
  345. package/dist/chunk-LXNR6TQK.js.map +0 -1
  346. package/dist/chunk-MDQNUKCP.cjs.map +0 -1
  347. package/dist/chunk-N73JGXYZ.cjs.map +0 -1
  348. package/dist/chunk-NN7WMXY4.cjs.map +0 -1
  349. package/dist/chunk-NQQWCIE6.cjs +0 -20
  350. package/dist/chunk-NQQWCIE6.cjs.map +0 -1
  351. package/dist/chunk-NS3C2ZSE.js.map +0 -1
  352. package/dist/chunk-O2HMH5BI.cjs +0 -88
  353. package/dist/chunk-O2HMH5BI.cjs.map +0 -1
  354. package/dist/chunk-O7C6S644.js.map +0 -1
  355. package/dist/chunk-OM76QWUN.js.map +0 -1
  356. package/dist/chunk-OWNVDXRQ.js.map +0 -1
  357. package/dist/chunk-OZVPJWXO.cjs.map +0 -1
  358. package/dist/chunk-PKXXR76Q.js.map +0 -1
  359. package/dist/chunk-QOGROEVD.js.map +0 -1
  360. package/dist/chunk-QVFEKGKI.cjs.map +0 -1
  361. package/dist/chunk-RFU5HN4E.js.map +0 -1
  362. package/dist/chunk-RQV7SMIZ.cjs.map +0 -1
  363. package/dist/chunk-RZ2E3XEU.cjs.map +0 -1
  364. package/dist/chunk-SMHXSEBD.cjs.map +0 -1
  365. package/dist/chunk-T4PI2ZX7.cjs.map +0 -1
  366. package/dist/chunk-TQLCIXCK.cjs.map +0 -1
  367. package/dist/chunk-TZLM5GF4.js.map +0 -1
  368. package/dist/chunk-TZXEZFCI.cjs.map +0 -1
  369. package/dist/chunk-UQB5OHMO.js.map +0 -1
  370. package/dist/chunk-V2DIQ3RH.js.map +0 -1
  371. package/dist/chunk-VQBZKRIB.cjs.map +0 -1
  372. package/dist/chunk-WDBJVKSR.js +0 -18
  373. package/dist/chunk-WDBJVKSR.js.map +0 -1
  374. package/dist/chunk-WVBFQB26.cjs.map +0 -1
  375. package/dist/chunk-WZ73TWB2.cjs.map +0 -1
  376. package/dist/chunk-XCYE4OQV.js.map +0 -1
  377. package/dist/chunk-XUT2Z2L6.cjs +0 -119
  378. package/dist/chunk-XUT2Z2L6.cjs.map +0 -1
  379. package/dist/chunk-XYVJ3FBQ.cjs.map +0 -1
  380. package/dist/chunk-YCHUHMNP.cjs.map +0 -1
  381. package/dist/chunk-YZ2I7CDF.cjs.map +0 -1
  382. package/dist/chunk-ZFJHUOFU.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkYCHUHMNP_cjs = require('./chunk-YCHUHMNP.cjs');
3
+ var chunkDH4NYYJP_cjs = require('./chunk-DH4NYYJP.cjs');
4
4
  require('./tokens-BIIUTPKN.css');
5
5
  require('./shared-NJHRNLRH.css');
6
6
  require('./Drawer-IPGB4CXH.css');
@@ -32,7 +32,7 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
32
  var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
33
33
 
34
34
  var ANIM_MS = 280;
35
- var Drawer = ({
35
+ var Drawer = React__namespace.forwardRef(({
36
36
  open,
37
37
  onClose,
38
38
  placement = "right",
@@ -49,8 +49,11 @@ var Drawer = ({
49
49
  destroyOnClose = false,
50
50
  afterOpenChange,
51
51
  zIndex,
52
- className = ""
53
- }) => {
52
+ className = "",
53
+ style,
54
+ onClick,
55
+ ...rest
56
+ }, ref) => {
54
57
  const [hasOpenedOnce, setHasOpenedOnce] = React__namespace.useState(open);
55
58
  React__namespace.useEffect(() => {
56
59
  if (open) setHasOpenedOnce(true);
@@ -75,8 +78,9 @@ var Drawer = ({
75
78
  if (!hasOpenedOnce) return null;
76
79
  if (!open && destroyOnClose) return null;
77
80
  const isV = placement === "left" || placement === "right";
78
- const style = isV ? { width: size } : { height: size };
79
- if (zIndex != null) style.zIndex = zIndex;
81
+ const panelStyle = isV ? { width: size } : { height: size };
82
+ if (zIndex != null) panelStyle.zIndex = zIndex;
83
+ Object.assign(panelStyle, style);
80
84
  return ReactDOM__default.default.createPortal(
81
85
  /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
82
86
  mask && /* @__PURE__ */ jsxRuntime.jsx(
@@ -90,11 +94,16 @@ var Drawer = ({
90
94
  /* @__PURE__ */ jsxRuntime.jsxs(
91
95
  "div",
92
96
  {
97
+ ref,
93
98
  className: `drawer ${placement} ${open ? "" : "hidden"} ${className}`,
94
- style,
95
- onClick: (e) => e.stopPropagation(),
99
+ style: panelStyle,
100
+ onClick: (e) => {
101
+ onClick?.(e);
102
+ e.stopPropagation();
103
+ },
96
104
  role: "dialog",
97
105
  "aria-hidden": !open,
106
+ ...rest,
98
107
  children: [
99
108
  (title || extra || closable) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "drawer-head", children: [
100
109
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "drawer-title", children: title }),
@@ -107,7 +116,7 @@ var Drawer = ({
107
116
  className: "drawer-close",
108
117
  onClick: onClose,
109
118
  "aria-label": "Close",
110
- children: closeIcon ?? /* @__PURE__ */ jsxRuntime.jsx(chunkYCHUHMNP_cjs.Icon, { name: "x", size: 16 })
119
+ children: closeIcon ?? /* @__PURE__ */ jsxRuntime.jsx(chunkDH4NYYJP_cjs.Icon, { name: "x", size: 16 })
111
120
  }
112
121
  )
113
122
  ] })
@@ -120,8 +129,9 @@ var Drawer = ({
120
129
  ] }),
121
130
  document.body
122
131
  );
123
- };
132
+ });
133
+ Drawer.displayName = "Drawer";
124
134
 
125
135
  exports.Drawer = Drawer;
126
- //# sourceMappingURL=chunk-N73JGXYZ.cjs.map
127
- //# sourceMappingURL=chunk-N73JGXYZ.cjs.map
136
+ //# sourceMappingURL=chunk-2TNJ7TC4.cjs.map
137
+ //# sourceMappingURL=chunk-2TNJ7TC4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Drawer/Drawer.tsx"],"names":["React","ReactDOM","jsxs","Fragment","jsx","Icon"],"mappings":"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","file":"chunk-2TNJ7TC4.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Drawer.css\";\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Icon } from \"../Icon\";\n\nexport interface DrawerProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\" | \"children\" | \"onClose\"> {\n /** Whether the drawer is visible. */\n open: boolean;\n /** Close callback (triggered by mask click / close button / Esc). */\n onClose?: () => void;\n /** Which edge the drawer slides from. */\n placement?: \"left\" | \"right\" | \"top\" | \"bottom\";\n /** Width (for left/right) or height (for top/bottom). Number → px. */\n size?: number | string;\n /** Header title. */\n title?: React.ReactNode;\n /** Extra content rendered to the right of the title (e.g. action buttons). */\n extra?: React.ReactNode;\n /** Footer content. */\n footer?: React.ReactNode;\n /** Drawer body. */\n children?: React.ReactNode;\n /** Render the mask overlay. Default true. Set `false` for a non-blocking drawer. */\n mask?: boolean;\n /** Close when clicking the mask. Default true. Ignored when `mask` is false. */\n maskClosable?: boolean;\n /** Close on Escape key. Default true. */\n keyboard?: boolean;\n /** Show the close (×) button in the header. Default true. */\n closable?: boolean;\n /** Override the close icon node. */\n closeIcon?: React.ReactNode;\n /**\n * When true the drawer's children are unmounted every time it closes.\n * Default `false` — children stay mounted across open/close cycles so\n * internal state (form fields, scroll position) is preserved.\n */\n destroyOnClose?: boolean;\n /** Fires after the open/close animation finishes. */\n afterOpenChange?: (open: boolean) => void;\n /** Stack index for nested drawers. */\n zIndex?: number;\n className?: string;\n}\n\nconst ANIM_MS = 280;\n\n/** `Drawer` — slide-in panel from an edge. */\nexport const Drawer = React.forwardRef<HTMLDivElement, DrawerProps>(({\n open,\n onClose,\n placement = \"right\",\n size = 380,\n title,\n extra,\n footer,\n children,\n mask = true,\n maskClosable = true,\n keyboard = true,\n closable = true,\n closeIcon,\n destroyOnClose = false,\n afterOpenChange,\n zIndex,\n className = \"\",\n style,\n onClick,\n ...rest\n}, ref) => {\n const [hasOpenedOnce, setHasOpenedOnce] = React.useState(open);\n React.useEffect(() => {\n if (open) setHasOpenedOnce(true);\n }, [open]);\n\n React.useEffect(() => {\n if (!open || !keyboard) return;\n const h = (e: KeyboardEvent) => e.key === \"Escape\" && onClose?.();\n window.addEventListener(\"keydown\", h);\n return () => window.removeEventListener(\"keydown\", h);\n }, [open, keyboard, onClose]);\n\n const prevOpen = React.useRef(open);\n React.useEffect(() => {\n if (prevOpen.current !== open) {\n prevOpen.current = open;\n if (afterOpenChange) {\n const id = window.setTimeout(() => afterOpenChange(open), ANIM_MS);\n return () => window.clearTimeout(id);\n }\n }\n }, [open, afterOpenChange]);\n\n if (typeof document === \"undefined\") return null;\n if (!hasOpenedOnce) return null;\n if (!open && destroyOnClose) return null;\n\n const isV = placement === \"left\" || placement === \"right\";\n const panelStyle: React.CSSProperties = isV ? { width: size } : { height: size };\n if (zIndex != null) panelStyle.zIndex = zIndex;\n Object.assign(panelStyle, style);\n\n return ReactDOM.createPortal(\n <>\n {mask && (\n <div\n className={`drawer-overlay ${open ? \"\" : \"hidden\"}`}\n style={zIndex != null ? { zIndex: zIndex - 1 } : undefined}\n onClick={() => maskClosable && onClose?.()}\n />\n )}\n <div\n ref={ref}\n className={`drawer ${placement} ${open ? \"\" : \"hidden\"} ${className}`}\n style={panelStyle}\n onClick={(e) => {\n onClick?.(e);\n e.stopPropagation();\n }}\n role=\"dialog\"\n aria-hidden={!open}\n {...rest}\n >\n {(title || extra || closable) && (\n <div className=\"drawer-head\">\n <div className=\"drawer-title\">{title}</div>\n <div className=\"drawer-head-right\">\n {extra}\n {closable && (\n <button\n type=\"button\"\n className=\"drawer-close\"\n onClick={onClose}\n aria-label=\"Close\"\n >\n {closeIcon ?? <Icon name=\"x\" size={16} />}\n </button>\n )}\n </div>\n </div>\n )}\n <div className=\"drawer-body\">{children}</div>\n {footer && <div className=\"drawer-foot\">{footer}</div>}\n </div>\n </>,\n document.body\n );\n});\nDrawer.displayName = \"Drawer\";\n"]}
@@ -0,0 +1,65 @@
1
+ 'use strict';
2
+
3
+ require('./tokens-BIIUTPKN.css');
4
+ require('./shared-NJHRNLRH.css');
5
+ require('./Progress-CHV7DN6Y.css');
6
+ var React = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ // src/components/Progress/Progress.tsx
30
+ var Progress = React__namespace.forwardRef(({
31
+ value,
32
+ max = 100,
33
+ label,
34
+ showValue,
35
+ tone = "accent",
36
+ color,
37
+ size = "md",
38
+ className = "",
39
+ style,
40
+ ...rest
41
+ }, ref) => {
42
+ const pct = Math.max(0, Math.min(100, value / max * 100));
43
+ const rootStyle = {
44
+ ...color ? {
45
+ ["--progress-fill"]: color,
46
+ ["--progress-fill-glow"]: `color-mix(in oklch, ${color} 35%, transparent)`
47
+ } : null,
48
+ ...style
49
+ };
50
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: `progress ${size} ${tone} ${className}`, style: rootStyle, ...rest, children: [
51
+ (label || showValue) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "progress-label", children: [
52
+ label ? /* @__PURE__ */ jsxRuntime.jsx("span", { children: label }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
53
+ showValue && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "v", children: [
54
+ Math.round(pct),
55
+ "%"
56
+ ] })
57
+ ] }),
58
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "progress-track", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "progress-bar", style: { width: `${pct}%` } }) })
59
+ ] });
60
+ });
61
+ Progress.displayName = "Progress";
62
+
63
+ exports.Progress = Progress;
64
+ //# sourceMappingURL=chunk-3EGZ6TBF.cjs.map
65
+ //# sourceMappingURL=chunk-3EGZ6TBF.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Progress/Progress.tsx"],"names":["React","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,IAAM,QAAA,GAAiBA,4BAA0C,CAAC;AAAA,EACvE,KAAA;AAAA,EACA,GAAA,GAAM,GAAA;AAAA,EACN,KAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,KAAA;AAAA,EACA,IAAA,GAAO,IAAA;AAAA,EACP,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAG,GAAA,KAAQ;AACT,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,GAAA,EAAM,KAAA,GAAQ,GAAA,GAAO,GAAG,CAAC,CAAA;AAC1D,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,GAAI,KAAA,GACA;AAAA,MACE,CAAC,iBAA0B,GAAG,KAAA;AAAA,MAC9B,CAAC,sBAA+B,GAAG,CAAA,oBAAA,EAAuB,KAAK,CAAA,kBAAA;AAAA,KACjE,GACA,IAAA;AAAA,IACJ,GAAG;AAAA,GACL;AACA,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,SAAA,EAAW,YAAY,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,SAAA,EAAY,GAAG,IAAA,EACrF,QAAA,EAAA;AAAA,IAAA,CAAA,KAAA,IAAS,SAAA,qBACTA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,KAAA,mBAAQC,cAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,KAAA,EAAM,CAAA,kCAAW,MAAA,EAAA,EAAK,CAAA;AAAA,MACrC,SAAA,oBAAaD,eAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,GAAA,EAAK,QAAA,EAAA;AAAA,QAAA,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,QAAE;AAAA,OAAA,EAAC;AAAA,KAAA,EACtD,CAAA;AAAA,oBAEFC,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,yCAAC,KAAA,EAAA,EAAI,SAAA,EAAU,cAAA,EAAe,KAAA,EAAO,EAAE,KAAA,EAAO,CAAA,EAAG,GAAG,CAAA,CAAA,CAAA,IAAO,CAAA,EAC7D;AAAA,GAAA,EACF,CAAA;AAEJ,CAAC;AACD,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-3EGZ6TBF.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Progress.css\";\nimport * as React from \"react\";\n\nexport interface ProgressProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 0–100 */\n value: number;\n max?: number;\n label?: React.ReactNode;\n showValue?: boolean;\n tone?: \"accent\" | \"success\" | \"warning\" | \"danger\";\n /** Custom fill color. Overrides `tone`. */\n color?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n}\n\n/** `Progress` — horizontal progress bar with neumorphic track. */\nexport const Progress = React.forwardRef<HTMLDivElement, ProgressProps>(({\n value,\n max = 100,\n label,\n showValue,\n tone = \"accent\",\n color,\n size = \"md\",\n className = \"\",\n style,\n ...rest\n}, ref) => {\n const pct = Math.max(0, Math.min(100, (value / max) * 100));\n const rootStyle: React.CSSProperties = {\n ...(color\n ? {\n [\"--progress-fill\" as never]: color,\n [\"--progress-fill-glow\" as never]: `color-mix(in oklch, ${color} 35%, transparent)`,\n }\n : null),\n ...style,\n };\n return (\n <div ref={ref} className={`progress ${size} ${tone} ${className}`} style={rootStyle} {...rest}>\n {(label || showValue) && (\n <div className=\"progress-label\">\n {label ? <span>{label}</span> : <span />}\n {showValue && <span className=\"v\">{Math.round(pct)}%</span>}\n </div>\n )}\n <div className=\"progress-track\">\n <div className=\"progress-bar\" style={{ width: `${pct}%` }} />\n </div>\n </div>\n );\n});\nProgress.displayName = \"Progress\";\n"]}
@@ -8,12 +8,16 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
  // src/components/ContextMenu/ContextMenu.tsx
9
9
  var ESTIMATED_ITEM_H = 32;
10
10
  var MARGIN = 8;
11
- var ContextMenu = ({
11
+ var ContextMenu = React.forwardRef(({
12
12
  items,
13
13
  children,
14
14
  disabled,
15
- minWidth = 180
16
- }) => {
15
+ minWidth = 180,
16
+ className = "",
17
+ style,
18
+ onContextMenu,
19
+ ...rest
20
+ }, ref) => {
17
21
  const [open, setOpen] = React.useState(false);
18
22
  const [pos, setPos] = React.useState({ top: 0, left: 0 });
19
23
  const [active, setActive] = React.useState(-1);
@@ -96,7 +100,20 @@ var ContextMenu = ({
96
100
  e.preventDefault();
97
101
  openAt(e.clientX, e.clientY);
98
102
  };
99
- const trigger = /* @__PURE__ */ jsx("span", { style: { display: "contents" }, onContextMenu: handleTriggerContextMenu, children });
103
+ const trigger = /* @__PURE__ */ jsx(
104
+ "span",
105
+ {
106
+ ref,
107
+ className,
108
+ style: { display: "contents", ...style },
109
+ onContextMenu: (e) => {
110
+ onContextMenu?.(e);
111
+ handleTriggerContextMenu(e);
112
+ },
113
+ ...rest,
114
+ children
115
+ }
116
+ );
100
117
  const panel = open && typeof document !== "undefined" ? ReactDOM.createPortal(
101
118
  /* @__PURE__ */ jsx(
102
119
  "div",
@@ -142,8 +159,9 @@ var ContextMenu = ({
142
159
  trigger,
143
160
  panel
144
161
  ] });
145
- };
162
+ });
163
+ ContextMenu.displayName = "ContextMenu";
146
164
 
147
165
  export { ContextMenu };
148
- //# sourceMappingURL=chunk-RFU5HN4E.js.map
149
- //# sourceMappingURL=chunk-RFU5HN4E.js.map
166
+ //# sourceMappingURL=chunk-3LJO33HI.js.map
167
+ //# sourceMappingURL=chunk-3LJO33HI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ContextMenu/ContextMenu.tsx"],"names":[],"mappings":"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","file":"chunk-3LJO33HI.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./ContextMenu.css\";\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\n\nexport interface ContextMenuItem {\n key: string;\n /** Omit for `type: \"divider\"`. */\n label?: React.ReactNode;\n icon?: React.ReactNode;\n /** Right-aligned shortcut hint, e.g. `\"⌘C\"`. */\n shortcut?: React.ReactNode;\n disabled?: boolean;\n /** Style the item as destructive (red). */\n danger?: boolean;\n /** Render a horizontal separator; other fields are ignored. */\n type?: \"divider\";\n onSelect?: () => void;\n}\n\nexport interface ContextMenuProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n items: ContextMenuItem[];\n /**\n * Any content — right-click anywhere inside the trigger area opens the menu.\n * Internally wrapped in a `display: contents` span so layout is unaffected\n * regardless of whether `children` is a DOM element or a React component.\n */\n children: React.ReactNode;\n /** Skip the menu entirely — browser default context menu will be used instead. */\n disabled?: boolean;\n /** Minimum panel width in px. Default 180. */\n minWidth?: number;\n}\n\nconst ESTIMATED_ITEM_H = 32;\nconst MARGIN = 8;\n\n/**\n * `ContextMenu` — right-click menu. Wraps one child element; suppresses the\n * browser's native menu and opens a neumorphic replacement at the cursor.\n *\n * @example\n * ```tsx\n * <ContextMenu\n * items={[\n * { key: \"copy\", label: \"复制\", shortcut: \"⌘C\", onSelect: copy },\n * { key: \"cut\", label: \"剪切\", shortcut: \"⌘X\", onSelect: cut },\n * { key: \"d1\", type: \"divider\" },\n * { key: \"del\", label: \"删除\", danger: true, onSelect: del },\n * ]}\n * >\n * <div>右键点击我</div>\n * </ContextMenu>\n * ```\n */\nexport const ContextMenu = React.forwardRef<HTMLSpanElement, ContextMenuProps>(({\n items,\n children,\n disabled,\n minWidth = 180,\n className = \"\",\n style,\n onContextMenu,\n ...rest\n}, ref) => {\n const [open, setOpen] = React.useState(false);\n const [pos, setPos] = React.useState<{ top: number; left: number }>({ top: 0, left: 0 });\n const [active, setActive] = React.useState(-1);\n const menuRef = React.useRef<HTMLDivElement>(null);\n\n const isSelectable = React.useCallback(\n (i: ContextMenuItem) => i.type !== \"divider\" && !i.disabled,\n []\n );\n\n const close = React.useCallback(() => setOpen(false), []);\n\n const openAt = (clientX: number, clientY: number) => {\n // Estimate panel size for clamping; refined on next paint via measured rect.\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const estH = Math.min(items.length * ESTIMATED_ITEM_H + 16, vh - MARGIN * 2);\n const estW = minWidth;\n const left = Math.min(clientX, vw - estW - MARGIN);\n const top = Math.min(clientY, vh - estH - MARGIN);\n setPos({ top: Math.max(MARGIN, top), left: Math.max(MARGIN, left) });\n const firstIdx = items.findIndex(isSelectable);\n setActive(firstIdx);\n setOpen(true);\n };\n\n // Close on Esc / outside click / scroll / window blur.\n React.useEffect(() => {\n if (!open) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") { e.stopPropagation(); close(); return; }\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((curr) => {\n const dir = e.key === \"ArrowDown\" ? 1 : -1;\n let i = curr;\n for (let n = 0; n < items.length; n++) {\n i = (i + dir + items.length) % items.length;\n if (isSelectable(items[i])) return i;\n }\n return curr;\n });\n }\n if (e.key === \"Enter\") {\n const it = items[active];\n if (it && isSelectable(it)) {\n e.preventDefault();\n it.onSelect?.();\n close();\n }\n }\n };\n const onOutside = (e: MouseEvent) => {\n if (!menuRef.current?.contains(e.target as Node)) close();\n };\n const onBlur = () => close();\n window.addEventListener(\"keydown\", onKey);\n window.addEventListener(\"mousedown\", onOutside);\n window.addEventListener(\"scroll\", close, true);\n window.addEventListener(\"resize\", close);\n window.addEventListener(\"blur\", onBlur);\n return () => {\n window.removeEventListener(\"keydown\", onKey);\n window.removeEventListener(\"mousedown\", onOutside);\n window.removeEventListener(\"scroll\", close, true);\n window.removeEventListener(\"resize\", close);\n window.removeEventListener(\"blur\", onBlur);\n };\n }, [open, items, active, close, isSelectable]);\n\n // Clamp again after mount using the real measured size.\n React.useLayoutEffect(() => {\n if (!open || !menuRef.current) return;\n const rect = menuRef.current.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n setPos((p) => ({\n top: Math.min(p.top, Math.max(MARGIN, vh - rect.height - MARGIN)),\n left: Math.min(p.left, Math.max(MARGIN, vw - rect.width - MARGIN)),\n }));\n }, [open]);\n\n const handleTriggerContextMenu = (e: React.MouseEvent) => {\n if (disabled || e.defaultPrevented) return;\n e.preventDefault();\n openAt(e.clientX, e.clientY);\n };\n\n // Wrap in a `display: contents` span so the handler lives on a DOM node we\n // fully control — React.cloneElement would fail to reach the DOM when\n // `children` is a React component that doesn't forward `onContextMenu`.\n const trigger = (\n <span\n ref={ref}\n className={className}\n style={{ display: \"contents\", ...style }}\n onContextMenu={(e) => {\n onContextMenu?.(e);\n handleTriggerContextMenu(e);\n }}\n {...rest}\n >\n {children}\n </span>\n );\n\n const panel =\n open && typeof document !== \"undefined\"\n ? ReactDOM.createPortal(\n <div\n ref={menuRef}\n className=\"context-menu\"\n role=\"menu\"\n style={{\n position: \"fixed\",\n top: pos.top,\n left: pos.left,\n minWidth,\n }}\n onContextMenu={(e) => e.preventDefault()}\n >\n {items.map((it, i) =>\n it.type === \"divider\" ? (\n <div key={it.key} className=\"context-menu-divider\" role=\"separator\" />\n ) : (\n <button\n key={it.key}\n type=\"button\"\n role=\"menuitem\"\n disabled={it.disabled}\n className={`context-menu-item ${active === i ? \"active\" : \"\"} ${it.danger ? \"danger\" : \"\"}`}\n onMouseEnter={() => isSelectable(it) && setActive(i)}\n onClick={() => {\n if (!isSelectable(it)) return;\n it.onSelect?.();\n close();\n }}\n >\n <span className=\"context-menu-icon\">{it.icon}</span>\n <span className=\"context-menu-label\">{it.label}</span>\n {it.shortcut && <span className=\"context-menu-shortcut\">{it.shortcut}</span>}\n </button>\n )\n )}\n </div>,\n document.body\n )\n : null;\n\n return (\n <>\n {trigger}\n {panel}\n </>\n );\n});\nContextMenu.displayName = \"ContextMenu\";\n"]}
@@ -25,6 +25,7 @@ var React__namespace = /*#__PURE__*/_interopNamespace(React);
25
25
  // src/utils/useFloating.ts
26
26
  function useFloating(opts) {
27
27
  const triggerRef = React__namespace.useRef(null);
28
+ const floatingRef = React__namespace.useRef(null);
28
29
  const preferred = opts.placement ?? "bottom";
29
30
  const gap = opts.gap ?? 8;
30
31
  const panelW = opts.panelWidth ?? 240;
@@ -40,9 +41,12 @@ function useFloating(opts) {
40
41
  const update = () => {
41
42
  const el = triggerRef.current;
42
43
  if (!el) return;
44
+ const floatingRect = floatingRef.current?.getBoundingClientRect();
43
45
  const rect = el.getBoundingClientRect();
44
- const w = matchW ? rect.width : panelW;
45
- const h = panelH;
46
+ const measuredW = floatingRect?.width && floatingRect.width > 0 ? floatingRect.width : void 0;
47
+ const measuredH = floatingRect?.height && floatingRect.height > 0 ? floatingRect.height : void 0;
48
+ const w = matchW ? rect.width : measuredW ?? panelW;
49
+ const h = measuredH ?? panelH;
46
50
  const vw = window.innerWidth;
47
51
  const vh = window.innerHeight;
48
52
  const MARGIN = 8;
@@ -105,11 +109,17 @@ function useFloating(opts) {
105
109
  update();
106
110
  window.addEventListener("scroll", update, true);
107
111
  window.addEventListener("resize", update);
112
+ const ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(update) : null;
113
+ if (ro) {
114
+ if (triggerRef.current) ro.observe(triggerRef.current);
115
+ if (floatingRef.current) ro.observe(floatingRef.current);
116
+ }
108
117
  return () => {
109
118
  window.removeEventListener("scroll", update, true);
110
119
  window.removeEventListener("resize", update);
120
+ ro?.disconnect();
111
121
  };
112
- }, [open, preferred, gap, panelW, panelH, doShift, doFlip, matchW]);
122
+ }, [open, preferred, gap, panelW, panelH, doShift, doFlip, matchW, align]);
113
123
  let transform;
114
124
  if (align !== "start") {
115
125
  const cross = state.placement === "top" || state.placement === "bottom" ? "X" : "Y";
@@ -123,9 +133,14 @@ function useFloating(opts) {
123
133
  ...state.width != null ? { width: state.width } : {},
124
134
  ...transform ? { transform } : {}
125
135
  };
126
- return { triggerRef, floatingStyle, placement: state.placement };
136
+ return {
137
+ triggerRef,
138
+ floatingRef,
139
+ floatingStyle,
140
+ placement: state.placement
141
+ };
127
142
  }
128
143
 
129
144
  exports.useFloating = useFloating;
130
- //# sourceMappingURL=chunk-RZ2E3XEU.cjs.map
131
- //# sourceMappingURL=chunk-RZ2E3XEU.cjs.map
145
+ //# sourceMappingURL=chunk-3XIDJEYR.cjs.map
146
+ //# sourceMappingURL=chunk-3XIDJEYR.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/useFloating.ts"],"names":["React"],"mappings":"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","file":"chunk-3XIDJEYR.cjs","sourcesContent":["import * as React from \"react\";\n\nexport type Placement = \"top\" | \"bottom\" | \"left\" | \"right\";\n\nexport interface UseFloatingOptions {\n /** Whether the floating element is currently visible. */\n open: boolean;\n /** Preferred placement relative to the trigger. Default `\"bottom\"`. */\n placement?: Placement;\n /** Distance between trigger and panel in px. Default 8. */\n gap?: number;\n /** Estimated panel width, used for flip / shift math. Ignored when `matchTriggerWidth`. */\n panelWidth?: number;\n /** Estimated panel height, used for flip / shift math. */\n panelHeight?: number;\n /** Keep the panel inside the viewport horizontally / vertically. Default true. */\n shift?: boolean;\n /** Flip to the opposite side if the preferred side would overflow. Default true. */\n flip?: boolean;\n /** Make the panel width track the trigger width (used by Select / Cascader). */\n matchTriggerWidth?: boolean;\n /**\n * Cross-axis alignment of the panel relative to the trigger.\n * - `\"start\"` (default) — panel's leading edge lines up with trigger's leading edge.\n * - `\"center\"` — panel is centered on the trigger (uses a CSS transform).\n * - `\"end\"` — panel's trailing edge lines up with trigger's trailing edge.\n *\n * `shift` is ignored for non-`\"start\"` alignments to avoid tugging against the\n * caller's translate.\n */\n alignCross?: \"start\" | \"center\" | \"end\";\n}\n\nexport interface UseFloatingResult<\n T extends HTMLElement,\n F extends HTMLElement\n> {\n /** Attach this to the trigger element. */\n triggerRef: React.RefObject<T>;\n /** Attach this to the floating element so placement can use its real size. */\n floatingRef: React.RefObject<F>;\n /** Spread this onto the panel element. Already contains `position: fixed` + coords. */\n floatingStyle: React.CSSProperties;\n /** Resolved placement after flip logic — useful for arrow direction. */\n placement: Placement;\n}\n\n/**\n * Minimal floating-element positioning hook used by Tooltip / Popover / Select /\n * Cascader / ColorPicker. Designed to be paired with `createPortal(document.body)`\n * so overflow clipping from ancestors becomes a non-issue.\n *\n * Not a general-purpose `@floating-ui` replacement — it only covers flip + shift\n * relative to the viewport, which is what Lumina's overlays need.\n */\nexport function useFloating<\n T extends HTMLElement = HTMLElement,\n F extends HTMLElement = HTMLElement\n>(\n opts: UseFloatingOptions\n): UseFloatingResult<T, F> {\n const triggerRef = React.useRef<T>(null);\n const floatingRef = React.useRef<F>(null);\n const preferred = opts.placement ?? \"bottom\";\n const gap = opts.gap ?? 8;\n const panelW = opts.panelWidth ?? 240;\n const panelH = opts.panelHeight ?? 300;\n const doShift = opts.shift !== false;\n const doFlip = opts.flip !== false;\n const matchW = !!opts.matchTriggerWidth;\n const align = opts.alignCross ?? \"start\";\n const open = opts.open;\n\n const [state, setState] = React.useState<{\n top: number;\n left: number;\n width?: number;\n placement: Placement;\n }>({ top: 0, left: 0, placement: preferred });\n\n React.useLayoutEffect(() => {\n if (!open) return;\n const update = () => {\n const el = triggerRef.current;\n if (!el) return;\n\n const floatingRect = floatingRef.current?.getBoundingClientRect();\n const rect = el.getBoundingClientRect();\n const measuredW = floatingRect?.width && floatingRect.width > 0 ? floatingRect.width : undefined;\n const measuredH = floatingRect?.height && floatingRect.height > 0 ? floatingRect.height : undefined;\n const w = matchW ? rect.width : (measuredW ?? panelW);\n const h = measuredH ?? panelH;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const MARGIN = 8;\n\n const place = (p: Placement) => {\n switch (p) {\n case \"top\":\n return { top: rect.top - gap - h, left: rect.left };\n case \"right\":\n return { top: rect.top, left: rect.right + gap };\n case \"left\":\n return { top: rect.top, left: rect.left - gap - w };\n case \"bottom\":\n default:\n return { top: rect.bottom + gap, left: rect.left };\n }\n };\n\n const fits = (p: Placement, c: { top: number; left: number }) => {\n if (p === \"bottom\") return c.top + h <= vh - MARGIN;\n if (p === \"top\") return c.top >= MARGIN;\n if (p === \"right\") return c.left + w <= vw - MARGIN;\n if (p === \"left\") return c.left >= MARGIN;\n return true;\n };\n\n let resolved: Placement = preferred;\n let coords = place(resolved);\n\n if (doFlip && !fits(resolved, coords)) {\n const opp: Record<Placement, Placement> = {\n top: \"bottom\",\n bottom: \"top\",\n left: \"right\",\n right: \"left\",\n };\n const alt = opp[resolved];\n const altCoords = place(alt);\n if (fits(alt, altCoords)) {\n resolved = alt;\n coords = altCoords;\n }\n }\n\n // Cross-axis alignment replaces the cross coordinate with the trigger\n // midpoint / far edge; the paired CSS transform then visually aligns.\n if (align !== \"start\") {\n if (resolved === \"top\" || resolved === \"bottom\") {\n coords.left =\n align === \"center\" ? rect.left + rect.width / 2 : rect.right;\n } else {\n coords.top =\n align === \"center\" ? rect.top + rect.height / 2 : rect.bottom;\n }\n } else if (doShift) {\n if (resolved === \"bottom\" || resolved === \"top\") {\n coords.left = Math.max(MARGIN, Math.min(coords.left, vw - w - MARGIN));\n } else {\n coords.top = Math.max(MARGIN, Math.min(coords.top, vh - h - MARGIN));\n }\n }\n\n setState({\n top: coords.top,\n left: coords.left,\n width: matchW ? rect.width : undefined,\n placement: resolved,\n });\n };\n\n update();\n window.addEventListener(\"scroll\", update, true);\n window.addEventListener(\"resize\", update);\n const ro =\n typeof ResizeObserver !== \"undefined\" ? new ResizeObserver(update) : null;\n if (ro) {\n if (triggerRef.current) ro.observe(triggerRef.current);\n if (floatingRef.current) ro.observe(floatingRef.current);\n }\n return () => {\n window.removeEventListener(\"scroll\", update, true);\n window.removeEventListener(\"resize\", update);\n ro?.disconnect();\n };\n }, [open, preferred, gap, panelW, panelH, doShift, doFlip, matchW, align]);\n\n let transform: string | undefined;\n if (align !== \"start\") {\n const cross = state.placement === \"top\" || state.placement === \"bottom\" ? \"X\" : \"Y\";\n const percent = align === \"center\" ? \"-50%\" : \"-100%\";\n transform = `translate${cross}(${percent})`;\n }\n\n const floatingStyle: React.CSSProperties = {\n position: \"fixed\",\n top: state.top,\n left: state.left,\n ...(state.width != null ? { width: state.width } : {}),\n ...(transform ? { transform } : {}),\n };\n\n return {\n triggerRef,\n floatingRef,\n floatingStyle,\n placement: state.placement,\n };\n}\n"]}
@@ -1,31 +1,34 @@
1
1
  import './tokens-BIIUTPKN.css';
2
2
  import './shared-NJHRNLRH.css';
3
3
  import './AppShell-RCALXUCZ.css';
4
+ import * as React from 'react';
4
5
  import { jsxs, jsx } from 'react/jsx-runtime';
5
6
 
6
7
  // src/components/AppShell/AppShell.tsx
7
- var WindowControls = ({
8
+ var WindowControls = React.forwardRef(({
8
9
  platform = "mac",
9
10
  onMinimize,
10
11
  onMaximize,
11
12
  onClose,
12
- className = ""
13
- }) => {
13
+ className = "",
14
+ ...rest
15
+ }, ref) => {
14
16
  const noDragStyle = { WebkitAppRegion: "no-drag" };
15
17
  if (platform === "windows") {
16
- return /* @__PURE__ */ jsxs("div", { className: `win-controls windows ${className}`, style: noDragStyle, children: [
18
+ return /* @__PURE__ */ jsxs("div", { ref, className: `win-controls windows ${className}`, style: noDragStyle, ...rest, children: [
17
19
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn minimize", onClick: onMinimize, "aria-label": "Minimize", children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M1 5h8", stroke: "currentColor", strokeWidth: "1" }) }) }),
18
20
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn maximize", onClick: onMaximize, "aria-label": "Maximize", children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx("rect", { x: "1", y: "1", width: "8", height: "8", stroke: "currentColor", strokeWidth: "1" }) }) }),
19
21
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn close", onClick: onClose, "aria-label": "Close", children: /* @__PURE__ */ jsx("svg", { width: "10", height: "10", viewBox: "0 0 10 10", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx("path", { d: "M1 1l8 8M9 1l-8 8", stroke: "currentColor", strokeWidth: "1" }) }) })
20
22
  ] });
21
23
  }
22
- return /* @__PURE__ */ jsxs("div", { className: `win-controls mac ${className}`, style: noDragStyle, children: [
24
+ return /* @__PURE__ */ jsxs("div", { ref, className: `win-controls mac ${className}`, style: noDragStyle, ...rest, children: [
23
25
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn close", onClick: onClose, "aria-label": "Close" }),
24
26
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn minimize", onClick: onMinimize, "aria-label": "Minimize" }),
25
27
  /* @__PURE__ */ jsx("button", { type: "button", className: "win-btn maximize", onClick: onMaximize, "aria-label": "Maximize" })
26
28
  ] });
27
- };
28
- var TitleBar = ({
29
+ });
30
+ WindowControls.displayName = "WindowControls";
31
+ var TitleBar = React.forwardRef(({
29
32
  title,
30
33
  platform = "mac",
31
34
  onMinimize,
@@ -34,27 +37,30 @@ var TitleBar = ({
34
37
  center,
35
38
  actions,
36
39
  draggable = true,
37
- className = ""
38
- }) => {
40
+ className = "",
41
+ ...rest
42
+ }, ref) => {
39
43
  const dragStyle = draggable ? { WebkitAppRegion: "drag" } : void 0;
40
44
  const noDragStyle = { WebkitAppRegion: "no-drag" };
41
- return /* @__PURE__ */ jsxs("div", { className: `titlebar ${platform} ${className}`, style: dragStyle, children: [
45
+ return /* @__PURE__ */ jsxs("div", { ref, className: `titlebar ${platform} ${className}`, style: dragStyle, ...rest, children: [
42
46
  platform === "mac" && /* @__PURE__ */ jsx(WindowControls, { platform: "mac", onMinimize, onMaximize, onClose }),
43
47
  /* @__PURE__ */ jsx("div", { className: "titlebar-title", children: title }),
44
48
  center && /* @__PURE__ */ jsx("div", { className: "titlebar-center", style: noDragStyle, children: center }),
45
49
  actions && /* @__PURE__ */ jsx("div", { className: "titlebar-actions", style: noDragStyle, children: actions }),
46
50
  platform === "windows" && /* @__PURE__ */ jsx(WindowControls, { platform: "windows", onMinimize, onMaximize, onClose })
47
51
  ] });
48
- };
49
- var Sidebar = ({
52
+ });
53
+ TitleBar.displayName = "TitleBar";
54
+ var Sidebar = React.forwardRef(({
50
55
  items,
51
56
  activeKey,
52
57
  onSelect,
53
58
  collapsed,
54
59
  header,
55
60
  footer,
56
- className = ""
57
- }) => /* @__PURE__ */ jsxs("aside", { className: `sidebar ${collapsed ? "collapsed" : ""} ${className}`, children: [
61
+ className = "",
62
+ ...rest
63
+ }, ref) => /* @__PURE__ */ jsxs("aside", { ref, className: `sidebar ${collapsed ? "collapsed" : ""} ${className}`, ...rest, children: [
58
64
  header && /* @__PURE__ */ jsx("div", { className: "sidebar-header", children: header }),
59
65
  /* @__PURE__ */ jsx("nav", { className: "sidebar-nav", children: items.map((it) => /* @__PURE__ */ jsxs(
60
66
  "button",
@@ -71,15 +77,17 @@ var Sidebar = ({
71
77
  it.key
72
78
  )) }),
73
79
  footer && /* @__PURE__ */ jsx("div", { className: "sidebar-footer", children: footer })
74
- ] });
75
- var AppShell = ({ sidebar, titleBar, children, className = "" }) => /* @__PURE__ */ jsxs("div", { className: `app-shell ${className}`, children: [
80
+ ] }));
81
+ Sidebar.displayName = "Sidebar";
82
+ var AppShell = React.forwardRef(({ sidebar, titleBar, children, className = "", ...rest }, ref) => /* @__PURE__ */ jsxs("div", { ref, className: `app-shell ${className}`, ...rest, children: [
76
83
  titleBar,
77
84
  /* @__PURE__ */ jsxs("div", { className: "app-shell-body", children: [
78
85
  sidebar,
79
86
  /* @__PURE__ */ jsx("main", { className: "app-shell-main", children })
80
87
  ] })
81
- ] });
88
+ ] }));
89
+ AppShell.displayName = "AppShell";
82
90
 
83
91
  export { AppShell, Sidebar, TitleBar, WindowControls };
84
- //# sourceMappingURL=chunk-UQB5OHMO.js.map
85
- //# sourceMappingURL=chunk-UQB5OHMO.js.map
92
+ //# sourceMappingURL=chunk-44AVDO3T.js.map
93
+ //# sourceMappingURL=chunk-44AVDO3T.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AppShell/AppShell.tsx"],"names":[],"mappings":"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","file":"chunk-44AVDO3T.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./AppShell.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface WindowControlsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** macOS traffic lights or Windows-style buttons. */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n className?: string;\n}\n\n/**\n * `WindowControls` — standalone window control buttons.\n * Mac: traffic lights (close/min/max). Windows: rectangular controls.\n */\nexport const WindowControls = React.forwardRef<HTMLDivElement, WindowControlsProps>(({\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n className = \"\",\n ...rest\n}, ref) => {\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n if (platform === \"windows\") {\n return (\n <div ref={ref} className={`win-controls windows ${className}`} style={noDragStyle} {...rest}>\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 5h8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\">\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" fill=\"none\" aria-hidden>\n <path d=\"M1 1l8 8M9 1l-8 8\" stroke=\"currentColor\" strokeWidth=\"1\" />\n </svg>\n </button>\n </div>\n );\n }\n return (\n <div ref={ref} className={`win-controls mac ${className}`} style={noDragStyle} {...rest}>\n <button type=\"button\" className=\"win-btn close\" onClick={onClose} aria-label=\"Close\" />\n <button type=\"button\" className=\"win-btn minimize\" onClick={onMinimize} aria-label=\"Minimize\" />\n <button type=\"button\" className=\"win-btn maximize\" onClick={onMaximize} aria-label=\"Maximize\" />\n </div>\n );\n});\nWindowControls.displayName = \"WindowControls\";\n\nexport interface TitleBarProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"title\"> {\n title?: React.ReactNode;\n /** Platform appearance — affects button placement. Default \"mac\". */\n platform?: \"mac\" | \"windows\";\n onMinimize?: () => void;\n onMaximize?: () => void;\n onClose?: () => void;\n /** Extra content in the center. */\n center?: React.ReactNode;\n /** Extra content on the trailing side. */\n actions?: React.ReactNode;\n /** Make the whole bar draggable (Electron `-webkit-app-region: drag`). */\n draggable?: boolean;\n className?: string;\n}\n\n/**\n * `TitleBar` — Electron-style window chrome. Attach at the top of your app.\n * Buttons are non-draggable regions so clicks register correctly.\n */\nexport const TitleBar = React.forwardRef<HTMLDivElement, TitleBarProps>(({\n title,\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n center,\n actions,\n draggable = true,\n className = \"\",\n ...rest\n}, ref) => {\n const dragStyle = draggable ? ({ WebkitAppRegion: \"drag\" } as React.CSSProperties) : undefined;\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n\n return (\n <div ref={ref} className={`titlebar ${platform} ${className}`} style={dragStyle} {...rest}>\n {platform === \"mac\" && (\n <WindowControls platform=\"mac\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n <div className=\"titlebar-title\">{title}</div>\n {center && (\n <div className=\"titlebar-center\" style={noDragStyle}>\n {center}\n </div>\n )}\n {actions && (\n <div className=\"titlebar-actions\" style={noDragStyle}>\n {actions}\n </div>\n )}\n {platform === \"windows\" && (\n <WindowControls platform=\"windows\" onMinimize={onMinimize} onMaximize={onMaximize} onClose={onClose} />\n )}\n </div>\n );\n});\nTitleBar.displayName = \"TitleBar\";\n\nexport interface SidebarItem {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n badge?: React.ReactNode;\n children?: SidebarItem[];\n}\n\nexport interface SidebarProps\n extends Omit<React.HTMLAttributes<HTMLElement>, \"onSelect\" | \"children\"> {\n items: SidebarItem[];\n activeKey?: string;\n onSelect?: (key: string) => void;\n /** Collapsed: icons only. */\n collapsed?: boolean;\n /** Header slot (e.g. workspace switcher). */\n header?: React.ReactNode;\n /** Footer slot (e.g. user card). */\n footer?: React.ReactNode;\n className?: string;\n}\n\n/** `Sidebar` — navigation rail. Pair with `AppShell`. */\nexport const Sidebar = React.forwardRef<HTMLElement, SidebarProps>(({\n items,\n activeKey,\n onSelect,\n collapsed,\n header,\n footer,\n className = \"\",\n ...rest\n}, ref) => (\n <aside ref={ref} className={`sidebar ${collapsed ? \"collapsed\" : \"\"} ${className}`} {...rest}>\n {header && <div className=\"sidebar-header\">{header}</div>}\n <nav className=\"sidebar-nav\">\n {items.map((it) => (\n <button\n type=\"button\"\n key={it.key}\n className={`sidebar-item ${activeKey === it.key ? \"active\" : \"\"}`}\n onClick={() => onSelect?.(it.key)}\n >\n {it.icon && <span className=\"sidebar-icon\">{it.icon}</span>}\n {!collapsed && <span className=\"sidebar-label\">{it.label}</span>}\n {!collapsed && it.badge && <span className=\"sidebar-badge\">{it.badge}</span>}\n </button>\n ))}\n </nav>\n {footer && <div className=\"sidebar-footer\">{footer}</div>}\n </aside>\n));\nSidebar.displayName = \"Sidebar\";\n\nexport interface AppShellProps extends React.HTMLAttributes<HTMLDivElement> {\n sidebar?: React.ReactNode;\n titleBar?: React.ReactNode;\n children?: React.ReactNode;\n className?: string;\n}\n\n/**\n * `AppShell` — 3-zone Electron layout: title bar across top, sidebar on left, content fills rest.\n */\nexport const AppShell = React.forwardRef<HTMLDivElement, AppShellProps>(({ sidebar, titleBar, children, className = \"\", ...rest }, ref) => (\n <div ref={ref} className={`app-shell ${className}`} {...rest}>\n {titleBar}\n <div className=\"app-shell-body\">\n {sidebar}\n <main className=\"app-shell-main\">{children}</main>\n </div>\n </div>\n));\nAppShell.displayName = \"AppShell\";\n"]}
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ var chunkTC5ZL2OS_cjs = require('./chunk-TC5ZL2OS.cjs');
4
+ require('./tokens-BIIUTPKN.css');
5
+ require('./shared-NJHRNLRH.css');
6
+ require('./Timeline-RHZAZKZ7.css');
7
+ var React = require('react');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
+
30
+ var Timeline = React__namespace.forwardRef(
31
+ ({
32
+ items,
33
+ pending = false,
34
+ pendingContent = "\u52A0\u8F7D\u4E2D...",
35
+ mode = "left",
36
+ reverse = false,
37
+ className = "",
38
+ ...rest
39
+ }, ref) => {
40
+ const displayItems = [...items];
41
+ if (reverse) displayItems.reverse();
42
+ const hasPending = pending !== false;
43
+ return /* @__PURE__ */ jsxRuntime.jsxs(
44
+ "div",
45
+ {
46
+ ref,
47
+ className: `timeline timeline-${mode} ${className}`,
48
+ ...rest,
49
+ children: [
50
+ displayItems.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(
51
+ TimelineItem,
52
+ {
53
+ item,
54
+ isLast: !hasPending && i === displayItems.length - 1,
55
+ position: getPosition(mode, i)
56
+ },
57
+ item.key ?? i
58
+ )),
59
+ hasPending && /* @__PURE__ */ jsxRuntime.jsx(
60
+ TimelineItem,
61
+ {
62
+ item: {
63
+ children: pendingContent,
64
+ dot: typeof pending === "boolean" ? void 0 : pending,
65
+ color: "muted"
66
+ },
67
+ isLast: true,
68
+ isPending: true,
69
+ position: getPosition(mode, displayItems.length)
70
+ }
71
+ )
72
+ ]
73
+ }
74
+ );
75
+ }
76
+ );
77
+ Timeline.displayName = "Timeline";
78
+ function getPosition(mode, index) {
79
+ if (mode === "left") return "left";
80
+ if (mode === "right") return "right";
81
+ return index % 2 === 0 ? "left" : "right";
82
+ }
83
+ var TimelineItem = ({
84
+ item,
85
+ isLast,
86
+ isPending,
87
+ position
88
+ }) => {
89
+ const color = item.color ?? "accent";
90
+ const cls = [
91
+ "timeline-item",
92
+ `timeline-item-${position}`,
93
+ isLast ? "timeline-item-last" : "",
94
+ isPending ? "timeline-item-pending" : ""
95
+ ].filter(Boolean).join(" ");
96
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cls, children: [
97
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "timeline-item-label", children: item.label }),
98
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "timeline-item-head", children: [
99
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `timeline-item-dot ${color} ${isPending ? "pending" : ""}`, children: item.dot ?? (isPending && /* @__PURE__ */ jsxRuntime.jsx(chunkTC5ZL2OS_cjs.Spinner, { size: 14 })) }),
100
+ !isLast && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "timeline-item-tail" })
101
+ ] }),
102
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "timeline-item-content", children: item.children })
103
+ ] });
104
+ };
105
+
106
+ exports.Timeline = Timeline;
107
+ //# sourceMappingURL=chunk-474MXYO5.cjs.map
108
+ //# sourceMappingURL=chunk-474MXYO5.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Timeline/Timeline.tsx"],"names":["React","jsxs","jsx","Spinner"],"mappings":"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","file":"chunk-474MXYO5.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Timeline.css\";\nimport * as React from \"react\";\nimport { Spinner } from \"../Empty\";\n\nexport interface TimelineItemConfig {\n /** Unique key for the item */\n key?: string;\n /** Content displayed on the right (or main side) */\n children?: React.ReactNode;\n /** Label displayed on the opposite side (alternate/label mode) */\n label?: React.ReactNode;\n /** Dot color */\n color?: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"info\" | \"muted\";\n /** Custom dot content (replaces default dot) */\n dot?: React.ReactNode;\n}\n\nexport interface TimelineProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Timeline items */\n items: TimelineItemConfig[];\n /**\n * Show a pending (loading) item at the end.\n * `true` renders a default spinner; a ReactNode renders custom content.\n */\n pending?: boolean | React.ReactNode;\n /** Text shown as the pending item's content */\n pendingContent?: React.ReactNode;\n /** Layout mode */\n mode?: \"left\" | \"right\" | \"alternate\";\n /** Reverse the order of items */\n reverse?: boolean;\n}\n\n/**\n * `Timeline` — vertical timeline with pending/loading state.\n *\n * @example\n * <Timeline items={[{ children: \"Created\" }, { children: \"In Progress\" }]} pending />\n */\nexport const Timeline = React.forwardRef<HTMLDivElement, TimelineProps>(\n (\n {\n items,\n pending = false,\n pendingContent = \"加载中...\",\n mode = \"left\",\n reverse = false,\n className = \"\",\n ...rest\n },\n ref\n ) => {\n const displayItems = [...items];\n if (reverse) displayItems.reverse();\n\n const hasPending = pending !== false;\n\n return (\n <div\n ref={ref}\n className={`timeline timeline-${mode} ${className}`}\n {...rest}\n >\n {displayItems.map((item, i) => (\n <TimelineItem\n key={item.key ?? i}\n item={item}\n isLast={!hasPending && i === displayItems.length - 1}\n position={getPosition(mode, i)}\n />\n ))}\n {hasPending && (\n <TimelineItem\n item={{\n children: pendingContent,\n dot: typeof pending === \"boolean\" ? undefined : pending,\n color: \"muted\",\n }}\n isLast\n isPending\n position={getPosition(mode, displayItems.length)}\n />\n )}\n </div>\n );\n }\n);\nTimeline.displayName = \"Timeline\";\n\nfunction getPosition(\n mode: \"left\" | \"right\" | \"alternate\",\n index: number\n): \"left\" | \"right\" {\n if (mode === \"left\") return \"left\";\n if (mode === \"right\") return \"right\";\n return index % 2 === 0 ? \"left\" : \"right\";\n}\n\ninterface TimelineItemInternalProps {\n item: TimelineItemConfig;\n isLast: boolean;\n isPending?: boolean;\n position: \"left\" | \"right\";\n}\n\nconst TimelineItem: React.FC<TimelineItemInternalProps> = ({\n item,\n isLast,\n isPending,\n position,\n}) => {\n const color = item.color ?? \"accent\";\n const cls = [\n \"timeline-item\",\n `timeline-item-${position}`,\n isLast ? \"timeline-item-last\" : \"\",\n isPending ? \"timeline-item-pending\" : \"\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div className={cls}>\n <div className=\"timeline-item-label\">{item.label}</div>\n <div className=\"timeline-item-head\">\n <div className={`timeline-item-dot ${color} ${isPending ? \"pending\" : \"\"}`}>\n {item.dot ?? (isPending && <Spinner size={14} />)}\n </div>\n {!isLast && <div className=\"timeline-item-tail\" />}\n </div>\n <div className=\"timeline-item-content\">{item.children}</div>\n </div>\n );\n};\n"]}