koishi-plugin-kkk 1.0.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 (702) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +674 -0
  3. package/README.md +98 -0
  4. package/assets/web/assets/CronEditor-CYgFpX-g.js +1 -0
  5. package/assets/web/assets/DesktopLayout-iI43ij11.js +1 -0
  6. package/assets/web/assets/MobileLayout-CziU8MCR.js +1 -0
  7. package/assets/web/assets/ThemeSwitch-DFohhwd9.js +1 -0
  8. package/assets/web/assets/index-BRROK0vh.js +47 -0
  9. package/assets/web/assets/index-Dj-StEiS.css +2 -0
  10. package/assets/web/assets/separator-CxcFlCzz.js +1 -0
  11. package/assets/web/favicon.svg +1 -0
  12. package/assets/web/icons.svg +24 -0
  13. package/assets/web/index.html +15 -0
  14. package/assets/webui.html +115 -0
  15. package/client/index.ts +63 -0
  16. package/config/default_config/app.yaml +64 -0
  17. package/config/default_config/bilibili.yaml +116 -0
  18. package/config/default_config/config.json +157 -0
  19. package/config/default_config/cookies.yaml +11 -0
  20. package/config/default_config/douyin.yaml +99 -0
  21. package/config/default_config/kuaishou.yaml +8 -0
  22. package/config/default_config/pushlist.yaml +37 -0
  23. package/config/default_config/request.yaml +22 -0
  24. package/config/default_config/upload.yaml +50 -0
  25. package/config/default_config/xiaohongshu.yaml +23 -0
  26. package/dist/index.js +1 -0
  27. package/lib/compat/axios.js +23 -0
  28. package/lib/compat/cron.js +77 -0
  29. package/lib/compat/esm.js +15 -0
  30. package/lib/compat/express.js +23 -0
  31. package/lib/compat/heroui.js +12 -0
  32. package/lib/compat/lodash.js +33 -0
  33. package/lib/compat/logger.js +118 -0
  34. package/lib/compat/node-karin.js +1053 -0
  35. package/lib/compat/phosphor-icons.js +27 -0
  36. package/lib/compat/qqcard.js +256 -0
  37. package/lib/compat/root.js +44 -0
  38. package/lib/compat/runtime.js +87 -0
  39. package/lib/compat/segment.js +167 -0
  40. package/lib/compat/sqlite3.js +117 -0
  41. package/lib/compat/start.js +7 -0
  42. package/lib/compat/syncConfig.js +65 -0
  43. package/lib/compat/template-react.js +30 -0
  44. package/lib/compat/text.js +65 -0
  45. package/lib/compat/yaml.js +13 -0
  46. package/lib/configBridge.js +91 -0
  47. package/lib/index.js +775 -0
  48. package/lib/karin/app.js +34 -0
  49. package/lib/karin/apps/__ready.js +9 -0
  50. package/lib/karin/apps/admin.js +136 -0
  51. package/lib/karin/apps/help.js +233 -0
  52. package/lib/karin/apps/push.js +291 -0
  53. package/lib/karin/apps/qrlogin.js +176 -0
  54. package/lib/karin/apps/statistics.js +209 -0
  55. package/lib/karin/apps/testPush.js +247 -0
  56. package/lib/karin/apps/tools.js +473 -0
  57. package/lib/karin/apps/update.js +252 -0
  58. package/lib/karin/index.js +37 -0
  59. package/lib/karin/module/db/bilibili.js +831 -0
  60. package/lib/karin/module/db/douyin.js +918 -0
  61. package/lib/karin/module/db/index.js +165 -0
  62. package/lib/karin/module/db/migration.js +199 -0
  63. package/lib/karin/module/db/statistics.js +559 -0
  64. package/lib/karin/module/index.js +94 -0
  65. package/lib/karin/module/server/constants/routes.js +48 -0
  66. package/lib/karin/module/server/controllers/bots.js +230 -0
  67. package/lib/karin/module/server/controllers/config.js +75 -0
  68. package/lib/karin/module/server/controllers/video.js +208 -0
  69. package/lib/karin/module/server/index.js +26 -0
  70. package/lib/karin/module/server/middlewares/auth.js +133 -0
  71. package/lib/karin/module/server/routes/amagi.js +57 -0
  72. package/lib/karin/module/server/routes/api.js +40 -0
  73. package/lib/karin/module/server/routes/index.js +97 -0
  74. package/lib/karin/module/server/routes/ssr.js +16 -0
  75. package/lib/karin/module/server/routes/static.js +43 -0
  76. package/lib/karin/module/utils/Base.js +403 -0
  77. package/lib/karin/module/utils/CardParser.js +487 -0
  78. package/lib/karin/module/utils/Common.js +418 -0
  79. package/lib/karin/module/utils/Config.js +434 -0
  80. package/lib/karin/module/utils/EmojiReaction.js +242 -0
  81. package/lib/karin/module/utils/ErrorHandler/handler.js +114 -0
  82. package/lib/karin/module/utils/ErrorHandler/index.js +55 -0
  83. package/lib/karin/module/utils/ErrorHandler/render.js +182 -0
  84. package/lib/karin/module/utils/ErrorHandler/sender.js +206 -0
  85. package/lib/karin/module/utils/ErrorHandler/strategy.js +41 -0
  86. package/lib/karin/module/utils/ErrorHandler/types.js +2 -0
  87. package/lib/karin/module/utils/ErrorHandler/utils.js +108 -0
  88. package/lib/karin/module/utils/FFmpeg.js +298 -0
  89. package/lib/karin/module/utils/ImageHelper.js +91 -0
  90. package/lib/karin/module/utils/ImageSlice.js +429 -0
  91. package/lib/karin/module/utils/MotionPhoto.js +250 -0
  92. package/lib/karin/module/utils/Network/Downloader.js +413 -0
  93. package/lib/karin/module/utils/Network/ImageDownloader.js +250 -0
  94. package/lib/karin/module/utils/Network/Network.js +332 -0
  95. package/lib/karin/module/utils/Network/ThrottleStream.js +71 -0
  96. package/lib/karin/module/utils/Network/constants.js +129 -0
  97. package/lib/karin/module/utils/Network/helpers.js +174 -0
  98. package/lib/karin/module/utils/Network/index.js +34 -0
  99. package/lib/karin/module/utils/Network/types.js +12 -0
  100. package/lib/karin/module/utils/Networks.js +17 -0
  101. package/lib/karin/module/utils/ParseLock.js +34 -0
  102. package/lib/karin/module/utils/ParseOverride.js +88 -0
  103. package/lib/karin/module/utils/QqCardResolve.js +114 -0
  104. package/lib/karin/module/utils/QqPanel.js +879 -0
  105. package/lib/karin/module/utils/Render/coverTheme.js +256 -0
  106. package/lib/karin/module/utils/Render/index.js +582 -0
  107. package/lib/karin/module/utils/amagiClient.js +338 -0
  108. package/lib/karin/module/utils/avatar.js +201 -0
  109. package/lib/karin/module/utils/bot.js +141 -0
  110. package/lib/karin/module/utils/build-metadata.js +50 -0
  111. package/lib/karin/module/utils/changelog.js +166 -0
  112. package/lib/karin/module/utils/index.js +26 -0
  113. package/lib/karin/module/utils/loginSession.js +259 -0
  114. package/lib/karin/module/utils/parseTip.js +93 -0
  115. package/lib/karin/module/utils/runtime-report.js +140 -0
  116. package/lib/karin/module/utils/semver.js +72 -0
  117. package/lib/karin/module/utils/statisticsAggregate.js +415 -0
  118. package/lib/karin/platform/bilibili/bilibili.js +1805 -0
  119. package/lib/karin/platform/bilibili/comments.js +294 -0
  120. package/lib/karin/platform/bilibili/danmaku.js +555 -0
  121. package/lib/karin/platform/bilibili/dynamic-text.js +827 -0
  122. package/lib/karin/platform/bilibili/genParams.js +37 -0
  123. package/lib/karin/platform/bilibili/getID.js +159 -0
  124. package/lib/karin/platform/bilibili/index.js +24 -0
  125. package/lib/karin/platform/bilibili/live-status.js +40 -0
  126. package/lib/karin/platform/bilibili/login.js +132 -0
  127. package/lib/karin/platform/bilibili/push.js +1397 -0
  128. package/lib/karin/platform/bilibili/riskControl.js +133 -0
  129. package/lib/karin/platform/bilibili/search.js +299 -0
  130. package/lib/karin/platform/common/danmaku-types.js +12 -0
  131. package/lib/karin/platform/douyin/comments.js +310 -0
  132. package/lib/karin/platform/douyin/danmaku.js +893 -0
  133. package/lib/karin/platform/douyin/douyin.js +1145 -0
  134. package/lib/karin/platform/douyin/getID.js +94 -0
  135. package/lib/karin/platform/douyin/index.js +24 -0
  136. package/lib/karin/platform/douyin/login.js +230 -0
  137. package/lib/karin/platform/douyin/push/favorite.js +75 -0
  138. package/lib/karin/platform/douyin/push/index.js +21 -0
  139. package/lib/karin/platform/douyin/push/live.js +69 -0
  140. package/lib/karin/platform/douyin/push/post.js +60 -0
  141. package/lib/karin/platform/douyin/push/recommend.js +74 -0
  142. package/lib/karin/platform/douyin/push/render.js +621 -0
  143. package/lib/karin/platform/douyin/push/types.js +2 -0
  144. package/lib/karin/platform/douyin/push.js +1128 -0
  145. package/lib/karin/platform/douyin/types.js +13 -0
  146. package/lib/karin/platform/douyin/videoQuality.js +222 -0
  147. package/lib/karin/platform/douyin/workType.js +182 -0
  148. package/lib/karin/platform/index.js +20 -0
  149. package/lib/karin/platform/kuaishou/comments.js +91 -0
  150. package/lib/karin/platform/kuaishou/getID.js +43 -0
  151. package/lib/karin/platform/kuaishou/getdata.js +41 -0
  152. package/lib/karin/platform/kuaishou/index.js +20 -0
  153. package/lib/karin/platform/kuaishou/kuaishou.js +122 -0
  154. package/lib/karin/platform/xiaohongshu/comments.js +162 -0
  155. package/lib/karin/platform/xiaohongshu/getID.js +129 -0
  156. package/lib/karin/platform/xiaohongshu/index.js +18 -0
  157. package/lib/karin/platform/xiaohongshu/xiaohongshu.js +643 -0
  158. package/lib/karin/root.js +73 -0
  159. package/lib/karin/setup.js +99 -0
  160. package/lib/karin/types/config/amagi.js +2 -0
  161. package/lib/karin/types/config/app.js +2 -0
  162. package/lib/karin/types/config/bilibili.js +2 -0
  163. package/lib/karin/types/config/cookies.js +2 -0
  164. package/lib/karin/types/config/douyin.js +2 -0
  165. package/lib/karin/types/config/index.js +2 -0
  166. package/lib/karin/types/config/kuaishou.js +2 -0
  167. package/lib/karin/types/config/pushlist.js +2 -0
  168. package/lib/karin/types/config/request.js +2 -0
  169. package/lib/karin/types/config/upload.js +2 -0
  170. package/lib/karin/types/config/xiaohongshu.js +2 -0
  171. package/lib/karin/types/datatypes.js +2 -0
  172. package/lib/karin/types/index.js +18 -0
  173. package/lib/karin/types/netrorks/NetworksConfigType.js +2 -0
  174. package/lib/karin/types/netrorks/index.js +17 -0
  175. package/lib/karin/web.config.js +49 -0
  176. package/lib/ktr/registry.js +82 -0
  177. package/lib/ktr/template/_preview/components/PreviewInfoCard.js +10 -0
  178. package/lib/ktr/template/_preview/components/PreviewLayout.js +10 -0
  179. package/lib/ktr/template/_preview/components/PreviewVideoCard.js +8 -0
  180. package/lib/ktr/template/_preview/render.js +142 -0
  181. package/lib/ktr/template/_preview/types.js +2 -0
  182. package/lib/ktr/template/_preview/utils/status.js +31 -0
  183. package/lib/ktr/template/_preview/utils/time.js +12 -0
  184. package/lib/ktr/template/bilibili/bangumi/components/bangumi.js +127 -0
  185. package/lib/ktr/template/bilibili/bangumi/components/types.js +2 -0
  186. package/lib/ktr/template/bilibili/bangumi/index.js +12 -0
  187. package/lib/ktr/template/bilibili/comment/components/Comment.js +193 -0
  188. package/lib/ktr/template/bilibili/comment/components/types.js +2 -0
  189. package/lib/ktr/template/bilibili/comment/index.js +10 -0
  190. package/lib/ktr/template/bilibili/components/Icons.js +66 -0
  191. package/lib/ktr/template/bilibili/components/shared.js +93 -0
  192. package/lib/ktr/template/bilibili/components/types.js +2 -0
  193. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.js +66 -0
  194. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.js +2 -0
  195. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.js +10 -0
  196. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.js +87 -0
  197. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.js +2 -0
  198. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.js +10 -0
  199. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.js +93 -0
  200. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.js +2 -0
  201. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.js +10 -0
  202. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.js +132 -0
  203. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.js +2 -0
  204. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.js +10 -0
  205. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.js +84 -0
  206. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.js +2 -0
  207. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.js +10 -0
  208. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.js +38 -0
  209. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.js +2 -0
  210. package/lib/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.js +10 -0
  211. package/lib/ktr/template/bilibili/dynamic/components/AdditionalCard.js +59 -0
  212. package/lib/ktr/template/bilibili/dynamic/components/CommonComponents.js +30 -0
  213. package/lib/ktr/template/bilibili/dynamic/types.js +2 -0
  214. package/lib/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.js +48 -0
  215. package/lib/ktr/template/bilibili/qrcodeImg/components/types.js +3 -0
  216. package/lib/ktr/template/bilibili/qrcodeImg/index.js +10 -0
  217. package/lib/ktr/template/bilibili/userlist/components/UserList.js +53 -0
  218. package/lib/ktr/template/bilibili/userlist/components/types.js +3 -0
  219. package/lib/ktr/template/bilibili/userlist/index.js +13 -0
  220. package/lib/ktr/template/bilibili/videoInfo/components/types.js +2 -0
  221. package/lib/ktr/template/bilibili/videoInfo/components/videoInfo.js +62 -0
  222. package/lib/ktr/template/bilibili/videoInfo/index.js +10 -0
  223. package/lib/ktr/template/components/AmbientCover.js +36 -0
  224. package/lib/ktr/template/components/DefaultLayout.js +33 -0
  225. package/lib/ktr/template/components/GlowImage.js +276 -0
  226. package/lib/ktr/template/components/QRCodeWithAvatar.js +34 -0
  227. package/lib/ktr/template/components/RolldownLogo.js +6 -0
  228. package/lib/ktr/template/components/ViteLogo.js +6 -0
  229. package/lib/ktr/template/components/iconRegistry.js +173 -0
  230. package/lib/ktr/template/douyin/article-work/components/ArticleWork.js +99 -0
  231. package/lib/ktr/template/douyin/article-work/components/types.js +3 -0
  232. package/lib/ktr/template/douyin/article-work/index.js +10 -0
  233. package/lib/ktr/template/douyin/comment/components/Comment.js +189 -0
  234. package/lib/ktr/template/douyin/comment/components/types.js +2 -0
  235. package/lib/ktr/template/douyin/comment/index.js +10 -0
  236. package/lib/ktr/template/douyin/components/Icons.js +29 -0
  237. package/lib/ktr/template/douyin/components/types.js +3 -0
  238. package/lib/ktr/template/douyin/dynamic/components/Dynamic.js +90 -0
  239. package/lib/ktr/template/douyin/dynamic/components/types.js +3 -0
  240. package/lib/ktr/template/douyin/dynamic/index.js +10 -0
  241. package/lib/ktr/template/douyin/favorite-list/components/FavoriteList.js +30 -0
  242. package/lib/ktr/template/douyin/favorite-list/components/types.js +3 -0
  243. package/lib/ktr/template/douyin/favorite-list/index.js +10 -0
  244. package/lib/ktr/template/douyin/image-work/components/ImageWork.js +136 -0
  245. package/lib/ktr/template/douyin/image-work/components/types.js +2 -0
  246. package/lib/ktr/template/douyin/image-work/index.js +10 -0
  247. package/lib/ktr/template/douyin/live/components/Live.js +51 -0
  248. package/lib/ktr/template/douyin/live/components/types.js +3 -0
  249. package/lib/ktr/template/douyin/live/index.js +10 -0
  250. package/lib/ktr/template/douyin/musicinfo/components/MusicInfo.js +60 -0
  251. package/lib/ktr/template/douyin/musicinfo/components/types.js +3 -0
  252. package/lib/ktr/template/douyin/musicinfo/index.js +10 -0
  253. package/lib/ktr/template/douyin/qrcodeImg/components/qrcodeImg.js +39 -0
  254. package/lib/ktr/template/douyin/qrcodeImg/components/types.js +3 -0
  255. package/lib/ktr/template/douyin/qrcodeImg/index.js +9 -0
  256. package/lib/ktr/template/douyin/recommend-list/components/RecommendList.js +30 -0
  257. package/lib/ktr/template/douyin/recommend-list/components/types.js +3 -0
  258. package/lib/ktr/template/douyin/recommend-list/index.js +10 -0
  259. package/lib/ktr/template/douyin/user_profile/components/UserVideoList.js +54 -0
  260. package/lib/ktr/template/douyin/user_profile/components/types.js +3 -0
  261. package/lib/ktr/template/douyin/user_profile/index.js +9 -0
  262. package/lib/ktr/template/douyin/userlist/components/UserList.js +50 -0
  263. package/lib/ktr/template/douyin/userlist/components/types.js +3 -0
  264. package/lib/ktr/template/douyin/userlist/index.js +13 -0
  265. package/lib/ktr/template/douyin/video-work/components/VideoWork.js +127 -0
  266. package/lib/ktr/template/douyin/video-work/components/types.js +2 -0
  267. package/lib/ktr/template/douyin/video-work/index.js +10 -0
  268. package/lib/ktr/template/kuaishou/comment/components/Comment.js +88 -0
  269. package/lib/ktr/template/kuaishou/comment/components/types.js +2 -0
  270. package/lib/ktr/template/kuaishou/comment/index.js +10 -0
  271. package/lib/ktr/template/other/changelog/components/changelog.js +117 -0
  272. package/lib/ktr/template/other/changelog/components/types.js +3 -0
  273. package/lib/ktr/template/other/changelog/index.js +9 -0
  274. package/lib/ktr/template/other/handlerError/components/errorTitles.js +227 -0
  275. package/lib/ktr/template/other/handlerError/components/handlerError.js +392 -0
  276. package/lib/ktr/template/other/handlerError/components/stackHighlight.js +109 -0
  277. package/lib/ktr/template/other/handlerError/components/types.js +2 -0
  278. package/lib/ktr/template/other/handlerError/index.js +9 -0
  279. package/lib/ktr/template/other/help/components/Help.js +79 -0
  280. package/lib/ktr/template/other/help/components/types.js +3 -0
  281. package/lib/ktr/template/other/help/index.js +12 -0
  282. package/lib/ktr/template/other/live-photo-tip/components/LivePhotoTip.js +80 -0
  283. package/lib/ktr/template/other/live-photo-tip/components/types.js +3 -0
  284. package/lib/ktr/template/other/live-photo-tip/index.js +9 -0
  285. package/lib/ktr/template/other/qrlogin/components/qrlogin.js +58 -0
  286. package/lib/ktr/template/other/qrlogin/components/types.js +3 -0
  287. package/lib/ktr/template/other/qrlogin/index.js +9 -0
  288. package/lib/ktr/template/other/runtime/components/runtime.js +101 -0
  289. package/lib/ktr/template/other/runtime/components/types.js +3 -0
  290. package/lib/ktr/template/other/runtime/index.js +9 -0
  291. package/lib/ktr/template/other/version_warning/components/VersionWarning.js +38 -0
  292. package/lib/ktr/template/other/version_warning/components/types.js +3 -0
  293. package/lib/ktr/template/other/version_warning/index.js +9 -0
  294. package/lib/ktr/template/statistics/components/BoxplotGuide.js +17 -0
  295. package/lib/ktr/template/statistics/components/ChartCard.js +15 -0
  296. package/lib/ktr/template/statistics/components/KpiCard.js +14 -0
  297. package/lib/ktr/template/statistics/components/PlatformTable.js +20 -0
  298. package/lib/ktr/template/statistics/components/RankList.js +61 -0
  299. package/lib/ktr/template/statistics/components/SSRChart.js +22 -0
  300. package/lib/ktr/template/statistics/components/chartPresets.js +630 -0
  301. package/lib/ktr/template/statistics/components/chartTheme.js +226 -0
  302. package/lib/ktr/template/statistics/components/format.js +38 -0
  303. package/lib/ktr/template/statistics/components/types.js +9 -0
  304. package/lib/ktr/template/statistics/global/components/GlobalStatistics.js +246 -0
  305. package/lib/ktr/template/statistics/global/components/types.js +3 -0
  306. package/lib/ktr/template/statistics/global/index.js +9 -0
  307. package/lib/ktr/template/statistics/group/components/GroupStatistics.js +181 -0
  308. package/lib/ktr/template/statistics/group/components/types.js +3 -0
  309. package/lib/ktr/template/statistics/group/index.js +9 -0
  310. package/lib/ktr/template/types/ctx.js +2 -0
  311. package/lib/ktr/template/xiaohongshu/comment/components/Comment.js +99 -0
  312. package/lib/ktr/template/xiaohongshu/comment/components/types.js +3 -0
  313. package/lib/ktr/template/xiaohongshu/comment/index.js +9 -0
  314. package/lib/ktr/template/xiaohongshu/noteInfo/components/noteInfo.js +93 -0
  315. package/lib/ktr/template/xiaohongshu/noteInfo/components/types.js +2 -0
  316. package/lib/ktr/template/xiaohongshu/noteInfo/index.js +9 -0
  317. package/lib/ktr/utils/QRCodeAvatar.js +99 -0
  318. package/lib/ktr/utils/QRcode.js +56 -0
  319. package/lib/ktr/utils/avatarProxy.js +45 -0
  320. package/lib/ktr/utils/cn.js +11 -0
  321. package/lib/ktr/utils/theme.js +12 -0
  322. package/lib/qqFields.json +75 -0
  323. package/lib/qqOptions.js +44 -0
  324. package/lib/richtext/index.js +25 -0
  325. package/lib/richtext/parse/index.js +232 -0
  326. package/lib/richtext/react/cn.js +11 -0
  327. package/lib/richtext/react/index.js +221 -0
  328. package/lib/richtext/types.js +2 -0
  329. package/lib/schema.js +352 -0
  330. package/lib/webui.js +341 -0
  331. package/package.json +88 -0
  332. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_BV.svg +1 -0
  333. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_GOODS.svg +1 -0
  334. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_LOTTERY.svg +1 -0
  335. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VIEW_PICTURE.svg +1 -0
  336. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_VOTE.svg +1 -0
  337. package/resources/image/bilibili/RICH_TEXT_NODE_TYPE/RICH_TEXT_NODE_TYPE_WEB.svg +1 -0
  338. package/resources/image/bilibili/bilibili-dark.png +0 -0
  339. package/resources/image/bilibili/bilibili-light.png +0 -0
  340. package/resources/image/bilibili/bilibili.png +0 -0
  341. package/resources/image/bilibili/id-dark.svg +1 -0
  342. package/resources/image/bilibili/id-light.svg +1 -0
  343. package/resources/image/bilibili/level/lv0.svg +1 -0
  344. package/resources/image/bilibili/level/lv1.svg +1 -0
  345. package/resources/image/bilibili/level/lv2.svg +1 -0
  346. package/resources/image/bilibili/level/lv3.svg +1 -0
  347. package/resources/image/bilibili/level/lv4.svg +1 -0
  348. package/resources/image/bilibili/level/lv5.svg +1 -0
  349. package/resources/image/bilibili/level/lv6.svg +1 -0
  350. package/resources/image/bilibili/level/lv7.svg +1 -0
  351. package/resources/image/bilibili/like-dark.svg +6 -0
  352. package/resources/image/bilibili/like-light.svg +6 -0
  353. package/resources/image/bilibili/play.svg +28 -0
  354. package/resources/image/bilibili/res-local1.png +0 -0
  355. package/resources/image/bilibili/up_pb.svg +1 -0
  356. package/resources/image/bilibili//347/233/264/346/222/255/344/270/255.png +0 -0
  357. package/resources/image/douyin/douyin.png +0 -0
  358. package/resources/image/douyin/dylogo-dark.svg +23 -0
  359. package/resources/image/douyin/dylogo-light.svg +38 -0
  360. package/resources/image/douyin/search-dark.svg +1 -0
  361. package/resources/image/douyin/search-light.svg +3 -0
  362. package/resources/image/douyin//346/212/226/351/237/263-/347/233/264/346/222/255/344/270/255.png +0 -0
  363. package/resources/image/frame-logo.png +0 -0
  364. package/resources/image/kuaishou/logo.png +0 -0
  365. package/resources/image/other/handlerError/Milky.png +0 -0
  366. package/resources/image/other/handlerError/chronocat.svg +43 -0
  367. package/resources/image/other/handlerError/conwechat.webp +0 -0
  368. package/resources/image/other/handlerError/gocq-http.webp +0 -0
  369. package/resources/image/other/handlerError/lagrange.webp +0 -0
  370. package/resources/image/other/handlerError/llonebot.webp +0 -0
  371. package/resources/image/other/handlerError/napcat.webp +0 -0
  372. package/resources/image/other/handlerError/onebot.png +0 -0
  373. package/resources/image/other/handlerError/satori.png +0 -0
  374. package/resources/image/xiaohongshu/logo.png +0 -0
  375. package/resources/template/style.css +23708 -0
  376. package/resources/vite.svg +130 -0
  377. package/scripts/build.mjs +129 -0
  378. package/scripts/check-schema.cjs +55 -0
  379. package/scripts/deploy.mjs +78 -0
  380. package/scripts/make-demo-placeholders.mjs +112 -0
  381. package/scripts/patch-deps.mjs +46 -0
  382. package/scripts/patch-webui.mjs +112 -0
  383. package/scripts/smoke-commands.cjs +39 -0
  384. package/scripts/smoke-config.cjs +122 -0
  385. package/scripts/smoke-douyin.cjs +170 -0
  386. package/scripts/smoke-koishi-commands.cjs +210 -0
  387. package/scripts/smoke-login.cjs +110 -0
  388. package/scripts/smoke-parse.cjs +54 -0
  389. package/scripts/smoke-push-mock.cjs +114 -0
  390. package/scripts/smoke-push.cjs +104 -0
  391. package/scripts/smoke-qq.cjs +147 -0
  392. package/scripts/smoke-qqcard.cjs +108 -0
  393. package/scripts/smoke-qqpanel.cjs +205 -0
  394. package/scripts/smoke-render.cjs +106 -0
  395. package/scripts/smoke-server.cjs +94 -0
  396. package/src/compat/axios.ts +5 -0
  397. package/src/compat/cron.ts +86 -0
  398. package/src/compat/esm.ts +13 -0
  399. package/src/compat/express.ts +5 -0
  400. package/src/compat/heroui.tsx +53 -0
  401. package/src/compat/lodash.ts +32 -0
  402. package/src/compat/logger.ts +121 -0
  403. package/src/compat/node-karin.ts +1064 -0
  404. package/src/compat/phosphor-icons.tsx +25 -0
  405. package/src/compat/qqcard.ts +251 -0
  406. package/src/compat/root.ts +44 -0
  407. package/src/compat/runtime.ts +120 -0
  408. package/src/compat/segment.ts +161 -0
  409. package/src/compat/sqlite3.ts +123 -0
  410. package/src/compat/start.ts +3 -0
  411. package/src/compat/syncConfig.ts +64 -0
  412. package/src/compat/template-react.ts +54 -0
  413. package/src/compat/text.ts +58 -0
  414. package/src/compat/yaml.ts +6 -0
  415. package/src/configBridge.ts +94 -0
  416. package/src/index.ts +769 -0
  417. package/src/karin/app.ts +1 -0
  418. package/src/karin/apps/__ready.ts +14 -0
  419. package/src/karin/apps/admin.ts +127 -0
  420. package/src/karin/apps/help.ts +228 -0
  421. package/src/karin/apps/push.ts +327 -0
  422. package/src/karin/apps/qrlogin.ts +160 -0
  423. package/src/karin/apps/statistics.ts +203 -0
  424. package/src/karin/apps/testPush.ts +226 -0
  425. package/src/karin/apps/tools.ts +510 -0
  426. package/src/karin/apps/update.ts +239 -0
  427. package/src/karin/index.ts +9 -0
  428. package/src/karin/module/db/bilibili.ts +1089 -0
  429. package/src/karin/module/db/douyin.ts +1218 -0
  430. package/src/karin/module/db/index.ts +159 -0
  431. package/src/karin/module/db/migration.ts +249 -0
  432. package/src/karin/module/db/statistics.ts +817 -0
  433. package/src/karin/module/index.ts +37 -0
  434. package/src/karin/module/server/constants/routes.ts +53 -0
  435. package/src/karin/module/server/controllers/bots.ts +289 -0
  436. package/src/karin/module/server/controllers/config.ts +85 -0
  437. package/src/karin/module/server/controllers/video.ts +212 -0
  438. package/src/karin/module/server/index.ts +11 -0
  439. package/src/karin/module/server/middlewares/auth.ts +147 -0
  440. package/src/karin/module/server/routes/amagi.ts +57 -0
  441. package/src/karin/module/server/routes/api.ts +42 -0
  442. package/src/karin/module/server/routes/index.ts +68 -0
  443. package/src/karin/module/server/routes/ssr.ts +14 -0
  444. package/src/karin/module/server/routes/static.ts +43 -0
  445. package/src/karin/module/utils/Base.ts +497 -0
  446. package/src/karin/module/utils/CardParser.ts +503 -0
  447. package/src/karin/module/utils/Common.ts +448 -0
  448. package/src/karin/module/utils/Config.ts +443 -0
  449. package/src/karin/module/utils/EmojiReaction.ts +268 -0
  450. package/src/karin/module/utils/ErrorHandler/handler.ts +124 -0
  451. package/src/karin/module/utils/ErrorHandler/index.ts +48 -0
  452. package/src/karin/module/utils/ErrorHandler/render.ts +180 -0
  453. package/src/karin/module/utils/ErrorHandler/sender.ts +192 -0
  454. package/src/karin/module/utils/ErrorHandler/strategy.ts +41 -0
  455. package/src/karin/module/utils/ErrorHandler/types.ts +122 -0
  456. package/src/karin/module/utils/ErrorHandler/utils.ts +108 -0
  457. package/src/karin/module/utils/FFmpeg.ts +357 -0
  458. package/src/karin/module/utils/ImageHelper.ts +90 -0
  459. package/src/karin/module/utils/ImageSlice.ts +383 -0
  460. package/src/karin/module/utils/MotionPhoto.ts +297 -0
  461. package/src/karin/module/utils/Network/Downloader.ts +481 -0
  462. package/src/karin/module/utils/Network/ImageDownloader.ts +291 -0
  463. package/src/karin/module/utils/Network/Network.ts +344 -0
  464. package/src/karin/module/utils/Network/ThrottleStream.ts +76 -0
  465. package/src/karin/module/utils/Network/constants.ts +135 -0
  466. package/src/karin/module/utils/Network/helpers.ts +183 -0
  467. package/src/karin/module/utils/Network/index.ts +28 -0
  468. package/src/karin/module/utils/Network/types.ts +46 -0
  469. package/src/karin/module/utils/Networks.ts +20 -0
  470. package/src/karin/module/utils/ParseLock.ts +33 -0
  471. package/src/karin/module/utils/ParseOverride.ts +128 -0
  472. package/src/karin/module/utils/QqCardResolve.ts +116 -0
  473. package/src/karin/module/utils/QqPanel.ts +880 -0
  474. package/src/karin/module/utils/Render/coverTheme.ts +294 -0
  475. package/src/karin/module/utils/Render/index.ts +574 -0
  476. package/src/karin/module/utils/amagiClient.ts +368 -0
  477. package/src/karin/module/utils/avatar.ts +220 -0
  478. package/src/karin/module/utils/bot.ts +115 -0
  479. package/src/karin/module/utils/build-metadata.ts +60 -0
  480. package/src/karin/module/utils/changelog.ts +175 -0
  481. package/src/karin/module/utils/index.ts +10 -0
  482. package/src/karin/module/utils/loginSession.ts +291 -0
  483. package/src/karin/module/utils/parseTip.ts +59 -0
  484. package/src/karin/module/utils/runtime-report.ts +142 -0
  485. package/src/karin/module/utils/semver.ts +60 -0
  486. package/src/karin/module/utils/statisticsAggregate.ts +507 -0
  487. package/src/karin/platform/bilibili/bilibili.ts +2004 -0
  488. package/src/karin/platform/bilibili/comments.ts +397 -0
  489. package/src/karin/platform/bilibili/danmaku.ts +653 -0
  490. package/src/karin/platform/bilibili/dynamic-text.ts +926 -0
  491. package/src/karin/platform/bilibili/genParams.ts +30 -0
  492. package/src/karin/platform/bilibili/getID.ts +163 -0
  493. package/src/karin/platform/bilibili/index.ts +8 -0
  494. package/src/karin/platform/bilibili/live-status.ts +36 -0
  495. package/src/karin/platform/bilibili/login.ts +130 -0
  496. package/src/karin/platform/bilibili/push.ts +1615 -0
  497. package/src/karin/platform/bilibili/riskControl.ts +114 -0
  498. package/src/karin/platform/bilibili/search.ts +305 -0
  499. package/src/karin/platform/common/danmaku-types.ts +18 -0
  500. package/src/karin/platform/douyin/comments.ts +404 -0
  501. package/src/karin/platform/douyin/danmaku.ts +1187 -0
  502. package/src/karin/platform/douyin/douyin.ts +1244 -0
  503. package/src/karin/platform/douyin/getID.ts +101 -0
  504. package/src/karin/platform/douyin/index.ts +8 -0
  505. package/src/karin/platform/douyin/login.ts +251 -0
  506. package/src/karin/platform/douyin/push/favorite.ts +97 -0
  507. package/src/karin/platform/douyin/push/index.ts +5 -0
  508. package/src/karin/platform/douyin/push/live.ts +86 -0
  509. package/src/karin/platform/douyin/push/post.ts +75 -0
  510. package/src/karin/platform/douyin/push/recommend.ts +96 -0
  511. package/src/karin/platform/douyin/push/render.ts +768 -0
  512. package/src/karin/platform/douyin/push/types.ts +41 -0
  513. package/src/karin/platform/douyin/push.ts +1241 -0
  514. package/src/karin/platform/douyin/types.ts +151 -0
  515. package/src/karin/platform/douyin/videoQuality.ts +234 -0
  516. package/src/karin/platform/douyin/workType.ts +238 -0
  517. package/src/karin/platform/index.ts +4 -0
  518. package/src/karin/platform/kuaishou/comments.ts +114 -0
  519. package/src/karin/platform/kuaishou/getID.ts +48 -0
  520. package/src/karin/platform/kuaishou/getdata.ts +78 -0
  521. package/src/karin/platform/kuaishou/index.ts +4 -0
  522. package/src/karin/platform/kuaishou/kuaishou.ts +130 -0
  523. package/src/karin/platform/xiaohongshu/comments.ts +227 -0
  524. package/src/karin/platform/xiaohongshu/getID.ts +127 -0
  525. package/src/karin/platform/xiaohongshu/index.ts +2 -0
  526. package/src/karin/platform/xiaohongshu/xiaohongshu.ts +733 -0
  527. package/src/karin/root.ts +78 -0
  528. package/src/karin/setup.ts +77 -0
  529. package/src/karin/types/config/amagi.ts +46 -0
  530. package/src/karin/types/config/app.ts +129 -0
  531. package/src/karin/types/config/bilibili.ts +121 -0
  532. package/src/karin/types/config/cookies.ts +11 -0
  533. package/src/karin/types/config/douyin.ts +93 -0
  534. package/src/karin/types/config/index.ts +41 -0
  535. package/src/karin/types/config/kuaishou.ts +10 -0
  536. package/src/karin/types/config/pushlist.ts +55 -0
  537. package/src/karin/types/config/request.ts +27 -0
  538. package/src/karin/types/config/upload.ts +49 -0
  539. package/src/karin/types/config/xiaohongshu.ts +24 -0
  540. package/src/karin/types/datatypes.ts +42 -0
  541. package/src/karin/types/index.ts +4 -0
  542. package/src/karin/types/netrorks/NetworksConfigType.ts +61 -0
  543. package/src/karin/types/netrorks/index.ts +1 -0
  544. package/src/karin/web.config.ts +48 -0
  545. package/src/ktr/registry.ts +55 -0
  546. package/src/ktr/template/_preview/components/PreviewInfoCard.tsx +33 -0
  547. package/src/ktr/template/_preview/components/PreviewLayout.tsx +65 -0
  548. package/src/ktr/template/_preview/components/PreviewVideoCard.tsx +22 -0
  549. package/src/ktr/template/_preview/render.ts +158 -0
  550. package/src/ktr/template/_preview/types.ts +15 -0
  551. package/src/ktr/template/_preview/utils/status.ts +29 -0
  552. package/src/ktr/template/_preview/utils/time.ts +8 -0
  553. package/src/ktr/template/bilibili/bangumi/components/bangumi.tsx +462 -0
  554. package/src/ktr/template/bilibili/bangumi/components/types.ts +36 -0
  555. package/src/ktr/template/bilibili/bangumi/index.tsx +9 -0
  556. package/src/ktr/template/bilibili/comment/components/Comment.tsx +657 -0
  557. package/src/ktr/template/bilibili/comment/components/types.ts +26 -0
  558. package/src/ktr/template/bilibili/comment/index.tsx +11 -0
  559. package/src/ktr/template/bilibili/components/Icons.tsx +209 -0
  560. package/src/ktr/template/bilibili/components/shared.tsx +162 -0
  561. package/src/ktr/template/bilibili/components/types.ts +388 -0
  562. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/DYNAMIC_TYPE_ARTICLE.tsx +251 -0
  563. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/components/types.ts +67 -0
  564. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_ARTICLE/index.tsx +12 -0
  565. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/DYNAMIC_TYPE_AV.tsx +238 -0
  566. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/components/types.ts +39 -0
  567. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_AV/index.tsx +12 -0
  568. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/DYNAMIC_TYPE_DRAW.tsx +205 -0
  569. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/components/types.ts +20 -0
  570. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_DRAW/index.tsx +11 -0
  571. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/DYNAMIC_TYPE_FORWARD.tsx +348 -0
  572. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/components/types.ts +16 -0
  573. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_FORWARD/index.tsx +12 -0
  574. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/DYNAMIC_TYPE_LIVE_RCMD.tsx +264 -0
  575. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/components/types.ts +32 -0
  576. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_LIVE_RCMD/index.tsx +12 -0
  577. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/DYNAMIC_TYPE_WORD.tsx +68 -0
  578. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/components/types.ts +14 -0
  579. package/src/ktr/template/bilibili/dynamic/DYNAMIC_TYPE_WORD/index.tsx +12 -0
  580. package/src/ktr/template/bilibili/dynamic/components/AdditionalCard.tsx +165 -0
  581. package/src/ktr/template/bilibili/dynamic/components/CommonComponents.tsx +142 -0
  582. package/src/ktr/template/bilibili/dynamic/types.ts +382 -0
  583. package/src/ktr/template/bilibili/qrcodeImg/components/qrcodeImg.tsx +179 -0
  584. package/src/ktr/template/bilibili/qrcodeImg/components/types.ts +9 -0
  585. package/src/ktr/template/bilibili/qrcodeImg/index.tsx +12 -0
  586. package/src/ktr/template/bilibili/userlist/components/UserList.tsx +246 -0
  587. package/src/ktr/template/bilibili/userlist/components/types.ts +35 -0
  588. package/src/ktr/template/bilibili/userlist/index.tsx +11 -0
  589. package/src/ktr/template/bilibili/videoInfo/components/types.ts +28 -0
  590. package/src/ktr/template/bilibili/videoInfo/components/videoInfo.tsx +217 -0
  591. package/src/ktr/template/bilibili/videoInfo/index.tsx +12 -0
  592. package/src/ktr/template/components/AmbientCover.tsx +50 -0
  593. package/src/ktr/template/components/DefaultLayout.tsx +166 -0
  594. package/src/ktr/template/components/GlowImage.tsx +572 -0
  595. package/src/ktr/template/components/QRCodeWithAvatar.tsx +52 -0
  596. package/src/ktr/template/components/RolldownLogo.tsx +110 -0
  597. package/src/ktr/template/components/ViteLogo.tsx +134 -0
  598. package/src/ktr/template/components/iconRegistry.ts +294 -0
  599. package/src/ktr/template/douyin/article-work/components/ArticleWork.tsx +301 -0
  600. package/src/ktr/template/douyin/article-work/components/types.ts +53 -0
  601. package/src/ktr/template/douyin/article-work/index.tsx +12 -0
  602. package/src/ktr/template/douyin/comment/components/Comment.tsx +612 -0
  603. package/src/ktr/template/douyin/comment/components/types.ts +85 -0
  604. package/src/ktr/template/douyin/comment/index.tsx +11 -0
  605. package/src/ktr/template/douyin/components/Icons.tsx +75 -0
  606. package/src/ktr/template/douyin/components/types.ts +83 -0
  607. package/src/ktr/template/douyin/dynamic/components/Dynamic.tsx +283 -0
  608. package/src/ktr/template/douyin/dynamic/components/types.ts +46 -0
  609. package/src/ktr/template/douyin/dynamic/index.tsx +11 -0
  610. package/src/ktr/template/douyin/favorite-list/components/FavoriteList.tsx +201 -0
  611. package/src/ktr/template/douyin/favorite-list/components/types.ts +38 -0
  612. package/src/ktr/template/douyin/favorite-list/index.tsx +12 -0
  613. package/src/ktr/template/douyin/image-work/components/ImageWork.tsx +437 -0
  614. package/src/ktr/template/douyin/image-work/components/types.ts +78 -0
  615. package/src/ktr/template/douyin/image-work/index.tsx +11 -0
  616. package/src/ktr/template/douyin/live/components/Live.tsx +229 -0
  617. package/src/ktr/template/douyin/live/components/types.ts +47 -0
  618. package/src/ktr/template/douyin/live/index.tsx +11 -0
  619. package/src/ktr/template/douyin/musicinfo/components/MusicInfo.tsx +187 -0
  620. package/src/ktr/template/douyin/musicinfo/components/types.ts +31 -0
  621. package/src/ktr/template/douyin/musicinfo/index.tsx +11 -0
  622. package/src/ktr/template/douyin/qrcodeImg/components/qrcodeImg.tsx +170 -0
  623. package/src/ktr/template/douyin/qrcodeImg/components/types.ts +9 -0
  624. package/src/ktr/template/douyin/qrcodeImg/index.tsx +9 -0
  625. package/src/ktr/template/douyin/recommend-list/components/RecommendList.tsx +201 -0
  626. package/src/ktr/template/douyin/recommend-list/components/types.ts +37 -0
  627. package/src/ktr/template/douyin/recommend-list/index.tsx +12 -0
  628. package/src/ktr/template/douyin/user_profile/components/UserVideoList.tsx +225 -0
  629. package/src/ktr/template/douyin/user_profile/components/types.ts +71 -0
  630. package/src/ktr/template/douyin/user_profile/index.tsx +9 -0
  631. package/src/ktr/template/douyin/userlist/components/UserList.tsx +229 -0
  632. package/src/ktr/template/douyin/userlist/components/types.ts +35 -0
  633. package/src/ktr/template/douyin/userlist/index.tsx +11 -0
  634. package/src/ktr/template/douyin/video-work/components/VideoWork.tsx +398 -0
  635. package/src/ktr/template/douyin/video-work/components/types.ts +80 -0
  636. package/src/ktr/template/douyin/video-work/index.tsx +11 -0
  637. package/src/ktr/template/font.css +6071 -0
  638. package/src/ktr/template/global.d.ts +69 -0
  639. package/src/ktr/template/kuaishou/comment/components/Comment.tsx +207 -0
  640. package/src/ktr/template/kuaishou/comment/components/types.ts +47 -0
  641. package/src/ktr/template/kuaishou/comment/index.tsx +11 -0
  642. package/src/ktr/template/other/changelog/components/changelog.tsx +411 -0
  643. package/src/ktr/template/other/changelog/components/types.ts +21 -0
  644. package/src/ktr/template/other/changelog/index.tsx +9 -0
  645. package/src/ktr/template/other/handlerError/components/errorTitles.ts +224 -0
  646. package/src/ktr/template/other/handlerError/components/handlerError.tsx +1076 -0
  647. package/src/ktr/template/other/handlerError/components/stackHighlight.ts +127 -0
  648. package/src/ktr/template/other/handlerError/components/types.ts +124 -0
  649. package/src/ktr/template/other/handlerError/index.tsx +9 -0
  650. package/src/ktr/template/other/help/components/Help.tsx +249 -0
  651. package/src/ktr/template/other/help/components/types.ts +47 -0
  652. package/src/ktr/template/other/help/index.tsx +9 -0
  653. package/src/ktr/template/other/live-photo-tip/components/LivePhotoTip.tsx +295 -0
  654. package/src/ktr/template/other/live-photo-tip/components/types.ts +8 -0
  655. package/src/ktr/template/other/live-photo-tip/index.tsx +9 -0
  656. package/src/ktr/template/other/qrlogin/components/qrlogin.tsx +295 -0
  657. package/src/ktr/template/other/qrlogin/components/types.ts +11 -0
  658. package/src/ktr/template/other/qrlogin/index.tsx +9 -0
  659. package/src/ktr/template/other/runtime/components/runtime.tsx +347 -0
  660. package/src/ktr/template/other/runtime/components/types.ts +75 -0
  661. package/src/ktr/template/other/runtime/index.tsx +9 -0
  662. package/src/ktr/template/other/version_warning/components/VersionWarning.tsx +392 -0
  663. package/src/ktr/template/other/version_warning/components/types.ts +8 -0
  664. package/src/ktr/template/other/version_warning/index.tsx +9 -0
  665. package/src/ktr/template/statistics/components/BoxplotGuide.tsx +57 -0
  666. package/src/ktr/template/statistics/components/ChartCard.tsx +40 -0
  667. package/src/ktr/template/statistics/components/KpiCard.tsx +39 -0
  668. package/src/ktr/template/statistics/components/PlatformTable.tsx +83 -0
  669. package/src/ktr/template/statistics/components/RankList.tsx +127 -0
  670. package/src/ktr/template/statistics/components/SSRChart.tsx +41 -0
  671. package/src/ktr/template/statistics/components/chartPresets.ts +700 -0
  672. package/src/ktr/template/statistics/components/chartTheme.ts +234 -0
  673. package/src/ktr/template/statistics/components/format.ts +33 -0
  674. package/src/ktr/template/statistics/components/types.ts +92 -0
  675. package/src/ktr/template/statistics/global/components/GlobalStatistics.tsx +597 -0
  676. package/src/ktr/template/statistics/global/components/types.ts +138 -0
  677. package/src/ktr/template/statistics/global/index.tsx +9 -0
  678. package/src/ktr/template/statistics/group/components/GroupStatistics.tsx +468 -0
  679. package/src/ktr/template/statistics/group/components/types.ts +113 -0
  680. package/src/ktr/template/statistics/group/index.tsx +9 -0
  681. package/src/ktr/template/style.css +65 -0
  682. package/src/ktr/template/types/ctx.ts +42 -0
  683. package/src/ktr/template/xiaohongshu/comment/components/Comment.tsx +264 -0
  684. package/src/ktr/template/xiaohongshu/comment/components/types.ts +119 -0
  685. package/src/ktr/template/xiaohongshu/comment/index.tsx +9 -0
  686. package/src/ktr/template/xiaohongshu/noteInfo/components/noteInfo.tsx +271 -0
  687. package/src/ktr/template/xiaohongshu/noteInfo/components/types.ts +66 -0
  688. package/src/ktr/template/xiaohongshu/noteInfo/index.tsx +9 -0
  689. package/src/ktr/utils/QRCodeAvatar.ts +102 -0
  690. package/src/ktr/utils/QRcode.ts +65 -0
  691. package/src/ktr/utils/avatarProxy.ts +42 -0
  692. package/src/ktr/utils/cn.ts +6 -0
  693. package/src/ktr/utils/theme.ts +10 -0
  694. package/src/qqFields.json +75 -0
  695. package/src/qqOptions.ts +64 -0
  696. package/src/richtext/index.ts +9 -0
  697. package/src/richtext/parse/index.ts +271 -0
  698. package/src/richtext/react/cn.ts +6 -0
  699. package/src/richtext/react/index.tsx +582 -0
  700. package/src/richtext/types.ts +320 -0
  701. package/src/schema.ts +372 -0
  702. package/src/webui.ts +352 -0
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.BangumiBilibili = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("../../../../../compat/heroui.js");
9
+ const lucide_react_1 = require("lucide-react");
10
+ const react_2 = __importDefault(require("react"));
11
+ const DefaultLayout_1 = require("../../../components/DefaultLayout");
12
+ const cn_1 = require("../../../../utils/cn");
13
+ const shared_1 = require("../../components/shared");
14
+ /**
15
+ * 格式化数字显示
16
+ * @param num 要格式化的数字
17
+ * @returns 格式化后的字符串
18
+ */
19
+ const formatNumber = (num) => {
20
+ if (num >= 100000000) {
21
+ return `${(num / 100000000).toFixed(1)}亿`;
22
+ }
23
+ if (num >= 10000) {
24
+ return `${(num / 10000).toFixed(1)}万`;
25
+ }
26
+ return num.toString();
27
+ };
28
+ /**
29
+ * 格式化日期部分
30
+ * @param timestamp 时间戳
31
+ * @returns 包含月份和日期的对象
32
+ */
33
+ const formatDateParts = (timestamp) => {
34
+ const date = new Date(timestamp * 1000);
35
+ const month = date.toLocaleDateString('zh-CN', { month: 'short' });
36
+ const day = date.getDate().toString().padStart(2, '0');
37
+ return { month, day };
38
+ };
39
+ /**
40
+ * 格式化完整日期时间
41
+ * @param timestamp 时间戳
42
+ * @returns 格式化的日期时间字符串
43
+ */
44
+ const formatDateTime = (timestamp) => {
45
+ const date = new Date(timestamp * 1000);
46
+ return date.toLocaleDateString('zh-CN', {
47
+ year: 'numeric',
48
+ month: 'short',
49
+ day: 'numeric',
50
+ hour: '2-digit',
51
+ minute: '2-digit'
52
+ });
53
+ };
54
+ /**
55
+ * B站番剧头部组件
56
+ * @param props 头部组件属性
57
+ */
58
+ const BangumiBilibiliHeader = (props) => {
59
+ // 处理演员数据
60
+ const actorList = props.actors ? props.actors.split(/[,,、\s]+/).filter((actor) => actor.trim()) : [];
61
+ return ((0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden relative rounded-6xl", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex relative z-10 gap-25 p-25", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col shrink-0 gap-20", children: [(0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden rounded-4xl w-120 h-160", children: (0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { src: props.mainCover, alt: props.title, className: "object-cover w-full h-full select-text" }) }), props.upInfo && ((0, jsx_runtime_1.jsxs)("div", { className: "flex gap-12 items-center mt-15", children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative", children: [(0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { className: "w-28 h-28 rounded-full select-text", src: `https://images.weserv.nl/?url=${encodeURIComponent(props.upInfo.avatar)}`, alt: props.upInfo.uname }), props.upInfo.avatar_subscript_url && ((0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { className: "absolute -right-1 -bottom-1 w-8 h-8 select-text", src: props.upInfo.avatar_subscript_url, alt: "\u5934\u50CF\u89D2\u6807" })), props.upInfo.pendant?.image && ((0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { className: "absolute inset-0 w-full h-full transform select-text scale-160", src: props.upInfo.pendant.image, alt: props.upInfo.pendant.name || '挂件' }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-3 items-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-4xl font-medium select-text", style: {
62
+ color: props.upInfo.vip_status === 1 ? props.upInfo.nickname_color || '#FB7299' : '#EDEDED'
63
+ }, children: props.upInfo.uname }), props.upInfo.verify_type > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center", children: props.upInfo.verify_type === 1 ? ((0, jsx_runtime_1.jsx)(lucide_react_1.Shield, { width: 20, className: "text-warning" })) : ((0, jsx_runtime_1.jsx)(lucide_react_1.Crown, { width: 20, className: "text-accent" })) })), props.upInfo.vip_status === 1 && props.upInfo.vip_label?.text && ((0, jsx_runtime_1.jsx)(react_1.Chip, { size: "sm", className: "px-2 py-1 text-xs select-text", style: {
64
+ backgroundColor: props.upInfo.vip_label.bg_color || '#FB7299',
65
+ color: props.upInfo.vip_label.text_color || '#FFFFFF',
66
+ borderColor: props.upInfo.vip_label.border_color || 'transparent'
67
+ }, children: props.upInfo.vip_label.text }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center text-3xl select-text text-foreground", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Users, { size: 30 }), (0, jsx_runtime_1.jsxs)("span", { children: [formatNumber(props.upInfo.follower), "\u7C89\u4E1D"] }), props.upInfo.is_follow === 1 && ((0, jsx_runtime_1.jsx)(react_1.Chip, { size: "sm", color: "accent", variant: "soft", className: "text-xs select-text", children: "\u5DF2\u5173\u6CE8" }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2 items-center text-2xl select-text text-foreground/70", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Hash, { size: 20 }), (0, jsx_runtime_1.jsxs)("span", { children: ["UID: ", props.upInfo.mid] })] })] })] })), props.showEpisodeTip !== false && ((0, jsx_runtime_1.jsxs)("div", { className: "flex text-3xl select-text text-foreground", children: [(0, jsx_runtime_1.jsx)("span", { children: "\u63D0\u793A\uFF1A\u8BF7\u5728120\u79D2\u5185\u53D1\u9001" }), (0, jsx_runtime_1.jsx)("span", { className: "inline-flex items-center rounded-xl bg-danger/12 px-4 py-1.5 text-[0.95em] font-semibold text-danger", children: "\u7B2C \uFF1F \u96C6" }), (0, jsx_runtime_1.jsx)("span", { children: "\u9009\u62E9\u96C6\u6570" })] }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 justify-between text-foreground", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-8 text-8xl font-bold leading-tight select-text", children: props.title }), props.subtitle && (0, jsx_runtime_1.jsx)("div", { className: "mb-12 text-4xl select-text text-foreground", children: props.subtitle }), props.styles && props.styles.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-wrap gap-8 mb-12", children: props.styles.map((style, index) => ((0, jsx_runtime_1.jsx)(react_1.Chip, { size: "lg", className: "w-32 h-12 rounded-xl bg-surface-secondary px-4 py-2 text-3xl text-foreground backdrop-blur-sm select-text", children: style }, index))) })), actorList.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-12", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center mb-6 text-3xl select-text text-foreground", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Users, { size: 30 }), (0, jsx_runtime_1.jsx)("span", { children: "\u58F0\u4F18\u9635\u5BB9" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-wrap gap-8", children: [actorList.slice(0, 6).map((actor, index) => ((0, jsx_runtime_1.jsx)("div", { className: "text-3xl select-text text-foreground", children: actor }, index))), actorList.length > 6 && (0, jsx_runtime_1.jsxs)("div", { className: "text-3xl select-text text-foreground", children: ["\u7B49", actorList.length, "\u4EBA"] })] })] })), props.evaluate && ((0, jsx_runtime_1.jsxs)("div", { className: "mb-12", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center mb-6 text-3xl select-text text-foreground", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Star, { size: 30 }), (0, jsx_runtime_1.jsx)("span", { children: "\u8BC4\u4EF7" })] }), (0, jsx_runtime_1.jsx)("div", { className: "text-3xl leading-relaxed select-text text-foreground", children: props.evaluate })] }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-4 gap-16", children: [(0, jsx_runtime_1.jsxs)("div", { className: "items-center min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-baseline", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold select-text text-foreground", children: formatNumber(props.stat.views).slice(0, -1) }), (0, jsx_runtime_1.jsx)("span", { className: "text-xl font-bold select-text text-foreground", children: formatNumber(props.stat.views).slice(-1) })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-2xl whitespace-nowrap select-text", children: "\u64AD\u653E" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "items-center min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-baseline", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold select-text text-foreground", children: formatNumber(props.stat.favorites).slice(0, -1) }), (0, jsx_runtime_1.jsx)("span", { className: "text-xl font-bold select-text text-foreground", children: formatNumber(props.stat.favorites).slice(-1) })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-2xl whitespace-nowrap select-text", children: "\u6536\u85CF" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "items-center min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-baseline", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold select-text text-foreground", children: formatNumber(props.stat.danmakus).slice(0, -1) }), (0, jsx_runtime_1.jsx)("span", { className: "text-xl font-bold select-text text-foreground", children: formatNumber(props.stat.danmakus).slice(-1) })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-2xl whitespace-nowrap select-text", children: "\u5F39\u5E55" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "items-center min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-baseline", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold select-text text-foreground", children: formatNumber(props.stat.coins).slice(0, -1) }), (0, jsx_runtime_1.jsx)("span", { className: "text-xl font-bold select-text text-foreground", children: formatNumber(props.stat.coins).slice(-1) })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-2xl whitespace-nowrap select-text", children: "\u6295\u5E01" })] })] })] })] }) }));
68
+ };
69
+ /**
70
+ * B站番剧剧集列表组件
71
+ * @param props 剧集列表组件属性
72
+ */
73
+ const BangumiBilibiliEpisodes = (props) => {
74
+ // 按发布时间倒序排序
75
+ const sortedEpisodes = [...props.Episodes].sort((a, b) => b.pub_time - a.pub_time);
76
+ // 按日期分组剧集
77
+ const groupedEpisodes = sortedEpisodes.reduce((groups, episode) => {
78
+ const date = new Date(episode.pub_time * 1000);
79
+ const dateKey = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
80
+ if (!groups[dateKey]) {
81
+ groups[dateKey] = [];
82
+ }
83
+ groups[dateKey].push(episode);
84
+ return groups;
85
+ }, {});
86
+ const dateKeys = Object.keys(groupedEpisodes).sort((a, b) => b.localeCompare(a));
87
+ const flattenedEpisodes = [];
88
+ dateKeys.forEach((dateIndex) => {
89
+ const episodesInDate = groupedEpisodes[dateIndex];
90
+ episodesInDate.forEach((episode, episodeIndex) => {
91
+ flattenedEpisodes.push({
92
+ episode,
93
+ isFirstOfDate: episodeIndex === 0,
94
+ isLastOfDate: episodeIndex === episodesInDate.length - 1,
95
+ isLastOfAll: false,
96
+ dateKey: dateIndex,
97
+ episodesInSameDate: episodesInDate.length
98
+ });
99
+ });
100
+ });
101
+ if (flattenedEpisodes.length > 0) {
102
+ flattenedEpisodes[flattenedEpisodes.length - 1].isLastOfAll = true;
103
+ }
104
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "px-10", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-8 items-center mb-20 text-5xl font-bold select-text text-foreground", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Play, { size: 46 }), (0, jsx_runtime_1.jsx)("span", { children: "\u5267\u96C6\u5217\u8868" }), (0, jsx_runtime_1.jsxs)(react_1.Chip, { size: "lg", color: "danger", variant: "soft", className: "h-18 px-4 py-2 text-4xl select-text", children: ["\u5171", sortedEpisodes.length, "\u96C6"] })] }), (0, jsx_runtime_1.jsx)("div", { children: flattenedEpisodes.map((item) => {
105
+ const { episode, isFirstOfDate, isLastOfAll, episodesInSameDate, isLastOfDate } = item;
106
+ const { month, day } = formatDateParts(episode.pub_time);
107
+ const episodeNumber = sortedEpisodes.findIndex((e) => e.bvid === episode.bvid);
108
+ const actualEpisodeNumber = sortedEpisodes.length - episodeNumber;
109
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "flex gap-15", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex flex-col shrink-0 items-center w-20", children: isFirstOfDate ? (
110
+ // 日期节点
111
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "text-4xl select-text text-foreground", children: month }), (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center items-center text-7xl font-bold select-text text-foreground", children: day }), !isLastOfAll && (0, jsx_runtime_1.jsx)("div", { className: (0, cn_1.cn)('mt-8 w-1 bg-divider', episodesInSameDate > 1 ? 'h-110' : 'h-95') })] })) : (
112
+ // 普通节点
113
+ (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "w-1 h-10 bg-divider" }), (0, jsx_runtime_1.jsx)("div", { className: "my-2 w-4 h-4 rounded-full bg-divider" }), (!isLastOfAll || episodesInSameDate > 1) && (0, jsx_runtime_1.jsx)("div", { className: (0, cn_1.cn)('w-1 bg-divider', isLastOfDate ? 'h-110' : 'h-130') })] })) }), (0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)('flex-1 min-w-0', !isLastOfAll && isLastOfDate && 'mb-20'), children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center mb-10", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex shrink-0 gap-8 items-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "relative", children: (0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { className: "w-32 h-32 rounded-full select-text", src: `https://images.weserv.nl/?url=${encodeURIComponent(props.UPInfo ? props.UPInfo.avatar : props.mainCover)}`, alt: '' }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-6", children: [(0, jsx_runtime_1.jsx)("div", { className: "text-4xl font-bold select-text text-foreground/80", children: props.UPInfo ? props.UPInfo.uname : props.Title }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-4 items-center text-3xl select-text text-foreground/70", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Calendar, { size: 30 }), (0, jsx_runtime_1.jsx)("span", { children: "\u53D1\u5E03\u4E86\u5185\u5BB9" })] })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "shrink-0 pr-20", children: (0, jsx_runtime_1.jsxs)("div", { className: "text-5xl font-semibold select-text text-foreground/70", children: ["\u7B2C", actualEpisodeNumber, "\u96C6"] }) })] }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden shadow-large bg-surface rounded-4xl", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-12 p-12", children: [(0, jsx_runtime_1.jsx)("div", { className: "relative shrink-0", children: (0, jsx_runtime_1.jsxs)("div", { className: "overflow-hidden relative h-64 rounded-3xl w-md", children: [(0, jsx_runtime_1.jsx)(shared_1.EnhancedImage, { src: episode.cover, alt: `第${actualEpisodeNumber}集 ${episode.long_title}`, className: "object-cover w-full h-full select-text" }), episode.badge && ((0, jsx_runtime_1.jsx)(react_1.Chip, { size: "lg", className: "absolute top-6 right-8 rounded-2xl py-1 text-lg font-medium select-text scale-150", style: {
114
+ backgroundColor: episode.badge_info?.bg_color || '#FB7299',
115
+ color: '#FFFFFF'
116
+ }, children: episode.badge_info?.text || episode.badge }))] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 justify-center h-64", children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-8 text-5xl font-semibold select-text text-foreground line-clamp-2", children: episode.long_title }), (0, jsx_runtime_1.jsxs)("div", { className: "space-y-4 text-4xl", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center select-text text-foreground/70", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Hash, { size: 36 }), (0, jsx_runtime_1.jsx)("span", { className: "truncate", children: episode.bvid })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center select-text text-foreground/70", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Clock, { size: 36 }), (0, jsx_runtime_1.jsx)("span", { className: "whitespace-nowrap", children: formatDateTime(episode.pub_time) })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-6 items-center select-text text-foreground/70", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Share2, { size: 36 }), (0, jsx_runtime_1.jsx)("span", { className: "truncate", children: episode.link })] })] })] })] }) })] })] }, episode.bvid));
117
+ }) })] }));
118
+ };
119
+ exports.BangumiBilibili = react_2.default.memo((props) => {
120
+ return ((0, jsx_runtime_1.jsx)(DefaultLayout_1.DefaultLayout, { ...props, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-4", children: [(0, jsx_runtime_1.jsx)(BangumiBilibiliHeader
121
+ // 卡片里有没有画分集列表:有才提示「发送第?集」(QQ 面板用表格按钮,这时不提示)
122
+ , {
123
+ // 卡片里有没有画分集列表:有才提示「发送第?集」(QQ 面板用表格按钮,这时不提示)
124
+ showEpisodeTip: Array.isArray(props.data.Episodes) && props.data.Episodes.length > 0, title: props.data.Title, mainCover: props.data.mainCover, evaluate: props.data.Evaluate, actors: props.data.Actors, styles: props.data.Styles, subtitle: props.data.subtitle, upInfo: props.data.UPInfo, stat: props.data.Stat, copyright: props.data.Copyright, seasonID: props.data.seasonID }), props.data.Episodes && props.data.Episodes.length > 0 && (0, jsx_runtime_1.jsx)(BangumiBilibiliEpisodes, { ...props.data })] }) }));
125
+ });
126
+ exports.BangumiBilibili.displayName = 'BangumiBilibili';
127
+ exports.default = exports.BangumiBilibili;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const template_react_1 = require("../../../../compat/template-react.js");
7
+ const bangumi_1 = __importDefault(require("./components/bangumi"));
8
+ exports.default = (0, template_react_1.defineTemplate)({
9
+ name: 'B站番剧列表',
10
+ description: 'B站番剧列表组件',
11
+ component: bangumi_1.default
12
+ });
@@ -0,0 +1,193 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.BilibiliComment = void 0;
37
+ const jsx_runtime_1 = require("react/jsx-runtime");
38
+ const richtext_1 = require("../../../../../richtext");
39
+ const date_fns_1 = require("date-fns");
40
+ const locale_1 = require("date-fns/locale");
41
+ const react_1 = __importStar(require("react"));
42
+ const cn_1 = require("../../../../utils/cn");
43
+ const QRcode_1 = require("../../../../utils/QRcode");
44
+ const theme_1 = require("../../../../utils/theme");
45
+ const DefaultLayout_1 = require("../../../components/DefaultLayout");
46
+ const Icons_1 = require("../../components/Icons");
47
+ const bilibiliMentionClassName = 'text-[#006A9E] dark:text-[#58B0D5]';
48
+ /**
49
+ * 将 B 站 32 位 ARGB 整数转为 rgba 字符串
50
+ */
51
+ const intToRgba = (color) => {
52
+ const a = ((color >>> 24) & 0xff) / 255;
53
+ const r = (color >>> 16) & 0xff;
54
+ const g = (color >>> 8) & 0xff;
55
+ const b = color & 0xff;
56
+ return `rgba(${r}, ${g}, ${b}, ${a})`;
57
+ };
58
+ /**
59
+ * 粉丝勋章组件
60
+ */
61
+ const FansMedal = ({ detail }) => {
62
+ const bgStart = intToRgba(detail.medal_color);
63
+ const bgEnd = intToRgba(detail.medal_color_end);
64
+ const borderColor = intToRgba(detail.medal_color_border);
65
+ const nameColor = intToRgba(detail.medal_color_name);
66
+ const levelColor = intToRgba(detail.medal_color_level);
67
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)('inline-flex items-center shrink-0', 'h-14 rounded-full border'), style: {
68
+ borderColor,
69
+ backgroundImage: `linear-gradient(90deg, ${bgStart}, ${bgEnd})`
70
+ }, children: [detail.first_icon && ((0, jsx_runtime_1.jsx)("img", { src: detail.first_icon, alt: "", className: "shrink-0 -ml-3 w-20", referrerPolicy: "no-referrer", crossOrigin: "anonymous" })), (0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)('flex items-center', detail.first_icon ? 'pr-4' : 'px-4'), children: [(0, jsx_runtime_1.jsx)("span", { className: "font-medium whitespace-nowrap text-3xl", style: { color: nameColor }, children: detail.medal_name }), (0, jsx_runtime_1.jsx)("span", { className: "whitespace-nowrap ml-2 mb-1 text-4xl font-[fansmedal-num]", style: { color: levelColor }, children: detail.level })] })] }));
71
+ };
72
+ /**
73
+ * 置顶标签组件
74
+ */
75
+ const TopBadge = () => {
76
+ return ((0, jsx_runtime_1.jsx)("span", { className: (0, cn_1.cn)('inline-flex justify-center items-center', 'px-4 py-2 mr-4 mb-1 rounded-xl', 'text-[45px] font-light leading-none', 'align-baseline', 'bg-[#ffedf5] text-[#ff799e]', 'dark:bg-[#321b26] dark:text-[#cb5775]'), children: "\u7F6E\u9876" }));
77
+ };
78
+ const ImageWithSkeleton = ({ src, alt, className = '', placeholder }) => {
79
+ const [hasError, setHasError] = (0, react_1.useState)(false);
80
+ /**
81
+ * 处理图片加载失败
82
+ */
83
+ const handleError = () => {
84
+ setHasError(true);
85
+ };
86
+ // 重置状态当src改变时
87
+ (0, react_1.useEffect)(() => {
88
+ setHasError(false);
89
+ }, [src]);
90
+ if (hasError) {
91
+ return ((0, jsx_runtime_1.jsx)("div", { className: `flex justify-center items-center text-sm select-text ${className} bg-surface-secondary text-muted`, children: placeholder || '图片加载失败' }));
92
+ }
93
+ return ((0, jsx_runtime_1.jsx)("img", { src: src, alt: alt, className: `select-text ${className}`, onError: handleError, referrerPolicy: "no-referrer", crossOrigin: "anonymous" }));
94
+ };
95
+ const renderBilibiliCommentRichText = (content) => {
96
+ return (0, richtext_1.renderRichTextToReact)(content, {
97
+ mention: { className: bilibiliMentionClassName }
98
+ });
99
+ };
100
+ const formatBilibiliCommentTime = (timestamp) => {
101
+ if (!timestamp) {
102
+ return '';
103
+ }
104
+ const commentDate = (0, date_fns_1.fromUnixTime)(timestamp);
105
+ const diffSeconds = (0, date_fns_1.differenceInSeconds)(new Date(), commentDate);
106
+ if (diffSeconds < 30) {
107
+ return '刚刚';
108
+ }
109
+ if (diffSeconds < 7776000) {
110
+ return (0, date_fns_1.formatDistanceToNow)(commentDate, {
111
+ locale: locale_1.zhCN,
112
+ addSuffix: true
113
+ });
114
+ }
115
+ return (0, date_fns_1.format)(commentDate, 'yyyy-MM-dd');
116
+ };
117
+ const formatBilibiliLikeCount = (count) => {
118
+ if (count > 10000) {
119
+ return `${(count / 10000).toFixed(1)}w`;
120
+ }
121
+ return String(count);
122
+ };
123
+ const renderBilibiliUserName = (uname, unameColor, vipstatus) => {
124
+ return ((0, jsx_runtime_1.jsx)("span", { className: "inline-block leading-[1.2] font-medium whitespace-nowrap", style: {
125
+ color: unameColor ?? '#888',
126
+ fontWeight: vipstatus === 1 ? 500 : undefined
127
+ }, children: uname }));
128
+ };
129
+ const BilibiliLogo = () => {
130
+ const [hasError, setHasError] = (0, react_1.useState)(false);
131
+ if (hasError) {
132
+ return (0, jsx_runtime_1.jsx)("div", { className: "flex items-center h-full text-6xl font-bold text-foreground/70", children: "\u54D4\u54E9\u54D4\u54E9" });
133
+ }
134
+ return ((0, jsx_runtime_1.jsx)("img", { src: "/image/bilibili/bilibili.png", alt: "B\u7AD9Logo", className: "object-contain h-full w-auto max-w-112.5", onError: () => setHasError(true) }));
135
+ };
136
+ /**
137
+ * 二维码组件
138
+ * @param props 组件属性
139
+ * @returns JSX元素
140
+ */
141
+ const QRCodeSection = ({ share_url, useDarkTheme }) => {
142
+ return ((0, jsx_runtime_1.jsx)("div", { className: "flex flex-col items-center", children: (0, jsx_runtime_1.jsx)("div", { className: "flex justify-center items-center w-100 h-100 p-4", children: (0, jsx_runtime_1.jsx)("img", { src: (0, QRcode_1.generateQRCode)(share_url, useDarkTheme), alt: "\u4E8C\u7EF4\u7801", className: "object-contain w-full h-full rounded-lg" }) }) }));
143
+ };
144
+ /**
145
+ * 视频信息头部组件
146
+ * @param props 组件属性
147
+ * @returns JSX元素
148
+ */
149
+ const VideoInfoHeader = (props) => {
150
+ return ((0, jsx_runtime_1.jsx)("div", { className: "max-w-350 mx-auto px-10 py-8", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex gap-16 justify-between items-start", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1", children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-12", children: (0, jsx_runtime_1.jsxs)("div", { className: "h-45 flex items-center", children: [(0, jsx_runtime_1.jsx)(BilibiliLogo, {}), props.Type === '视频' && props.Resolution && ((0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-2 px-8 py-4 ml-12 rounded-3xl bg-surface/50 w-fit", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-[42px] text-muted", children: "\u5206\u8FA8\u7387\uFF08px\uFF09" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[48px] font-medium text-foreground/70", children: props.Resolution })] }))] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "grid grid-cols-2 gap-y-6 gap-x-16 pl-2", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center tracking-[6px] text-[45px] text-muted select-text whitespace-nowrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "shrink-0 mr-4 text-muted", children: "\u7C7B\u578B" }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium text-foreground/70", children: props.Type })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center tracking-[6px] text-[45px] text-muted select-text whitespace-nowrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "shrink-0 mr-4 text-muted", children: "\u8BC4\u8BBA" }), (0, jsx_runtime_1.jsxs)("span", { className: "font-medium text-foreground/70", children: [props.CommentLength, "\u6761"] })] }), props.Type === '视频' ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center tracking-[6px] text-[45px] text-muted select-text whitespace-nowrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "shrink-0 mr-4 text-muted", children: "\u5927\u5C0F" }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium text-foreground/70", children: props.VideoSize })] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center tracking-[6px] text-[45px] text-muted select-text whitespace-nowrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "shrink-0 mr-4 text-muted", children: "\u753B\u8D28" }), (0, jsx_runtime_1.jsx)("span", { className: "font-medium text-foreground/70", children: props.Clarity })] })] })) : ((0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center tracking-[6px] text-[45px] text-muted select-text whitespace-nowrap", children: [(0, jsx_runtime_1.jsx)("span", { className: "shrink-0 mr-4 text-muted", children: "\u56FE\u7247" }), (0, jsx_runtime_1.jsxs)("span", { className: "font-medium text-foreground/70", children: [props.ImageLength, "\u5F20"] })] }) }))] })] }), (0, jsx_runtime_1.jsx)("div", { className: "shrink-0", children: (0, jsx_runtime_1.jsx)(QRCodeSection, { share_url: props.share_url, useDarkTheme: props.useDarkTheme }) })] }) }));
151
+ };
152
+ /**
153
+ * 评论项组件
154
+ * @param props 组件属性
155
+ * @returns JSX元素
156
+ */
157
+ const CommentItemComponent = ({ isLast = false, ...props }) => {
158
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, cn_1.cn)('flex relative px-10 py-10 max-w-full', { 'pb-0': isLast }), children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative mr-[33.75px] shrink-0 w-50 h-50 flex items-center justify-center", children: [(0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: props.avatar || 'AVATAR_PLACEHOLDER', alt: "\u7528\u6237\u5934\u50CF", className: "rounded-full w-35 h-35 shadow-large", placeholder: "\u5934\u50CF", isCircular: true }), props.frame && ((0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: props.frame, alt: "\u5934\u50CF\u6846", className: "absolute inset-0 transform scale-120", placeholder: "\u5934\u50CF\u6846" })), props.vipstatus === 1 && ((0, jsx_runtime_1.jsx)("div", { className: "flex absolute right-4 bottom-6 z-20 justify-center items-center rounded-full w-15 h-15 bg-surface", children: (0, jsx_runtime_1.jsx)("img", { src: "/image/bilibili/res-local1.png", alt: "\u5927\u4F1A\u5458", className: "w-12 h-12" }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 min-w-0", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-start gap-2.5 mb-3.75 text-[50px] relative", children: [(0, jsx_runtime_1.jsxs)("div", { className: "shrink-0 flex items-center gap-6 leading-[1.2] text-foreground/80 font-bold select-text", children: [renderBilibiliUserName(props.uname, props.unameColor, props.vipstatus), props.level !== undefined && props.level >= 0 && props.level <= 7 && ((0, jsx_runtime_1.jsx)("img", { src: `/image/bilibili/level/lv${props.level}.svg`, alt: `等级${props.level}`, className: "inline-block shrink-0 w-24 h-24 align-middle" })), props.isUP && (0, jsx_runtime_1.jsx)("img", { src: "/image/bilibili/up_pb.svg", alt: "UP\u4E3B\u6807\u7B7E", className: "inline-block shrink-0 align-middle w-23 h-23" }), props.fansDetail && (0, jsx_runtime_1.jsx)(FansMedal, { detail: props.fansDetail })] }), props.fanCard && props.fanCard.image && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-10 right-0 h-45 z-10 pointer-events-none", children: (0, jsx_runtime_1.jsxs)("div", { className: "inline-block relative h-full", children: [(0, jsx_runtime_1.jsx)("img", { src: props.fanCard.image, alt: "\u7C89\u4E1D\u5361\u7247", className: "block object-contain w-auto h-full", referrerPolicy: "no-referrer", crossOrigin: "anonymous" }), (0, jsx_runtime_1.jsxs)("div", { className: "absolute bottom-15 right-8 w-[14%] h-full flex flex-col items-start justify-end leading-10 font-[bilifont]", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold whitespace-nowrap", style: {
159
+ backgroundImage: props.fanCard.gradientStyle,
160
+ WebkitTextFillColor: 'transparent',
161
+ backgroundClip: 'text',
162
+ WebkitBackgroundClip: 'text'
163
+ }, children: props.fanCard.numPrefix }), (0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold whitespace-nowrap font-bilifont", style: {
164
+ backgroundImage: props.fanCard.gradientStyle,
165
+ WebkitTextFillColor: 'transparent',
166
+ backgroundClip: 'text',
167
+ WebkitBackgroundClip: 'text'
168
+ }, children: props.fanCard.numDesc })] })] }) })), props.label_type === 1 && ((0, jsx_runtime_1.jsx)("div", { className: "inline-block px-5 py-0.5 rounded-[10px] text-[45px] bg-danger text-danger-foreground shrink-0 self-center select-text", children: "\u4F5C\u8005" })), props.status_label && ((0, jsx_runtime_1.jsx)("div", { className: "inline-block px-5 py-0.5 rounded-[10px] text-[45px] bg-surface-secondary text-foreground/70 shrink-0 self-center select-text", children: props.status_label }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "items-center whitespace-pre-wrap text-6xl tracking-[0.5px] leading-[1.6] text-foreground", children: [props.isTop && (0, jsx_runtime_1.jsx)(TopBadge, {}), renderBilibiliCommentRichText(props.message)] }), props.pictures && props.pictures.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "flex gap-5 my-5 w-[95%]", children: props.pictures.length === 1 ? (
169
+ // 只有一张图片时,完整显示
170
+ (0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden rounded-[25px] shadow-large w-full", children: (0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: props.pictures[0], alt: "\u8BC4\u8BBA\u56FE\u7247", className: "rounded-[25px] object-contain w-full h-full", placeholder: "\u8BC4\u8BBA\u56FE\u7247" }) })) : (
171
+ // 多张图片时,显示两张正方形缩略图
172
+ props.pictures.slice(0, 2).map((picUrl, idx) => ((0, jsx_runtime_1.jsxs)("div", { className: "relative overflow-hidden rounded-[25px] shadow-large flex-1 aspect-square", children: [(0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: picUrl, alt: `评论图片${idx + 1}`, className: "rounded-[25px] object-cover w-full h-full", placeholder: "\u8BC4\u8BBA\u56FE\u7247" }), idx === 1 && props.pictures.length > 2 && ((0, jsx_runtime_1.jsx)("div", { className: "absolute bottom-3 right-3", children: (0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center bg-black px-4 py-3 rounded-2xl opacity-80 backdrop-blur-sm", children: (0, jsx_runtime_1.jsxs)("span", { className: "text-white text-4xl font-bold leading-none", children: ["+ ", props.pictures.length - 2] }) }) }))] }, idx)))) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mt-[37.5px] whitespace-nowrap text-muted", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex flex-1 items-center", children: (0, jsx_runtime_1.jsxs)("div", { className: "text-[45px] tracking-[2px] select-text", children: [formatBilibiliCommentTime(props.ctime), " \u00B7 ", props.location, props.replylength > 0 ? ((0, jsx_runtime_1.jsxs)("span", { className: "text-muted tracking-[3px] ml-4", children: [props.replylength, "\u56DE\u590D"] })) : ((0, jsx_runtime_1.jsx)("span", { className: "ml-4 text-foreground/70", children: "\u56DE\u590D" }))] }) }), (0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-18.75 ml-auto", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3.75", children: [(0, jsx_runtime_1.jsx)(Icons_1.ThumbUpIcon, { variant: "line", className: "w-15 h-15 text-muted" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[45px] text-muted select-text", children: formatBilibiliLikeCount(props.like) })] }) })] }), props.replies && props.replies.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "mt-10", children: props.replies.map((subReply, index) => ((0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-start space-x-4", children: [(0, jsx_runtime_1.jsxs)("div", { className: "relative mr-[33.75px] shrink-0 w-40 h-40 flex items-center justify-center", children: [(0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: subReply.avatar || 'AVATAR_PLACEHOLDER', alt: "\u7528\u6237\u5934\u50CF", className: "rounded-full w-30 h-30 shadow-large", placeholder: "\u5934\u50CF", isCircular: true }), subReply.frame && ((0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: subReply.frame, alt: "\u5934\u50CF\u6846", className: "absolute inset-0 transform scale-90", placeholder: "\u5934\u50CF\u6846" })), subReply.vipstatus === 1 && ((0, jsx_runtime_1.jsx)("div", { className: "flex absolute right-4 bottom-5 z-20 justify-center items-center w-12 h-12 rounded-full bg-surface", children: (0, jsx_runtime_1.jsx)("img", { src: "/image/bilibili/res-local1.png", alt: "\u5927\u4F1A\u5458", className: "w-9 h-9" }) }))] }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-1", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-start gap-2.5 mb-3.75 text-[50px] relative overflow-visible", children: [(0, jsx_runtime_1.jsxs)("div", { className: "shrink-0 flex items-center gap-6 leading-[1.2] text-foreground/80 font-bold select-text", children: [renderBilibiliUserName(subReply.uname, subReply.unameColor, subReply.vipstatus), subReply.level !== undefined && subReply.level >= 0 && subReply.level <= 7 && ((0, jsx_runtime_1.jsx)("img", { src: `/image/bilibili/level/lv${subReply.level}.svg`, alt: `等级${subReply.level}`, className: "inline-block shrink-0 w-24 h-24 align-middle" })), subReply.isUP && ((0, jsx_runtime_1.jsx)("img", { src: "/image/bilibili/up_pb.svg", alt: "UP\u4E3B\u6807\u7B7E", className: "inline-block shrink-0 align-middle w-23 h-23" })), subReply.fansDetail && (0, jsx_runtime_1.jsx)(FansMedal, { detail: subReply.fansDetail })] }), subReply.fanCard && subReply.fanCard.image && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-10 right-0 h-45 z-10 pointer-events-none", children: (0, jsx_runtime_1.jsxs)("div", { className: "inline-block relative h-full", children: [(0, jsx_runtime_1.jsx)("img", { src: subReply.fanCard.image, alt: "\u7C89\u4E1D\u5361\u7247", className: "block object-contain w-auto h-full", referrerPolicy: "no-referrer", crossOrigin: "anonymous" }), (0, jsx_runtime_1.jsxs)("div", { className: "absolute bottom-15 right-8 w-[14%] h-full flex flex-col items-start justify-end leading-10 font-[bilifont]", children: [(0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold whitespace-nowrap", style: {
173
+ backgroundImage: subReply.fanCard.gradientStyle,
174
+ WebkitTextFillColor: 'transparent',
175
+ backgroundClip: 'text',
176
+ WebkitBackgroundClip: 'text'
177
+ }, children: subReply.fanCard.numPrefix }), (0, jsx_runtime_1.jsx)("span", { className: "text-4xl font-bold whitespace-nowrap", style: {
178
+ backgroundImage: subReply.fanCard.gradientStyle,
179
+ WebkitTextFillColor: 'transparent',
180
+ backgroundClip: 'text',
181
+ WebkitBackgroundClip: 'text'
182
+ }, children: subReply.fanCard.numDesc })] })] }) }))] }), (0, jsx_runtime_1.jsx)("div", { className: "text-[60px] tracking-[0.5px] leading-[1.6] text-foreground mb-5 select-text whitespace-pre-wrap", style: { wordBreak: 'break-word', overflowWrap: 'break-word' }, children: renderBilibiliCommentRichText(subReply.message) }), subReply.pictures && subReply.pictures.length > 0 && ((0, jsx_runtime_1.jsx)("div", { className: "flex gap-5 my-5 w-[95%]", children: subReply.pictures.length === 1 ? (
183
+ // 只有一张图片时,完整显示
184
+ (0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden rounded-[25px] shadow-large w-full", children: (0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: subReply.pictures[0], alt: "\u8BC4\u8BBA\u56FE\u7247", className: "rounded-[25px] object-contain w-full h-full", placeholder: "\u8BC4\u8BBA\u56FE\u7247" }) })) : (
185
+ // 多张图片时,显示两张正方形缩略图
186
+ subReply.pictures.slice(0, 2).map((picUrl, idx) => ((0, jsx_runtime_1.jsxs)("div", { className: "relative overflow-hidden rounded-[25px] shadow-large flex-1 aspect-square", children: [(0, jsx_runtime_1.jsx)(ImageWithSkeleton, { src: picUrl, alt: `评论图片${idx + 1}`, className: "rounded-[25px] object-cover w-full h-full", placeholder: "\u8BC4\u8BBA\u56FE\u7247" }), idx === 1 && subReply.pictures.length > 2 && ((0, jsx_runtime_1.jsx)("div", { className: "absolute bottom-10 right-10", children: (0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center px-8 py-6 rounded-[18px] shadow-xl", style: {
187
+ backgroundColor: 'rgba(0, 0, 0, 0.7)'
188
+ }, children: (0, jsx_runtime_1.jsxs)("span", { className: "text-white text-[60px] font-bold leading-none", children: ["+", subReply.pictures.length - 2] }) }) }))] }, idx)))) })), (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between mt-[37.5px] whitespace-nowrap text-muted", children: [(0, jsx_runtime_1.jsx)("div", { className: "flex flex-1 items-center", children: (0, jsx_runtime_1.jsxs)("div", { className: "text-[45px] tracking-[2px] select-text", children: [formatBilibiliCommentTime(subReply.ctime), " \u00B7 ", subReply.location] }) }), (0, jsx_runtime_1.jsx)("div", { className: "flex items-center gap-18.75 ml-auto", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center gap-3.75", children: [(0, jsx_runtime_1.jsx)(Icons_1.ThumbUpIcon, { variant: "line", className: "w-15 h-15 text-muted" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[45px] text-muted select-text", children: formatBilibiliLikeCount(subReply.like) })] }) })] })] })] }) }, index))) }))] })] }));
189
+ };
190
+ exports.BilibiliComment = react_1.default.memo((props) => {
191
+ return ((0, jsx_runtime_1.jsx)(DefaultLayout_1.DefaultLayout, { ...props, children: (0, jsx_runtime_1.jsxs)("div", { className: "p-5", children: [(0, jsx_runtime_1.jsx)("div", { className: "h-20" }), (0, jsx_runtime_1.jsx)(VideoInfoHeader, { ...props.data, useDarkTheme: (0, theme_1.isDark)(props.ctx) }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-hidden mt-8", children: props.data.CommentsData.length > 0 ? (props.data.CommentsData.map((comment, index) => ((0, jsx_runtime_1.jsx)(CommentItemComponent, { isLast: index === props.data.CommentsData.length - 1, ...comment }, index)))) : ((0, jsx_runtime_1.jsx)("div", { className: "flex justify-center items-center py-20 text-muted", children: (0, jsx_runtime_1.jsx)("div", { className: "text-center", children: (0, jsx_runtime_1.jsx)("p", { className: "text-xl", children: "\u6682\u65E0\u8BC4\u8BBA\u6570\u636E" }) }) })) })] }) }));
192
+ });
193
+ exports.default = exports.BilibiliComment;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const template_react_1 = require("../../../../compat/template-react.js");
4
+ const Comment_1 = require("./components/Comment");
5
+ exports.default = (0, template_react_1.defineTemplate)({
6
+ name: '评论列表',
7
+ description: 'B站视频稿件评论列表展示模板',
8
+ component: Comment_1.BilibiliComment,
9
+ validate: (data) => typeof data === 'object' && data !== null && typeof data.share_url === 'string'
10
+ });
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommentIcon = exports.DurationIcon = exports.ViewIcon = exports.CoinIcon = exports.PlayIcon = exports.ShareIcon = exports.StarIcon = exports.ThumbUpIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("../../../../compat/phosphor-icons.js");
6
+ /** B站官方点赞图标 */
7
+ const ThumbUpIcon = ({ className, size, variant = 'solid' }) => {
8
+ if (variant === 'line') {
9
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { d: "M9.283433333333333 2.0303066666666663C9.095466666666667 2.0083933333333333 8.921333333333333 2.09014 8.828166666666666 2.1991199999999997C8.424633333333333 2.6711333333333336 8.332133333333333 3.3649466666666665 8.029333333333334 3.9012466666666663C7.630633333333333 4.607453333333333 7.258833333333333 5.034486666666666 6.800866666666666 5.436006666666666C6.42382 5.7665733333333336 6.042199999999999 5.987959999999999 5.666666666666666 6.09112L5.666666666666666 13.1497C6.19062 13.1611 6.751966666666666 13.168333333333333 7.333333333333333 13.168333333333333C8.831233333333333 13.168333333333333 10.1019 13.120766666666665 10.958166666666665 13.076699999999999C11.565133333333332 13.045433333333332 12.091966666666666 12.7451 12.366466666666668 12.256733333333333C12.7516 11.571599999999998 13.2264 10.5669 13.514166666666664 9.3835C13.7823 8.2808 13.904599999999999 7.374333333333333 13.959466666666666 6.734999999999999C13.984933333333332 6.438646666666667 13.750433333333334 6.166686666666667 13.386666666666665 6.166686666666667L10.065133333333332 6.166686666666667C9.898433333333333 6.166686666666667 9.742666666666667 6.08362 9.649833333333333 5.945166666666666C9.536066666666667 5.775493333333333 9.560033333333333 5.5828533333333334 9.6312 5.403346666666666C9.783966666666666 5.013846666666666 9.983933333333333 4.432846666666666 10.062766666666667 3.90454C10.1406 3.3830066666666667 10.121599999999999 2.9639466666666667 9.917133333333332 2.57626C9.697399999999998 2.1596933333333332 9.448266666666665 2.0495266666666665 9.283433333333333 2.0303066666666663zM10.773433333333333 5.166686666666666L13.386666666666665 5.166686666666666C14.269133333333333 5.166686666666666 15.036999999999999 5.875273333333333 14.9558 6.8206C14.897 7.505533333333333 14.767199999999999 8.462733333333333 14.485833333333334 9.6198C14.170333333333334 10.917200000000001 13.6532 12.008466666666665 13.238166666666666 12.746766666666666C12.7729 13.574433333333333 11.910266666666667 14.029 11.009566666666666 14.075366666666667C10.14 14.120166666666666 8.851766666666666 14.168333333333333 7.333333333333333 14.168333333333333C5.862206666666666 14.168333333333333 4.51776 14.1231 3.565173333333333 14.079633333333334C2.4932333333333334 14.030733333333332 1.5939999999999999 13.234466666666666 1.4786599999999999 12.143466666666665C1.4028 11.426066666666665 1.3333333333333333 10.4978 1.3333333333333333 9.501666666666665C1.3333333333333333 8.588966666666666 1.3916466666666667 7.761233333333333 1.4598999999999998 7.104466666666667C1.5791666666666666 5.95696 2.5641 5.166686666666666 3.671693333333333 5.166686666666666L5.166666666666666 5.166686666666666C5.3793066666666665 5.166686666666666 5.709213333333333 5.063186666666667 6.141613333333333 4.68408C6.516733333333333 4.355193333333333 6.816366666666667 4.015666666666666 7.158533333333333 3.409613333333333C7.5023 2.8007333333333335 7.6041 2.0920066666666663 8.068066666666667 1.54932C8.372133333333332 1.1936466666666665 8.8718 0.9755333333333334 9.399233333333333 1.03704C9.949866666666665 1.10124 10.457733333333334 1.4577866666666666 10.801633333333331 2.109713333333333C11.148866666666665 2.767993333333333 11.143799999999999 3.4356599999999995 11.051833333333335 4.0520933333333335C10.993899999999998 4.44022 10.875366666666666 4.852359999999999 10.773433333333333 5.166686666666666zM4.666666666666666 13.122166666666667L4.666666666666666 6.166686666666667L3.671693333333333 6.166686666666667C3.029613333333333 6.166686666666667 2.5161533333333335 6.615046666666666 2.4545466666666664 7.207833333333333C2.3890599999999997 7.837933333333333 2.333333333333333 8.630433333333333 2.333333333333333 9.501666666666665C2.333333333333333 10.453433333333333 2.399833333333333 11.345266666666667 2.473113333333333 12.038333333333334C2.533993333333333 12.614133333333331 3.0083466666666667 13.053199999999999 3.6107466666666665 13.0807C3.9228066666666668 13.094899999999999 4.278173333333333 13.109333333333334 4.666666666666666 13.122166666666667z" }) }));
10
+ }
11
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 36 36", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M9.77234 30.8573V11.7471H7.54573C5.50932 11.7471 3.85742 13.3931 3.85742 15.425V27.1794C3.85742 29.2112 5.50932 30.8573 7.54573 30.8573H9.77234ZM11.9902 30.8573V11.7054C14.9897 10.627 16.6942 7.8853 17.1055 3.33591C17.2666 1.55463 18.9633 0.814421 20.5803 1.59505C22.1847 2.36964 23.243 4.32583 23.243 6.93947C23.243 8.50265 23.0478 10.1054 22.6582 11.7471H29.7324C31.7739 11.7471 33.4289 13.402 33.4289 15.4435C33.4289 15.7416 33.3928 16.0386 33.3215 16.328L30.9883 25.7957C30.2558 28.7683 27.5894 30.8573 24.528 30.8573H11.9911H11.9902Z" }) }));
12
+ };
13
+ exports.ThumbUpIcon = ThumbUpIcon;
14
+ /** B站官方收藏图标 */
15
+ const StarIcon = ({ className, size, variant = 'solid' }) => {
16
+ if (variant === 'line') {
17
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 28 28", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinejoin: "round", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { d: "M19.8071 9.26152C18.7438 9.09915 17.7624 8.36846 17.3534 7.39421L15.4723 3.4972C14.8998 2.1982 13.1004 2.1982 12.4461 3.4972L10.6468 7.39421C10.1561 8.36846 9.25639 9.09915 8.19315 9.26152L3.94016 9.91102C2.63155 10.0734 2.05904 11.6972 3.04049 12.6714L6.23023 15.9189C6.96632 16.6496 7.29348 17.705 7.1299 18.7605L6.39381 23.307C6.14844 24.6872 7.62063 25.6614 8.84745 25.0119L12.4461 23.0634C13.4276 22.4951 14.6544 22.4951 15.6359 23.0634L19.2345 25.0119C20.4614 25.6614 21.8518 24.6872 21.6882 23.307L20.8703 18.7605C20.7051 17.705 21.0339 16.6496 21.77 15.9189L24.9597 12.6714C25.9412 11.6972 25.3687 10.0734 24.06 9.91102L19.8071 9.26152Z" }) }));
18
+ }
19
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 28 28", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M19.8071 9.26152C18.7438 9.09915 17.7624 8.36846 17.3534 7.39421L15.4723 3.4972C14.8998 2.1982 13.1004 2.1982 12.4461 3.4972L10.6468 7.39421C10.1561 8.36846 9.25639 9.09915 8.19315 9.26152L3.94016 9.91102C2.63155 10.0734 2.05904 11.6972 3.04049 12.6714L6.23023 15.9189C6.96632 16.6496 7.29348 17.705 7.1299 18.7605L6.39381 23.307C6.14844 24.6872 7.62063 25.6614 8.84745 25.0119L12.4461 23.0634C13.4276 22.4951 14.6544 22.4951 15.6359 23.0634L19.2345 25.0119C20.4614 25.6614 21.8518 24.6872 21.6882 23.307L20.8703 18.7605C20.7051 17.705 21.0339 16.6496 21.77 15.9189L24.9597 12.6714C25.9412 11.6972 25.3687 10.0734 24.06 9.91102L19.8071 9.26152Z" }) }));
20
+ };
21
+ exports.StarIcon = StarIcon;
22
+ /** B站官方分享图标 */
23
+ const ShareIcon = ({ className, size, variant = 'solid' }) => {
24
+ if (variant === 'line') {
25
+ return ((0, jsx_runtime_1.jsxs)("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", className: className, style: { width: size, height: size }, children: [(0, jsx_runtime_1.jsx)("path", { d: "M11.7148 3.3904L12.1883 2.80873V2.80873L11.7148 3.3904ZM10.0835 7.11906L10.1675 7.86434C10.5469 7.82159 10.8335 7.50077 10.8335 7.11906H10.0835ZM2.40872 16.249L1.66281 16.1708L2.40872 16.249ZM3.41451 16.5323L2.78976 16.1174H2.78976L3.41451 16.5323ZM10.0835 12.9746H10.8335C10.8335 12.5859 10.5366 12.2616 10.1494 12.2275L10.0835 12.9746ZM11.7148 16.7765L11.2414 16.1948L11.7148 16.7765ZM18.5084 11.2469L18.035 10.6652H18.035L18.5084 11.2469ZM18.5085 8.92019L18.9819 8.33852L18.5085 8.92019ZM10.8335 4.16596C10.8335 3.95534 11.078 3.83911 11.2414 3.97206L12.1883 2.80873C11.0449 1.87805 9.33354 2.69168 9.33354 4.16596H10.8335ZM10.8335 7.11906V4.16596H9.33354V7.11906H10.8335ZM3.15463 16.3272C3.51573 12.883 4.69455 10.8613 6.01872 9.66171C7.35327 8.45275 8.91679 8.00533 10.1675 7.86434L9.99953 6.37378C8.54838 6.53736 6.65086 7.06509 5.01166 8.55003C3.36208 10.0444 2.05444 12.4353 1.66281 16.1708L3.15463 16.3272ZM2.78976 16.1174C2.84989 16.0268 2.94169 16.0279 2.97464 16.0369C2.99716 16.043 3.04471 16.0623 3.0897 16.1195C3.14262 16.1869 3.16079 16.2684 3.15463 16.3272L1.66281 16.1708C1.58766 16.8875 2.09197 17.3518 2.58225 17.4846C3.05748 17.6134 3.68033 17.4877 4.03925 16.9473L2.78976 16.1174ZM10.1494 12.2275C8.06107 12.0433 5.11428 12.6176 2.78976 16.1174L4.03925 16.9473C6.01112 13.9785 8.38309 13.5775 10.0177 13.7217L10.1494 12.2275ZM10.8335 16.0009V12.9746H9.33354V16.0009H10.8335ZM11.2414 16.1948C11.078 16.3278 10.8335 16.2116 10.8335 16.0009H9.33354C9.33354 17.4752 11.0449 18.2888 12.1883 17.3582L11.2414 16.1948ZM18.035 10.6652L11.2414 16.1948L12.1883 17.3582L18.9819 11.8285L18.035 10.6652ZM18.035 9.50185C18.4037 9.80199 18.4037 10.3651 18.035 10.6652L18.9819 11.8285C20.0881 10.9282 20.0881 9.23891 18.9819 8.33852L18.035 9.50185ZM11.2414 3.97206L18.035 9.50185L18.9819 8.33852L12.1883 2.80873L11.2414 3.97206Z", fill: "currentColor" }), (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M12.0126 2.74638C10.9645 1.89326 9.39575 2.63908 9.39575 3.9905V6.52347C8.04285 6.7607 6.42622 7.33445 5.01037 8.63537C3.36503 10.1472 2.06603 12.5719 1.70486 16.3755C1.64281 17.029 2.10319 17.4525 2.5535 17.5729C2.99132 17.6899 3.56409 17.5696 3.88706 17.0656C4.90489 15.4772 6.02606 14.6008 7.07814 14.1323C7.88831 13.7715 8.68279 13.6415 9.39575 13.6345V16.176C9.39575 17.5275 10.9645 18.2733 12.0126 17.4202L19.0613 11.683C20.0753 10.8576 20.0753 9.30912 19.0613 8.48377L12.0126 2.74638ZM10.7707 3.9905C10.7707 3.79744 10.9949 3.6909 11.1446 3.81277L18.1933 9.55016C18.5313 9.82528 18.5313 10.3414 18.1933 10.6166L11.1446 16.3538C10.9949 16.4756 10.7707 16.3691 10.7707 16.176V12.9744C10.7707 12.6181 10.4986 12.3209 10.1436 12.2896C9.10884 12.1983 7.8347 12.2902 6.51878 12.8763C5.36413 13.3904 4.20995 14.2707 3.17068 15.6812C3.60099 12.6381 4.70283 10.7852 5.94069 9.64786C7.29583 8.40271 8.89001 7.94525 10.1603 7.80206C10.508 7.76287 10.7707 7.46879 10.7707 7.11889V3.9905Z", fill: "currentColor" })] }));
26
+ }
27
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 28 28", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { d: "M12.6058 10.3326V5.44359C12.6058 4.64632 13.2718 4 14.0934 4C14.4423 4 14.78 4.11895 15.0476 4.33606L25.3847 12.7221C26.112 13.3121 26.2087 14.3626 25.6007 15.0684C25.5352 15.1443 25.463 15.2144 25.3847 15.2779L15.0476 23.6639C14.4173 24.1753 13.4791 24.094 12.9521 23.4823C12.7283 23.2226 12.6058 22.8949 12.6058 22.5564V18.053C7.59502 18.053 5.37116 19.9116 2.57197 23.5251C2.47607 23.6489 2.00031 23.7769 2.00031 23.2122C2.00031 16.2165 3.90102 10.3326 12.6058 10.3326Z" }) }));
28
+ };
29
+ exports.ShareIcon = ShareIcon;
30
+ /** B站官方播放量图标 */
31
+ const PlayIcon = ({ className, size, variant = 'solid' }) => {
32
+ if (variant === 'line') {
33
+ return ((0, jsx_runtime_1.jsxs)("svg", { viewBox: "0 0 20 20", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "none", stroke: "currentColor", strokeWidth: "1.2", strokeLinejoin: "round", strokeLinecap: "round", width: size, height: size, children: [(0, jsx_runtime_1.jsx)("circle", { cx: "10", cy: "10", r: "6.4" }), (0, jsx_runtime_1.jsx)("path", { d: "M12.23 9.2L9.58 12.34L8.19 8.47Z" })] }));
34
+ }
35
+ return ((0, jsx_runtime_1.jsxs)("svg", { viewBox: "0 0 20 20", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: [(0, jsx_runtime_1.jsx)("path", { d: "M10 4.040041666666666C7.897383333333334 4.040041666666666 6.061606666666667 4.147 4.765636666666667 4.252088333333334C3.806826666666667 4.32984 3.061106666666667 5.0637316666666665 2.9755000000000003 6.015921666666667C2.8803183333333333 7.074671666666667 2.791666666666667 8.471183333333332 2.791666666666667 9.998333333333333C2.791666666666667 11.525566666666668 2.8803183333333333 12.922083333333333 2.9755000000000003 13.9808C3.061106666666667 14.932983333333334 3.806826666666667 15.666916666666667 4.765636666666667 15.744683333333336C6.061611666666668 15.849716666666666 7.897383333333334 15.956666666666667 10 15.956666666666667C12.10285 15.956666666666667 13.93871666666667 15.849716666666666 15.234766666666667 15.74461666666667C16.193416666666668 15.66685 16.939000000000004 14.933216666666667 17.024583333333336 13.981216666666668C17.11975 12.922916666666667 17.208333333333332 11.526666666666666 17.208333333333332 9.998333333333333C17.208333333333332 8.470083333333333 17.11975 7.073818333333334 17.024583333333336 6.015513333333334C16.939000000000004 5.063538333333333 16.193416666666668 4.329865000000001 15.234766666666667 4.252118333333334C13.93871666666667 4.147016666666667 12.10285 4.040041666666666 10 4.040041666666666zM4.684808333333334 3.255365C6.001155 3.14862 7.864583333333334 3.0400416666666668 10 3.0400416666666668C12.13565 3.0400416666666668 13.999199999999998 3.148636666666667 15.315566666666667 3.2553900000000002C16.753416666666666 3.3720016666666672 17.890833333333333 4.483195 18.020583333333335 5.925965000000001C18.11766666666667 7.005906666666667 18.208333333333336 8.433 18.208333333333336 9.998333333333333C18.208333333333336 11.56375 18.11766666666667 12.990833333333335 18.020583333333335 14.0708C17.890833333333333 15.513533333333331 16.753416666666666 16.624733333333335 15.315566666666667 16.74138333333333C13.999199999999998 16.848116666666666 12.13565 16.95666666666667 10 16.95666666666667C7.864583333333334 16.95666666666667 6.001155 16.848116666666666 4.684808333333334 16.7414C3.2467266666666665 16.624750000000002 2.1092383333333338 15.513266666666667 1.9795200000000002 14.070383333333334C1.8823900000000002 12.990000000000002 1.7916666666666667 11.562683333333334 1.7916666666666667 9.998333333333333C1.7916666666666667 8.434066666666666 1.8823900000000002 7.00672 1.9795200000000002 5.926381666666667C2.1092383333333338 4.483463333333334 3.2467266666666665 3.371976666666667 4.684808333333334 3.255365z" }), (0, jsx_runtime_1.jsx)("path", { d: "M12.23275 9.1962C12.851516666666667 9.553483333333332 12.851516666666667 10.44665 12.232683333333332 10.803866666666666L9.57975 12.335600000000001C8.960983333333335 12.692816666666667 8.1875 12.246250000000002 8.187503333333334 11.531733333333333L8.187503333333334 8.4684C8.187503333333334 7.753871666666667 8.960983333333335 7.307296666666667 9.57975 7.66456L12.23275 9.1962z" })] }));
36
+ };
37
+ exports.PlayIcon = PlayIcon;
38
+ /** B站官方投币图标 */
39
+ const CoinIcon = ({ className, size, variant = 'solid' }) => {
40
+ if (variant === 'line') {
41
+ return ((0, jsx_runtime_1.jsxs)("svg", { viewBox: "0 0 28 28", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinejoin: "round", strokeLinecap: "round", width: size, height: size, children: [(0, jsx_runtime_1.jsx)("circle", { cx: "14", cy: "14", r: "11" }), (0, jsx_runtime_1.jsx)("path", { d: "M10 7H18V9H15V21H13V9H10V7Z" })] }));
42
+ }
43
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 28 28", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M14.045 25.5454C7.69377 25.5454 2.54504 20.3967 2.54504 14.0454C2.54504 7.69413 7.69377 2.54541 14.045 2.54541C20.3963 2.54541 25.545 7.69413 25.545 14.0454C25.545 17.0954 24.3334 20.0205 22.1768 22.1771C20.0201 24.3338 17.095 25.5454 14.045 25.5454ZM9.66202 6.81624H18.2761C18.825 6.81624 19.27 7.22183 19.27 7.72216C19.27 8.22248 18.825 8.62807 18.2761 8.62807H14.95V10.2903C17.989 10.4444 20.3766 12.9487 20.3855 15.9916V17.1995C20.3854 17.6997 19.9799 18.1052 19.4796 18.1052C18.9793 18.1052 18.5738 17.6997 18.5737 17.1995V15.9916C18.5667 13.9478 16.9882 12.2535 14.95 12.1022V20.5574C14.95 21.0577 14.5444 21.4633 14.0441 21.4633C13.5437 21.4633 13.1382 21.0577 13.1382 20.5574V12.1022C11.1 12.2535 9.52148 13.9478 9.51448 15.9916V17.1995C9.5144 17.6997 9.10883 18.1052 8.60856 18.1052C8.1083 18.1052 7.70273 17.6997 7.70265 17.1995V15.9916C7.71158 12.9487 10.0992 10.4444 13.1382 10.2903V8.62807H9.66202C9.11309 8.62807 8.66809 8.22248 8.66809 7.72216C8.66809 7.22183 9.11309 6.81624 9.66202 6.81624Z" }) }));
44
+ };
45
+ exports.CoinIcon = CoinIcon;
46
+ /** B站官方浏览图标 */
47
+ const ViewIcon = ({ className, size, variant = 'solid' }) => {
48
+ if (variant === 'line') {
49
+ return ((0, jsx_runtime_1.jsxs)("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: [(0, jsx_runtime_1.jsx)("path", { d: "M8 3.3320333333333334C6.321186666666667 3.3320333333333334 4.855333333333333 3.4174399999999996 3.820593333333333 3.5013466666666666C3.1014733333333333 3.5596599999999996 2.5440733333333334 4.109013333333333 2.48 4.821693333333333C2.4040466666666664 5.666533333333334 2.333333333333333 6.780666666666666 2.333333333333333 7.998666666666666C2.333333333333333 9.216733333333334 2.4040466666666664 10.330866666666665 2.48 11.175699999999999C2.5440733333333334 11.888366666666666 3.1014733333333333 12.437733333333334 3.820593333333333 12.496066666666666C4.855333333333333 12.579933333333333 6.321186666666667 12.665333333333333 8 12.665333333333333C9.678999999999998 12.665333333333333 11.144933333333334 12.579933333333333 12.179733333333333 12.496033333333333C12.898733333333332 12.4377 13.456 11.888533333333331 13.520066666666667 11.176033333333333C13.595999999999998 10.331533333333333 13.666666666666666 9.217633333333332 13.666666666666666 7.998666666666666C13.666666666666666 6.779766666666667 13.595999999999998 5.665846666666667 13.520066666666667 4.821366666666666C13.456 4.108866666666666 12.898733333333332 3.55968 12.179733333333333 3.5013666666666663C11.144933333333334 3.417453333333333 9.678999999999998 3.3320333333333334 8 3.3320333333333334zM3.7397666666666667 2.50462C4.794879999999999 2.41906 6.288386666666666 2.3320333333333334 8 2.3320333333333334C9.7118 2.3320333333333334 11.2054 2.4190733333333334 12.260533333333331 2.5046399999999998C13.458733333333331 2.6018133333333333 14.407866666666665 3.5285199999999994 14.516066666666667 4.73182C14.593933333333332 5.597933333333334 14.666666666666666 6.7427 14.666666666666666 7.998666666666666C14.666666666666666 9.2547 14.593933333333332 10.399466666666665 14.516066666666667 11.2656C14.407866666666665 12.468866666666665 13.458733333333331 13.395566666666667 12.260533333333331 13.492766666666665C11.2054 13.578333333333333 9.7118 13.665333333333333 8 13.665333333333333C6.288386666666666 13.665333333333333 4.794879999999999 13.578333333333333 3.7397666666666667 13.492799999999999C2.541373333333333 13.395599999999998 1.5922066666666668 12.468633333333333 1.4840200000000001 11.265266666666665C1.4061199999999998 10.3988 1.3333333333333333 9.253866666666667 1.3333333333333333 7.998666666666666C1.3333333333333333 6.743533333333333 1.4061199999999998 5.598579999999999 1.4840200000000001 4.732153333333333C1.5922066666666668 3.5287466666666667 2.541373333333333 2.601793333333333 3.7397666666666667 2.50462z" }), (0, jsx_runtime_1.jsx)("path", { d: "M9.8092 7.3125C10.338433333333333 7.618066666666666 10.338433333333333 8.382 9.809166666666666 8.687533333333333L7.690799999999999 9.910599999999999C7.161566666666666 10.216133333333332 6.5 9.8342 6.500006666666666 9.223066666666666L6.500006666666666 6.776999999999999C6.500006666666666 6.165873333333334 7.161566666666666 5.783913333333333 7.690799999999999 6.089479999999999L9.8092 7.3125z" })] }));
50
+ }
51
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 16 16", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", fillRule: "evenodd", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { d: "M3.7397666666666667 2.50462C4.794879999999999 2.41906 6.288386666666666 2.3320333333333334 8 2.3320333333333334C9.7118 2.3320333333333334 11.2054 2.4190733333333334 12.260533333333331 2.5046399999999998C13.458733333333331 2.6018133333333333 14.407866666666665 3.5285199999999994 14.516066666666667 4.73182C14.593933333333332 5.597933333333334 14.666666666666666 6.7427 14.666666666666666 7.998666666666666C14.666666666666666 9.2547 14.593933333333332 10.399466666666665 14.516066666666667 11.2656C14.407866666666665 12.468866666666665 13.458733333333331 13.395566666666667 12.260533333333331 13.492766666666665C11.2054 13.578333333333333 9.7118 13.665333333333333 8 13.665333333333333C6.288386666666666 13.665333333333333 4.794879999999999 13.578333333333333 3.7397666666666667 13.492799999999999C2.541373333333333 13.395599999999998 1.5922066666666668 12.468633333333333 1.4840200000000001 11.265266666666665C1.4061199999999998 10.3988 1.3333333333333333 9.253866666666667 1.3333333333333333 7.998666666666666C1.3333333333333333 6.743533333333333 1.4061199999999998 5.598579999999999 1.4840200000000001 4.732153333333333C1.5922066666666668 3.5287466666666667 2.541373333333333 2.601793333333333 3.7397666666666667 2.50462z M9.8092 7.3125L7.6908 6.0895C7.1616 5.7839 6.5 6.1659 6.5 6.777L6.5 9.2231C6.5 9.8342 7.1616 10.2161 7.6908 9.9106L9.8092 8.6875C10.3384 8.382 10.3384 7.6181 9.8092 7.3125z" }) }));
52
+ };
53
+ exports.ViewIcon = ViewIcon;
54
+ /** 视频时长图标(Phosphor Icons) */
55
+ const DurationIcon = ({ className, size, variant = 'solid' }) => {
56
+ return (0, jsx_runtime_1.jsx)(react_1.ClockIcon, { weight: variant === 'line' ? 'regular' : 'fill', className: className, size: size });
57
+ };
58
+ exports.DurationIcon = DurationIcon;
59
+ /** B站官方评论图标 */
60
+ const CommentIcon = ({ className, size, variant = 'solid' }) => {
61
+ if (variant === 'line') {
62
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 18 18", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M1.5625 7.875C1.5625 4.59581 4.22081 1.9375 7.5 1.9375H10.5C13.7792 1.9375 16.4375 4.59581 16.4375 7.875C16.4375 11.0504 13.9447 13.6435 10.8093 13.8041C10.097 14.723 8.92088 15.8807 7.2671 16.3313C6.97351 16.4113 6.70476 16.2862 6.55411 16.0923C6.40789 15.9041 6.3561 15.63435 6.46524 15.383C6.72879 14.77625 6.77646 14.22103 6.73402 13.7618C3.81677 13.3871 1.5625 10.8945 1.5625 7.875ZM7.5 2.9375C4.77309 2.9375 2.5625 5.14809 2.5625 7.875C2.5625 10.5026 4.61524 12.6511 7.20419 12.8038C7.43059 12.8172 7.61962 12.9812 7.66472 13.2035C7.77257 13.7346 7.8012 14.4054 7.58843 15.1484C8.74832 14.6682 9.606 13.7598 10.1513 13.0165C10.2444 12.8895 10.3921 12.8138 10.5496 12.8123C13.2536 12.7857 15.4375 10.58535 15.4375 7.875C15.4375 5.14809 13.2269 2.9375 10.5 2.9375H7.5Z" }) }));
63
+ }
64
+ return ((0, jsx_runtime_1.jsx)("svg", { viewBox: "0 0 18 18", xmlns: "http://www.w3.org/2000/svg", className: className, fill: "currentColor", width: size, height: size, children: (0, jsx_runtime_1.jsx)("path", { d: "M1.5625 7.875C1.5625 4.59581 4.22081 1.9375 7.5 1.9375H10.5C13.7792 1.9375 16.4375 4.59581 16.4375 7.875C16.4375 11.0504 13.9447 13.6435 10.8093 13.8041C10.097 14.723 8.92088 15.8807 7.2671 16.3313C6.97351 16.4113 6.70476 16.2862 6.55411 16.0923C6.40789 15.9041 6.3561 15.63435 6.46524 15.383C6.72879 14.77625 6.77646 14.22103 6.73402 13.7618C3.81677 13.3871 1.5625 10.8945 1.5625 7.875Z" }) }));
65
+ };
66
+ exports.CommentIcon = CommentIcon;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DecorationCard = exports.EnhancedImage = exports.CommentText = exports.processCommentHTML = exports.UsernameDisplay = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const cn_1 = require("../../../utils/cn");
7
+ /**
8
+ * 用户名渲染组件
9
+ * 根据 VIP 状态和颜色信息渲染用户名
10
+ */
11
+ const UsernameDisplay = ({ metadata, className, style }) => {
12
+ const vipColor = metadata.vipStatus === 1 ? (metadata.nicknameColor ?? '#FB7299') : null;
13
+ return ((0, jsx_runtime_1.jsx)("span", { className: (0, cn_1.cn)(!vipColor && 'text-foreground', 'font-bold', className), style: { ...style, ...(vipColor ? { color: vipColor } : {}) }, children: metadata.name }));
14
+ };
15
+ exports.UsernameDisplay = UsernameDisplay;
16
+ /**
17
+ * 处理评论文本中的图片防盗链问题
18
+ * @param htmlContent HTML内容
19
+ * @returns 处理后的HTML内容
20
+ */
21
+ const processCommentHTML = (htmlContent) => {
22
+ if (!htmlContent || typeof htmlContent !== 'string') {
23
+ return '';
24
+ }
25
+ let processed = htmlContent;
26
+ // 使用正则表达式匹配所有img标签并添加防盗链属性
27
+ processed = processed.replace(/<img([^>]*?)>/gi, '<img$1 referrerpolicy="no-referrer" crossorigin="anonymous">');
28
+ // 替换不可见的分隔符字符 ¨ (U+00A8) 为更明显的点 • (U+2022)
29
+ // · • ● -
30
+ processed = processed.replace(/¨/g, '•');
31
+ return processed;
32
+ };
33
+ exports.processCommentHTML = processCommentHTML;
34
+ /**
35
+ * 评论文本组件
36
+ * @param props 组件属性
37
+ * @returns JSX元素
38
+ */
39
+ const CommentText = ({ content, className, style }) => {
40
+ const processedContent = (0, exports.processCommentHTML)(content);
41
+ return (0, jsx_runtime_1.jsx)("div", { className: className, style: style, dangerouslySetInnerHTML: { __html: processedContent } });
42
+ };
43
+ exports.CommentText = CommentText;
44
+ /**
45
+ * 增强型图片组件
46
+ * 主要功能:
47
+ * 1. 图片加载失败时显示占位符
48
+ * 2. 支持圆形和方形两种样式
49
+ * 3. 自动处理防盗链(添加referrerPolicy和crossOrigin属性)
50
+ */
51
+ const EnhancedImage = ({ src, alt, className = '', placeholder, isCircular = false }) => {
52
+ const [hasError, setHasError] = (0, react_1.useState)(false);
53
+ /**
54
+ * 处理图片加载失败
55
+ */
56
+ const handleError = () => {
57
+ setHasError(true);
58
+ };
59
+ if (!src || hasError) {
60
+ return ((0, jsx_runtime_1.jsx)("div", { className: `${className} ${isCircular ? 'rounded-full' : 'rounded-md'} bg-surface-secondary flex items-center justify-center`, children: (0, jsx_runtime_1.jsx)("span", { className: "text-sm text-muted", children: placeholder || alt }) }));
61
+ }
62
+ return (0, jsx_runtime_1.jsx)("img", { src: src, alt: alt, className: className, onError: handleError, referrerPolicy: "no-referrer", crossOrigin: "anonymous" });
63
+ };
64
+ exports.EnhancedImage = EnhancedImage;
65
+ /**
66
+ * 代理图片 URL,绕过 B 站防盗链
67
+ */
68
+ const proxyImageUrl = (url) => {
69
+ return `https://images.weserv.nl/?url=${encodeURIComponent(url)}`;
70
+ };
71
+ /**
72
+ * 装饰卡片组件
73
+ * 接收 JSON 数据并用 React 元素渲染
74
+ */
75
+ const DecorationCard = ({ data }) => {
76
+ if (!data)
77
+ return null;
78
+ const gradientStyle = data.colors.length > 0 ? `linear-gradient(135deg, ${data.colors.join(', ')} 0%, ${data.colors.join(', ')} 100%)` : undefined;
79
+ return ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-end font-[bilifont]", style: {
80
+ width: '500px',
81
+ height: '150px',
82
+ backgroundPosition: 'center',
83
+ backgroundRepeat: 'no-repeat',
84
+ backgroundSize: 'contain',
85
+ backgroundImage: `url('${proxyImageUrl(data.card_url)}')`
86
+ }, children: gradientStyle && data.text && ((0, jsx_runtime_1.jsx)("span", { className: "mr-40 text-3xl", style: {
87
+ color: 'transparent',
88
+ backgroundClip: 'text',
89
+ WebkitBackgroundClip: 'text',
90
+ backgroundImage: gradientStyle
91
+ }, children: data.text })) }));
92
+ };
93
+ exports.DecorationCard = DecorationCard;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });