react-public-components 1.2.3 → 1.2.4

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 (191) hide show
  1. package/dist/AudioPlayer/index.cjs +3 -3
  2. package/dist/AudioPlayer/index.js +2 -2
  3. package/dist/CodeSnippet/index.cjs +3 -2
  4. package/dist/CodeSnippet/index.css +157 -0
  5. package/dist/CodeSnippet/index.css.map +1 -1
  6. package/dist/CodeSnippet/index.d.ts +40 -4
  7. package/dist/CodeSnippet/index.js +2 -1
  8. package/dist/CodeSnippet/sandbox.d.ts +26 -0
  9. package/dist/CollapseBox/index.cjs +3 -3
  10. package/dist/CollapseBox/index.js +2 -2
  11. package/dist/ColorPicker/index.cjs +5 -5
  12. package/dist/ColorPicker/index.js +2 -2
  13. package/dist/ContextMenu/index.cjs +3 -3
  14. package/dist/ContextMenu/index.js +2 -2
  15. package/dist/CopyButton/index.cjs +3 -3
  16. package/dist/CopyButton/index.js +2 -2
  17. package/dist/CronPicker/index.cjs +4 -4
  18. package/dist/CronPicker/index.js +3 -3
  19. package/dist/DebounceSelect/index.cjs +3 -3
  20. package/dist/DebounceSelect/index.js +2 -2
  21. package/dist/DisabledBox/index.cjs +3 -3
  22. package/dist/DisabledBox/index.js +2 -2
  23. package/dist/DragSortList/index.cjs +3 -2
  24. package/dist/DragSortList/index.css +82 -13
  25. package/dist/DragSortList/index.css.map +1 -1
  26. package/dist/DragSortList/index.d.ts +8 -2
  27. package/dist/DragSortList/index.js +2 -1
  28. package/dist/FilePreviewer/index.cjs +4 -4
  29. package/dist/FilePreviewer/index.js +2 -2
  30. package/dist/Fullscreen/index.cjs +3 -3
  31. package/dist/Fullscreen/index.js +2 -2
  32. package/dist/GuidedTour/index.cjs +3 -3
  33. package/dist/GuidedTour/index.js +2 -2
  34. package/dist/ImageCropper/index.cjs +3 -3
  35. package/dist/ImageCropper/index.js +2 -2
  36. package/dist/InfiniteScrollList/index.cjs +3 -3
  37. package/dist/InfiniteScrollList/index.js +2 -2
  38. package/dist/JsonEditor/index.cjs +4 -4
  39. package/dist/JsonEditor/index.js +3 -3
  40. package/dist/KeyValEditor/index.cjs +3 -3
  41. package/dist/KeyValEditor/index.js +2 -2
  42. package/dist/PasswordStrength/index.cjs +4 -4
  43. package/dist/PasswordStrength/index.js +2 -2
  44. package/dist/PdfViewer/index.cjs +3 -3
  45. package/dist/PdfViewer/index.js +2 -2
  46. package/dist/QrCodeCard/index.cjs +3 -3
  47. package/dist/QrCodeCard/index.css +122 -32
  48. package/dist/QrCodeCard/index.css.map +1 -1
  49. package/dist/QrCodeCard/index.d.ts +10 -2
  50. package/dist/QrCodeCard/index.js +2 -2
  51. package/dist/SensitiveMask/index.cjs +5 -5
  52. package/dist/SensitiveMask/index.js +3 -3
  53. package/dist/Splitter/index.cjs +3 -3
  54. package/dist/Splitter/index.js +2 -2
  55. package/dist/TagInput/index.cjs +3 -3
  56. package/dist/TagInput/index.js +2 -2
  57. package/dist/TextEllipsis/index.cjs +4 -4
  58. package/dist/TextEllipsis/index.js +3 -3
  59. package/dist/TreeTransfer/index.cjs +3 -3
  60. package/dist/TreeTransfer/index.js +2 -2
  61. package/dist/VideoPlayer/index.cjs +3 -3
  62. package/dist/VideoPlayer/index.js +2 -2
  63. package/dist/{chunk-GV2RRQ2S.cjs → chunk-2EIAWXFA.cjs} +5 -5
  64. package/dist/{chunk-GV2RRQ2S.cjs.map → chunk-2EIAWXFA.cjs.map} +1 -1
  65. package/dist/{chunk-ISUXPTLV.js → chunk-2IDVNTKR.js} +93 -3
  66. package/dist/chunk-2IDVNTKR.js.map +1 -0
  67. package/dist/{chunk-6FVAQECF.js → chunk-2INP6NM4.js} +3 -3
  68. package/dist/{chunk-6FVAQECF.js.map → chunk-2INP6NM4.js.map} +1 -1
  69. package/dist/chunk-4KMVABTM.js +419 -0
  70. package/dist/chunk-4KMVABTM.js.map +1 -0
  71. package/dist/{chunk-VS2YVJOB.cjs → chunk-4TMBGQQE.cjs} +5 -5
  72. package/dist/{chunk-VS2YVJOB.cjs.map → chunk-4TMBGQQE.cjs.map} +1 -1
  73. package/dist/{chunk-PJB7ADK6.js → chunk-56VELHCH.js} +3 -3
  74. package/dist/{chunk-PJB7ADK6.js.map → chunk-56VELHCH.js.map} +1 -1
  75. package/dist/{chunk-4BDO5TJH.cjs → chunk-77ANKL4K.cjs} +8 -8
  76. package/dist/{chunk-4BDO5TJH.cjs.map → chunk-77ANKL4K.cjs.map} +1 -1
  77. package/dist/{chunk-OCN7L2ID.cjs → chunk-7ZBA4NHH.cjs} +4 -4
  78. package/dist/{chunk-OCN7L2ID.cjs.map → chunk-7ZBA4NHH.cjs.map} +1 -1
  79. package/dist/{chunk-MY4M7HVW.cjs → chunk-AHTRLNYK.cjs} +5 -5
  80. package/dist/{chunk-MY4M7HVW.cjs.map → chunk-AHTRLNYK.cjs.map} +1 -1
  81. package/dist/{chunk-WEOMKZC6.js → chunk-ANTFNDH4.js} +3 -3
  82. package/dist/{chunk-WEOMKZC6.js.map → chunk-ANTFNDH4.js.map} +1 -1
  83. package/dist/{chunk-EGZSSZBX.js → chunk-AXPVN2OO.js} +3 -3
  84. package/dist/{chunk-EGZSSZBX.js.map → chunk-AXPVN2OO.js.map} +1 -1
  85. package/dist/{chunk-LLWK5VKA.js → chunk-CURWX7OY.js} +3 -3
  86. package/dist/{chunk-LLWK5VKA.js.map → chunk-CURWX7OY.js.map} +1 -1
  87. package/dist/{chunk-WZRUBHS3.cjs → chunk-ED3ZG2VX.cjs} +5 -5
  88. package/dist/{chunk-WZRUBHS3.cjs.map → chunk-ED3ZG2VX.cjs.map} +1 -1
  89. package/dist/{chunk-BZXMWKD2.js → chunk-EDNBPLUS.js} +3 -3
  90. package/dist/{chunk-BZXMWKD2.js.map → chunk-EDNBPLUS.js.map} +1 -1
  91. package/dist/{chunk-MC3NERDH.js → chunk-EJYTTSW6.js} +3 -3
  92. package/dist/{chunk-MC3NERDH.js.map → chunk-EJYTTSW6.js.map} +1 -1
  93. package/dist/{chunk-3UNZXPOT.cjs → chunk-EKDJPOA3.cjs} +5 -5
  94. package/dist/{chunk-3UNZXPOT.cjs.map → chunk-EKDJPOA3.cjs.map} +1 -1
  95. package/dist/{chunk-XWXFENGT.js → chunk-EMT4NUI5.js} +3 -3
  96. package/dist/{chunk-XWXFENGT.js.map → chunk-EMT4NUI5.js.map} +1 -1
  97. package/dist/{chunk-HFPWBZID.js → chunk-ETFLLRTO.js} +3 -3
  98. package/dist/{chunk-HFPWBZID.js.map → chunk-ETFLLRTO.js.map} +1 -1
  99. package/dist/chunk-FZH5FL7X.cjs +167 -0
  100. package/dist/chunk-FZH5FL7X.cjs.map +1 -0
  101. package/dist/{chunk-6UKUAYN3.cjs → chunk-HKALWFWZ.cjs} +5 -5
  102. package/dist/{chunk-6UKUAYN3.cjs.map → chunk-HKALWFWZ.cjs.map} +1 -1
  103. package/dist/{chunk-IBOCJ2ZS.js → chunk-IF4XAUV3.js} +3 -3
  104. package/dist/{chunk-IBOCJ2ZS.js.map → chunk-IF4XAUV3.js.map} +1 -1
  105. package/dist/{chunk-MNY5P5EG.cjs → chunk-IPS7PC3M.cjs} +13 -13
  106. package/dist/{chunk-MNY5P5EG.cjs.map → chunk-IPS7PC3M.cjs.map} +1 -1
  107. package/dist/{chunk-V4O325BX.cjs → chunk-JHVPDKBM.cjs} +6 -6
  108. package/dist/{chunk-V4O325BX.cjs.map → chunk-JHVPDKBM.cjs.map} +1 -1
  109. package/dist/{chunk-6IXVUD2M.js → chunk-JNA5AQ2K.js} +3 -3
  110. package/dist/{chunk-6IXVUD2M.js.map → chunk-JNA5AQ2K.js.map} +1 -1
  111. package/dist/{chunk-NJIYP6SC.cjs → chunk-LFGBZXQH.cjs} +4 -4
  112. package/dist/{chunk-NJIYP6SC.cjs.map → chunk-LFGBZXQH.cjs.map} +1 -1
  113. package/dist/{chunk-ZLWY7QS2.cjs → chunk-M3GQ7RCV.cjs} +4 -4
  114. package/dist/{chunk-ZLWY7QS2.cjs.map → chunk-M3GQ7RCV.cjs.map} +1 -1
  115. package/dist/{chunk-AFR7V4A4.js → chunk-M4FZJALR.js} +4 -4
  116. package/dist/{chunk-AFR7V4A4.js.map → chunk-M4FZJALR.js.map} +1 -1
  117. package/dist/{chunk-CT66HLZ5.js → chunk-MQJBUHDB.js} +3 -3
  118. package/dist/{chunk-CT66HLZ5.js.map → chunk-MQJBUHDB.js.map} +1 -1
  119. package/dist/{chunk-V7IUSCQS.js → chunk-OLLVIQPL.js} +3 -3
  120. package/dist/{chunk-V7IUSCQS.js.map → chunk-OLLVIQPL.js.map} +1 -1
  121. package/dist/{chunk-2DIU347W.cjs → chunk-OONBZRPV.cjs} +4 -4
  122. package/dist/{chunk-2DIU347W.cjs.map → chunk-OONBZRPV.cjs.map} +1 -1
  123. package/dist/{chunk-56TD4LDC.js → chunk-P5CS7V4W.js} +3 -3
  124. package/dist/{chunk-56TD4LDC.js.map → chunk-P5CS7V4W.js.map} +1 -1
  125. package/dist/{chunk-HUXPCMNP.js → chunk-PTFKE67K.js} +3 -3
  126. package/dist/{chunk-HUXPCMNP.js.map → chunk-PTFKE67K.js.map} +1 -1
  127. package/dist/{chunk-PUTAVQJZ.js → chunk-PUMVD7CP.js} +3 -3
  128. package/dist/{chunk-PUTAVQJZ.js.map → chunk-PUMVD7CP.js.map} +1 -1
  129. package/dist/{chunk-KXZM322K.cjs → chunk-PYCSRJSF.cjs} +7 -7
  130. package/dist/{chunk-KXZM322K.cjs.map → chunk-PYCSRJSF.cjs.map} +1 -1
  131. package/dist/{chunk-PUJJHD22.js → chunk-Q7OVUH5K.js} +3 -3
  132. package/dist/{chunk-PUJJHD22.js.map → chunk-Q7OVUH5K.js.map} +1 -1
  133. package/dist/{chunk-2UCTE6YN.cjs → chunk-QP3RKA4J.cjs} +4 -4
  134. package/dist/{chunk-2UCTE6YN.cjs.map → chunk-QP3RKA4J.cjs.map} +1 -1
  135. package/dist/{chunk-OKCQZO5E.js → chunk-QRZ2GVVJ.js} +3 -3
  136. package/dist/{chunk-OKCQZO5E.js.map → chunk-QRZ2GVVJ.js.map} +1 -1
  137. package/dist/{chunk-MBOWSS4B.cjs → chunk-R4V3EJVP.cjs} +98 -2
  138. package/dist/chunk-R4V3EJVP.cjs.map +1 -0
  139. package/dist/{chunk-4OXVTRYV.cjs → chunk-RN5WU7KA.cjs} +7 -7
  140. package/dist/{chunk-4OXVTRYV.cjs.map → chunk-RN5WU7KA.cjs.map} +1 -1
  141. package/dist/{chunk-WWXBH57R.cjs → chunk-TNZ2OLGW.cjs} +4 -4
  142. package/dist/{chunk-WWXBH57R.cjs.map → chunk-TNZ2OLGW.cjs.map} +1 -1
  143. package/dist/chunk-TUDLE3RT.cjs +429 -0
  144. package/dist/chunk-TUDLE3RT.cjs.map +1 -0
  145. package/dist/{chunk-B7NN6SZD.cjs → chunk-TUEVILTA.cjs} +5 -5
  146. package/dist/{chunk-B7NN6SZD.cjs.map → chunk-TUEVILTA.cjs.map} +1 -1
  147. package/dist/{chunk-ZUW3XLZQ.cjs → chunk-U2EBNBGK.cjs} +4 -4
  148. package/dist/{chunk-ZUW3XLZQ.cjs.map → chunk-U2EBNBGK.cjs.map} +1 -1
  149. package/dist/{chunk-JAW7Q2YC.cjs → chunk-UAUP5TJK.cjs} +5 -5
  150. package/dist/{chunk-JAW7Q2YC.cjs.map → chunk-UAUP5TJK.cjs.map} +1 -1
  151. package/dist/{chunk-2MDYHFLH.cjs → chunk-UZB7GOEI.cjs} +4 -4
  152. package/dist/{chunk-2MDYHFLH.cjs.map → chunk-UZB7GOEI.cjs.map} +1 -1
  153. package/dist/{chunk-ZNFW6L3E.cjs → chunk-VJOO2DG3.cjs} +8 -8
  154. package/dist/{chunk-ZNFW6L3E.cjs.map → chunk-VJOO2DG3.cjs.map} +1 -1
  155. package/dist/{chunk-JECYRODB.js → chunk-W5JA3YTT.js} +3 -3
  156. package/dist/{chunk-JECYRODB.js.map → chunk-W5JA3YTT.js.map} +1 -1
  157. package/dist/{chunk-QZZGBUW4.js → chunk-WKF4C6TJ.js} +3 -3
  158. package/dist/{chunk-QZZGBUW4.js.map → chunk-WKF4C6TJ.js.map} +1 -1
  159. package/dist/{chunk-64LBDDZU.js → chunk-XLOGMDAQ.js} +3 -3
  160. package/dist/{chunk-64LBDDZU.js.map → chunk-XLOGMDAQ.js.map} +1 -1
  161. package/dist/chunk-XUAHWX6B.js +153 -0
  162. package/dist/chunk-XUAHWX6B.js.map +1 -0
  163. package/dist/chunk-Y54KVULF.js +161 -0
  164. package/dist/chunk-Y54KVULF.js.map +1 -0
  165. package/dist/{chunk-NUTVJGVT.cjs → chunk-YP4XTMK3.cjs} +4 -4
  166. package/dist/{chunk-NUTVJGVT.cjs.map → chunk-YP4XTMK3.cjs.map} +1 -1
  167. package/dist/{chunk-MGUNFP6P.js → chunk-ZCBT56AG.js} +3 -3
  168. package/dist/{chunk-MGUNFP6P.js.map → chunk-ZCBT56AG.js.map} +1 -1
  169. package/dist/chunk-ZWKUHYTV.cjs +155 -0
  170. package/dist/chunk-ZWKUHYTV.cjs.map +1 -0
  171. package/dist/index.cjs +74 -58
  172. package/dist/index.css +361 -45
  173. package/dist/index.css.map +1 -1
  174. package/dist/index.js +27 -27
  175. package/dist/src/icons.d.ts +18 -0
  176. package/dist/src/index.d.ts +3 -1
  177. package/package.json +1 -1
  178. package/dist/chunk-5VSEUDVY.js +0 -45
  179. package/dist/chunk-5VSEUDVY.js.map +0 -1
  180. package/dist/chunk-EOGYWPX7.cjs +0 -47
  181. package/dist/chunk-EOGYWPX7.cjs.map +0 -1
  182. package/dist/chunk-EQ7S5SYM.js +0 -67
  183. package/dist/chunk-EQ7S5SYM.js.map +0 -1
  184. package/dist/chunk-FYFL4PFD.cjs +0 -69
  185. package/dist/chunk-FYFL4PFD.cjs.map +0 -1
  186. package/dist/chunk-ISUXPTLV.js.map +0 -1
  187. package/dist/chunk-JEDW76LI.cjs +0 -107
  188. package/dist/chunk-JEDW76LI.cjs.map +0 -1
  189. package/dist/chunk-MBOWSS4B.cjs.map +0 -1
  190. package/dist/chunk-XOMV26WS.js +0 -105
  191. package/dist/chunk-XOMV26WS.js.map +0 -1
@@ -0,0 +1,419 @@
1
+ import { CodeOutlined, CheckOutlined, CopyOutlined, ExportOutlined, ThunderboltOutlined, CodePenOutlined, CodeSandboxOutlined, UpOutlined, DownOutlined } from './chunk-2IDVNTKR.js';
2
+ import React, { useState } from 'react';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ // CodeSnippet/sandbox.ts
6
+ var defaultPackageJson = (dependencies = {}, devDependencies = {}) => ({
7
+ name: "react-public-components-demo",
8
+ version: "1.0.0",
9
+ description: "Interactive demo generated by react-public-components",
10
+ main: "src/index.tsx",
11
+ dependencies: {
12
+ react: "^18.3.1",
13
+ "react-dom": "^18.3.1",
14
+ "react-public-components": "latest",
15
+ ...dependencies
16
+ },
17
+ devDependencies: {
18
+ "@types/react": "^18.3.3",
19
+ "@types/react-dom": "^18.3.0",
20
+ typescript: "^5.5.0",
21
+ ...devDependencies
22
+ }
23
+ });
24
+ var defaultHtml = `<!DOCTYPE html>
25
+ <html lang="zh-CN">
26
+ <head>
27
+ <meta charset="utf-8" />
28
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
29
+ <title>React Public Components Demo</title>
30
+ <link rel="stylesheet" href="https://unpkg.com/react-public-components/dist/index.css" />
31
+ <style>
32
+ * { box-sizing: border-box; }
33
+ body { margin: 0; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background: #f8fafc; }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <div id="root"></div>
38
+ </body>
39
+ </html>`;
40
+ var defaultIndexTsx = `import React from 'react';
41
+ import { createRoot } from 'react-dom/client';
42
+ import 'react-public-components/dist/index.css';
43
+ import App from './App';
44
+
45
+ const container = document.getElementById('root');
46
+ if (container) {
47
+ const root = createRoot(container);
48
+ root.render(
49
+ <React.StrictMode>
50
+ <App />
51
+ </React.StrictMode>
52
+ );
53
+ }`;
54
+ function openInStackBlitz(code, config = {}) {
55
+ const form = document.createElement("form");
56
+ form.method = "POST";
57
+ form.action = "https://stackblitz.com/run";
58
+ form.target = "_blank";
59
+ form.style.display = "none";
60
+ const pkg = defaultPackageJson(config.dependencies, config.devDependencies);
61
+ const fields = {
62
+ "project[title]": config.title || "react-public-components Demo",
63
+ "project[description]": config.description || "Live Component Demo",
64
+ "project[template]": "create-react-app",
65
+ "project[files][package.json]": JSON.stringify(pkg, null, 2),
66
+ "project[files][public/index.html]": defaultHtml,
67
+ "project[files][src/index.tsx]": defaultIndexTsx,
68
+ "project[files][src/App.tsx]": code,
69
+ "project[files][tsconfig.json]": JSON.stringify(
70
+ {
71
+ compilerOptions: {
72
+ target: "es5",
73
+ lib: ["dom", "dom.iterable", "esnext"],
74
+ allowJs: true,
75
+ skipLibCheck: true,
76
+ esModuleInterop: true,
77
+ allowSyntheticDefaultImports: true,
78
+ strict: true,
79
+ forceConsistentCasingInFileNames: true,
80
+ noFallthroughCasesInSwitch: true,
81
+ module: "esnext",
82
+ moduleResolution: "node",
83
+ resolveJsonModule: true,
84
+ isolatedModules: true,
85
+ noEmit: true,
86
+ jsx: "react-jsx"
87
+ },
88
+ include: ["src"]
89
+ },
90
+ null,
91
+ 2
92
+ )
93
+ };
94
+ Object.entries(fields).forEach(([key, val]) => {
95
+ const input = document.createElement("input");
96
+ input.type = "hidden";
97
+ input.name = key;
98
+ input.value = val;
99
+ form.appendChild(input);
100
+ });
101
+ document.body.appendChild(form);
102
+ form.submit();
103
+ document.body.removeChild(form);
104
+ }
105
+ function openInCodeSandbox(code, config = {}) {
106
+ const pkg = defaultPackageJson(config.dependencies, config.devDependencies);
107
+ const files = {
108
+ "package.json": {
109
+ content: JSON.stringify(pkg, null, 2)
110
+ },
111
+ "public/index.html": {
112
+ content: defaultHtml
113
+ },
114
+ "src/index.tsx": {
115
+ content: defaultIndexTsx
116
+ },
117
+ "src/App.tsx": {
118
+ content: code
119
+ }
120
+ };
121
+ fetch("https://codesandbox.io/api/v1/sandboxes/define?json=1", {
122
+ method: "POST",
123
+ headers: {
124
+ "Content-Type": "application/json",
125
+ Accept: "application/json"
126
+ },
127
+ body: JSON.stringify({ files })
128
+ }).then((res) => res.json()).then((data) => {
129
+ if (data && data.sandbox_id) {
130
+ window.open(`https://codesandbox.io/s/${data.sandbox_id}`, "_blank");
131
+ }
132
+ }).catch(() => {
133
+ openInStackBlitz(code, config);
134
+ });
135
+ }
136
+ function openInCodePen(code, config = {}) {
137
+ const form = document.createElement("form");
138
+ form.method = "POST";
139
+ form.action = "https://codepen.io/pen/define/";
140
+ form.target = "_blank";
141
+ form.style.display = "none";
142
+ let cleanJs = code.replace(/import\s+[\s\S]*?from\s+['"][^'"]+['"];?/g, "").replace(/export\s+default\s+App;?/g, "").replace(/export\s+default\s+/g, "");
143
+ cleanJs += '\n\nconst root = ReactDOM.createRoot(document.getElementById("root"));\nroot.render(<App />);';
144
+ const data = {
145
+ title: config.title || "react-public-components Demo",
146
+ description: config.description || "Live Component Demo",
147
+ html: '<div id="root"></div>',
148
+ js: cleanJs,
149
+ js_pre_processor: "babel",
150
+ css: 'body { margin: 0; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background: #f8fafc; }',
151
+ js_external: [
152
+ "https://unpkg.com/react@18/umd/react.production.min.js",
153
+ "https://unpkg.com/react-dom@18/umd/react-dom.production.min.js",
154
+ "https://unpkg.com/react-public-components/dist/index.umd.js"
155
+ ].join(";"),
156
+ css_external: [
157
+ "https://unpkg.com/react-public-components/dist/index.css"
158
+ ].join(";")
159
+ };
160
+ const input = document.createElement("input");
161
+ input.type = "hidden";
162
+ input.name = "data";
163
+ input.value = JSON.stringify(data);
164
+ form.appendChild(input);
165
+ document.body.appendChild(form);
166
+ form.submit();
167
+ document.body.removeChild(form);
168
+ }
169
+ function openInNewTab(code, title = "Demo Preview") {
170
+ const newWin = window.open("", "_blank");
171
+ if (!newWin) return;
172
+ const htmlContent = `<!DOCTYPE html>
173
+ <html>
174
+ <head>
175
+ <meta charset="utf-8" />
176
+ <title>${title}</title>
177
+ <link rel="stylesheet" href="https://unpkg.com/react-public-components/dist/index.css" />
178
+ <script src="https://unpkg.com/react@18/umd/react.production.min.js"></script>
179
+ <script src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script>
180
+ <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
181
+ <style>
182
+ * { box-sizing: border-box; }
183
+ body { margin: 0; padding: 24px; background: #f8fafc; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; }
184
+ #root { background: #fff; padding: 32px; border-radius: 12px; box-shadow: 0 4px 16px rgba(0,0,0,0.06); max-width: 900px; margin: 0 auto; }
185
+ </style>
186
+ </head>
187
+ <body>
188
+ <div id="root"></div>
189
+ <script type="text/babel">
190
+ const { useState, useEffect, useRef, useMemo, useCallback } = React;
191
+
192
+ ${code.replace(/import\s+[\s\S]*?from\s+['"][^'"]+['"];?/g, "").replace(/export\s+default\s+App;?/g, "").replace(/export\s+default\s+/g, "")}
193
+
194
+ if (typeof App !== 'undefined') {
195
+ const root = ReactDOM.createRoot(document.getElementById('root'));
196
+ root.render(<App />);
197
+ }
198
+ </script>
199
+ </body>
200
+ </html>`;
201
+ newWin.document.open();
202
+ newWin.document.write(htmlContent);
203
+ newWin.document.close();
204
+ }
205
+ var CodeSnippet = ({
206
+ code: singleCode = "",
207
+ language: defaultLang = "tsx",
208
+ theme = "dark",
209
+ title,
210
+ showLineNumbers = false,
211
+ copyable = true,
212
+ tabs,
213
+ activeTabKey: controlledTabKey,
214
+ defaultActiveTabKey,
215
+ onTabChange,
216
+ showActions = false,
217
+ actions = ["codesandbox", "codepen", "stackblitz", "external", "copy", "collapse"],
218
+ onAction,
219
+ sandboxConfig,
220
+ externalUrl,
221
+ collapsible = false,
222
+ defaultCollapsed = false,
223
+ collapsed: controlledCollapsed,
224
+ onCollapseChange,
225
+ showCollapseFooter = false,
226
+ className = "",
227
+ style
228
+ }) => {
229
+ const hasTabs = Array.isArray(tabs) && tabs.length > 0;
230
+ const [internalTabKey, setInternalTabKey] = useState(
231
+ defaultActiveTabKey != null ? defaultActiveTabKey : hasTabs ? tabs[0].key : ""
232
+ );
233
+ const activeKey = controlledTabKey !== void 0 ? controlledTabKey : internalTabKey;
234
+ const [internalCollapsed, setInternalCollapsed] = useState(defaultCollapsed);
235
+ const isCollapsed = controlledCollapsed !== void 0 ? controlledCollapsed : internalCollapsed;
236
+ const [copied, setCopied] = useState(false);
237
+ const currentTab = hasTabs ? tabs.find((t) => t.key === activeKey) || tabs[0] : null;
238
+ const currentCode = currentTab ? currentTab.code : singleCode;
239
+ const currentLanguage = currentTab ? currentTab.language || defaultLang : defaultLang;
240
+ const handleCopy = async () => {
241
+ try {
242
+ await navigator.clipboard.writeText(currentCode);
243
+ setCopied(true);
244
+ setTimeout(() => setCopied(false), 1500);
245
+ onAction == null ? void 0 : onAction("copy");
246
+ } catch (e) {
247
+ }
248
+ };
249
+ const handleToggleCollapse = () => {
250
+ const next = !isCollapsed;
251
+ if (controlledCollapsed === void 0) {
252
+ setInternalCollapsed(next);
253
+ }
254
+ onCollapseChange == null ? void 0 : onCollapseChange(next);
255
+ onAction == null ? void 0 : onAction("collapse");
256
+ };
257
+ const handleActionClick = (action) => {
258
+ const config = {
259
+ title: typeof title === "string" ? title : "react-public-components Demo",
260
+ ...sandboxConfig
261
+ };
262
+ if (action === "codesandbox") {
263
+ openInCodeSandbox(currentCode, config);
264
+ } else if (action === "codepen") {
265
+ openInCodePen(currentCode, config);
266
+ } else if (action === "stackblitz") {
267
+ openInStackBlitz(currentCode, config);
268
+ } else if (action === "external") {
269
+ if (externalUrl) {
270
+ window.open(externalUrl, "_blank");
271
+ } else {
272
+ openInNewTab(currentCode, config.title || "Demo Preview");
273
+ }
274
+ } else if (action === "copy") {
275
+ handleCopy();
276
+ return;
277
+ } else if (action === "collapse") {
278
+ handleToggleCollapse();
279
+ return;
280
+ }
281
+ onAction == null ? void 0 : onAction(action);
282
+ };
283
+ const handleTabClick = (key) => {
284
+ if (controlledTabKey === void 0) {
285
+ setInternalTabKey(key);
286
+ }
287
+ onTabChange == null ? void 0 : onTabChange(key);
288
+ };
289
+ const lines = currentCode.split("\n");
290
+ return /* @__PURE__ */ jsxs(
291
+ "div",
292
+ {
293
+ className: `rpc_code_snippet rpc_code_snippet_${theme} ${isCollapsed ? "rpc_code_snippet_collapsed" : ""} ${className}`,
294
+ style,
295
+ children: [
296
+ showActions && /* @__PURE__ */ jsx("div", { className: "rpc_code_snippet_actions_bar", children: /* @__PURE__ */ jsx("div", { className: "rpc_code_snippet_actions_list", children: actions.map((act, index) => {
297
+ if (typeof act !== "string") {
298
+ return /* @__PURE__ */ jsx(React.Fragment, { children: act }, index);
299
+ }
300
+ switch (act) {
301
+ case "codesandbox":
302
+ return /* @__PURE__ */ jsx(
303
+ "button",
304
+ {
305
+ type: "button",
306
+ className: "rpc_code_snippet_action_btn",
307
+ title: "\u5728 CodeSandbox \u4E2D\u6253\u5F00\u5E76\u5728\u7EBF\u8FD0\u884C",
308
+ onClick: () => handleActionClick("codesandbox"),
309
+ children: /* @__PURE__ */ jsx(CodeSandboxOutlined, {})
310
+ },
311
+ "codesandbox"
312
+ );
313
+ case "codepen":
314
+ return /* @__PURE__ */ jsx(
315
+ "button",
316
+ {
317
+ type: "button",
318
+ className: "rpc_code_snippet_action_btn",
319
+ title: "\u5728 CodePen \u4E2D\u6253\u5F00\u5E76\u6F14\u7EC3",
320
+ onClick: () => handleActionClick("codepen"),
321
+ children: /* @__PURE__ */ jsx(CodePenOutlined, {})
322
+ },
323
+ "codepen"
324
+ );
325
+ case "stackblitz":
326
+ return /* @__PURE__ */ jsx(
327
+ "button",
328
+ {
329
+ type: "button",
330
+ className: "rpc_code_snippet_action_btn",
331
+ title: "\u5728 StackBlitz \u4E2D\u6781\u901F\u542F\u52A8",
332
+ onClick: () => handleActionClick("stackblitz"),
333
+ children: /* @__PURE__ */ jsx(ThunderboltOutlined, {})
334
+ },
335
+ "stackblitz"
336
+ );
337
+ case "external":
338
+ return /* @__PURE__ */ jsx(
339
+ "button",
340
+ {
341
+ type: "button",
342
+ className: "rpc_code_snippet_action_btn",
343
+ title: "\u5728\u72EC\u7ACB\u65B0\u6807\u7B7E\u9875\u4E2D\u5168\u5C4F\u8FD0\u884C",
344
+ onClick: () => handleActionClick("external"),
345
+ children: /* @__PURE__ */ jsx(ExportOutlined, {})
346
+ },
347
+ "external"
348
+ );
349
+ case "copy":
350
+ return /* @__PURE__ */ jsx(
351
+ "button",
352
+ {
353
+ type: "button",
354
+ className: `rpc_code_snippet_action_btn ${copied ? "rpc_code_snippet_action_copied" : ""}`,
355
+ title: copied ? "\u5DF2\u590D\u5236\u5230\u526A\u8D34\u677F\uFF01" : "\u590D\u5236\u4EE3\u7801",
356
+ onClick: () => handleActionClick("copy"),
357
+ children: copied ? /* @__PURE__ */ jsx(CheckOutlined, { style: { color: "#52c41a" } }) : /* @__PURE__ */ jsx(CopyOutlined, {})
358
+ },
359
+ "copy"
360
+ );
361
+ case "collapse":
362
+ return /* @__PURE__ */ jsx(
363
+ "button",
364
+ {
365
+ type: "button",
366
+ className: `rpc_code_snippet_action_btn ${!isCollapsed ? "rpc_code_snippet_action_active" : ""}`,
367
+ title: isCollapsed ? "\u5C55\u5F00\u4EE3\u7801" : "\u6536\u8D77\u4EE3\u7801",
368
+ onClick: () => handleActionClick("collapse"),
369
+ children: /* @__PURE__ */ jsx(CodeOutlined, {})
370
+ },
371
+ "collapse"
372
+ );
373
+ default:
374
+ return null;
375
+ }
376
+ }) }) }),
377
+ hasTabs && /* @__PURE__ */ jsx("div", { className: "rpc_code_snippet_tabs_bar", children: tabs.map((tab) => /* @__PURE__ */ jsx(
378
+ "div",
379
+ {
380
+ className: `rpc_code_snippet_tab_item ${tab.key === activeKey ? "rpc_code_snippet_tab_active" : ""}`,
381
+ onClick: () => handleTabClick(tab.key),
382
+ children: tab.label
383
+ },
384
+ tab.key
385
+ )) }),
386
+ !showActions && /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_top_bar", children: [
387
+ /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_dots", children: [
388
+ /* @__PURE__ */ jsx("span", { className: "rpc_code_snippet_dot rpc_code_snippet_dot_red" }),
389
+ /* @__PURE__ */ jsx("span", { className: "rpc_code_snippet_dot rpc_code_snippet_dot_yellow" }),
390
+ /* @__PURE__ */ jsx("span", { className: "rpc_code_snippet_dot rpc_code_snippet_dot_green" })
391
+ ] }),
392
+ /* @__PURE__ */ jsx("span", { className: "rpc_code_snippet_lang", children: title != null ? title : currentLanguage }),
393
+ copyable ? /* @__PURE__ */ jsx("button", { type: "button", className: "rpc_code_snippet_copy_btn", onClick: handleCopy, children: copied ? "\u2713 \u5DF2\u590D\u5236" : "\u590D\u5236" }) : /* @__PURE__ */ jsx("span", {})
394
+ ] }),
395
+ !isCollapsed && /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_body", children: [
396
+ showLineNumbers && /* @__PURE__ */ jsx("div", { className: "rpc_code_snippet_line_numbers", children: lines.map((_, idx) => /* @__PURE__ */ jsx("span", { className: "rpc_code_snippet_line_no", children: idx + 1 }, idx)) }),
397
+ /* @__PURE__ */ jsx("pre", { className: "rpc_code_snippet_content", children: /* @__PURE__ */ jsx("code", { children: currentCode }) }),
398
+ showActions && copyable && /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_floating_copy", onClick: handleCopy, title: "\u590D\u5236\u4EE3\u7801", children: [
399
+ copied ? /* @__PURE__ */ jsx(CheckOutlined, { style: { color: "#52c41a" } }) : /* @__PURE__ */ jsx(CopyOutlined, {}),
400
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, marginLeft: 4 }, children: currentLanguage })
401
+ ] })
402
+ ] }),
403
+ (showCollapseFooter || collapsible) && !isCollapsed && /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_footer", onClick: handleToggleCollapse, children: [
404
+ /* @__PURE__ */ jsx(UpOutlined, { style: { marginRight: 6, fontSize: 12 } }),
405
+ /* @__PURE__ */ jsx("span", { children: "\u6536\u8D77\u4EE3\u7801" })
406
+ ] }),
407
+ (showCollapseFooter || collapsible) && isCollapsed && /* @__PURE__ */ jsxs("div", { className: "rpc_code_snippet_footer", onClick: handleToggleCollapse, children: [
408
+ /* @__PURE__ */ jsx(DownOutlined, { style: { marginRight: 6, fontSize: 12 } }),
409
+ /* @__PURE__ */ jsx("span", { children: "\u5C55\u5F00\u4EE3\u7801" })
410
+ ] })
411
+ ]
412
+ }
413
+ );
414
+ };
415
+ var CodeSnippet_default = CodeSnippet;
416
+
417
+ export { CodeSnippet_default, openInCodePen, openInCodeSandbox, openInNewTab, openInStackBlitz };
418
+ //# sourceMappingURL=chunk-4KMVABTM.js.map
419
+ //# sourceMappingURL=chunk-4KMVABTM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../CodeSnippet/sandbox.ts","../CodeSnippet/index.tsx"],"names":[],"mappings":"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","file":"chunk-4KMVABTM.js","sourcesContent":["/**\n * 在线沙箱 (StackBlitz / CodeSandbox / CodePen) 一键调起工具\n * 零第三方 UI 库依赖,原生运行 react-public-components\n */\n\nexport interface SandboxConfig {\n\ttitle?: string;\n\tdescription?: string;\n\tdependencies?: Record<string, string>;\n\tdevDependencies?: Record<string, string>;\n}\n\nconst defaultPackageJson = (\n\tdependencies: Record<string, string> = {},\n\tdevDependencies: Record<string, string> = {},\n) => ({\n\tname: 'react-public-components-demo',\n\tversion: '1.0.0',\n\tdescription: 'Interactive demo generated by react-public-components',\n\tmain: 'src/index.tsx',\n\tdependencies: {\n\t\treact: '^18.3.1',\n\t\t'react-dom': '^18.3.1',\n\t\t'react-public-components': 'latest',\n\t\t...dependencies,\n\t},\n\tdevDependencies: {\n\t\t'@types/react': '^18.3.3',\n\t\t'@types/react-dom': '^18.3.0',\n\t\ttypescript: '^5.5.0',\n\t\t...devDependencies,\n\t},\n});\n\nconst defaultHtml = `<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>React Public Components Demo</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/react-public-components/dist/index.css\" />\n <style>\n * { box-sizing: border-box; }\n body { margin: 0; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; background: #f8fafc; }\n </style>\n</head>\n<body>\n <div id=\"root\"></div>\n</body>\n</html>`;\n\nconst defaultIndexTsx = `import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport 'react-public-components/dist/index.css';\nimport App from './App';\n\nconst container = document.getElementById('root');\nif (container) {\n const root = createRoot(container);\n root.render(\n <React.StrictMode>\n <App />\n </React.StrictMode>\n );\n}`;\n\n/**\n * 在 StackBlitz 中打开项目(极速、免注册、支持完整 TSX 编译)\n */\nexport function openInStackBlitz(code: string, config: SandboxConfig = {}) {\n\tconst form = document.createElement('form');\n\tform.method = 'POST';\n\tform.action = 'https://stackblitz.com/run';\n\tform.target = '_blank';\n\tform.style.display = 'none';\n\n\tconst pkg = defaultPackageJson(config.dependencies, config.devDependencies);\n\n\tconst fields: Record<string, string> = {\n\t\t'project[title]': config.title || 'react-public-components Demo',\n\t\t'project[description]': config.description || 'Live Component Demo',\n\t\t'project[template]': 'create-react-app',\n\t\t'project[files][package.json]': JSON.stringify(pkg, null, 2),\n\t\t'project[files][public/index.html]': defaultHtml,\n\t\t'project[files][src/index.tsx]': defaultIndexTsx,\n\t\t'project[files][src/App.tsx]': code,\n\t\t'project[files][tsconfig.json]': JSON.stringify(\n\t\t\t{\n\t\t\t\tcompilerOptions: {\n\t\t\t\t\ttarget: 'es5',\n\t\t\t\t\tlib: ['dom', 'dom.iterable', 'esnext'],\n\t\t\t\t\tallowJs: true,\n\t\t\t\t\tskipLibCheck: true,\n\t\t\t\t\tesModuleInterop: true,\n\t\t\t\t\tallowSyntheticDefaultImports: true,\n\t\t\t\t\tstrict: true,\n\t\t\t\t\tforceConsistentCasingInFileNames: true,\n\t\t\t\t\tnoFallthroughCasesInSwitch: true,\n\t\t\t\t\tmodule: 'esnext',\n\t\t\t\t\tmoduleResolution: 'node',\n\t\t\t\t\tresolveJsonModule: true,\n\t\t\t\t\tisolatedModules: true,\n\t\t\t\t\tnoEmit: true,\n\t\t\t\t\tjsx: 'react-jsx',\n\t\t\t\t},\n\t\t\t\tinclude: ['src'],\n\t\t\t},\n\t\t\tnull,\n\t\t\t2,\n\t\t),\n\t};\n\n\tObject.entries(fields).forEach(([key, val]) => {\n\t\tconst input = document.createElement('input');\n\t\tinput.type = 'hidden';\n\t\tinput.name = key;\n\t\tinput.value = val;\n\t\tform.appendChild(input);\n\t});\n\n\tdocument.body.appendChild(form);\n\tform.submit();\n\tdocument.body.removeChild(form);\n}\n\n/**\n * 在 CodeSandbox 中打开项目\n */\nexport function openInCodeSandbox(code: string, config: SandboxConfig = {}) {\n\tconst pkg = defaultPackageJson(config.dependencies, config.devDependencies);\n\n\tconst files = {\n\t\t'package.json': {\n\t\t\tcontent: JSON.stringify(pkg, null, 2),\n\t\t},\n\t\t'public/index.html': {\n\t\t\tcontent: defaultHtml,\n\t\t},\n\t\t'src/index.tsx': {\n\t\t\tcontent: defaultIndexTsx,\n\t\t},\n\t\t'src/App.tsx': {\n\t\t\tcontent: code,\n\t\t},\n\t};\n\n\tfetch('https://codesandbox.io/api/v1/sandboxes/define?json=1', {\n\t\tmethod: 'POST',\n\t\theaders: {\n\t\t\t'Content-Type': 'application/json',\n\t\t\tAccept: 'application/json',\n\t\t},\n\t\tbody: JSON.stringify({ files }),\n\t})\n\t\t.then((res) => res.json())\n\t\t.then((data) => {\n\t\t\tif (data && data.sandbox_id) {\n\t\t\t\twindow.open(`https://codesandbox.io/s/${data.sandbox_id}`, '_blank');\n\t\t\t}\n\t\t})\n\t\t.catch(() => {\n\t\t\t// 降级使用 StackBlitz 打开\n\t\t\topenInStackBlitz(code, config);\n\t\t});\n}\n\n/**\n * 在 CodePen 中打开演练场\n */\nexport function openInCodePen(code: string, config: SandboxConfig = {}) {\n\tconst form = document.createElement('form');\n\tform.method = 'POST';\n\tform.action = 'https://codepen.io/pen/define/';\n\tform.target = '_blank';\n\tform.style.display = 'none';\n\n\tlet cleanJs = code\n\t\t.replace(/import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?/g, '')\n\t\t.replace(/export\\s+default\\s+App;?/g, '')\n\t\t.replace(/export\\s+default\\s+/g, '');\n\n\tcleanJs += '\\n\\nconst root = ReactDOM.createRoot(document.getElementById(\"root\"));\\nroot.render(<App />);';\n\n\tconst data = {\n\t\ttitle: config.title || 'react-public-components Demo',\n\t\tdescription: config.description || 'Live Component Demo',\n\t\thtml: '<div id=\"root\"></div>',\n\t\tjs: cleanJs,\n\t\tjs_pre_processor: 'babel',\n\t\tcss: 'body { margin: 0; padding: 24px; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; background: #f8fafc; }',\n\t\tjs_external: [\n\t\t\t'https://unpkg.com/react@18/umd/react.production.min.js',\n\t\t\t'https://unpkg.com/react-dom@18/umd/react-dom.production.min.js',\n\t\t\t'https://unpkg.com/react-public-components/dist/index.umd.js',\n\t\t].join(';'),\n\t\tcss_external: [\n\t\t\t'https://unpkg.com/react-public-components/dist/index.css',\n\t\t].join(';'),\n\t};\n\n\tconst input = document.createElement('input');\n\tinput.type = 'hidden';\n\tinput.name = 'data';\n\tinput.value = JSON.stringify(data);\n\tform.appendChild(input);\n\n\tdocument.body.appendChild(form);\n\tform.submit();\n\tdocument.body.removeChild(form);\n}\n\n/**\n * 在新标签页中独立打开运行\n */\nexport function openInNewTab(code: string, title: string = 'Demo Preview') {\n\tconst newWin = window.open('', '_blank');\n\tif (!newWin) return;\n\n\tconst htmlContent = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\" />\n <title>${title}</title>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/react-public-components/dist/index.css\" />\n <script src=\"https://unpkg.com/react@18/umd/react.production.min.js\"></script>\n <script src=\"https://unpkg.com/react-dom@18/umd/react-dom.production.min.js\"></script>\n <script src=\"https://unpkg.com/@babel/standalone/babel.min.js\"></script>\n <style>\n * { box-sizing: border-box; }\n body { margin: 0; padding: 24px; background: #f8fafc; font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif; }\n #root { background: #fff; padding: 32px; border-radius: 12px; box-shadow: 0 4px 16px rgba(0,0,0,0.06); max-width: 900px; margin: 0 auto; }\n </style>\n</head>\n<body>\n <div id=\"root\"></div>\n <script type=\"text/babel\">\n const { useState, useEffect, useRef, useMemo, useCallback } = React;\n \n ${code\n\t\t\t.replace(/import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?/g, '')\n\t\t\t.replace(/export\\s+default\\s+App;?/g, '')\n\t\t\t.replace(/export\\s+default\\s+/g, '')}\n\n if (typeof App !== 'undefined') {\n const root = ReactDOM.createRoot(document.getElementById('root'));\n root.render(<App />);\n }\n </script>\n</body>\n</html>`;\n\n\tnewWin.document.open();\n\tnewWin.document.write(htmlContent);\n\tnewWin.document.close();\n}\n","import React, { useState, ReactNode, CSSProperties } from 'react';\nimport {\n\tCodeSandboxOutlined,\n\tCodePenOutlined,\n\tThunderboltOutlined,\n\tCodeOutlined,\n\tExportOutlined,\n\tCopyOutlined,\n\tCheckOutlined,\n\tUpOutlined,\n\tDownOutlined,\n} from '../src/icons';\nimport {\n\topenInCodeSandbox,\n\topenInCodePen,\n\topenInStackBlitz,\n\topenInNewTab,\n\tSandboxConfig,\n} from './sandbox';\nimport './index.less';\n\nexport type CodeSnippetTheme = 'dark' | 'light';\n\nexport interface CodeTabItem {\n\tkey: string;\n\tlabel: ReactNode;\n\tcode: string;\n\tlanguage?: string;\n}\n\nexport type BuiltinAction =\n\t| 'codesandbox'\n\t| 'codepen'\n\t| 'stackblitz'\n\t| 'copy'\n\t| 'external'\n\t| 'collapse';\n\nexport interface CodeSnippetProps {\n\t/** 代码文本内容(单代码模式) */\n\tcode?: string;\n\t/** 编程语言标识,默认为 'tsx' */\n\tlanguage?: string;\n\t/** 代码块主题风格:'dark' 暗色(默认) / 'light' 亮色 */\n\ttheme?: CodeSnippetTheme;\n\t/** 顶部自定义标题或说明标签(不传时展示大写的 language) */\n\ttitle?: ReactNode;\n\t/** 是否显示代码行号,默认为 false */\n\tshowLineNumbers?: boolean;\n\t/** 是否展示一键复制按钮,默认为 true */\n\tcopyable?: boolean;\n\t/** 多语言/多版本 Tabs 切换(如 TypeScript / JavaScript) */\n\ttabs?: CodeTabItem[];\n\t/** 当前激活的 Tab key(受控) */\n\tactiveTabKey?: string;\n\t/** 默认激活的 Tab key */\n\tdefaultActiveTabKey?: string;\n\t/** Tab 切换回调 */\n\tonTabChange?: (key: string) => void;\n\t/** 是否展示上方经典操作工具栏(CodeSandbox、CodePen、StackBlitz、外部打开、复制、代码展开折叠) */\n\tshowActions?: boolean;\n\t/** 自定义操作栏按钮列表 */\n\tactions?: (BuiltinAction | ReactNode)[];\n\t/** 点击操作按钮时的回调函数 */\n\tonAction?: (actionKey: string) => void;\n\t/** 沙箱自定义配置(标题、依赖库等) */\n\tsandboxConfig?: SandboxConfig;\n\t/** 外部独立运行的完整页面 URL(若传则 external 按钮直接打开此链接,不传则自动在新窗口动态构建运行) */\n\texternalUrl?: string;\n\t/** 是否支持折叠/展开代码 */\n\tcollapsible?: boolean;\n\t/** 默认是否折叠 */\n\tdefaultCollapsed?: boolean;\n\t/** 当前是否折叠(受控) */\n\tcollapsed?: boolean;\n\t/** 折叠状态切换回调 */\n\tonCollapseChange?: (collapsed: boolean) => void;\n\t/** 是否展示底部的“收起 / 展开代码”控制条,默认为 false */\n\tshowCollapseFooter?: boolean;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\nconst CodeSnippet: React.FC<CodeSnippetProps> = ({\n\tcode: singleCode = '',\n\tlanguage: defaultLang = 'tsx',\n\ttheme = 'dark',\n\ttitle,\n\tshowLineNumbers = false,\n\tcopyable = true,\n\ttabs,\n\tactiveTabKey: controlledTabKey,\n\tdefaultActiveTabKey,\n\tonTabChange,\n\tshowActions = false,\n\tactions = ['codesandbox', 'codepen', 'stackblitz', 'external', 'copy', 'collapse'],\n\tonAction,\n\tsandboxConfig,\n\texternalUrl,\n\tcollapsible = false,\n\tdefaultCollapsed = false,\n\tcollapsed: controlledCollapsed,\n\tonCollapseChange,\n\tshowCollapseFooter = false,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst hasTabs = Array.isArray(tabs) && tabs.length > 0;\n\tconst [internalTabKey, setInternalTabKey] = useState<string>(\n\t\tdefaultActiveTabKey ?? (hasTabs ? tabs[0].key : ''),\n\t);\n\tconst activeKey = controlledTabKey !== undefined ? controlledTabKey : internalTabKey;\n\n\tconst [internalCollapsed, setInternalCollapsed] = useState<boolean>(defaultCollapsed);\n\tconst isCollapsed = controlledCollapsed !== undefined ? controlledCollapsed : internalCollapsed;\n\n\tconst [copied, setCopied] = useState<boolean>(false);\n\n\t// 获取当前展示的代码与语言\n\tconst currentTab = hasTabs ? tabs.find((t) => t.key === activeKey) || tabs[0] : null;\n\tconst currentCode = currentTab ? currentTab.code : singleCode;\n\tconst currentLanguage = currentTab ? currentTab.language || defaultLang : defaultLang;\n\n\tconst handleCopy = async () => {\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(currentCode);\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 1500);\n\t\t\tonAction?.('copy');\n\t\t} catch {\n\t\t\t// fallback\n\t\t}\n\t};\n\n\tconst handleToggleCollapse = () => {\n\t\tconst next = !isCollapsed;\n\t\tif (controlledCollapsed === undefined) {\n\t\t\tsetInternalCollapsed(next);\n\t\t}\n\t\tonCollapseChange?.(next);\n\t\tonAction?.('collapse');\n\t};\n\n\tconst handleActionClick = (action: string) => {\n\t\tconst config: SandboxConfig = {\n\t\t\ttitle: typeof title === 'string' ? title : 'react-public-components Demo',\n\t\t\t...sandboxConfig,\n\t\t};\n\n\t\tif (action === 'codesandbox') {\n\t\t\topenInCodeSandbox(currentCode, config);\n\t\t} else if (action === 'codepen') {\n\t\t\topenInCodePen(currentCode, config);\n\t\t} else if (action === 'stackblitz') {\n\t\t\topenInStackBlitz(currentCode, config);\n\t\t} else if (action === 'external') {\n\t\t\tif (externalUrl) {\n\t\t\t\twindow.open(externalUrl, '_blank');\n\t\t\t} else {\n\t\t\t\topenInNewTab(currentCode, config.title || 'Demo Preview');\n\t\t\t}\n\t\t} else if (action === 'copy') {\n\t\t\thandleCopy();\n\t\t\treturn;\n\t\t} else if (action === 'collapse') {\n\t\t\thandleToggleCollapse();\n\t\t\treturn;\n\t\t}\n\t\tonAction?.(action);\n\t};\n\n\tconst handleTabClick = (key: string) => {\n\t\tif (controlledTabKey === undefined) {\n\t\t\tsetInternalTabKey(key);\n\t\t}\n\t\tonTabChange?.(key);\n\t};\n\n\tconst lines = currentCode.split('\\n');\n\n\treturn (\n\t\t<div\n\t\t\tclassName={`rpc_code_snippet rpc_code_snippet_${theme} ${\n\t\t\t\tisCollapsed ? 'rpc_code_snippet_collapsed' : ''\n\t\t\t} ${className}`}\n\t\t\tstyle={style}\n\t\t>\n\t\t\t{/* 1. 顶部操作工具栏(图1红色区域) */}\n\t\t\t{showActions && (\n\t\t\t\t<div className=\"rpc_code_snippet_actions_bar\">\n\t\t\t\t\t<div className=\"rpc_code_snippet_actions_list\">\n\t\t\t\t\t\t{actions.map((act, index) => {\n\t\t\t\t\t\t\tif (typeof act !== 'string') {\n\t\t\t\t\t\t\t\treturn <React.Fragment key={index}>{act}</React.Fragment>;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tswitch (act) {\n\t\t\t\t\t\t\t\tcase 'codesandbox':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"codesandbox\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"rpc_code_snippet_action_btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"在 CodeSandbox 中打开并在线运行\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('codesandbox')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CodeSandboxOutlined />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcase 'codepen':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"codepen\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"rpc_code_snippet_action_btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"在 CodePen 中打开并演练\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('codepen')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CodePenOutlined />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcase 'stackblitz':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"stackblitz\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"rpc_code_snippet_action_btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"在 StackBlitz 中极速启动\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('stackblitz')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ThunderboltOutlined />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcase 'external':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"external\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"rpc_code_snippet_action_btn\"\n\t\t\t\t\t\t\t\t\t\t\ttitle=\"在独立新标签页中全屏运行\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('external')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<ExportOutlined />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcase 'copy':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"copy\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={`rpc_code_snippet_action_btn ${\n\t\t\t\t\t\t\t\t\t\t\t\tcopied ? 'rpc_code_snippet_action_copied' : ''\n\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\ttitle={copied ? '已复制到剪贴板!' : '复制代码'}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('copy')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{copied ? <CheckOutlined style={{ color: '#52c41a' }} /> : <CopyOutlined />}\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tcase 'collapse':\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\tkey=\"collapse\"\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={`rpc_code_snippet_action_btn ${\n\t\t\t\t\t\t\t\t\t\t\t\t!isCollapsed ? 'rpc_code_snippet_action_active' : ''\n\t\t\t\t\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\t\t\t\t\ttitle={isCollapsed ? '展开代码' : '收起代码'}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleActionClick('collapse')}\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<CodeOutlined />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn null;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* 2. 标签页切换栏(TypeScript / JavaScript) */}\n\t\t\t{hasTabs && (\n\t\t\t\t<div className=\"rpc_code_snippet_tabs_bar\">\n\t\t\t\t\t{tabs.map((tab) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tkey={tab.key}\n\t\t\t\t\t\t\tclassName={`rpc_code_snippet_tab_item ${\n\t\t\t\t\t\t\t\ttab.key === activeKey ? 'rpc_code_snippet_tab_active' : ''\n\t\t\t\t\t\t\t}`}\n\t\t\t\t\t\t\tonClick={() => handleTabClick(tab.key)}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{tab.label}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* 3. 经典标题栏(无 showActions 时显示) */}\n\t\t\t{!showActions && (\n\t\t\t\t<div className=\"rpc_code_snippet_top_bar\">\n\t\t\t\t\t<div className=\"rpc_code_snippet_dots\">\n\t\t\t\t\t\t<span className=\"rpc_code_snippet_dot rpc_code_snippet_dot_red\" />\n\t\t\t\t\t\t<span className=\"rpc_code_snippet_dot rpc_code_snippet_dot_yellow\" />\n\t\t\t\t\t\t<span className=\"rpc_code_snippet_dot rpc_code_snippet_dot_green\" />\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<span className=\"rpc_code_snippet_lang\">{title ?? currentLanguage}</span>\n\n\t\t\t\t\t{copyable ? (\n\t\t\t\t\t\t<button type=\"button\" className=\"rpc_code_snippet_copy_btn\" onClick={handleCopy}>\n\t\t\t\t\t\t\t{copied ? '✓ 已复制' : '复制'}\n\t\t\t\t\t\t</button>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<span />\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* 4. 代码内容主体 */}\n\t\t\t{!isCollapsed && (\n\t\t\t\t<div className=\"rpc_code_snippet_body\">\n\t\t\t\t\t{showLineNumbers && (\n\t\t\t\t\t\t<div className=\"rpc_code_snippet_line_numbers\">\n\t\t\t\t\t\t\t{lines.map((_, idx) => (\n\t\t\t\t\t\t\t\t<span key={idx} className=\"rpc_code_snippet_line_no\">\n\t\t\t\t\t\t\t\t\t{idx + 1}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<pre className=\"rpc_code_snippet_content\">\n\t\t\t\t\t\t<code>{currentCode}</code>\n\t\t\t\t\t</pre>\n\t\t\t\t\t{showActions && copyable && (\n\t\t\t\t\t\t<div className=\"rpc_code_snippet_floating_copy\" onClick={handleCopy} title=\"复制代码\">\n\t\t\t\t\t\t\t{copied ? <CheckOutlined style={{ color: '#52c41a' }} /> : <CopyOutlined />}\n\t\t\t\t\t\t\t<span style={{ fontSize: 11, marginLeft: 4 }}>{currentLanguage}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{/* 5. 底部收起/展开控制条 */}\n\t\t\t{(showCollapseFooter || collapsible) && !isCollapsed && (\n\t\t\t\t<div className=\"rpc_code_snippet_footer\" onClick={handleToggleCollapse}>\n\t\t\t\t\t<UpOutlined style={{ marginRight: 6, fontSize: 12 }} />\n\t\t\t\t\t<span>收起代码</span>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t{(showCollapseFooter || collapsible) && isCollapsed && (\n\t\t\t\t<div className=\"rpc_code_snippet_footer\" onClick={handleToggleCollapse}>\n\t\t\t\t\t<DownOutlined style={{ marginRight: 6, fontSize: 12 }} />\n\t\t\t\t\t<span>展开代码</span>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nexport default CodeSnippet;\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMBOWSS4B_cjs = require('./chunk-MBOWSS4B.cjs');
3
+ var chunkR4V3EJVP_cjs = require('./chunk-R4V3EJVP.cjs');
4
4
  var react = require('react');
5
5
  var jsxRuntime = require('react/jsx-runtime');
6
6
 
@@ -76,7 +76,7 @@ var AudioPlayer = ({
76
76
  onEnded: () => setIsPlaying(false)
77
77
  }
78
78
  ),
79
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rpc_audio_player_play_btn", onClick: togglePlay, children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(chunkMBOWSS4B_cjs.PauseCircleOutlined, {}) : /* @__PURE__ */ jsxRuntime.jsx(chunkMBOWSS4B_cjs.PlayCircleOutlined, {}) }),
79
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rpc_audio_player_play_btn", onClick: togglePlay, children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.PauseCircleOutlined, {}) : /* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.PlayCircleOutlined, {}) }),
80
80
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_audio_player_info", children: [
81
81
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "rpc_audio_player_title_row", children: [
82
82
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rpc_audio_player_title", children: title || "\u97F3\u9891\u64AD\u653E" }),
@@ -116,7 +116,7 @@ var AudioPlayer = ({
116
116
  className: "rpc_audio_player_download_btn",
117
117
  title: "\u4E0B\u8F7D\u97F3\u9891\u6587\u4EF6",
118
118
  onClick: (e) => e.stopPropagation(),
119
- children: /* @__PURE__ */ jsxRuntime.jsx(chunkMBOWSS4B_cjs.DownloadOutlined, {})
119
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunkR4V3EJVP_cjs.DownloadOutlined, {})
120
120
  }
121
121
  )
122
122
  ] })
@@ -125,5 +125,5 @@ var AudioPlayer = ({
125
125
  var AudioPlayer_default = AudioPlayer;
126
126
 
127
127
  exports.AudioPlayer_default = AudioPlayer_default;
128
- //# sourceMappingURL=chunk-VS2YVJOB.cjs.map
129
- //# sourceMappingURL=chunk-VS2YVJOB.cjs.map
128
+ //# sourceMappingURL=chunk-4TMBGQQE.cjs.map
129
+ //# sourceMappingURL=chunk-4TMBGQQE.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../AudioPlayer/index.tsx"],"names":["useRef","useState","jsx","PauseCircleOutlined","PlayCircleOutlined","jsxs","DownloadOutlined"],"mappings":"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","file":"chunk-VS2YVJOB.cjs","sourcesContent":["import React, { useState, useRef, useEffect, ReactNode, CSSProperties } from 'react';\nimport { PlayCircleOutlined, PauseCircleOutlined, DownloadOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface AudioPlayerProps {\n\t/** 音频资源地址 */\n\tsrc: string;\n\t/** 音频标题或文件名 */\n\ttitle?: ReactNode;\n\t/** 默认倍速,默认为 1 */\n\tdefaultPlaybackRate?: number;\n\t/** 是否显示下载按钮,默认为 true */\n\tshowDownload?: boolean;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\nfunction formatTime(seconds: number): string {\n\tif (isNaN(seconds) || seconds < 0) return '00:00';\n\tconst m = Math.floor(seconds / 60);\n\tconst s = Math.floor(seconds % 60);\n\treturn `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n}\n\nconst speedOptions = [1.0, 1.25, 1.5, 2.0];\n\nconst AudioPlayer: React.FC<AudioPlayerProps> = ({\n\tsrc,\n\ttitle,\n\tdefaultPlaybackRate = 1.0,\n\tshowDownload = true,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst audioRef = useRef<HTMLAudioElement>(null);\n\tconst progressRef = useRef<HTMLDivElement>(null);\n\n\tconst [isPlaying, setIsPlaying] = useState<boolean>(false);\n\tconst [currentTime, setCurrentTime] = useState<number>(0);\n\tconst [duration, setDuration] = useState<number>(0);\n\tconst [speedIndex, setSpeedIndex] = useState<number>(\n\t\tMath.max(0, speedOptions.indexOf(defaultPlaybackRate)),\n\t);\n\n\tconst currentSpeed = speedOptions[speedIndex] || 1.0;\n\n\t// 播放 / 暂停切换\n\tconst togglePlay = () => {\n\t\tconst audio = audioRef.current;\n\t\tif (!audio) return;\n\t\tif (isPlaying) {\n\t\t\taudio.pause();\n\t\t\tsetIsPlaying(false);\n\t\t} else {\n\t\t\taudio.play();\n\t\t\tsetIsPlaying(true);\n\t\t}\n\t};\n\n\t// 监听时间更新\n\tconst handleTimeUpdate = () => {\n\t\tif (audioRef.current) {\n\t\t\tsetCurrentTime(audioRef.current.currentTime);\n\t\t}\n\t};\n\n\t// 监听时长加载\n\tconst handleLoadedMetadata = () => {\n\t\tif (audioRef.current) {\n\t\t\tsetDuration(audioRef.current.duration);\n\t\t}\n\t};\n\n\t// 切换倍速\n\tconst handleSpeedCycle = () => {\n\t\tconst nextIndex = (speedIndex + 1) % speedOptions.length;\n\t\tsetSpeedIndex(nextIndex);\n\t\tif (audioRef.current) {\n\t\t\taudioRef.current.playbackRate = speedOptions[nextIndex];\n\t\t}\n\t};\n\n\t// 拖拽进度条 Seek\n\tconst handleSeek = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!progressRef.current || !audioRef.current || !duration) return;\n\t\tconst rect = progressRef.current.getBoundingClientRect();\n\t\tconst percent = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width));\n\t\tconst targetTime = percent * duration;\n\t\taudioRef.current.currentTime = targetTime;\n\t\tsetCurrentTime(targetTime);\n\t};\n\n\tconst progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n\treturn (\n\t\t<div className={`rpc_audio_player ${className}`} style={style}>\n\t\t\t<audio\n\t\t\t\tref={audioRef}\n\t\t\t\tsrc={src}\n\t\t\t\tonTimeUpdate={handleTimeUpdate}\n\t\t\t\tonLoadedMetadata={handleLoadedMetadata}\n\t\t\t\tonEnded={() => setIsPlaying(false)}\n\t\t\t/>\n\n\t\t\t{/* 播放 / 暂停按钮 */}\n\t\t\t<div className=\"rpc_audio_player_play_btn\" onClick={togglePlay}>\n\t\t\t\t{isPlaying ? <PauseCircleOutlined /> : <PlayCircleOutlined />}\n\t\t\t</div>\n\n\t\t\t{/* 信息与进度条 */}\n\t\t\t<div className=\"rpc_audio_player_info\">\n\t\t\t\t<div className=\"rpc_audio_player_title_row\">\n\t\t\t\t\t<span className=\"rpc_audio_player_title\">{title || '音频播放'}</span>\n\t\t\t\t\t<span className=\"rpc_audio_player_time\">\n\t\t\t\t\t\t{formatTime(currentTime)} / {formatTime(duration)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div ref={progressRef} className=\"rpc_audio_player_progress_bar\" onClick={handleSeek}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"rpc_audio_player_progress_fill\"\n\t\t\t\t\t\tstyle={{ width: `${progressPercent}%` }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 倍速与下载 */}\n\t\t\t<div className=\"rpc_audio_player_extra\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"rpc_audio_player_speed_btn\"\n\t\t\t\t\tonClick={handleSpeedCycle}\n\t\t\t\t\ttitle=\"点击切换播放倍速\"\n\t\t\t\t>\n\t\t\t\t\t{currentSpeed}x\n\t\t\t\t</button>\n\n\t\t\t\t{showDownload && (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={src}\n\t\t\t\t\t\tdownload\n\t\t\t\t\t\tclassName=\"rpc_audio_player_download_btn\"\n\t\t\t\t\t\ttitle=\"下载音频文件\"\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DownloadOutlined />\n\t\t\t\t\t</a>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default AudioPlayer;\n"]}
1
+ {"version":3,"sources":["../AudioPlayer/index.tsx"],"names":["useRef","useState","jsx","PauseCircleOutlined","PlayCircleOutlined","jsxs","DownloadOutlined"],"mappings":"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","file":"chunk-4TMBGQQE.cjs","sourcesContent":["import React, { useState, useRef, useEffect, ReactNode, CSSProperties } from 'react';\nimport { PlayCircleOutlined, PauseCircleOutlined, DownloadOutlined } from '../src/icons';\nimport './index.less';\n\nexport interface AudioPlayerProps {\n\t/** 音频资源地址 */\n\tsrc: string;\n\t/** 音频标题或文件名 */\n\ttitle?: ReactNode;\n\t/** 默认倍速,默认为 1 */\n\tdefaultPlaybackRate?: number;\n\t/** 是否显示下载按钮,默认为 true */\n\tshowDownload?: boolean;\n\t/** 自定义类名 */\n\tclassName?: string;\n\t/** 自定义样式 */\n\tstyle?: CSSProperties;\n}\n\nfunction formatTime(seconds: number): string {\n\tif (isNaN(seconds) || seconds < 0) return '00:00';\n\tconst m = Math.floor(seconds / 60);\n\tconst s = Math.floor(seconds % 60);\n\treturn `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;\n}\n\nconst speedOptions = [1.0, 1.25, 1.5, 2.0];\n\nconst AudioPlayer: React.FC<AudioPlayerProps> = ({\n\tsrc,\n\ttitle,\n\tdefaultPlaybackRate = 1.0,\n\tshowDownload = true,\n\tclassName = '',\n\tstyle,\n}) => {\n\tconst audioRef = useRef<HTMLAudioElement>(null);\n\tconst progressRef = useRef<HTMLDivElement>(null);\n\n\tconst [isPlaying, setIsPlaying] = useState<boolean>(false);\n\tconst [currentTime, setCurrentTime] = useState<number>(0);\n\tconst [duration, setDuration] = useState<number>(0);\n\tconst [speedIndex, setSpeedIndex] = useState<number>(\n\t\tMath.max(0, speedOptions.indexOf(defaultPlaybackRate)),\n\t);\n\n\tconst currentSpeed = speedOptions[speedIndex] || 1.0;\n\n\t// 播放 / 暂停切换\n\tconst togglePlay = () => {\n\t\tconst audio = audioRef.current;\n\t\tif (!audio) return;\n\t\tif (isPlaying) {\n\t\t\taudio.pause();\n\t\t\tsetIsPlaying(false);\n\t\t} else {\n\t\t\taudio.play();\n\t\t\tsetIsPlaying(true);\n\t\t}\n\t};\n\n\t// 监听时间更新\n\tconst handleTimeUpdate = () => {\n\t\tif (audioRef.current) {\n\t\t\tsetCurrentTime(audioRef.current.currentTime);\n\t\t}\n\t};\n\n\t// 监听时长加载\n\tconst handleLoadedMetadata = () => {\n\t\tif (audioRef.current) {\n\t\t\tsetDuration(audioRef.current.duration);\n\t\t}\n\t};\n\n\t// 切换倍速\n\tconst handleSpeedCycle = () => {\n\t\tconst nextIndex = (speedIndex + 1) % speedOptions.length;\n\t\tsetSpeedIndex(nextIndex);\n\t\tif (audioRef.current) {\n\t\t\taudioRef.current.playbackRate = speedOptions[nextIndex];\n\t\t}\n\t};\n\n\t// 拖拽进度条 Seek\n\tconst handleSeek = (e: React.MouseEvent<HTMLDivElement>) => {\n\t\tif (!progressRef.current || !audioRef.current || !duration) return;\n\t\tconst rect = progressRef.current.getBoundingClientRect();\n\t\tconst percent = Math.min(1, Math.max(0, (e.clientX - rect.left) / rect.width));\n\t\tconst targetTime = percent * duration;\n\t\taudioRef.current.currentTime = targetTime;\n\t\tsetCurrentTime(targetTime);\n\t};\n\n\tconst progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0;\n\n\treturn (\n\t\t<div className={`rpc_audio_player ${className}`} style={style}>\n\t\t\t<audio\n\t\t\t\tref={audioRef}\n\t\t\t\tsrc={src}\n\t\t\t\tonTimeUpdate={handleTimeUpdate}\n\t\t\t\tonLoadedMetadata={handleLoadedMetadata}\n\t\t\t\tonEnded={() => setIsPlaying(false)}\n\t\t\t/>\n\n\t\t\t{/* 播放 / 暂停按钮 */}\n\t\t\t<div className=\"rpc_audio_player_play_btn\" onClick={togglePlay}>\n\t\t\t\t{isPlaying ? <PauseCircleOutlined /> : <PlayCircleOutlined />}\n\t\t\t</div>\n\n\t\t\t{/* 信息与进度条 */}\n\t\t\t<div className=\"rpc_audio_player_info\">\n\t\t\t\t<div className=\"rpc_audio_player_title_row\">\n\t\t\t\t\t<span className=\"rpc_audio_player_title\">{title || '音频播放'}</span>\n\t\t\t\t\t<span className=\"rpc_audio_player_time\">\n\t\t\t\t\t\t{formatTime(currentTime)} / {formatTime(duration)}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\n\t\t\t\t<div ref={progressRef} className=\"rpc_audio_player_progress_bar\" onClick={handleSeek}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName=\"rpc_audio_player_progress_fill\"\n\t\t\t\t\t\tstyle={{ width: `${progressPercent}%` }}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* 倍速与下载 */}\n\t\t\t<div className=\"rpc_audio_player_extra\">\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tclassName=\"rpc_audio_player_speed_btn\"\n\t\t\t\t\tonClick={handleSpeedCycle}\n\t\t\t\t\ttitle=\"点击切换播放倍速\"\n\t\t\t\t>\n\t\t\t\t\t{currentSpeed}x\n\t\t\t\t</button>\n\n\t\t\t\t{showDownload && (\n\t\t\t\t\t<a\n\t\t\t\t\t\thref={src}\n\t\t\t\t\t\tdownload\n\t\t\t\t\t\tclassName=\"rpc_audio_player_download_btn\"\n\t\t\t\t\t\ttitle=\"下载音频文件\"\n\t\t\t\t\t\tonClick={(e) => e.stopPropagation()}\n\t\t\t\t\t>\n\t\t\t\t\t\t<DownloadOutlined />\n\t\t\t\t\t</a>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nexport default AudioPlayer;\n"]}
@@ -1,4 +1,4 @@
1
- import { ZoomInOutlined, ZoomOutOutlined, RotateRightOutlined, DownloadOutlined, CloseOutlined, FileOutlined, FileTextOutlined, FilePdfOutlined, FileImageOutlined } from './chunk-ISUXPTLV.js';
1
+ import { ZoomInOutlined, ZoomOutOutlined, RotateRightOutlined, DownloadOutlined, CloseOutlined, FileOutlined, FileTextOutlined, FilePdfOutlined, FileImageOutlined } from './chunk-2IDVNTKR.js';
2
2
  import { useState, useEffect } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -221,5 +221,5 @@ FilePreviewer.preview = (options) => {
221
221
  var FilePreviewer_default = FilePreviewer;
222
222
 
223
223
  export { FilePreviewer_default, inferFileType };
224
- //# sourceMappingURL=chunk-PJB7ADK6.js.map
225
- //# sourceMappingURL=chunk-PJB7ADK6.js.map
224
+ //# sourceMappingURL=chunk-56VELHCH.js.map
225
+ //# sourceMappingURL=chunk-56VELHCH.js.map