sa2kit 1.6.69 → 1.6.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/festivalCard/core/index.d.mts +1 -1
  2. package/dist/festivalCard/core/index.d.ts +1 -1
  3. package/dist/festivalCard/index.d.mts +3 -3
  4. package/dist/festivalCard/index.d.ts +3 -3
  5. package/dist/festivalCard/index.js +161 -0
  6. package/dist/festivalCard/index.js.map +1 -1
  7. package/dist/festivalCard/index.mjs +160 -1
  8. package/dist/festivalCard/index.mjs.map +1 -1
  9. package/dist/festivalCard/miniapp/index.d.mts +3 -3
  10. package/dist/festivalCard/miniapp/index.d.ts +3 -3
  11. package/dist/festivalCard/miniapp/index.js +30 -0
  12. package/dist/festivalCard/miniapp/index.js.map +1 -1
  13. package/dist/festivalCard/miniapp/index.mjs +30 -0
  14. package/dist/festivalCard/miniapp/index.mjs.map +1 -1
  15. package/dist/festivalCard/routes/index.d.mts +44 -0
  16. package/dist/festivalCard/routes/index.d.ts +44 -0
  17. package/dist/festivalCard/routes/index.js +266 -0
  18. package/dist/festivalCard/routes/index.js.map +1 -0
  19. package/dist/festivalCard/routes/index.mjs +261 -0
  20. package/dist/festivalCard/routes/index.mjs.map +1 -0
  21. package/dist/festivalCard/server/index.d.mts +1 -1
  22. package/dist/festivalCard/server/index.d.ts +1 -1
  23. package/dist/festivalCard/web/index.d.mts +18 -4
  24. package/dist/festivalCard/web/index.d.ts +18 -4
  25. package/dist/festivalCard/web/index.js +161 -0
  26. package/dist/festivalCard/web/index.js.map +1 -1
  27. package/dist/festivalCard/web/index.mjs +160 -1
  28. package/dist/festivalCard/web/index.mjs.map +1 -1
  29. package/dist/{festivalCardService-uSg0oNuD.d.mts → festivalCardService-CgNBOjjO.d.mts} +3 -1
  30. package/dist/{festivalCardService-C0fhTezx.d.ts → festivalCardService-ClJiAP6P.d.ts} +3 -1
  31. package/dist/index.d.mts +3 -3
  32. package/dist/index.d.ts +3 -3
  33. package/dist/index.js +161 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +160 -1
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/{types-B-tjQTGi.d.mts → types-COyg0XDw.d.mts} +7 -1
  38. package/dist/{types-B-tjQTGi.d.ts → types-COyg0XDw.d.ts} +7 -1
  39. package/package.json +6 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/festivalCard/server/db.ts","../../../src/festivalCard/core/defaults.ts","../../../src/festivalCard/core/normalize.ts","../../../src/festivalCard/services/festivalCardService.ts","../../../src/festivalCard/routes/index.ts"],"names":["NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["import type { FestivalCardDbAdapter } from '../types';\n\nlet dbAdapter: FestivalCardDbAdapter | null = null;\n\nexport const initializeFestivalCardDb = (adapter: FestivalCardDbAdapter): void => {\n dbAdapter = adapter;\n};\n\nexport const getFestivalCardDb = (): FestivalCardDbAdapter | null => dbAdapter;\n","import type { FestivalCardConfig } from '../types';\n\nexport const DEFAULT_FESTIVAL_CARD_CONFIG: FestivalCardConfig = {\n id: 'default-festival-card',\n name: 'Holiday Card',\n theme: 'winter',\n coverTitle: 'Happy Holidays',\n coverSubtitle: 'Warm wishes for you',\n background: {\n colorA: '#0c1a34',\n colorB: '#1f4f8a',\n },\n backgroundMusic: {\n src: '',\n loop: true,\n autoPlay: false,\n volume: 0.5,\n },\n pages: [\n {\n id: 'page-1',\n title: '封面',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p1-text-1',\n type: 'text',\n x: 50,\n y: 20,\n content: '新年快乐',\n fontSize: 34,\n fontWeight: 700,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p1-text-2',\n type: 'text',\n x: 50,\n y: 36,\n content: '愿这一年平安喜乐',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#dbeafe',\n },\n {\n id: 'p1-image-1',\n type: 'image',\n x: 50,\n y: 68,\n width: 72,\n height: 42,\n src: 'https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 16,\n alt: 'holiday',\n },\n ],\n },\n {\n id: 'page-2',\n title: '祝福',\n background: { color: '#1a3766' },\n elements: [\n {\n id: 'p2-text-1',\n type: 'text',\n x: 50,\n y: 28,\n content: '愿你新岁:',\n fontSize: 28,\n fontWeight: 700,\n align: 'center',\n color: '#fef3c7',\n },\n {\n id: 'p2-text-2',\n type: 'text',\n x: 50,\n y: 42,\n content: '所得皆所期,所失亦无碍',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p2-text-3',\n type: 'text',\n x: 50,\n y: 55,\n content: '愿你的每一步都走向光亮',\n fontSize: 16,\n fontWeight: 400,\n align: 'center',\n color: '#dbeafe',\n },\n ],\n },\n {\n id: 'page-3',\n title: '落款',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p3-image-1',\n type: 'image',\n x: 50,\n y: 34,\n width: 60,\n height: 42,\n src: 'https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 14,\n alt: 'gift',\n },\n {\n id: 'p3-text-1',\n type: 'text',\n x: 50,\n y: 72,\n content: 'Best wishes, from SA2Kit',\n fontSize: 18,\n fontWeight: 600,\n align: 'center',\n color: '#f8fafc',\n },\n ],\n },\n ],\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG } from './defaults';\nimport type { FestivalCardConfig, FestivalCardPage } from '../types';\n\nconst ensurePage = (page: FestivalCardPage, index: number): FestivalCardPage => ({\n id: page.id || `page-${index + 1}`,\n title: page.title || `第 ${index + 1} 页`,\n elements: Array.isArray(page.elements) ? page.elements : [],\n background: page.background || {},\n});\n\nexport const normalizeFestivalCardConfig = (\n config?: Partial<FestivalCardConfig> | null\n): FestivalCardConfig => {\n const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;\n\n return {\n ...DEFAULT_FESTIVAL_CARD_CONFIG,\n ...config,\n background: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.background,\n ...(config?.background || {}),\n },\n backgroundMusic: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,\n ...(config?.backgroundMusic || {}),\n src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? '',\n },\n pages: pages.map(ensurePage),\n };\n};\n\nexport const resizeFestivalCardPages = (config: FestivalCardConfig, pageCount: number): FestivalCardConfig => {\n const safeCount = Math.max(1, Math.min(12, Math.floor(pageCount || 1)));\n const nextPages = [...config.pages];\n\n while (nextPages.length < safeCount) {\n const idx = nextPages.length;\n nextPages.push({\n id: `page-${idx + 1}`,\n title: `第 ${idx + 1} 页`,\n elements: [],\n background: {},\n });\n }\n\n return {\n ...config,\n pages: nextPages.slice(0, safeCount),\n };\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport { getFestivalCardDb } from '../server/db';\nimport type {\n FestivalCardConfig,\n FestivalCardConfigSummary,\n FestivalCardDbAdapter,\n FestivalCardServiceOptions,\n} from '../types';\n\nexport class FestivalCardService {\n private db: FestivalCardDbAdapter | null;\n\n constructor(options?: FestivalCardServiceOptions) {\n this.db = options?.db || getFestivalCardDb();\n }\n\n async listConfigs(): Promise<FestivalCardConfigSummary[]> {\n if (!this.db) {\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n if (this.db.listConfigs) {\n const list = await this.db.listConfigs();\n return list.length > 0\n ? list\n : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n async getConfig(cardId = 'default-festival-card'): Promise<FestivalCardConfig> {\n if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;\n const config = await this.db.getConfig(cardId);\n return normalizeFestivalCardConfig(config);\n }\n\n async saveConfig(cardId: string, config: FestivalCardConfig): Promise<FestivalCardConfig> {\n const normalized = normalizeFestivalCardConfig(config);\n if (!this.db) return normalized;\n await this.db.saveConfig(cardId, normalized);\n return normalized;\n }\n\n async deleteConfig(cardId: string): Promise<void> {\n if (!this.db?.deleteConfig) return;\n await this.db.deleteConfig(cardId);\n }\n}\n\nconst memoryStore = new Map<string, FestivalCardConfig>();\nconst defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card';\nif (!memoryStore.has(defaultId)) {\n memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);\n}\n\nexport const createInMemoryFestivalCardDb = (): FestivalCardDbAdapter => ({\n listConfigs() {\n return Promise.resolve(\n Array.from(memoryStore.entries()).map(([id, config]) => ({\n id,\n name: config.name || id,\n }))\n );\n },\n getConfig(id: string) {\n return Promise.resolve(memoryStore.get(id) || null);\n },\n saveConfig(id: string, config: FestivalCardConfig) {\n memoryStore.set(id, config);\n return Promise.resolve();\n },\n deleteConfig(id: string) {\n memoryStore.delete(id);\n return Promise.resolve();\n },\n});\n","import { NextResponse } from 'next/server';\nimport { initializeFestivalCardDb } from '../server/db';\nimport { FestivalCardService } from '../services';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardDbAdapter } from '../types';\nimport type { NextRequest } from 'next/server';\n\nexport interface FestivalCardRouteConfig {\n db?: FestivalCardDbAdapter;\n}\n\nconst createService = (config: FestivalCardRouteConfig) => {\n if (config.db) initializeFestivalCardDb(config.db);\n return new FestivalCardService({ db: config.db });\n};\n\nexport const createListFestivalCardsHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest) => {\n try {\n const data = await service.listConfigs();\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createGetFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n const card = await service.getConfig(context.params.id);\n return NextResponse.json({ success: true, data: card });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createUpsertFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (request: NextRequest, context: { params: { id: string } }) => {\n try {\n const body: unknown = await request.json();\n const payload =\n body && typeof body === 'object' && 'config' in body\n ? (body as { config?: unknown }).config\n : undefined;\n const normalized = normalizeFestivalCardConfig((payload || {}) as Partial<FestivalCardConfig>);\n const data = await service.saveConfig(context.params.id, normalized);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createDeleteFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n await service.deleteConfig(context.params.id);\n return NextResponse.json({ success: true });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n"]}
@@ -0,0 +1,261 @@
1
+ import { NextResponse } from 'next/server';
2
+
3
+ // src/festivalCard/routes/index.ts
4
+
5
+ // src/festivalCard/server/db.ts
6
+ var dbAdapter = null;
7
+ var initializeFestivalCardDb = (adapter) => {
8
+ dbAdapter = adapter;
9
+ };
10
+ var getFestivalCardDb = () => dbAdapter;
11
+
12
+ // src/festivalCard/core/defaults.ts
13
+ var DEFAULT_FESTIVAL_CARD_CONFIG = {
14
+ id: "default-festival-card",
15
+ name: "Holiday Card",
16
+ theme: "winter",
17
+ coverTitle: "Happy Holidays",
18
+ coverSubtitle: "Warm wishes for you",
19
+ background: {
20
+ colorA: "#0c1a34",
21
+ colorB: "#1f4f8a"
22
+ },
23
+ backgroundMusic: {
24
+ src: "",
25
+ loop: true,
26
+ autoPlay: false,
27
+ volume: 0.5
28
+ },
29
+ pages: [
30
+ {
31
+ id: "page-1",
32
+ title: "\u5C01\u9762",
33
+ background: { color: "#11284d" },
34
+ elements: [
35
+ {
36
+ id: "p1-text-1",
37
+ type: "text",
38
+ x: 50,
39
+ y: 20,
40
+ content: "\u65B0\u5E74\u5FEB\u4E50",
41
+ fontSize: 34,
42
+ fontWeight: 700,
43
+ align: "center",
44
+ color: "#f8fafc"
45
+ },
46
+ {
47
+ id: "p1-text-2",
48
+ type: "text",
49
+ x: 50,
50
+ y: 36,
51
+ content: "\u613F\u8FD9\u4E00\u5E74\u5E73\u5B89\u559C\u4E50",
52
+ fontSize: 18,
53
+ fontWeight: 500,
54
+ align: "center",
55
+ color: "#dbeafe"
56
+ },
57
+ {
58
+ id: "p1-image-1",
59
+ type: "image",
60
+ x: 50,
61
+ y: 68,
62
+ width: 72,
63
+ height: 42,
64
+ src: "https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80",
65
+ fit: "cover",
66
+ borderRadius: 16,
67
+ alt: "holiday"
68
+ }
69
+ ]
70
+ },
71
+ {
72
+ id: "page-2",
73
+ title: "\u795D\u798F",
74
+ background: { color: "#1a3766" },
75
+ elements: [
76
+ {
77
+ id: "p2-text-1",
78
+ type: "text",
79
+ x: 50,
80
+ y: 28,
81
+ content: "\u613F\u4F60\u65B0\u5C81\uFF1A",
82
+ fontSize: 28,
83
+ fontWeight: 700,
84
+ align: "center",
85
+ color: "#fef3c7"
86
+ },
87
+ {
88
+ id: "p2-text-2",
89
+ type: "text",
90
+ x: 50,
91
+ y: 42,
92
+ content: "\u6240\u5F97\u7686\u6240\u671F\uFF0C\u6240\u5931\u4EA6\u65E0\u788D",
93
+ fontSize: 18,
94
+ fontWeight: 500,
95
+ align: "center",
96
+ color: "#f8fafc"
97
+ },
98
+ {
99
+ id: "p2-text-3",
100
+ type: "text",
101
+ x: 50,
102
+ y: 55,
103
+ content: "\u613F\u4F60\u7684\u6BCF\u4E00\u6B65\u90FD\u8D70\u5411\u5149\u4EAE",
104
+ fontSize: 16,
105
+ fontWeight: 400,
106
+ align: "center",
107
+ color: "#dbeafe"
108
+ }
109
+ ]
110
+ },
111
+ {
112
+ id: "page-3",
113
+ title: "\u843D\u6B3E",
114
+ background: { color: "#11284d" },
115
+ elements: [
116
+ {
117
+ id: "p3-image-1",
118
+ type: "image",
119
+ x: 50,
120
+ y: 34,
121
+ width: 60,
122
+ height: 42,
123
+ src: "https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80",
124
+ fit: "cover",
125
+ borderRadius: 14,
126
+ alt: "gift"
127
+ },
128
+ {
129
+ id: "p3-text-1",
130
+ type: "text",
131
+ x: 50,
132
+ y: 72,
133
+ content: "Best wishes, from SA2Kit",
134
+ fontSize: 18,
135
+ fontWeight: 600,
136
+ align: "center",
137
+ color: "#f8fafc"
138
+ }
139
+ ]
140
+ }
141
+ ]
142
+ };
143
+
144
+ // src/festivalCard/core/normalize.ts
145
+ var ensurePage = (page, index) => ({
146
+ id: page.id || `page-${index + 1}`,
147
+ title: page.title || `\u7B2C ${index + 1} \u9875`,
148
+ elements: Array.isArray(page.elements) ? page.elements : [],
149
+ background: page.background || {}
150
+ });
151
+ var normalizeFestivalCardConfig = (config) => {
152
+ const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;
153
+ return {
154
+ ...DEFAULT_FESTIVAL_CARD_CONFIG,
155
+ ...config,
156
+ background: {
157
+ ...DEFAULT_FESTIVAL_CARD_CONFIG.background,
158
+ ...config?.background || {}
159
+ },
160
+ backgroundMusic: {
161
+ ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,
162
+ ...config?.backgroundMusic || {},
163
+ src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? ""
164
+ },
165
+ pages: pages.map(ensurePage)
166
+ };
167
+ };
168
+
169
+ // src/festivalCard/services/festivalCardService.ts
170
+ var FestivalCardService = class {
171
+ constructor(options) {
172
+ this.db = options?.db || getFestivalCardDb();
173
+ }
174
+ async listConfigs() {
175
+ if (!this.db) {
176
+ return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
177
+ }
178
+ if (this.db.listConfigs) {
179
+ const list = await this.db.listConfigs();
180
+ return list.length > 0 ? list : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
181
+ }
182
+ return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
183
+ }
184
+ async getConfig(cardId = "default-festival-card") {
185
+ if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;
186
+ const config = await this.db.getConfig(cardId);
187
+ return normalizeFestivalCardConfig(config);
188
+ }
189
+ async saveConfig(cardId, config) {
190
+ const normalized = normalizeFestivalCardConfig(config);
191
+ if (!this.db) return normalized;
192
+ await this.db.saveConfig(cardId, normalized);
193
+ return normalized;
194
+ }
195
+ async deleteConfig(cardId) {
196
+ if (!this.db?.deleteConfig) return;
197
+ await this.db.deleteConfig(cardId);
198
+ }
199
+ };
200
+ var memoryStore = /* @__PURE__ */ new Map();
201
+ var defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card";
202
+ if (!memoryStore.has(defaultId)) {
203
+ memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);
204
+ }
205
+
206
+ // src/festivalCard/routes/index.ts
207
+ var createService = (config) => {
208
+ if (config.db) initializeFestivalCardDb(config.db);
209
+ return new FestivalCardService({ db: config.db });
210
+ };
211
+ var createListFestivalCardsHandler = (config = {}) => {
212
+ const service = createService(config);
213
+ return async (_request) => {
214
+ try {
215
+ const data = await service.listConfigs();
216
+ return NextResponse.json({ success: true, data });
217
+ } catch (error) {
218
+ return NextResponse.json({ success: false, error: error.message }, { status: 500 });
219
+ }
220
+ };
221
+ };
222
+ var createGetFestivalCardHandler = (config = {}) => {
223
+ const service = createService(config);
224
+ return async (_request, context) => {
225
+ try {
226
+ const card = await service.getConfig(context.params.id);
227
+ return NextResponse.json({ success: true, data: card });
228
+ } catch (error) {
229
+ return NextResponse.json({ success: false, error: error.message }, { status: 500 });
230
+ }
231
+ };
232
+ };
233
+ var createUpsertFestivalCardHandler = (config = {}) => {
234
+ const service = createService(config);
235
+ return async (request, context) => {
236
+ try {
237
+ const body = await request.json();
238
+ const payload = body && typeof body === "object" && "config" in body ? body.config : void 0;
239
+ const normalized = normalizeFestivalCardConfig(payload || {});
240
+ const data = await service.saveConfig(context.params.id, normalized);
241
+ return NextResponse.json({ success: true, data });
242
+ } catch (error) {
243
+ return NextResponse.json({ success: false, error: error.message }, { status: 500 });
244
+ }
245
+ };
246
+ };
247
+ var createDeleteFestivalCardHandler = (config = {}) => {
248
+ const service = createService(config);
249
+ return async (_request, context) => {
250
+ try {
251
+ await service.deleteConfig(context.params.id);
252
+ return NextResponse.json({ success: true });
253
+ } catch (error) {
254
+ return NextResponse.json({ success: false, error: error.message }, { status: 500 });
255
+ }
256
+ };
257
+ };
258
+
259
+ export { createDeleteFestivalCardHandler, createGetFestivalCardHandler, createListFestivalCardsHandler, createUpsertFestivalCardHandler };
260
+ //# sourceMappingURL=index.mjs.map
261
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/festivalCard/server/db.ts","../../../src/festivalCard/core/defaults.ts","../../../src/festivalCard/core/normalize.ts","../../../src/festivalCard/services/festivalCardService.ts","../../../src/festivalCard/routes/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FestivalCardDbAdapter } from '../types';\n\nlet dbAdapter: FestivalCardDbAdapter | null = null;\n\nexport const initializeFestivalCardDb = (adapter: FestivalCardDbAdapter): void => {\n dbAdapter = adapter;\n};\n\nexport const getFestivalCardDb = (): FestivalCardDbAdapter | null => dbAdapter;\n","import type { FestivalCardConfig } from '../types';\n\nexport const DEFAULT_FESTIVAL_CARD_CONFIG: FestivalCardConfig = {\n id: 'default-festival-card',\n name: 'Holiday Card',\n theme: 'winter',\n coverTitle: 'Happy Holidays',\n coverSubtitle: 'Warm wishes for you',\n background: {\n colorA: '#0c1a34',\n colorB: '#1f4f8a',\n },\n backgroundMusic: {\n src: '',\n loop: true,\n autoPlay: false,\n volume: 0.5,\n },\n pages: [\n {\n id: 'page-1',\n title: '封面',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p1-text-1',\n type: 'text',\n x: 50,\n y: 20,\n content: '新年快乐',\n fontSize: 34,\n fontWeight: 700,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p1-text-2',\n type: 'text',\n x: 50,\n y: 36,\n content: '愿这一年平安喜乐',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#dbeafe',\n },\n {\n id: 'p1-image-1',\n type: 'image',\n x: 50,\n y: 68,\n width: 72,\n height: 42,\n src: 'https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 16,\n alt: 'holiday',\n },\n ],\n },\n {\n id: 'page-2',\n title: '祝福',\n background: { color: '#1a3766' },\n elements: [\n {\n id: 'p2-text-1',\n type: 'text',\n x: 50,\n y: 28,\n content: '愿你新岁:',\n fontSize: 28,\n fontWeight: 700,\n align: 'center',\n color: '#fef3c7',\n },\n {\n id: 'p2-text-2',\n type: 'text',\n x: 50,\n y: 42,\n content: '所得皆所期,所失亦无碍',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#f8fafc',\n },\n {\n id: 'p2-text-3',\n type: 'text',\n x: 50,\n y: 55,\n content: '愿你的每一步都走向光亮',\n fontSize: 16,\n fontWeight: 400,\n align: 'center',\n color: '#dbeafe',\n },\n ],\n },\n {\n id: 'page-3',\n title: '落款',\n background: { color: '#11284d' },\n elements: [\n {\n id: 'p3-image-1',\n type: 'image',\n x: 50,\n y: 34,\n width: 60,\n height: 42,\n src: 'https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 14,\n alt: 'gift',\n },\n {\n id: 'p3-text-1',\n type: 'text',\n x: 50,\n y: 72,\n content: 'Best wishes, from SA2Kit',\n fontSize: 18,\n fontWeight: 600,\n align: 'center',\n color: '#f8fafc',\n },\n ],\n },\n ],\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG } from './defaults';\nimport type { FestivalCardConfig, FestivalCardPage } from '../types';\n\nconst ensurePage = (page: FestivalCardPage, index: number): FestivalCardPage => ({\n id: page.id || `page-${index + 1}`,\n title: page.title || `第 ${index + 1} 页`,\n elements: Array.isArray(page.elements) ? page.elements : [],\n background: page.background || {},\n});\n\nexport const normalizeFestivalCardConfig = (\n config?: Partial<FestivalCardConfig> | null\n): FestivalCardConfig => {\n const pages = config?.pages && config.pages.length > 0 ? config.pages : DEFAULT_FESTIVAL_CARD_CONFIG.pages;\n\n return {\n ...DEFAULT_FESTIVAL_CARD_CONFIG,\n ...config,\n background: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.background,\n ...(config?.background || {}),\n },\n backgroundMusic: {\n ...DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic,\n ...(config?.backgroundMusic || {}),\n src: config?.backgroundMusic?.src ?? DEFAULT_FESTIVAL_CARD_CONFIG.backgroundMusic?.src ?? '',\n },\n pages: pages.map(ensurePage),\n };\n};\n\nexport const resizeFestivalCardPages = (config: FestivalCardConfig, pageCount: number): FestivalCardConfig => {\n const safeCount = Math.max(1, Math.min(12, Math.floor(pageCount || 1)));\n const nextPages = [...config.pages];\n\n while (nextPages.length < safeCount) {\n const idx = nextPages.length;\n nextPages.push({\n id: `page-${idx + 1}`,\n title: `第 ${idx + 1} 页`,\n elements: [],\n background: {},\n });\n }\n\n return {\n ...config,\n pages: nextPages.slice(0, safeCount),\n };\n};\n","import { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport { getFestivalCardDb } from '../server/db';\nimport type {\n FestivalCardConfig,\n FestivalCardConfigSummary,\n FestivalCardDbAdapter,\n FestivalCardServiceOptions,\n} from '../types';\n\nexport class FestivalCardService {\n private db: FestivalCardDbAdapter | null;\n\n constructor(options?: FestivalCardServiceOptions) {\n this.db = options?.db || getFestivalCardDb();\n }\n\n async listConfigs(): Promise<FestivalCardConfigSummary[]> {\n if (!this.db) {\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n if (this.db.listConfigs) {\n const list = await this.db.listConfigs();\n return list.length > 0\n ? list\n : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card', name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];\n }\n\n async getConfig(cardId = 'default-festival-card'): Promise<FestivalCardConfig> {\n if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;\n const config = await this.db.getConfig(cardId);\n return normalizeFestivalCardConfig(config);\n }\n\n async saveConfig(cardId: string, config: FestivalCardConfig): Promise<FestivalCardConfig> {\n const normalized = normalizeFestivalCardConfig(config);\n if (!this.db) return normalized;\n await this.db.saveConfig(cardId, normalized);\n return normalized;\n }\n\n async deleteConfig(cardId: string): Promise<void> {\n if (!this.db?.deleteConfig) return;\n await this.db.deleteConfig(cardId);\n }\n}\n\nconst memoryStore = new Map<string, FestivalCardConfig>();\nconst defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || 'default-festival-card';\nif (!memoryStore.has(defaultId)) {\n memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);\n}\n\nexport const createInMemoryFestivalCardDb = (): FestivalCardDbAdapter => ({\n listConfigs() {\n return Promise.resolve(\n Array.from(memoryStore.entries()).map(([id, config]) => ({\n id,\n name: config.name || id,\n }))\n );\n },\n getConfig(id: string) {\n return Promise.resolve(memoryStore.get(id) || null);\n },\n saveConfig(id: string, config: FestivalCardConfig) {\n memoryStore.set(id, config);\n return Promise.resolve();\n },\n deleteConfig(id: string) {\n memoryStore.delete(id);\n return Promise.resolve();\n },\n});\n","import { NextResponse } from 'next/server';\nimport { initializeFestivalCardDb } from '../server/db';\nimport { FestivalCardService } from '../services';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardDbAdapter } from '../types';\nimport type { NextRequest } from 'next/server';\n\nexport interface FestivalCardRouteConfig {\n db?: FestivalCardDbAdapter;\n}\n\nconst createService = (config: FestivalCardRouteConfig) => {\n if (config.db) initializeFestivalCardDb(config.db);\n return new FestivalCardService({ db: config.db });\n};\n\nexport const createListFestivalCardsHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest) => {\n try {\n const data = await service.listConfigs();\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createGetFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n const card = await service.getConfig(context.params.id);\n return NextResponse.json({ success: true, data: card });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createUpsertFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (request: NextRequest, context: { params: { id: string } }) => {\n try {\n const body: unknown = await request.json();\n const payload =\n body && typeof body === 'object' && 'config' in body\n ? (body as { config?: unknown }).config\n : undefined;\n const normalized = normalizeFestivalCardConfig((payload || {}) as Partial<FestivalCardConfig>);\n const data = await service.saveConfig(context.params.id, normalized);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n\nexport const createDeleteFestivalCardHandler = (config: FestivalCardRouteConfig = {}) => {\n const service = createService(config);\n return async (_request: NextRequest, context: { params: { id: string } }) => {\n try {\n await service.deleteConfig(context.params.id);\n return NextResponse.json({ success: true });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 500 });\n }\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { h as FestivalCardDbAdapter } from '../../types-B-tjQTGi.mjs';
1
+ import { i as FestivalCardDbAdapter } from '../../types-COyg0XDw.mjs';
2
2
 
3
3
  declare const initializeFestivalCardDb: (adapter: FestivalCardDbAdapter) => void;
4
4
  declare const getFestivalCardDb: () => FestivalCardDbAdapter | null;
@@ -1,4 +1,4 @@
1
- import { h as FestivalCardDbAdapter } from '../../types-B-tjQTGi.js';
1
+ import { i as FestivalCardDbAdapter } from '../../types-COyg0XDw.js';
2
2
 
3
3
  declare const initializeFestivalCardDb: (adapter: FestivalCardDbAdapter) => void;
4
4
  declare const getFestivalCardDb: () => FestivalCardDbAdapter | null;
@@ -1,7 +1,7 @@
1
1
  export { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig, resizeFestivalCardPages } from '../core/index.mjs';
2
- export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-uSg0oNuD.mjs';
3
- import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-B-tjQTGi.mjs';
4
- export { g as FestivalCardAudioConfig, h as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, i as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-B-tjQTGi.mjs';
2
+ export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-CgNBOjjO.mjs';
3
+ import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-COyg0XDw.mjs';
4
+ export { g as FestivalCardAudioConfig, h as FestivalCardConfigSummary, i as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, j as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-COyg0XDw.mjs';
5
5
  import React__default from 'react';
6
6
 
7
7
  interface FestivalCardBook3DProps {
@@ -10,12 +10,26 @@ interface FestivalCardBook3DProps {
10
10
  }
11
11
  declare const FestivalCardBook3D: React__default.FC<FestivalCardBook3DProps>;
12
12
 
13
+ interface FestivalCardConfigPageProps {
14
+ apiBase?: string;
15
+ cardId?: string;
16
+ mainPagePath?: string;
17
+ }
18
+ declare const FestivalCardConfigPage: React__default.FC<FestivalCardConfigPageProps>;
19
+
13
20
  interface FestivalCardConfigEditorProps {
14
21
  value: FestivalCardConfig;
15
22
  onChange: (config: FestivalCardConfig) => void;
16
23
  }
17
24
  declare const FestivalCardConfigEditor: React__default.FC<FestivalCardConfigEditorProps>;
18
25
 
26
+ interface FestivalCardManagedPageProps {
27
+ apiBase?: string;
28
+ cardId?: string;
29
+ configPagePath?: string;
30
+ }
31
+ declare const FestivalCardManagedPage: React__default.FC<FestivalCardManagedPageProps>;
32
+
19
33
  interface FestivalCardPageRendererProps {
20
34
  page: FestivalCardPage;
21
35
  }
@@ -28,4 +42,4 @@ interface FestivalCardStudioProps {
28
42
  }
29
43
  declare const FestivalCardStudio: React__default.FC<FestivalCardStudioProps>;
30
44
 
31
- export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
45
+ export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardConfigPage, FestivalCardManagedPage, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
@@ -1,7 +1,7 @@
1
1
  export { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig, resizeFestivalCardPages } from '../core/index.js';
2
- export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-C0fhTezx.js';
3
- import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-B-tjQTGi.js';
4
- export { g as FestivalCardAudioConfig, h as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, i as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-B-tjQTGi.js';
2
+ export { F as FestivalCardService, c as createInMemoryFestivalCardDb, u as useFestivalCardConfig } from '../../festivalCardService-ClJiAP6P.js';
3
+ import { F as FestivalCardConfig, f as FestivalCardPage } from '../../types-COyg0XDw.js';
4
+ export { g as FestivalCardAudioConfig, h as FestivalCardConfigSummary, i as FestivalCardDbAdapter, e as FestivalCardElement, b as FestivalCardElementBase, a as FestivalCardElementType, d as FestivalCardImageElement, j as FestivalCardServiceOptions, c as FestivalCardTextElement } from '../../types-COyg0XDw.js';
5
5
  import React__default from 'react';
6
6
 
7
7
  interface FestivalCardBook3DProps {
@@ -10,12 +10,26 @@ interface FestivalCardBook3DProps {
10
10
  }
11
11
  declare const FestivalCardBook3D: React__default.FC<FestivalCardBook3DProps>;
12
12
 
13
+ interface FestivalCardConfigPageProps {
14
+ apiBase?: string;
15
+ cardId?: string;
16
+ mainPagePath?: string;
17
+ }
18
+ declare const FestivalCardConfigPage: React__default.FC<FestivalCardConfigPageProps>;
19
+
13
20
  interface FestivalCardConfigEditorProps {
14
21
  value: FestivalCardConfig;
15
22
  onChange: (config: FestivalCardConfig) => void;
16
23
  }
17
24
  declare const FestivalCardConfigEditor: React__default.FC<FestivalCardConfigEditorProps>;
18
25
 
26
+ interface FestivalCardManagedPageProps {
27
+ apiBase?: string;
28
+ cardId?: string;
29
+ configPagePath?: string;
30
+ }
31
+ declare const FestivalCardManagedPage: React__default.FC<FestivalCardManagedPageProps>;
32
+
19
33
  interface FestivalCardPageRendererProps {
20
34
  page: FestivalCardPage;
21
35
  }
@@ -28,4 +42,4 @@ interface FestivalCardStudioProps {
28
42
  }
29
43
  declare const FestivalCardStudio: React__default.FC<FestivalCardStudioProps>;
30
44
 
31
- export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
45
+ export { FestivalCardBook3D, type FestivalCardBook3DProps, FestivalCardConfig, FestivalCardConfigEditor, FestivalCardConfigPage, FestivalCardManagedPage, FestivalCardPage, FestivalCardPageRenderer, FestivalCardStudio };
@@ -517,6 +517,8 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
517
517
  }
518
518
  ))))) : null);
519
519
  };
520
+
521
+ // src/festivalCard/components/FestivalCardStudio.tsx
520
522
  var FestivalCardStudio = ({ initialConfig, fetchConfig, onSave }) => {
521
523
  const { config, setConfig, loading, save, saving } = useFestivalCardConfig({
522
524
  initialConfig: normalizeFestivalCardConfig(initialConfig),
@@ -536,6 +538,133 @@ var FestivalCardStudio = ({ initialConfig, fetchConfig, onSave }) => {
536
538
  ) : null));
537
539
  };
538
540
 
541
+ // src/festivalCard/components/FestivalCardConfigPage.tsx
542
+ var FestivalCardConfigPage = ({
543
+ apiBase = "/api/festivalCard",
544
+ cardId,
545
+ mainPagePath = "/festivalCard"
546
+ }) => {
547
+ const [list, setList] = React3.useState([]);
548
+ const [selectedId, setSelectedId] = React3.useState(cardId || "default-festival-card");
549
+ const parseListResponse2 = (data) => {
550
+ if (!data || typeof data !== "object") return [];
551
+ const payload = data.data;
552
+ if (!Array.isArray(payload)) return [];
553
+ return payload.filter((item) => Boolean(item && typeof item === "object" && typeof item.id === "string")).map((item) => ({ id: item.id, name: item.name }));
554
+ };
555
+ const parseConfigResponse2 = (data) => {
556
+ if (!data || typeof data !== "object") return normalizeFestivalCardConfig();
557
+ const payload = data.data;
558
+ if (!payload || typeof payload !== "object") return normalizeFestivalCardConfig();
559
+ return normalizeFestivalCardConfig(payload);
560
+ };
561
+ const reloadList = React3.useCallback(async () => {
562
+ const response = await fetch(apiBase, { cache: "no-store" });
563
+ const data = await response.json();
564
+ setList(parseListResponse2(data));
565
+ }, [apiBase]);
566
+ React3.useEffect(() => {
567
+ void reloadList();
568
+ }, [reloadList]);
569
+ const fetchConfig = async () => {
570
+ const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: "no-store" });
571
+ const data = await response.json();
572
+ return parseConfigResponse2(data);
573
+ };
574
+ const saveConfig = async (config) => {
575
+ await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {
576
+ method: "PUT",
577
+ headers: { "Content-Type": "application/json" },
578
+ body: JSON.stringify({ config })
579
+ });
580
+ await reloadList();
581
+ };
582
+ const createNew = async () => {
583
+ const name = window.prompt("\u8BF7\u8F93\u5165\u65B0\u5361\u7247\u540D\u79F0");
584
+ if (!name) return;
585
+ const id = `festival-${Date.now()}`;
586
+ const config = normalizeFestivalCardConfig({
587
+ id,
588
+ name
589
+ });
590
+ await fetch(`${apiBase}/${encodeURIComponent(id)}`, {
591
+ method: "PUT",
592
+ headers: { "Content-Type": "application/json" },
593
+ body: JSON.stringify({ config })
594
+ });
595
+ setSelectedId(id);
596
+ await reloadList();
597
+ };
598
+ const mainLink = React3.useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);
599
+ return /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gap: 12 } }, /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "flex", gap: 10, alignItems: "center" } }, /* @__PURE__ */ React3__default.default.createElement("select", { value: selectedId, onChange: (event) => setSelectedId(event.target.value) }, list.map((item) => /* @__PURE__ */ React3__default.default.createElement("option", { key: item.id, value: item.id }, item.name || item.id))), /* @__PURE__ */ React3__default.default.createElement("button", { type: "button", onClick: () => void createNew() }, "\u65B0\u5EFA\u5361\u7247"), /* @__PURE__ */ React3__default.default.createElement("a", { href: mainLink, style: { color: "#2563eb", fontSize: 14 } }, "\u6253\u5F00\u4E3B\u9875\u9762")), /* @__PURE__ */ React3__default.default.createElement(FestivalCardStudio, { fetchConfig, onSave: saveConfig }));
600
+ };
601
+ var isSummary = (value) => {
602
+ if (!value || typeof value !== "object") return false;
603
+ return typeof value.id === "string";
604
+ };
605
+ var parseListResponse = (data) => {
606
+ if (!data || typeof data !== "object") return [];
607
+ const payload = data.data;
608
+ if (!Array.isArray(payload)) return [];
609
+ return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));
610
+ };
611
+ var parseConfigResponse = (data) => {
612
+ if (!data || typeof data !== "object") return null;
613
+ const payload = data.data;
614
+ if (!payload || typeof payload !== "object") return null;
615
+ if (!Array.isArray(payload.pages)) return null;
616
+ return payload;
617
+ };
618
+ var FestivalCardManagedPage = ({
619
+ apiBase = "/api/festivalCard",
620
+ cardId,
621
+ configPagePath = "/festivalCard/config"
622
+ }) => {
623
+ const [list, setList] = React3.useState([]);
624
+ const [currentCardId, setCurrentCardId] = React3.useState(cardId || "");
625
+ const [config, setConfig] = React3.useState(null);
626
+ const [loading, setLoading] = React3.useState(true);
627
+ React3.useEffect(() => {
628
+ const fetchList = async () => {
629
+ const response = await fetch(apiBase, { cache: "no-store" });
630
+ const data = await response.json();
631
+ const items = parseListResponse(data);
632
+ setList(items);
633
+ const first = items[0];
634
+ if (!currentCardId && first) {
635
+ setCurrentCardId(first.id);
636
+ }
637
+ };
638
+ void fetchList();
639
+ }, [apiBase, currentCardId]);
640
+ React3.useEffect(() => {
641
+ if (!currentCardId) return;
642
+ setLoading(true);
643
+ void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: "no-store" }).then((res) => res.json()).then((data) => setConfig(parseConfigResponse(data))).finally(() => setLoading(false));
644
+ }, [apiBase, currentCardId]);
645
+ const configLink = React3.useMemo(() => {
646
+ if (!currentCardId) return configPagePath;
647
+ return `${configPagePath}?cardId=${encodeURIComponent(currentCardId)}`;
648
+ }, [configPagePath, currentCardId]);
649
+ return /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gridTemplateColumns: "240px 1fr", gap: 14 } }, /* @__PURE__ */ React3__default.default.createElement("aside", { style: { borderRadius: 16, padding: 12, background: "#0f172a", color: "#e2e8f0" } }, /* @__PURE__ */ React3__default.default.createElement("div", { style: { fontSize: 14, marginBottom: 8 } }, "\u5361\u7247\u5217\u8868"), /* @__PURE__ */ React3__default.default.createElement("div", { style: { display: "grid", gap: 8 } }, list.map((item) => /* @__PURE__ */ React3__default.default.createElement(
650
+ "button",
651
+ {
652
+ key: item.id,
653
+ type: "button",
654
+ onClick: () => setCurrentCardId(item.id),
655
+ style: {
656
+ borderRadius: 8,
657
+ border: "1px solid #334155",
658
+ padding: "8px 10px",
659
+ textAlign: "left",
660
+ background: currentCardId === item.id ? "#1e293b" : "#0b1220",
661
+ color: "#e2e8f0"
662
+ }
663
+ },
664
+ item.name || item.id
665
+ ))), /* @__PURE__ */ React3__default.default.createElement("a", { href: configLink, style: { display: "inline-block", marginTop: 12, color: "#93c5fd", fontSize: 13 } }, "\u8FDB\u5165\u914D\u7F6E\u9875")), /* @__PURE__ */ React3__default.default.createElement("div", null, loading || !config ? /* @__PURE__ */ React3__default.default.createElement("div", null, "\u52A0\u8F7D\u4E2D...") : /* @__PURE__ */ React3__default.default.createElement(FestivalCardBook3D, { config })));
666
+ };
667
+
539
668
  // src/festivalCard/server/db.ts
540
669
  var dbAdapter = null;
541
670
  var getFestivalCardDb = () => dbAdapter;
@@ -545,6 +674,16 @@ var FestivalCardService = class {
545
674
  constructor(options) {
546
675
  this.db = options?.db || getFestivalCardDb();
547
676
  }
677
+ async listConfigs() {
678
+ if (!this.db) {
679
+ return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
680
+ }
681
+ if (this.db.listConfigs) {
682
+ const list = await this.db.listConfigs();
683
+ return list.length > 0 ? list : [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
684
+ }
685
+ return [{ id: DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card", name: DEFAULT_FESTIVAL_CARD_CONFIG.name }];
686
+ }
548
687
  async getConfig(cardId = "default-festival-card") {
549
688
  if (!this.db) return DEFAULT_FESTIVAL_CARD_CONFIG;
550
689
  const config = await this.db.getConfig(cardId);
@@ -556,21 +695,43 @@ var FestivalCardService = class {
556
695
  await this.db.saveConfig(cardId, normalized);
557
696
  return normalized;
558
697
  }
698
+ async deleteConfig(cardId) {
699
+ if (!this.db?.deleteConfig) return;
700
+ await this.db.deleteConfig(cardId);
701
+ }
559
702
  };
560
703
  var memoryStore = /* @__PURE__ */ new Map();
704
+ var defaultId = DEFAULT_FESTIVAL_CARD_CONFIG.id || "default-festival-card";
705
+ if (!memoryStore.has(defaultId)) {
706
+ memoryStore.set(defaultId, DEFAULT_FESTIVAL_CARD_CONFIG);
707
+ }
561
708
  var createInMemoryFestivalCardDb = () => ({
709
+ listConfigs() {
710
+ return Promise.resolve(
711
+ Array.from(memoryStore.entries()).map(([id, config]) => ({
712
+ id,
713
+ name: config.name || id
714
+ }))
715
+ );
716
+ },
562
717
  getConfig(id) {
563
718
  return Promise.resolve(memoryStore.get(id) || null);
564
719
  },
565
720
  saveConfig(id, config) {
566
721
  memoryStore.set(id, config);
567
722
  return Promise.resolve();
723
+ },
724
+ deleteConfig(id) {
725
+ memoryStore.delete(id);
726
+ return Promise.resolve();
568
727
  }
569
728
  });
570
729
 
571
730
  exports.DEFAULT_FESTIVAL_CARD_CONFIG = DEFAULT_FESTIVAL_CARD_CONFIG;
572
731
  exports.FestivalCardBook3D = FestivalCardBook3D;
573
732
  exports.FestivalCardConfigEditor = FestivalCardConfigEditor;
733
+ exports.FestivalCardConfigPage = FestivalCardConfigPage;
734
+ exports.FestivalCardManagedPage = FestivalCardManagedPage;
574
735
  exports.FestivalCardPageRenderer = FestivalCardPageRenderer;
575
736
  exports.FestivalCardService = FestivalCardService;
576
737
  exports.FestivalCardStudio = FestivalCardStudio;