karin-plugin-kkk 2.30.3 → 2.31.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.
@@ -1,5 +1,5 @@
1
1
  import { i as __toESM } from "./rolldown-runtime.js";
2
- import { $ as zhCN, $t as Hash, A as n, An as Button, At as Save, B as RiPieChart2Fill, Bn as Chalk, Bt as Palette, C as BiImage, Cn as Camera, Ct as ShoppingBag, D as AiOutlineVideoCamera, Dn as Bookmark, Dt as Settings2, E as AiFillStar, En as Bot, Et as Share2, F as RiHeart3Fill, Fn as require_png, Ft as QrCode, G as RiTiktokFill, Gt as Menu, H as RiStarFill, Hn as zod_default, Ht as Moon, I as RiHeart3Line, In as require_jsQR, It as Puzzle, J as RiVerifiedBadgeFill, Jt as LoaderCircle, K as RiTrophyFill, Kt as Maximize, L as RiHeartLine, Ln as require_jpeg_js, Lt as Plus, M as RiArrowRightFill, Mn as require_jsx_runtime, Mt as RefreshCw, N as RiGroupLine, Nn as require_server_node, Nt as Radio, O as m, On as BellRing, Ot as Search, P as RiHashtag, Pn as require_react, Pt as Quote, Q as SiAnthropic, Qt as Heart, R as RiLiveLine, Rn as require_heic_decode, Rt as Play, S as FaUserGroup, Sn as ChartColumn, St as Smartphone, T as AiFillPushpin, Tn as Box, Tt as ShieldCheck, U as RiStarLine, Ut as Monitor, V as RiShareForwardFill, Vn as Xhshow, Vt as Music, W as RiThumbUpFill, Wt as MessageCircle, X as SiGithub, Xt as Info, Y as RiVideoLine, Yt as LayoutTemplate, Z as SiBilibili, Zt as Image$1, _ as MdLocationOn, _n as CircleEllipsis, _t as Sun, a as purify, an as Eye, at as Zap, b as FaMusic, bn as CircleAlert, bt as SquarePen, c as VictoryLine, cn as Download, ct as Video, d as VictoryLabel, dn as CornerDownLeft, dt as User, en as GitBranch, et as parse, f as VictoryTheme, fn as Copy, ft as UserPlus, g as MdLightbulbOutline, gn as CircleFadingArrowUp, gt as Terminal, h as MdInfoOutline, hn as CircleQuestionMark, ht as Trash2, i as Window, in as FilePlay, it as differenceInSeconds, j as Markdown, jn as clsx, jt as RotateCcw, k as a, kn as Chip, kt as ScanLine, l as VictoryChart, ln as Crown, lt as Users, m as MdFitScreen, mn as Clock, mt as TriangleAlert, n as require_lib, nn as Gamepad2, nt as formatDistanceToNow, o as VictoryScatter, on as EyeOff, ot as X, p as rehypeHighlight, pn as Code, pt as Upload, q as RiUserFollowLine, qt as MapPin, r as require_qr_code_styling, rn as FileText, rt as format, s as VictoryPie, sn as ExternalLink, st as WandSparkles, t as createProxyMiddleware, tn as Gift, tt as fromUnixTime, u as VictoryAxis, un as Cpu, ut as UsersRound, v as MdSchedule, vn as CircleCheckBig, vt as Star, w as AiFillHeart, wn as Calendar, wt as Shield, x as FaTiktok, xn as Check, xt as Sparkles, y as FaCommentDots, yn as CircleCheck, yt as Square, z as RiMessage3Fill, zn as require_protobufjs, zt as Pencil } from "./vendor.js";
2
+ import { $ as SiOppo, $n as zod_default, $t as MessageCircle, A as n, An as CircleAlert, At as Sparkles, B as RiPieChart2Fill, Bn as Chip, Bt as RotateCcw, C as BiImage, Cn as Clock, Ct as TriangleAlert, D as AiOutlineVideoCamera, Dn as CircleEllipsis, Dt as Star, E as AiFillStar, En as CircleFadingArrowUp, Et as Sun, F as RiHeart3Fill, Fn as Box, Ft as Share2, G as RiTiktokFill, Gn as require_react, Gt as Puzzle, H as RiStarFill, Hn as clsx, Ht as Radio, I as RiHeart3Line, In as Bot, It as Settings2, J as RiVerifiedBadgeFill, Jn as require_jpeg_js, Jt as Pencil, K as RiTrophyFill, Kn as require_png, Kt as Plus, L as RiHeartLine, Ln as Bookmark, Lt as Search, M as RiArrowRightFill, Mn as ChartColumn, Mt as ShoppingBag, N as RiGroupLine, Nn as Camera, Nt as Shield, O as m, On as CircleCheck, Ot as Square, P as RiHashtag, Pn as Calendar, Pt as ShieldCheck, Q as SiSamsung, Qn as Xhshow, Qt as Monitor, R as RiLiveLine, Rn as BellRing, Rt as ScanLine, S as FaUserGroup, Sn as Code, St as Upload, T as AiFillPushpin, Tn as CircleQuestionMark, Tt as Terminal, U as RiStarLine, Un as require_jsx_runtime, Ut as Quote, V as RiShareForwardFill, Vn as Button, Vt as RefreshCw, W as RiThumbUpFill, Wn as require_server_node, Wt as QrCode, X as SiXiaomi, Xn as require_protobufjs, Xt as Music, Y as RiVideoLine, Yn as require_heic_decode, Yt as Palette, Z as SiVivo, Zn as Chalk, Zt as Moon, _ as MdLocationOn, _n as Download, _t as Video, a as purify, an as Info, at as SiBilibili, b as FaMusic, bn as CornerDownLeft, bt as User, c as VictoryLine, cn as Hash, ct as zhCN, d as VictoryLabel, dn as Gamepad2, dt as formatDistanceToNow, en as Menu, et as SiOneplus, f as VictoryTheme, fn as FileText, ft as format, g as MdLightbulbOutline, gn as ExternalLink, gt as WandSparkles, h as MdInfoOutline, hn as EyeOff, ht as X, i as Window, in as LayoutTemplate, it as SiGithub, j as Markdown, jn as Check, jt as Smartphone, k as a, kn as CircleCheckBig, kt as SquarePen, l as VictoryChart, ln as GitBranch, lt as parse, m as MdFitScreen, mn as Eye, mt as Zap, n as require_lib, nn as MapPin, nt as SiHonor, o as VictoryScatter, on as Image$1, ot as SiApple, p as rehypeHighlight, pn as FilePlay, pt as differenceInSeconds, q as RiUserFollowLine, qn as require_jsQR, qt as Play, r as require_qr_code_styling, rn as LoaderCircle, rt as SiGooglephotos, s as VictoryPie, sn as Heart, st as SiAnthropic, t as createProxyMiddleware, tn as Maximize, tt as SiHuawei, u as VictoryAxis, un as Gift, ut as fromUnixTime, v as MdSchedule, vn as Crown, vt as Users, w as AiFillHeart, wn as Clapperboard, wt as Trash2, x as FaTiktok, xn as Copy, xt as UserPlus, y as FaCommentDots, yn as Cpu, yt as UsersRound, z as RiMessage3Fill, zn as ArrowDownToLine, zt as Save } from "./vendor.js";
3
3
  import "node:module";
4
4
  import fs from "node:fs";
5
5
  import path, { resolve } from "node:path";
@@ -18,7 +18,7 @@ import util from "node:util";
18
18
  import { Transform } from "node:stream";
19
19
  import { pipeline } from "node:stream/promises";
20
20
  import { embedWatermarkToPngBytes } from "@ikenxuan/watermark";
21
- import { snapka } from "@snapka/puppeteer";
21
+ import { snapka } from "@karinjs/plugin-puppeteer";
22
22
  import { newInjectedPage } from "fingerprint-injector";
23
23
  //#region src/index.ts
24
24
  globalThis.__kkkLoadStart ??= process.hrtime.bigint();
@@ -1613,8 +1613,8 @@ var xiaohongshuApiUrls = {
1613
1613
  keyword: data.keyword,
1614
1614
  page: data.page ?? 1,
1615
1615
  page_size: data.page_size ?? 20,
1616
- sort: SearchSortType.GENERAL,
1617
- note_type: SearchNoteType.ALL,
1616
+ sort: "general",
1617
+ note_type: 0,
1618
1618
  search_id: xiaohongshuSign.getSearchId(),
1619
1619
  image_formats: [
1620
1620
  "jpg",
@@ -2632,7 +2632,7 @@ var douoyinAPIErrorCode = /* @__PURE__ */ function(douoyinAPIErrorCode) {
2632
2632
  /** 当前用户未开播 */
2633
2633
  douoyinAPIErrorCode["NOT_LIVE"] = "USER_NOT_LIVE";
2634
2634
  /** 未知错误 */
2635
- douoyinAPIErrorCode[douoyinAPIErrorCode["UNKNOWN"] = amagiAPIErrorCode.UNKNOWN] = "UNKNOWN";
2635
+ douoyinAPIErrorCode["UNKNOWN"] = "UNKNOWN_ERROR";
2636
2636
  return douoyinAPIErrorCode;
2637
2637
  }({});
2638
2638
  /** B站平台API错误码 */
@@ -2744,7 +2744,7 @@ var kuaishouAPIErrorCode = /* @__PURE__ */ function(kuaishouAPIErrorCode) {
2744
2744
  /** Cookie无效或已过期 */
2745
2745
  kuaishouAPIErrorCode["COOKIE"] = "INVALID_COOKIE";
2746
2746
  /** 未知错误 */
2747
- kuaishouAPIErrorCode[kuaishouAPIErrorCode["UNKNOWN"] = amagiAPIErrorCode.UNKNOWN] = "UNKNOWN";
2747
+ kuaishouAPIErrorCode["UNKNOWN"] = "UNKNOWN_ERROR";
2748
2748
  return kuaishouAPIErrorCode;
2749
2749
  }({});
2750
2750
  /** 小红书平台API错误码 */
@@ -2752,7 +2752,7 @@ var xiaohongshuAPIErrorCode = /* @__PURE__ */ function(xiaohongshuAPIErrorCode)
2752
2752
  /** Cookie无效或已过期 */
2753
2753
  xiaohongshuAPIErrorCode["COOKIE"] = "INVALID_COOKIE";
2754
2754
  /** 未知错误 */
2755
- xiaohongshuAPIErrorCode[xiaohongshuAPIErrorCode["UNKNOWN"] = amagiAPIErrorCode.UNKNOWN] = "UNKNOWN";
2755
+ xiaohongshuAPIErrorCode["UNKNOWN"] = "UNKNOWN_ERROR";
2756
2756
  /** 非法请求 */
2757
2757
  xiaohongshuAPIErrorCode[xiaohongshuAPIErrorCode["ILLEGAL_REQUEST"] = 500] = "ILLEGAL_REQUEST";
2758
2758
  /** 检测到帐号异常,请稍后重试 */
@@ -10140,7 +10140,7 @@ function getApiRoute(platform, methodType) {
10140
10140
  * 构建后使用 __VERSION__,开发环境从 package.json 读取
10141
10141
  */
10142
10142
  var getVersion = () => {
10143
- return "6.1.2";
10143
+ return "6.1.3";
10144
10144
  };
10145
10145
  var VERSION = getVersion();
10146
10146
  /**
@@ -10935,6 +10935,10 @@ var QRCodeScanner = class {
10935
10935
  try {
10936
10936
  const response = await axios.get(imageUrl, { responseType: "arraybuffer" });
10937
10937
  const buffer = Buffer.from(response.data);
10938
+ if (!this.detectImageFormat(buffer)) {
10939
+ logger.debug("URL 内容不是支持的图片格式,跳过二维码扫描");
10940
+ return null;
10941
+ }
10938
10942
  return this.scanFromBuffer(buffer);
10939
10943
  } catch (error) {
10940
10944
  logger.error("识别二维码时发生错误:", error);
@@ -11254,7 +11258,7 @@ var QRCodeScanner = class {
11254
11258
  */
11255
11259
  static async parseHEIC(buffer) {
11256
11260
  try {
11257
- const decoded = await (0, import_heic_decode.default)({ buffer: buffer.buffer });
11261
+ const decoded = await (0, import_heic_decode.default)({ buffer });
11258
11262
  logger.debug(`HEIC 解析成功: ${decoded.width}x${decoded.height}`);
11259
11263
  return {
11260
11264
  width: decoded.width,
@@ -11512,23 +11516,47 @@ var Common = new class Tools {
11512
11516
  * @param e event 消息事件
11513
11517
  * @returns 被引用的消息
11514
11518
  */
11519
+ /**
11520
+ * 尝试从图片 URL 识别二维码并返回支持的平台链接
11521
+ * @param imageUrl 图片 URL
11522
+ * @param source 来源描述(用于日志)
11523
+ * @returns 识别到的平台链接,或 null
11524
+ */
11525
+ async tryScanImageQrCode(imageUrl, source) {
11526
+ try {
11527
+ logger.debug(`检测到${source}为图片,尝试识别二维码...`);
11528
+ const qrContent = await QRCodeScanner.scanFromUrl(imageUrl);
11529
+ if (qrContent && QRCodeScanner.isSupportedPlatform(qrContent)) {
11530
+ logger.debug(`从${source}二维码中识别到支持的平台链接: ${qrContent}`);
11531
+ return qrContent;
11532
+ } else if (qrContent) logger.debug(`识别到二维码内容但不是支持的平台: ${qrContent}`);
11533
+ } catch (error) {
11534
+ logger.error(`识别${source}二维码时发生错误:`, error);
11535
+ }
11536
+ return null;
11537
+ }
11515
11538
  async getReplyMessage(e) {
11516
11539
  if (e.replyId) {
11517
11540
  const reply = await e.bot.getMsg(e.contact, e.replyId);
11518
- for (const v of reply.elements) if (v.type === "text") return v.text;
11519
- else if (v.type === "json") return v.data;
11520
- else if (v.type === "image") try {
11521
- logger.debug("检测到引用消息为图片,尝试识别二维码...");
11522
- const imageUrl = v.file;
11523
- if (imageUrl) {
11524
- const qrContent = await QRCodeScanner.scanFromUrl(imageUrl);
11525
- if (qrContent && QRCodeScanner.isSupportedPlatform(qrContent)) {
11526
- logger.debug(`从图片二维码中识别到支持的平台链接: ${qrContent}`);
11527
- return qrContent;
11528
- } else if (qrContent) logger.debug(`识别到二维码内容但不是支持的平台: ${qrContent}`);
11529
- }
11530
- } catch (error) {
11531
- logger.error("识别图片二维码时发生错误:", error);
11541
+ for (const v of reply.elements) if (v.type === "text") {
11542
+ try {
11543
+ const parsed = JSON.parse(v.text);
11544
+ if (parsed.type === "markdown" && parsed.data?.content) {
11545
+ const content = parsed.data.content;
11546
+ const imageRegex = /!\[.*?\]\((.*?)\)/g;
11547
+ let match;
11548
+ while ((match = imageRegex.exec(content)) !== null) {
11549
+ const qrResult = await this.tryScanImageQrCode(match[1], "引用消息中的 markdown 图片");
11550
+ if (qrResult) return qrResult;
11551
+ }
11552
+ return content;
11553
+ }
11554
+ } catch {}
11555
+ return v.text;
11556
+ } else if (v.type === "json") return v.data;
11557
+ else if (v.type === "image") {
11558
+ const qrResult = await this.tryScanImageQrCode(v.file, "引用消息");
11559
+ if (qrResult) return qrResult;
11532
11560
  }
11533
11561
  }
11534
11562
  return "";
@@ -14561,7 +14589,7 @@ var ViteLogo = ({ className = "w-auto h-12" }) => /* @__PURE__ */ (0, import_jsx
14561
14589
  * @param props 组件属性
14562
14590
  * @returns JSX元素
14563
14591
  */
14564
- var DefaultLayout = ({ children, version, data, scale = 3, className = "", style = {} }) => {
14592
+ var DefaultLayout = ({ children, version, data, scale = 3, className = "", style = {}, watermarkTextBitSize }) => {
14565
14593
  const { useDarkTheme } = data;
14566
14594
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
14567
14595
  className: clsx("w-360 shrink-0 bg-background text-foreground font-[HarmonyOSHans-Regular]", useDarkTheme ? "dark" : "light", className),
@@ -14575,9 +14603,9 @@ var DefaultLayout = ({ children, version, data, scale = 3, className = "", style
14575
14603
  maxWidth: "1440px",
14576
14604
  ...style
14577
14605
  },
14578
- children: [children, version ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
14606
+ children: [children, version ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
14579
14607
  className: "relative z-50 pt-32 pb-20 text-foreground/80",
14580
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
14608
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
14581
14609
  className: "flex relative justify-center items-center space-x-8",
14582
14610
  children: [
14583
14611
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
@@ -14697,8 +14725,20 @@ var DefaultLayout = ({ children, version, data, scale = 3, className = "", style
14697
14725
  })]
14698
14726
  })] })
14699
14727
  ]
14728
+ }), typeof watermarkTextBitSize === "number" && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
14729
+ className: "flex justify-center",
14730
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
14731
+ className: "text-xs font-mono text-foreground/30",
14732
+ children: ["Restore ID: ", watermarkTextBitSize]
14733
+ })
14734
+ })]
14735
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
14736
+ className: "flex items-center justify-center h-24",
14737
+ children: typeof watermarkTextBitSize === "number" && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
14738
+ className: "text-xs font-mono text-foreground/30",
14739
+ children: ["Restore ID: ", watermarkTextBitSize]
14700
14740
  })
14701
- }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-24" })]
14741
+ })]
14702
14742
  });
14703
14743
  };
14704
14744
  //#endregion
@@ -15989,6 +16029,31 @@ var CoinIcon = ({ className, size, variant = "solid" }) => {
15989
16029
  })
15990
16030
  });
15991
16031
  };
16032
+ /** B站官方评论图标 */
16033
+ var CommentIcon = ({ className, size, variant = "solid" }) => {
16034
+ if (variant === "line") return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
16035
+ viewBox: "0 0 18 18",
16036
+ xmlns: "http://www.w3.org/2000/svg",
16037
+ className,
16038
+ fill: "currentColor",
16039
+ width: size,
16040
+ height: size,
16041
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
16042
+ fillRule: "evenodd",
16043
+ clipRule: "evenodd",
16044
+ 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"
16045
+ })
16046
+ });
16047
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
16048
+ viewBox: "0 0 18 18",
16049
+ xmlns: "http://www.w3.org/2000/svg",
16050
+ className,
16051
+ fill: "currentColor",
16052
+ width: size,
16053
+ height: size,
16054
+ children: /* @__PURE__ */ (0, import_jsx_runtime.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" })
16055
+ });
16056
+ };
15992
16057
  //#endregion
15993
16058
  //#region ../template/src/components/platforms/bilibili/Comment.tsx
15994
16059
  var bilibiliMentionClassName = "text-[#006A9E] dark:text-[#58B0D5]";
@@ -16713,7 +16778,7 @@ var BilibiliArticleStatus = import_react.memo((props) => {
16713
16778
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
16714
16779
  className: "flex gap-3 items-center text-[42px]",
16715
16780
  children: [
16716
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, { size: 32 }),
16781
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, { size: 32 }),
16717
16782
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
16718
16783
  className: "font-medium",
16719
16784
  children: props.data.stats.reply || 0
@@ -16925,7 +16990,7 @@ BilibiliArticleDynamic.displayName = "BilibiliArticleDynamic";
16925
16990
  */
16926
16991
  var BilibiliVideoDynamicHeader = () => {
16927
16992
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
16928
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-20" }),
16993
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-25" }),
16929
16994
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
16930
16995
  className: "flex items-center pl-20 text-6xl text-muted",
16931
16996
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
@@ -17004,7 +17069,7 @@ var BilibiliVideoDynamicContent = (props) => {
17004
17069
  }),
17005
17070
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
17006
17071
  className: "flex gap-3 items-center",
17007
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, { size: 48 }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
17072
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, { size: 48 }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
17008
17073
  className: "select-text",
17009
17074
  children: [props.data.pinglun, "评论"]
17010
17075
  })]
@@ -17652,7 +17717,7 @@ var BilibiliDynamicStatus$1 = (props) => {
17652
17717
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
17653
17718
  className: "flex gap-2 items-center",
17654
17719
  children: [
17655
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, { size: 48 }),
17720
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, { size: 48 }),
17656
17721
  props.pinglun,
17657
17722
  "评论"
17658
17723
  ]
@@ -18011,7 +18076,7 @@ var OriginalDrawContent = ({ content }) => {
18011
18076
  })
18012
18077
  })
18013
18078
  }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
18014
- className: `grid gap-3 p-4 ${content.image_url?.length === 4 ? "grid-cols-2" : "grid-cols-3"}`,
18079
+ className: `grid gap-3 ${content.image_url?.length === 4 ? "grid-cols-2" : "grid-cols-3"}`,
18015
18080
  children: [content.image_url?.map((img, index) => {
18016
18081
  const total = content.image_url?.length || 0;
18017
18082
  const cols = total === 4 ? 2 : 3;
@@ -18190,7 +18255,7 @@ var BilibiliForwardStatus = (props) => {
18190
18255
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
18191
18256
  className: "flex gap-2 items-center",
18192
18257
  children: [
18193
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, { size: 48 }),
18258
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, { size: 48 }),
18194
18259
  props.pinglun,
18195
18260
  "评论"
18196
18261
  ]
@@ -18334,7 +18399,7 @@ var BilibiliForwardDynamic = import_react.memo((props) => {
18334
18399
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
18335
18400
  className: "p-4",
18336
18401
  children: [
18337
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-15" }),
18402
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-25" }),
18338
18403
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BilibiliForwardUserInfo, {
18339
18404
  avatar_url: props.data.avatar_url,
18340
18405
  frame: props.data.frame,
@@ -18984,7 +19049,7 @@ var BilibiliDynamicStatus = (props) => {
18984
19049
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
18985
19050
  className: "flex gap-2 items-center",
18986
19051
  children: [
18987
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, { size: 48 }),
19052
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, { size: 48 }),
18988
19053
  props.pinglun,
18989
19054
  "评论"
18990
19055
  ]
@@ -19382,32 +19447,32 @@ BilibiliQrcodeImg.displayName = "BilibiliQrcodeImg";
19382
19447
  var pushTypeConfig$1 = {
19383
19448
  video: {
19384
19449
  label: "投稿视频",
19385
- color: "bg-accent/8 text-accent border-accent/25",
19450
+ color: "bg-accent/6 text-accent/80 border-accent-soft",
19386
19451
  icon: Video
19387
19452
  },
19388
19453
  draw: {
19389
19454
  label: "图文动态",
19390
- color: "bg-[#23ade5]/10 text-[#23ade5] border-[#23ade5]/25",
19455
+ color: "bg-[#23ade5]/5 text-[#1a8fb8] border-[#23ade5]/12",
19391
19456
  icon: Image$1
19392
19457
  },
19393
19458
  word: {
19394
19459
  label: "纯文动态",
19395
- color: "bg-warning/10 text-warning border-warning/25",
19460
+ color: "bg-warning/5 text-warning/80 border-warning/12",
19396
19461
  icon: FileText
19397
19462
  },
19398
19463
  live: {
19399
19464
  label: "直播动态",
19400
- color: "bg-success/10 text-success border-success/25",
19465
+ color: "bg-success/5 text-success/80 border-success/12",
19401
19466
  icon: Radio
19402
19467
  },
19403
19468
  forward: {
19404
19469
  label: "转发动态",
19405
- color: "bg-[#f97316]/10 text-[#f97316] border-[#f97316]/25",
19470
+ color: "bg-[#f97316]/5 text-[#cc6b1f] border-[#f97316]/12",
19406
19471
  icon: Share2
19407
19472
  },
19408
19473
  article: {
19409
19474
  label: "投稿专栏",
19410
- color: "bg-[#7c3aed]/10 text-[#7c3aed] border-[#7c3aed]/25",
19475
+ color: "bg-[#7c3aed]/5 text-[#6b4fa8] border-[#7c3aed]/12",
19411
19476
  icon: FileText
19412
19477
  }
19413
19478
  };
@@ -19523,7 +19588,7 @@ var BilibiliUserItem = (props) => {
19523
19588
  className: `h-full min-h-18.5 px-2.5 py-2.5 rounded-xl border backdrop-blur-sm flex flex-col justify-between transition-colors duration-200 ${isActive ? config.color : "bg-surface/45 text-muted border-border/15"}`,
19524
19589
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(config.icon, {
19525
19590
  size: 18,
19526
- className: isActive ? "" : "opacity-50"
19591
+ className: isActive ? "" : "opacity-40"
19527
19592
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
19528
19593
  className: "text-[13px] font-bold tracking-wide leading-tight",
19529
19594
  children: config.label
@@ -19692,12 +19757,11 @@ var BilibiliUserList = (props) => {
19692
19757
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
19693
19758
  className: "flex items-center gap-3 mb-4",
19694
19759
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
19695
- className: "w-10 h-10 rounded-xl bg-foreground flex items-center justify-center text-background shadow-lg",
19696
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
19697
- className: "w-6 h-6",
19698
- fill: "currentColor",
19699
- viewBox: "0 0 24 24",
19700
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-4.41-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm-5.5-2.5l7.51-3.49L17.5 6.5 9.99 9.99 6.5 17.5zm5.5-6.6c.61 0 1.1.49 1.1 1.1s-.49 1.1-1.1 1.1-1.1-.49-1.1-1.1.49-1.1 1.1-1.1z" })
19760
+ className: "w-10 h-10 rounded-xl overflow-hidden shadow-lg border border-border/30",
19761
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EnhancedImage, {
19762
+ src: props.data.groupInfo.groupAvatar,
19763
+ alt: "Group Avatar",
19764
+ className: "w-full h-full object-cover"
19701
19765
  })
19702
19766
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
19703
19767
  className: "font-mono text-sm font-bold tracking-widest uppercase opacity-50 text-foreground",
@@ -19891,7 +19955,8 @@ var BilibiliVideoInfo = import_react.memo((props) => {
19891
19955
  }),
19892
19956
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
19893
19957
  className: "flex items-center gap-1.5",
19894
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(MessageCircle, {
19958
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommentIcon, {
19959
+ variant: "line",
19895
19960
  size: 28,
19896
19961
  className: "text-foreground/20"
19897
19962
  }), formatNumber$2(props.data.stat.reply)]
@@ -20398,7 +20463,7 @@ var VideoInfoHeader = (props) => {
20398
20463
  })
20399
20464
  }),
20400
20465
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
20401
- className: "flex items-center gap-12 flex-wrap",
20466
+ className: "grid grid-cols-2 gap-8",
20402
20467
  children: [
20403
20468
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
20404
20469
  className: "flex items-center gap-4 text-foreground/50",
@@ -22807,23 +22872,23 @@ var StatItem$2 = ({ icon: IconComponent, value, iconClassName }) => /* @__PURE__
22807
22872
  var pushTypeConfig = {
22808
22873
  post: {
22809
22874
  label: "作品更新",
22810
- color: "bg-accent/5 text-accent border-accent-soft-hover",
22811
- icon: RiVideoLine
22875
+ color: "bg-accent/5 text-accent/80 border-accent/12",
22876
+ icon: Clapperboard
22812
22877
  },
22813
22878
  favorite: {
22814
22879
  label: "喜欢列表",
22815
- color: "bg-danger/5 text-danger border-danger-soft-hover",
22816
- icon: RiHeartLine
22880
+ color: "bg-[#d94f50]/5 text-[#b04546] border-[#d94f50]/12",
22881
+ icon: Heart
22817
22882
  },
22818
22883
  recommend: {
22819
22884
  label: "推荐列表",
22820
- color: "bg-warning/5 text-warning border-warning-soft-hover",
22821
- icon: RiStarLine
22885
+ color: "bg-[#c9943a]/5 text-[#a07d30] border-[#c9943a]/12",
22886
+ icon: Sparkles
22822
22887
  },
22823
22888
  live: {
22824
22889
  label: "直播状态",
22825
- color: "bg-surface-secondary/40 text-accent border-border/20",
22826
- icon: RiLiveLine
22890
+ color: "bg-[#3aa876]/5 text-[#2e8a5e] border-[#3aa876]/12",
22891
+ icon: Radio
22827
22892
  }
22828
22893
  };
22829
22894
  /**
@@ -22911,7 +22976,7 @@ var DouyinUserItem = (props) => {
22911
22976
  children: props.username
22912
22977
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
22913
22978
  className: "inline-flex items-center gap-1 px-2 py-1 rounded-md bg-surface/50 border border-border/50 text-xs font-mono font-bold text-muted",
22914
- children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RiHashtag, {
22979
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Hash, {
22915
22980
  size: 12,
22916
22981
  className: "opacity-70"
22917
22982
  }), props.short_id]
@@ -22947,17 +23012,17 @@ var DouyinUserItem = (props) => {
22947
23012
  className: "flex-1 flex flex-col gap-2",
22948
23013
  children: [
22949
23014
  {
22950
- icon: RiGroupLine,
23015
+ icon: UsersRound,
22951
23016
  value: props.fans,
22952
23017
  label: "粉丝"
22953
23018
  },
22954
23019
  {
22955
- icon: RiHeart3Line,
23020
+ icon: Heart,
22956
23021
  value: props.total_favorited,
22957
23022
  label: "获赞"
22958
23023
  },
22959
23024
  {
22960
- icon: RiUserFollowLine,
23025
+ icon: UserPlus,
22961
23026
  value: props.following_count,
22962
23027
  label: "关注"
22963
23028
  }
@@ -23101,12 +23166,11 @@ var DouyinUserList = (props) => {
23101
23166
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
23102
23167
  className: "flex items-center gap-3 mb-4",
23103
23168
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
23104
- className: "w-10 h-10 rounded-xl bg-foreground flex items-center justify-center text-background shadow-lg",
23105
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("svg", {
23106
- className: "w-6 h-6",
23107
- fill: "currentColor",
23108
- viewBox: "0 0 24 24",
23109
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M19 4h-1V2h-2v2H8V2H6v2H5c-1.11 0-1.99.9-1.99 2L3 20a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 16H5V10h14v10zm0-12H5V6h14v2zm-7 5h5v5h-5z" })
23169
+ className: "w-10 h-10 rounded-xl overflow-hidden shadow-lg border border-border/30",
23170
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
23171
+ src: props.data.groupInfo.groupAvatar,
23172
+ alt: "Group Avatar",
23173
+ className: "w-full h-full object-cover"
23110
23174
  })
23111
23175
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
23112
23176
  className: "font-mono text-sm font-bold tracking-widest uppercase opacity-50 text-foreground",
@@ -24220,8 +24284,8 @@ var KuaishouComment = import_react.memo((props) => {
24220
24284
  var InlineCalloutCode = ({ children, className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
24221
24285
  className: `inline-flex items-center rounded-[0.55em] px-[0.48em] py-[0.18em] font-semibold ${className ?? ""}`.trim(),
24222
24286
  style: {
24223
- background: "color-mix(in oklab, var(--success) 12%, transparent)",
24224
- color: "var(--success)"
24287
+ background: "color-mix(in oklab, #d4af37 14%, transparent)",
24288
+ color: "#d4af37"
24225
24289
  },
24226
24290
  children
24227
24291
  });
@@ -24234,27 +24298,27 @@ var Changelog = import_react.memo((props) => {
24234
24298
  const isDark = props.data.useDarkTheme ?? false;
24235
24299
  const { qrCodeDataUrl } = props;
24236
24300
  const backgroundColors = isDark ? {
24237
- base: "#06110d",
24238
- primary: "rgba(70, 184, 145, 0.26)",
24239
- secondary: "rgba(135, 214, 84, 0.22)",
24240
- accent: "rgba(88, 154, 210, 0.18)",
24241
- wash: "rgba(7, 24, 18, 0.8)",
24242
- tint: "rgba(162, 224, 103, 0.1)",
24243
- noiseOpacity: .22,
24301
+ base: "#0a0a0a",
24302
+ primary: "rgba(212, 175, 55, 0.28)",
24303
+ secondary: "rgba(184, 134, 11, 0.24)",
24304
+ accent: "rgba(205, 133, 63, 0.20)",
24305
+ wash: "rgba(10, 10, 10, 0.85)",
24306
+ tint: "rgba(212, 175, 55, 0.12)",
24307
+ noiseOpacity: .2,
24244
24308
  noiseBlend: "screen",
24245
- inlineCodeBg: "rgba(255, 255, 255, 0.08)",
24246
- inlineCodeText: "#dff3db"
24309
+ inlineCodeBg: "rgba(255, 215, 0, 0.10)",
24310
+ inlineCodeText: "#f0c040"
24247
24311
  } : {
24248
- base: "#f5fbfc",
24249
- primary: "rgba(214, 236, 240, 0.95)",
24250
- secondary: "rgba(189, 221, 34, 0.42)",
24251
- accent: "rgba(214, 236, 240, 0.72)",
24252
- wash: "rgba(255, 255, 255, 0.36)",
24253
- tint: "rgba(189, 221, 34, 0.12)",
24254
- noiseOpacity: .16,
24312
+ base: "#faf8f3",
24313
+ primary: "rgba(212, 175, 55, 0.20)",
24314
+ secondary: "rgba(184, 134, 11, 0.16)",
24315
+ accent: "rgba(205, 133, 63, 0.14)",
24316
+ wash: "rgba(250, 248, 243, 0.65)",
24317
+ tint: "rgba(212, 175, 55, 0.07)",
24318
+ noiseOpacity: .12,
24255
24319
  noiseBlend: "multiply",
24256
- inlineCodeBg: "rgba(15, 23, 42, 0.06)",
24257
- inlineCodeText: "#314329"
24320
+ inlineCodeBg: "rgba(184, 134, 11, 0.12)",
24321
+ inlineCodeText: "#8b6914"
24258
24322
  };
24259
24323
  return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultLayout, {
24260
24324
  ...props,
@@ -24348,7 +24412,7 @@ var Changelog = import_react.memo((props) => {
24348
24412
  })
24349
24413
  }),
24350
24414
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
24351
- className: "relative px-20 pt-5 pb-0 w-full max-w-none prose prose-lg prose-invert from-surface to-surface",
24415
+ className: "relative px-16 pt-5 pb-0 w-full max-w-none prose prose-lg prose-invert from-surface to-surface",
24352
24416
  children: [
24353
24417
  props.data.Tip === true ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_jsx_runtime.Fragment, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
24354
24418
  className: "pt-32",
@@ -24397,7 +24461,7 @@ var Changelog = import_react.memo((props) => {
24397
24461
  }),
24398
24462
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "进入" }),
24399
24463
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InlineCalloutCode, {
24400
- className: "text-[0.9em]",
24464
+ className: "text-[0.9em] font-mono",
24401
24465
  children: "Karin WebUI"
24402
24466
  }),
24403
24467
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "→" }),
@@ -24423,7 +24487,7 @@ var Changelog = import_react.memo((props) => {
24423
24487
  }),
24424
24488
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Karin 根目录运行" }),
24425
24489
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(InlineCalloutCode, {
24426
- className: "text-[0.85em] whitespace-nowrap",
24490
+ className: "text-[0.85em] whitespace-nowrap font-mono",
24427
24491
  children: [
24428
24492
  "pnpm add karin-plugin-kkk@",
24429
24493
  props.data.remoteVersion,
@@ -24437,7 +24501,7 @@ var Changelog = import_react.memo((props) => {
24437
24501
  ]
24438
24502
  }) }) : null,
24439
24503
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
24440
- className: "changelog-content",
24504
+ className: "changelog-content px-6",
24441
24505
  children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Markdown, {
24442
24506
  rehypePlugins: [rehypeHighlight],
24443
24507
  components: {
@@ -24480,7 +24544,7 @@ var Changelog = import_react.memo((props) => {
24480
24544
  children
24481
24545
  }),
24482
24546
  ul: ({ children, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("ul", {
24483
- className: "pl-[5em] mb-[2em] list-disc text-foreground",
24547
+ className: "pl-[5em] mb-[4em] list-disc text-foreground",
24484
24548
  ...props,
24485
24549
  children
24486
24550
  }),
@@ -24512,12 +24576,15 @@ var Changelog = import_react.memo((props) => {
24512
24576
  ...props,
24513
24577
  children
24514
24578
  }),
24515
- a: ({ children, href, ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
24516
- className: "inline-flex gap-3 items-baseline cursor-pointer text-foreground/50 hover:underline",
24517
- onClick: (e) => e.preventDefault(),
24518
- ...props,
24519
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children })
24520
- }),
24579
+ a: ({ children, href, ...props }) => {
24580
+ const isVersionLink = href?.includes("/compare/");
24581
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
24582
+ className: `inline-flex gap-3 items-baseline cursor-pointer font-medium hover:underline ${isVersionLink ? "text-success" : "text-foreground/50"}`,
24583
+ onClick: (e) => e.preventDefault(),
24584
+ ...props,
24585
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children })
24586
+ });
24587
+ },
24521
24588
  img: ({ ...props }) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("img", {
24522
24589
  className: "max-w-full h-auto rounded",
24523
24590
  ...props
@@ -24553,7 +24620,7 @@ var Changelog = import_react.memo((props) => {
24553
24620
  }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
24554
24621
  className: "text-4xl text-foreground/60",
24555
24622
  children: [
24556
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "查看实际运行代码从" }),
24623
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "扫码查看实际运行代码从" }),
24557
24624
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
24558
24625
  className: "font-bold text-foreground/80",
24559
24626
  children: [" v", props.data.localVersion]
@@ -24563,7 +24630,7 @@ var Changelog = import_react.memo((props) => {
24563
24630
  className: "font-bold text-foreground/80",
24564
24631
  children: [" v", props.data.remoteVersion]
24565
24632
  }),
24566
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: " 的 Diff 差异" })
24633
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: " 的差异" })
24567
24634
  ]
24568
24635
  })]
24569
24636
  }),
@@ -25959,56 +26026,56 @@ var getLogLevelTheme = (level, isDark) => {
25959
26026
  borderClass: "border-muted/20",
25960
26027
  textClass: "text-muted",
25961
26028
  iconClass: "text-muted",
25962
- levelClass: isDark ? "text-muted/10" : "text-muted/5",
25963
- dotClass: "bg-muted/20"
26029
+ levelClass: isDark ? "text-muted/10" : "text-muted/10",
26030
+ dotClass: "bg-muted/40"
25964
26031
  },
25965
26032
  "DEBU": {
25966
26033
  bgClass: isDark ? "bg-cyan-400/10" : "bg-cyan-500/5",
25967
26034
  borderClass: isDark ? "border-cyan-400/20" : "border-cyan-500/20",
25968
26035
  textClass: isDark ? "text-cyan-400" : "text-cyan-600",
25969
26036
  iconClass: isDark ? "text-cyan-400" : "text-cyan-600",
25970
- levelClass: isDark ? "text-cyan-400/10" : "text-cyan-600/5",
25971
- dotClass: isDark ? "bg-cyan-400/20" : "bg-cyan-500/20"
26037
+ levelClass: isDark ? "text-cyan-400/10" : "text-cyan-600/10",
26038
+ dotClass: isDark ? "bg-cyan-400/40" : "bg-cyan-500/40"
25972
26039
  },
25973
26040
  "MARK": {
25974
26041
  bgClass: isDark ? "bg-muted/10" : "bg-muted/5",
25975
26042
  borderClass: "border-muted/20",
25976
26043
  textClass: "text-muted",
25977
26044
  iconClass: "text-muted",
25978
- levelClass: isDark ? "text-muted/10" : "text-muted/5",
25979
- dotClass: "bg-muted/20"
26045
+ levelClass: isDark ? "text-muted/10" : "text-muted/10",
26046
+ dotClass: "bg-muted/40"
25980
26047
  },
25981
26048
  "INFO": {
25982
26049
  bgClass: "bg-success-soft",
25983
26050
  borderClass: "border-success/25",
25984
26051
  textClass: "text-success",
25985
26052
  iconClass: "text-success",
25986
- levelClass: isDark ? "text-success/10" : "text-success/5",
25987
- dotClass: "bg-success/25"
26053
+ levelClass: isDark ? "text-success/10" : "text-success/10",
26054
+ dotClass: "bg-success/40"
25988
26055
  },
25989
26056
  "WARN": {
25990
26057
  bgClass: "bg-warning-soft",
25991
26058
  borderClass: "border-warning/25",
25992
26059
  textClass: "text-warning",
25993
26060
  iconClass: "text-warning",
25994
- levelClass: isDark ? "text-warning/10" : "text-warning/5",
25995
- dotClass: "bg-warning/25"
26061
+ levelClass: isDark ? "text-warning/10" : "text-warning-soft",
26062
+ dotClass: "bg-warning/40"
25996
26063
  },
25997
26064
  "ERRO": {
25998
26065
  bgClass: "bg-danger-soft",
25999
26066
  borderClass: "border-danger/25",
26000
26067
  textClass: "text-danger",
26001
26068
  iconClass: "text-danger",
26002
- levelClass: isDark ? "text-danger/10" : "text-danger/5",
26003
- dotClass: "bg-danger/25"
26069
+ levelClass: isDark ? "text-danger/10" : "text-danger/10",
26070
+ dotClass: "bg-danger/40"
26004
26071
  },
26005
26072
  "FATA": {
26006
26073
  bgClass: isDark ? "bg-pink-400/10" : "bg-pink-500/5",
26007
26074
  borderClass: isDark ? "border-pink-400/25" : "border-pink-500/25",
26008
26075
  textClass: isDark ? "text-pink-400" : "text-pink-500",
26009
26076
  iconClass: isDark ? "text-pink-400" : "text-pink-500",
26010
- levelClass: isDark ? "text-pink-400/10" : "text-pink-500/5",
26011
- dotClass: isDark ? "bg-pink-400/25" : "bg-pink-500/25"
26077
+ levelClass: isDark ? "text-pink-400/10" : "text-pink-500/10",
26078
+ dotClass: isDark ? "bg-pink-400/40" : "bg-pink-500/40"
26012
26079
  }
26013
26080
  };
26014
26081
  return themeMap[level] || themeMap["TRAC"];
@@ -26398,7 +26465,7 @@ var handlerError = (props) => {
26398
26465
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(SectionTitle, {
26399
26466
  icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleAlert, {
26400
26467
  size: 36,
26401
- style: { color: primaryColor }
26468
+ style: { color: mutedColor }
26402
26469
  }),
26403
26470
  en: "Stack Trace",
26404
26471
  zh: "错误堆栈",
@@ -26436,7 +26503,7 @@ var handlerError = (props) => {
26436
26503
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("legend", {
26437
26504
  className: "flex items-center gap-2 ml-4",
26438
26505
  children: [
26439
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `w-3 h-3 rounded-full -mr-1.5 ${theme.dotClass}` }),
26506
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `w-2 h-6 rounded-full -mr-1.5 ${theme.dotClass}` }),
26440
26507
  /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
26441
26508
  className: "flex items-center gap-2 px-3",
26442
26509
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Clock, {
@@ -26447,14 +26514,14 @@ var handlerError = (props) => {
26447
26514
  children: log.timestamp
26448
26515
  })]
26449
26516
  }),
26450
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `w-3 h-3 rounded-full -ml-1.5 ${theme.dotClass}` })
26517
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: `w-2 h-6 rounded-full -ml-1.5 ${theme.dotClass}` })
26451
26518
  ]
26452
26519
  }),
26453
26520
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
26454
26521
  className: "absolute bottom-2 right-6 pointer-events-none",
26455
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
26456
- className: `text-[56px] font-black uppercase leading-none tracking-tight ${theme.levelClass}`,
26457
- children: log.level
26522
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
26523
+ className: `text-6xl font-black uppercase leading-none tracking-tight ${theme.levelClass}`,
26524
+ children: [log.level, "」"]
26458
26525
  })
26459
26526
  }),
26460
26527
  /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
@@ -26660,8 +26727,9 @@ var handlerError = (props) => {
26660
26727
  children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(MdSchedule, { size: 24 }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { children: [
26661
26728
  "Built Time: ",
26662
26729
  data.buildTime,
26663
- " 距离 ",
26664
- formatDistanceToNow(parse(data.buildTime, "yyyy年MM月dd日 HH:mm", /* @__PURE__ */ new Date()), { locale: zhCN })
26730
+ " ",
26731
+ formatDistanceToNow(parse(data.buildTime, "yyyy年MM月dd日 HH:mm", /* @__PURE__ */ new Date()), { locale: zhCN }),
26732
+ "前"
26665
26733
  ] })]
26666
26734
  }), data.commitHash && /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
26667
26735
  className: "flex items-center gap-3",
@@ -26885,6 +26953,13 @@ var iconRegistry = {
26885
26953
  "simple-icons:bilibili": SiBilibili,
26886
26954
  "simple-icons:openai": Sparkles,
26887
26955
  "simple-icons:anthropic": SiAnthropic,
26956
+ "simple-icons:googlephotos": SiGooglephotos,
26957
+ "simple-icons:xiaomi": SiXiaomi,
26958
+ "simple-icons:oppo": SiOppo,
26959
+ "simple-icons:huawei": SiHuawei,
26960
+ "simple-icons:honor": SiHonor,
26961
+ "simple-icons:vivo": SiVivo,
26962
+ "simple-icons:samsung": SiSamsung,
26888
26963
  "tabler:message-circle": MessageCircle,
26889
26964
  "tabler:scan": ScanLine,
26890
26965
  "ph:play-fill": n,
@@ -27156,6 +27231,435 @@ var Help = import_react.memo((props) => {
27156
27231
  });
27157
27232
  Help.displayName = "Help";
27158
27233
  //#endregion
27234
+ //#region ../template/src/components/platforms/other/LivePhotoTip.tsx
27235
+ /**
27236
+ * Google Photos 彩色官方 Logo
27237
+ */
27238
+ var GooglePhotosIcon = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
27239
+ className,
27240
+ viewBox: "0 0 32 32",
27241
+ xmlns: "http://www.w3.org/2000/svg",
27242
+ children: [
27243
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27244
+ d: "M4,16a6,6,0,0,1,12,0Z",
27245
+ fill: "#ffba00"
27246
+ }),
27247
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27248
+ d: "M22,10a6,6,0,0,1-6,6V4a6,6,0,0,1,6,6",
27249
+ fill: "#ea4435"
27250
+ }),
27251
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27252
+ d: "M28,16a6,6,0,0,1-12,0Z",
27253
+ fill: "#0066da"
27254
+ }),
27255
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27256
+ d: "M10,22a6,6,0,0,1,6-6V28a6,6,0,0,1-6-6",
27257
+ fill: "#00ac47"
27258
+ })
27259
+ ]
27260
+ });
27261
+ var statusConfig = {
27262
+ verified: {
27263
+ icon: Check,
27264
+ color: "#22c55e",
27265
+ label: "实测可用"
27266
+ },
27267
+ untested: {
27268
+ icon: CircleQuestionMark,
27269
+ color: "#f59e0b",
27270
+ label: "理论支持"
27271
+ },
27272
+ unsupported: {
27273
+ icon: X,
27274
+ color: "#ef4444",
27275
+ label: "不支持"
27276
+ }
27277
+ };
27278
+ /**
27279
+ * kkk Logo SVG
27280
+ */
27281
+ var KkkLogo = ({ className, color }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
27282
+ xmlns: "http://www.w3.org/2000/svg",
27283
+ viewBox: "0 0 230 221",
27284
+ className,
27285
+ style: { color },
27286
+ children: [
27287
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27288
+ d: "M132.75,87.37l-53.72-53.37c-4.66-4.63-1.38-12.58,5.18-12.58h115.13c6.57,0,9.84,7.95,5.18,12.58l-53.72,53.37c-4.99,4.96-13.06,4.96-18.05,0Z",
27289
+ fill: "currentColor"
27290
+ }),
27291
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27292
+ d: "M28.49,186.89l.03-51.42c-.02-6.57,7.92-9.87,12.56-5.23l57.02,57.02c4.64,4.64,1.34,12.41-5.23,12.39h-51.42c-7.04-.02-12.94-5.72-12.96-12.76Z",
27293
+ fill: "currentColor"
27294
+ }),
27295
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
27296
+ d: "M41.54,23.68l163.04,163.05c4.78,4.78,1.39,12.95-5.36,12.94h-47.88c-9.69,0-18.99-3.86-25.84-10.71L39.3,102.75c-6.85-6.85-10.7-16.15-10.7-25.84V29.04c0-6.76,8.16-10.14,12.94-5.36Z",
27297
+ fill: "currentColor"
27298
+ })
27299
+ ]
27300
+ });
27301
+ function BrandCard({ brand, isDark }) {
27302
+ const StatusIcon = statusConfig[brand.status].icon;
27303
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27304
+ className: "flex flex-col items-center gap-3",
27305
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27306
+ className: "relative flex items-center justify-center w-75 h-75 rounded-3xl",
27307
+ style: { background: isDark ? "radial-gradient(circle, " + brand.color + "12 0%, transparent 70%)" : "radial-gradient(circle, " + brand.color + "08 0%, transparent 70%)" },
27308
+ children: [brand.icon, /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27309
+ className: "absolute top-4 right-4 flex items-center gap-1.5 px-5 py-2.5 rounded-full",
27310
+ style: { backgroundColor: statusConfig[brand.status].color + "20" },
27311
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, {
27312
+ className: "w-5 h-auto",
27313
+ style: { color: statusConfig[brand.status].color }
27314
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27315
+ className: "text-lg font-bold",
27316
+ style: { color: statusConfig[brand.status].color },
27317
+ children: statusConfig[brand.status].label
27318
+ })]
27319
+ })]
27320
+ })
27321
+ });
27322
+ }
27323
+ function UnsupportedBrandCard({ brand, isDark }) {
27324
+ const StatusIcon = statusConfig[brand.status].icon;
27325
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27326
+ className: "flex flex-col items-center gap-2 opacity-50",
27327
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27328
+ className: "relative flex items-center justify-center w-40 h-40 rounded-2xl",
27329
+ style: { background: isDark ? "radial-gradient(circle, " + brand.color + "08 0%, transparent 70%)" : "radial-gradient(circle, " + brand.color + "05 0%, transparent 70%)" },
27330
+ children: brand.icon
27331
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27332
+ className: "flex items-center gap-1",
27333
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(StatusIcon, {
27334
+ className: "w-5 h-auto",
27335
+ style: { color: statusConfig[brand.status].color }
27336
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27337
+ className: "text-md font-bold",
27338
+ style: { color: statusConfig[brand.status].color },
27339
+ children: statusConfig[brand.status].label
27340
+ })]
27341
+ })]
27342
+ });
27343
+ }
27344
+ /**
27345
+ * 实况图提示组件 - 正方形,Vercel 黑白风格
27346
+ */
27347
+ var LivePhotoTip = import_react.memo((props) => {
27348
+ const isDark = props.data.useDarkTheme ?? false;
27349
+ const bgColor = isDark ? "#000000" : "#ffffff";
27350
+ const primaryColor = isDark ? "#ffffff" : "#000000";
27351
+ const secondaryColor = isDark ? "#888888" : "#666666";
27352
+ const mutedColor = isDark ? "rgba(255,255,255,0.5)" : "rgba(0,0,0,0.5)";
27353
+ const accentColor = isDark ? "#ffffff" : "#000000";
27354
+ const glow1 = "radial-gradient(ellipse at 30% 40%, " + (isDark ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.06)") + " 0%, transparent 70%)";
27355
+ const glow2 = "radial-gradient(ellipse at 70% 60%, " + (isDark ? "rgba(128,128,128,0.1)" : "rgba(128,128,128,0.08)") + " 0%, transparent 70%)";
27356
+ const noiseOpacity = isDark ? .04 : .06;
27357
+ const appleColor = isDark ? "#ffffff" : "#000000";
27358
+ const supportedBrands = [
27359
+ {
27360
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GooglePhotosIcon, { className: "w-36 h-auto" }),
27361
+ color: "#4285F4",
27362
+ status: "verified"
27363
+ },
27364
+ {
27365
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiXiaomi, {
27366
+ className: "w-28 h-auto",
27367
+ style: { color: "#FF6900" }
27368
+ }),
27369
+ color: "#FF6900",
27370
+ status: "verified"
27371
+ },
27372
+ {
27373
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiSamsung, {
27374
+ className: "w-68 h-auto",
27375
+ style: { color: "#1428A0" }
27376
+ }),
27377
+ color: "#1428A0",
27378
+ status: "verified"
27379
+ },
27380
+ {
27381
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiOppo, { className: "w-58 h-auto" }),
27382
+ color: "#009B77",
27383
+ status: "verified"
27384
+ },
27385
+ {
27386
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiOneplus, {
27387
+ className: "w-26 h-auto",
27388
+ style: { color: "#F50514" }
27389
+ }),
27390
+ color: "#F50514",
27391
+ status: "verified"
27392
+ },
27393
+ {
27394
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiHuawei, {
27395
+ className: "w-32 h-auto",
27396
+ style: { color: "#CF0A2C" }
27397
+ }),
27398
+ color: "#CF0A2C",
27399
+ status: "untested"
27400
+ },
27401
+ {
27402
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiHonor, {
27403
+ className: "w-58 h-auto",
27404
+ style: { color: "#00BFFF" }
27405
+ }),
27406
+ color: "#00BFFF",
27407
+ status: "untested"
27408
+ }
27409
+ ];
27410
+ const unsupportedBrands = [{
27411
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiApple, {
27412
+ className: "w-20 h-auto",
27413
+ style: { color: appleColor }
27414
+ }),
27415
+ color: appleColor,
27416
+ status: "unsupported"
27417
+ }, {
27418
+ icon: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SiVivo, {
27419
+ className: "w-24 h-auto",
27420
+ style: { color: "#415FFF" }
27421
+ }),
27422
+ color: "#415FFF",
27423
+ status: "unsupported"
27424
+ }];
27425
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(DefaultLayout, {
27426
+ ...props,
27427
+ version: void 0,
27428
+ className: "relative overflow-hidden",
27429
+ style: {
27430
+ backgroundColor: bgColor,
27431
+ minHeight: "1440px"
27432
+ },
27433
+ children: [
27434
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27435
+ className: "absolute inset-0 pointer-events-none",
27436
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27437
+ className: "absolute rounded-full w-150 h-125 top-[20%] left-[10%] blur-[150px]",
27438
+ style: { background: glow1 }
27439
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27440
+ className: "absolute rounded-full w-125 h-112.5 bottom-[15%] right-[10%] blur-[130px]",
27441
+ style: { background: glow2 }
27442
+ })]
27443
+ }),
27444
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27445
+ className: "absolute inset-0 pointer-events-none",
27446
+ style: { opacity: noiseOpacity },
27447
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
27448
+ className: "w-full h-full",
27449
+ xmlns: "http://www.w3.org/2000/svg",
27450
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("filter", {
27451
+ id: "tipNoise",
27452
+ x: "0%",
27453
+ y: "0%",
27454
+ width: "100%",
27455
+ height: "100%",
27456
+ children: [
27457
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feTurbulence", {
27458
+ type: "fractalNoise",
27459
+ baseFrequency: "0.8",
27460
+ numOctaves: "1",
27461
+ stitchTiles: "stitch",
27462
+ result: "noise"
27463
+ }),
27464
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feColorMatrix", {
27465
+ type: "saturate",
27466
+ values: "0",
27467
+ result: "gray"
27468
+ }),
27469
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("feComponentTransfer", { children: [
27470
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncR", {
27471
+ type: "discrete",
27472
+ tableValues: "0 1"
27473
+ }),
27474
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncG", {
27475
+ type: "discrete",
27476
+ tableValues: "0 1"
27477
+ }),
27478
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("feFuncB", {
27479
+ type: "discrete",
27480
+ tableValues: "0 1"
27481
+ })
27482
+ ] })
27483
+ ]
27484
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
27485
+ width: "100%",
27486
+ height: "100%",
27487
+ filter: "url(#tipNoise)"
27488
+ })]
27489
+ })
27490
+ }),
27491
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27492
+ className: "absolute inset-0 pointer-events-none overflow-hidden",
27493
+ children: [
27494
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27495
+ className: "absolute top-20 left-20 grid grid-cols-5 gap-2 opacity-30",
27496
+ children: Array.from({ length: 15 }).map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27497
+ className: "w-2 h-2 rounded-full",
27498
+ style: { backgroundColor: primaryColor }
27499
+ }, i))
27500
+ }),
27501
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27502
+ className: "absolute top-20 right-20 flex flex-col items-end gap-2 opacity-30",
27503
+ children: [
27504
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27505
+ className: "h-0.75 rounded-full w-20",
27506
+ style: { backgroundColor: secondaryColor }
27507
+ }),
27508
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27509
+ className: "h-0.75 rounded-full w-12",
27510
+ style: { backgroundColor: secondaryColor }
27511
+ }),
27512
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27513
+ className: "h-0.75 rounded-full w-6",
27514
+ style: { backgroundColor: secondaryColor }
27515
+ })
27516
+ ]
27517
+ }),
27518
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27519
+ className: "absolute bottom-40 left-10 flex gap-2 opacity-30",
27520
+ children: [
27521
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27522
+ className: "w-2 h-2 rounded-full",
27523
+ style: { backgroundColor: primaryColor }
27524
+ }),
27525
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27526
+ className: "w-2 h-2 rounded-full",
27527
+ style: { backgroundColor: primaryColor }
27528
+ }),
27529
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27530
+ className: "w-2 h-2 rounded-full",
27531
+ style: { backgroundColor: primaryColor }
27532
+ }),
27533
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27534
+ className: "w-2 h-2 rounded-full",
27535
+ style: { backgroundColor: primaryColor }
27536
+ })
27537
+ ]
27538
+ }),
27539
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27540
+ className: "absolute bottom-10 right-10 opacity-30",
27541
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
27542
+ width: "100",
27543
+ height: "100",
27544
+ viewBox: "0 0 100 100",
27545
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
27546
+ cx: "50",
27547
+ cy: "50",
27548
+ r: "44",
27549
+ fill: "none",
27550
+ stroke: primaryColor,
27551
+ strokeWidth: "2"
27552
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("circle", {
27553
+ cx: "50",
27554
+ cy: "50",
27555
+ r: "28",
27556
+ fill: "none",
27557
+ stroke: secondaryColor,
27558
+ strokeWidth: "2"
27559
+ })]
27560
+ })
27561
+ })
27562
+ ]
27563
+ }),
27564
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27565
+ className: "relative z-10 flex flex-col min-h-360 px-20 py-16",
27566
+ children: [
27567
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: "h-20" }),
27568
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27569
+ className: "flex items-center gap-5 mb-16",
27570
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27571
+ className: "rounded-full p-5 shrink-0",
27572
+ style: { background: "radial-gradient(circle, " + (isDark ? "rgba(255,255,255,0.1)" : "rgba(0,0,0,0.06)") + " 0%, transparent 70%)" },
27573
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowDownToLine, {
27574
+ className: "w-20 h-auto",
27575
+ style: { color: primaryColor }
27576
+ })
27577
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
27578
+ className: "text-4xl font-bold leading-tight",
27579
+ style: { color: accentColor },
27580
+ children: "保存原图"
27581
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
27582
+ className: "text-2xl mt-1",
27583
+ style: { color: mutedColor },
27584
+ children: "长按选择「保存原图」即可识别为实况照片"
27585
+ })] })]
27586
+ }),
27587
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27588
+ className: "flex-1 flex flex-col justify-center items-center gap-6",
27589
+ children: [
27590
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27591
+ className: "flex flex-col gap-6",
27592
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27593
+ className: "flex justify-center gap-6",
27594
+ children: supportedBrands.slice(0, 4).map((brand, idx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BrandCard, {
27595
+ brand,
27596
+ isDark
27597
+ }, idx))
27598
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27599
+ className: "flex justify-center gap-6",
27600
+ children: supportedBrands.slice(4).map((brand, idx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BrandCard, {
27601
+ brand,
27602
+ isDark
27603
+ }, idx))
27604
+ })]
27605
+ }),
27606
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27607
+ className: "w-200 h-px",
27608
+ style: { backgroundColor: isDark ? "rgba(255,255,255,0.08)" : "rgba(0,0,0,0.06)" }
27609
+ }),
27610
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27611
+ className: "flex justify-center gap-8",
27612
+ children: unsupportedBrands.map((brand, idx) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(UnsupportedBrandCard, {
27613
+ brand,
27614
+ isDark
27615
+ }, idx))
27616
+ })
27617
+ ]
27618
+ }),
27619
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27620
+ className: "flex items-start gap-4 mt-12 px-8 py-5 rounded-2xl",
27621
+ style: { backgroundColor: isDark ? "rgba(255,255,255,0.04)" : "rgba(0,0,0,0.03)" },
27622
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Info, {
27623
+ className: "w-6 h-6 shrink-0 mt-0.5",
27624
+ style: { color: primaryColor }
27625
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
27626
+ className: "text-xl leading-relaxed",
27627
+ style: { color: mutedColor },
27628
+ children: "所有支持 Google Motion Photo 标准的相册 App 均可识别实况照片"
27629
+ })]
27630
+ }),
27631
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
27632
+ className: "flex justify-end items-end mt-auto pt-12",
27633
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27634
+ className: "flex items-end gap-6",
27635
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
27636
+ className: "flex flex-col items-end",
27637
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27638
+ className: "text-xl font-bold tracking-[0.15em] uppercase",
27639
+ style: { color: mutedColor },
27640
+ children: "KARIN-PLUGIN"
27641
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
27642
+ className: "text-5xl font-black",
27643
+ style: { color: accentColor },
27644
+ children: "kkk"
27645
+ })]
27646
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GlowImage, {
27647
+ glowStrength: 1,
27648
+ blurRadius: 25,
27649
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(KkkLogo, {
27650
+ className: "w-auto h-20",
27651
+ color: accentColor
27652
+ })
27653
+ })]
27654
+ })
27655
+ })
27656
+ ]
27657
+ })
27658
+ ]
27659
+ });
27660
+ });
27661
+ LivePhotoTip.displayName = "LivePhotoTip";
27662
+ //#endregion
27159
27663
  //#region ../template/src/components/platforms/other/qrlogin.tsx
27160
27664
  /**
27161
27665
  * APP 扫码登录组件
@@ -28992,6 +29496,14 @@ var baseComponentConfigs = [
28992
29496
  enabled: true,
28993
29497
  componentPath: "platforms/other/qrlogin",
28994
29498
  exportName: "QrLogin"
29499
+ },
29500
+ {
29501
+ id: "live-photo-tip",
29502
+ name: "实况图提示",
29503
+ description: "实况照片保存提示图片",
29504
+ enabled: true,
29505
+ componentPath: "platforms/other/LivePhotoTip",
29506
+ exportName: "LivePhotoTip"
28995
29507
  }
28996
29508
  ]
28997
29509
  },
@@ -29171,6 +29683,7 @@ var componentConfigs = baseComponentConfigs.map((basePlatform) => {
29171
29683
  case "changelog": return createComponentConfig(baseComponent, { component: Changelog });
29172
29684
  case "version_warning": return createComponentConfig(baseComponent, { component: VersionWarning });
29173
29685
  case "qrlogin": return createComponentConfig(baseComponent, { component: QrLogin });
29686
+ case "live-photo-tip": return createComponentConfig(baseComponent, { component: LivePhotoTip });
29174
29687
  default: return createComponentConfig(baseComponent);
29175
29688
  }
29176
29689
  });
@@ -29627,6 +30140,7 @@ var ComponentRendererFactory = class {
29627
30140
  data: request.data,
29628
30141
  version: request.version,
29629
30142
  scale: request.scale,
30143
+ watermarkTextBitSize: request.watermarkTextBitSize,
29630
30144
  ...extraProps
29631
30145
  };
29632
30146
  if (templateName.includes("/")) props.subType = templateName.split("/")[1];
@@ -30530,7 +31044,6 @@ var createPosterPalettePlugin = () => {
30530
31044
  */
30531
31045
  /**
30532
31046
  * 将隐水印嵌入到 PNG 图片中
30533
- *
30534
31047
  * @param pngBytes - PNG 图片的 Buffer 或 Uint8Array
30535
31048
  * @param watermarkText - 要嵌入的水印文本
30536
31049
  * @returns 嵌入水印后的 PNG Buffer,失败返回 null
@@ -30538,12 +31051,17 @@ var createPosterPalettePlugin = () => {
30538
31051
  var embedWatermark = (pngBytes, watermarkText) => {
30539
31052
  try {
30540
31053
  const result = embedWatermarkToPngBytes(pngBytes instanceof Buffer ? pngBytes : Buffer.from(pngBytes), watermarkText);
30541
- return result instanceof Buffer ? result : Buffer.from(result);
30542
- } catch (error) {
30543
- logger.error("嵌入隐水印失败:", error);
31054
+ return result instanceof Buffer ? result : Buffer.from(result.buffer);
31055
+ } catch {
30544
31056
  return null;
30545
31057
  }
30546
31058
  };
31059
+ /**
31060
+ * 从 PNG 图片中提取隐水印文本
31061
+ *
31062
+ * @param pngBytes - PNG 图片的 Buffer 或 Uint8Array
31063
+ * @returns 提取出的水印文本,失败返回 null
31064
+ */
30547
31065
  //#endregion
30548
31066
  //#region src/module/utils/Render/index.ts
30549
31067
  /**
@@ -30571,6 +31089,12 @@ var Render = async (event, path$1, data) => {
30571
31089
  const lockedVersion = await db.get("kkk:update:lock");
30572
31090
  if (typeof lockedVersion === "string" && lockedVersion.length > 0) hasUpdate = isSemverGreater(lockedVersion, Root.pluginVersion);
30573
31091
  } catch {}
31092
+ const watermarkText = JSON.stringify({
31093
+ a: Date.now(),
31094
+ b: `Generated by karin-plugin-kkk v${Root.pluginVersion}, with source code open-sourced under the GPL-3.0 license`,
31095
+ c: `Sent by ${event?.bot?.account.selfId ?? "unknown"}|${event?.bot?.account.name ?? "unknown"}`
31096
+ });
31097
+ const watermarkTextBitSize = Buffer.byteLength(watermarkText, "utf8") * 8;
30574
31098
  const result = await reactServerRender({
30575
31099
  request: {
30576
31100
  templateType,
@@ -30586,6 +31110,7 @@ var Render = async (event, path$1, data) => {
30586
31110
  frameworkVersion: Root.karinVersion,
30587
31111
  hasUpdate
30588
31112
  },
31113
+ watermarkTextBitSize,
30589
31114
  data: {
30590
31115
  ...data,
30591
31116
  useDarkTheme: Common.useDarkTheme()
@@ -30607,7 +31132,7 @@ var Render = async (event, path$1, data) => {
30607
31132
  const renderResult = await render.render({
30608
31133
  name: `${Root.pluginName}/${templateType}`,
30609
31134
  file: result.htmlPath,
30610
- multiPage: Config.app.multiPageRender ? Config.app.multiPageHeight : false,
31135
+ multiPage: Config.app.multiPageRender && event.bot.adapter.name !== "QQ Official Bot" ? Config.app.multiPageHeight : false,
30611
31136
  selector: "#container",
30612
31137
  fullPage: false,
30613
31138
  type: "png",
@@ -30622,11 +31147,7 @@ var Render = async (event, path$1, data) => {
30622
31147
  const imageStats = [];
30623
31148
  for (const image of images) {
30624
31149
  const imageBuffer = Buffer.from(image, "base64");
30625
- const finalImageBuffer = embedWatermark(imageBuffer, JSON.stringify({
30626
- a: Date.now(),
30627
- b: `Generated by karin-plugin-kkk v${Root.pluginVersion}, with source code open-sourced under the GPL-3.0 license`,
30628
- c: `Sent by ${event?.bot?.account.selfId ?? "unknown"}|${event?.bot?.account.name ?? "unknown"}`
30629
- })) ?? imageBuffer;
31150
+ const finalImageBuffer = embedWatermark(imageBuffer, watermarkText) ?? imageBuffer;
30630
31151
  const metadata = getImageMetadata(finalImageBuffer);
30631
31152
  const dimensions = metadata.width && metadata.height ? `${metadata.width}x${metadata.height}` : "unknown";
30632
31153
  imageStats.push({
@@ -36590,13 +37111,11 @@ var Bilibili = class extends Base {
36590
37111
  imgArray.push(segment.image(imageUrl));
36591
37112
  }
36592
37113
  if (hasGeneratedLivePhoto) {
36593
- const tip = {
36594
- google: "Google 相册",
36595
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
36596
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
36597
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
36598
- }[Config.app.livePhotoSystem] || "Google 相册";
36599
- imgArray.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
37114
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
37115
+ title: "实况照片已生成",
37116
+ description: "保存原图到相册即可识别为实况图"
37117
+ });
37118
+ imgArray.push(...tipImg);
36600
37119
  }
36601
37120
  if (imgArray.length === 1) this.e.reply(imgArray[0]);
36602
37121
  if (imgArray.length > 1) {
@@ -38133,8 +38652,6 @@ var Bilibilipush = class extends Base {
38133
38652
  host_mid: data[dynamicId].host_mid,
38134
38653
  typeMode: "strict"
38135
38654
  });
38136
- let emojiDATA = await this.amagi.bilibili.fetcher.fetchEmojiList({ typeMode: "strict" });
38137
- emojiDATA = extractEmojisData(emojiDATA.data.data.packages);
38138
38655
  switch (data[dynamicId].dynamic_type) {
38139
38656
  /** 处理图文动态 */
38140
38657
  case DynamicType.DRAW:
@@ -38465,9 +38982,13 @@ var Bilibilipush = class extends Base {
38465
38982
  if (send_video) {
38466
38983
  let correctList;
38467
38984
  let videoSize = "";
38985
+ const videoInfo = await this.amagi.bilibili.fetcher.fetchVideoInfo({
38986
+ bvid: data[dynamicId].Dynamic_Data.modules.module_dynamic.major.archive.bvid,
38987
+ typeMode: "strict"
38988
+ });
38468
38989
  const playUrlData = await this.amagi.bilibili.fetcher.fetchVideoStreamUrl({
38469
38990
  avid: parseInt(data[dynamicId].Dynamic_Data.modules.module_dynamic.major.archive.aid),
38470
- cid: data[dynamicId].Dynamic_Data.modules.module_dynamic.major.archive.cid,
38991
+ cid: videoInfo.data.data.cid,
38471
38992
  typeMode: "strict"
38472
38993
  });
38473
38994
  /** 提取出视频流信息对象,并排除清晰度重复的视频流 */
@@ -38634,13 +39155,11 @@ var Bilibilipush = class extends Base {
38634
39155
  }
38635
39156
  }
38636
39157
  if (hasGeneratedLivePhoto) {
38637
- const tip = {
38638
- google: "Google 相册",
38639
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
38640
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
38641
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
38642
- }[Config.app.livePhotoSystem] || "Google 相册";
38643
- imgArray.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
39158
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
39159
+ title: "实况照片已生成",
39160
+ description: "保存原图到相册即可识别为实况图"
39161
+ });
39162
+ imgArray.push(...tipImg);
38644
39163
  }
38645
39164
  const forwardMsg = common.makeForward(imgArray, botId, bot.account.name);
38646
39165
  try {
@@ -38908,7 +39427,8 @@ var Bilibilipush = class extends Base {
38908
39427
  renderOpt,
38909
39428
  groupInfo: {
38910
39429
  groupId: groupInfo.groupId || "",
38911
- groupName: groupInfo.groupName || ""
39430
+ groupName: groupInfo.groupName || "",
39431
+ groupAvatar: groupInfo.avatar || ""
38912
39432
  }
38913
39433
  });
38914
39434
  await this.e.reply(img);
@@ -38923,23 +39443,6 @@ var br = (data) => {
38923
39443
  return data = data.replace(/\n/g, "<br>");
38924
39444
  };
38925
39445
  /**
38926
- * 处理并提取表情数据,返回一个包含表情名称和URL的对象数组。
38927
- * @param data 表情数据的数组,每个元素包含一个表情包的信息。
38928
- * @returns 返回一个对象数组,每个对象包含text(表情名称)和url(表情图片地址)属性。
38929
- */
38930
- var extractEmojisData = (data) => {
38931
- const emojisData = [];
38932
- data.forEach((packages) => {
38933
- packages.emote.forEach((emote) => {
38934
- emojisData.push({
38935
- text: emote.text,
38936
- url: emote.url
38937
- });
38938
- });
38939
- });
38940
- return emojisData;
38941
- };
38942
- /**
38943
39446
  * 判断标题是否有屏蔽词或屏蔽标签
38944
39447
  * @param PushItem 推送项
38945
39448
  * @returns 是否应该跳过推送
@@ -39832,13 +40335,11 @@ var DouYin = class DouYin extends Base {
39832
40335
  }
39833
40336
  }
39834
40337
  if (hasGeneratedLivePhoto) {
39835
- const tip = {
39836
- google: "Google 相册",
39837
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
39838
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
39839
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
39840
- }[Config.app.livePhotoSystem] || "Google 相册";
39841
- processedImages.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
40338
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
40339
+ title: "实况照片已生成",
40340
+ description: "保存原图到相册即可识别为实况图"
40341
+ });
40342
+ processedImages.push(...tipImg);
39842
40343
  }
39843
40344
  const Element = common.makeForward(processedImages, Config.app.fakeForward ? this.e.sender.userId : this.e.bot.account.selfId, Config.app.fakeForward ? this.e.sender.nick : this.e.bot.account.name);
39844
40345
  try {
@@ -39989,13 +40490,11 @@ var DouYin = class DouYin extends Base {
39989
40490
  }
39990
40491
  }
39991
40492
  if (hasGeneratedLivePhoto) {
39992
- const tip = {
39993
- google: "Google 相册",
39994
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
39995
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
39996
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
39997
- }[Config.app.livePhotoSystem] || "Google 相册";
39998
- images.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
40493
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
40494
+ title: "实况照片已生成",
40495
+ description: "保存原图到相册即可识别为实况图"
40496
+ });
40497
+ images.push(...tipImg);
39999
40498
  }
40000
40499
  const Element = common.makeForward(images, Config.app.fakeForward ? this.e.sender.userId : this.e.bot.account.selfId, Config.app.fakeForward ? this.e.sender.nick : this.e.bot.account.name);
40001
40500
  try {
@@ -40591,21 +41090,11 @@ var DouyinWorkMainType = /* @__PURE__ */ function(DouyinWorkMainType) {
40591
41090
  return DouyinWorkMainType;
40592
41091
  }({});
40593
41092
  /**
40594
- * 图文作品子类型
40595
- */
40596
- var DouyinImageSubType = /* @__PURE__ */ function(DouyinImageSubType) {
40597
- /** 图集(纯静态图片或包含 live 图) */
40598
- DouyinImageSubType["GALLERY"] = "gallery";
40599
- /** 合辑(图片+视频混合) */
40600
- DouyinImageSubType["COLLECTION"] = "collection";
40601
- return DouyinImageSubType;
40602
- }({});
40603
- /**
40604
41093
  * 从作品数据判断详细类型信息
40605
41094
  */
40606
41095
  function getWorkTypeInfo(data) {
40607
41096
  if (data.live_data) return {
40608
- mainType: DouyinWorkMainType.LIVE,
41097
+ mainType: "live",
40609
41098
  isVideo: false,
40610
41099
  isImage: false,
40611
41100
  isArticle: false,
@@ -40615,7 +41104,7 @@ function getWorkTypeInfo(data) {
40615
41104
  templatePath: "douyin/live"
40616
41105
  };
40617
41106
  if (data.aweme_type === 163 || data.article_info) return {
40618
- mainType: DouyinWorkMainType.ARTICLE,
41107
+ mainType: "article",
40619
41108
  isVideo: false,
40620
41109
  isImage: false,
40621
41110
  isArticle: true,
@@ -40625,21 +41114,21 @@ function getWorkTypeInfo(data) {
40625
41114
  templatePath: "douyin/article-work"
40626
41115
  };
40627
41116
  if (data.images && data.images.length > 0) {
40628
- const subType = data.is_slides === true ? DouyinImageSubType.COLLECTION : DouyinImageSubType.GALLERY;
41117
+ const subType = data.is_slides === true ? "collection" : "gallery";
40629
41118
  return {
40630
- mainType: DouyinWorkMainType.IMAGE,
41119
+ mainType: "image",
40631
41120
  subType,
40632
41121
  isVideo: false,
40633
41122
  isImage: true,
40634
41123
  isArticle: false,
40635
41124
  isLive: false,
40636
- isGallery: subType === DouyinImageSubType.GALLERY,
40637
- isCollection: subType === DouyinImageSubType.COLLECTION,
41125
+ isGallery: subType === "gallery",
41126
+ isCollection: subType === "collection",
40638
41127
  templatePath: "douyin/image-work"
40639
41128
  };
40640
41129
  }
40641
41130
  return {
40642
- mainType: DouyinWorkMainType.VIDEO,
41131
+ mainType: "video",
40643
41132
  isVideo: true,
40644
41133
  isImage: false,
40645
41134
  isArticle: false,
@@ -41390,13 +41879,11 @@ var DouYinpush = class extends Base {
41390
41879
  }
41391
41880
  }
41392
41881
  if (hasGeneratedLivePhoto) {
41393
- const tip = {
41394
- google: "Google 相册",
41395
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
41396
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
41397
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
41398
- }[Config.app.livePhotoSystem] || "Google 相册";
41399
- images.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
41882
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
41883
+ title: "实况照片已生成",
41884
+ description: "保存原图到相册即可识别为实况图"
41885
+ });
41886
+ images.push(...tipImg);
41400
41887
  }
41401
41888
  const bot = karin$1.getBot(botId);
41402
41889
  const Element = common.makeForward(images, botId, bot.account.name);
@@ -41515,13 +42002,11 @@ var DouYinpush = class extends Base {
41515
42002
  }
41516
42003
  }
41517
42004
  if (hasGeneratedLivePhoto) {
41518
- const tip = {
41519
- google: "Google 相册",
41520
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
41521
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
41522
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
41523
- }[Config.app.livePhotoSystem] || "Google 相册";
41524
- processedImages.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
42005
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
42006
+ title: "实况照片已生成",
42007
+ description: "保存原图到相册即可识别为实况图"
42008
+ });
42009
+ processedImages.push(...tipImg);
41525
42010
  }
41526
42011
  const bot = karin$1.getBot(botId);
41527
42012
  const Element = common.makeForward(processedImages, botId, bot.account.name);
@@ -41784,7 +42269,8 @@ var DouYinpush = class extends Base {
41784
42269
  renderOpt,
41785
42270
  groupInfo: {
41786
42271
  groupId: groupInfo.groupId || "",
41787
- groupName: groupInfo.groupName || ""
42272
+ groupName: groupInfo.groupName || "",
42273
+ groupAvatar: groupInfo.avatar || ""
41788
42274
  }
41789
42275
  });
41790
42276
  await this.e.reply(img);
@@ -42421,13 +42907,11 @@ var Xiaohongshu = class extends Base {
42421
42907
  processedImages.push(segment.image(imageUrl));
42422
42908
  }
42423
42909
  if (hasGeneratedLivePhoto) {
42424
- const tip = {
42425
- google: "Google 相册",
42426
- xiaomi: "小米相册(支持实况照片的任何版本)、Google 相册",
42427
- oppo: "OPPO 相册、小米相册(较新版本)、Google 相册",
42428
- huawei_honor: "华为/荣耀相册(理论可行但未实测)"
42429
- }[Config.app.livePhotoSystem] || "Google 相册";
42430
- processedImages.push(segment.text(`💡 提示:保存原图到 ${tip} 即可识别为实况图`));
42910
+ const tipImg = await Render(this.e, "other/live-photo-tip", {
42911
+ title: "实况照片已生成",
42912
+ description: "保存原图到相册即可识别为实况图"
42913
+ });
42914
+ processedImages.push(...tipImg);
42431
42915
  }
42432
42916
  const res = common.makeForward(processedImages, Config.app.fakeForward ? this.e.sender.userId : this.e.bot.account.selfId, Config.app.fakeForward ? this.e.sender.nick : this.e.bot.account.name);
42433
42917
  if (processedImages.length === 1) await this.e.reply(processedImages[0]);
@@ -43471,14 +43955,12 @@ var forcePush = karin$1.command(/#(抖音|B站)(全部)?强制推送/, handleFor
43471
43955
  var setdyPush = karin$1.command(/^#设置抖音推送/, handleSetDouyinPush, {
43472
43956
  name: "kkk-推送功能-设置",
43473
43957
  event: "message.group",
43474
- perm: Config.douyin.push.permission,
43475
- dsbAdapter: ["qqbot"]
43958
+ perm: Config.douyin.push.permission
43476
43959
  });
43477
43960
  var setbiliPush = karin$1.command(/^#设置[bB]站推送/, handleSetBilibiliPush, {
43478
43961
  name: "kkk-推送功能-设置",
43479
43962
  event: "message.group",
43480
- perm: Config.bilibili.push.permission,
43481
- dsbAdapter: ["qqbot"]
43963
+ perm: Config.bilibili.push.permission
43482
43964
  });
43483
43965
  var bilibiliPushList = karin$1.command(/^#?[bB]站推送列表$/, handleBilibiliPushList, {
43484
43966
  name: "kkk-推送功能-列表",
@@ -43496,7 +43978,6 @@ var testDouyinPush = karin$1.command(/^#测试抖音推送\s*(https?:\/\/[^\s]+)
43496
43978
  name: "kkk-推送功能-测试",
43497
43979
  event: "message.group",
43498
43980
  perm: Config.douyin.push.permission,
43499
- dsbAdapter: ["qqbot"],
43500
43981
  priority: -Infinity
43501
43982
  });
43502
43983
  var globalIgnore = karin$1.command(/^#kkk推送全局忽略/, handleGlobalIgnore, {
@@ -43939,7 +44420,7 @@ var getChangelogImage = async (ctx, props) => {
43939
44420
  remoteVersion: props.remoteVersion,
43940
44421
  lagVersionCount,
43941
44422
  buildTime,
43942
- share_url: `https://karin-plugin-kkk-docs.vercel.app/zh-CN/diff?old=${props.localVersion}&new=latest`
44423
+ share_url: `https://karin-plugin-kkk-docs.vercel.app/diff?old=${props.localVersion}&new=latest`
43943
44424
  }) || null;
43944
44425
  };
43945
44426
  //#endregion