@zhin.js/plugin-group-suite 1.1.4 → 1.1.6

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,4 +1,4 @@
1
1
  import type { AnalysisReportData } from "./analysis.js";
2
2
  export declare const ANALYSIS_REPORT_CANVAS: "#d8dce3";
3
- export declare function buildAnalysisReportHtml(data: AnalysisReportData): string;
3
+ export declare function buildAnalysisReportHtml(data: AnalysisReportData): Promise<string>;
4
4
  //# sourceMappingURL=analysis-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-card.d.ts","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQxD,eAAO,MAAM,sBAAsB,WAAoB,CAAC;AAUxD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAqExE"}
1
+ {"version":3,"file":"analysis-card.d.ts","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAQxD,eAAO,MAAM,sBAAsB,WAAoB,CAAC;AAUxD,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,MAAM,CAAC,CA8FjB"}
@@ -1,4 +1,5 @@
1
- import { BarChart, CardHeader, h, ProfileRow, QuoteCard, Row, Section, StatChip, TopicItem, } from "@zhin.js/satori";
1
+ import { jsx, renderToHtml } from "@zhin.js/jsx";
2
+ import { BarChart, CardHeader, ProfileRow, QuoteCard, Row, Section, StatChip, TopicItem, } from "@zhin.js/components";
2
3
  import { CARD_THEME, cardShell, elevatedCard, formatCount, } from "./card-layout.js";
3
4
  export const ANALYSIS_REPORT_CANVAS = CARD_THEME.canvas;
4
5
  const T = {
@@ -8,16 +9,16 @@ const T = {
8
9
  accentChars: CARD_THEME.accentDisk,
9
10
  accentHour: CARD_THEME.barWarn,
10
11
  };
11
- export function buildAnalysisReportHtml(data) {
12
+ export async function buildAnalysisReportHtml(data) {
12
13
  const { stats, channelName, days, startDate, endDate, llm } = data;
13
14
  const title = channelName ? `${channelName} · 群日常分析` : "群日常分析";
14
15
  const peakLabel = `${String(stats.mostActiveHour).padStart(2, "0")}:00`;
15
16
  const hourlyValues = Array.from({ length: 24 }, (_, hour) => stats.hourlyDistribution[hour] || 0);
16
17
  const llmBlocks = [
17
18
  llm?.topics?.length
18
- ? h(Section, {
19
+ ? jsx(Section, {
19
20
  title: "热门话题",
20
- children: llm.topics.map((topic, i) => h(TopicItem, {
21
+ children: llm.topics.map((topic, i) => jsx(TopicItem, {
21
22
  index: i + 1,
22
23
  title: topic.topic,
23
24
  summary: topic.summary,
@@ -25,9 +26,9 @@ export function buildAnalysisReportHtml(data) {
25
26
  })
26
27
  : "",
27
28
  llm?.quotes?.length
28
- ? h(Section, {
29
+ ? jsx(Section, {
29
30
  title: "金句精选",
30
- children: llm.quotes.map((quote, i) => h(QuoteCard, {
31
+ children: llm.quotes.map((quote, i) => jsx(QuoteCard, {
31
32
  index: i + 1,
32
33
  content: quote.content,
33
34
  author: quote.sender,
@@ -36,9 +37,9 @@ export function buildAnalysisReportHtml(data) {
36
37
  })
37
38
  : "",
38
39
  llm?.userTitles?.length
39
- ? h(Section, {
40
+ ? jsx(Section, {
40
41
  title: "用户画像",
41
- children: llm.userTitles.map((user, i) => h(ProfileRow, {
42
+ children: llm.userTitles.map((user, i) => jsx(ProfileRow, {
42
43
  index: i + 1,
43
44
  name: user.name,
44
45
  badge: user.title,
@@ -46,25 +47,41 @@ export function buildAnalysisReportHtml(data) {
46
47
  })),
47
48
  })
48
49
  : "",
49
- ].join("");
50
+ ];
50
51
  const body = elevatedCard([
51
- h(CardHeader, {
52
+ jsx(CardHeader, {
52
53
  title,
53
- meta: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
54
+ subtitle: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
54
55
  }),
55
- h(Row, {
56
+ jsx(Row, {
56
57
  children: [
57
- h(StatChip, { label: "消息", value: formatCount(stats.messageCount), accent: T.accentMsg }),
58
- h(StatChip, { label: "参与", value: formatCount(stats.participantCount), accent: T.accentPeople }),
59
- h(StatChip, { label: "字数", value: formatCount(stats.totalChars), accent: T.accentChars }),
60
- h(StatChip, { label: "活跃", value: peakLabel, accent: T.accentHour }),
58
+ jsx(StatChip, {
59
+ label: "消息",
60
+ value: formatCount(stats.messageCount),
61
+ accent: T.accentMsg,
62
+ }),
63
+ jsx(StatChip, {
64
+ label: "参与",
65
+ value: formatCount(stats.participantCount),
66
+ accent: T.accentPeople,
67
+ }),
68
+ jsx(StatChip, {
69
+ label: "字数",
70
+ value: formatCount(stats.totalChars),
71
+ accent: T.accentChars,
72
+ }),
73
+ jsx(StatChip, {
74
+ label: "活跃",
75
+ value: peakLabel,
76
+ accent: T.accentHour,
77
+ }),
61
78
  ],
62
79
  gap: 10,
63
80
  style: "margin-bottom:4px",
64
81
  }),
65
- h(Section, {
82
+ jsx(Section, {
66
83
  title: "每小时消息分布",
67
- children: h(BarChart, {
84
+ children: jsx(BarChart, {
68
85
  values: hourlyValues,
69
86
  peakIndex: stats.mostActiveHour,
70
87
  accent: T.accentMsg,
@@ -72,7 +89,7 @@ export function buildAnalysisReportHtml(data) {
72
89
  }),
73
90
  }),
74
91
  llmBlocks,
75
- ].join(""));
76
- return cardShell(body);
92
+ ]);
93
+ return renderToHtml(cardShell(body));
77
94
  }
78
95
  //# sourceMappingURL=analysis-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analysis-card.js","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analysis-card.js","sourceRoot":"","sources":["../src/analysis-card.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { formatCount, StatChip } from "@zhin.js/satori";
1
+ import { type JSXRenderable } from "@zhin.js/jsx";
2
+ import { formatCount, StatChip } from "@zhin.js/components";
2
3
  export declare const CARD_CANVAS: "#d8dce3";
3
4
  export declare const CARD_THEME: {
4
5
  readonly canvas: "#d8dce3";
@@ -8,6 +9,7 @@ export declare const CARD_THEME: {
8
9
  readonly text: "#111111";
9
10
  readonly textSecondary: "#3f3f46";
10
11
  readonly textMuted: "#a1a1aa";
12
+ readonly onAccent: "#ffffff";
11
13
  readonly barTrack: "rgba(0,0,0,0.06)";
12
14
  readonly barWarn: "#f59e0b";
13
15
  readonly barCrit: "#ef4444";
@@ -15,6 +17,7 @@ export declare const CARD_THEME: {
15
17
  readonly accentMem: "#3b82f6";
16
18
  readonly accentDisk: "#8b5cf6";
17
19
  readonly accentSwap: "#ec4899";
20
+ readonly accentRank: "#d97706";
18
21
  readonly divider: "rgba(0,0,0,0.06)";
19
22
  readonly shadowLg: "0 16px 40px rgba(15,23,42,0.14)";
20
23
  readonly shadowMd: "0 8px 22px rgba(15,23,42,0.10)";
@@ -22,6 +25,6 @@ export declare const CARD_THEME: {
22
25
  readonly shadowFloor: "rgba(15,23,42,0.07)";
23
26
  };
24
27
  export { formatCount, StatChip };
25
- export declare function elevatedCard(inner: string): string;
26
- export declare function cardShell(inner: string, width?: number): string;
28
+ export declare function elevatedCard(inner: JSXRenderable): import("@zhin.js/jsx").JSXElement;
29
+ export declare function cardShell(inner: JSXRenderable, width?: number): import("@zhin.js/jsx").JSXElement;
27
30
  //# sourceMappingURL=card-layout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-layout.d.ts","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,WAAW,EAEX,QAAQ,EACT,MAAM,iBAAiB,CAAC;AAEzB,eAAO,MAAM,WAAW,WAA4B,CAAC;AACrD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,CAE5D"}
1
+ {"version":3,"file":"card-layout.d.ts","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAIL,WAAW,EACX,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,WAA4B,CAAC;AACrD,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;CAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,wBAAgB,YAAY,CAAC,KAAK,EAAE,aAAa,qCAEhD;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,SAAM,qCAE1D"}
@@ -1,11 +1,12 @@
1
- import { Card, CardCanvas, DEFAULT_CARD_THEME, formatCount, h, StatChip, } from "@zhin.js/satori";
1
+ import { jsx } from "@zhin.js/jsx";
2
+ import { Card, CardCanvas, DEFAULT_CARD_THEME, formatCount, StatChip, } from "@zhin.js/components";
2
3
  export const CARD_CANVAS = DEFAULT_CARD_THEME.canvas;
3
4
  export const CARD_THEME = DEFAULT_CARD_THEME;
4
5
  export { formatCount, StatChip };
5
6
  export function elevatedCard(inner) {
6
- return h(Card, { children: inner });
7
+ return jsx(Card, { children: inner });
7
8
  }
8
9
  export function cardShell(inner, width = 540) {
9
- return h(CardCanvas, { children: inner, width });
10
+ return jsx(CardCanvas, { children: inner, width });
10
11
  }
11
12
  //# sourceMappingURL=card-layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-layout.js","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,CAAC,EACD,QAAQ,GACT,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,KAAK,GAAG,GAAG;IAClD,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC"}
1
+ {"version":3,"file":"card-layout.js","sourceRoot":"","sources":["../src/card-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAsB,MAAM,cAAc,CAAC;AACvD,OAAO,EACL,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,QAAQ,GACT,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,MAAM,CAAC;AACrD,MAAM,CAAC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAEjC,MAAM,UAAU,YAAY,CAAC,KAAoB;IAC/C,OAAO,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAoB,EAAE,KAAK,GAAG,GAAG;IACzD,OAAO,GAAG,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { MyStatsReportData, StatsRankReportData } from "./stats-data.js";
2
2
  export declare const STATS_REPORT_CANVAS: "#d8dce3";
3
- export declare function buildStatsRankHtml(data: StatsRankReportData): string;
4
- export declare function buildMyStatsHtml(data: MyStatsReportData): string;
3
+ export declare function buildStatsRankHtml(data: StatsRankReportData): Promise<string>;
4
+ export declare function buildMyStatsHtml(data: MyStatsReportData): Promise<string>;
5
5
  //# sourceMappingURL=stats-card.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats-card.d.ts","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,eAAO,MAAM,mBAAmB,WAAoB,CAAC;AAIrD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,MAAM,CAiCpE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAwBhE"}
1
+ {"version":3,"file":"stats-card.d.ts","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE9E,eAAO,MAAM,mBAAmB,WAAoB,CAAC;AAIrD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,MAAM,CAAC,CAwCjB"}
package/lib/stats-card.js CHANGED
@@ -1,61 +1,92 @@
1
- import { BarRow, CardHeader, EmptyState, h, Row, Section, StatChip } from "@zhin.js/satori";
1
+ import { jsx, renderToHtml } from "@zhin.js/jsx";
2
+ import { BarRow, CardHeader, EmptyState, Row, Section, StatChip, } from "@zhin.js/components";
2
3
  import { CARD_THEME, cardShell, elevatedCard, formatCount, } from "./card-layout.js";
3
4
  export const STATS_REPORT_CANVAS = CARD_THEME.canvas;
4
5
  const T = CARD_THEME;
5
- export function buildStatsRankHtml(data) {
6
+ export async function buildStatsRankHtml(data) {
6
7
  const meta = data.empty
7
8
  ? undefined
8
9
  : `共 ${data.participantCount} 人 · ${formatCount(data.totalMessages)} 条消息${data.myRank != null ? ` · 你第 ${data.myRank} 名` : ""}`;
9
10
  const body = elevatedCard(data.empty
10
11
  ? [
11
- h(CardHeader, { title: data.title }),
12
- h(EmptyState, { message: "暂无统计数据" }),
13
- ].join("")
12
+ jsx(CardHeader, { title: data.title }),
13
+ jsx(EmptyState, { message: "暂无统计数据" }),
14
+ ]
14
15
  : [
15
- h(CardHeader, { title: data.title, meta }),
16
- h(Row, {
16
+ jsx(CardHeader, { title: data.title, subtitle: meta }),
17
+ jsx(Row, {
17
18
  children: [
18
- h(StatChip, { label: "参与", value: formatCount(data.participantCount), accent: T.accentCpu }),
19
- h(StatChip, { label: "消息", value: formatCount(data.totalMessages), accent: T.accentMem }),
20
- data.myRank != null ? h(StatChip, { label: "我的排名", value: `#${data.myRank}`, accent: T.accentDisk }) : null,
19
+ jsx(StatChip, {
20
+ label: "参与",
21
+ value: formatCount(data.participantCount),
22
+ accent: T.accentCpu,
23
+ }),
24
+ jsx(StatChip, {
25
+ label: "消息",
26
+ value: formatCount(data.totalMessages),
27
+ accent: T.accentMem,
28
+ }),
29
+ data.myRank != null
30
+ ? jsx(StatChip, {
31
+ label: "我的排名",
32
+ value: `#${data.myRank}`,
33
+ accent: T.accentDisk,
34
+ })
35
+ : null,
21
36
  ],
22
37
  gap: 10,
23
38
  style: "margin-bottom:6px",
24
39
  }),
25
- h(Section, {
40
+ jsx(Section, {
26
41
  title: "排行榜",
27
- children: data.entries.map((entry) => h(BarRow, {
42
+ children: data.entries.map((entry) => jsx(BarRow, {
28
43
  rank: entry.rank,
29
44
  label: entry.name,
30
45
  value: `${entry.count} 条`,
31
46
  percent: entry.percent,
32
47
  })),
33
48
  }),
34
- ].join(""));
35
- return cardShell(body);
49
+ ]);
50
+ return renderToHtml(cardShell(body));
36
51
  }
37
- export function buildMyStatsHtml(data) {
52
+ export async function buildMyStatsHtml(data) {
38
53
  const body = elevatedCard([
39
- h(CardHeader, {
54
+ jsx(CardHeader, {
40
55
  title: data.userName,
41
- meta: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
56
+ subtitle: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
42
57
  }),
43
- h(Row, {
58
+ jsx(Row, {
44
59
  children: [
45
- h(StatChip, { label: "今日", value: formatCount(data.todayCount), accent: T.accentMem }),
46
- h(StatChip, { label: "本周", value: formatCount(data.weekCount), accent: T.accentCpu }),
60
+ jsx(StatChip, {
61
+ label: "今日",
62
+ value: formatCount(data.todayCount),
63
+ accent: T.accentMem,
64
+ }),
65
+ jsx(StatChip, {
66
+ label: "本周",
67
+ value: formatCount(data.weekCount),
68
+ accent: T.accentCpu,
69
+ }),
47
70
  ],
48
71
  gap: 10,
49
72
  style: "margin-bottom:10px",
50
73
  }),
51
- h(Row, {
74
+ jsx(Row, {
52
75
  children: [
53
- h(StatChip, { label: "本月", value: formatCount(data.monthCount), accent: T.barWarn }),
54
- h(StatChip, { label: "总计", value: formatCount(data.totalCount), accent: T.accentDisk }),
76
+ jsx(StatChip, {
77
+ label: "本月",
78
+ value: formatCount(data.monthCount),
79
+ accent: T.barWarn,
80
+ }),
81
+ jsx(StatChip, {
82
+ label: "总计",
83
+ value: formatCount(data.totalCount),
84
+ accent: T.accentDisk,
85
+ }),
55
86
  ],
56
87
  gap: 10,
57
88
  }),
58
- ].join(""));
59
- return cardShell(body);
89
+ ]);
90
+ return renderToHtml(cardShell(body));
60
91
  }
61
92
  //# sourceMappingURL=stats-card.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats-card.js","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stats-card.js","sourceRoot":"","sources":["../src/stats-card.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhin.js/plugin-group-suite",
3
- "version": "1.1.4",
3
+ "version": "1.1.6",
4
4
  "description": "Zhin.js 群运营套件 — slice-2 checkin/teach/stats + keywords (Plugin Runtime, in-memory)",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",
@@ -40,22 +40,23 @@
40
40
  },
41
41
  "license": "MIT",
42
42
  "dependencies": {
43
- "@zhin.js/core": "1.1.39",
44
- "@zhin.js/satori": "1.1.0",
45
- "@zhin.js/tool": "1.1.2",
46
- "@zhin.js/skill": "1.1.2"
43
+ "@zhin.js/components": "1.1.1",
44
+ "@zhin.js/core": "1.1.41",
45
+ "@zhin.js/jsx": "1.1.1",
46
+ "@zhin.js/skill": "1.1.4",
47
+ "@zhin.js/tool": "1.1.4"
47
48
  },
48
49
  "devDependencies": {
49
50
  "typescript": "^6.0.3",
50
51
  "vitest": "^4.1.10",
51
52
  "zod": "^4.4.3",
52
- "zhin.js": "1.1.4"
53
+ "zhin.js": "1.1.6"
53
54
  },
54
55
  "peerDependencies": {
55
56
  "zod": "^4.0.0",
56
- "@zhin.js/command": "^1.1.3",
57
- "@zhin.js/middleware": "^1.1.2",
58
- "zhin.js": "^1.1.4"
57
+ "@zhin.js/command": "^1.1.5",
58
+ "@zhin.js/middleware": "^1.1.4",
59
+ "zhin.js": "^1.1.6"
59
60
  },
60
61
  "peerDependenciesMeta": {
61
62
  "@zhin.js/command": {
@@ -1,14 +1,14 @@
1
+ import { jsx, renderToHtml } from "@zhin.js/jsx";
1
2
  import {
2
3
  BarChart,
3
4
  CardHeader,
4
- h,
5
5
  ProfileRow,
6
6
  QuoteCard,
7
7
  Row,
8
8
  Section,
9
9
  StatChip,
10
10
  TopicItem,
11
- } from "@zhin.js/satori";
11
+ } from "@zhin.js/components";
12
12
  import type { AnalysisReportData } from "./analysis.js";
13
13
  import {
14
14
  CARD_THEME,
@@ -27,65 +27,92 @@ const T = {
27
27
  accentHour: CARD_THEME.barWarn,
28
28
  } as const;
29
29
 
30
- export function buildAnalysisReportHtml(data: AnalysisReportData): string {
30
+ export async function buildAnalysisReportHtml(
31
+ data: AnalysisReportData
32
+ ): Promise<string> {
31
33
  const { stats, channelName, days, startDate, endDate, llm } = data;
32
34
  const title = channelName ? `${channelName} · 群日常分析` : "群日常分析";
33
35
  const peakLabel = `${String(stats.mostActiveHour).padStart(2, "0")}:00`;
34
- const hourlyValues = Array.from({ length: 24 }, (_, hour) => stats.hourlyDistribution[hour] || 0);
36
+ const hourlyValues = Array.from(
37
+ { length: 24 },
38
+ (_, hour) => stats.hourlyDistribution[hour] || 0
39
+ );
35
40
 
36
41
  const llmBlocks = [
37
42
  llm?.topics?.length
38
- ? h(Section, {
43
+ ? jsx(Section, {
39
44
  title: "热门话题",
40
- children: llm.topics.map((topic, i) => h(TopicItem, {
41
- index: i + 1,
42
- title: topic.topic,
43
- summary: topic.summary,
44
- })),
45
+ children: llm.topics.map((topic, i) =>
46
+ jsx(TopicItem, {
47
+ index: i + 1,
48
+ title: topic.topic,
49
+ summary: topic.summary,
50
+ })
51
+ ),
45
52
  })
46
53
  : "",
47
54
  llm?.quotes?.length
48
- ? h(Section, {
55
+ ? jsx(Section, {
49
56
  title: "金句精选",
50
- children: llm.quotes.map((quote, i) => h(QuoteCard, {
51
- index: i + 1,
52
- content: quote.content,
53
- author: quote.sender,
54
- reason: quote.reason,
55
- })),
57
+ children: llm.quotes.map((quote, i) =>
58
+ jsx(QuoteCard, {
59
+ index: i + 1,
60
+ content: quote.content,
61
+ author: quote.sender,
62
+ reason: quote.reason,
63
+ })
64
+ ),
56
65
  })
57
66
  : "",
58
67
  llm?.userTitles?.length
59
- ? h(Section, {
68
+ ? jsx(Section, {
60
69
  title: "用户画像",
61
- children: llm.userTitles.map((user, i) => h(ProfileRow, {
62
- index: i + 1,
63
- name: user.name,
64
- badge: user.title,
65
- reason: user.reason,
66
- })),
70
+ children: llm.userTitles.map((user, i) =>
71
+ jsx(ProfileRow, {
72
+ index: i + 1,
73
+ name: user.name,
74
+ badge: user.title,
75
+ reason: user.reason,
76
+ })
77
+ ),
67
78
  })
68
79
  : "",
69
- ].join("");
80
+ ];
70
81
 
71
82
  const body = elevatedCard([
72
- h(CardHeader, {
83
+ jsx(CardHeader, {
73
84
  title,
74
- meta: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
85
+ subtitle: `${startDate} 至 ${endDate} · 最近 ${days} 天`,
75
86
  }),
76
- h(Row, {
87
+ jsx(Row, {
77
88
  children: [
78
- h(StatChip, { label: "消息", value: formatCount(stats.messageCount), accent: T.accentMsg }),
79
- h(StatChip, { label: "参与", value: formatCount(stats.participantCount), accent: T.accentPeople }),
80
- h(StatChip, { label: "字数", value: formatCount(stats.totalChars), accent: T.accentChars }),
81
- h(StatChip, { label: "活跃", value: peakLabel, accent: T.accentHour }),
89
+ jsx(StatChip, {
90
+ label: "消息",
91
+ value: formatCount(stats.messageCount),
92
+ accent: T.accentMsg,
93
+ }),
94
+ jsx(StatChip, {
95
+ label: "参与",
96
+ value: formatCount(stats.participantCount),
97
+ accent: T.accentPeople,
98
+ }),
99
+ jsx(StatChip, {
100
+ label: "字数",
101
+ value: formatCount(stats.totalChars),
102
+ accent: T.accentChars,
103
+ }),
104
+ jsx(StatChip, {
105
+ label: "活跃",
106
+ value: peakLabel,
107
+ accent: T.accentHour,
108
+ }),
82
109
  ],
83
110
  gap: 10,
84
111
  style: "margin-bottom:4px",
85
112
  }),
86
- h(Section, {
113
+ jsx(Section, {
87
114
  title: "每小时消息分布",
88
- children: h(BarChart, {
115
+ children: jsx(BarChart, {
89
116
  values: hourlyValues,
90
117
  peakIndex: stats.mostActiveHour,
91
118
  accent: T.accentMsg,
@@ -93,7 +120,7 @@ export function buildAnalysisReportHtml(data: AnalysisReportData): string {
93
120
  }),
94
121
  }),
95
122
  llmBlocks,
96
- ].join(""));
123
+ ]);
97
124
 
98
- return cardShell(body);
125
+ return renderToHtml(cardShell(body));
99
126
  }
@@ -1,21 +1,21 @@
1
+ import { jsx, type JSXRenderable } from "@zhin.js/jsx";
1
2
  import {
2
3
  Card,
3
4
  CardCanvas,
4
5
  DEFAULT_CARD_THEME,
5
6
  formatCount,
6
- h,
7
7
  StatChip,
8
- } from "@zhin.js/satori";
8
+ } from "@zhin.js/components";
9
9
 
10
10
  export const CARD_CANVAS = DEFAULT_CARD_THEME.canvas;
11
11
  export const CARD_THEME = DEFAULT_CARD_THEME;
12
12
 
13
13
  export { formatCount, StatChip };
14
14
 
15
- export function elevatedCard(inner: string): string {
16
- return h(Card, { children: inner });
15
+ export function elevatedCard(inner: JSXRenderable) {
16
+ return jsx(Card, { children: inner });
17
17
  }
18
18
 
19
- export function cardShell(inner: string, width = 540): string {
20
- return h(CardCanvas, { children: inner, width });
19
+ export function cardShell(inner: JSXRenderable, width = 540) {
20
+ return jsx(CardCanvas, { children: inner, width });
21
21
  }
package/src/stats-card.ts CHANGED
@@ -1,4 +1,12 @@
1
- import { BarRow, CardHeader, EmptyState, h, Row, Section, StatChip } from "@zhin.js/satori";
1
+ import { jsx, renderToHtml } from "@zhin.js/jsx";
2
+ import {
3
+ BarRow,
4
+ CardHeader,
5
+ EmptyState,
6
+ Row,
7
+ Section,
8
+ StatChip,
9
+ } from "@zhin.js/components";
2
10
  import {
3
11
  CARD_THEME,
4
12
  cardShell,
@@ -11,63 +19,103 @@ export const STATS_REPORT_CANVAS = CARD_THEME.canvas;
11
19
 
12
20
  const T = CARD_THEME;
13
21
 
14
- export function buildStatsRankHtml(data: StatsRankReportData): string {
22
+ export async function buildStatsRankHtml(
23
+ data: StatsRankReportData
24
+ ): Promise<string> {
15
25
  const meta = data.empty
16
26
  ? undefined
17
- : `共 ${data.participantCount} 人 · ${formatCount(data.totalMessages)} 条消息${data.myRank != null ? ` · 你第 ${data.myRank} 名` : ""}`;
27
+ : `共 ${data.participantCount} 人 · ${formatCount(
28
+ data.totalMessages
29
+ )} 条消息${data.myRank != null ? ` · 你第 ${data.myRank} 名` : ""}`;
18
30
 
19
- const body = elevatedCard(data.empty
20
- ? [
21
- h(CardHeader, { title: data.title }),
22
- h(EmptyState, { message: "暂无统计数据" }),
23
- ].join("")
24
- : [
25
- h(CardHeader, { title: data.title, meta }),
26
- h(Row, {
27
- children: [
28
- h(StatChip, { label: "参与", value: formatCount(data.participantCount), accent: T.accentCpu }),
29
- h(StatChip, { label: "消息", value: formatCount(data.totalMessages), accent: T.accentMem }),
30
- data.myRank != null ? h(StatChip, { label: "我的排名", value: `#${data.myRank}`, accent: T.accentDisk }) : null,
31
- ],
32
- gap: 10,
33
- style: "margin-bottom:6px",
34
- }),
35
- h(Section, {
36
- title: "排行榜",
37
- children: data.entries.map((entry) => h(BarRow, {
38
- rank: entry.rank,
39
- label: entry.name,
40
- value: `${entry.count} 条`,
41
- percent: entry.percent,
42
- })),
43
- }),
44
- ].join(""));
31
+ const body = elevatedCard(
32
+ data.empty
33
+ ? [
34
+ jsx(CardHeader, { title: data.title }),
35
+ jsx(EmptyState, { message: "暂无统计数据" }),
36
+ ]
37
+ : [
38
+ jsx(CardHeader, { title: data.title, subtitle: meta }),
39
+ jsx(Row, {
40
+ children: [
41
+ jsx(StatChip, {
42
+ label: "参与",
43
+ value: formatCount(data.participantCount),
44
+ accent: T.accentCpu,
45
+ }),
46
+ jsx(StatChip, {
47
+ label: "消息",
48
+ value: formatCount(data.totalMessages),
49
+ accent: T.accentMem,
50
+ }),
51
+ data.myRank != null
52
+ ? jsx(StatChip, {
53
+ label: "我的排名",
54
+ value: `#${data.myRank}`,
55
+ accent: T.accentDisk,
56
+ })
57
+ : null,
58
+ ],
59
+ gap: 10,
60
+ style: "margin-bottom:6px",
61
+ }),
62
+ jsx(Section, {
63
+ title: "排行榜",
64
+ children: data.entries.map((entry) =>
65
+ jsx(BarRow, {
66
+ rank: entry.rank,
67
+ label: entry.name,
68
+ value: `${entry.count} 条`,
69
+ percent: entry.percent,
70
+ })
71
+ ),
72
+ }),
73
+ ]
74
+ );
45
75
 
46
- return cardShell(body);
76
+ return renderToHtml(cardShell(body));
47
77
  }
48
78
 
49
- export function buildMyStatsHtml(data: MyStatsReportData): string {
79
+ export async function buildMyStatsHtml(
80
+ data: MyStatsReportData
81
+ ): Promise<string> {
50
82
  const body = elevatedCard([
51
- h(CardHeader, {
83
+ jsx(CardHeader, {
52
84
  title: data.userName,
53
- meta: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
85
+ subtitle: `${data.scope}消息统计 · 活跃 ${data.activeDays} 天`,
54
86
  }),
55
- h(Row, {
87
+ jsx(Row, {
56
88
  children: [
57
- h(StatChip, { label: "今日", value: formatCount(data.todayCount), accent: T.accentMem }),
58
- h(StatChip, { label: "本周", value: formatCount(data.weekCount), accent: T.accentCpu }),
89
+ jsx(StatChip, {
90
+ label: "今日",
91
+ value: formatCount(data.todayCount),
92
+ accent: T.accentMem,
93
+ }),
94
+ jsx(StatChip, {
95
+ label: "本周",
96
+ value: formatCount(data.weekCount),
97
+ accent: T.accentCpu,
98
+ }),
59
99
  ],
60
100
  gap: 10,
61
101
  style: "margin-bottom:10px",
62
102
  }),
63
- h(Row, {
103
+ jsx(Row, {
64
104
  children: [
65
- h(StatChip, { label: "本月", value: formatCount(data.monthCount), accent: T.barWarn }),
66
- h(StatChip, { label: "总计", value: formatCount(data.totalCount), accent: T.accentDisk }),
105
+ jsx(StatChip, {
106
+ label: "本月",
107
+ value: formatCount(data.monthCount),
108
+ accent: T.barWarn,
109
+ }),
110
+ jsx(StatChip, {
111
+ label: "总计",
112
+ value: formatCount(data.totalCount),
113
+ accent: T.accentDisk,
114
+ }),
67
115
  ],
68
116
  gap: 10,
69
117
  }),
70
- ].join(""));
118
+ ]);
71
119
 
72
- return cardShell(body);
120
+ return renderToHtml(cardShell(body));
73
121
  }