@fangxinyan/lumina 0.2.1 → 0.3.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 (250) hide show
  1. package/dist/{Accordion-3TQPKNN3.css → Accordion-REMDCQUD.css} +0 -1
  2. package/dist/Accordion.cjs +2 -2
  3. package/dist/Accordion.js +1 -1
  4. package/dist/Alert.cjs +2 -2
  5. package/dist/Alert.js +1 -1
  6. package/dist/AppShell.cjs +5 -5
  7. package/dist/AppShell.js +1 -1
  8. package/dist/Avatar.cjs +2 -2
  9. package/dist/Avatar.js +1 -1
  10. package/dist/Button.cjs +3 -3
  11. package/dist/Button.js +1 -1
  12. package/dist/Calendar.cjs +2 -2
  13. package/dist/Calendar.js +1 -1
  14. package/dist/Card.cjs +3 -3
  15. package/dist/Card.js +1 -1
  16. package/dist/{Cascader-DTRTTXC2.css → Cascader-VSYEKQCG.css} +1 -1
  17. package/dist/Cascader.cjs +2 -2
  18. package/dist/Cascader.js +1 -1
  19. package/dist/Checkbox.cjs +3 -3
  20. package/dist/Checkbox.js +1 -1
  21. package/dist/{ColorPicker-GP7AQYUU.css → ColorPicker-SDDQGHCM.css} +1 -1
  22. package/dist/ColorPicker.cjs +2 -2
  23. package/dist/ColorPicker.js +1 -1
  24. package/dist/CommandPalette-T45DBMPY.css +139 -0
  25. package/dist/CommandPalette.cjs +14 -0
  26. package/dist/CommandPalette.cjs.map +1 -0
  27. package/dist/CommandPalette.d.cts +65 -0
  28. package/dist/CommandPalette.d.ts +65 -0
  29. package/dist/CommandPalette.js +5 -0
  30. package/dist/CommandPalette.js.map +1 -0
  31. package/dist/ContextMenu-FKW6CQW4.css +76 -0
  32. package/dist/ContextMenu.cjs +12 -0
  33. package/dist/ContextMenu.cjs.map +1 -0
  34. package/dist/ContextMenu.d.cts +50 -0
  35. package/dist/ContextMenu.d.ts +50 -0
  36. package/dist/ContextMenu.js +3 -0
  37. package/dist/ContextMenu.js.map +1 -0
  38. package/dist/Divider.cjs +2 -2
  39. package/dist/Divider.js +1 -1
  40. package/dist/Drawer.cjs +2 -2
  41. package/dist/Drawer.js +1 -1
  42. package/dist/Empty.cjs +4 -4
  43. package/dist/Empty.js +1 -1
  44. package/dist/{Image-WYWORJT4.css → Image-4MN34O6P.css} +1 -1
  45. package/dist/Image.cjs +3 -3
  46. package/dist/Image.js +1 -1
  47. package/dist/Input.cjs +3 -3
  48. package/dist/Input.js +1 -1
  49. package/dist/List.cjs +2 -2
  50. package/dist/List.js +1 -1
  51. package/dist/{Modal-N4YVLEWW.css → Modal-XSDMU4XJ.css} +1 -1
  52. package/dist/Modal.cjs +3 -3
  53. package/dist/Modal.js +2 -2
  54. package/dist/Pagination.cjs +4 -4
  55. package/dist/Pagination.js +3 -3
  56. package/dist/{Popover-MGCMOXYP.css → Popover-NYEKT5CQ.css} +1 -1
  57. package/dist/Popover.cjs +2 -2
  58. package/dist/Popover.js +1 -1
  59. package/dist/Progress.cjs +3 -3
  60. package/dist/Progress.js +1 -1
  61. package/dist/{Select-EDG37C37.css → Select-J3CCVFJ7.css} +1 -1
  62. package/dist/Select.cjs +3 -3
  63. package/dist/Select.js +2 -2
  64. package/dist/Slider.cjs +2 -2
  65. package/dist/Slider.js +1 -1
  66. package/dist/Splitter-DHNOY4NC.css +66 -0
  67. package/dist/Splitter.cjs +12 -0
  68. package/dist/Splitter.cjs.map +1 -0
  69. package/dist/Splitter.d.cts +44 -0
  70. package/dist/Splitter.d.ts +44 -0
  71. package/dist/Splitter.js +3 -0
  72. package/dist/Splitter.js.map +1 -0
  73. package/dist/StatusBar-CDS2GPSI.css +58 -0
  74. package/dist/StatusBar.cjs +16 -0
  75. package/dist/StatusBar.cjs.map +1 -0
  76. package/dist/StatusBar.d.cts +39 -0
  77. package/dist/StatusBar.d.ts +39 -0
  78. package/dist/StatusBar.js +3 -0
  79. package/dist/StatusBar.js.map +1 -0
  80. package/dist/Switch.cjs +2 -2
  81. package/dist/Switch.js +1 -1
  82. package/dist/{Table-YKVM42SW.css → Table-2LPTOUIR.css} +1 -1
  83. package/dist/Table.cjs +7 -7
  84. package/dist/Table.js +5 -5
  85. package/dist/Tabs.cjs +3 -3
  86. package/dist/Tabs.js +1 -1
  87. package/dist/Tag.cjs +3 -3
  88. package/dist/Tag.js +1 -1
  89. package/dist/Theme.cjs +10 -10
  90. package/dist/Theme.js +1 -1
  91. package/dist/{Toast-ERHDN3WG.css → Toast-6PVSAXQ5.css} +1 -1
  92. package/dist/Toast.cjs +3 -3
  93. package/dist/Toast.js +1 -1
  94. package/dist/Tooltip.cjs +2 -2
  95. package/dist/Tooltip.js +1 -1
  96. package/dist/Typography.cjs +6 -6
  97. package/dist/Typography.js +1 -1
  98. package/dist/{chunk-5WF6M47X.cjs → chunk-24FAK7QU.cjs} +3 -3
  99. package/dist/{chunk-5WF6M47X.cjs.map → chunk-24FAK7QU.cjs.map} +1 -1
  100. package/dist/{chunk-AJZKESHB.js → chunk-276NALYW.js} +3 -3
  101. package/dist/{chunk-AJZKESHB.js.map → chunk-276NALYW.js.map} +1 -1
  102. package/dist/{chunk-FI7QO3I5.cjs → chunk-33TIL25B.cjs} +3 -3
  103. package/dist/{chunk-FI7QO3I5.cjs.map → chunk-33TIL25B.cjs.map} +1 -1
  104. package/dist/{chunk-RDLPX7RK.cjs → chunk-3HNRKO3M.cjs} +31 -5
  105. package/dist/chunk-3HNRKO3M.cjs.map +1 -0
  106. package/dist/{chunk-GZGZR4FT.js → chunk-3LI6QH2Q.js} +3 -3
  107. package/dist/{chunk-GZGZR4FT.js.map → chunk-3LI6QH2Q.js.map} +1 -1
  108. package/dist/{chunk-NE4YEBFH.js → chunk-3UU2PUK4.js} +4 -4
  109. package/dist/{chunk-NE4YEBFH.js.map → chunk-3UU2PUK4.js.map} +1 -1
  110. package/dist/chunk-47Z4NIU4.js +118 -0
  111. package/dist/chunk-47Z4NIU4.js.map +1 -0
  112. package/dist/{chunk-4U4OY5RA.js → chunk-4SCDDSXY.js} +3 -3
  113. package/dist/{chunk-4U4OY5RA.js.map → chunk-4SCDDSXY.js.map} +1 -1
  114. package/dist/{chunk-NXOAYNG2.cjs → chunk-5BFETKVP.cjs} +3 -3
  115. package/dist/{chunk-NXOAYNG2.cjs.map → chunk-5BFETKVP.cjs.map} +1 -1
  116. package/dist/{chunk-VICGQC6G.cjs → chunk-5EAVXFFD.cjs} +3 -3
  117. package/dist/{chunk-VICGQC6G.cjs.map → chunk-5EAVXFFD.cjs.map} +1 -1
  118. package/dist/{chunk-OYGFMXAA.js → chunk-5N7347MI.js} +3 -3
  119. package/dist/{chunk-OYGFMXAA.js.map → chunk-5N7347MI.js.map} +1 -1
  120. package/dist/{chunk-VJN637MT.js → chunk-5PREWYTB.js} +3 -3
  121. package/dist/{chunk-VJN637MT.js.map → chunk-5PREWYTB.js.map} +1 -1
  122. package/dist/{chunk-77BVQNAQ.js → chunk-5UOBYRYJ.js} +3 -3
  123. package/dist/{chunk-77BVQNAQ.js.map → chunk-5UOBYRYJ.js.map} +1 -1
  124. package/dist/{chunk-BBPNQ44M.js → chunk-6GNFRP2H.js} +3 -3
  125. package/dist/{chunk-BBPNQ44M.js.map → chunk-6GNFRP2H.js.map} +1 -1
  126. package/dist/{chunk-TZSWDH5T.cjs → chunk-7JYI5THC.cjs} +3 -3
  127. package/dist/{chunk-TZSWDH5T.cjs.map → chunk-7JYI5THC.cjs.map} +1 -1
  128. package/dist/chunk-7T2SLRNL.cjs +140 -0
  129. package/dist/chunk-7T2SLRNL.cjs.map +1 -0
  130. package/dist/chunk-7YQWG7HR.cjs +45 -0
  131. package/dist/chunk-7YQWG7HR.cjs.map +1 -0
  132. package/dist/chunk-AGN3JSUH.cjs +209 -0
  133. package/dist/chunk-AGN3JSUH.cjs.map +1 -0
  134. package/dist/{chunk-CCBHZYE6.cjs → chunk-AR4M7QGF.cjs} +7 -7
  135. package/dist/{chunk-CCBHZYE6.cjs.map → chunk-AR4M7QGF.cjs.map} +1 -1
  136. package/dist/{chunk-K7PVJLW4.cjs → chunk-AWLBLRQX.cjs} +5 -5
  137. package/dist/{chunk-K7PVJLW4.cjs.map → chunk-AWLBLRQX.cjs.map} +1 -1
  138. package/dist/{chunk-PBBHUUXU.cjs → chunk-B5JH7NRZ.cjs} +3 -3
  139. package/dist/{chunk-PBBHUUXU.cjs.map → chunk-B5JH7NRZ.cjs.map} +1 -1
  140. package/dist/{chunk-Z5X5AMLA.cjs → chunk-CALRTZZ7.cjs} +3 -3
  141. package/dist/{chunk-Z5X5AMLA.cjs.map → chunk-CALRTZZ7.cjs.map} +1 -1
  142. package/dist/{chunk-H6FCIJOP.js → chunk-DBJIK4JE.js} +3 -3
  143. package/dist/{chunk-H6FCIJOP.js.map → chunk-DBJIK4JE.js.map} +1 -1
  144. package/dist/{chunk-QESLHLTG.cjs → chunk-EHO2JH2L.cjs} +4 -4
  145. package/dist/{chunk-QESLHLTG.cjs.map → chunk-EHO2JH2L.cjs.map} +1 -1
  146. package/dist/{chunk-WNGG25QX.js → chunk-FFZLSY2N.js} +3 -3
  147. package/dist/{chunk-WNGG25QX.js.map → chunk-FFZLSY2N.js.map} +1 -1
  148. package/dist/{chunk-AEJJGUEN.cjs → chunk-GOIQR4OH.cjs} +3 -3
  149. package/dist/{chunk-AEJJGUEN.cjs.map → chunk-GOIQR4OH.cjs.map} +1 -1
  150. package/dist/{chunk-Z7P6QGMT.js → chunk-GR5STMOA.js} +3 -3
  151. package/dist/{chunk-Z7P6QGMT.js.map → chunk-GR5STMOA.js.map} +1 -1
  152. package/dist/{chunk-URF6RBW6.cjs → chunk-HNVRMOL3.cjs} +3 -3
  153. package/dist/{chunk-URF6RBW6.cjs.map → chunk-HNVRMOL3.cjs.map} +1 -1
  154. package/dist/{chunk-RPD2OIIP.js → chunk-I2HHC6QW.js} +4 -4
  155. package/dist/{chunk-RPD2OIIP.js.map → chunk-I2HHC6QW.js.map} +1 -1
  156. package/dist/{chunk-AXMEZGEG.cjs → chunk-IZDJCEMF.cjs} +3 -3
  157. package/dist/{chunk-AXMEZGEG.cjs.map → chunk-IZDJCEMF.cjs.map} +1 -1
  158. package/dist/{chunk-V34OPWKZ.js → chunk-JSDQVVQB.js} +3 -3
  159. package/dist/{chunk-V34OPWKZ.js.map → chunk-JSDQVVQB.js.map} +1 -1
  160. package/dist/{chunk-QTGDYQOT.cjs → chunk-LLNEDEST.cjs} +4 -4
  161. package/dist/{chunk-QTGDYQOT.cjs.map → chunk-LLNEDEST.cjs.map} +1 -1
  162. package/dist/{chunk-C5TGQ7CV.cjs → chunk-MFWOBALK.cjs} +3 -3
  163. package/dist/{chunk-C5TGQ7CV.cjs.map → chunk-MFWOBALK.cjs.map} +1 -1
  164. package/dist/{chunk-LDENBYRC.cjs → chunk-MKR4X57L.cjs} +3 -3
  165. package/dist/{chunk-LDENBYRC.cjs.map → chunk-MKR4X57L.cjs.map} +1 -1
  166. package/dist/{chunk-LSLYY5FN.js → chunk-MTCLJHXU.js} +5 -5
  167. package/dist/{chunk-LSLYY5FN.js.map → chunk-MTCLJHXU.js.map} +1 -1
  168. package/dist/{chunk-JKLQOB2F.cjs → chunk-MUFMJPRT.cjs} +3 -3
  169. package/dist/{chunk-JKLQOB2F.cjs.map → chunk-MUFMJPRT.cjs.map} +1 -1
  170. package/dist/{chunk-OEHCA5IV.js → chunk-NGQDVJH3.js} +4 -4
  171. package/dist/{chunk-OEHCA5IV.js.map → chunk-NGQDVJH3.js.map} +1 -1
  172. package/dist/{chunk-7H453VPW.cjs → chunk-NQQWCIE6.cjs} +3 -3
  173. package/dist/{chunk-7H453VPW.cjs.map → chunk-NQQWCIE6.cjs.map} +1 -1
  174. package/dist/{chunk-ZWP4LSS3.js → chunk-NS3C2ZSE.js} +3 -3
  175. package/dist/{chunk-ZWP4LSS3.js.map → chunk-NS3C2ZSE.js.map} +1 -1
  176. package/dist/{chunk-HKAQILD2.cjs → chunk-O2HMH5BI.cjs} +4 -4
  177. package/dist/{chunk-HKAQILD2.cjs.map → chunk-O2HMH5BI.cjs.map} +1 -1
  178. package/dist/chunk-OWNVDXRQ.js +42 -0
  179. package/dist/chunk-OWNVDXRQ.js.map +1 -0
  180. package/dist/{chunk-3UFU63X7.cjs → chunk-OZVPJWXO.cjs} +3 -3
  181. package/dist/{chunk-3UFU63X7.cjs.map → chunk-OZVPJWXO.cjs.map} +1 -1
  182. package/dist/{chunk-M6CGYGEO.js → chunk-Q2EXOT4B.js} +3 -3
  183. package/dist/{chunk-M6CGYGEO.js.map → chunk-Q2EXOT4B.js.map} +1 -1
  184. package/dist/{chunk-7U6I44RV.cjs → chunk-Q7CDWNM6.cjs} +3 -3
  185. package/dist/{chunk-7U6I44RV.cjs.map → chunk-Q7CDWNM6.cjs.map} +1 -1
  186. package/dist/{chunk-437LB2V4.js → chunk-QJGKI2BD.js} +3 -3
  187. package/dist/{chunk-437LB2V4.js.map → chunk-QJGKI2BD.js.map} +1 -1
  188. package/dist/chunk-RFU5HN4E.js +149 -0
  189. package/dist/chunk-RFU5HN4E.js.map +1 -0
  190. package/dist/{chunk-IKI5CS4L.cjs → chunk-RIDCBNCM.cjs} +4 -4
  191. package/dist/{chunk-IKI5CS4L.cjs.map → chunk-RIDCBNCM.cjs.map} +1 -1
  192. package/dist/{chunk-OPTTHURA.cjs → chunk-RSZNFKCQ.cjs} +3 -3
  193. package/dist/{chunk-OPTTHURA.cjs.map → chunk-RSZNFKCQ.cjs.map} +1 -1
  194. package/dist/{chunk-EPFYIR63.cjs → chunk-RVSWH4RH.cjs} +7 -7
  195. package/dist/{chunk-EPFYIR63.cjs.map → chunk-RVSWH4RH.cjs.map} +1 -1
  196. package/dist/{chunk-TWBJCFEJ.cjs → chunk-SVVB6POY.cjs} +4 -4
  197. package/dist/{chunk-TWBJCFEJ.cjs.map → chunk-SVVB6POY.cjs.map} +1 -1
  198. package/dist/{chunk-QPZZNSRB.js → chunk-TMZVX6NO.js} +4 -4
  199. package/dist/{chunk-QPZZNSRB.js.map → chunk-TMZVX6NO.js.map} +1 -1
  200. package/dist/{chunk-YEOARJKR.cjs → chunk-TQLCIXCK.cjs} +3 -3
  201. package/dist/{chunk-YEOARJKR.cjs.map → chunk-TQLCIXCK.cjs.map} +1 -1
  202. package/dist/{chunk-GIVMKGZN.js → chunk-TY5EAKEI.js} +3 -3
  203. package/dist/{chunk-GIVMKGZN.js.map → chunk-TY5EAKEI.js.map} +1 -1
  204. package/dist/{chunk-4MR4GVTD.js → chunk-U4K7HOMW.js} +31 -5
  205. package/dist/chunk-U4K7HOMW.js.map +1 -0
  206. package/dist/{chunk-IWVKITPN.js → chunk-U5BZ7E3F.js} +3 -3
  207. package/dist/{chunk-IWVKITPN.js.map → chunk-U5BZ7E3F.js.map} +1 -1
  208. package/dist/{chunk-3WAFIUDQ.js → chunk-UQB5OHMO.js} +3 -3
  209. package/dist/{chunk-3WAFIUDQ.js.map → chunk-UQB5OHMO.js.map} +1 -1
  210. package/dist/{chunk-ZVCMXDTP.js → chunk-URLSZPS5.js} +5 -5
  211. package/dist/{chunk-ZVCMXDTP.js.map → chunk-URLSZPS5.js.map} +1 -1
  212. package/dist/{chunk-I7SSCSFH.js → chunk-W6I67HQQ.js} +3 -3
  213. package/dist/{chunk-I7SSCSFH.js.map → chunk-W6I67HQQ.js.map} +1 -1
  214. package/dist/{chunk-NSUD5B22.js → chunk-WBMF7WM3.js} +3 -3
  215. package/dist/{chunk-NSUD5B22.js.map → chunk-WBMF7WM3.js.map} +1 -1
  216. package/dist/{chunk-4GT5TOHP.js → chunk-WDBJVKSR.js} +3 -3
  217. package/dist/{chunk-4GT5TOHP.js.map → chunk-WDBJVKSR.js.map} +1 -1
  218. package/dist/{chunk-TYQ5CN2C.js → chunk-WQFC5EMC.js} +4 -4
  219. package/dist/{chunk-TYQ5CN2C.js.map → chunk-WQFC5EMC.js.map} +1 -1
  220. package/dist/{chunk-SBMOIE5C.cjs → chunk-WREHBIJ5.cjs} +10 -10
  221. package/dist/{chunk-SBMOIE5C.cjs.map → chunk-WREHBIJ5.cjs.map} +1 -1
  222. package/dist/chunk-WZ73TWB2.cjs +174 -0
  223. package/dist/chunk-WZ73TWB2.cjs.map +1 -0
  224. package/dist/chunk-XDFZRV3V.js +184 -0
  225. package/dist/chunk-XDFZRV3V.js.map +1 -0
  226. package/dist/{chunk-F7HW2PYR.cjs → chunk-XUT2Z2L6.cjs} +3 -3
  227. package/dist/{chunk-F7HW2PYR.cjs.map → chunk-XUT2Z2L6.cjs.map} +1 -1
  228. package/dist/{chunk-E6R63QOL.js → chunk-XZ22B3NW.js} +6 -6
  229. package/dist/{chunk-E6R63QOL.js.map → chunk-XZ22B3NW.js.map} +1 -1
  230. package/dist/{chunk-K5MHL732.js → chunk-YXKJOPYT.js} +4 -4
  231. package/dist/{chunk-K5MHL732.js.map → chunk-YXKJOPYT.js.map} +1 -1
  232. package/dist/{chunk-IDM6JJLP.cjs → chunk-YZ2I7CDF.cjs} +3 -3
  233. package/dist/{chunk-IDM6JJLP.cjs.map → chunk-YZ2I7CDF.cjs.map} +1 -1
  234. package/dist/index.cjs +142 -118
  235. package/dist/index.cjs.map +1 -1
  236. package/dist/index.d.cts +5 -1
  237. package/dist/index.d.ts +5 -1
  238. package/dist/index.js +35 -31
  239. package/dist/index.js.map +1 -1
  240. package/dist/styles.css +25 -18
  241. package/dist/{tokens-HWQ7KWPG.css → tokens-BIIUTPKN.css} +17 -9
  242. package/dist/tokens.css +17 -9
  243. package/docs/llms/commandpalette.md +58 -0
  244. package/docs/llms/contextmenu.md +55 -0
  245. package/docs/llms/splitter.md +63 -0
  246. package/docs/llms/statusbar.md +53 -0
  247. package/docs/llms.md +5 -1
  248. package/package.json +1 -1
  249. package/dist/chunk-4MR4GVTD.js.map +0 -1
  250. package/dist/chunk-RDLPX7RK.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Typography/Typography.tsx"],"names":["React","Icon","jsx","jsxs"],"mappings":"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","file":"chunk-5WF6M47X.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Typography.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\n/* ============================================================================\n * Shared types\n * ========================================================================== */\n\nexport type TypographyType = \"secondary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface CopyableConfig {\n /** Text to copy. Defaults to the rendered children string. */\n text?: string;\n /** Fired after a successful copy. */\n onCopy?: (event: React.MouseEvent<HTMLSpanElement>) => void;\n /** Custom icons `[default, copied]`. */\n icon?: [React.ReactNode, React.ReactNode];\n /** Custom tooltip text `[default, copied]`. Pass `false` to disable. */\n tooltips?: [React.ReactNode, React.ReactNode] | false;\n /** Format/MIME hint when calling `navigator.clipboard.write` is not used. */\n format?: \"text/plain\" | \"text/html\";\n}\n\nexport interface EditableConfig {\n /** Controlled editing flag. Omit for uncontrolled (click icon to start). */\n editing?: boolean;\n /** Text shown in the editor; falls back to `children` string. */\n text?: string;\n /** Fired with the new value when the user confirms. */\n onChange?: (value: string) => void;\n /** Fired when the user cancels (Escape or blur without confirm). */\n onCancel?: () => void;\n /** Fired when editing starts. */\n onStart?: () => void;\n /** Fired when editing ends (regardless of save/cancel). */\n onEnd?: () => void;\n /** Maximum input length. */\n maxLength?: number;\n /** Auto resize textarea. `true` = autosize; or pass row bounds. */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** What triggers entering edit mode. Defaults to `[\"icon\"]`. */\n triggerType?: Array<\"icon\" | \"text\">;\n /** Override the edit icon. */\n icon?: React.ReactNode;\n /** Tooltip text on the trigger icon. Pass `false` to disable. */\n tooltip?: React.ReactNode | false;\n /** Use a single-line input instead of textarea. */\n enterIcon?: React.ReactNode;\n}\n\nexport interface EllipsisConfig {\n /** Number of rows to clamp at. Defaults to 1. */\n rows?: number;\n /** Show an \"Expand\" affordance after clamping. */\n expandable?: boolean;\n /** Custom expand-button label. */\n symbol?: React.ReactNode;\n /** Fired on expand. */\n onExpand?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Show full text in a `title` attribute. */\n tooltip?: boolean | React.ReactNode;\n /** Optional suffix that should always remain visible (e.g. an em-dash author). */\n suffix?: string;\n}\n\nexport interface BaseTypographyProps {\n /** Semantic color. */\n type?: TypographyType;\n /** Render disabled (muted + not selectable). */\n disabled?: boolean;\n /** Highlight with mark background. */\n mark?: boolean;\n /** Render as inline `<code>`. */\n code?: boolean;\n /** Render as keyboard key `<kbd>`. */\n keyboard?: boolean;\n /** Underline. */\n underline?: boolean;\n /** Strikethrough. */\n delete?: boolean;\n /** Bold. */\n strong?: boolean;\n /** Italic. */\n italic?: boolean;\n /** Add a copy button. Pass an object to customize. */\n copyable?: boolean | CopyableConfig;\n /** Add an edit button. Pass an object to customize. */\n editable?: boolean | EditableConfig;\n /** Truncate to N rows with optional expand affordance. */\n ellipsis?: boolean | EllipsisConfig;\n /** Extra class names. */\n className?: string;\n /** Inline style. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/* ============================================================================\n * Internals\n * ========================================================================== */\n\nfunction toText(node: React.ReactNode): string {\n if (node == null || node === false) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(toText).join(\"\");\n if (React.isValidElement(node)) {\n const props = node.props as { children?: React.ReactNode };\n return toText(props.children);\n }\n return \"\";\n}\n\nfunction buildClass(props: BaseTypographyProps, base: string, extra?: string) {\n return [\n base,\n props.type,\n props.disabled && \"disabled\",\n props.mark && \"mark\",\n props.code && \"code\",\n props.keyboard && \"kbd\",\n props.underline && \"underline\",\n props.delete && \"del\",\n props.strong && \"strong\",\n props.italic && \"italic\",\n extra,\n props.className,\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\n/* ---------- Copy button ---------- */\n\nconst CopyAction: React.FC<{\n config: CopyableConfig;\n fallbackText: string;\n}> = ({ config, fallbackText }) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleCopy = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.stopPropagation();\n const text = config.text ?? fallbackText;\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).catch(() => {\n /* swallow — user-visible feedback is already minimal */\n });\n }\n config.onCopy?.(event);\n setCopied(true);\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => setCopied(false), 2400);\n };\n\n const [defIcon, doneIcon] = config.icon ?? [\n <Icon key=\"def\" name=\"copy\" size={12} />,\n <Icon key=\"done\" name=\"check\" size={12} />,\n ];\n const tipText =\n config.tooltips === false\n ? undefined\n : Array.isArray(config.tooltips)\n ? copied\n ? config.tooltips[1]\n : config.tooltips[0]\n : copied\n ? \"已复制\"\n : \"复制\";\n\n return (\n <span\n role=\"button\"\n aria-label={typeof tipText === \"string\" ? tipText : \"Copy\"}\n tabIndex={0}\n title={typeof tipText === \"string\" ? tipText : undefined}\n onClick={handleCopy}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleCopy(e as unknown as React.MouseEvent<HTMLSpanElement>);\n }\n }}\n className={`typo-action typo-copy ${copied ? \"copied\" : \"\"}`}\n >\n {copied ? doneIcon : defIcon}\n </span>\n );\n};\n\n/* ---------- Edit affordance + inline editor ---------- */\n\nconst EditableEditor: React.FC<{\n initial: string;\n multiline: boolean;\n maxLength?: number;\n autoSize?: EditableConfig[\"autoSize\"];\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}> = ({ initial, multiline, maxLength, autoSize, onConfirm, onCancel }) => {\n const [value, setValue] = React.useState(initial);\n const ref = React.useRef<HTMLTextAreaElement | HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (el) {\n el.focus();\n const len = el.value.length;\n el.setSelectionRange(len, len);\n }\n }, []);\n\n const resize = React.useCallback(() => {\n const el = ref.current as HTMLTextAreaElement | null;\n if (!el || !multiline || !autoSize) return;\n el.style.height = \"auto\";\n const computed = window.getComputedStyle(el);\n const lineHeight = parseFloat(computed.lineHeight) || 20;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n const bounds = typeof autoSize === \"object\" ? autoSize : {};\n const min = (bounds.minRows ?? 1) * lineHeight + padding;\n const max = bounds.maxRows ? bounds.maxRows * lineHeight + padding : Infinity;\n const next = Math.min(Math.max(el.scrollHeight, min), max);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [autoSize, multiline]);\n\n React.useEffect(() => {\n resize();\n }, [value, resize]);\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n return;\n }\n if (e.key === \"Enter\" && (!multiline || (e.metaKey || e.ctrlKey))) {\n e.preventDefault();\n onConfirm(value);\n }\n };\n\n const common = {\n ref: ref as never,\n value,\n maxLength,\n className: \"typo-editor\",\n onChange: (\n e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => setValue(e.target.value),\n onBlur: () => onConfirm(value),\n onKeyDown: handleKeyDown,\n } as const;\n\n return multiline ? (\n <textarea rows={1} {...common} />\n ) : (\n <input type=\"text\" {...common} />\n );\n};\n\n/* ============================================================================\n * Hook: shared rendering body\n * ========================================================================== */\n\ninterface RenderableProps extends BaseTypographyProps {\n ellipsisRows?: number;\n multilineEdit?: boolean;\n}\n\nfunction useTypographyBody(props: RenderableProps) {\n const fallbackText = React.useMemo(\n () => toText(props.children),\n [props.children]\n );\n\n /* ---- editable state ---- */\n const editable = props.editable;\n const editConf: EditableConfig =\n editable && typeof editable === \"object\" ? editable : {};\n const triggers = editConf.triggerType ?? [\"icon\"];\n const isControlledEdit = editConf.editing != null;\n const [editingState, setEditingState] = React.useState(false);\n const editing = isControlledEdit ? editConf.editing! : editingState;\n\n const startEdit = () => {\n editConf.onStart?.();\n if (!isControlledEdit) setEditingState(true);\n };\n const endEdit = () => {\n editConf.onEnd?.();\n if (!isControlledEdit) setEditingState(false);\n };\n const handleConfirm = (value: string) => {\n if (value !== (editConf.text ?? fallbackText)) editConf.onChange?.(value);\n endEdit();\n };\n const handleCancel = () => {\n editConf.onCancel?.();\n endEdit();\n };\n\n /* ---- ellipsis state ---- */\n const ellipsis = props.ellipsis;\n const ellConf: EllipsisConfig =\n ellipsis && typeof ellipsis === \"object\" ? ellipsis : {};\n const rows = ellConf.rows ?? props.ellipsisRows ?? 1;\n const wantClamp = !!ellipsis;\n const [expanded, setExpanded] = React.useState(false);\n\n /* ---- content ---- */\n let inner: React.ReactNode = props.children;\n\n if (props.code) inner = <code>{inner}</code>;\n if (props.keyboard) inner = <kbd>{inner}</kbd>;\n if (props.mark) inner = <mark>{inner}</mark>;\n if (props.delete) inner = <del>{inner}</del>;\n if (props.underline) inner = <u>{inner}</u>;\n if (props.strong) inner = <strong>{inner}</strong>;\n if (props.italic) inner = <i>{inner}</i>;\n\n /* ---- copy node ---- */\n let copyNode: React.ReactNode = null;\n if (props.copyable) {\n const conf =\n typeof props.copyable === \"object\" ? props.copyable : ({} as CopyableConfig);\n copyNode = <CopyAction config={conf} fallbackText={fallbackText} />;\n }\n\n /* ---- edit node ---- */\n let editIconNode: React.ReactNode = null;\n if (editable) {\n const tip = editConf.tooltip ?? \"编辑\";\n editIconNode = (\n <span\n role=\"button\"\n aria-label={typeof tip === \"string\" ? tip : \"Edit\"}\n tabIndex={0}\n title={typeof tip === \"string\" && tip !== \"\" ? tip : undefined}\n onClick={(e) => {\n e.stopPropagation();\n startEdit();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n startEdit();\n }\n }}\n className=\"typo-action typo-edit\"\n >\n {editConf.icon ?? <Icon name=\"edit\" size={12} />}\n </span>\n );\n }\n\n /* ---- text-trigger edit ---- */\n if (editable && triggers.includes(\"text\") && !editing) {\n inner = (\n <span\n className=\"typo-edit-text-trigger\"\n onClick={() => startEdit()}\n >\n {inner}\n </span>\n );\n }\n\n /* ---- clamp / expand ---- */\n let style: React.CSSProperties | undefined = props.style;\n let extraCls: string | undefined;\n if (wantClamp && !expanded) {\n extraCls = rows > 1 ? \"ellipsis-multi\" : \"ellipsis\";\n if (rows > 1) {\n style = {\n ...style,\n WebkitLineClamp: rows,\n } as React.CSSProperties;\n }\n }\n\n let expandNode: React.ReactNode = null;\n if (wantClamp && ellConf.expandable && !expanded) {\n expandNode = (\n <a\n className=\"typo-expand\"\n onClick={(e) => {\n ellConf.onExpand?.(e);\n setExpanded(true);\n }}\n >\n {ellConf.symbol ?? \"展开\"}\n </a>\n );\n }\n\n /* ---- title attribute fallback ---- */\n const titleAttr =\n wantClamp && ellConf.tooltip\n ? typeof ellConf.tooltip === \"string\"\n ? ellConf.tooltip\n : fallbackText\n : undefined;\n\n return {\n editing,\n editConf,\n fallbackText,\n handleConfirm,\n handleCancel,\n inner,\n copyNode,\n editIconNode,\n expandNode,\n style,\n extraCls,\n titleAttr,\n };\n}\n\n/* ============================================================================\n * Title (h1–h5)\n * ========================================================================== */\n\nexport type TitleLevel = 1 | 2 | 3 | 4 | 5;\n\nexport interface TitleProps extends BaseTypographyProps {\n /** Heading level — 1..5. Defaults to 1. */\n level?: TitleLevel;\n}\n\n/**\n * `Typography.Title` — semantic heading.\n *\n * @example\n * <Title level={2} copyable>章节标题</Title>\n */\nexport const Title = React.forwardRef<HTMLElement, TitleProps>((props, ref) => {\n const { level = 1, ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = (`h${level}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nTitle.displayName = \"Typography.Title\";\n\n/* ============================================================================\n * Text — inline span\n * ========================================================================== */\n\nexport interface TextProps extends BaseTypographyProps {\n /** Force the rendered tag (default `<span>`). */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * `Typography.Text` — inline text with semantic / decorative variants.\n *\n * @example\n * <Text type=\"success\" strong>成功</Text>\n * <Text code>npm install</Text>\n * <Text copyable>可复制内容</Text>\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>((props, ref) => {\n const { as = \"span\", ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = as as \"span\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nText.displayName = \"Typography.Text\";\n\n/* ============================================================================\n * Paragraph — block <p>\n * ========================================================================== */\n\nexport interface ParagraphProps extends BaseTypographyProps {}\n\n/**\n * `Typography.Paragraph` — block paragraph with the same decorations as `Text`.\n *\n * @example\n * <Paragraph ellipsis={{ rows: 3, expandable: true }}>{long}</Paragraph>\n */\nexport const Paragraph = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n (props, ref) => {\n const body = useTypographyBody({ ...props, multilineEdit: true });\n\n if (body.editing) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n className={buildClass(props, \"typo typo-paragraph\", \"editing\")}\n style={props.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize ?? true}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </div>\n );\n }\n\n return (\n <p\n ref={ref}\n className={buildClass(props, \"typo typo-paragraph\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </p>\n );\n }\n);\nParagraph.displayName = \"Typography.Paragraph\";\n\n/* ============================================================================\n * Link — anchor\n * ========================================================================== */\n\nexport interface LinkProps\n extends BaseTypographyProps,\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof BaseTypographyProps | \"type\"\n > {\n href?: string;\n /** Add the leading external icon. */\n external?: boolean;\n /** Override the external icon. */\n externalIcon?: IconName;\n}\n\n/**\n * `Typography.Link` — styled `<a>` that participates in the same decoration\n * system as `Text`. Adds a small `arrow` for `external` links.\n *\n * @example\n * <Link href=\"https://example.com\" external>外部链接</Link>\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n (props, ref) => {\n const {\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n external,\n externalIcon = \"arrowRight\",\n target,\n rel,\n ...anchorRest\n } = props;\n const body = useTypographyBody({\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n });\n\n const safeRel =\n target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel;\n\n if (body.editing) {\n return (\n <span\n className={buildClass(props, \"typo typo-link\", \"editing\")}\n style={style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </span>\n );\n }\n\n return (\n <a\n ref={ref}\n className={buildClass(props, \"typo typo-link\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n target={target}\n rel={safeRel}\n aria-disabled={disabled || undefined}\n onClick={(e) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n anchorRest.onClick?.(e);\n }}\n {...anchorRest}\n >\n {body.inner}\n {external && (\n <span className=\"typo-link-ext\" aria-hidden>\n <Icon name={externalIcon} size={12} />\n </span>\n )}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </a>\n );\n }\n);\nLink.displayName = \"Typography.Link\";\n\n/* ============================================================================\n * Typography wrapper (article-style block)\n * ========================================================================== */\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n}\n\ninterface TypographyComponent\n extends React.ForwardRefExoticComponent<\n TypographyProps & React.RefAttributes<HTMLDivElement>\n > {\n Title: typeof Title;\n Text: typeof Text;\n Paragraph: typeof Paragraph;\n Link: typeof Link;\n}\n\n/**\n * `Typography` — optional article-style wrapper that applies consistent\n * vertical rhythm to its `Title` / `Paragraph` / `Text` / `Link` children.\n *\n * @example\n * <Typography>\n * <Typography.Title level={2}>标题</Typography.Title>\n * <Typography.Paragraph>段落…</Typography.Paragraph>\n * </Typography>\n */\nconst TypographyBase = React.forwardRef<HTMLDivElement, TypographyProps>(\n ({ className = \"\", children, ...rest }, ref) => (\n <article\n ref={ref as unknown as React.Ref<HTMLElement>}\n className={`typo-root ${className}`}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n >\n {children}\n </article>\n )\n) as unknown as TypographyComponent;\n\nTypographyBase.Title = Title;\nTypographyBase.Text = Text;\nTypographyBase.Paragraph = Paragraph;\nTypographyBase.Link = Link;\n(TypographyBase as React.ForwardRefExoticComponent<unknown>).displayName =\n \"Typography\";\n\nexport const Typography = TypographyBase;\n"]}
1
+ {"version":3,"sources":["../src/components/Typography/Typography.tsx"],"names":["React","Icon","jsx","jsxs"],"mappings":"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","file":"chunk-24FAK7QU.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Typography.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\n/* ============================================================================\n * Shared types\n * ========================================================================== */\n\nexport type TypographyType = \"secondary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface CopyableConfig {\n /** Text to copy. Defaults to the rendered children string. */\n text?: string;\n /** Fired after a successful copy. */\n onCopy?: (event: React.MouseEvent<HTMLSpanElement>) => void;\n /** Custom icons `[default, copied]`. */\n icon?: [React.ReactNode, React.ReactNode];\n /** Custom tooltip text `[default, copied]`. Pass `false` to disable. */\n tooltips?: [React.ReactNode, React.ReactNode] | false;\n /** Format/MIME hint when calling `navigator.clipboard.write` is not used. */\n format?: \"text/plain\" | \"text/html\";\n}\n\nexport interface EditableConfig {\n /** Controlled editing flag. Omit for uncontrolled (click icon to start). */\n editing?: boolean;\n /** Text shown in the editor; falls back to `children` string. */\n text?: string;\n /** Fired with the new value when the user confirms. */\n onChange?: (value: string) => void;\n /** Fired when the user cancels (Escape or blur without confirm). */\n onCancel?: () => void;\n /** Fired when editing starts. */\n onStart?: () => void;\n /** Fired when editing ends (regardless of save/cancel). */\n onEnd?: () => void;\n /** Maximum input length. */\n maxLength?: number;\n /** Auto resize textarea. `true` = autosize; or pass row bounds. */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** What triggers entering edit mode. Defaults to `[\"icon\"]`. */\n triggerType?: Array<\"icon\" | \"text\">;\n /** Override the edit icon. */\n icon?: React.ReactNode;\n /** Tooltip text on the trigger icon. Pass `false` to disable. */\n tooltip?: React.ReactNode | false;\n /** Use a single-line input instead of textarea. */\n enterIcon?: React.ReactNode;\n}\n\nexport interface EllipsisConfig {\n /** Number of rows to clamp at. Defaults to 1. */\n rows?: number;\n /** Show an \"Expand\" affordance after clamping. */\n expandable?: boolean;\n /** Custom expand-button label. */\n symbol?: React.ReactNode;\n /** Fired on expand. */\n onExpand?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Show full text in a `title` attribute. */\n tooltip?: boolean | React.ReactNode;\n /** Optional suffix that should always remain visible (e.g. an em-dash author). */\n suffix?: string;\n}\n\nexport interface BaseTypographyProps {\n /** Semantic color. */\n type?: TypographyType;\n /** Render disabled (muted + not selectable). */\n disabled?: boolean;\n /** Highlight with mark background. */\n mark?: boolean;\n /** Render as inline `<code>`. */\n code?: boolean;\n /** Render as keyboard key `<kbd>`. */\n keyboard?: boolean;\n /** Underline. */\n underline?: boolean;\n /** Strikethrough. */\n delete?: boolean;\n /** Bold. */\n strong?: boolean;\n /** Italic. */\n italic?: boolean;\n /** Add a copy button. Pass an object to customize. */\n copyable?: boolean | CopyableConfig;\n /** Add an edit button. Pass an object to customize. */\n editable?: boolean | EditableConfig;\n /** Truncate to N rows with optional expand affordance. */\n ellipsis?: boolean | EllipsisConfig;\n /** Extra class names. */\n className?: string;\n /** Inline style. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/* ============================================================================\n * Internals\n * ========================================================================== */\n\nfunction toText(node: React.ReactNode): string {\n if (node == null || node === false) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(toText).join(\"\");\n if (React.isValidElement(node)) {\n const props = node.props as { children?: React.ReactNode };\n return toText(props.children);\n }\n return \"\";\n}\n\nfunction buildClass(props: BaseTypographyProps, base: string, extra?: string) {\n return [\n base,\n props.type,\n props.disabled && \"disabled\",\n props.mark && \"mark\",\n props.code && \"code\",\n props.keyboard && \"kbd\",\n props.underline && \"underline\",\n props.delete && \"del\",\n props.strong && \"strong\",\n props.italic && \"italic\",\n extra,\n props.className,\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\n/* ---------- Copy button ---------- */\n\nconst CopyAction: React.FC<{\n config: CopyableConfig;\n fallbackText: string;\n}> = ({ config, fallbackText }) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleCopy = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.stopPropagation();\n const text = config.text ?? fallbackText;\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).catch(() => {\n /* swallow — user-visible feedback is already minimal */\n });\n }\n config.onCopy?.(event);\n setCopied(true);\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => setCopied(false), 2400);\n };\n\n const [defIcon, doneIcon] = config.icon ?? [\n <Icon key=\"def\" name=\"copy\" size={12} />,\n <Icon key=\"done\" name=\"check\" size={12} />,\n ];\n const tipText =\n config.tooltips === false\n ? undefined\n : Array.isArray(config.tooltips)\n ? copied\n ? config.tooltips[1]\n : config.tooltips[0]\n : copied\n ? \"已复制\"\n : \"复制\";\n\n return (\n <span\n role=\"button\"\n aria-label={typeof tipText === \"string\" ? tipText : \"Copy\"}\n tabIndex={0}\n title={typeof tipText === \"string\" ? tipText : undefined}\n onClick={handleCopy}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleCopy(e as unknown as React.MouseEvent<HTMLSpanElement>);\n }\n }}\n className={`typo-action typo-copy ${copied ? \"copied\" : \"\"}`}\n >\n {copied ? doneIcon : defIcon}\n </span>\n );\n};\n\n/* ---------- Edit affordance + inline editor ---------- */\n\nconst EditableEditor: React.FC<{\n initial: string;\n multiline: boolean;\n maxLength?: number;\n autoSize?: EditableConfig[\"autoSize\"];\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}> = ({ initial, multiline, maxLength, autoSize, onConfirm, onCancel }) => {\n const [value, setValue] = React.useState(initial);\n const ref = React.useRef<HTMLTextAreaElement | HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (el) {\n el.focus();\n const len = el.value.length;\n el.setSelectionRange(len, len);\n }\n }, []);\n\n const resize = React.useCallback(() => {\n const el = ref.current as HTMLTextAreaElement | null;\n if (!el || !multiline || !autoSize) return;\n el.style.height = \"auto\";\n const computed = window.getComputedStyle(el);\n const lineHeight = parseFloat(computed.lineHeight) || 20;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n const bounds = typeof autoSize === \"object\" ? autoSize : {};\n const min = (bounds.minRows ?? 1) * lineHeight + padding;\n const max = bounds.maxRows ? bounds.maxRows * lineHeight + padding : Infinity;\n const next = Math.min(Math.max(el.scrollHeight, min), max);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [autoSize, multiline]);\n\n React.useEffect(() => {\n resize();\n }, [value, resize]);\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n return;\n }\n if (e.key === \"Enter\" && (!multiline || (e.metaKey || e.ctrlKey))) {\n e.preventDefault();\n onConfirm(value);\n }\n };\n\n const common = {\n ref: ref as never,\n value,\n maxLength,\n className: \"typo-editor\",\n onChange: (\n e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => setValue(e.target.value),\n onBlur: () => onConfirm(value),\n onKeyDown: handleKeyDown,\n } as const;\n\n return multiline ? (\n <textarea rows={1} {...common} />\n ) : (\n <input type=\"text\" {...common} />\n );\n};\n\n/* ============================================================================\n * Hook: shared rendering body\n * ========================================================================== */\n\ninterface RenderableProps extends BaseTypographyProps {\n ellipsisRows?: number;\n multilineEdit?: boolean;\n}\n\nfunction useTypographyBody(props: RenderableProps) {\n const fallbackText = React.useMemo(\n () => toText(props.children),\n [props.children]\n );\n\n /* ---- editable state ---- */\n const editable = props.editable;\n const editConf: EditableConfig =\n editable && typeof editable === \"object\" ? editable : {};\n const triggers = editConf.triggerType ?? [\"icon\"];\n const isControlledEdit = editConf.editing != null;\n const [editingState, setEditingState] = React.useState(false);\n const editing = isControlledEdit ? editConf.editing! : editingState;\n\n const startEdit = () => {\n editConf.onStart?.();\n if (!isControlledEdit) setEditingState(true);\n };\n const endEdit = () => {\n editConf.onEnd?.();\n if (!isControlledEdit) setEditingState(false);\n };\n const handleConfirm = (value: string) => {\n if (value !== (editConf.text ?? fallbackText)) editConf.onChange?.(value);\n endEdit();\n };\n const handleCancel = () => {\n editConf.onCancel?.();\n endEdit();\n };\n\n /* ---- ellipsis state ---- */\n const ellipsis = props.ellipsis;\n const ellConf: EllipsisConfig =\n ellipsis && typeof ellipsis === \"object\" ? ellipsis : {};\n const rows = ellConf.rows ?? props.ellipsisRows ?? 1;\n const wantClamp = !!ellipsis;\n const [expanded, setExpanded] = React.useState(false);\n\n /* ---- content ---- */\n let inner: React.ReactNode = props.children;\n\n if (props.code) inner = <code>{inner}</code>;\n if (props.keyboard) inner = <kbd>{inner}</kbd>;\n if (props.mark) inner = <mark>{inner}</mark>;\n if (props.delete) inner = <del>{inner}</del>;\n if (props.underline) inner = <u>{inner}</u>;\n if (props.strong) inner = <strong>{inner}</strong>;\n if (props.italic) inner = <i>{inner}</i>;\n\n /* ---- copy node ---- */\n let copyNode: React.ReactNode = null;\n if (props.copyable) {\n const conf =\n typeof props.copyable === \"object\" ? props.copyable : ({} as CopyableConfig);\n copyNode = <CopyAction config={conf} fallbackText={fallbackText} />;\n }\n\n /* ---- edit node ---- */\n let editIconNode: React.ReactNode = null;\n if (editable) {\n const tip = editConf.tooltip ?? \"编辑\";\n editIconNode = (\n <span\n role=\"button\"\n aria-label={typeof tip === \"string\" ? tip : \"Edit\"}\n tabIndex={0}\n title={typeof tip === \"string\" && tip !== \"\" ? tip : undefined}\n onClick={(e) => {\n e.stopPropagation();\n startEdit();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n startEdit();\n }\n }}\n className=\"typo-action typo-edit\"\n >\n {editConf.icon ?? <Icon name=\"edit\" size={12} />}\n </span>\n );\n }\n\n /* ---- text-trigger edit ---- */\n if (editable && triggers.includes(\"text\") && !editing) {\n inner = (\n <span\n className=\"typo-edit-text-trigger\"\n onClick={() => startEdit()}\n >\n {inner}\n </span>\n );\n }\n\n /* ---- clamp / expand ---- */\n let style: React.CSSProperties | undefined = props.style;\n let extraCls: string | undefined;\n if (wantClamp && !expanded) {\n extraCls = rows > 1 ? \"ellipsis-multi\" : \"ellipsis\";\n if (rows > 1) {\n style = {\n ...style,\n WebkitLineClamp: rows,\n } as React.CSSProperties;\n }\n }\n\n let expandNode: React.ReactNode = null;\n if (wantClamp && ellConf.expandable && !expanded) {\n expandNode = (\n <a\n className=\"typo-expand\"\n onClick={(e) => {\n ellConf.onExpand?.(e);\n setExpanded(true);\n }}\n >\n {ellConf.symbol ?? \"展开\"}\n </a>\n );\n }\n\n /* ---- title attribute fallback ---- */\n const titleAttr =\n wantClamp && ellConf.tooltip\n ? typeof ellConf.tooltip === \"string\"\n ? ellConf.tooltip\n : fallbackText\n : undefined;\n\n return {\n editing,\n editConf,\n fallbackText,\n handleConfirm,\n handleCancel,\n inner,\n copyNode,\n editIconNode,\n expandNode,\n style,\n extraCls,\n titleAttr,\n };\n}\n\n/* ============================================================================\n * Title (h1–h5)\n * ========================================================================== */\n\nexport type TitleLevel = 1 | 2 | 3 | 4 | 5;\n\nexport interface TitleProps extends BaseTypographyProps {\n /** Heading level — 1..5. Defaults to 1. */\n level?: TitleLevel;\n}\n\n/**\n * `Typography.Title` — semantic heading.\n *\n * @example\n * <Title level={2} copyable>章节标题</Title>\n */\nexport const Title = React.forwardRef<HTMLElement, TitleProps>((props, ref) => {\n const { level = 1, ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = (`h${level}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nTitle.displayName = \"Typography.Title\";\n\n/* ============================================================================\n * Text — inline span\n * ========================================================================== */\n\nexport interface TextProps extends BaseTypographyProps {\n /** Force the rendered tag (default `<span>`). */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * `Typography.Text` — inline text with semantic / decorative variants.\n *\n * @example\n * <Text type=\"success\" strong>成功</Text>\n * <Text code>npm install</Text>\n * <Text copyable>可复制内容</Text>\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>((props, ref) => {\n const { as = \"span\", ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = as as \"span\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nText.displayName = \"Typography.Text\";\n\n/* ============================================================================\n * Paragraph — block <p>\n * ========================================================================== */\n\nexport interface ParagraphProps extends BaseTypographyProps {}\n\n/**\n * `Typography.Paragraph` — block paragraph with the same decorations as `Text`.\n *\n * @example\n * <Paragraph ellipsis={{ rows: 3, expandable: true }}>{long}</Paragraph>\n */\nexport const Paragraph = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n (props, ref) => {\n const body = useTypographyBody({ ...props, multilineEdit: true });\n\n if (body.editing) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n className={buildClass(props, \"typo typo-paragraph\", \"editing\")}\n style={props.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize ?? true}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </div>\n );\n }\n\n return (\n <p\n ref={ref}\n className={buildClass(props, \"typo typo-paragraph\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </p>\n );\n }\n);\nParagraph.displayName = \"Typography.Paragraph\";\n\n/* ============================================================================\n * Link — anchor\n * ========================================================================== */\n\nexport interface LinkProps\n extends BaseTypographyProps,\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof BaseTypographyProps | \"type\"\n > {\n href?: string;\n /** Add the leading external icon. */\n external?: boolean;\n /** Override the external icon. */\n externalIcon?: IconName;\n}\n\n/**\n * `Typography.Link` — styled `<a>` that participates in the same decoration\n * system as `Text`. Adds a small `arrow` for `external` links.\n *\n * @example\n * <Link href=\"https://example.com\" external>外部链接</Link>\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n (props, ref) => {\n const {\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n external,\n externalIcon = \"arrowRight\",\n target,\n rel,\n ...anchorRest\n } = props;\n const body = useTypographyBody({\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n });\n\n const safeRel =\n target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel;\n\n if (body.editing) {\n return (\n <span\n className={buildClass(props, \"typo typo-link\", \"editing\")}\n style={style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </span>\n );\n }\n\n return (\n <a\n ref={ref}\n className={buildClass(props, \"typo typo-link\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n target={target}\n rel={safeRel}\n aria-disabled={disabled || undefined}\n onClick={(e) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n anchorRest.onClick?.(e);\n }}\n {...anchorRest}\n >\n {body.inner}\n {external && (\n <span className=\"typo-link-ext\" aria-hidden>\n <Icon name={externalIcon} size={12} />\n </span>\n )}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </a>\n );\n }\n);\nLink.displayName = \"Typography.Link\";\n\n/* ============================================================================\n * Typography wrapper (article-style block)\n * ========================================================================== */\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n}\n\ninterface TypographyComponent\n extends React.ForwardRefExoticComponent<\n TypographyProps & React.RefAttributes<HTMLDivElement>\n > {\n Title: typeof Title;\n Text: typeof Text;\n Paragraph: typeof Paragraph;\n Link: typeof Link;\n}\n\n/**\n * `Typography` — optional article-style wrapper that applies consistent\n * vertical rhythm to its `Title` / `Paragraph` / `Text` / `Link` children.\n *\n * @example\n * <Typography>\n * <Typography.Title level={2}>标题</Typography.Title>\n * <Typography.Paragraph>段落…</Typography.Paragraph>\n * </Typography>\n */\nconst TypographyBase = React.forwardRef<HTMLDivElement, TypographyProps>(\n ({ className = \"\", children, ...rest }, ref) => (\n <article\n ref={ref as unknown as React.Ref<HTMLElement>}\n className={`typo-root ${className}`}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n >\n {children}\n </article>\n )\n) as unknown as TypographyComponent;\n\nTypographyBase.Title = Title;\nTypographyBase.Text = Text;\nTypographyBase.Paragraph = Paragraph;\nTypographyBase.Link = Link;\n(TypographyBase as React.ForwardRefExoticComponent<unknown>).displayName =\n \"Typography\";\n\nexport const Typography = TypographyBase;\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Icon } from './chunk-GEYMWUW6.js';
2
- import './tokens-HWQ7KWPG.css';
2
+ import './tokens-BIIUTPKN.css';
3
3
  import './shared-NJHRNLRH.css';
4
4
  import './Tag-FGDY3W7E.css';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -58,5 +58,5 @@ var Badge = ({
58
58
  };
59
59
 
60
60
  export { Badge, Tag };
61
- //# sourceMappingURL=chunk-AJZKESHB.js.map
62
- //# sourceMappingURL=chunk-AJZKESHB.js.map
61
+ //# sourceMappingURL=chunk-276NALYW.js.map
62
+ //# sourceMappingURL=chunk-276NALYW.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Tag/Tag.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,MAA0B,CAAC;AAAA,EACtC,IAAA,GAAO,SAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,IAAS,OAAA;AAAA,IACT,CAAC,QAAA,IAAY,CAAC,KAAA,IAAS,YAAA;AAAA,IACvB;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAM,GAAG,IAAA,EACvB,QAAA,EAAA;AAAA,IAAA,GAAA,oBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,CAAA;AAAA,IAC7B,IAAA,wBAAS,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,IACxD,QAAA;AAAA,IACA,SAAA,oBACC,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,QAAA;AAAA,QACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,IAAW;AAAA,QACb,CAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,GAAA,EAEJ,CAAA;AAEJ;AAYO,IAAM,QAA8B,CAAC;AAAA,EAC1C,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,IAAA,GAAO,GAAA,IAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,GAAQ,CAAA;AAC1D,EAAA,4BACG,MAAA,EAAA,EAAK,SAAA,EAAW,cAAc,SAAS,CAAA,CAAA,EAAK,GAAG,IAAA,EAC7C,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,GAAA,GAAM,KAAA,GAAQ,EAAE,IAC/C,QAAA,EAAA,CAAC,GAAA,KAAQ,KAAA,GAAS,EAAA,GAAK,QAAQ,KAAA,CAAA,EAClC;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-AJZKESHB.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Tag.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport type TagTone = \"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: TagTone;\n solid?: boolean;\n /** Render a leading colored dot. */\n dot?: boolean;\n /** Leading icon (uses the built-in `Icon` component). */\n icon?: IconName;\n /** Show a close button. */\n removable?: boolean;\n onRemove?: () => void;\n /** Whether to render the tag outline/flat shadow. Defaults to `true`. */\n bordered?: boolean;\n children?: React.ReactNode;\n}\n\n/** `Tag` — small label/pill. */\nexport const Tag: React.FC<TagProps> = ({\n tone = \"neutral\",\n solid,\n dot,\n icon,\n removable,\n onRemove,\n bordered = true,\n className = \"\",\n children,\n ...rest\n}) => {\n const cls = [\n \"tag\",\n tone,\n solid && \"solid\",\n !bordered && !solid && \"borderless\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <span className={cls} {...rest}>\n {dot && <span className=\"dot\" />}\n {icon && <Icon name={icon} size={11} className=\"tag-ico\" />}\n {children}\n {removable && (\n <span\n className=\"x\"\n role=\"button\"\n aria-label=\"Remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n >\n <Icon name=\"x\" size={11} />\n </span>\n )}\n </span>\n );\n};\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Numeric count — renders as \"99+\" if > 99. */\n count?: number;\n /** Show a tiny dot instead of a number. */\n dot?: boolean;\n tone?: TagTone;\n children?: React.ReactNode;\n}\n\n/** `Badge` — notification dot / count. Wrap around another element. */\nexport const Badge: React.FC<BadgeProps> = ({\n count,\n dot,\n tone = \"danger\",\n children,\n className = \"\",\n ...rest\n}) => {\n const show = dot || (typeof count === \"number\" && count > 0);\n return (\n <span className={`badge-wrap ${className}`} {...rest}>\n {children}\n {show && (\n <span className={`badge ${tone} ${dot ? \"dot\" : \"\"}`}>\n {!dot && (count! > 99 ? \"99+\" : count)}\n </span>\n )}\n </span>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Tag/Tag.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,MAA0B,CAAC;AAAA,EACtC,IAAA,GAAO,SAAA;AAAA,EACP,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,SAAA,GAAY,EAAA;AAAA,EACZ,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA,IAAS,OAAA;AAAA,IACT,CAAC,QAAA,IAAY,CAAC,KAAA,IAAS,YAAA;AAAA,IACvB;AAAA,GACF,CACG,MAAA,CAAO,OAAO,CAAA,CACd,KAAK,GAAG,CAAA;AACX,EAAA,uBACE,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,GAAA,EAAM,GAAG,IAAA,EACvB,QAAA,EAAA;AAAA,IAAA,GAAA,oBAAO,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,KAAA,EAAM,CAAA;AAAA,IAC7B,IAAA,wBAAS,IAAA,EAAA,EAAK,IAAA,EAAM,MAAM,IAAA,EAAM,EAAA,EAAI,WAAU,SAAA,EAAU,CAAA;AAAA,IACxD,QAAA;AAAA,IACA,SAAA,oBACC,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,GAAA;AAAA,QACV,IAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAW,QAAA;AAAA,QACX,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,UAAA,QAAA,IAAW;AAAA,QACb,CAAA;AAAA,QAEA,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAA,EAAK,GAAA,EAAI,MAAM,EAAA,EAAI;AAAA;AAAA;AAC3B,GAAA,EAEJ,CAAA;AAEJ;AAYO,IAAM,QAA8B,CAAC;AAAA,EAC1C,KAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA,GAAO,QAAA;AAAA,EACP,QAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,GAAG;AACL,CAAA,KAAM;AACJ,EAAA,MAAM,IAAA,GAAO,GAAA,IAAQ,OAAO,KAAA,KAAU,YAAY,KAAA,GAAQ,CAAA;AAC1D,EAAA,4BACG,MAAA,EAAA,EAAK,SAAA,EAAW,cAAc,SAAS,CAAA,CAAA,EAAK,GAAG,IAAA,EAC7C,QAAA,EAAA;AAAA,IAAA,QAAA;AAAA,IACA,wBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,CAAA,MAAA,EAAS,IAAI,CAAA,CAAA,EAAI,GAAA,GAAM,KAAA,GAAQ,EAAE,IAC/C,QAAA,EAAA,CAAC,GAAA,KAAQ,KAAA,GAAS,EAAA,GAAK,QAAQ,KAAA,CAAA,EAClC;AAAA,GAAA,EAEJ,CAAA;AAEJ","file":"chunk-276NALYW.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Tag.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\nexport type TagTone = \"neutral\" | \"accent\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface TagProps extends React.HTMLAttributes<HTMLSpanElement> {\n tone?: TagTone;\n solid?: boolean;\n /** Render a leading colored dot. */\n dot?: boolean;\n /** Leading icon (uses the built-in `Icon` component). */\n icon?: IconName;\n /** Show a close button. */\n removable?: boolean;\n onRemove?: () => void;\n /** Whether to render the tag outline/flat shadow. Defaults to `true`. */\n bordered?: boolean;\n children?: React.ReactNode;\n}\n\n/** `Tag` — small label/pill. */\nexport const Tag: React.FC<TagProps> = ({\n tone = \"neutral\",\n solid,\n dot,\n icon,\n removable,\n onRemove,\n bordered = true,\n className = \"\",\n children,\n ...rest\n}) => {\n const cls = [\n \"tag\",\n tone,\n solid && \"solid\",\n !bordered && !solid && \"borderless\",\n className,\n ]\n .filter(Boolean)\n .join(\" \");\n return (\n <span className={cls} {...rest}>\n {dot && <span className=\"dot\" />}\n {icon && <Icon name={icon} size={11} className=\"tag-ico\" />}\n {children}\n {removable && (\n <span\n className=\"x\"\n role=\"button\"\n aria-label=\"Remove\"\n onClick={(e) => {\n e.stopPropagation();\n onRemove?.();\n }}\n >\n <Icon name=\"x\" size={11} />\n </span>\n )}\n </span>\n );\n};\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** Numeric count — renders as \"99+\" if > 99. */\n count?: number;\n /** Show a tiny dot instead of a number. */\n dot?: boolean;\n tone?: TagTone;\n children?: React.ReactNode;\n}\n\n/** `Badge` — notification dot / count. Wrap around another element. */\nexport const Badge: React.FC<BadgeProps> = ({\n count,\n dot,\n tone = \"danger\",\n children,\n className = \"\",\n ...rest\n}) => {\n const show = dot || (typeof count === \"number\" && count > 0);\n return (\n <span className={`badge-wrap ${className}`} {...rest}>\n {children}\n {show && (\n <span className={`badge ${tone} ${dot ? \"dot\" : \"\"}`}>\n {!dot && (count! > 99 ? \"99+\" : count)}\n </span>\n )}\n </span>\n );\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- require('./tokens-HWQ7KWPG.css');
3
+ require('./tokens-BIIUTPKN.css');
4
4
  require('./shared-NJHRNLRH.css');
5
5
  require('./AppShell-RCALXUCZ.css');
6
6
  var jsxRuntime = require('react/jsx-runtime');
@@ -86,5 +86,5 @@ exports.AppShell = AppShell;
86
86
  exports.Sidebar = Sidebar;
87
87
  exports.TitleBar = TitleBar;
88
88
  exports.WindowControls = WindowControls;
89
- //# sourceMappingURL=chunk-FI7QO3I5.cjs.map
90
- //# sourceMappingURL=chunk-FI7QO3I5.cjs.map
89
+ //# sourceMappingURL=chunk-33TIL25B.cjs.map
90
+ //# sourceMappingURL=chunk-33TIL25B.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/AppShell/AppShell.tsx"],"names":["jsx","jsxs"],"mappings":"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","file":"chunk-FI7QO3I5.cjs","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 {\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.FC<WindowControlsProps> = ({\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n className = \"\",\n}) => {\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n if (platform === \"windows\") {\n return (\n <div className={`win-controls windows ${className}`} style={noDragStyle}>\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 className={`win-controls mac ${className}`} style={noDragStyle}>\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};\n\nexport interface TitleBarProps {\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.FC<TitleBarProps> = ({\n title,\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n center,\n actions,\n draggable = true,\n className = \"\",\n}) => {\n const dragStyle = draggable ? ({ WebkitAppRegion: \"drag\" } as React.CSSProperties) : undefined;\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n\n return (\n <div className={`titlebar ${platform} ${className}`} style={dragStyle}>\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};\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 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.FC<SidebarProps> = ({\n items,\n activeKey,\n onSelect,\n collapsed,\n header,\n footer,\n className = \"\",\n}) => (\n <aside className={`sidebar ${collapsed ? \"collapsed\" : \"\"} ${className}`}>\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);\n\nexport interface AppShellProps {\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.FC<AppShellProps> = ({ sidebar, titleBar, children, className = \"\" }) => (\n <div className={`app-shell ${className}`}>\n {titleBar}\n <div className=\"app-shell-body\">\n {sidebar}\n <main className=\"app-shell-main\">{children}</main>\n </div>\n </div>\n);\n"]}
1
+ {"version":3,"sources":["../src/components/AppShell/AppShell.tsx"],"names":["jsx","jsxs"],"mappings":";;;;;;;;AAmBO,IAAM,iBAAgD,CAAC;AAAA,EAC5D,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,WAAA,GAAc,EAAE,eAAA,EAAiB,SAAA,EAAU;AACjD,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAW,wBAAwB,SAAS,CAAA,CAAA,EAAI,OAAO,WAAA,EAC1D,QAAA,EAAA;AAAA,sBAAAA,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EACjF,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAM,MAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAW,IAAA,EACrE,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,QAAA,EAAS,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,GACzD,CAAA,EACF,CAAA;AAAA,qCACC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,oBAAmB,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EACjF,yCAAC,KAAA,EAAA,EAAI,KAAA,EAAM,IAAA,EAAK,MAAA,EAAO,MAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,eAAW,IAAA,EACrE,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,KAAI,CAAA,EAAE,GAAA,EAAI,KAAA,EAAM,GAAA,EAAI,QAAO,GAAA,EAAI,MAAA,EAAO,gBAAe,WAAA,EAAY,GAAA,EAAI,GAC/E,CAAA,EACF,CAAA;AAAA,sBACAA,cAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,eAAA,EAAgB,OAAA,EAAS,OAAA,EAAS,YAAA,EAAW,OAAA,EAC3E,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,OAAM,IAAA,EAAK,MAAA,EAAO,IAAA,EAAK,OAAA,EAAQ,WAAA,EAAY,IAAA,EAAK,MAAA,EAAO,aAAA,EAAW,MACrE,QAAA,kBAAAA,cAAA,CAAC,MAAA,EAAA,EAAK,CAAA,EAAE,mBAAA,EAAoB,MAAA,EAAO,cAAA,EAAe,WAAA,EAAY,GAAA,EAAI,GACpE,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AACA,EAAA,uCACG,KAAA,EAAA,EAAI,SAAA,EAAW,oBAAoB,SAAS,CAAA,CAAA,EAAI,OAAO,WAAA,EACtD,QAAA,EAAA;AAAA,oBAAAA,cAAA,CAAC,QAAA,EAAA,EAAO,MAAK,QAAA,EAAS,SAAA,EAAU,iBAAgB,OAAA,EAAS,OAAA,EAAS,cAAW,OAAA,EAAQ,CAAA;AAAA,oBACrFA,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EAAW,CAAA;AAAA,oBAC9FA,cAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,kBAAA,EAAmB,OAAA,EAAS,UAAA,EAAY,YAAA,EAAW,UAAA,EAAW;AAAA,GAAA,EAChG,CAAA;AAEJ;AAsBO,IAAM,WAAoC,CAAC;AAAA,EAChD,KAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,UAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA,GAAY;AACd,CAAA,KAAM;AACJ,EAAA,MAAM,SAAA,GAAY,SAAA,GAAa,EAAE,eAAA,EAAiB,QAAO,GAA4B,MAAA;AACrF,EAAA,MAAM,WAAA,GAAc,EAAE,eAAA,EAAiB,SAAA,EAAU;AAEjD,EAAA,uBACEC,eAAA,CAAC,SAAI,SAAA,EAAW,CAAA,SAAA,EAAY,QAAQ,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,SAAA,EACzD,QAAA,EAAA;AAAA,IAAA,QAAA,KAAa,yBACZD,cAAA,CAAC,cAAA,EAAA,EAAe,UAAS,KAAA,EAAM,UAAA,EAAwB,YAAwB,OAAA,EAAkB,CAAA;AAAA,oBAEnGA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACtC,0BACCA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,iBAAA,EAAkB,KAAA,EAAO,aACrC,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,IAED,2BACCA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kBAAA,EAAmB,KAAA,EAAO,aACtC,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,IAED,QAAA,KAAa,6BACZA,cAAA,CAAC,cAAA,EAAA,EAAe,UAAS,SAAA,EAAU,UAAA,EAAwB,YAAwB,OAAA,EAAkB;AAAA,GAAA,EAEzG,CAAA;AAEJ;AAwBO,IAAM,UAAkC,CAAC;AAAA,EAC9C,KAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,qBACEC,eAAA,CAAC,WAAM,SAAA,EAAW,CAAA,QAAA,EAAW,YAAY,WAAA,GAAc,EAAE,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA,EACnE,QAAA,EAAA;AAAA,EAAA,MAAA,oBAAUD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,iCAClD,KAAA,EAAA,EAAI,SAAA,EAAU,eACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,EAAA,qBACVC,eAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MAEL,WAAW,CAAA,aAAA,EAAgB,SAAA,KAAc,EAAA,CAAG,GAAA,GAAM,WAAW,EAAE,CAAA,CAAA;AAAA,MAC/D,OAAA,EAAS,MAAM,QAAA,GAAW,EAAA,CAAG,GAAG,CAAA;AAAA,MAE/B,QAAA,EAAA;AAAA,QAAA,EAAA,CAAG,wBAAQD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,cAAA,EAAgB,aAAG,IAAA,EAAK,CAAA;AAAA,QACnD,CAAC,SAAA,oBAAaA,cAAA,CAAC,UAAK,SAAA,EAAU,eAAA,EAAiB,aAAG,KAAA,EAAM,CAAA;AAAA,QACxD,CAAC,aAAa,EAAA,CAAG,KAAA,mCAAU,MAAA,EAAA,EAAK,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAA,EAAA,CAAG,KAAA,EAAM;AAAA;AAAA,KAAA;AAAA,IANhE,EAAA,CAAG;AAAA,GAQX,CAAA,EACH,CAAA;AAAA,EACC,MAAA,oBAAUA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBAAkB,QAAA,EAAA,MAAA,EAAO;AAAA,CAAA,EACrD;AAaK,IAAM,QAAA,GAAoC,CAAC,EAAE,OAAA,EAAS,UAAU,QAAA,EAAU,SAAA,GAAY,EAAA,EAAG,qBAC9FC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,UAAA,EAAa,SAAS,CAAA,CAAA,EACnC,QAAA,EAAA;AAAA,EAAA,QAAA;AAAA,kBACDA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,oBACDD,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,gBAAA,EAAkB,QAAA,EAAS;AAAA,GAAA,EAC7C;AAAA,CAAA,EACF","file":"chunk-33TIL25B.cjs","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 {\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.FC<WindowControlsProps> = ({\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n className = \"\",\n}) => {\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n if (platform === \"windows\") {\n return (\n <div className={`win-controls windows ${className}`} style={noDragStyle}>\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 className={`win-controls mac ${className}`} style={noDragStyle}>\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};\n\nexport interface TitleBarProps {\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.FC<TitleBarProps> = ({\n title,\n platform = \"mac\",\n onMinimize,\n onMaximize,\n onClose,\n center,\n actions,\n draggable = true,\n className = \"\",\n}) => {\n const dragStyle = draggable ? ({ WebkitAppRegion: \"drag\" } as React.CSSProperties) : undefined;\n const noDragStyle = { WebkitAppRegion: \"no-drag\" } as React.CSSProperties;\n\n return (\n <div className={`titlebar ${platform} ${className}`} style={dragStyle}>\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};\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 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.FC<SidebarProps> = ({\n items,\n activeKey,\n onSelect,\n collapsed,\n header,\n footer,\n className = \"\",\n}) => (\n <aside className={`sidebar ${collapsed ? \"collapsed\" : \"\"} ${className}`}>\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);\n\nexport interface AppShellProps {\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.FC<AppShellProps> = ({ sidebar, titleBar, children, className = \"\" }) => (\n <div className={`app-shell ${className}`}>\n {titleBar}\n <div className=\"app-shell-body\">\n {sidebar}\n <main className=\"app-shell-main\">{children}</main>\n </div>\n </div>\n);\n"]}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkYVO7XO4W_cjs = require('./chunk-YVO7XO4W.cjs');
4
- require('./tokens-HWQ7KWPG.css');
4
+ require('./tokens-BIIUTPKN.css');
5
5
  require('./shared-NJHRNLRH.css');
6
- require('./Accordion-3TQPKNN3.css');
6
+ require('./Accordion-REMDCQUD.css');
7
7
  var React = require('react');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
@@ -27,6 +27,32 @@ function _interopNamespace(e) {
27
27
 
28
28
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
29
 
30
+ var AccordionPanel = ({ open, children }) => {
31
+ const innerRef = React__namespace.useRef(null);
32
+ const [h, setH] = React__namespace.useState(0);
33
+ const [animated, setAnimated] = React__namespace.useState(false);
34
+ React__namespace.useLayoutEffect(() => {
35
+ const el = innerRef.current;
36
+ if (!el) return;
37
+ setH(el.scrollHeight);
38
+ const ro = new ResizeObserver(() => setH(el.scrollHeight));
39
+ ro.observe(el);
40
+ return () => ro.disconnect();
41
+ }, []);
42
+ React__namespace.useEffect(() => {
43
+ const id = requestAnimationFrame(() => setAnimated(true));
44
+ return () => cancelAnimationFrame(id);
45
+ }, []);
46
+ return /* @__PURE__ */ jsxRuntime.jsx(
47
+ "div",
48
+ {
49
+ className: "accordion-body",
50
+ style: { maxHeight: open ? h : 0, transition: animated ? void 0 : "none" },
51
+ "aria-hidden": !open,
52
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref: innerRef, className: "accordion-body-inner", children })
53
+ }
54
+ );
55
+ };
30
56
  var Accordion = ({
31
57
  items,
32
58
  multiple = false,
@@ -82,7 +108,7 @@ var Accordion = ({
82
108
  ]
83
109
  }
84
110
  ),
85
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "accordion-body", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "accordion-body-inner", children: it.content }) })
111
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionPanel, { open, children: it.content })
86
112
  ]
87
113
  },
88
114
  it.key
@@ -91,5 +117,5 @@ var Accordion = ({
91
117
  };
92
118
 
93
119
  exports.Accordion = Accordion;
94
- //# sourceMappingURL=chunk-RDLPX7RK.cjs.map
95
- //# sourceMappingURL=chunk-RDLPX7RK.cjs.map
120
+ //# sourceMappingURL=chunk-3HNRKO3M.cjs.map
121
+ //# sourceMappingURL=chunk-3HNRKO3M.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["React","jsx","jsxs","Icon"],"mappings":"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","file":"chunk-3HNRKO3M.cjs","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Accordion.css\";\nimport * as React from \"react\";\nimport { Icon } from \"../Icon\";\n\nexport interface AccordionItem {\n key: string;\n title: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface AccordionProps {\n items: AccordionItem[];\n /** If true, multiple sections can be open at once. */\n multiple?: boolean;\n /**\n * Accordion mode — at most one item open at a time. Takes precedence over `multiple`\n * when both are set.\n */\n accordion?: boolean;\n /**\n * What triggers expansion.\n * - `\"header\"` (default): clicking anywhere on the header toggles.\n * - `\"icon\"`: only the chevron icon is clickable.\n * - `\"disabled\"`: the panel cannot be toggled.\n */\n collapsible?: \"header\" | \"icon\" | \"disabled\";\n activeKeys?: string[];\n defaultActiveKeys?: string[];\n onChange?: (keys: string[]) => void;\n className?: string;\n}\n\nconst AccordionPanel: React.FC<{ open: boolean; children: React.ReactNode }> = ({ open, children }) => {\n const innerRef = React.useRef<HTMLDivElement>(null);\n const [h, setH] = React.useState(0);\n const [animated, setAnimated] = React.useState(false);\n\n React.useLayoutEffect(() => {\n const el = innerRef.current;\n if (!el) return;\n setH(el.scrollHeight);\n const ro = new ResizeObserver(() => setH(el.scrollHeight));\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n React.useEffect(() => {\n const id = requestAnimationFrame(() => setAnimated(true));\n return () => cancelAnimationFrame(id);\n }, []);\n\n return (\n <div\n className=\"accordion-body\"\n style={{ maxHeight: open ? h : 0, transition: animated ? undefined : \"none\" }}\n aria-hidden={!open}\n >\n <div ref={innerRef} className=\"accordion-body-inner\">{children}</div>\n </div>\n );\n};\n\n/** `Accordion` — collapsible sections. */\nexport const Accordion: React.FC<AccordionProps> = ({\n items,\n multiple = false,\n accordion = false,\n collapsible = \"header\",\n activeKeys,\n defaultActiveKeys = [],\n onChange,\n className = \"\",\n}) => {\n const [inner, setInner] = React.useState<string[]>(defaultActiveKeys);\n const isControlled = activeKeys !== undefined;\n const keys = isControlled ? activeKeys! : inner;\n\n // accordion takes precedence over multiple\n const singleOpen = accordion || !multiple;\n\n const toggle = (k: string, itemDisabled?: boolean) => {\n if (collapsible === \"disabled\" || itemDisabled) return;\n const next = keys.includes(k)\n ? keys.filter((x) => x !== k)\n : singleOpen\n ? [k]\n : [...keys, k];\n if (!isControlled) setInner(next);\n onChange?.(next);\n };\n\n return (\n <div className={`accordion ${className}`}>\n {items.map((it) => {\n const open = keys.includes(it.key);\n const isDisabled = it.disabled || collapsible === \"disabled\";\n const headerClickable = collapsible === \"header\" && !isDisabled;\n return (\n <div\n key={it.key}\n className={`accordion-item ${open ? \"open\" : \"\"} ${isDisabled ? \"disabled\" : \"\"} ${collapsible === \"icon\" ? \"icon-only\" : \"\"}`}\n >\n <button\n type=\"button\"\n className=\"accordion-head\"\n disabled={isDisabled}\n onClick={() => headerClickable && toggle(it.key, it.disabled)}\n aria-expanded={open}\n >\n <span>{it.title}</span>\n <span\n className={`accordion-chev${collapsible === \"icon\" ? \" clickable\" : \"\"}`}\n onClick={(e) => {\n if (collapsible === \"icon\" && !isDisabled) {\n e.stopPropagation();\n toggle(it.key, it.disabled);\n }\n }}\n >\n <Icon name=\"chevDown\" size={16} />\n </span>\n </button>\n <AccordionPanel open={open}>{it.content}</AccordionPanel>\n </div>\n );\n })}\n </div>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Icon } from './chunk-GEYMWUW6.js';
2
- import './tokens-HWQ7KWPG.css';
2
+ import './tokens-BIIUTPKN.css';
3
3
  import './shared-NJHRNLRH.css';
4
4
  import './Typography-NKPWTJCV.css';
5
5
  import * as React from 'react';
@@ -480,5 +480,5 @@ TypographyBase.displayName = "Typography";
480
480
  var Typography = TypographyBase;
481
481
 
482
482
  export { Link, Paragraph, Text, Title, Typography };
483
- //# sourceMappingURL=chunk-GZGZR4FT.js.map
484
- //# sourceMappingURL=chunk-GZGZR4FT.js.map
483
+ //# sourceMappingURL=chunk-3LI6QH2Q.js.map
484
+ //# sourceMappingURL=chunk-3LI6QH2Q.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Typography/Typography.tsx"],"names":[],"mappings":"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","file":"chunk-GZGZR4FT.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Typography.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\n/* ============================================================================\n * Shared types\n * ========================================================================== */\n\nexport type TypographyType = \"secondary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface CopyableConfig {\n /** Text to copy. Defaults to the rendered children string. */\n text?: string;\n /** Fired after a successful copy. */\n onCopy?: (event: React.MouseEvent<HTMLSpanElement>) => void;\n /** Custom icons `[default, copied]`. */\n icon?: [React.ReactNode, React.ReactNode];\n /** Custom tooltip text `[default, copied]`. Pass `false` to disable. */\n tooltips?: [React.ReactNode, React.ReactNode] | false;\n /** Format/MIME hint when calling `navigator.clipboard.write` is not used. */\n format?: \"text/plain\" | \"text/html\";\n}\n\nexport interface EditableConfig {\n /** Controlled editing flag. Omit for uncontrolled (click icon to start). */\n editing?: boolean;\n /** Text shown in the editor; falls back to `children` string. */\n text?: string;\n /** Fired with the new value when the user confirms. */\n onChange?: (value: string) => void;\n /** Fired when the user cancels (Escape or blur without confirm). */\n onCancel?: () => void;\n /** Fired when editing starts. */\n onStart?: () => void;\n /** Fired when editing ends (regardless of save/cancel). */\n onEnd?: () => void;\n /** Maximum input length. */\n maxLength?: number;\n /** Auto resize textarea. `true` = autosize; or pass row bounds. */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** What triggers entering edit mode. Defaults to `[\"icon\"]`. */\n triggerType?: Array<\"icon\" | \"text\">;\n /** Override the edit icon. */\n icon?: React.ReactNode;\n /** Tooltip text on the trigger icon. Pass `false` to disable. */\n tooltip?: React.ReactNode | false;\n /** Use a single-line input instead of textarea. */\n enterIcon?: React.ReactNode;\n}\n\nexport interface EllipsisConfig {\n /** Number of rows to clamp at. Defaults to 1. */\n rows?: number;\n /** Show an \"Expand\" affordance after clamping. */\n expandable?: boolean;\n /** Custom expand-button label. */\n symbol?: React.ReactNode;\n /** Fired on expand. */\n onExpand?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Show full text in a `title` attribute. */\n tooltip?: boolean | React.ReactNode;\n /** Optional suffix that should always remain visible (e.g. an em-dash author). */\n suffix?: string;\n}\n\nexport interface BaseTypographyProps {\n /** Semantic color. */\n type?: TypographyType;\n /** Render disabled (muted + not selectable). */\n disabled?: boolean;\n /** Highlight with mark background. */\n mark?: boolean;\n /** Render as inline `<code>`. */\n code?: boolean;\n /** Render as keyboard key `<kbd>`. */\n keyboard?: boolean;\n /** Underline. */\n underline?: boolean;\n /** Strikethrough. */\n delete?: boolean;\n /** Bold. */\n strong?: boolean;\n /** Italic. */\n italic?: boolean;\n /** Add a copy button. Pass an object to customize. */\n copyable?: boolean | CopyableConfig;\n /** Add an edit button. Pass an object to customize. */\n editable?: boolean | EditableConfig;\n /** Truncate to N rows with optional expand affordance. */\n ellipsis?: boolean | EllipsisConfig;\n /** Extra class names. */\n className?: string;\n /** Inline style. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/* ============================================================================\n * Internals\n * ========================================================================== */\n\nfunction toText(node: React.ReactNode): string {\n if (node == null || node === false) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(toText).join(\"\");\n if (React.isValidElement(node)) {\n const props = node.props as { children?: React.ReactNode };\n return toText(props.children);\n }\n return \"\";\n}\n\nfunction buildClass(props: BaseTypographyProps, base: string, extra?: string) {\n return [\n base,\n props.type,\n props.disabled && \"disabled\",\n props.mark && \"mark\",\n props.code && \"code\",\n props.keyboard && \"kbd\",\n props.underline && \"underline\",\n props.delete && \"del\",\n props.strong && \"strong\",\n props.italic && \"italic\",\n extra,\n props.className,\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\n/* ---------- Copy button ---------- */\n\nconst CopyAction: React.FC<{\n config: CopyableConfig;\n fallbackText: string;\n}> = ({ config, fallbackText }) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleCopy = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.stopPropagation();\n const text = config.text ?? fallbackText;\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).catch(() => {\n /* swallow — user-visible feedback is already minimal */\n });\n }\n config.onCopy?.(event);\n setCopied(true);\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => setCopied(false), 2400);\n };\n\n const [defIcon, doneIcon] = config.icon ?? [\n <Icon key=\"def\" name=\"copy\" size={12} />,\n <Icon key=\"done\" name=\"check\" size={12} />,\n ];\n const tipText =\n config.tooltips === false\n ? undefined\n : Array.isArray(config.tooltips)\n ? copied\n ? config.tooltips[1]\n : config.tooltips[0]\n : copied\n ? \"已复制\"\n : \"复制\";\n\n return (\n <span\n role=\"button\"\n aria-label={typeof tipText === \"string\" ? tipText : \"Copy\"}\n tabIndex={0}\n title={typeof tipText === \"string\" ? tipText : undefined}\n onClick={handleCopy}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleCopy(e as unknown as React.MouseEvent<HTMLSpanElement>);\n }\n }}\n className={`typo-action typo-copy ${copied ? \"copied\" : \"\"}`}\n >\n {copied ? doneIcon : defIcon}\n </span>\n );\n};\n\n/* ---------- Edit affordance + inline editor ---------- */\n\nconst EditableEditor: React.FC<{\n initial: string;\n multiline: boolean;\n maxLength?: number;\n autoSize?: EditableConfig[\"autoSize\"];\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}> = ({ initial, multiline, maxLength, autoSize, onConfirm, onCancel }) => {\n const [value, setValue] = React.useState(initial);\n const ref = React.useRef<HTMLTextAreaElement | HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (el) {\n el.focus();\n const len = el.value.length;\n el.setSelectionRange(len, len);\n }\n }, []);\n\n const resize = React.useCallback(() => {\n const el = ref.current as HTMLTextAreaElement | null;\n if (!el || !multiline || !autoSize) return;\n el.style.height = \"auto\";\n const computed = window.getComputedStyle(el);\n const lineHeight = parseFloat(computed.lineHeight) || 20;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n const bounds = typeof autoSize === \"object\" ? autoSize : {};\n const min = (bounds.minRows ?? 1) * lineHeight + padding;\n const max = bounds.maxRows ? bounds.maxRows * lineHeight + padding : Infinity;\n const next = Math.min(Math.max(el.scrollHeight, min), max);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [autoSize, multiline]);\n\n React.useEffect(() => {\n resize();\n }, [value, resize]);\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n return;\n }\n if (e.key === \"Enter\" && (!multiline || (e.metaKey || e.ctrlKey))) {\n e.preventDefault();\n onConfirm(value);\n }\n };\n\n const common = {\n ref: ref as never,\n value,\n maxLength,\n className: \"typo-editor\",\n onChange: (\n e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => setValue(e.target.value),\n onBlur: () => onConfirm(value),\n onKeyDown: handleKeyDown,\n } as const;\n\n return multiline ? (\n <textarea rows={1} {...common} />\n ) : (\n <input type=\"text\" {...common} />\n );\n};\n\n/* ============================================================================\n * Hook: shared rendering body\n * ========================================================================== */\n\ninterface RenderableProps extends BaseTypographyProps {\n ellipsisRows?: number;\n multilineEdit?: boolean;\n}\n\nfunction useTypographyBody(props: RenderableProps) {\n const fallbackText = React.useMemo(\n () => toText(props.children),\n [props.children]\n );\n\n /* ---- editable state ---- */\n const editable = props.editable;\n const editConf: EditableConfig =\n editable && typeof editable === \"object\" ? editable : {};\n const triggers = editConf.triggerType ?? [\"icon\"];\n const isControlledEdit = editConf.editing != null;\n const [editingState, setEditingState] = React.useState(false);\n const editing = isControlledEdit ? editConf.editing! : editingState;\n\n const startEdit = () => {\n editConf.onStart?.();\n if (!isControlledEdit) setEditingState(true);\n };\n const endEdit = () => {\n editConf.onEnd?.();\n if (!isControlledEdit) setEditingState(false);\n };\n const handleConfirm = (value: string) => {\n if (value !== (editConf.text ?? fallbackText)) editConf.onChange?.(value);\n endEdit();\n };\n const handleCancel = () => {\n editConf.onCancel?.();\n endEdit();\n };\n\n /* ---- ellipsis state ---- */\n const ellipsis = props.ellipsis;\n const ellConf: EllipsisConfig =\n ellipsis && typeof ellipsis === \"object\" ? ellipsis : {};\n const rows = ellConf.rows ?? props.ellipsisRows ?? 1;\n const wantClamp = !!ellipsis;\n const [expanded, setExpanded] = React.useState(false);\n\n /* ---- content ---- */\n let inner: React.ReactNode = props.children;\n\n if (props.code) inner = <code>{inner}</code>;\n if (props.keyboard) inner = <kbd>{inner}</kbd>;\n if (props.mark) inner = <mark>{inner}</mark>;\n if (props.delete) inner = <del>{inner}</del>;\n if (props.underline) inner = <u>{inner}</u>;\n if (props.strong) inner = <strong>{inner}</strong>;\n if (props.italic) inner = <i>{inner}</i>;\n\n /* ---- copy node ---- */\n let copyNode: React.ReactNode = null;\n if (props.copyable) {\n const conf =\n typeof props.copyable === \"object\" ? props.copyable : ({} as CopyableConfig);\n copyNode = <CopyAction config={conf} fallbackText={fallbackText} />;\n }\n\n /* ---- edit node ---- */\n let editIconNode: React.ReactNode = null;\n if (editable) {\n const tip = editConf.tooltip ?? \"编辑\";\n editIconNode = (\n <span\n role=\"button\"\n aria-label={typeof tip === \"string\" ? tip : \"Edit\"}\n tabIndex={0}\n title={typeof tip === \"string\" && tip !== \"\" ? tip : undefined}\n onClick={(e) => {\n e.stopPropagation();\n startEdit();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n startEdit();\n }\n }}\n className=\"typo-action typo-edit\"\n >\n {editConf.icon ?? <Icon name=\"edit\" size={12} />}\n </span>\n );\n }\n\n /* ---- text-trigger edit ---- */\n if (editable && triggers.includes(\"text\") && !editing) {\n inner = (\n <span\n className=\"typo-edit-text-trigger\"\n onClick={() => startEdit()}\n >\n {inner}\n </span>\n );\n }\n\n /* ---- clamp / expand ---- */\n let style: React.CSSProperties | undefined = props.style;\n let extraCls: string | undefined;\n if (wantClamp && !expanded) {\n extraCls = rows > 1 ? \"ellipsis-multi\" : \"ellipsis\";\n if (rows > 1) {\n style = {\n ...style,\n WebkitLineClamp: rows,\n } as React.CSSProperties;\n }\n }\n\n let expandNode: React.ReactNode = null;\n if (wantClamp && ellConf.expandable && !expanded) {\n expandNode = (\n <a\n className=\"typo-expand\"\n onClick={(e) => {\n ellConf.onExpand?.(e);\n setExpanded(true);\n }}\n >\n {ellConf.symbol ?? \"展开\"}\n </a>\n );\n }\n\n /* ---- title attribute fallback ---- */\n const titleAttr =\n wantClamp && ellConf.tooltip\n ? typeof ellConf.tooltip === \"string\"\n ? ellConf.tooltip\n : fallbackText\n : undefined;\n\n return {\n editing,\n editConf,\n fallbackText,\n handleConfirm,\n handleCancel,\n inner,\n copyNode,\n editIconNode,\n expandNode,\n style,\n extraCls,\n titleAttr,\n };\n}\n\n/* ============================================================================\n * Title (h1–h5)\n * ========================================================================== */\n\nexport type TitleLevel = 1 | 2 | 3 | 4 | 5;\n\nexport interface TitleProps extends BaseTypographyProps {\n /** Heading level — 1..5. Defaults to 1. */\n level?: TitleLevel;\n}\n\n/**\n * `Typography.Title` — semantic heading.\n *\n * @example\n * <Title level={2} copyable>章节标题</Title>\n */\nexport const Title = React.forwardRef<HTMLElement, TitleProps>((props, ref) => {\n const { level = 1, ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = (`h${level}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nTitle.displayName = \"Typography.Title\";\n\n/* ============================================================================\n * Text — inline span\n * ========================================================================== */\n\nexport interface TextProps extends BaseTypographyProps {\n /** Force the rendered tag (default `<span>`). */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * `Typography.Text` — inline text with semantic / decorative variants.\n *\n * @example\n * <Text type=\"success\" strong>成功</Text>\n * <Text code>npm install</Text>\n * <Text copyable>可复制内容</Text>\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>((props, ref) => {\n const { as = \"span\", ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = as as \"span\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nText.displayName = \"Typography.Text\";\n\n/* ============================================================================\n * Paragraph — block <p>\n * ========================================================================== */\n\nexport interface ParagraphProps extends BaseTypographyProps {}\n\n/**\n * `Typography.Paragraph` — block paragraph with the same decorations as `Text`.\n *\n * @example\n * <Paragraph ellipsis={{ rows: 3, expandable: true }}>{long}</Paragraph>\n */\nexport const Paragraph = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n (props, ref) => {\n const body = useTypographyBody({ ...props, multilineEdit: true });\n\n if (body.editing) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n className={buildClass(props, \"typo typo-paragraph\", \"editing\")}\n style={props.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize ?? true}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </div>\n );\n }\n\n return (\n <p\n ref={ref}\n className={buildClass(props, \"typo typo-paragraph\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </p>\n );\n }\n);\nParagraph.displayName = \"Typography.Paragraph\";\n\n/* ============================================================================\n * Link — anchor\n * ========================================================================== */\n\nexport interface LinkProps\n extends BaseTypographyProps,\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof BaseTypographyProps | \"type\"\n > {\n href?: string;\n /** Add the leading external icon. */\n external?: boolean;\n /** Override the external icon. */\n externalIcon?: IconName;\n}\n\n/**\n * `Typography.Link` — styled `<a>` that participates in the same decoration\n * system as `Text`. Adds a small `arrow` for `external` links.\n *\n * @example\n * <Link href=\"https://example.com\" external>外部链接</Link>\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n (props, ref) => {\n const {\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n external,\n externalIcon = \"arrowRight\",\n target,\n rel,\n ...anchorRest\n } = props;\n const body = useTypographyBody({\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n });\n\n const safeRel =\n target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel;\n\n if (body.editing) {\n return (\n <span\n className={buildClass(props, \"typo typo-link\", \"editing\")}\n style={style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </span>\n );\n }\n\n return (\n <a\n ref={ref}\n className={buildClass(props, \"typo typo-link\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n target={target}\n rel={safeRel}\n aria-disabled={disabled || undefined}\n onClick={(e) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n anchorRest.onClick?.(e);\n }}\n {...anchorRest}\n >\n {body.inner}\n {external && (\n <span className=\"typo-link-ext\" aria-hidden>\n <Icon name={externalIcon} size={12} />\n </span>\n )}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </a>\n );\n }\n);\nLink.displayName = \"Typography.Link\";\n\n/* ============================================================================\n * Typography wrapper (article-style block)\n * ========================================================================== */\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n}\n\ninterface TypographyComponent\n extends React.ForwardRefExoticComponent<\n TypographyProps & React.RefAttributes<HTMLDivElement>\n > {\n Title: typeof Title;\n Text: typeof Text;\n Paragraph: typeof Paragraph;\n Link: typeof Link;\n}\n\n/**\n * `Typography` — optional article-style wrapper that applies consistent\n * vertical rhythm to its `Title` / `Paragraph` / `Text` / `Link` children.\n *\n * @example\n * <Typography>\n * <Typography.Title level={2}>标题</Typography.Title>\n * <Typography.Paragraph>段落…</Typography.Paragraph>\n * </Typography>\n */\nconst TypographyBase = React.forwardRef<HTMLDivElement, TypographyProps>(\n ({ className = \"\", children, ...rest }, ref) => (\n <article\n ref={ref as unknown as React.Ref<HTMLElement>}\n className={`typo-root ${className}`}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n >\n {children}\n </article>\n )\n) as unknown as TypographyComponent;\n\nTypographyBase.Title = Title;\nTypographyBase.Text = Text;\nTypographyBase.Paragraph = Paragraph;\nTypographyBase.Link = Link;\n(TypographyBase as React.ForwardRefExoticComponent<unknown>).displayName =\n \"Typography\";\n\nexport const Typography = TypographyBase;\n"]}
1
+ {"version":3,"sources":["../src/components/Typography/Typography.tsx"],"names":[],"mappings":"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","file":"chunk-3LI6QH2Q.js","sourcesContent":["import \"../../styles/tokens.css\";\nimport \"../../styles/shared.css\";\nimport \"./Typography.css\";\nimport * as React from \"react\";\nimport { Icon, type IconName } from \"../Icon\";\n\n/* ============================================================================\n * Shared types\n * ========================================================================== */\n\nexport type TypographyType = \"secondary\" | \"success\" | \"warning\" | \"danger\";\n\nexport interface CopyableConfig {\n /** Text to copy. Defaults to the rendered children string. */\n text?: string;\n /** Fired after a successful copy. */\n onCopy?: (event: React.MouseEvent<HTMLSpanElement>) => void;\n /** Custom icons `[default, copied]`. */\n icon?: [React.ReactNode, React.ReactNode];\n /** Custom tooltip text `[default, copied]`. Pass `false` to disable. */\n tooltips?: [React.ReactNode, React.ReactNode] | false;\n /** Format/MIME hint when calling `navigator.clipboard.write` is not used. */\n format?: \"text/plain\" | \"text/html\";\n}\n\nexport interface EditableConfig {\n /** Controlled editing flag. Omit for uncontrolled (click icon to start). */\n editing?: boolean;\n /** Text shown in the editor; falls back to `children` string. */\n text?: string;\n /** Fired with the new value when the user confirms. */\n onChange?: (value: string) => void;\n /** Fired when the user cancels (Escape or blur without confirm). */\n onCancel?: () => void;\n /** Fired when editing starts. */\n onStart?: () => void;\n /** Fired when editing ends (regardless of save/cancel). */\n onEnd?: () => void;\n /** Maximum input length. */\n maxLength?: number;\n /** Auto resize textarea. `true` = autosize; or pass row bounds. */\n autoSize?: boolean | { minRows?: number; maxRows?: number };\n /** What triggers entering edit mode. Defaults to `[\"icon\"]`. */\n triggerType?: Array<\"icon\" | \"text\">;\n /** Override the edit icon. */\n icon?: React.ReactNode;\n /** Tooltip text on the trigger icon. Pass `false` to disable. */\n tooltip?: React.ReactNode | false;\n /** Use a single-line input instead of textarea. */\n enterIcon?: React.ReactNode;\n}\n\nexport interface EllipsisConfig {\n /** Number of rows to clamp at. Defaults to 1. */\n rows?: number;\n /** Show an \"Expand\" affordance after clamping. */\n expandable?: boolean;\n /** Custom expand-button label. */\n symbol?: React.ReactNode;\n /** Fired on expand. */\n onExpand?: (event: React.MouseEvent<HTMLElement>) => void;\n /** Show full text in a `title` attribute. */\n tooltip?: boolean | React.ReactNode;\n /** Optional suffix that should always remain visible (e.g. an em-dash author). */\n suffix?: string;\n}\n\nexport interface BaseTypographyProps {\n /** Semantic color. */\n type?: TypographyType;\n /** Render disabled (muted + not selectable). */\n disabled?: boolean;\n /** Highlight with mark background. */\n mark?: boolean;\n /** Render as inline `<code>`. */\n code?: boolean;\n /** Render as keyboard key `<kbd>`. */\n keyboard?: boolean;\n /** Underline. */\n underline?: boolean;\n /** Strikethrough. */\n delete?: boolean;\n /** Bold. */\n strong?: boolean;\n /** Italic. */\n italic?: boolean;\n /** Add a copy button. Pass an object to customize. */\n copyable?: boolean | CopyableConfig;\n /** Add an edit button. Pass an object to customize. */\n editable?: boolean | EditableConfig;\n /** Truncate to N rows with optional expand affordance. */\n ellipsis?: boolean | EllipsisConfig;\n /** Extra class names. */\n className?: string;\n /** Inline style. */\n style?: React.CSSProperties;\n children?: React.ReactNode;\n}\n\n/* ============================================================================\n * Internals\n * ========================================================================== */\n\nfunction toText(node: React.ReactNode): string {\n if (node == null || node === false) return \"\";\n if (typeof node === \"string\" || typeof node === \"number\") return String(node);\n if (Array.isArray(node)) return node.map(toText).join(\"\");\n if (React.isValidElement(node)) {\n const props = node.props as { children?: React.ReactNode };\n return toText(props.children);\n }\n return \"\";\n}\n\nfunction buildClass(props: BaseTypographyProps, base: string, extra?: string) {\n return [\n base,\n props.type,\n props.disabled && \"disabled\",\n props.mark && \"mark\",\n props.code && \"code\",\n props.keyboard && \"kbd\",\n props.underline && \"underline\",\n props.delete && \"del\",\n props.strong && \"strong\",\n props.italic && \"italic\",\n extra,\n props.className,\n ]\n .filter(Boolean)\n .join(\" \");\n}\n\n/* ---------- Copy button ---------- */\n\nconst CopyAction: React.FC<{\n config: CopyableConfig;\n fallbackText: string;\n}> = ({ config, fallbackText }) => {\n const [copied, setCopied] = React.useState(false);\n const timerRef = React.useRef<number | null>(null);\n\n React.useEffect(() => {\n return () => {\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n };\n }, []);\n\n const handleCopy = (event: React.MouseEvent<HTMLSpanElement>) => {\n event.stopPropagation();\n const text = config.text ?? fallbackText;\n if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(text).catch(() => {\n /* swallow — user-visible feedback is already minimal */\n });\n }\n config.onCopy?.(event);\n setCopied(true);\n if (timerRef.current != null) window.clearTimeout(timerRef.current);\n timerRef.current = window.setTimeout(() => setCopied(false), 2400);\n };\n\n const [defIcon, doneIcon] = config.icon ?? [\n <Icon key=\"def\" name=\"copy\" size={12} />,\n <Icon key=\"done\" name=\"check\" size={12} />,\n ];\n const tipText =\n config.tooltips === false\n ? undefined\n : Array.isArray(config.tooltips)\n ? copied\n ? config.tooltips[1]\n : config.tooltips[0]\n : copied\n ? \"已复制\"\n : \"复制\";\n\n return (\n <span\n role=\"button\"\n aria-label={typeof tipText === \"string\" ? tipText : \"Copy\"}\n tabIndex={0}\n title={typeof tipText === \"string\" ? tipText : undefined}\n onClick={handleCopy}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleCopy(e as unknown as React.MouseEvent<HTMLSpanElement>);\n }\n }}\n className={`typo-action typo-copy ${copied ? \"copied\" : \"\"}`}\n >\n {copied ? doneIcon : defIcon}\n </span>\n );\n};\n\n/* ---------- Edit affordance + inline editor ---------- */\n\nconst EditableEditor: React.FC<{\n initial: string;\n multiline: boolean;\n maxLength?: number;\n autoSize?: EditableConfig[\"autoSize\"];\n onConfirm: (value: string) => void;\n onCancel: () => void;\n}> = ({ initial, multiline, maxLength, autoSize, onConfirm, onCancel }) => {\n const [value, setValue] = React.useState(initial);\n const ref = React.useRef<HTMLTextAreaElement | HTMLInputElement | null>(null);\n\n React.useEffect(() => {\n const el = ref.current;\n if (el) {\n el.focus();\n const len = el.value.length;\n el.setSelectionRange(len, len);\n }\n }, []);\n\n const resize = React.useCallback(() => {\n const el = ref.current as HTMLTextAreaElement | null;\n if (!el || !multiline || !autoSize) return;\n el.style.height = \"auto\";\n const computed = window.getComputedStyle(el);\n const lineHeight = parseFloat(computed.lineHeight) || 20;\n const padding =\n parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom);\n const bounds = typeof autoSize === \"object\" ? autoSize : {};\n const min = (bounds.minRows ?? 1) * lineHeight + padding;\n const max = bounds.maxRows ? bounds.maxRows * lineHeight + padding : Infinity;\n const next = Math.min(Math.max(el.scrollHeight, min), max);\n el.style.height = `${next}px`;\n el.style.overflowY = el.scrollHeight > max ? \"auto\" : \"hidden\";\n }, [autoSize, multiline]);\n\n React.useEffect(() => {\n resize();\n }, [value, resize]);\n\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n onCancel();\n return;\n }\n if (e.key === \"Enter\" && (!multiline || (e.metaKey || e.ctrlKey))) {\n e.preventDefault();\n onConfirm(value);\n }\n };\n\n const common = {\n ref: ref as never,\n value,\n maxLength,\n className: \"typo-editor\",\n onChange: (\n e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>\n ) => setValue(e.target.value),\n onBlur: () => onConfirm(value),\n onKeyDown: handleKeyDown,\n } as const;\n\n return multiline ? (\n <textarea rows={1} {...common} />\n ) : (\n <input type=\"text\" {...common} />\n );\n};\n\n/* ============================================================================\n * Hook: shared rendering body\n * ========================================================================== */\n\ninterface RenderableProps extends BaseTypographyProps {\n ellipsisRows?: number;\n multilineEdit?: boolean;\n}\n\nfunction useTypographyBody(props: RenderableProps) {\n const fallbackText = React.useMemo(\n () => toText(props.children),\n [props.children]\n );\n\n /* ---- editable state ---- */\n const editable = props.editable;\n const editConf: EditableConfig =\n editable && typeof editable === \"object\" ? editable : {};\n const triggers = editConf.triggerType ?? [\"icon\"];\n const isControlledEdit = editConf.editing != null;\n const [editingState, setEditingState] = React.useState(false);\n const editing = isControlledEdit ? editConf.editing! : editingState;\n\n const startEdit = () => {\n editConf.onStart?.();\n if (!isControlledEdit) setEditingState(true);\n };\n const endEdit = () => {\n editConf.onEnd?.();\n if (!isControlledEdit) setEditingState(false);\n };\n const handleConfirm = (value: string) => {\n if (value !== (editConf.text ?? fallbackText)) editConf.onChange?.(value);\n endEdit();\n };\n const handleCancel = () => {\n editConf.onCancel?.();\n endEdit();\n };\n\n /* ---- ellipsis state ---- */\n const ellipsis = props.ellipsis;\n const ellConf: EllipsisConfig =\n ellipsis && typeof ellipsis === \"object\" ? ellipsis : {};\n const rows = ellConf.rows ?? props.ellipsisRows ?? 1;\n const wantClamp = !!ellipsis;\n const [expanded, setExpanded] = React.useState(false);\n\n /* ---- content ---- */\n let inner: React.ReactNode = props.children;\n\n if (props.code) inner = <code>{inner}</code>;\n if (props.keyboard) inner = <kbd>{inner}</kbd>;\n if (props.mark) inner = <mark>{inner}</mark>;\n if (props.delete) inner = <del>{inner}</del>;\n if (props.underline) inner = <u>{inner}</u>;\n if (props.strong) inner = <strong>{inner}</strong>;\n if (props.italic) inner = <i>{inner}</i>;\n\n /* ---- copy node ---- */\n let copyNode: React.ReactNode = null;\n if (props.copyable) {\n const conf =\n typeof props.copyable === \"object\" ? props.copyable : ({} as CopyableConfig);\n copyNode = <CopyAction config={conf} fallbackText={fallbackText} />;\n }\n\n /* ---- edit node ---- */\n let editIconNode: React.ReactNode = null;\n if (editable) {\n const tip = editConf.tooltip ?? \"编辑\";\n editIconNode = (\n <span\n role=\"button\"\n aria-label={typeof tip === \"string\" ? tip : \"Edit\"}\n tabIndex={0}\n title={typeof tip === \"string\" && tip !== \"\" ? tip : undefined}\n onClick={(e) => {\n e.stopPropagation();\n startEdit();\n }}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n startEdit();\n }\n }}\n className=\"typo-action typo-edit\"\n >\n {editConf.icon ?? <Icon name=\"edit\" size={12} />}\n </span>\n );\n }\n\n /* ---- text-trigger edit ---- */\n if (editable && triggers.includes(\"text\") && !editing) {\n inner = (\n <span\n className=\"typo-edit-text-trigger\"\n onClick={() => startEdit()}\n >\n {inner}\n </span>\n );\n }\n\n /* ---- clamp / expand ---- */\n let style: React.CSSProperties | undefined = props.style;\n let extraCls: string | undefined;\n if (wantClamp && !expanded) {\n extraCls = rows > 1 ? \"ellipsis-multi\" : \"ellipsis\";\n if (rows > 1) {\n style = {\n ...style,\n WebkitLineClamp: rows,\n } as React.CSSProperties;\n }\n }\n\n let expandNode: React.ReactNode = null;\n if (wantClamp && ellConf.expandable && !expanded) {\n expandNode = (\n <a\n className=\"typo-expand\"\n onClick={(e) => {\n ellConf.onExpand?.(e);\n setExpanded(true);\n }}\n >\n {ellConf.symbol ?? \"展开\"}\n </a>\n );\n }\n\n /* ---- title attribute fallback ---- */\n const titleAttr =\n wantClamp && ellConf.tooltip\n ? typeof ellConf.tooltip === \"string\"\n ? ellConf.tooltip\n : fallbackText\n : undefined;\n\n return {\n editing,\n editConf,\n fallbackText,\n handleConfirm,\n handleCancel,\n inner,\n copyNode,\n editIconNode,\n expandNode,\n style,\n extraCls,\n titleAttr,\n };\n}\n\n/* ============================================================================\n * Title (h1–h5)\n * ========================================================================== */\n\nexport type TitleLevel = 1 | 2 | 3 | 4 | 5;\n\nexport interface TitleProps extends BaseTypographyProps {\n /** Heading level — 1..5. Defaults to 1. */\n level?: TitleLevel;\n}\n\n/**\n * `Typography.Title` — semantic heading.\n *\n * @example\n * <Title level={2} copyable>章节标题</Title>\n */\nexport const Title = React.forwardRef<HTMLElement, TitleProps>((props, ref) => {\n const { level = 1, ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = (`h${level}`) as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLHeadingElement>}\n className={buildClass(rest, `typo typo-title h${level}`, body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nTitle.displayName = \"Typography.Title\";\n\n/* ============================================================================\n * Text — inline span\n * ========================================================================== */\n\nexport interface TextProps extends BaseTypographyProps {\n /** Force the rendered tag (default `<span>`). */\n as?: keyof JSX.IntrinsicElements;\n}\n\n/**\n * `Typography.Text` — inline text with semantic / decorative variants.\n *\n * @example\n * <Text type=\"success\" strong>成功</Text>\n * <Text code>npm install</Text>\n * <Text copyable>可复制内容</Text>\n */\nexport const Text = React.forwardRef<HTMLElement, TextProps>((props, ref) => {\n const { as = \"span\", ...rest } = props;\n const body = useTypographyBody({ ...rest, multilineEdit: false });\n const Tag = as as \"span\";\n\n if (body.editing) {\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", \"editing\")}\n style={rest.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </Tag>\n );\n }\n\n return (\n <Tag\n ref={ref as React.Ref<HTMLSpanElement>}\n className={buildClass(rest, \"typo typo-text\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </Tag>\n );\n});\nText.displayName = \"Typography.Text\";\n\n/* ============================================================================\n * Paragraph — block <p>\n * ========================================================================== */\n\nexport interface ParagraphProps extends BaseTypographyProps {}\n\n/**\n * `Typography.Paragraph` — block paragraph with the same decorations as `Text`.\n *\n * @example\n * <Paragraph ellipsis={{ rows: 3, expandable: true }}>{long}</Paragraph>\n */\nexport const Paragraph = React.forwardRef<HTMLParagraphElement, ParagraphProps>(\n (props, ref) => {\n const body = useTypographyBody({ ...props, multilineEdit: true });\n\n if (body.editing) {\n return (\n <div\n ref={ref as unknown as React.Ref<HTMLDivElement>}\n className={buildClass(props, \"typo typo-paragraph\", \"editing\")}\n style={props.style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize ?? true}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </div>\n );\n }\n\n return (\n <p\n ref={ref}\n className={buildClass(props, \"typo typo-paragraph\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n >\n {body.inner}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </p>\n );\n }\n);\nParagraph.displayName = \"Typography.Paragraph\";\n\n/* ============================================================================\n * Link — anchor\n * ========================================================================== */\n\nexport interface LinkProps\n extends BaseTypographyProps,\n Omit<\n React.AnchorHTMLAttributes<HTMLAnchorElement>,\n keyof BaseTypographyProps | \"type\"\n > {\n href?: string;\n /** Add the leading external icon. */\n external?: boolean;\n /** Override the external icon. */\n externalIcon?: IconName;\n}\n\n/**\n * `Typography.Link` — styled `<a>` that participates in the same decoration\n * system as `Text`. Adds a small `arrow` for `external` links.\n *\n * @example\n * <Link href=\"https://example.com\" external>外部链接</Link>\n */\nexport const Link = React.forwardRef<HTMLAnchorElement, LinkProps>(\n (props, ref) => {\n const {\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n external,\n externalIcon = \"arrowRight\",\n target,\n rel,\n ...anchorRest\n } = props;\n const body = useTypographyBody({\n type,\n disabled,\n mark,\n code,\n keyboard,\n underline,\n delete: del,\n strong,\n italic,\n copyable,\n editable,\n ellipsis,\n className,\n style,\n children,\n });\n\n const safeRel =\n target === \"_blank\" ? rel ?? \"noopener noreferrer\" : rel;\n\n if (body.editing) {\n return (\n <span\n className={buildClass(props, \"typo typo-link\", \"editing\")}\n style={style}\n >\n <EditableEditor\n initial={body.editConf.text ?? body.fallbackText}\n multiline={false}\n maxLength={body.editConf.maxLength}\n autoSize={body.editConf.autoSize}\n onConfirm={body.handleConfirm}\n onCancel={body.handleCancel}\n />\n </span>\n );\n }\n\n return (\n <a\n ref={ref}\n className={buildClass(props, \"typo typo-link\", body.extraCls)}\n style={body.style}\n title={body.titleAttr}\n target={target}\n rel={safeRel}\n aria-disabled={disabled || undefined}\n onClick={(e) => {\n if (disabled) {\n e.preventDefault();\n return;\n }\n anchorRest.onClick?.(e);\n }}\n {...anchorRest}\n >\n {body.inner}\n {external && (\n <span className=\"typo-link-ext\" aria-hidden>\n <Icon name={externalIcon} size={12} />\n </span>\n )}\n {body.expandNode}\n {body.copyNode}\n {body.editIconNode}\n </a>\n );\n }\n);\nLink.displayName = \"Typography.Link\";\n\n/* ============================================================================\n * Typography wrapper (article-style block)\n * ========================================================================== */\n\nexport interface TypographyProps extends React.HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n}\n\ninterface TypographyComponent\n extends React.ForwardRefExoticComponent<\n TypographyProps & React.RefAttributes<HTMLDivElement>\n > {\n Title: typeof Title;\n Text: typeof Text;\n Paragraph: typeof Paragraph;\n Link: typeof Link;\n}\n\n/**\n * `Typography` — optional article-style wrapper that applies consistent\n * vertical rhythm to its `Title` / `Paragraph` / `Text` / `Link` children.\n *\n * @example\n * <Typography>\n * <Typography.Title level={2}>标题</Typography.Title>\n * <Typography.Paragraph>段落…</Typography.Paragraph>\n * </Typography>\n */\nconst TypographyBase = React.forwardRef<HTMLDivElement, TypographyProps>(\n ({ className = \"\", children, ...rest }, ref) => (\n <article\n ref={ref as unknown as React.Ref<HTMLElement>}\n className={`typo-root ${className}`}\n {...(rest as React.HTMLAttributes<HTMLElement>)}\n >\n {children}\n </article>\n )\n) as unknown as TypographyComponent;\n\nTypographyBase.Title = Title;\nTypographyBase.Text = Text;\nTypographyBase.Paragraph = Paragraph;\nTypographyBase.Link = Link;\n(TypographyBase as React.ForwardRefExoticComponent<unknown>).displayName =\n \"Typography\";\n\nexport const Typography = TypographyBase;\n"]}