sa2kit 1.6.89 → 1.6.90

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 (67) hide show
  1. package/dist/{booking-473Db8Bo.d.mts → booking-BH7HM0D0.d.mts} +1 -0
  2. package/dist/{booking-473Db8Bo.d.ts → booking-BH7HM0D0.d.ts} +1 -0
  3. package/dist/{bookingAdminService-DqQ7hEGw.d.ts → bookingAdminService-nr1vOp6I.d.ts} +1 -1
  4. package/dist/{bookingAdminService-SBX4JA_U.d.mts → bookingAdminService-pvk2MY1r.d.mts} +1 -1
  5. package/dist/{client-Bkn6mRI7.d.ts → client-UDQ7uMFA.d.ts} +1 -1
  6. package/dist/{client-exYn2Qla.d.mts → client-jOToHJEx.d.mts} +1 -1
  7. package/dist/festivalCard/index.js +114 -0
  8. package/dist/festivalCard/index.js.map +1 -1
  9. package/dist/festivalCard/index.mjs +115 -1
  10. package/dist/festivalCard/index.mjs.map +1 -1
  11. package/dist/festivalCard/web/index.js +114 -0
  12. package/dist/festivalCard/web/index.js.map +1 -1
  13. package/dist/festivalCard/web/index.mjs +115 -1
  14. package/dist/festivalCard/web/index.mjs.map +1 -1
  15. package/dist/{index-z15F7afa.d.mts → index-Bs06cHTn.d.mts} +2 -2
  16. package/dist/{index-BJpxvH7X.d.ts → index-C-oNM7Gv.d.ts} +1 -1
  17. package/dist/{index-XTV6IU-M.d.ts → index-CUab5EBV.d.ts} +2 -2
  18. package/dist/{index-Cum2EknK.d.mts → index-CYDb3AKs.d.mts} +1 -1
  19. package/dist/{index-DyxLpkmm.d.mts → index-DBB4ad0S.d.mts} +2 -2
  20. package/dist/{index-CdTIsNsy.d.ts → index-DBHwbXrv.d.ts} +2 -2
  21. package/dist/index.js +114 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/index.mjs +114 -0
  24. package/dist/index.mjs.map +1 -1
  25. package/dist/showmasterpiece/core.d.mts +3 -3
  26. package/dist/showmasterpiece/core.d.ts +3 -3
  27. package/dist/showmasterpiece/db.d.mts +2 -0
  28. package/dist/showmasterpiece/db.d.ts +2 -0
  29. package/dist/showmasterpiece/db.js +4 -2
  30. package/dist/showmasterpiece/db.js.map +1 -1
  31. package/dist/showmasterpiece/db.mjs +4 -2
  32. package/dist/showmasterpiece/db.mjs.map +1 -1
  33. package/dist/showmasterpiece/index.js +18 -2
  34. package/dist/showmasterpiece/index.js.map +1 -1
  35. package/dist/showmasterpiece/index.mjs +18 -2
  36. package/dist/showmasterpiece/index.mjs.map +1 -1
  37. package/dist/showmasterpiece/logic/index.d.mts +2 -2
  38. package/dist/showmasterpiece/logic/index.d.ts +2 -2
  39. package/dist/showmasterpiece/server/index.js +4 -2
  40. package/dist/showmasterpiece/server/index.js.map +1 -1
  41. package/dist/showmasterpiece/server/index.mjs +4 -2
  42. package/dist/showmasterpiece/server/index.mjs.map +1 -1
  43. package/dist/showmasterpiece/service/api/index.d.mts +1 -1
  44. package/dist/showmasterpiece/service/api/index.d.ts +1 -1
  45. package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
  46. package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
  47. package/dist/showmasterpiece/service/index.d.mts +6 -6
  48. package/dist/showmasterpiece/service/index.d.ts +6 -6
  49. package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
  50. package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
  51. package/dist/showmasterpiece/service/web/index.d.mts +4 -4
  52. package/dist/showmasterpiece/service/web/index.d.ts +4 -4
  53. package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
  54. package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
  55. package/dist/showmasterpiece/ui/miniapp/index.js +4 -3
  56. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  57. package/dist/showmasterpiece/ui/miniapp/index.mjs +4 -3
  58. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  59. package/dist/showmasterpiece/ui/web/index.js +18 -2
  60. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  61. package/dist/showmasterpiece/ui/web/index.mjs +18 -2
  62. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  63. package/dist/showmasterpiece/web/index.js +18 -2
  64. package/dist/showmasterpiece/web/index.js.map +1 -1
  65. package/dist/showmasterpiece/web/index.mjs +18 -2
  66. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  67. package/package.json +1 -1
@@ -342,6 +342,7 @@ interface MasterpiecesConfig {
342
342
  interface MiniappFloatingButtonsConfig {
343
343
  showCart: boolean;
344
344
  showHistory: boolean;
345
+ showAddToCart: boolean;
345
346
  }
346
347
  interface CategoryOption {
347
348
  name: string;
@@ -342,6 +342,7 @@ interface MasterpiecesConfig {
342
342
  interface MiniappFloatingButtonsConfig {
343
343
  showCart: boolean;
344
344
  showHistory: boolean;
345
+ showAddToCart: boolean;
345
346
  }
346
347
  interface CategoryOption {
347
348
  name: string;
@@ -1,4 +1,4 @@
1
- import { B as BookingStatus } from './booking-473Db8Bo.js';
1
+ import { B as BookingStatus } from './booking-BH7HM0D0.js';
2
2
 
3
3
  /**
4
4
  * ShowMasterpiece 模块 - 预订管理服务
@@ -1,4 +1,4 @@
1
- import { B as BookingStatus } from './booking-473Db8Bo.mjs';
1
+ import { B as BookingStatus } from './booking-BH7HM0D0.mjs';
2
2
 
3
3
  /**
4
4
  * ShowMasterpiece 模块 - 预订管理服务
@@ -1,4 +1,4 @@
1
- import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-473Db8Bo.js';
1
+ import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-BH7HM0D0.js';
2
2
  import { P as PopupConfig } from './popup-ClCAZtzk.js';
3
3
  import { CollectionOverview } from './showmasterpiece/service/api/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-473Db8Bo.mjs';
1
+ import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-BH7HM0D0.mjs';
2
2
  import { P as PopupConfig } from './popup-ClCAZtzk.mjs';
3
3
  import { CollectionOverview } from './showmasterpiece/service/api/index.mjs';
4
4
 
@@ -361,9 +361,24 @@ var createImageElement = (pageIndex) => ({
361
361
  });
362
362
  var FestivalCardConfigEditor = ({ value, onChange }) => {
363
363
  const [activePageIndex, setActivePageIndex] = React3.useState(0);
364
+ const [activeElementId, setActiveElementId] = React3.useState(null);
365
+ const [draggingElementId, setDraggingElementId] = React3.useState(null);
366
+ const previewRef = React3.useRef(null);
367
+ const dragStateRef = React3.useRef(null);
364
368
  const page = value.pages[activePageIndex];
365
369
  const canEditPage = Boolean(page);
366
370
  const pageOptions = React3.useMemo(() => value.pages.map((_, index) => index), [value.pages]);
371
+ const backgroundElement = React3.useMemo(
372
+ () => page?.elements.find(
373
+ (element) => element.type === "image" && Boolean(element.isBackground)
374
+ ),
375
+ [page]
376
+ );
377
+ const foregroundElements = React3.useMemo(
378
+ () => (page?.elements ?? []).filter((element) => !(element.type === "image" && element.isBackground)),
379
+ [page]
380
+ );
381
+ const clampPercent = (valueToClamp) => Math.max(0, Math.min(100, Number.isFinite(valueToClamp) ? valueToClamp : 0));
367
382
  const handlePageCountChange = (nextRaw) => {
368
383
  const next = Number.isFinite(nextRaw) ? Math.max(1, Math.min(12, Math.floor(nextRaw))) : value.pages.length;
369
384
  const resized = resizeFestivalCardPages(value, next);
@@ -400,6 +415,38 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
400
415
  pages: value.pages.map((p, index) => index === activePageIndex ? { ...p, ...patch } : p)
401
416
  });
402
417
  };
418
+ const moveElementWithPointer = (elementId, clientX, clientY, rect) => {
419
+ const bounds = rect || previewRef.current?.getBoundingClientRect();
420
+ if (!bounds || bounds.width <= 0 || bounds.height <= 0) return;
421
+ const x = clampPercent((clientX - bounds.left) / bounds.width * 100);
422
+ const y = clampPercent((clientY - bounds.top) / bounds.height * 100);
423
+ updateElement(elementId, { x, y });
424
+ };
425
+ const handleElementPointerDown = (event, elementId) => {
426
+ if (!previewRef.current) return;
427
+ event.preventDefault();
428
+ const rect = previewRef.current.getBoundingClientRect();
429
+ dragStateRef.current = {
430
+ pointerId: event.pointerId,
431
+ elementId,
432
+ rect
433
+ };
434
+ event.currentTarget.setPointerCapture(event.pointerId);
435
+ setActiveElementId(elementId);
436
+ setDraggingElementId(elementId);
437
+ moveElementWithPointer(elementId, event.clientX, event.clientY, rect);
438
+ };
439
+ const handlePreviewPointerMove = (event) => {
440
+ const dragState = dragStateRef.current;
441
+ if (!dragState || dragState.pointerId !== event.pointerId) return;
442
+ moveElementWithPointer(dragState.elementId, event.clientX, event.clientY, dragState.rect);
443
+ };
444
+ const endPointerDrag = (event) => {
445
+ const dragState = dragStateRef.current;
446
+ if (!dragState || dragState.pointerId !== event.pointerId) return;
447
+ dragStateRef.current = null;
448
+ setDraggingElementId(null);
449
+ };
403
450
  const numberFieldClassName = "w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100";
404
451
  return /* @__PURE__ */ React3__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React3__default.default.createElement("label", { className: "grid gap-1.5" }, /* @__PURE__ */ React3__default.default.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u9875\u9762\u6570\u91CF"), /* @__PURE__ */ React3__default.default.createElement(
405
452
  "input",
@@ -493,6 +540,73 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
493
540
  className: "rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white"
494
541
  },
495
542
  "+ \u56FE\u7247"
543
+ )), /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-3" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-2 flex items-center justify-between" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs font-semibold tracking-wide text-slate-500" }, "\u62D6\u62FD\u5B9A\u4F4D\uFF08\u76F4\u63A5\u62D6\u52A8\u5143\u7D20\u8C03\u6574 X / Y\uFF09"), /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs text-slate-500" }, draggingElementId ? "\u62D6\u62FD\u4E2D..." : "\u53EF\u62D6\u62FD")), /* @__PURE__ */ React3__default.default.createElement(
544
+ "div",
545
+ {
546
+ ref: previewRef,
547
+ onPointerMove: handlePreviewPointerMove,
548
+ onPointerUp: endPointerDrag,
549
+ onPointerCancel: endPointerDrag,
550
+ className: "relative aspect-[3/4] w-full touch-none overflow-hidden rounded-xl border border-slate-300 bg-slate-900",
551
+ style: {
552
+ backgroundColor: page?.background?.color || "#0f172a",
553
+ backgroundImage: backgroundElement ? `url(${backgroundElement.src})` : page?.background?.image ? `url(${page.background.image})` : void 0,
554
+ backgroundSize: "cover",
555
+ backgroundPosition: "center"
556
+ }
557
+ },
558
+ /* @__PURE__ */ React3__default.default.createElement("div", { className: "absolute inset-0 bg-slate-950/20" }),
559
+ foregroundElements.map((element) => {
560
+ const isActive = activeElementId === element.id;
561
+ const isDragging = draggingElementId === element.id;
562
+ return /* @__PURE__ */ React3__default.default.createElement(
563
+ "div",
564
+ {
565
+ key: element.id,
566
+ role: "button",
567
+ tabIndex: 0,
568
+ onPointerDown: (event) => handleElementPointerDown(event, element.id),
569
+ onClick: () => setActiveElementId(element.id),
570
+ className: `absolute select-none rounded-md ${isDragging ? "cursor-grabbing" : "cursor-grab"} ${isActive ? "ring-2 ring-sky-300" : "ring-1 ring-white/40"}`,
571
+ style: {
572
+ left: `${element.x}%`,
573
+ top: `${element.y}%`,
574
+ width: `${element.width ?? 70}%`,
575
+ height: element.height ? `${element.height}%` : void 0,
576
+ transform: "translate(-50%, -50%)",
577
+ zIndex: isActive ? 4 : 2
578
+ }
579
+ },
580
+ element.type === "text" ? /* @__PURE__ */ React3__default.default.createElement(
581
+ "div",
582
+ {
583
+ className: "w-full rounded-md bg-black/20 px-2 py-1",
584
+ style: {
585
+ color: element.color || "#f8fafc",
586
+ fontSize: element.fontSize || 18,
587
+ fontWeight: element.fontWeight || 500,
588
+ fontFamily: element.fontFamily || "inherit",
589
+ textAlign: element.align || "left",
590
+ lineHeight: 1.35,
591
+ whiteSpace: "pre-wrap"
592
+ }
593
+ },
594
+ element.content || "\u6587\u672C"
595
+ ) : /* @__PURE__ */ React3__default.default.createElement(
596
+ "img",
597
+ {
598
+ src: element.src,
599
+ alt: element.alt || "festival-card-image",
600
+ draggable: false,
601
+ className: "h-full w-full pointer-events-none",
602
+ style: {
603
+ objectFit: element.fit || "cover",
604
+ borderRadius: element.borderRadius || 0
605
+ }
606
+ }
607
+ )
608
+ );
609
+ })
496
610
  )), /* @__PURE__ */ React3__default.default.createElement("div", { className: "grid max-h-[340px] gap-2.5 overflow-auto pr-1" }, (page?.elements ?? []).map((element) => /* @__PURE__ */ React3__default.default.createElement("div", { key: element.id, className: "rounded-xl border border-slate-200 bg-slate-50 p-3" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-2 flex items-center justify-between" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs font-semibold tracking-wide text-slate-500" }, element.type.toUpperCase()), /* @__PURE__ */ React3__default.default.createElement(
497
611
  "button",
498
612
  {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/festivalCard/core/defaults.ts","../../src/festivalCard/core/normalize.ts","../../src/festivalCard/hooks/useFestivalCardConfig.ts","../../src/festivalCard/components/FestivalCardPageRenderer.tsx","../../src/festivalCard/components/FestivalCardBook3D.tsx","../../src/festivalCard/components/FestivalCardConfigEditor.tsx","../../src/festivalCard/components/FestivalCardStudio.tsx","../../src/festivalCard/components/FestivalCardConfigPage.tsx","../../src/festivalCard/components/FestivalCardManagedPage.tsx","../../src/festivalCard/server/db.ts","../../src/festivalCard/services/festivalCardService.ts"],"names":["useState","useEffect","useCallback","useMemo","React","parseListResponse","parseConfigResponse"],"mappings":"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","file":"index.js","sourcesContent":["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 isBackground: false,\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 isBackground: false,\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","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\n\ninterface UseFestivalCardConfigOptions {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const useFestivalCardConfig = (options?: UseFestivalCardConfigOptions) => {\n const [config, setConfig] = useState<FestivalCardConfig>(() =>\n normalizeFestivalCardConfig(options?.initialConfig || DEFAULT_FESTIVAL_CARD_CONFIG)\n );\n const [loading, setLoading] = useState(Boolean(options?.fetchConfig));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n const fetchConfig = options?.fetchConfig;\n if (!fetchConfig) return;\n\n let active = true;\n void fetchConfig()\n .then((value) => {\n if (!active) return;\n setConfig(normalizeFestivalCardConfig(value));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [options?.fetchConfig]);\n\n const save = useCallback(async () => {\n const onSave = options?.onSave;\n if (!onSave) return;\n setSaving(true);\n try {\n await onSave(config);\n } finally {\n setSaving(false);\n }\n }, [config, options?.onSave]);\n\n return useMemo(\n () => ({\n config,\n setConfig,\n loading,\n saving,\n save,\n }),\n [config, loading, save, saving]\n );\n};\n","'use client';\n\nimport React from 'react';\nimport type { FestivalCardElement, FestivalCardPage } from '../types';\n\nconst elementStyle = (element: FestivalCardElement): React.CSSProperties => ({\n position: 'absolute',\n zIndex: 2,\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n});\n\nconst renderElement = (element: FestivalCardElement) => {\n if (element.type === 'text') {\n return (\n <div\n key={element.id}\n style={{\n ...elementStyle(element),\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n fontFamily: element.fontFamily || 'inherit',\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n );\n }\n\n return (\n <img\n key={element.id}\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n style={{\n ...elementStyle(element),\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n );\n};\n\ninterface FestivalCardPageRendererProps {\n page: FestivalCardPage;\n}\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({ page }) => {\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n\n return (\n <div\n className=\"relative h-full w-full overflow-hidden rounded-2xl\"\n style={{\n backgroundColor: page.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map(renderElement)}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n}\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({ config, className }) => {\n const [currentPage, setCurrentPage] = useState(0);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n\n return (\n <div className={className}>\n <div className=\"w-full min-h-screen px-0 py-4\">\n <div className=\"mx-auto w-full text-center text-slate-100\">\n <h3 className=\"mb-3 text-lg font-semibold\">{normalized.coverTitle || 'Festival Card'}</h3>\n </div>\n\n <div className=\"mx-auto w-full\">\n <div className=\"relative h-[calc(100vh-170px)] min-h-[460px]\">\n {pages.map((page, index) => (\n <div\n key={page.id}\n className=\"absolute inset-0 transition-opacity duration-500 ease-out\"\n style={{\n opacity: index === currentPage ? 1 : 0,\n pointerEvents: index === currentPage ? 'auto' : 'none',\n }}\n >\n <FestivalCardPageRenderer page={page} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-4 flex justify-center gap-3\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n className=\"rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 上一页\n </button>\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setCurrentPage((p) => Math.min(pages.length - 1, p + 1))}\n className=\"rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 下一页\n </button>\n </div>\n </div>\n\n {normalized.backgroundMusic?.src ? (\n <audio\n src={normalized.backgroundMusic.src}\n autoPlay={normalized.backgroundMusic.autoPlay}\n loop={normalized.backgroundMusic.loop}\n controls\n className=\"mt-3 w-full\"\n />\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { resizeFestivalCardPages } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\n\ninterface FestivalCardConfigEditorProps {\n value: FestivalCardConfig;\n onChange: (config: FestivalCardConfig) => void;\n}\n\nconst createTextElement = (pageIndex: number): FestivalCardElement => ({\n id: `text-${Date.now()}-${pageIndex}`,\n type: 'text',\n x: 50,\n y: 50,\n width: 70,\n content: '请输入文字',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#ffffff',\n fontFamily: 'inherit',\n});\n\nconst createImageElement = (pageIndex: number): FestivalCardElement => ({\n id: `image-${Date.now()}-${pageIndex}`,\n type: 'image',\n x: 50,\n y: 50,\n width: 60,\n height: 40,\n src: 'https://images.unsplash.com/photo-1482517967863-00e15c9b44be?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 12,\n});\n\nexport const FestivalCardConfigEditor: React.FC<FestivalCardConfigEditorProps> = ({ value, onChange }) => {\n const [activePageIndex, setActivePageIndex] = useState(0);\n const page = value.pages[activePageIndex];\n const canEditPage = Boolean(page);\n const pageOptions = useMemo(() => value.pages.map((_, index) => index), [value.pages]);\n\n const handlePageCountChange = (nextRaw: number) => {\n const next = Number.isFinite(nextRaw) ? Math.max(1, Math.min(12, Math.floor(nextRaw))) : value.pages.length;\n const resized = resizeFestivalCardPages(value, next);\n onChange(resized);\n if (activePageIndex > resized.pages.length - 1) {\n setActivePageIndex(resized.pages.length - 1);\n }\n };\n\n const updateElement = (elementId: string, patch: Partial<FestivalCardElement>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.map((el) => (el.id === elementId ? { ...el, ...patch } as FestivalCardElement : el)),\n }\n : p\n ),\n });\n };\n\n const removeElement = (elementId: string) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.filter((el) => el.id !== elementId),\n }\n : p\n ),\n });\n };\n\n const updatePage = (patch: Partial<FestivalCardConfig['pages'][number]>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, index) => (index === activePageIndex ? { ...p, ...patch } : p)),\n });\n };\n\n const numberFieldClassName =\n 'w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100';\n\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm\">\n <div className=\"grid gap-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面数量</span>\n <input\n type=\"number\"\n min={1}\n max={12}\n value={value.pages.length}\n onChange={(event) => handlePageCountChange(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">背景音乐 URL</span>\n <input\n type=\"url\"\n value={value.backgroundMusic?.src || ''}\n onChange={(event) =>\n onChange({\n ...value,\n backgroundMusic: {\n ...value.backgroundMusic,\n src: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面标题</span>\n <input\n type=\"text\"\n value={page?.title || ''}\n onChange={(event) => updatePage({ title: event.target.value })}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景色</span>\n <input\n type=\"color\"\n value={page?.background?.color || '#0f172a'}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n color: event.target.value,\n },\n })\n }\n className=\"h-10 w-full rounded-lg border border-slate-300 bg-white p-1\"\n />\n </label>\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景图 URL</span>\n <input\n type=\"url\"\n value={page?.background?.image || ''}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n image: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n </div>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">编辑页面</span>\n <select\n value={activePageIndex}\n onChange={(event) => setActivePageIndex(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {pageOptions.map((index) => (\n <option key={index} value={index}>\n 第 {index + 1} 页\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {canEditPage ? (\n <div className=\"mt-4\">\n <div className=\"mb-3 flex gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\"\n >\n + 文字\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white\"\n >\n + 图片\n </button>\n </div>\n\n <div className=\"grid max-h-[340px] gap-2.5 overflow-auto pr-1\">\n {(page?.elements ?? []).map((element) => (\n <div key={element.id} className=\"rounded-xl border border-slate-200 bg-slate-50 p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">{element.type.toUpperCase()}</div>\n <button\n type=\"button\"\n onClick={() => removeElement(element.id)}\n className=\"rounded-md border border-rose-300 bg-rose-50 px-2 py-1 text-xs font-medium text-rose-700\"\n >\n 删除\n </button>\n </div>\n {element.type === 'text' ? (\n <div className=\"grid gap-2\">\n <textarea\n value={element.content}\n onChange={(event) => updateElement(element.id, { content: event.target.value })}\n rows={3}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 70}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字号(px)\n <input\n type=\"number\"\n value={element.fontSize ?? 18}\n onChange={(event) => updateElement(element.id, { fontSize: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字重\n <input\n type=\"number\"\n min={100}\n max={900}\n step={100}\n value={element.fontWeight ?? 500}\n onChange={(event) => updateElement(element.id, { fontWeight: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 对齐\n <select\n value={element.align || 'left'}\n onChange={(event) =>\n updateElement(element.id, { align: event.target.value as 'left' | 'center' | 'right' })\n }\n className={numberFieldClassName}\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n </select>\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 字体\n <input\n type=\"text\"\n value={element.fontFamily || ''}\n onChange={(event) => updateElement(element.id, { fontFamily: event.target.value })}\n placeholder=\"inherit / serif / sans-serif / PingFang SC\"\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 文字颜色\n <div className=\"grid grid-cols-[64px_1fr] gap-2\">\n <input\n type=\"color\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className=\"h-10 rounded-lg border border-slate-300 bg-white p-1\"\n />\n <input\n type=\"text\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className={numberFieldClassName}\n />\n </div>\n </label>\n </div>\n </div>\n ) : (\n <div className=\"grid gap-2\">\n <input\n type=\"url\"\n value={element.src}\n onChange={(event) => updateElement(element.id, { src: event.target.value })}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 60}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 高度(%)\n <input\n type=\"number\"\n value={element.height ?? 40}\n onChange={(event) => updateElement(element.id, { height: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 圆角(px)\n <input\n type=\"number\"\n value={element.borderRadius ?? 0}\n onChange={(event) => updateElement(element.id, { borderRadius: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 填充\n <select\n value={element.fit || 'cover'}\n onChange={(event) => updateElement(element.id, { fit: event.target.value as 'cover' | 'contain' })}\n className={numberFieldClassName}\n >\n <option value=\"cover\">cover</option>\n <option value=\"contain\">contain</option>\n </select>\n </label>\n </div>\n <label className=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n <input\n type=\"checkbox\"\n checked={Boolean(element.isBackground)}\n onChange={(event) => updateElement(element.id, { isBackground: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300 text-sky-600\"\n />\n 作为本页背景图\n </label>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport { FestivalCardConfigEditor } from './FestivalCardConfigEditor';\n\ninterface FestivalCardStudioProps {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const FestivalCardStudio: React.FC<FestivalCardStudioProps> = ({ initialConfig, fetchConfig, onSave }) => {\n const { config, setConfig, loading, save, saving } = useFestivalCardConfig({\n initialConfig: normalizeFestivalCardConfig(initialConfig),\n fetchConfig,\n onSave,\n });\n\n if (loading) return <div>加载中...</div>;\n\n return (\n <div className=\"grid items-start gap-4 lg:grid-cols-[1.45fr_1fr]\">\n <FestivalCardBook3D config={config} className=\"h-full\" />\n <div className=\"lg:sticky lg:top-4\">\n <FestivalCardConfigEditor value={config} onChange={setConfig} />\n {onSave ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60\"\n >\n {saving ? '保存中...' : '保存配置'}\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FestivalCardStudio } from './FestivalCardStudio';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardConfigPageProps {\n apiBase?: string;\n cardId?: string;\n mainPagePath?: string;\n}\n\nexport const FestivalCardConfigPage: React.FC<FestivalCardConfigPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n mainPagePath = '/festivalCard',\n}) => {\n const [list, setList] = useState<FestivalCardConfigSummary[]>([]);\n const [selectedId, setSelectedId] = useState(cardId || 'default-festival-card');\n\n const parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload\n .filter((item): item is FestivalCardConfigSummary => Boolean(item && typeof item === 'object' && typeof (item as { id?: unknown }).id === 'string'))\n .map((item) => ({ id: item.id, name: item.name }));\n };\n\n const parseConfigResponse = (data: unknown): FestivalCardConfig => {\n if (!data || typeof data !== 'object') return normalizeFestivalCardConfig();\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return normalizeFestivalCardConfig();\n return normalizeFestivalCardConfig(payload as Partial<FestivalCardConfig>);\n };\n\n const reloadList = useCallback(async () => {\n try {\n const response = await fetch(apiBase, { cache: 'no-store' });\n if (!response.ok) throw new Error(`加载卡片列表失败: ${response.status}`);\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n if (items.length === 0) {\n const fallbackId = 'default-festival-card';\n const fallbackConfig = normalizeFestivalCardConfig({ id: fallbackId, name: 'Holiday Card' });\n await fetch(`${apiBase}/${encodeURIComponent(fallbackId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config: fallbackConfig }),\n });\n setList([{ id: fallbackId, name: fallbackConfig.name }]);\n setSelectedId(fallbackId);\n return;\n }\n setList(items);\n } catch (error) {\n window.alert((error as Error).message || '加载卡片列表失败');\n }\n }, [apiBase]);\n\n useEffect(() => {\n void reloadList();\n }, [reloadList]);\n\n const fetchConfig = async (): Promise<FestivalCardConfig> => {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: 'no-store' });\n if (!response.ok) {\n const message = `加载配置失败: ${response.status}`;\n window.alert(message);\n throw new Error(message);\n }\n const data: unknown = await response.json();\n return parseConfigResponse(data);\n };\n\n const saveConfig = async (config: FestivalCardConfig) => {\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`保存失败: ${response.status}`);\n await reloadList();\n window.alert('保存成功');\n } catch (error) {\n window.alert((error as Error).message || '保存失败');\n throw error;\n }\n };\n\n const createNew = async () => {\n const name = window.prompt('请输入新卡片名称');\n if (!name) return;\n const id = `festival-${Date.now()}`;\n const config = normalizeFestivalCardConfig({\n id,\n name,\n });\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`创建失败: ${response.status}`);\n setSelectedId(id);\n await reloadList();\n window.alert('新卡片创建成功');\n } catch (error) {\n window.alert((error as Error).message || '创建失败');\n }\n };\n\n const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-center gap-2 rounded-xl border border-slate-800 bg-slate-900/50 p-3\">\n <select\n value={selectedId}\n onChange={(event) => setSelectedId(event.target.value)}\n className=\"min-w-[240px] rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {list.map((item) => (\n <option key={item.id} value={item.id}>\n {item.name || item.id}\n </option>\n ))}\n </select>\n <button type=\"button\" onClick={() => void createNew()} className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\">\n 新建卡片\n </button>\n <a href={mainLink} className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700\">\n 打开主页面\n </a>\n </div>\n\n <FestivalCardStudio fetchConfig={fetchConfig} onSave={saveConfig} />\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardManagedPageProps {\n apiBase?: string;\n cardId?: string;\n}\n\nconst isSummary = (value: unknown): value is FestivalCardConfigSummary => {\n if (!value || typeof value !== 'object') return false;\n return typeof (value as { id?: unknown }).id === 'string';\n};\n\nconst parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));\n};\n\nconst parseConfigResponse = (data: unknown): FestivalCardConfig | null => {\n if (!data || typeof data !== 'object') return null;\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return null;\n if (!Array.isArray((payload as FestivalCardConfig).pages)) return null;\n return payload as FestivalCardConfig;\n};\n\nexport const FestivalCardManagedPage: React.FC<FestivalCardManagedPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n}) => {\n const [currentCardId, setCurrentCardId] = useState<string>(cardId || '');\n const [config, setConfig] = useState<FestivalCardConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const fetchList = async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n const first = items[0];\n if (!currentCardId && first) {\n setCurrentCardId(first.id);\n }\n };\n\n void fetchList();\n }, [apiBase, currentCardId]);\n\n useEffect(() => {\n if (!currentCardId) return;\n setLoading(true);\n void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: 'no-store' })\n .then((res) => res.json() as Promise<unknown>)\n .then((data) => setConfig(parseConfigResponse(data)))\n .finally(() => setLoading(false));\n }, [apiBase, currentCardId]);\n\n return (\n <div>{loading || !config ? <div className=\"py-12 text-center text-slate-400\">加载中...</div> : <FestivalCardBook3D config={config} />}</div>\n );\n};\n","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 { 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"]}
1
+ {"version":3,"sources":["../../src/festivalCard/core/defaults.ts","../../src/festivalCard/core/normalize.ts","../../src/festivalCard/hooks/useFestivalCardConfig.ts","../../src/festivalCard/components/FestivalCardPageRenderer.tsx","../../src/festivalCard/components/FestivalCardBook3D.tsx","../../src/festivalCard/components/FestivalCardConfigEditor.tsx","../../src/festivalCard/components/FestivalCardStudio.tsx","../../src/festivalCard/components/FestivalCardConfigPage.tsx","../../src/festivalCard/components/FestivalCardManagedPage.tsx","../../src/festivalCard/server/db.ts","../../src/festivalCard/services/festivalCardService.ts"],"names":["useState","useEffect","useCallback","useMemo","React","useRef","parseListResponse","parseConfigResponse"],"mappings":"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","file":"index.js","sourcesContent":["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 isBackground: false,\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 isBackground: false,\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","'use client';\n\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { DEFAULT_FESTIVAL_CARD_CONFIG, normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\n\ninterface UseFestivalCardConfigOptions {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const useFestivalCardConfig = (options?: UseFestivalCardConfigOptions) => {\n const [config, setConfig] = useState<FestivalCardConfig>(() =>\n normalizeFestivalCardConfig(options?.initialConfig || DEFAULT_FESTIVAL_CARD_CONFIG)\n );\n const [loading, setLoading] = useState(Boolean(options?.fetchConfig));\n const [saving, setSaving] = useState(false);\n\n useEffect(() => {\n const fetchConfig = options?.fetchConfig;\n if (!fetchConfig) return;\n\n let active = true;\n void fetchConfig()\n .then((value) => {\n if (!active) return;\n setConfig(normalizeFestivalCardConfig(value));\n })\n .finally(() => {\n if (active) setLoading(false);\n });\n\n return () => {\n active = false;\n };\n }, [options?.fetchConfig]);\n\n const save = useCallback(async () => {\n const onSave = options?.onSave;\n if (!onSave) return;\n setSaving(true);\n try {\n await onSave(config);\n } finally {\n setSaving(false);\n }\n }, [config, options?.onSave]);\n\n return useMemo(\n () => ({\n config,\n setConfig,\n loading,\n saving,\n save,\n }),\n [config, loading, save, saving]\n );\n};\n","'use client';\n\nimport React from 'react';\nimport type { FestivalCardElement, FestivalCardPage } from '../types';\n\nconst elementStyle = (element: FestivalCardElement): React.CSSProperties => ({\n position: 'absolute',\n zIndex: 2,\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n});\n\nconst renderElement = (element: FestivalCardElement) => {\n if (element.type === 'text') {\n return (\n <div\n key={element.id}\n style={{\n ...elementStyle(element),\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n fontFamily: element.fontFamily || 'inherit',\n textAlign: element.align || 'left',\n lineHeight: 1.45,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content}\n </div>\n );\n }\n\n return (\n <img\n key={element.id}\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n style={{\n ...elementStyle(element),\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n overflow: 'hidden',\n boxShadow: '0 12px 30px rgba(2, 6, 23, 0.32)',\n }}\n />\n );\n};\n\ninterface FestivalCardPageRendererProps {\n page: FestivalCardPage;\n}\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({ page }) => {\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n\n return (\n <div\n className=\"relative h-full w-full overflow-hidden rounded-2xl\"\n style={{\n backgroundColor: page.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map(renderElement)}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n}\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({ config, className }) => {\n const [currentPage, setCurrentPage] = useState(0);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n\n return (\n <div className={className}>\n <div className=\"w-full min-h-screen px-0 py-4\">\n <div className=\"mx-auto w-full text-center text-slate-100\">\n <h3 className=\"mb-3 text-lg font-semibold\">{normalized.coverTitle || 'Festival Card'}</h3>\n </div>\n\n <div className=\"mx-auto w-full\">\n <div className=\"relative h-[calc(100vh-170px)] min-h-[460px]\">\n {pages.map((page, index) => (\n <div\n key={page.id}\n className=\"absolute inset-0 transition-opacity duration-500 ease-out\"\n style={{\n opacity: index === currentPage ? 1 : 0,\n pointerEvents: index === currentPage ? 'auto' : 'none',\n }}\n >\n <FestivalCardPageRenderer page={page} />\n </div>\n ))}\n </div>\n </div>\n\n <div className=\"mt-4 flex justify-center gap-3\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={() => setCurrentPage((p) => Math.max(0, p - 1))}\n className=\"rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 上一页\n </button>\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={() => setCurrentPage((p) => Math.min(pages.length - 1, p + 1))}\n className=\"rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45\"\n >\n 下一页\n </button>\n </div>\n </div>\n\n {normalized.backgroundMusic?.src ? (\n <audio\n src={normalized.backgroundMusic.src}\n autoPlay={normalized.backgroundMusic.autoPlay}\n loop={normalized.backgroundMusic.loop}\n controls\n className=\"mt-3 w-full\"\n />\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useRef, useState } from 'react';\nimport { resizeFestivalCardPages } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement } from '../types';\n\ninterface FestivalCardConfigEditorProps {\n value: FestivalCardConfig;\n onChange: (config: FestivalCardConfig) => void;\n}\n\nconst createTextElement = (pageIndex: number): FestivalCardElement => ({\n id: `text-${Date.now()}-${pageIndex}`,\n type: 'text',\n x: 50,\n y: 50,\n width: 70,\n content: '请输入文字',\n fontSize: 18,\n fontWeight: 500,\n align: 'center',\n color: '#ffffff',\n fontFamily: 'inherit',\n});\n\nconst createImageElement = (pageIndex: number): FestivalCardElement => ({\n id: `image-${Date.now()}-${pageIndex}`,\n type: 'image',\n x: 50,\n y: 50,\n width: 60,\n height: 40,\n src: 'https://images.unsplash.com/photo-1482517967863-00e15c9b44be?auto=format&fit=crop&w=1200&q=80',\n fit: 'cover',\n borderRadius: 12,\n});\n\nexport const FestivalCardConfigEditor: React.FC<FestivalCardConfigEditorProps> = ({ value, onChange }) => {\n const [activePageIndex, setActivePageIndex] = useState(0);\n const [activeElementId, setActiveElementId] = useState<string | null>(null);\n const [draggingElementId, setDraggingElementId] = useState<string | null>(null);\n const previewRef = useRef<HTMLDivElement | null>(null);\n const dragStateRef = useRef<{\n pointerId: number;\n elementId: string;\n rect: DOMRect;\n } | null>(null);\n const page = value.pages[activePageIndex];\n const canEditPage = Boolean(page);\n const pageOptions = useMemo(() => value.pages.map((_, index) => index), [value.pages]);\n const backgroundElement = useMemo(\n () =>\n page?.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n ),\n [page]\n );\n const foregroundElements = useMemo(\n () => (page?.elements ?? []).filter((element) => !(element.type === 'image' && element.isBackground)),\n [page]\n );\n\n const clampPercent = (valueToClamp: number) => Math.max(0, Math.min(100, Number.isFinite(valueToClamp) ? valueToClamp : 0));\n\n const handlePageCountChange = (nextRaw: number) => {\n const next = Number.isFinite(nextRaw) ? Math.max(1, Math.min(12, Math.floor(nextRaw))) : value.pages.length;\n const resized = resizeFestivalCardPages(value, next);\n onChange(resized);\n if (activePageIndex > resized.pages.length - 1) {\n setActivePageIndex(resized.pages.length - 1);\n }\n };\n\n const updateElement = (elementId: string, patch: Partial<FestivalCardElement>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.map((el) => (el.id === elementId ? { ...el, ...patch } as FestivalCardElement : el)),\n }\n : p\n ),\n });\n };\n\n const removeElement = (elementId: string) => {\n onChange({\n ...value,\n pages: value.pages.map((p, pIndex) =>\n pIndex === activePageIndex\n ? {\n ...p,\n elements: p.elements.filter((el) => el.id !== elementId),\n }\n : p\n ),\n });\n };\n\n const updatePage = (patch: Partial<FestivalCardConfig['pages'][number]>) => {\n onChange({\n ...value,\n pages: value.pages.map((p, index) => (index === activePageIndex ? { ...p, ...patch } : p)),\n });\n };\n\n const moveElementWithPointer = (elementId: string, clientX: number, clientY: number, rect?: DOMRect) => {\n const bounds = rect || previewRef.current?.getBoundingClientRect();\n if (!bounds || bounds.width <= 0 || bounds.height <= 0) return;\n const x = clampPercent(((clientX - bounds.left) / bounds.width) * 100);\n const y = clampPercent(((clientY - bounds.top) / bounds.height) * 100);\n updateElement(elementId, { x, y });\n };\n\n const handleElementPointerDown = (event: React.PointerEvent<HTMLElement>, elementId: string) => {\n if (!previewRef.current) return;\n event.preventDefault();\n const rect = previewRef.current.getBoundingClientRect();\n dragStateRef.current = {\n pointerId: event.pointerId,\n elementId,\n rect,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n setActiveElementId(elementId);\n setDraggingElementId(elementId);\n moveElementWithPointer(elementId, event.clientX, event.clientY, rect);\n };\n\n const handlePreviewPointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n const dragState = dragStateRef.current;\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n moveElementWithPointer(dragState.elementId, event.clientX, event.clientY, dragState.rect);\n };\n\n const endPointerDrag = (event: React.PointerEvent<HTMLDivElement>) => {\n const dragState = dragStateRef.current;\n if (!dragState || dragState.pointerId !== event.pointerId) return;\n dragStateRef.current = null;\n setDraggingElementId(null);\n };\n\n const numberFieldClassName =\n 'w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100';\n\n return (\n <div className=\"rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm\">\n <div className=\"grid gap-3\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面数量</span>\n <input\n type=\"number\"\n min={1}\n max={12}\n value={value.pages.length}\n onChange={(event) => handlePageCountChange(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">背景音乐 URL</span>\n <input\n type=\"url\"\n value={value.backgroundMusic?.src || ''}\n onChange={(event) =>\n onChange({\n ...value,\n backgroundMusic: {\n ...value.backgroundMusic,\n src: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面标题</span>\n <input\n type=\"text\"\n value={page?.title || ''}\n onChange={(event) => updatePage({ title: event.target.value })}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景色</span>\n <input\n type=\"color\"\n value={page?.background?.color || '#0f172a'}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n color: event.target.value,\n },\n })\n }\n className=\"h-10 w-full rounded-lg border border-slate-300 bg-white p-1\"\n />\n </label>\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">页面背景图 URL</span>\n <input\n type=\"url\"\n value={page?.background?.image || ''}\n onChange={(event) =>\n updatePage({\n background: {\n ...page?.background,\n image: event.target.value,\n },\n })\n }\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n </label>\n </div>\n\n <label className=\"grid gap-1.5\">\n <span className=\"text-sm font-medium text-slate-700\">编辑页面</span>\n <select\n value={activePageIndex}\n onChange={(event) => setActivePageIndex(Number(event.target.value))}\n className=\"rounded-lg border border-slate-300 bg-white px-3 py-2 text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {pageOptions.map((index) => (\n <option key={index} value={index}>\n 第 {index + 1} 页\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {canEditPage ? (\n <div className=\"mt-4\">\n <div className=\"mb-3 flex gap-2\">\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\"\n >\n + 文字\n </button>\n <button\n type=\"button\"\n onClick={() =>\n onChange({\n ...value,\n pages: value.pages.map((p, index) =>\n index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p\n ),\n })\n }\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white\"\n >\n + 图片\n </button>\n </div>\n <div className=\"mb-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">拖拽定位(直接拖动元素调整 X / Y)</div>\n <div className=\"text-xs text-slate-500\">{draggingElementId ? '拖拽中...' : '可拖拽'}</div>\n </div>\n <div\n ref={previewRef}\n onPointerMove={handlePreviewPointerMove}\n onPointerUp={endPointerDrag}\n onPointerCancel={endPointerDrag}\n className=\"relative aspect-[3/4] w-full touch-none overflow-hidden rounded-xl border border-slate-300 bg-slate-900\"\n style={{\n backgroundColor: page?.background?.color || '#0f172a',\n backgroundImage: backgroundElement\n ? `url(${backgroundElement.src})`\n : page?.background?.image\n ? `url(${page.background.image})`\n : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n <div className=\"absolute inset-0 bg-slate-950/20\" />\n {foregroundElements.map((element) => {\n const isActive = activeElementId === element.id;\n const isDragging = draggingElementId === element.id;\n return (\n <div\n key={element.id}\n role=\"button\"\n tabIndex={0}\n onPointerDown={(event) => handleElementPointerDown(event, element.id)}\n onClick={() => setActiveElementId(element.id)}\n className={`absolute select-none rounded-md ${isDragging ? 'cursor-grabbing' : 'cursor-grab'} ${\n isActive ? 'ring-2 ring-sky-300' : 'ring-1 ring-white/40'\n }`}\n style={{\n left: `${element.x}%`,\n top: `${element.y}%`,\n width: `${element.width ?? 70}%`,\n height: element.height ? `${element.height}%` : undefined,\n transform: 'translate(-50%, -50%)',\n zIndex: isActive ? 4 : 2,\n }}\n >\n {element.type === 'text' ? (\n <div\n className=\"w-full rounded-md bg-black/20 px-2 py-1\"\n style={{\n color: element.color || '#f8fafc',\n fontSize: element.fontSize || 18,\n fontWeight: element.fontWeight || 500,\n fontFamily: element.fontFamily || 'inherit',\n textAlign: element.align || 'left',\n lineHeight: 1.35,\n whiteSpace: 'pre-wrap',\n }}\n >\n {element.content || '文本'}\n </div>\n ) : (\n <img\n src={element.src}\n alt={element.alt || 'festival-card-image'}\n draggable={false}\n className=\"h-full w-full pointer-events-none\"\n style={{\n objectFit: element.fit || 'cover',\n borderRadius: element.borderRadius || 0,\n }}\n />\n )}\n </div>\n );\n })}\n </div>\n </div>\n\n <div className=\"grid max-h-[340px] gap-2.5 overflow-auto pr-1\">\n {(page?.elements ?? []).map((element) => (\n <div key={element.id} className=\"rounded-xl border border-slate-200 bg-slate-50 p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">{element.type.toUpperCase()}</div>\n <button\n type=\"button\"\n onClick={() => removeElement(element.id)}\n className=\"rounded-md border border-rose-300 bg-rose-50 px-2 py-1 text-xs font-medium text-rose-700\"\n >\n 删除\n </button>\n </div>\n {element.type === 'text' ? (\n <div className=\"grid gap-2\">\n <textarea\n value={element.content}\n onChange={(event) => updateElement(element.id, { content: event.target.value })}\n rows={3}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 70}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字号(px)\n <input\n type=\"number\"\n value={element.fontSize ?? 18}\n onChange={(event) => updateElement(element.id, { fontSize: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 字重\n <input\n type=\"number\"\n min={100}\n max={900}\n step={100}\n value={element.fontWeight ?? 500}\n onChange={(event) => updateElement(element.id, { fontWeight: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 对齐\n <select\n value={element.align || 'left'}\n onChange={(event) =>\n updateElement(element.id, { align: event.target.value as 'left' | 'center' | 'right' })\n }\n className={numberFieldClassName}\n >\n <option value=\"left\">left</option>\n <option value=\"center\">center</option>\n <option value=\"right\">right</option>\n </select>\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 字体\n <input\n type=\"text\"\n value={element.fontFamily || ''}\n onChange={(event) => updateElement(element.id, { fontFamily: event.target.value })}\n placeholder=\"inherit / serif / sans-serif / PingFang SC\"\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600 sm:col-span-2\">\n 文字颜色\n <div className=\"grid grid-cols-[64px_1fr] gap-2\">\n <input\n type=\"color\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className=\"h-10 rounded-lg border border-slate-300 bg-white p-1\"\n />\n <input\n type=\"text\"\n value={element.color || '#ffffff'}\n onChange={(event) => updateElement(element.id, { color: event.target.value })}\n className={numberFieldClassName}\n />\n </div>\n </label>\n </div>\n </div>\n ) : (\n <div className=\"grid gap-2\">\n <input\n type=\"url\"\n value={element.src}\n onChange={(event) => updateElement(element.id, { src: event.target.value })}\n className=\"w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n />\n <div className=\"grid gap-2 sm:grid-cols-2\">\n <label className=\"grid gap-1 text-xs text-slate-600\">\n X(%)\n <input\n type=\"number\"\n value={element.x}\n onChange={(event) => updateElement(element.id, { x: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n Y(%)\n <input\n type=\"number\"\n value={element.y}\n onChange={(event) => updateElement(element.id, { y: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 宽度(%)\n <input\n type=\"number\"\n value={element.width ?? 60}\n onChange={(event) => updateElement(element.id, { width: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 高度(%)\n <input\n type=\"number\"\n value={element.height ?? 40}\n onChange={(event) => updateElement(element.id, { height: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 圆角(px)\n <input\n type=\"number\"\n value={element.borderRadius ?? 0}\n onChange={(event) => updateElement(element.id, { borderRadius: Number(event.target.value) })}\n className={numberFieldClassName}\n />\n </label>\n <label className=\"grid gap-1 text-xs text-slate-600\">\n 填充\n <select\n value={element.fit || 'cover'}\n onChange={(event) => updateElement(element.id, { fit: event.target.value as 'cover' | 'contain' })}\n className={numberFieldClassName}\n >\n <option value=\"cover\">cover</option>\n <option value=\"contain\">contain</option>\n </select>\n </label>\n </div>\n <label className=\"inline-flex items-center gap-2 text-sm text-slate-700\">\n <input\n type=\"checkbox\"\n checked={Boolean(element.isBackground)}\n onChange={(event) => updateElement(element.id, { isBackground: event.target.checked })}\n className=\"h-4 w-4 rounded border-slate-300 text-sky-600\"\n />\n 作为本页背景图\n </label>\n </div>\n )}\n </div>\n ))}\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n","'use client';\n\nimport React from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig } from '../types';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport { FestivalCardConfigEditor } from './FestivalCardConfigEditor';\n\ninterface FestivalCardStudioProps {\n initialConfig?: FestivalCardConfig;\n fetchConfig?: () => Promise<FestivalCardConfig>;\n onSave?: (config: FestivalCardConfig) => Promise<void> | void;\n}\n\nexport const FestivalCardStudio: React.FC<FestivalCardStudioProps> = ({ initialConfig, fetchConfig, onSave }) => {\n const { config, setConfig, loading, save, saving } = useFestivalCardConfig({\n initialConfig: normalizeFestivalCardConfig(initialConfig),\n fetchConfig,\n onSave,\n });\n\n if (loading) return <div>加载中...</div>;\n\n return (\n <div className=\"grid items-start gap-4 lg:grid-cols-[1.45fr_1fr]\">\n <FestivalCardBook3D config={config} className=\"h-full\" />\n <div className=\"lg:sticky lg:top-4\">\n <FestivalCardConfigEditor value={config} onChange={setConfig} />\n {onSave ? (\n <button\n type=\"button\"\n onClick={() => void save()}\n disabled={saving}\n className=\"mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60\"\n >\n {saving ? '保存中...' : '保存配置'}\n </button>\n ) : null}\n </div>\n </div>\n );\n};\n","'use client';\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\nimport { FestivalCardStudio } from './FestivalCardStudio';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardConfigPageProps {\n apiBase?: string;\n cardId?: string;\n mainPagePath?: string;\n}\n\nexport const FestivalCardConfigPage: React.FC<FestivalCardConfigPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n mainPagePath = '/festivalCard',\n}) => {\n const [list, setList] = useState<FestivalCardConfigSummary[]>([]);\n const [selectedId, setSelectedId] = useState(cardId || 'default-festival-card');\n\n const parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload\n .filter((item): item is FestivalCardConfigSummary => Boolean(item && typeof item === 'object' && typeof (item as { id?: unknown }).id === 'string'))\n .map((item) => ({ id: item.id, name: item.name }));\n };\n\n const parseConfigResponse = (data: unknown): FestivalCardConfig => {\n if (!data || typeof data !== 'object') return normalizeFestivalCardConfig();\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return normalizeFestivalCardConfig();\n return normalizeFestivalCardConfig(payload as Partial<FestivalCardConfig>);\n };\n\n const reloadList = useCallback(async () => {\n try {\n const response = await fetch(apiBase, { cache: 'no-store' });\n if (!response.ok) throw new Error(`加载卡片列表失败: ${response.status}`);\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n if (items.length === 0) {\n const fallbackId = 'default-festival-card';\n const fallbackConfig = normalizeFestivalCardConfig({ id: fallbackId, name: 'Holiday Card' });\n await fetch(`${apiBase}/${encodeURIComponent(fallbackId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config: fallbackConfig }),\n });\n setList([{ id: fallbackId, name: fallbackConfig.name }]);\n setSelectedId(fallbackId);\n return;\n }\n setList(items);\n } catch (error) {\n window.alert((error as Error).message || '加载卡片列表失败');\n }\n }, [apiBase]);\n\n useEffect(() => {\n void reloadList();\n }, [reloadList]);\n\n const fetchConfig = async (): Promise<FestivalCardConfig> => {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, { cache: 'no-store' });\n if (!response.ok) {\n const message = `加载配置失败: ${response.status}`;\n window.alert(message);\n throw new Error(message);\n }\n const data: unknown = await response.json();\n return parseConfigResponse(data);\n };\n\n const saveConfig = async (config: FestivalCardConfig) => {\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(selectedId)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`保存失败: ${response.status}`);\n await reloadList();\n window.alert('保存成功');\n } catch (error) {\n window.alert((error as Error).message || '保存失败');\n throw error;\n }\n };\n\n const createNew = async () => {\n const name = window.prompt('请输入新卡片名称');\n if (!name) return;\n const id = `festival-${Date.now()}`;\n const config = normalizeFestivalCardConfig({\n id,\n name,\n });\n try {\n const response = await fetch(`${apiBase}/${encodeURIComponent(id)}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ config }),\n });\n if (!response.ok) throw new Error(`创建失败: ${response.status}`);\n setSelectedId(id);\n await reloadList();\n window.alert('新卡片创建成功');\n } catch (error) {\n window.alert((error as Error).message || '创建失败');\n }\n };\n\n const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);\n\n return (\n <div className=\"grid gap-4\">\n <div className=\"flex flex-wrap items-center gap-2 rounded-xl border border-slate-800 bg-slate-900/50 p-3\">\n <select\n value={selectedId}\n onChange={(event) => setSelectedId(event.target.value)}\n className=\"min-w-[240px] rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100\"\n >\n {list.map((item) => (\n <option key={item.id} value={item.id}>\n {item.name || item.id}\n </option>\n ))}\n </select>\n <button type=\"button\" onClick={() => void createNew()} className=\"rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white\">\n 新建卡片\n </button>\n <a href={mainLink} className=\"rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700\">\n 打开主页面\n </a>\n </div>\n\n <FestivalCardStudio fetchConfig={fetchConfig} onSave={saveConfig} />\n </div>\n );\n};\n","'use client';\n\nimport React, { useEffect, useState } from 'react';\nimport { FestivalCardBook3D } from './FestivalCardBook3D';\nimport type { FestivalCardConfig, FestivalCardConfigSummary } from '../types';\n\ninterface FestivalCardManagedPageProps {\n apiBase?: string;\n cardId?: string;\n}\n\nconst isSummary = (value: unknown): value is FestivalCardConfigSummary => {\n if (!value || typeof value !== 'object') return false;\n return typeof (value as { id?: unknown }).id === 'string';\n};\n\nconst parseListResponse = (data: unknown): FestivalCardConfigSummary[] => {\n if (!data || typeof data !== 'object') return [];\n const payload = (data as { data?: unknown }).data;\n if (!Array.isArray(payload)) return [];\n return payload.filter(isSummary).map((item) => ({ id: item.id, name: item.name }));\n};\n\nconst parseConfigResponse = (data: unknown): FestivalCardConfig | null => {\n if (!data || typeof data !== 'object') return null;\n const payload = (data as { data?: unknown }).data;\n if (!payload || typeof payload !== 'object') return null;\n if (!Array.isArray((payload as FestivalCardConfig).pages)) return null;\n return payload as FestivalCardConfig;\n};\n\nexport const FestivalCardManagedPage: React.FC<FestivalCardManagedPageProps> = ({\n apiBase = '/api/festivalCard',\n cardId,\n}) => {\n const [currentCardId, setCurrentCardId] = useState<string>(cardId || '');\n const [config, setConfig] = useState<FestivalCardConfig | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const fetchList = async () => {\n const response = await fetch(apiBase, { cache: 'no-store' });\n const data: unknown = await response.json();\n const items = parseListResponse(data);\n const first = items[0];\n if (!currentCardId && first) {\n setCurrentCardId(first.id);\n }\n };\n\n void fetchList();\n }, [apiBase, currentCardId]);\n\n useEffect(() => {\n if (!currentCardId) return;\n setLoading(true);\n void fetch(`${apiBase}/${encodeURIComponent(currentCardId)}`, { cache: 'no-store' })\n .then((res) => res.json() as Promise<unknown>)\n .then((data) => setConfig(parseConfigResponse(data)))\n .finally(() => setLoading(false));\n }, [apiBase, currentCardId]);\n\n return (\n <div>{loading || !config ? <div className=\"py-12 text-center text-slate-400\">加载中...</div> : <FestivalCardBook3D config={config} />}</div>\n );\n};\n","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 { 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"]}