@fangxinyan/lumina 0.2.1 → 0.4.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 (296) hide show
  1. package/dist/{Accordion-3TQPKNN3.css → Accordion-REMDCQUD.css} +0 -1
  2. package/dist/Accordion.cjs +3 -3
  3. package/dist/Accordion.js +2 -2
  4. package/dist/Alert.cjs +3 -3
  5. package/dist/Alert.js +2 -2
  6. package/dist/AppShell.cjs +5 -5
  7. package/dist/AppShell.js +1 -1
  8. package/dist/AutoComplete-P5KZMZO5.css +54 -0
  9. package/dist/AutoComplete.cjs +15 -0
  10. package/dist/AutoComplete.cjs.map +1 -0
  11. package/dist/AutoComplete.d.cts +51 -0
  12. package/dist/AutoComplete.d.ts +51 -0
  13. package/dist/AutoComplete.js +6 -0
  14. package/dist/AutoComplete.js.map +1 -0
  15. package/dist/Avatar.cjs +2 -2
  16. package/dist/Avatar.js +1 -1
  17. package/dist/Button.cjs +4 -4
  18. package/dist/Button.js +2 -2
  19. package/dist/Calendar.cjs +3 -3
  20. package/dist/Calendar.js +2 -2
  21. package/dist/Card.cjs +3 -3
  22. package/dist/Card.js +1 -1
  23. package/dist/{Cascader-DTRTTXC2.css → Cascader-VSYEKQCG.css} +1 -1
  24. package/dist/Cascader.cjs +3 -3
  25. package/dist/Cascader.js +2 -2
  26. package/dist/Checkbox.cjs +4 -4
  27. package/dist/Checkbox.js +2 -2
  28. package/dist/{ColorPicker-GP7AQYUU.css → ColorPicker-SDDQGHCM.css} +1 -1
  29. package/dist/ColorPicker.cjs +2 -2
  30. package/dist/ColorPicker.js +1 -1
  31. package/dist/CommandPalette-T45DBMPY.css +139 -0
  32. package/dist/CommandPalette.cjs +14 -0
  33. package/dist/CommandPalette.cjs.map +1 -0
  34. package/dist/CommandPalette.d.cts +65 -0
  35. package/dist/CommandPalette.d.ts +65 -0
  36. package/dist/CommandPalette.js +5 -0
  37. package/dist/CommandPalette.js.map +1 -0
  38. package/dist/ContextMenu-FKW6CQW4.css +76 -0
  39. package/dist/ContextMenu.cjs +12 -0
  40. package/dist/ContextMenu.cjs.map +1 -0
  41. package/dist/ContextMenu.d.cts +50 -0
  42. package/dist/ContextMenu.d.ts +50 -0
  43. package/dist/ContextMenu.js +3 -0
  44. package/dist/ContextMenu.js.map +1 -0
  45. package/dist/Divider.cjs +2 -2
  46. package/dist/Divider.js +1 -1
  47. package/dist/Drawer.cjs +3 -3
  48. package/dist/Drawer.js +2 -2
  49. package/dist/Empty.cjs +4 -4
  50. package/dist/Empty.js +1 -1
  51. package/dist/Form-5GRVZNDO.css +67 -0
  52. package/dist/Form.cjs +20 -0
  53. package/dist/Form.cjs.map +1 -0
  54. package/dist/Form.d.cts +85 -0
  55. package/dist/Form.d.ts +85 -0
  56. package/dist/Form.js +3 -0
  57. package/dist/Form.js.map +1 -0
  58. package/dist/Icon.cjs +3 -3
  59. package/dist/Icon.d.cts +1 -1
  60. package/dist/Icon.d.ts +1 -1
  61. package/dist/Icon.js +1 -1
  62. package/dist/{Image-WYWORJT4.css → Image-4MN34O6P.css} +1 -1
  63. package/dist/Image.cjs +4 -4
  64. package/dist/Image.js +2 -2
  65. package/dist/Input.cjs +4 -4
  66. package/dist/Input.js +2 -2
  67. package/dist/InputNumber-VXQIWLQC.css +40 -0
  68. package/dist/InputNumber.cjs +14 -0
  69. package/dist/InputNumber.cjs.map +1 -0
  70. package/dist/InputNumber.d.cts +46 -0
  71. package/dist/InputNumber.d.ts +46 -0
  72. package/dist/InputNumber.js +5 -0
  73. package/dist/InputNumber.js.map +1 -0
  74. package/dist/List.cjs +2 -2
  75. package/dist/List.js +1 -1
  76. package/dist/{Modal-N4YVLEWW.css → Modal-XSDMU4XJ.css} +1 -1
  77. package/dist/Modal.cjs +4 -4
  78. package/dist/Modal.js +3 -3
  79. package/dist/Pagination.cjs +5 -5
  80. package/dist/Pagination.js +4 -4
  81. package/dist/{Popover-MGCMOXYP.css → Popover-NYEKT5CQ.css} +1 -1
  82. package/dist/Popover.cjs +2 -2
  83. package/dist/Popover.js +1 -1
  84. package/dist/Progress.cjs +3 -3
  85. package/dist/Progress.js +1 -1
  86. package/dist/{Select-EDG37C37.css → Select-J3CCVFJ7.css} +1 -1
  87. package/dist/Select.cjs +4 -4
  88. package/dist/Select.js +3 -3
  89. package/dist/Slider.cjs +2 -2
  90. package/dist/Slider.js +1 -1
  91. package/dist/Splitter-DHNOY4NC.css +66 -0
  92. package/dist/Splitter.cjs +12 -0
  93. package/dist/Splitter.cjs.map +1 -0
  94. package/dist/Splitter.d.cts +44 -0
  95. package/dist/Splitter.d.ts +44 -0
  96. package/dist/Splitter.js +3 -0
  97. package/dist/Splitter.js.map +1 -0
  98. package/dist/StatusBar-CDS2GPSI.css +58 -0
  99. package/dist/StatusBar.cjs +16 -0
  100. package/dist/StatusBar.cjs.map +1 -0
  101. package/dist/StatusBar.d.cts +39 -0
  102. package/dist/StatusBar.d.ts +39 -0
  103. package/dist/StatusBar.js +3 -0
  104. package/dist/StatusBar.js.map +1 -0
  105. package/dist/Switch.cjs +2 -2
  106. package/dist/Switch.js +1 -1
  107. package/dist/{Table-YKVM42SW.css → Table-2LPTOUIR.css} +1 -1
  108. package/dist/Table.cjs +8 -8
  109. package/dist/Table.js +6 -6
  110. package/dist/Tabs.cjs +3 -3
  111. package/dist/Tabs.js +1 -1
  112. package/dist/Tag.cjs +4 -4
  113. package/dist/Tag.js +2 -2
  114. package/dist/Theme.cjs +10 -10
  115. package/dist/Theme.js +1 -1
  116. package/dist/{Toast-ERHDN3WG.css → Toast-6PVSAXQ5.css} +1 -1
  117. package/dist/Toast.cjs +4 -4
  118. package/dist/Toast.js +2 -2
  119. package/dist/Tooltip.cjs +2 -2
  120. package/dist/Tooltip.js +1 -1
  121. package/dist/Typography.cjs +7 -7
  122. package/dist/Typography.js +2 -2
  123. package/dist/{chunk-IKI5CS4L.cjs → chunk-2ENTRT7R.cjs} +7 -7
  124. package/dist/{chunk-IKI5CS4L.cjs.map → chunk-2ENTRT7R.cjs.map} +1 -1
  125. package/dist/{chunk-FI7QO3I5.cjs → chunk-33TIL25B.cjs} +3 -3
  126. package/dist/{chunk-FI7QO3I5.cjs.map → chunk-33TIL25B.cjs.map} +1 -1
  127. package/dist/{chunk-5WF6M47X.cjs → chunk-3BZ47QNV.cjs} +8 -8
  128. package/dist/{chunk-5WF6M47X.cjs.map → chunk-3BZ47QNV.cjs.map} +1 -1
  129. package/dist/{chunk-NE4YEBFH.js → chunk-3UU2PUK4.js} +4 -4
  130. package/dist/{chunk-NE4YEBFH.js.map → chunk-3UU2PUK4.js.map} +1 -1
  131. package/dist/chunk-47Z4NIU4.js +118 -0
  132. package/dist/chunk-47Z4NIU4.js.map +1 -0
  133. package/dist/{chunk-4U4OY5RA.js → chunk-4SCDDSXY.js} +3 -3
  134. package/dist/{chunk-4U4OY5RA.js.map → chunk-4SCDDSXY.js.map} +1 -1
  135. package/dist/{chunk-NXOAYNG2.cjs → chunk-5BFETKVP.cjs} +3 -3
  136. package/dist/{chunk-NXOAYNG2.cjs.map → chunk-5BFETKVP.cjs.map} +1 -1
  137. package/dist/{chunk-VICGQC6G.cjs → chunk-5EAVXFFD.cjs} +3 -3
  138. package/dist/{chunk-VICGQC6G.cjs.map → chunk-5EAVXFFD.cjs.map} +1 -1
  139. package/dist/{chunk-OYGFMXAA.js → chunk-5N7347MI.js} +3 -3
  140. package/dist/{chunk-OYGFMXAA.js.map → chunk-5N7347MI.js.map} +1 -1
  141. package/dist/{chunk-VJN637MT.js → chunk-5PREWYTB.js} +3 -3
  142. package/dist/{chunk-VJN637MT.js.map → chunk-5PREWYTB.js.map} +1 -1
  143. package/dist/{chunk-BBPNQ44M.js → chunk-6GNFRP2H.js} +3 -3
  144. package/dist/{chunk-BBPNQ44M.js.map → chunk-6GNFRP2H.js.map} +1 -1
  145. package/dist/{chunk-ZVCMXDTP.js → chunk-6XZ362VL.js} +6 -6
  146. package/dist/{chunk-ZVCMXDTP.js.map → chunk-6XZ362VL.js.map} +1 -1
  147. package/dist/chunk-6Z24VO3K.js +184 -0
  148. package/dist/chunk-6Z24VO3K.js.map +1 -0
  149. package/dist/{chunk-K7PVJLW4.cjs → chunk-77TZHI76.cjs} +8 -8
  150. package/dist/{chunk-K7PVJLW4.cjs.map → chunk-77TZHI76.cjs.map} +1 -1
  151. package/dist/{chunk-QPZZNSRB.js → chunk-7M7NAMR5.js} +5 -5
  152. package/dist/{chunk-QPZZNSRB.js.map → chunk-7M7NAMR5.js.map} +1 -1
  153. package/dist/chunk-7T2SLRNL.cjs +140 -0
  154. package/dist/chunk-7T2SLRNL.cjs.map +1 -0
  155. package/dist/chunk-7YQWG7HR.cjs +45 -0
  156. package/dist/chunk-7YQWG7HR.cjs.map +1 -0
  157. package/dist/{chunk-TYQ5CN2C.js → chunk-AESLEYST.js} +5 -5
  158. package/dist/{chunk-TYQ5CN2C.js.map → chunk-AESLEYST.js.map} +1 -1
  159. package/dist/{chunk-PBBHUUXU.cjs → chunk-B5JH7NRZ.cjs} +3 -3
  160. package/dist/{chunk-PBBHUUXU.cjs.map → chunk-B5JH7NRZ.cjs.map} +1 -1
  161. package/dist/chunk-BCPAY65C.cjs +169 -0
  162. package/dist/chunk-BCPAY65C.cjs.map +1 -0
  163. package/dist/{chunk-E6R63QOL.js → chunk-CTYW42GG.js} +7 -7
  164. package/dist/{chunk-E6R63QOL.js.map → chunk-CTYW42GG.js.map} +1 -1
  165. package/dist/chunk-E62JFAHW.js +147 -0
  166. package/dist/chunk-E62JFAHW.js.map +1 -0
  167. package/dist/{chunk-WNGG25QX.js → chunk-FFZLSY2N.js} +3 -3
  168. package/dist/{chunk-WNGG25QX.js.map → chunk-FFZLSY2N.js.map} +1 -1
  169. package/dist/{chunk-IWVKITPN.js → chunk-FXQGPHK2.js} +4 -4
  170. package/dist/{chunk-IWVKITPN.js.map → chunk-FXQGPHK2.js.map} +1 -1
  171. package/dist/{chunk-Z7P6QGMT.js → chunk-GR5STMOA.js} +3 -3
  172. package/dist/{chunk-Z7P6QGMT.js.map → chunk-GR5STMOA.js.map} +1 -1
  173. package/dist/{chunk-RDLPX7RK.cjs → chunk-HJIKU6MF.cjs} +33 -7
  174. package/dist/chunk-HJIKU6MF.cjs.map +1 -0
  175. package/dist/{chunk-QESLHLTG.cjs → chunk-HXSAH4Y6.cjs} +9 -9
  176. package/dist/{chunk-QESLHLTG.cjs.map → chunk-HXSAH4Y6.cjs.map} +1 -1
  177. package/dist/{chunk-RPD2OIIP.js → chunk-I2HHC6QW.js} +4 -4
  178. package/dist/{chunk-RPD2OIIP.js.map → chunk-I2HHC6QW.js.map} +1 -1
  179. package/dist/{chunk-GZGZR4FT.js → chunk-I7WLFADD.js} +4 -4
  180. package/dist/{chunk-GZGZR4FT.js.map → chunk-I7WLFADD.js.map} +1 -1
  181. package/dist/chunk-IHACXMOI.js +307 -0
  182. package/dist/chunk-IHACXMOI.js.map +1 -0
  183. package/dist/chunk-IJA26LRY.cjs +209 -0
  184. package/dist/chunk-IJA26LRY.cjs.map +1 -0
  185. package/dist/chunk-IOWREUEP.js +170 -0
  186. package/dist/chunk-IOWREUEP.js.map +1 -0
  187. package/dist/{chunk-AXMEZGEG.cjs → chunk-IZDJCEMF.cjs} +3 -3
  188. package/dist/{chunk-AXMEZGEG.cjs.map → chunk-IZDJCEMF.cjs.map} +1 -1
  189. package/dist/{chunk-V34OPWKZ.js → chunk-JSDQVVQB.js} +3 -3
  190. package/dist/{chunk-V34OPWKZ.js.map → chunk-JSDQVVQB.js.map} +1 -1
  191. package/dist/{chunk-77BVQNAQ.js → chunk-JXHMJUVI.js} +4 -4
  192. package/dist/{chunk-77BVQNAQ.js.map → chunk-JXHMJUVI.js.map} +1 -1
  193. package/dist/{chunk-GIVMKGZN.js → chunk-KW7Z4IQC.js} +4 -4
  194. package/dist/{chunk-GIVMKGZN.js.map → chunk-KW7Z4IQC.js.map} +1 -1
  195. package/dist/{chunk-QTGDYQOT.cjs → chunk-LLNEDEST.cjs} +4 -4
  196. package/dist/{chunk-QTGDYQOT.cjs.map → chunk-LLNEDEST.cjs.map} +1 -1
  197. package/dist/{chunk-AJZKESHB.js → chunk-LXNR6TQK.js} +4 -4
  198. package/dist/{chunk-AJZKESHB.js.map → chunk-LXNR6TQK.js.map} +1 -1
  199. package/dist/{chunk-SBMOIE5C.cjs → chunk-MDQNUKCP.cjs} +14 -14
  200. package/dist/{chunk-SBMOIE5C.cjs.map → chunk-MDQNUKCP.cjs.map} +1 -1
  201. package/dist/{chunk-JKLQOB2F.cjs → chunk-MUFMJPRT.cjs} +3 -3
  202. package/dist/{chunk-JKLQOB2F.cjs.map → chunk-MUFMJPRT.cjs.map} +1 -1
  203. package/dist/{chunk-AEJJGUEN.cjs → chunk-N73JGXYZ.cjs} +5 -5
  204. package/dist/{chunk-AEJJGUEN.cjs.map → chunk-N73JGXYZ.cjs.map} +1 -1
  205. package/dist/{chunk-C5TGQ7CV.cjs → chunk-NN7WMXY4.cjs} +5 -5
  206. package/dist/{chunk-C5TGQ7CV.cjs.map → chunk-NN7WMXY4.cjs.map} +1 -1
  207. package/dist/{chunk-7H453VPW.cjs → chunk-NQQWCIE6.cjs} +3 -3
  208. package/dist/{chunk-7H453VPW.cjs.map → chunk-NQQWCIE6.cjs.map} +1 -1
  209. package/dist/{chunk-ZWP4LSS3.js → chunk-NS3C2ZSE.js} +3 -3
  210. package/dist/{chunk-ZWP4LSS3.js.map → chunk-NS3C2ZSE.js.map} +1 -1
  211. package/dist/{chunk-HKAQILD2.cjs → chunk-O2HMH5BI.cjs} +4 -4
  212. package/dist/{chunk-HKAQILD2.cjs.map → chunk-O2HMH5BI.cjs.map} +1 -1
  213. package/dist/{chunk-4MR4GVTD.js → chunk-O7C6S644.js} +32 -6
  214. package/dist/chunk-O7C6S644.js.map +1 -0
  215. package/dist/{chunk-K5MHL732.js → chunk-OM76QWUN.js} +5 -5
  216. package/dist/{chunk-K5MHL732.js.map → chunk-OM76QWUN.js.map} +1 -1
  217. package/dist/chunk-OWNVDXRQ.js +42 -0
  218. package/dist/chunk-OWNVDXRQ.js.map +1 -0
  219. package/dist/{chunk-3UFU63X7.cjs → chunk-OZVPJWXO.cjs} +3 -3
  220. package/dist/{chunk-3UFU63X7.cjs.map → chunk-OZVPJWXO.cjs.map} +1 -1
  221. package/dist/{chunk-M6CGYGEO.js → chunk-PKXXR76Q.js} +4 -4
  222. package/dist/{chunk-M6CGYGEO.js.map → chunk-PKXXR76Q.js.map} +1 -1
  223. package/dist/{chunk-7U6I44RV.cjs → chunk-Q7CDWNM6.cjs} +3 -3
  224. package/dist/{chunk-7U6I44RV.cjs.map → chunk-Q7CDWNM6.cjs.map} +1 -1
  225. package/dist/{chunk-437LB2V4.js → chunk-QJGKI2BD.js} +3 -3
  226. package/dist/{chunk-437LB2V4.js.map → chunk-QJGKI2BD.js.map} +1 -1
  227. package/dist/{chunk-GEYMWUW6.js → chunk-QOGROEVD.js} +23 -5
  228. package/dist/chunk-QOGROEVD.js.map +1 -0
  229. package/dist/chunk-QVFEKGKI.cjs +331 -0
  230. package/dist/chunk-QVFEKGKI.cjs.map +1 -0
  231. package/dist/chunk-RFU5HN4E.js +149 -0
  232. package/dist/chunk-RFU5HN4E.js.map +1 -0
  233. package/dist/{chunk-URF6RBW6.cjs → chunk-RQV7SMIZ.cjs} +6 -6
  234. package/dist/{chunk-URF6RBW6.cjs.map → chunk-RQV7SMIZ.cjs.map} +1 -1
  235. package/dist/{chunk-OPTTHURA.cjs → chunk-RWHWEQQX.cjs} +7 -7
  236. package/dist/{chunk-OPTTHURA.cjs.map → chunk-RWHWEQQX.cjs.map} +1 -1
  237. package/dist/{chunk-CCBHZYE6.cjs → chunk-SMHXSEBD.cjs} +9 -9
  238. package/dist/{chunk-CCBHZYE6.cjs.map → chunk-SMHXSEBD.cjs.map} +1 -1
  239. package/dist/{chunk-EPFYIR63.cjs → chunk-T4PI2ZX7.cjs} +16 -16
  240. package/dist/{chunk-EPFYIR63.cjs.map → chunk-T4PI2ZX7.cjs.map} +1 -1
  241. package/dist/{chunk-YEOARJKR.cjs → chunk-TQLCIXCK.cjs} +3 -3
  242. package/dist/{chunk-YEOARJKR.cjs.map → chunk-TQLCIXCK.cjs.map} +1 -1
  243. package/dist/{chunk-LSLYY5FN.js → chunk-TZLM5GF4.js} +6 -6
  244. package/dist/{chunk-LSLYY5FN.js.map → chunk-TZLM5GF4.js.map} +1 -1
  245. package/dist/{chunk-Z5X5AMLA.cjs → chunk-TZXEZFCI.cjs} +6 -6
  246. package/dist/{chunk-Z5X5AMLA.cjs.map → chunk-TZXEZFCI.cjs.map} +1 -1
  247. package/dist/{chunk-3WAFIUDQ.js → chunk-UQB5OHMO.js} +3 -3
  248. package/dist/{chunk-3WAFIUDQ.js.map → chunk-UQB5OHMO.js.map} +1 -1
  249. package/dist/chunk-VQBZKRIB.cjs +192 -0
  250. package/dist/chunk-VQBZKRIB.cjs.map +1 -0
  251. package/dist/{chunk-I7SSCSFH.js → chunk-W6I67HQQ.js} +3 -3
  252. package/dist/{chunk-I7SSCSFH.js.map → chunk-W6I67HQQ.js.map} +1 -1
  253. package/dist/{chunk-4GT5TOHP.js → chunk-WDBJVKSR.js} +3 -3
  254. package/dist/{chunk-4GT5TOHP.js.map → chunk-WDBJVKSR.js.map} +1 -1
  255. package/dist/{chunk-NSUD5B22.js → chunk-WUOFJPZ4.js} +4 -4
  256. package/dist/{chunk-NSUD5B22.js.map → chunk-WUOFJPZ4.js.map} +1 -1
  257. package/dist/{chunk-TWBJCFEJ.cjs → chunk-WVBFQB26.cjs} +8 -8
  258. package/dist/{chunk-TWBJCFEJ.cjs.map → chunk-WVBFQB26.cjs.map} +1 -1
  259. package/dist/chunk-WZ73TWB2.cjs +174 -0
  260. package/dist/chunk-WZ73TWB2.cjs.map +1 -0
  261. package/dist/{chunk-H6FCIJOP.js → chunk-XCYE4OQV.js} +4 -4
  262. package/dist/{chunk-H6FCIJOP.js.map → chunk-XCYE4OQV.js.map} +1 -1
  263. package/dist/{chunk-F7HW2PYR.cjs → chunk-XUT2Z2L6.cjs} +3 -3
  264. package/dist/{chunk-F7HW2PYR.cjs.map → chunk-XUT2Z2L6.cjs.map} +1 -1
  265. package/dist/{chunk-TZSWDH5T.cjs → chunk-XYVJ3FBQ.cjs} +6 -6
  266. package/dist/{chunk-TZSWDH5T.cjs.map → chunk-XYVJ3FBQ.cjs.map} +1 -1
  267. package/dist/{chunk-YVO7XO4W.cjs → chunk-YCHUHMNP.cjs} +22 -4
  268. package/dist/chunk-YCHUHMNP.cjs.map +1 -0
  269. package/dist/{chunk-LDENBYRC.cjs → chunk-YFBHVTKN.cjs} +8 -8
  270. package/dist/{chunk-LDENBYRC.cjs.map → chunk-YFBHVTKN.cjs.map} +1 -1
  271. package/dist/{chunk-IDM6JJLP.cjs → chunk-YZ2I7CDF.cjs} +3 -3
  272. package/dist/{chunk-IDM6JJLP.cjs.map → chunk-YZ2I7CDF.cjs.map} +1 -1
  273. package/dist/{chunk-OEHCA5IV.js → chunk-ZFJHUOFU.js} +5 -5
  274. package/dist/{chunk-OEHCA5IV.js.map → chunk-ZFJHUOFU.js.map} +1 -1
  275. package/dist/index.cjs +168 -121
  276. package/dist/index.cjs.map +1 -1
  277. package/dist/index.d.cts +8 -1
  278. package/dist/index.d.ts +8 -1
  279. package/dist/index.js +39 -32
  280. package/dist/index.js.map +1 -1
  281. package/dist/styles.css +25 -18
  282. package/dist/{tokens-HWQ7KWPG.css → tokens-BIIUTPKN.css} +17 -9
  283. package/dist/tokens.css +17 -9
  284. package/docs/llms/autocomplete.md +56 -0
  285. package/docs/llms/commandpalette.md +58 -0
  286. package/docs/llms/contextmenu.md +55 -0
  287. package/docs/llms/form.md +121 -0
  288. package/docs/llms/inputnumber.md +57 -0
  289. package/docs/llms/splitter.md +63 -0
  290. package/docs/llms/statusbar.md +53 -0
  291. package/docs/llms.md +8 -1
  292. package/package.json +1 -1
  293. package/dist/chunk-4MR4GVTD.js.map +0 -1
  294. package/dist/chunk-GEYMWUW6.js.map +0 -1
  295. package/dist/chunk-RDLPX7RK.cjs.map +0 -1
  296. package/dist/chunk-YVO7XO4W.cjs.map +0 -1
@@ -0,0 +1,307 @@
1
+ import './tokens-BIIUTPKN.css';
2
+ import './shared-NJHRNLRH.css';
3
+ import './Form-5GRVZNDO.css';
4
+ import * as React from 'react';
5
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
6
+
7
+ // src/components/Form/Form.tsx
8
+ function makeStore() {
9
+ return {
10
+ values: {},
11
+ errors: {},
12
+ touched: /* @__PURE__ */ new Set(),
13
+ initial: {},
14
+ fields: /* @__PURE__ */ new Map(),
15
+ fieldSubs: /* @__PURE__ */ new Map(),
16
+ formSubs: /* @__PURE__ */ new Set()
17
+ };
18
+ }
19
+ var EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
20
+ var URL_RE = /^https?:\/\/.+/i;
21
+ async function validateSingle(rule, value) {
22
+ const msg = rule.message;
23
+ const isEmpty = value == null || value === "" || Array.isArray(value) && value.length === 0;
24
+ if (rule.required && isEmpty) return msg ?? "\u5FC5\u586B\u9879";
25
+ if (rule.whitespace && typeof value === "string" && value.trim() === "") return msg ?? "\u4E0D\u80FD\u4E3A\u7A7A";
26
+ if (isEmpty) return null;
27
+ if (rule.type === "email" && typeof value === "string" && !EMAIL_RE.test(value)) return msg ?? "\u90AE\u7BB1\u683C\u5F0F\u4E0D\u6B63\u786E";
28
+ if (rule.type === "url" && typeof value === "string" && !URL_RE.test(value)) return msg ?? "\u94FE\u63A5\u683C\u5F0F\u4E0D\u6B63\u786E";
29
+ if (rule.type === "number" && typeof value !== "number" && isNaN(Number(value))) return msg ?? "\u5FC5\u987B\u662F\u6570\u5B57";
30
+ if (rule.type === "array" && !Array.isArray(value)) return msg ?? "\u5FC5\u987B\u662F\u6570\u7EC4";
31
+ if (rule.pattern && typeof value === "string" && !rule.pattern.test(value)) return msg ?? "\u683C\u5F0F\u4E0D\u6B63\u786E";
32
+ const strLen = typeof value === "string" ? value.length : Array.isArray(value) ? value.length : void 0;
33
+ if (rule.len != null && strLen != null && strLen !== rule.len) return msg ?? `\u957F\u5EA6\u5FC5\u987B\u662F ${rule.len}`;
34
+ if (rule.min != null && strLen != null && strLen < rule.min) return msg ?? `\u81F3\u5C11 ${rule.min} \u4E2A\u5B57\u7B26`;
35
+ if (rule.max != null && strLen != null && strLen > rule.max) return msg ?? `\u6700\u591A ${rule.max} \u4E2A\u5B57\u7B26`;
36
+ if (rule.min != null && typeof value === "number" && value < rule.min) return msg ?? `\u4E0D\u80FD\u5C0F\u4E8E ${rule.min}`;
37
+ if (rule.max != null && typeof value === "number" && value > rule.max) return msg ?? `\u4E0D\u80FD\u5927\u4E8E ${rule.max}`;
38
+ if (rule.validator) {
39
+ try {
40
+ await rule.validator(rule, value);
41
+ } catch (err) {
42
+ if (typeof err === "string") return err;
43
+ if (err instanceof Error) return err.message;
44
+ return msg ?? "\u6821\u9A8C\u672A\u901A\u8FC7";
45
+ }
46
+ }
47
+ return null;
48
+ }
49
+ async function validateField(store, name) {
50
+ const entry = store.fields.get(name);
51
+ if (!entry) return [];
52
+ const value = store.values[name];
53
+ const errs = [];
54
+ for (const rule of entry.rules) {
55
+ const err = await validateSingle(rule, value);
56
+ if (err) errs.push(err);
57
+ }
58
+ store.errors[name] = errs;
59
+ return errs;
60
+ }
61
+ function notifyField(store, name) {
62
+ store.fieldSubs.get(name)?.forEach((fn) => fn());
63
+ }
64
+ function notifyAll(store) {
65
+ store.formSubs.forEach((fn) => fn());
66
+ }
67
+ function buildInstance(store) {
68
+ return {
69
+ getFieldValue: (name) => store.values[name],
70
+ getFieldsValue: (names) => {
71
+ if (!names) return { ...store.values };
72
+ const out = {};
73
+ for (const n of names) out[n] = store.values[n];
74
+ return out;
75
+ },
76
+ setFieldValue: (name, value) => {
77
+ const prev = store.values[name];
78
+ store.values[name] = value;
79
+ store.touched.add(name);
80
+ if (store.fields.has(name)) {
81
+ void validateField(store, name).then(() => notifyField(store, name));
82
+ }
83
+ notifyField(store, name);
84
+ notifyAll(store);
85
+ if (prev !== value) store.onValuesChange?.({ [name]: value }, { ...store.values });
86
+ },
87
+ setFieldsValue: (values) => {
88
+ const changed = {};
89
+ for (const [k, v] of Object.entries(values)) {
90
+ if (store.values[k] !== v) changed[k] = v;
91
+ store.values[k] = v;
92
+ store.touched.add(k);
93
+ notifyField(store, k);
94
+ }
95
+ notifyAll(store);
96
+ if (Object.keys(changed).length > 0) store.onValuesChange?.(changed, { ...store.values });
97
+ },
98
+ resetFields: (names) => {
99
+ const keys = names ?? Array.from(store.fields.keys());
100
+ for (const k of keys) {
101
+ store.values[k] = store.initial[k];
102
+ store.errors[k] = [];
103
+ store.touched.delete(k);
104
+ notifyField(store, k);
105
+ }
106
+ notifyAll(store);
107
+ },
108
+ validateFields: async (names) => {
109
+ const keys = names ?? Array.from(store.fields.keys());
110
+ const errorFields = [];
111
+ for (const k of keys) {
112
+ const errs = await validateField(store, k);
113
+ notifyField(store, k);
114
+ if (errs.length > 0) errorFields.push({ name: k, errors: errs });
115
+ }
116
+ notifyAll(store);
117
+ if (errorFields.length > 0) {
118
+ const err = new Error("Validation failed");
119
+ err.errorFields = errorFields;
120
+ err.values = { ...store.values };
121
+ throw err;
122
+ }
123
+ const out = {};
124
+ for (const k of keys) out[k] = store.values[k];
125
+ return out;
126
+ },
127
+ isFieldTouched: (name) => store.touched.has(name),
128
+ getFieldError: (name) => store.errors[name] ?? [],
129
+ submit: () => store.onSubmit?.()
130
+ };
131
+ }
132
+ var STORE_SYMBOL = /* @__PURE__ */ Symbol.for("lumina.form.store");
133
+ function useForm() {
134
+ const ref = React.useRef();
135
+ if (!ref.current) {
136
+ const store = makeStore();
137
+ const instance = buildInstance(store);
138
+ instance[STORE_SYMBOL] = store;
139
+ ref.current = instance;
140
+ }
141
+ return [ref.current];
142
+ }
143
+ function getStore(instance) {
144
+ return instance[STORE_SYMBOL];
145
+ }
146
+ var FormCtx = React.createContext(null);
147
+ var FormRoot = (props) => {
148
+ const {
149
+ form: externalForm,
150
+ layout = "horizontal",
151
+ initialValues,
152
+ onFinish,
153
+ onFinishFailed,
154
+ onValuesChange,
155
+ requiredMark = true,
156
+ disabled = false,
157
+ children,
158
+ className = "",
159
+ ...rest
160
+ } = props;
161
+ const [internalForm] = useForm();
162
+ const form = externalForm ?? internalForm;
163
+ const store = getStore(form);
164
+ const initRef = React.useRef(false);
165
+ if (!initRef.current) {
166
+ if (initialValues) {
167
+ for (const [k, v] of Object.entries(initialValues)) {
168
+ store.initial[k] = v;
169
+ if (store.values[k] === void 0) store.values[k] = v;
170
+ }
171
+ }
172
+ initRef.current = true;
173
+ }
174
+ store.onValuesChange = onValuesChange ? (changed, all) => onValuesChange(changed, all) : void 0;
175
+ const doSubmit = React.useCallback(() => {
176
+ form.validateFields().then((values) => onFinish?.(values)).catch((err) => {
177
+ if (err?.errorFields) {
178
+ onFinishFailed?.({
179
+ values: err.values ?? {},
180
+ errorFields: err.errorFields
181
+ });
182
+ }
183
+ });
184
+ }, [form, onFinish, onFinishFailed]);
185
+ store.onSubmit = doSubmit;
186
+ const ctxValue = React.useMemo(
187
+ () => ({ store, layout, requiredMark, disabled }),
188
+ [store, layout, requiredMark, disabled]
189
+ );
190
+ return /* @__PURE__ */ jsx(FormCtx.Provider, { value: ctxValue, children: /* @__PURE__ */ jsx(
191
+ "form",
192
+ {
193
+ className: `lumina-form layout-${layout} ${className}`,
194
+ onSubmit: (e) => {
195
+ e.preventDefault();
196
+ doSubmit();
197
+ },
198
+ ...rest,
199
+ children
200
+ }
201
+ ) });
202
+ };
203
+ var extractValue = (valuePropName, args) => {
204
+ const first = args[0];
205
+ if (first && typeof first === "object") {
206
+ const anyFirst = first;
207
+ if (anyFirst.target && "value" in anyFirst.target) {
208
+ return valuePropName === "checked" ? anyFirst.target.checked : anyFirst.target.value;
209
+ }
210
+ }
211
+ return first;
212
+ };
213
+ var FormItem = ({
214
+ name,
215
+ label,
216
+ rules,
217
+ noStyle,
218
+ valuePropName = "value",
219
+ trigger = "onChange",
220
+ initialValue,
221
+ help,
222
+ extra,
223
+ required,
224
+ hidden,
225
+ children,
226
+ className = "",
227
+ style
228
+ }) => {
229
+ const ctx = React.useContext(FormCtx);
230
+ const [, tick] = React.useReducer((n) => n + 1, 0);
231
+ React.useEffect(() => {
232
+ if (!ctx || !name) return;
233
+ const store2 = ctx.store;
234
+ if (initialValue !== void 0) {
235
+ if (store2.initial[name] === void 0) store2.initial[name] = initialValue;
236
+ if (store2.values[name] === void 0) store2.values[name] = initialValue;
237
+ }
238
+ store2.fields.set(name, { rules: rules ?? [], initial: initialValue });
239
+ let subs = store2.fieldSubs.get(name);
240
+ if (!subs) {
241
+ subs = /* @__PURE__ */ new Set();
242
+ store2.fieldSubs.set(name, subs);
243
+ }
244
+ subs.add(tick);
245
+ return () => {
246
+ subs.delete(tick);
247
+ store2.fields.delete(name);
248
+ };
249
+ }, [ctx, name]);
250
+ React.useEffect(() => {
251
+ if (!ctx || !name) return;
252
+ const entry = ctx.store.fields.get(name);
253
+ if (entry) entry.rules = rules ?? [];
254
+ }, [ctx, name, rules]);
255
+ if (hidden) return null;
256
+ const hasName = !!name;
257
+ const isRequired = required === true || (rules?.some((r) => r.required) ?? false);
258
+ if (!hasName) {
259
+ const content = children;
260
+ if (noStyle) return /* @__PURE__ */ jsx(Fragment, { children: content });
261
+ return /* @__PURE__ */ jsxs("div", { className: `form-item ${className}`, style, children: [
262
+ label && /* @__PURE__ */ jsx("div", { className: "form-item-label", children: label }),
263
+ /* @__PURE__ */ jsx("div", { className: "form-item-control", children: content }),
264
+ help && /* @__PURE__ */ jsx("div", { className: "form-item-help", children: help }),
265
+ extra && /* @__PURE__ */ jsx("div", { className: "form-item-extra", children: extra })
266
+ ] });
267
+ }
268
+ const store = ctx?.store;
269
+ const value = store?.values[name];
270
+ const errors = store?.errors[name] ?? [];
271
+ const hasError = errors.length > 0;
272
+ const bound = React.isValidElement(children) ? React.cloneElement(children, {
273
+ [valuePropName]: value ?? (valuePropName === "checked" ? false : ""),
274
+ [trigger]: (...args) => {
275
+ const next = extractValue(valuePropName, args);
276
+ store?.values && (store.values[name] = next);
277
+ store?.touched.add(name);
278
+ if (store) {
279
+ void validateField(store, name).then(() => notifyField(store, name));
280
+ notifyField(store, name);
281
+ notifyAll(store);
282
+ store.onValuesChange?.({ [name]: next }, { ...store.values });
283
+ }
284
+ const childTrigger = children.props?.[trigger];
285
+ if (typeof childTrigger === "function") childTrigger(...args);
286
+ },
287
+ disabled: children.props?.disabled ?? ctx?.disabled,
288
+ ...hasError ? { invalid: true } : {}
289
+ }) : children;
290
+ if (noStyle) return /* @__PURE__ */ jsx(Fragment, { children: bound });
291
+ return /* @__PURE__ */ jsxs("div", { className: `form-item ${hasError ? "has-error" : ""} ${className}`, style, children: [
292
+ label && /* @__PURE__ */ jsxs("div", { className: "form-item-label", children: [
293
+ isRequired && ctx?.requiredMark !== false && /* @__PURE__ */ jsx("span", { className: "form-item-required", "aria-hidden": true, children: "*" }),
294
+ label
295
+ ] }),
296
+ /* @__PURE__ */ jsx("div", { className: "form-item-control", children: bound }),
297
+ hasError ? /* @__PURE__ */ jsx("div", { className: "form-item-error", children: errors[0] }) : help ? /* @__PURE__ */ jsx("div", { className: "form-item-help", children: help }) : null,
298
+ extra && /* @__PURE__ */ jsx("div", { className: "form-item-extra", children: extra })
299
+ ] });
300
+ };
301
+ var Form = FormRoot;
302
+ Form.Item = FormItem;
303
+ Form.useForm = useForm;
304
+
305
+ export { Form, FormItem, useForm };
306
+ //# sourceMappingURL=chunk-IHACXMOI.js.map
307
+ //# sourceMappingURL=chunk-IHACXMOI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Form/Form.tsx"],"names":["store"],"mappings":";;;;;;;AAsEA,SAAS,SAAA,GAA2B;AAClC,EAAA,OAAO;AAAA,IACL,QAAQ,EAAC;AAAA,IACT,QAAQ,EAAC;AAAA,IACT,OAAA,sBAAa,GAAA,EAAI;AAAA,IACjB,SAAS,EAAC;AAAA,IACV,MAAA,sBAAY,GAAA,EAAI;AAAA,IAChB,SAAA,sBAAe,GAAA,EAAI;AAAA,IACnB,QAAA,sBAAc,GAAA;AAAI,GACpB;AACF;AAEA,IAAM,QAAA,GAAW,4BAAA;AACjB,IAAM,MAAA,GAAS,iBAAA;AAEf,eAAe,cAAA,CAAe,MAAY,KAAA,EAAwC;AAChF,EAAA,MAAM,MAAM,IAAA,CAAK,OAAA;AACjB,EAAA,MAAM,OAAA,GAAU,KAAA,IAAS,IAAA,IAAQ,KAAA,KAAU,EAAA,IAAO,MAAM,OAAA,CAAQ,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA,KAAW,CAAA;AAE3F,EAAA,IAAI,IAAA,CAAK,QAAA,IAAY,OAAA,EAAS,OAAO,GAAA,IAAO,oBAAA;AAC5C,EAAA,IAAI,IAAA,CAAK,UAAA,IAAc,OAAO,KAAA,KAAU,QAAA,IAAY,MAAM,IAAA,EAAK,KAAM,EAAA,EAAI,OAAO,GAAA,IAAO,0BAAA;AAGvF,EAAA,IAAI,SAAS,OAAO,IAAA;AAEpB,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,OAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,GAAA,IAAO,4CAAA;AAC/F,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,GAAA,IAAO,4CAAA;AAC3F,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,OAAO,GAAA,IAAO,gCAAA;AAC/F,EAAA,IAAI,IAAA,CAAK,SAAS,OAAA,IAAW,CAAC,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,GAAA,IAAO,gCAAA;AAElE,EAAA,IAAI,IAAA,CAAK,OAAA,IAAW,OAAO,KAAA,KAAU,QAAA,IAAY,CAAC,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,GAAA,IAAO,gCAAA;AAE1F,EAAA,MAAM,MAAA,GAAS,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,MAAA;AAChG,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,IAAQ,MAAA,IAAU,IAAA,IAAQ,MAAA,KAAW,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,IAAO,CAAA,+BAAA,EAAS,IAAA,CAAK,GAAG,CAAA,CAAA;AAC9F,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,IAAQ,MAAA,IAAU,IAAA,IAAQ,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,IAAO,CAAA,aAAA,EAAM,IAAA,CAAK,GAAG,CAAA,mBAAA,CAAA;AACzF,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,IAAQ,MAAA,IAAU,IAAA,IAAQ,MAAA,GAAS,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,IAAO,CAAA,aAAA,EAAM,IAAA,CAAK,GAAG,CAAA,mBAAA,CAAA;AACzF,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,IAAO,CAAA,yBAAA,EAAQ,KAAK,GAAG,CAAA,CAAA;AACrG,EAAA,IAAI,IAAA,CAAK,GAAA,IAAO,IAAA,IAAQ,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,GAAA,IAAO,CAAA,yBAAA,EAAQ,KAAK,GAAG,CAAA,CAAA;AAErG,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAAA,IAClC,SAAS,GAAA,EAAK;AACZ,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,GAAA;AACpC,MAAA,IAAI,GAAA,YAAe,KAAA,EAAO,OAAO,GAAA,CAAI,OAAA;AACrC,MAAA,OAAO,GAAA,IAAO,gCAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,eAAe,aAAA,CAAc,OAAsB,IAAA,EAAiC;AAClF,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAiB,EAAC;AACxB,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,KAAA,EAAO;AAC9B,IAAA,MAAM,GAAA,GAAM,MAAM,cAAA,CAAe,IAAA,EAAM,KAAK,CAAA;AAC5C,IAAA,IAAI,GAAA,EAAK,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAAA,EACxB;AACA,EAAA,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA;AACrB,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,OAAsB,IAAA,EAAc;AACvD,EAAA,KAAA,CAAM,SAAA,CAAU,IAAI,IAAI,CAAA,EAAG,QAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AACjD;AACA,SAAS,UAAU,KAAA,EAAsB;AACvC,EAAA,KAAA,CAAM,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,KAAO,IAAI,CAAA;AACrC;AAEA,SAAS,cAAiD,KAAA,EAAuC;AAC/F,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,CAAK,IAAA,KAAiB,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,IACtD,cAAA,EAAgB,CAAC,KAAA,KAAU;AACzB,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAE,GAAG,MAAM,MAAA,EAAO;AACrC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,KAAK,KAAA,EAAO,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAC9C,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,IAAA,EAAM,KAAA,KAAU;AAC9B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AAC9B,MAAA,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA,GAAI,KAAA;AACrB,MAAA,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AACtB,MAAA,IAAI,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,QAAA,KAAK,aAAA,CAAc,OAAO,IAAI,CAAA,CAAE,KAAK,MAAM,WAAA,CAAY,KAAA,EAAO,IAAI,CAAC,CAAA;AAAA,MACrE;AACA,MAAA,WAAA,CAAY,OAAO,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,IAAI,IAAA,KAAS,KAAA,EAAO,KAAA,CAAM,cAAA,GAAiB,EAAE,CAAC,IAAI,GAAG,KAAA,EAAM,EAAG,EAAE,GAAG,KAAA,CAAM,QAAQ,CAAA;AAAA,IACnF,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,MAAA,KAAW;AAC1B,MAAA,MAAM,UAAmC,EAAC;AAC1C,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3C,QAAA,IAAI,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AACxC,QAAA,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAClB,QAAA,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAC,CAAA;AACnB,QAAA,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,MACtB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,cAAA,GAAiB,OAAA,EAAS,EAAE,GAAG,KAAA,CAAM,QAAQ,CAAA;AAAA,IAC1F,CAAA;AAAA,IACA,WAAA,EAAa,CAAC,KAAA,KAAU;AACtB,MAAA,MAAM,OAAO,KAAA,IAAS,KAAA,CAAM,KAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACpD,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAC,CAAA;AACjC,QAAA,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,GAAI,EAAC;AACnB,QAAA,KAAA,CAAM,OAAA,CAAQ,OAAO,CAAC,CAAA;AACtB,QAAA,WAAA,CAAY,OAAO,CAAC,CAAA;AAAA,MACtB;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,cAAA,EAAgB,OAAO,KAAA,KAAU;AAC/B,MAAA,MAAM,OAAO,KAAA,IAAS,KAAA,CAAM,KAAK,KAAA,CAAM,MAAA,CAAO,MAAM,CAAA;AACpD,MAAA,MAAM,cAA4B,EAAC;AACnC,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM;AACpB,QAAA,MAAM,IAAA,GAAO,MAAM,aAAA,CAAc,KAAA,EAAO,CAAC,CAAA;AACzC,QAAA,WAAA,CAAY,OAAO,CAAC,CAAA;AACpB,QAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG,WAAA,CAAY,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAG,MAAA,EAAQ,IAAA,EAAM,CAAA;AAAA,MACjE;AACA,MAAA,SAAA,CAAU,KAAK,CAAA;AACf,MAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,QAAA,MAAM,GAAA,GAAM,IAAI,KAAA,CAAM,mBAAmB,CAAA;AAIzC,QAAA,GAAA,CAAI,WAAA,GAAc,WAAA;AAClB,QAAA,GAAA,CAAI,MAAA,GAAS,EAAE,GAAG,KAAA,CAAM,MAAA,EAAO;AAC/B,QAAA,MAAM,GAAA;AAAA,MACR;AACA,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,KAAK,IAAA,EAAM,GAAA,CAAI,CAAC,CAAA,GAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAC7C,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,gBAAgB,CAAC,IAAA,KAAS,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,CAAA;AAAA,IAChD,eAAe,CAAC,IAAA,KAAS,MAAM,MAAA,CAAO,IAAI,KAAK,EAAC;AAAA,IAChD,MAAA,EAAQ,MAAM,KAAA,CAAM,QAAA;AAAW,GACjC;AACF;AAEA,IAAM,YAAA,mBAAe,MAAA,CAAO,GAAA,CAAI,mBAAmB,CAAA;AAO5C,SAAS,OAAA,GAA0F;AACxG,EAAA,MAAM,MAAY,KAAA,CAAA,MAAA,EAA6B;AAC/C,EAAA,IAAI,CAAC,IAAI,OAAA,EAAS;AAChB,IAAA,MAAM,QAAQ,SAAA,EAAU;AACxB,IAAA,MAAM,QAAA,GAAW,cAAiB,KAAK,CAAA;AACvC,IAAC,QAAA,CAAkC,YAAY,CAAA,GAAI,KAAA;AACnD,IAAA,GAAA,CAAI,OAAA,GAAU,QAAA;AAAA,EAChB;AACA,EAAA,OAAO,CAAC,IAAI,OAAO,CAAA;AACrB;AAEA,SAAS,SAA4C,QAAA,EAA0C;AAC7F,EAAA,OAAQ,SAA6C,YAAY,CAAA;AACnE;AAWA,IAAM,OAAA,GAAgB,oBAAmC,IAAI,CAAA;AAoB7D,IAAM,QAAA,GAAW,CACf,KAAA,KACG;AACH,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,GAAS,YAAA;AAAA,IACT,aAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA,GAAe,IAAA;AAAA,IACf,QAAA,GAAW,KAAA;AAAA,IACX,QAAA;AAAA,IACA,SAAA,GAAY,EAAA;AAAA,IACZ,GAAG;AAAA,GACL,GAAI,KAAA;AAEJ,EAAA,MAAM,CAAC,YAAY,CAAA,GAAI,OAAA,EAAW;AAClC,EAAA,MAAM,OAAO,YAAA,IAAgB,YAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,SAAS,IAAI,CAAA;AAG3B,EAAA,MAAM,OAAA,GAAgB,aAAO,KAAK,CAAA;AAClC,EAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAClD,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AACnB,QAAA,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,QAAW,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA;AAAA,MACvD;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,OAAA,GAAU,IAAA;AAAA,EACpB;AAEA,EAAA,KAAA,CAAM,cAAA,GAAiB,iBACnB,CAAC,OAAA,EAAS,QAAQ,cAAA,CAAe,OAAA,EAAuB,GAAQ,CAAA,GAChE,MAAA;AAEJ,EAAA,MAAM,QAAA,GAAiB,kBAAY,MAAM;AACvC,IAAA,IAAA,CACG,cAAA,EAAe,CACf,IAAA,CAAK,CAAC,MAAA,KAAW,QAAA,GAAW,MAAM,CAAC,CAAA,CACnC,KAAA,CAAM,CAAC,GAAA,KAAqE;AAC3E,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,cAAA,GAAiB;AAAA,UACf,MAAA,EAAS,GAAA,CAAI,MAAA,IAAU,EAAC;AAAA,UACxB,aAAa,GAAA,CAAI;AAAA,SAClB,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,IAAA,EAAM,QAAA,EAAU,cAAc,CAAC,CAAA;AAEnC,EAAA,KAAA,CAAM,QAAA,GAAW,QAAA;AAEjB,EAAA,MAAM,QAAA,GAAiB,KAAA,CAAA,OAAA;AAAA,IACrB,OAAO,EAAE,KAAA,EAAO,MAAA,EAAQ,cAAc,QAAA,EAAS,CAAA;AAAA,IAC/C,CAAC,KAAA,EAAO,MAAA,EAAQ,YAAA,EAAc,QAAQ;AAAA,GACxC;AAEA,EAAA,uBACE,GAAA,CAAC,OAAA,CAAQ,QAAA,EAAR,EAAiB,OAAO,QAAA,EACvB,QAAA,kBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MACpD,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,QAAA,EAAS;AAAA,MACX,CAAA;AAAA,MACC,GAAG,IAAA;AAAA,MAEH;AAAA;AAAA,GACH,EACF,CAAA;AAEJ,CAAA;AAgCA,IAAM,YAAA,GAAe,CAAC,aAAA,EAAuB,IAAA,KAAoB;AAC/D,EAAA,MAAM,KAAA,GAAQ,KAAK,CAAC,CAAA;AACpB,EAAA,IAAI,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACtC,IAAA,MAAM,QAAA,GAAW,KAAA;AACjB,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,OAAA,IAAW,QAAA,CAAS,MAAA,EAAQ;AACjD,MAAA,OAAO,kBAAkB,SAAA,GAAY,QAAA,CAAS,MAAA,CAAO,OAAA,GAAU,SAAS,MAAA,CAAO,KAAA;AAAA,IACjF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,IAAM,WAAoC,CAAC;AAAA,EAChD,IAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA,GAAgB,OAAA;AAAA,EAChB,OAAA,GAAU,UAAA;AAAA,EACV,YAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ;AACF,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAY,iBAAW,OAAO,CAAA;AACpC,EAAA,MAAM,GAAG,IAAI,CAAA,GAAU,iBAAW,CAAC,CAAA,KAAc,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAGzD,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AACnB,IAAA,MAAMA,SAAQ,GAAA,CAAI,KAAA;AAClB,IAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,MAAA,IAAIA,MAAAA,CAAM,QAAQ,IAAI,CAAA,KAAM,QAAWA,MAAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,YAAA;AAC7D,MAAA,IAAIA,MAAAA,CAAM,OAAO,IAAI,CAAA,KAAM,QAAWA,MAAAA,CAAM,MAAA,CAAO,IAAI,CAAA,GAAI,YAAA;AAAA,IAC7D;AACA,IAAAA,MAAAA,CAAM,MAAA,CAAO,GAAA,CAAI,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,IAAS,EAAC,EAAG,OAAA,EAAS,YAAA,EAAc,CAAA;AACpE,IAAA,IAAI,IAAA,GAAOA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,IAAA,uBAAW,GAAA,EAAI;AACf,MAAAA,MAAAA,CAAM,SAAA,CAAU,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAAA,IAChC;AACA,IAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AACb,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAM,OAAO,IAAI,CAAA;AACjB,MAAAA,MAAAA,CAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,IAC1B,CAAA;AAAA,EAEF,CAAA,EAAG,CAAC,GAAA,EAAK,IAAI,CAAC,CAAA;AAGd,EAAM,gBAAU,MAAM;AACpB,IAAA,IAAI,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM;AACnB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,IAAI,IAAI,CAAA;AACvC,IAAA,IAAI,KAAA,EAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,IAAS,EAAC;AAAA,EACrC,CAAA,EAAG,CAAC,GAAA,EAAK,IAAA,EAAM,KAAK,CAAC,CAAA;AAErB,EAAA,IAAI,QAAQ,OAAO,IAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,CAAC,CAAC,IAAA;AAClB,EAAA,MAAM,UAAA,GACJ,aAAa,IAAA,KAAS,KAAA,EAAO,KAAK,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,IAAK,KAAA,CAAA;AAG1D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,MAAM,OAAA,GAAU,QAAA;AAChB,IAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAC/B,IAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,SAAS,IAAI,KAAA,EACvC,QAAA,EAAA;AAAA,MAAA,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EAAmB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAClD,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,MAC3C,IAAA,oBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,IAAA,EAAK,CAAA;AAAA,MAC9C,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM;AAAA,KAAA,EACpD,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAQ,GAAA,EAAK,KAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,KAAA,EAAO,MAAA,CAAO,IAAK,CAAA;AACjC,EAAA,MAAM,MAAA,GAAS,KAAA,EAAO,MAAA,CAAO,IAAK,KAAK,EAAC;AACxC,EAAA,MAAM,QAAA,GAAW,OAAO,MAAA,GAAS,CAAA;AAEjC,EAAA,MAAM,KAAA,GAAc,KAAA,CAAA,cAAA,CAAe,QAAQ,CAAA,GACjC,mBAAa,QAAA,EAAgC;AAAA,IACjD,CAAC,aAAa,GAAG,KAAA,KAAU,aAAA,KAAkB,YAAY,KAAA,GAAQ,EAAA,CAAA;AAAA,IACjE,CAAC,OAAO,GAAG,CAAA,GAAI,IAAA,KAAoB;AACjC,MAAA,MAAM,IAAA,GAAO,YAAA,CAAa,aAAA,EAAe,IAAI,CAAA;AAC7C,MAAA,KAAA,EAAO,MAAA,KAAW,KAAA,CAAM,MAAA,CAAO,IAAK,CAAA,GAAI,IAAA,CAAA;AACxC,MAAA,KAAA,EAAO,OAAA,CAAQ,IAAI,IAAK,CAAA;AACxB,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAK,aAAA,CAAc,OAAO,IAAK,CAAA,CAAE,KAAK,MAAM,WAAA,CAAY,KAAA,EAAO,IAAK,CAAC,CAAA;AACrE,QAAA,WAAA,CAAY,OAAO,IAAK,CAAA;AACxB,QAAA,SAAA,CAAU,KAAK,CAAA;AACf,QAAA,KAAA,CAAM,cAAA,GAAiB,EAAE,CAAC,IAAK,GAAG,IAAA,EAAK,EAAG,EAAE,GAAG,KAAA,CAAM,MAAA,EAAQ,CAAA;AAAA,MAC/D;AACA,MAAA,MAAM,YAAA,GAAgB,QAAA,CAAgC,KAAA,GAAQ,OAAO,CAAA;AACrE,MAAA,IAAI,OAAO,YAAA,KAAiB,UAAA,EAAY,YAAA,CAAa,GAAG,IAAI,CAAA;AAAA,IAC9D,CAAA;AAAA,IACA,QAAA,EACG,QAAA,CAAgC,KAAA,EAAO,QAAA,IAAY,GAAA,EAAK,QAAA;AAAA,IAC3D,GAAI,QAAA,GAAW,EAAE,OAAA,EAAS,IAAA,KAAS;AAAC,GACrC,CAAA,GACD,QAAA;AAEJ,EAAA,IAAI,OAAA,EAAS,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,KAAA,EAAM,CAAA;AAE7B,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,QAAA,GAAW,cAAc,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EACtE,QAAA,EAAA;AAAA,IAAA,KAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iBAAA,EACZ,QAAA,EAAA;AAAA,MAAA,UAAA,IAAc,GAAA,EAAK,iBAAiB,KAAA,oBACnC,GAAA,CAAC,UAAK,SAAA,EAAU,oBAAA,EAAqB,aAAA,EAAW,IAAA,EAAC,QAAA,EAAA,GAAA,EAAC,CAAA;AAAA,MAEnD;AAAA,KAAA,EACH,CAAA;AAAA,oBAEF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAA,EAAqB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACzC,QAAA,mBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAA,MAAA,CAAO,CAAC,CAAA,EAAE,CAAA,GAC1C,uBACF,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,gBAAK,CAAA,GACpC,IAAA;AAAA,IACH,KAAA,oBAAS,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,mBAAmB,QAAA,EAAA,KAAA,EAAM;AAAA,GAAA,EACpD,CAAA;AAEJ;AAIO,IAAM,IAAA,GAAO;AAIpB,IAAA,CAAK,IAAA,GAAO,QAAA;AACZ,IAAA,CAAK,OAAA,GAAU,OAAA","file":"chunk-IHACXMOI.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Form.css\";\nimport * as React from \"react\";\n\n/* ============================================================================\n * Form — minimal antd-compatible form with validation + field binding.\n *\n * Scope:\n * - useForm() → [FormInstance]\n * - <Form form={} layout initialValues onFinish onFinishFailed onValuesChange>\n * - <Form.Item name label rules noStyle valuePropName trigger initialValue help>\n * - Rules: required / message / pattern / min / max / len / validator / type\n *\n * Not supported (to keep v1 tight):\n * - nested field names (\"user.name\" dotted paths)\n * - Form.List\n * - dependencies / shouldUpdate\n * - labelCol / wrapperCol layout grid\n * ========================================================================== */\n\nexport type FormLayout = \"horizontal\" | \"vertical\" | \"inline\";\n\nexport type Rule = {\n required?: boolean;\n message?: string;\n pattern?: RegExp;\n min?: number;\n max?: number;\n len?: number;\n type?: \"string\" | \"number\" | \"email\" | \"url\" | \"array\";\n whitespace?: boolean;\n validator?: (rule: Rule, value: unknown) => Promise<void> | void;\n};\n\nexport interface ErrorField {\n name: string;\n errors: string[];\n}\n\nexport interface FormInstance<V extends Record<string, unknown> = Record<string, unknown>> {\n getFieldValue: <T = unknown>(name: string) => T;\n getFieldsValue: (names?: string[]) => V;\n setFieldValue: (name: string, value: unknown) => void;\n setFieldsValue: (values: Partial<V>) => void;\n resetFields: (names?: string[]) => void;\n validateFields: (names?: string[]) => Promise<V>;\n isFieldTouched: (name: string) => boolean;\n getFieldError: (name: string) => string[];\n /** Programmatic submit — runs validate then onFinish/onFinishFailed. */\n submit: () => void;\n}\n\ninterface FieldEntry {\n rules: Rule[];\n initial?: unknown;\n}\n\ninterface InternalStore {\n values: Record<string, unknown>;\n errors: Record<string, string[]>;\n touched: Set<string>;\n initial: Record<string, unknown>;\n fields: Map<string, FieldEntry>;\n fieldSubs: Map<string, Set<() => void>>;\n formSubs: Set<() => void>;\n onSubmit?: () => void;\n onValuesChange?: (changed: Record<string, unknown>, all: Record<string, unknown>) => void;\n}\n\nfunction makeStore(): InternalStore {\n return {\n values: {},\n errors: {},\n touched: new Set(),\n initial: {},\n fields: new Map(),\n fieldSubs: new Map(),\n formSubs: new Set(),\n };\n}\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\nconst URL_RE = /^https?:\\/\\/.+/i;\n\nasync function validateSingle(rule: Rule, value: unknown): Promise<string | null> {\n const msg = rule.message;\n const isEmpty = value == null || value === \"\" || (Array.isArray(value) && value.length === 0);\n\n if (rule.required && isEmpty) return msg ?? \"必填项\";\n if (rule.whitespace && typeof value === \"string\" && value.trim() === \"\") return msg ?? \"不能为空\";\n\n // Only run remaining checks when value is present.\n if (isEmpty) return null;\n\n if (rule.type === \"email\" && typeof value === \"string\" && !EMAIL_RE.test(value)) return msg ?? \"邮箱格式不正确\";\n if (rule.type === \"url\" && typeof value === \"string\" && !URL_RE.test(value)) return msg ?? \"链接格式不正确\";\n if (rule.type === \"number\" && typeof value !== \"number\" && isNaN(Number(value))) return msg ?? \"必须是数字\";\n if (rule.type === \"array\" && !Array.isArray(value)) return msg ?? \"必须是数组\";\n\n if (rule.pattern && typeof value === \"string\" && !rule.pattern.test(value)) return msg ?? \"格式不正确\";\n\n const strLen = typeof value === \"string\" ? value.length : Array.isArray(value) ? value.length : undefined;\n if (rule.len != null && strLen != null && strLen !== rule.len) return msg ?? `长度必须是 ${rule.len}`;\n if (rule.min != null && strLen != null && strLen < rule.min) return msg ?? `至少 ${rule.min} 个字符`;\n if (rule.max != null && strLen != null && strLen > rule.max) return msg ?? `最多 ${rule.max} 个字符`;\n if (rule.min != null && typeof value === \"number\" && value < rule.min) return msg ?? `不能小于 ${rule.min}`;\n if (rule.max != null && typeof value === \"number\" && value > rule.max) return msg ?? `不能大于 ${rule.max}`;\n\n if (rule.validator) {\n try {\n await rule.validator(rule, value);\n } catch (err) {\n if (typeof err === \"string\") return err;\n if (err instanceof Error) return err.message;\n return msg ?? \"校验未通过\";\n }\n }\n\n return null;\n}\n\nasync function validateField(store: InternalStore, name: string): Promise<string[]> {\n const entry = store.fields.get(name);\n if (!entry) return [];\n const value = store.values[name];\n const errs: string[] = [];\n for (const rule of entry.rules) {\n const err = await validateSingle(rule, value);\n if (err) errs.push(err);\n }\n store.errors[name] = errs;\n return errs;\n}\n\nfunction notifyField(store: InternalStore, name: string) {\n store.fieldSubs.get(name)?.forEach((fn) => fn());\n}\nfunction notifyAll(store: InternalStore) {\n store.formSubs.forEach((fn) => fn());\n}\n\nfunction buildInstance<V extends Record<string, unknown>>(store: InternalStore): FormInstance<V> {\n return {\n getFieldValue: <T,>(name: string) => store.values[name] as T,\n getFieldsValue: (names) => {\n if (!names) return { ...store.values } as V;\n const out: Record<string, unknown> = {};\n for (const n of names) out[n] = store.values[n];\n return out as V;\n },\n setFieldValue: (name, value) => {\n const prev = store.values[name];\n store.values[name] = value;\n store.touched.add(name);\n if (store.fields.has(name)) {\n void validateField(store, name).then(() => notifyField(store, name));\n }\n notifyField(store, name);\n notifyAll(store);\n if (prev !== value) store.onValuesChange?.({ [name]: value }, { ...store.values });\n },\n setFieldsValue: (values) => {\n const changed: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(values)) {\n if (store.values[k] !== v) changed[k] = v;\n store.values[k] = v;\n store.touched.add(k);\n notifyField(store, k);\n }\n notifyAll(store);\n if (Object.keys(changed).length > 0) store.onValuesChange?.(changed, { ...store.values });\n },\n resetFields: (names) => {\n const keys = names ?? Array.from(store.fields.keys());\n for (const k of keys) {\n store.values[k] = store.initial[k];\n store.errors[k] = [];\n store.touched.delete(k);\n notifyField(store, k);\n }\n notifyAll(store);\n },\n validateFields: async (names) => {\n const keys = names ?? Array.from(store.fields.keys());\n const errorFields: ErrorField[] = [];\n for (const k of keys) {\n const errs = await validateField(store, k);\n notifyField(store, k);\n if (errs.length > 0) errorFields.push({ name: k, errors: errs });\n }\n notifyAll(store);\n if (errorFields.length > 0) {\n const err = new Error(\"Validation failed\") as Error & {\n errorFields: ErrorField[];\n values: Record<string, unknown>;\n };\n err.errorFields = errorFields;\n err.values = { ...store.values };\n throw err;\n }\n const out: Record<string, unknown> = {};\n for (const k of keys) out[k] = store.values[k];\n return out as V;\n },\n isFieldTouched: (name) => store.touched.has(name),\n getFieldError: (name) => store.errors[name] ?? [],\n submit: () => store.onSubmit?.(),\n };\n}\n\nconst STORE_SYMBOL = Symbol.for(\"lumina.form.store\");\n\ntype InstanceWithStore<V extends Record<string, unknown>> = FormInstance<V> & {\n [STORE_SYMBOL]: InternalStore;\n};\n\n/** `Form.useForm()` — create a form instance. Same shape as antd's hook. */\nexport function useForm<V extends Record<string, unknown> = Record<string, unknown>>(): [FormInstance<V>] {\n const ref = React.useRef<InstanceWithStore<V>>();\n if (!ref.current) {\n const store = makeStore();\n const instance = buildInstance<V>(store) as InstanceWithStore<V>;\n (instance as InstanceWithStore<V>)[STORE_SYMBOL] = store;\n ref.current = instance;\n }\n return [ref.current];\n}\n\nfunction getStore<V extends Record<string, unknown>>(instance: FormInstance<V>): InternalStore {\n return (instance as unknown as InstanceWithStore<V>)[STORE_SYMBOL];\n}\n\n/* ---------------------------- Context ---------------------------- */\n\ninterface FormCtxValue {\n store: InternalStore;\n layout: FormLayout;\n requiredMark: boolean;\n disabled: boolean;\n}\n\nconst FormCtx = React.createContext<FormCtxValue | null>(null);\n\n/* ---------------------------- Form Root ---------------------------- */\n\nexport interface FormProps<V extends Record<string, unknown> = Record<string, unknown>>\n extends Omit<React.FormHTMLAttributes<HTMLFormElement>, \"onChange\" | \"onSubmit\"> {\n form?: FormInstance<V>;\n layout?: FormLayout;\n initialValues?: Partial<V>;\n onFinish?: (values: V) => void;\n onFinishFailed?: (info: { values: Partial<V>; errorFields: ErrorField[] }) => void;\n onValuesChange?: (changed: Partial<V>, all: V) => void;\n /** Show the `*` mark before required field labels. Default true. */\n requiredMark?: boolean;\n /** Disable all fields inside. */\n disabled?: boolean;\n children?: React.ReactNode;\n className?: string;\n}\n\nconst FormRoot = <V extends Record<string, unknown> = Record<string, unknown>>(\n props: FormProps<V>\n) => {\n const {\n form: externalForm,\n layout = \"horizontal\",\n initialValues,\n onFinish,\n onFinishFailed,\n onValuesChange,\n requiredMark = true,\n disabled = false,\n children,\n className = \"\",\n ...rest\n } = props;\n\n const [internalForm] = useForm<V>();\n const form = externalForm ?? internalForm;\n const store = getStore(form);\n\n // Apply initial values + wire callbacks on first render only.\n const initRef = React.useRef(false);\n if (!initRef.current) {\n if (initialValues) {\n for (const [k, v] of Object.entries(initialValues)) {\n store.initial[k] = v;\n if (store.values[k] === undefined) store.values[k] = v;\n }\n }\n initRef.current = true;\n }\n\n store.onValuesChange = onValuesChange\n ? (changed, all) => onValuesChange(changed as Partial<V>, all as V)\n : undefined;\n\n const doSubmit = React.useCallback(() => {\n form\n .validateFields()\n .then((values) => onFinish?.(values))\n .catch((err: Error & { errorFields?: ErrorField[]; values?: Partial<V> }) => {\n if (err?.errorFields) {\n onFinishFailed?.({\n values: (err.values ?? {}) as Partial<V>,\n errorFields: err.errorFields,\n });\n }\n });\n }, [form, onFinish, onFinishFailed]);\n\n store.onSubmit = doSubmit;\n\n const ctxValue = React.useMemo<FormCtxValue>(\n () => ({ store, layout, requiredMark, disabled }),\n [store, layout, requiredMark, disabled]\n );\n\n return (\n <FormCtx.Provider value={ctxValue}>\n <form\n className={`lumina-form layout-${layout} ${className}`}\n onSubmit={(e) => {\n e.preventDefault();\n doSubmit();\n }}\n {...rest}\n >\n {children}\n </form>\n </FormCtx.Provider>\n );\n};\n\n/* ---------------------------- Form.Item ---------------------------- */\n\nexport interface FormItemProps {\n /** Field key. Omit for layout-only wrappers (no value binding). */\n name?: string;\n label?: React.ReactNode;\n rules?: Rule[];\n /** Render no wrapper — emit only the (bound) child. */\n noStyle?: boolean;\n /** Inject value into this prop name on the child. Default `\"value\"`. */\n valuePropName?: string;\n /** Listen for changes on this event name. Default `\"onChange\"`. */\n trigger?: string;\n /** Event names that trigger validation. Default `[\"onChange\"]`. */\n validateTrigger?: string | string[];\n /** Initial value (used when the form instance has no value yet). */\n initialValue?: unknown;\n /** Extra help text shown under the field. Hidden when an error is shown. */\n help?: React.ReactNode;\n /** Supplementary description below the help line. */\n extra?: React.ReactNode;\n /** Explicitly mark the field as required (cosmetic). */\n required?: boolean;\n /** Hide the entire item (still keeps the field in the form). */\n hidden?: boolean;\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst extractValue = (valuePropName: string, args: unknown[]) => {\n const first = args[0];\n if (first && typeof first === \"object\") {\n const anyFirst = first as { target?: { value?: unknown; checked?: unknown } };\n if (anyFirst.target && \"value\" in anyFirst.target) {\n return valuePropName === \"checked\" ? anyFirst.target.checked : anyFirst.target.value;\n }\n }\n return first;\n};\n\nexport const FormItem: React.FC<FormItemProps> = ({\n name,\n label,\n rules,\n noStyle,\n valuePropName = \"value\",\n trigger = \"onChange\",\n initialValue,\n help,\n extra,\n required,\n hidden,\n children,\n className = \"\",\n style,\n}) => {\n const ctx = React.useContext(FormCtx);\n const [, tick] = React.useReducer((n: number) => n + 1, 0);\n\n // Register field + subscribe to its changes.\n React.useEffect(() => {\n if (!ctx || !name) return;\n const store = ctx.store;\n if (initialValue !== undefined) {\n if (store.initial[name] === undefined) store.initial[name] = initialValue;\n if (store.values[name] === undefined) store.values[name] = initialValue;\n }\n store.fields.set(name, { rules: rules ?? [], initial: initialValue });\n let subs = store.fieldSubs.get(name);\n if (!subs) {\n subs = new Set();\n store.fieldSubs.set(name, subs);\n }\n subs.add(tick);\n return () => {\n subs!.delete(tick);\n store.fields.delete(name);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [ctx, name]);\n\n // Keep rules fresh across re-renders.\n React.useEffect(() => {\n if (!ctx || !name) return;\n const entry = ctx.store.fields.get(name);\n if (entry) entry.rules = rules ?? [];\n }, [ctx, name, rules]);\n\n if (hidden) return null;\n\n const hasName = !!name;\n const isRequired =\n required === true || (rules?.some((r) => r.required) ?? false);\n\n // Unbound mode (no name) — render children as-is.\n if (!hasName) {\n const content = children as React.ReactNode;\n if (noStyle) return <>{content}</>;\n return (\n <div className={`form-item ${className}`} style={style}>\n {label && <div className=\"form-item-label\">{label}</div>}\n <div className=\"form-item-control\">{content}</div>\n {help && <div className=\"form-item-help\">{help}</div>}\n {extra && <div className=\"form-item-extra\">{extra}</div>}\n </div>\n );\n }\n\n const store = ctx?.store;\n const value = store?.values[name!];\n const errors = store?.errors[name!] ?? [];\n const hasError = errors.length > 0;\n\n const bound = React.isValidElement(children)\n ? React.cloneElement(children as React.ReactElement, {\n [valuePropName]: value ?? (valuePropName === \"checked\" ? false : \"\"),\n [trigger]: (...args: unknown[]) => {\n const next = extractValue(valuePropName, args);\n store?.values && (store.values[name!] = next);\n store?.touched.add(name!);\n if (store) {\n void validateField(store, name!).then(() => notifyField(store, name!));\n notifyField(store, name!);\n notifyAll(store);\n store.onValuesChange?.({ [name!]: next }, { ...store.values });\n }\n const childTrigger = (children as React.ReactElement).props?.[trigger];\n if (typeof childTrigger === \"function\") childTrigger(...args);\n },\n disabled:\n (children as React.ReactElement).props?.disabled ?? ctx?.disabled,\n ...(hasError ? { invalid: true } : {}),\n })\n : children;\n\n if (noStyle) return <>{bound}</>;\n\n return (\n <div className={`form-item ${hasError ? \"has-error\" : \"\"} ${className}`} style={style}>\n {label && (\n <div className=\"form-item-label\">\n {isRequired && ctx?.requiredMark !== false && (\n <span className=\"form-item-required\" aria-hidden>*</span>\n )}\n {label}\n </div>\n )}\n <div className=\"form-item-control\">{bound}</div>\n {hasError ? (\n <div className=\"form-item-error\">{errors[0]}</div>\n ) : help ? (\n <div className=\"form-item-help\">{help}</div>\n ) : null}\n {extra && <div className=\"form-item-extra\">{extra}</div>}\n </div>\n );\n};\n\n/* ---------------------------- Assembly ---------------------------- */\n\nexport const Form = FormRoot as typeof FormRoot & {\n Item: typeof FormItem;\n useForm: typeof useForm;\n};\nForm.Item = FormItem;\nForm.useForm = useForm;\n"]}
@@ -0,0 +1,209 @@
1
+ 'use strict';
2
+
3
+ var chunkYFBHVTKN_cjs = require('./chunk-YFBHVTKN.cjs');
4
+ require('./tokens-BIIUTPKN.css');
5
+ require('./shared-NJHRNLRH.css');
6
+ require('./CommandPalette-T45DBMPY.css');
7
+ var React = require('react');
8
+ var ReactDOM = require('react-dom');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
+
13
+ function _interopNamespace(e) {
14
+ if (e && e.__esModule) return e;
15
+ var n = Object.create(null);
16
+ if (e) {
17
+ Object.keys(e).forEach(function (k) {
18
+ if (k !== 'default') {
19
+ var d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: function () { return e[k]; }
23
+ });
24
+ }
25
+ });
26
+ }
27
+ n.default = e;
28
+ return Object.freeze(n);
29
+ }
30
+
31
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
+ var ReactDOM__default = /*#__PURE__*/_interopDefault(ReactDOM);
33
+
34
+ var DEFAULT_FILTER = (item, q) => {
35
+ if (!q) return true;
36
+ const hay = [item.label, ...item.keywords ?? []].join(" ").toLowerCase();
37
+ const needle = q.toLowerCase();
38
+ let i = 0;
39
+ for (const ch of hay) {
40
+ if (ch === needle[i]) i++;
41
+ if (i === needle.length) return true;
42
+ }
43
+ return i === needle.length;
44
+ };
45
+ var CommandPalette = ({
46
+ open,
47
+ onOpenChange,
48
+ items,
49
+ placeholder = "\u641C\u7D22\u547D\u4EE4\u2026",
50
+ filter = DEFAULT_FILTER,
51
+ emptyText = "\u6682\u65E0\u5339\u914D\u7ED3\u679C",
52
+ resetOnOpen = true,
53
+ footer,
54
+ className = ""
55
+ }) => {
56
+ const [query, setQuery] = React__namespace.useState("");
57
+ const [active, setActive] = React__namespace.useState(0);
58
+ const inputRef = React__namespace.useRef(null);
59
+ const listRef = React__namespace.useRef(null);
60
+ const filtered = React__namespace.useMemo(() => items.filter((it) => filter(it, query)), [items, query, filter]);
61
+ const grouped = React__namespace.useMemo(() => {
62
+ const order = [];
63
+ const map = /* @__PURE__ */ new Map();
64
+ for (const it of filtered) {
65
+ const g = it.group ?? "";
66
+ if (!map.has(g)) {
67
+ map.set(g, []);
68
+ order.push(g);
69
+ }
70
+ map.get(g).push(it);
71
+ }
72
+ return order.map((g) => ({ group: g, items: map.get(g) }));
73
+ }, [filtered]);
74
+ const close = React__namespace.useCallback(() => onOpenChange?.(false), [onOpenChange]);
75
+ React__namespace.useEffect(() => {
76
+ if (!open) return;
77
+ if (resetOnOpen) setQuery("");
78
+ setActive(0);
79
+ const id = requestAnimationFrame(() => inputRef.current?.focus());
80
+ return () => cancelAnimationFrame(id);
81
+ }, [open, resetOnOpen]);
82
+ React__namespace.useEffect(() => {
83
+ setActive((a) => filtered.length === 0 ? 0 : Math.min(a, filtered.length - 1));
84
+ }, [filtered.length]);
85
+ React__namespace.useEffect(() => {
86
+ const el = listRef.current?.querySelector(`[data-cmd-idx="${active}"]`);
87
+ el?.scrollIntoView({ block: "nearest" });
88
+ }, [active, filtered]);
89
+ const pick = (it) => {
90
+ if (it.disabled) return;
91
+ it.onSelect?.();
92
+ close();
93
+ };
94
+ const onKey = (e) => {
95
+ if (e.key === "Escape") {
96
+ e.preventDefault();
97
+ close();
98
+ return;
99
+ }
100
+ if (e.key === "ArrowDown") {
101
+ e.preventDefault();
102
+ setActive((a) => {
103
+ if (filtered.length === 0) return 0;
104
+ for (let n = 1; n <= filtered.length; n++) {
105
+ const i = (a + n) % filtered.length;
106
+ if (!filtered[i].disabled) return i;
107
+ }
108
+ return a;
109
+ });
110
+ }
111
+ if (e.key === "ArrowUp") {
112
+ e.preventDefault();
113
+ setActive((a) => {
114
+ if (filtered.length === 0) return 0;
115
+ for (let n = 1; n <= filtered.length; n++) {
116
+ const i = (a - n + filtered.length) % filtered.length;
117
+ if (!filtered[i].disabled) return i;
118
+ }
119
+ return a;
120
+ });
121
+ }
122
+ if (e.key === "Enter") {
123
+ const it = filtered[active];
124
+ if (it) {
125
+ e.preventDefault();
126
+ pick(it);
127
+ }
128
+ }
129
+ };
130
+ if (typeof document === "undefined" || !open) return null;
131
+ let flatIdx = -1;
132
+ return ReactDOM__default.default.createPortal(
133
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `cmdp-overlay ${className}`, onMouseDown: close, role: "presentation", children: /* @__PURE__ */ jsxRuntime.jsxs(
134
+ "div",
135
+ {
136
+ className: "cmdp-panel",
137
+ onMouseDown: (e) => e.stopPropagation(),
138
+ role: "dialog",
139
+ "aria-modal": true,
140
+ "aria-label": "\u547D\u4EE4\u9762\u677F",
141
+ children: [
142
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cmdp-search", children: /* @__PURE__ */ jsxRuntime.jsx(
143
+ chunkYFBHVTKN_cjs.Input,
144
+ {
145
+ ref: inputRef,
146
+ size: "lg",
147
+ leadingIcon: "search",
148
+ placeholder,
149
+ value: query,
150
+ onChange: (v) => setQuery(v),
151
+ onKeyDown: onKey,
152
+ suffix: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-kbd", children: "esc" })
153
+ }
154
+ ) }),
155
+ /* @__PURE__ */ jsxRuntime.jsx("div", { ref: listRef, className: "cmdp-list", role: "listbox", children: grouped.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cmdp-empty", children: emptyText }) : grouped.map(({ group, items: gItems }) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "cmdp-group", children: [
156
+ group && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cmdp-group-head", children: group }),
157
+ gItems.map((it) => {
158
+ flatIdx += 1;
159
+ const i = flatIdx;
160
+ const isActive = i === active;
161
+ return /* @__PURE__ */ jsxRuntime.jsxs(
162
+ "button",
163
+ {
164
+ type: "button",
165
+ role: "option",
166
+ "aria-selected": isActive,
167
+ "data-cmd-idx": i,
168
+ disabled: it.disabled,
169
+ className: `cmdp-item ${isActive ? "active" : ""}`,
170
+ onMouseEnter: () => setActive(i),
171
+ onClick: () => pick(it),
172
+ children: [
173
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-icon", children: it.icon }),
174
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "cmdp-labels", children: [
175
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-label", children: it.label }),
176
+ it.description && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-desc", children: it.description })
177
+ ] }),
178
+ it.shortcut && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-shortcut", children: it.shortcut })
179
+ ]
180
+ },
181
+ it.key
182
+ );
183
+ })
184
+ ] }, group || "_")) }),
185
+ footer === null ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "cmdp-footer", children: footer ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
186
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
187
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-kbd", children: "\u2191" }),
188
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-kbd", children: "\u2193" }),
189
+ " \u5207\u6362"
190
+ ] }),
191
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
192
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-kbd", children: "\u23CE" }),
193
+ " \u6267\u884C"
194
+ ] }),
195
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
196
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "cmdp-kbd", children: "esc" }),
197
+ " \u5173\u95ED"
198
+ ] })
199
+ ] }) })
200
+ ]
201
+ }
202
+ ) }),
203
+ document.body
204
+ );
205
+ };
206
+
207
+ exports.CommandPalette = CommandPalette;
208
+ //# sourceMappingURL=chunk-IJA26LRY.cjs.map
209
+ //# sourceMappingURL=chunk-IJA26LRY.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CommandPalette/CommandPalette.tsx"],"names":["React","ReactDOM","jsx","jsxs","Input","Fragment"],"mappings":"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","file":"chunk-IJA26LRY.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./CommandPalette.css\";\nimport * as React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { Input } from \"../Input\";\n\nexport interface CommandItem {\n key: string;\n /** Displayed label; also matched against the search query by default. */\n label: string;\n /** Optional secondary line — e.g. \"Open recent\". */\n description?: React.ReactNode;\n /** Leading icon. */\n icon?: React.ReactNode;\n /** Right-aligned shortcut hint, e.g. `\"⌘P\"`. */\n shortcut?: React.ReactNode;\n /** Extra search terms beyond `label`. */\n keywords?: string[];\n /** Group heading. Items sharing a `group` appear under one heading. */\n group?: string;\n /** Ignored by default filter — still shown. */\n disabled?: boolean;\n onSelect?: () => void;\n}\n\nexport interface CommandPaletteProps {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n items: CommandItem[];\n placeholder?: string;\n /** Custom matcher. Return true to keep the item. */\n filter?: (item: CommandItem, query: string) => boolean;\n /** Shown when no item matches the query. */\n emptyText?: React.ReactNode;\n /** Reset the query to empty whenever the palette opens. Default true. */\n resetOnOpen?: boolean;\n /** Footer node. Pass `null` to hide. */\n footer?: React.ReactNode;\n className?: string;\n}\n\nconst DEFAULT_FILTER = (item: CommandItem, q: string) => {\n if (!q) return true;\n const hay = [item.label, ...(item.keywords ?? [])].join(\" \").toLowerCase();\n const needle = q.toLowerCase();\n // Simple subsequence match — each char of needle appears in order in haystack.\n let i = 0;\n for (const ch of hay) {\n if (ch === needle[i]) i++;\n if (i === needle.length) return true;\n }\n return i === needle.length;\n};\n\n/**\n * `CommandPalette` — ⌘K-style action launcher. Search + grouped items +\n * keyboard nav. Rendered into `document.body`.\n *\n * The parent controls `open` via state — wire `Cmd/Ctrl+K` to toggle.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = React.useState(false);\n * React.useEffect(() => {\n * const h = (e: KeyboardEvent) => {\n * if ((e.metaKey || e.ctrlKey) && e.key === \"k\") { e.preventDefault(); setOpen(o => !o); }\n * };\n * window.addEventListener(\"keydown\", h);\n * return () => window.removeEventListener(\"keydown\", h);\n * }, []);\n *\n * <CommandPalette\n * open={open}\n * onOpenChange={setOpen}\n * items={[\n * { key: \"new\", label: \"新建文件\", icon: <Icon name=\"plus\" size={14} />, group: \"文件\", shortcut: \"⌘N\", onSelect: () => {} },\n * ...\n * ]}\n * />\n * ```\n */\nexport const CommandPalette: React.FC<CommandPaletteProps> = ({\n open,\n onOpenChange,\n items,\n placeholder = \"搜索命令…\",\n filter = DEFAULT_FILTER,\n emptyText = \"暂无匹配结果\",\n resetOnOpen = true,\n footer,\n className = \"\",\n}) => {\n const [query, setQuery] = React.useState(\"\");\n const [active, setActive] = React.useState(0);\n const inputRef = React.useRef<HTMLInputElement>(null);\n const listRef = React.useRef<HTMLDivElement>(null);\n\n const filtered = React.useMemo(() => items.filter((it) => filter(it, query)), [items, query, filter]);\n\n // Group items preserving the original order of first occurrence.\n const grouped = React.useMemo(() => {\n const order: string[] = [];\n const map = new Map<string, CommandItem[]>();\n for (const it of filtered) {\n const g = it.group ?? \"\";\n if (!map.has(g)) { map.set(g, []); order.push(g); }\n map.get(g)!.push(it);\n }\n return order.map((g) => ({ group: g, items: map.get(g)! }));\n }, [filtered]);\n\n const close = React.useCallback(() => onOpenChange?.(false), [onOpenChange]);\n\n // Reset & focus on open.\n React.useEffect(() => {\n if (!open) return;\n if (resetOnOpen) setQuery(\"\");\n setActive(0);\n const id = requestAnimationFrame(() => inputRef.current?.focus());\n return () => cancelAnimationFrame(id);\n }, [open, resetOnOpen]);\n\n // Clamp active when the filtered list shrinks.\n React.useEffect(() => {\n setActive((a) => (filtered.length === 0 ? 0 : Math.min(a, filtered.length - 1)));\n }, [filtered.length]);\n\n // Scroll active item into view.\n React.useEffect(() => {\n const el = listRef.current?.querySelector<HTMLElement>(`[data-cmd-idx=\"${active}\"]`);\n el?.scrollIntoView({ block: \"nearest\" });\n }, [active, filtered]);\n\n const pick = (it: CommandItem) => {\n if (it.disabled) return;\n it.onSelect?.();\n close();\n };\n\n const onKey = (e: React.KeyboardEvent) => {\n if (e.key === \"Escape\") { e.preventDefault(); close(); return; }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setActive((a) => {\n if (filtered.length === 0) return 0;\n for (let n = 1; n <= filtered.length; n++) {\n const i = (a + n) % filtered.length;\n if (!filtered[i].disabled) return i;\n }\n return a;\n });\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setActive((a) => {\n if (filtered.length === 0) return 0;\n for (let n = 1; n <= filtered.length; n++) {\n const i = (a - n + filtered.length) % filtered.length;\n if (!filtered[i].disabled) return i;\n }\n return a;\n });\n }\n if (e.key === \"Enter\") {\n const it = filtered[active];\n if (it) { e.preventDefault(); pick(it); }\n }\n };\n\n if (typeof document === \"undefined\" || !open) return null;\n\n // Build a flat index map so rendered list items know their position in `filtered`.\n let flatIdx = -1;\n\n return ReactDOM.createPortal(\n <div className={`cmdp-overlay ${className}`} onMouseDown={close} role=\"presentation\">\n <div\n className=\"cmdp-panel\"\n onMouseDown={(e) => e.stopPropagation()}\n role=\"dialog\"\n aria-modal\n aria-label=\"命令面板\"\n >\n <div className=\"cmdp-search\">\n <Input\n ref={inputRef}\n size=\"lg\"\n leadingIcon=\"search\"\n placeholder={placeholder}\n value={query}\n onChange={(v) => setQuery(v)}\n onKeyDown={onKey}\n suffix={<span className=\"cmdp-kbd\">esc</span>}\n />\n </div>\n\n <div ref={listRef} className=\"cmdp-list\" role=\"listbox\">\n {grouped.length === 0 ? (\n <div className=\"cmdp-empty\">{emptyText}</div>\n ) : (\n grouped.map(({ group, items: gItems }) => (\n <div key={group || \"_\"} className=\"cmdp-group\">\n {group && <div className=\"cmdp-group-head\">{group}</div>}\n {gItems.map((it) => {\n flatIdx += 1;\n const i = flatIdx;\n const isActive = i === active;\n return (\n <button\n key={it.key}\n type=\"button\"\n role=\"option\"\n aria-selected={isActive}\n data-cmd-idx={i}\n disabled={it.disabled}\n className={`cmdp-item ${isActive ? \"active\" : \"\"}`}\n onMouseEnter={() => setActive(i)}\n onClick={() => pick(it)}\n >\n <span className=\"cmdp-icon\">{it.icon}</span>\n <span className=\"cmdp-labels\">\n <span className=\"cmdp-label\">{it.label}</span>\n {it.description && <span className=\"cmdp-desc\">{it.description}</span>}\n </span>\n {it.shortcut && <span className=\"cmdp-shortcut\">{it.shortcut}</span>}\n </button>\n );\n })}\n </div>\n ))\n )}\n </div>\n\n {footer === null ? null : (\n <div className=\"cmdp-footer\">\n {footer ?? (\n <>\n <span><span className=\"cmdp-kbd\">↑</span><span className=\"cmdp-kbd\">↓</span> 切换</span>\n <span><span className=\"cmdp-kbd\">⏎</span> 执行</span>\n <span><span className=\"cmdp-kbd\">esc</span> 关闭</span>\n </>\n )}\n </div>\n )}\n </div>\n </div>,\n document.body\n );\n};\n"]}