sa2kit 1.6.90 → 1.6.91

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +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","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"]}
1
+ {"version":3,"sources":["../../src/festivalCard/core/defaults.ts","../../src/festivalCard/core/normalize.ts","../../src/festivalCard/hooks/useFestivalCardConfig.ts","../../src/navigation/FloatingMenu.tsx","../../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","useRef","createPortal","React","clsx","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, { useState, useRef, useEffect, ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { clsx } from 'clsx';\n\nexport interface FloatingMenuProps {\n /**\n * 触发按钮的内容\n */\n trigger: ReactNode;\n \n /**\n * 菜单内容\n */\n menu: ReactNode;\n \n /**\n * 初始位置\n */\n initialPosition?: { x: number; y: number };\n \n /**\n * 是否默认打开菜单\n */\n defaultOpen?: boolean;\n \n /**\n * 自定义类名\n */\n className?: string;\n \n /**\n * 菜单类名\n */\n menuClassName?: string;\n \n /**\n * 触发器类名\n */\n triggerClassName?: string;\n \n /**\n * z-index\n */\n zIndex?: number;\n}\n\nconst FloatingMenu: React.FC<FloatingMenuProps> = ({\n trigger,\n menu,\n initialPosition = { x: 20, y: 20 },\n defaultOpen = false,\n className = '',\n menuClassName = '',\n triggerClassName = '',\n zIndex = 1000,\n}) => {\n const [position, setPosition] = useState(initialPosition);\n const [isMenuOpen, setIsMenuOpen] = useState(defaultOpen);\n const [menuDirection, setMenuDirection] = useState<'left' | 'right'>('right');\n const [isDragging, setIsDragging] = useState(false);\n const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 });\n const containerRef = useRef<HTMLDivElement>(null);\n const [mounted, setMounted] = useState(false);\n // 添加一个标志,用于跟踪是否发生了拖动\n const [hasDragged, setHasDragged] = useState(false);\n // 添加一个计时器引用,用于区分点击和拖动\n const dragTimerRef = useRef<number | null>(null);\n // 添加一个引用,记录鼠标按下的初始位置\n const mouseDownPosRef = useRef<{ x: number, y: number } | null>(null);\n\n // 客户端挂载检查\n useEffect(() => {\n setMounted(true);\n return () => setMounted(false);\n }, []);\n\n // 计算菜单方向\n useEffect(() => {\n if (!mounted || !containerRef.current) return;\n \n const updateMenuDirection = () => {\n const rect = containerRef.current?.getBoundingClientRect();\n if (!rect) return;\n \n const windowWidth = window.innerWidth;\n const middlePoint = windowWidth / 2;\n \n // 如果悬浮窗在屏幕左半部分,菜单向右展开;否则向左展开\n setMenuDirection(rect.left < middlePoint ? 'right' : 'left');\n };\n \n updateMenuDirection();\n \n // 监听窗口大小变化和滚动事件\n window.addEventListener('resize', updateMenuDirection);\n window.addEventListener('scroll', updateMenuDirection);\n \n return () => {\n window.removeEventListener('resize', updateMenuDirection);\n window.removeEventListener('scroll', updateMenuDirection);\n };\n }, [mounted]);\n\n // 处理拖动开始\n const handleMouseDown = (e: React.MouseEvent) => {\n if (!containerRef.current) return;\n \n // 防止触发菜单点击\n e.stopPropagation();\n \n // 记录鼠标按下的初始位置\n mouseDownPosRef.current = { x: e.clientX, y: e.clientY };\n \n const rect = containerRef.current.getBoundingClientRect();\n setDragOffset({\n x: e.clientX - rect.left,\n y: e.clientY - rect.top\n });\n \n // 重置拖动标志\n setHasDragged(false);\n \n // 设置拖动状态\n setIsDragging(true);\n };\n\n // 处理拖动过程\n useEffect(() => {\n if (!isDragging) return;\n \n const handleMouseMove = (e: MouseEvent) => {\n // 检查是否移动了足够的距离来认为是拖动\n if (mouseDownPosRef.current) {\n const dx = Math.abs(e.clientX - mouseDownPosRef.current.x);\n const dy = Math.abs(e.clientY - mouseDownPosRef.current.y);\n \n // 如果移动距离超过阈值,标记为拖动\n if (dx > 3 || dy > 3) {\n setHasDragged(true);\n }\n }\n \n // 计算新位置并应用边界检查\n const newX = e.clientX - dragOffset.x;\n const newY = e.clientY - dragOffset.y;\n \n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n setPosition({\n x: Math.min(Math.max(newX, 0), windowWidth - 50),\n y: Math.min(Math.max(newY, 0), windowHeight - 50)\n });\n };\n \n const handleMouseUp = () => {\n setIsDragging(false);\n \n // 重置鼠标按下位置\n mouseDownPosRef.current = null;\n \n // 设置一个短暂的延时,防止拖动后立即触发点击\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n \n dragTimerRef.current = window.setTimeout(() => {\n setHasDragged(false);\n }, 300); // 300ms 后重置拖动状态\n };\n \n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n \n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging, dragOffset]);\n\n // 清理定时器\n useEffect(() => {\n return () => {\n if (dragTimerRef.current) {\n window.clearTimeout(dragTimerRef.current);\n }\n };\n }, []);\n\n // 切换菜单开关\n const toggleMenu = (e: React.MouseEvent) => {\n e.stopPropagation();\n \n // 如果刚刚拖动过,不触发菜单切换\n if (hasDragged) {\n return;\n }\n \n setIsMenuOpen(!isMenuOpen);\n };\n\n // 关闭菜单的点击外部处理\n useEffect(() => {\n if (!isMenuOpen) return;\n \n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setIsMenuOpen(false);\n }\n };\n \n document.addEventListener('mousedown', handleClickOutside);\n \n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isMenuOpen]);\n\n // 窗口大小变化时的边界检查\n useEffect(() => {\n if (!mounted) return;\n \n const checkBoundaries = () => {\n const windowWidth = window.innerWidth;\n const windowHeight = window.innerHeight;\n \n // 确保悬浮窗不会被拖出屏幕\n setPosition(prev => {\n const newX = Math.min(Math.max(prev.x, 0), windowWidth - 50);\n const newY = Math.min(Math.max(prev.y, 0), windowHeight - 50);\n \n // 只有在实际需要调整时才更新位置\n if (newX !== prev.x || newY !== prev.y) {\n return { x: newX, y: newY };\n }\n return prev;\n });\n };\n \n // 只在窗口大小变化时检查边界\n window.addEventListener('resize', checkBoundaries);\n \n return () => {\n window.removeEventListener('resize', checkBoundaries);\n };\n }, [mounted]);\n\n if (!mounted) return null;\n\n return createPortal(\n <div\n ref={containerRef}\n className={clsx('fixed select-none box-border', className)}\n style={{\n left: (position.x) + 'px',\n top: (position.y) + 'px',\n zIndex,\n }}\n >\n {/* 触发器按钮 */}\n <div \n className={clsx(\n 'flex items-center justify-center w-12 h-12 md:w-12 md:h-12 bg-white rounded-full shadow-md hover:shadow-lg cursor-grab active:cursor-grabbing transition-all duration-200 hover:scale-105 active:scale-95',\n triggerClassName\n )}\n onMouseDown={handleMouseDown}\n onClick={toggleMenu}\n >\n {trigger}\n </div>\n \n {/* 菜单内容 */}\n {isMenuOpen && (\n <div \n className={clsx(\n 'absolute top-0 bg-white rounded-lg shadow-xl p-3 min-w-[200px] md:min-w-[200px] max-w-[300px] z-[1000] transition-all duration-200',\n isMenuOpen ? 'opacity-100 scale-100' : 'opacity-0 scale-95',\n menuDirection === 'left' ? 'right-[calc(100%+10px)]' : 'left-[calc(100%+10px)]',\n menuClassName\n )}\n onClick={(e) => e.stopPropagation()}\n onMouseDown={(e) => e.stopPropagation()}\n onMouseUp={(e) => e.stopPropagation()}\n onTouchStart={(e) => e.stopPropagation()}\n onTouchMove={(e) => e.stopPropagation()}\n onTouchEnd={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onPointerUp={(e) => e.stopPropagation()}\n >\n {menu}\n </div>\n )}\n </div>,\n document.body\n );\n};\n\nexport default FloatingMenu;","'use client';\n\nimport React, { useMemo, useRef, useState } 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 editable?: boolean;\n selectedElementId?: string | null;\n onElementSelect?: (elementId: string | null) => void;\n onElementChange?: (elementId: string, patch: Partial<FestivalCardElement>) => void;\n}\n\ntype InteractionState = {\n pointerId: number;\n elementId: string;\n mode: 'move' | 'resize';\n rect: DOMRect;\n};\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\n\nexport const FestivalCardPageRenderer: React.FC<FestivalCardPageRendererProps> = ({\n page,\n editable = false,\n selectedElementId = null,\n onElementSelect,\n onElementChange,\n}) => {\n const [draggingElementId, setDraggingElementId] = useState<string | null>(null);\n const [resizingElementId, setResizingElementId] = useState<string | null>(null);\n const stageRef = useRef<HTMLDivElement | null>(null);\n const interactionRef = useRef<InteractionState | null>(null);\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 updateElementByPointer = (element: FestivalCardElement, interaction: InteractionState, clientX: number, clientY: number) => {\n if (!onElementChange || interaction.rect.width <= 0 || interaction.rect.height <= 0) return;\n const xPercent = clamp(((clientX - interaction.rect.left) / interaction.rect.width) * 100, 0, 100);\n const yPercent = clamp(((clientY - interaction.rect.top) / interaction.rect.height) * 100, 0, 100);\n if (interaction.mode === 'move') {\n onElementChange(element.id, { x: xPercent, y: yPercent });\n return;\n }\n\n const nextWidth = clamp(Math.abs(xPercent - element.x) * 2, 4, 100);\n if (element.type === 'image') {\n const nextHeight = clamp(Math.abs(yPercent - element.y) * 2, 4, 100);\n onElementChange(element.id, { width: nextWidth, height: nextHeight });\n return;\n }\n onElementChange(element.id, { width: nextWidth });\n };\n\n const beginInteraction = (\n event: React.PointerEvent<HTMLElement>,\n elementId: string,\n mode: InteractionState['mode']\n ) => {\n if (!editable || !stageRef.current) return;\n event.preventDefault();\n event.stopPropagation();\n const rect = stageRef.current.getBoundingClientRect();\n interactionRef.current = {\n pointerId: event.pointerId,\n elementId,\n mode,\n rect,\n };\n event.currentTarget.setPointerCapture(event.pointerId);\n onElementSelect?.(elementId);\n if (mode === 'move') {\n setDraggingElementId(elementId);\n setResizingElementId(null);\n } else {\n setResizingElementId(elementId);\n setDraggingElementId(null);\n }\n const element = foregroundElements.find((item) => item.id === elementId);\n if (element) {\n updateElementByPointer(element, interactionRef.current, event.clientX, event.clientY);\n }\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n const interaction = interactionRef.current;\n if (!interaction || interaction.pointerId !== event.pointerId) return;\n const element = foregroundElements.find((item) => item.id === interaction.elementId);\n if (!element) return;\n updateElementByPointer(element, interaction, event.clientX, event.clientY);\n };\n\n const endInteraction = (event: React.PointerEvent<HTMLDivElement>) => {\n const interaction = interactionRef.current;\n if (!interaction || interaction.pointerId !== event.pointerId) return;\n interactionRef.current = null;\n setDraggingElementId(null);\n setResizingElementId(null);\n };\n\n return (\n <div\n ref={stageRef}\n onPointerMove={editable ? handlePointerMove : undefined}\n onPointerUp={editable ? endInteraction : undefined}\n onPointerCancel={editable ? endInteraction : undefined}\n onClick={editable ? () => onElementSelect?.(null) : undefined}\n className={`relative h-full w-full overflow-hidden rounded-2xl ${editable ? 'touch-none' : ''}`}\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 if (!editable) {\n return renderElement(element);\n }\n const isSelected = selectedElementId === element.id;\n const isDragging = draggingElementId === element.id;\n const isResizing = resizingElementId === element.id;\n return (\n <div\n key={element.id}\n role=\"button\"\n tabIndex={0}\n onClick={(event) => {\n event.stopPropagation();\n onElementSelect?.(element.id);\n }}\n onPointerDown={(event) => beginInteraction(event, element.id, 'move')}\n className={`absolute select-none touch-none rounded-md ${\n isDragging ? 'cursor-grabbing' : isResizing ? 'cursor-se-resize' : 'cursor-grab'\n } ${isSelected ? 'ring-2 ring-sky-300' : 'ring-1 ring-white/40'}`}\n style={{\n ...elementStyle(element),\n zIndex: isSelected ? 4 : 2,\n }}\n >\n {element.type === 'text' ? (\n <div\n className=\"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.45,\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=\"pointer-events-none h-full w-full\"\n style={{\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 <button\n type=\"button\"\n aria-label=\"resize\"\n onPointerDown={(event) => beginInteraction(event, element.id, 'resize')}\n className=\"absolute -bottom-2 -right-2 h-4 w-4 rounded-full border border-white bg-sky-500 shadow\"\n />\n </div>\n );\n })}\n </div>\n );\n};\n","'use client';\n\nimport React, { useMemo, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport type { FestivalCardConfig, FestivalCardElement, FestivalCardPage } from '../types';\nimport FloatingMenu from '../../navigation/FloatingMenu';\nimport { FestivalCardPageRenderer } from './FestivalCardPageRenderer';\n\nexport interface FestivalCardBook3DProps {\n config: FestivalCardConfig;\n className?: string;\n editable?: boolean;\n enableExportImage?: boolean;\n currentPage?: number;\n onCurrentPageChange?: (index: number) => void;\n selectedElementId?: string | null;\n onSelectedElementChange?: (elementId: string | null) => void;\n onElementChange?: (pageIndex: number, elementId: string, patch: Partial<FestivalCardElement>) => void;\n}\n\nconst loadImage = (src: string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new window.Image();\n image.crossOrigin = 'anonymous';\n image.decoding = 'async';\n image.onload = () => resolve(image);\n image.onerror = () => reject(new Error(`图片加载失败: ${src}`));\n image.src = src;\n });\n\nconst drawImageWithFit = (\n ctx: CanvasRenderingContext2D,\n image: HTMLImageElement,\n left: number,\n top: number,\n width: number,\n height: number,\n fit: 'cover' | 'contain'\n) => {\n const imageRatio = image.width / image.height;\n const boxRatio = width / height;\n let drawWidth = width;\n let drawHeight = height;\n let offsetX = left;\n let offsetY = top;\n\n if (fit === 'cover') {\n if (imageRatio > boxRatio) {\n drawHeight = height;\n drawWidth = height * imageRatio;\n offsetX = left - (drawWidth - width) / 2;\n } else {\n drawWidth = width;\n drawHeight = width / imageRatio;\n offsetY = top - (drawHeight - height) / 2;\n }\n } else if (imageRatio > boxRatio) {\n drawWidth = width;\n drawHeight = width / imageRatio;\n offsetY = top + (height - drawHeight) / 2;\n } else {\n drawHeight = height;\n drawWidth = height * imageRatio;\n offsetX = left + (width - drawWidth) / 2;\n }\n\n ctx.drawImage(image, offsetX, offsetY, drawWidth, drawHeight);\n};\n\nconst withRoundedClip = (\n ctx: CanvasRenderingContext2D,\n left: number,\n top: number,\n width: number,\n height: number,\n radius: number,\n draw: () => void\n) => {\n const safeRadius = Math.max(0, Math.min(radius, Math.min(width, height) / 2));\n if (safeRadius <= 0) {\n draw();\n return;\n }\n ctx.save();\n ctx.beginPath();\n ctx.moveTo(left + safeRadius, top);\n ctx.lineTo(left + width - safeRadius, top);\n ctx.quadraticCurveTo(left + width, top, left + width, top + safeRadius);\n ctx.lineTo(left + width, top + height - safeRadius);\n ctx.quadraticCurveTo(left + width, top + height, left + width - safeRadius, top + height);\n ctx.lineTo(left + safeRadius, top + height);\n ctx.quadraticCurveTo(left, top + height, left, top + height - safeRadius);\n ctx.lineTo(left, top + safeRadius);\n ctx.quadraticCurveTo(left, top, left + safeRadius, top);\n ctx.closePath();\n ctx.clip();\n draw();\n ctx.restore();\n};\n\nconst drawMultilineText = (\n ctx: CanvasRenderingContext2D,\n text: string,\n left: number,\n top: number,\n maxWidth: number,\n lineHeight: number\n) => {\n const paragraphs = text.split('\\n');\n let currentY = top;\n paragraphs.forEach((paragraph, index) => {\n const words = paragraph.split('');\n let line = '';\n for (const word of words) {\n const testLine = line + word;\n if (ctx.measureText(testLine).width > maxWidth && line) {\n ctx.fillText(line, left, currentY);\n line = word;\n currentY += lineHeight;\n } else {\n line = testLine;\n }\n }\n ctx.fillText(line, left, currentY);\n currentY += lineHeight;\n if (index < paragraphs.length - 1) {\n currentY += lineHeight * 0.2;\n }\n });\n};\n\nconst exportPageToPng = async (page: FestivalCardPage, fileName: string) => {\n const width = 1080;\n const height = 1440;\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('无法创建 Canvas 上下文');\n\n ctx.fillStyle = page.background?.color || '#0f172a';\n ctx.fillRect(0, 0, width, height);\n\n const backgroundElement = page.elements.find(\n (element): element is Extract<FestivalCardElement, { type: 'image' }> => element.type === 'image' && Boolean(element.isBackground)\n );\n const backgroundImageSrc = backgroundElement?.src || page.background?.image;\n if (backgroundImageSrc) {\n const image = await loadImage(backgroundImageSrc);\n drawImageWithFit(ctx, image, 0, 0, width, height, 'cover');\n }\n\n const foregroundElements = page.elements.filter((element) => !(element.type === 'image' && element.isBackground));\n for (const element of foregroundElements) {\n const elementWidth = (width * (element.width ?? 70)) / 100;\n const elementHeight = element.height ? (height * element.height) / 100 : undefined;\n const centerX = (width * element.x) / 100;\n const centerY = (height * element.y) / 100;\n const left = centerX - elementWidth / 2;\n\n if (element.type === 'image') {\n const image = await loadImage(element.src);\n const drawHeight = elementHeight ?? elementWidth;\n const boxTop = centerY - drawHeight / 2;\n withRoundedClip(ctx, left, boxTop, elementWidth, drawHeight, element.borderRadius ?? 0, () => {\n drawImageWithFit(ctx, image, left, boxTop, elementWidth, drawHeight, element.fit || 'cover');\n });\n continue;\n }\n\n const fontSize = (element.fontSize || 18) * 1.5;\n ctx.fillStyle = element.color || '#f8fafc';\n ctx.font = `${element.fontWeight || 500} ${fontSize}px ${element.fontFamily || 'sans-serif'}`;\n ctx.textBaseline = 'top';\n ctx.textAlign = (element.align || 'left') as CanvasTextAlign;\n const textX =\n element.align === 'center' ? centerX : element.align === 'right' ? left + elementWidth : left;\n drawMultilineText(ctx, element.content || '', textX, centerY - fontSize * 0.72, elementWidth, fontSize * 1.45);\n }\n\n const blob = await new Promise<Blob | null>((resolve) => canvas.toBlob(resolve, 'image/png'));\n if (!blob) throw new Error('导出失败,请重试');\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = fileName;\n anchor.click();\n URL.revokeObjectURL(url);\n};\n\nexport const FestivalCardBook3D: React.FC<FestivalCardBook3DProps> = ({\n config,\n className,\n editable = false,\n enableExportImage = !editable,\n currentPage: currentPageProp,\n onCurrentPageChange,\n selectedElementId = null,\n onSelectedElementChange,\n onElementChange,\n}) => {\n const [internalCurrentPage, setInternalCurrentPage] = useState(0);\n const [exporting, setExporting] = useState(false);\n const normalized = useMemo(() => normalizeFestivalCardConfig(config), [config]);\n const pages = normalized.pages;\n const currentPage = typeof currentPageProp === 'number' ? currentPageProp : internalCurrentPage;\n const setCurrentPage = (updater: number | ((prev: number) => number)) => {\n const prev = currentPage;\n const nextValue = typeof updater === 'function' ? (updater as (prev: number) => number)(prev) : updater;\n if (typeof currentPageProp === 'number') {\n onCurrentPageChange?.(nextValue);\n return;\n }\n setInternalCurrentPage(nextValue);\n onCurrentPageChange?.(nextValue);\n };\n\n const canPrev = currentPage > 0;\n const canNext = currentPage < pages.length - 1;\n const currentPageData = pages[currentPage];\n\n const handleExportCurrentPage = async () => {\n if (!currentPageData || exporting) return;\n setExporting(true);\n try {\n const base = normalized.id || 'festival-card';\n const fileName = `${base}-page-${currentPage + 1}.png`;\n await exportPageToPng(currentPageData, fileName);\n } catch (error) {\n window.alert((error as Error).message || '导出图片失败');\n } finally {\n setExporting(false);\n }\n };\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\n page={page}\n editable={editable && index === currentPage}\n selectedElementId={selectedElementId}\n onElementSelect={onSelectedElementChange}\n onElementChange={(elementId, patch) => onElementChange?.(index, elementId, patch)}\n />\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 {enableExportImage ? (\n <FloatingMenu\n initialPosition={{ x: 24, y: 120 }}\n trigger={\n <div className=\"text-lg leading-none text-slate-700\" aria-hidden>\n ⌁\n </div>\n }\n menu={\n <div className=\"grid gap-2\">\n <div className=\"text-xs font-semibold tracking-wide text-slate-500\">贺卡工具</div>\n <button\n type=\"button\"\n onClick={() => void handleExportCurrentPage()}\n disabled={exporting}\n className=\"rounded-lg bg-sky-600 px-3 py-2 text-left text-sm font-medium text-white disabled:opacity-60\"\n >\n {exporting ? '导出中...' : `导出第 ${currentPage + 1} 页 PNG`}\n </button>\n </div>\n }\n triggerClassName=\"bg-white/95 backdrop-blur\"\n menuClassName=\"bg-white/95 backdrop-blur\"\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 activePageIndex?: number;\n onActivePageIndexChange?: (index: number) => void;\n selectedElementId?: string | null;\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> = ({\n value,\n onChange,\n activePageIndex: activePageIndexProp,\n onActivePageIndexChange,\n selectedElementId,\n}) => {\n const [internalActivePageIndex, setInternalActivePageIndex] = useState(0);\n const activePageIndex = activePageIndexProp ?? internalActivePageIndex;\n const setActivePageIndex = (index: number) => {\n if (typeof activePageIndexProp === 'number') {\n onActivePageIndexChange?.(index);\n return;\n }\n setInternalActivePageIndex(index);\n };\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\n key={element.id}\n className={`rounded-xl border bg-slate-50 p-3 ${\n selectedElementId === element.id ? 'border-sky-400 ring-2 ring-sky-100' : 'border-slate-200'\n }`}\n >\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, { useEffect, useState } from 'react';\nimport { normalizeFestivalCardConfig } from '../core';\nimport { useFestivalCardConfig } from '../hooks/useFestivalCardConfig';\nimport type { FestivalCardConfig, FestivalCardElement } 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 const [activePageIndex, setActivePageIndex] = useState(0);\n const [selectedElementId, setSelectedElementId] = useState<string | null>(null);\n\n useEffect(() => {\n if (config.pages.length === 0) return;\n if (activePageIndex <= config.pages.length - 1) return;\n setActivePageIndex(config.pages.length - 1);\n }, [activePageIndex, config.pages.length]);\n\n const updateElementByPreview = (pageIndex: number, elementId: string, patch: Partial<FestivalCardElement>) => {\n setConfig((prev) => ({\n ...prev,\n pages: prev.pages.map((page, index) =>\n index === pageIndex\n ? {\n ...page,\n elements: page.elements.map((element) =>\n element.id === elementId ? ({ ...element, ...patch } as FestivalCardElement) : element\n ),\n }\n : page\n ),\n }));\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\n config={config}\n className=\"h-full\"\n editable\n currentPage={activePageIndex}\n onCurrentPageChange={(index) => {\n setActivePageIndex(index);\n setSelectedElementId(null);\n }}\n selectedElementId={selectedElementId}\n onSelectedElementChange={setSelectedElementId}\n onElementChange={updateElementByPreview}\n />\n <div className=\"lg:sticky lg:top-4\">\n <FestivalCardConfigEditor\n value={config}\n onChange={setConfig}\n activePageIndex={activePageIndex}\n onActivePageIndexChange={(index) => {\n setActivePageIndex(index);\n setSelectedElementId(null);\n }}\n selectedElementId={selectedElementId}\n />\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"]}