sa2kit 1.6.88 → 1.6.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/dist/{booking-473Db8Bo.d.mts → booking-BH7HM0D0.d.mts} +1 -0
  2. package/dist/{booking-473Db8Bo.d.ts → booking-BH7HM0D0.d.ts} +1 -0
  3. package/dist/{bookingAdminService-DqQ7hEGw.d.ts → bookingAdminService-nr1vOp6I.d.ts} +1 -1
  4. package/dist/{bookingAdminService-SBX4JA_U.d.mts → bookingAdminService-pvk2MY1r.d.mts} +1 -1
  5. package/dist/boothVaultService-Cn4WPhjg.d.mts +83 -0
  6. package/dist/boothVaultService-Cn4WPhjg.d.ts +83 -0
  7. package/dist/{client-Bkn6mRI7.d.ts → client-UDQ7uMFA.d.ts} +1 -1
  8. package/dist/{client-exYn2Qla.d.mts → client-jOToHJEx.d.mts} +1 -1
  9. package/dist/festivalCard/index.js +114 -0
  10. package/dist/festivalCard/index.js.map +1 -1
  11. package/dist/festivalCard/index.mjs +115 -1
  12. package/dist/festivalCard/index.mjs.map +1 -1
  13. package/dist/festivalCard/web/index.js +114 -0
  14. package/dist/festivalCard/web/index.js.map +1 -1
  15. package/dist/festivalCard/web/index.mjs +115 -1
  16. package/dist/festivalCard/web/index.mjs.map +1 -1
  17. package/dist/{index-z15F7afa.d.mts → index-Bs06cHTn.d.mts} +2 -2
  18. package/dist/{index-BJpxvH7X.d.ts → index-C-oNM7Gv.d.ts} +1 -1
  19. package/dist/{index-XTV6IU-M.d.ts → index-CUab5EBV.d.ts} +2 -2
  20. package/dist/{index-Cum2EknK.d.mts → index-CYDb3AKs.d.mts} +1 -1
  21. package/dist/{index-DyxLpkmm.d.mts → index-DBB4ad0S.d.mts} +2 -2
  22. package/dist/{index-CdTIsNsy.d.ts → index-DBHwbXrv.d.ts} +2 -2
  23. package/dist/index.d.mts +2 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +480 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/index.mjs +472 -2
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/showmasterpiece/core.d.mts +3 -3
  30. package/dist/showmasterpiece/core.d.ts +3 -3
  31. package/dist/showmasterpiece/db.d.mts +2 -0
  32. package/dist/showmasterpiece/db.d.ts +2 -0
  33. package/dist/showmasterpiece/db.js +4 -2
  34. package/dist/showmasterpiece/db.js.map +1 -1
  35. package/dist/showmasterpiece/db.mjs +4 -2
  36. package/dist/showmasterpiece/db.mjs.map +1 -1
  37. package/dist/showmasterpiece/index.js +18 -2
  38. package/dist/showmasterpiece/index.js.map +1 -1
  39. package/dist/showmasterpiece/index.mjs +18 -2
  40. package/dist/showmasterpiece/index.mjs.map +1 -1
  41. package/dist/showmasterpiece/logic/index.d.mts +2 -2
  42. package/dist/showmasterpiece/logic/index.d.ts +2 -2
  43. package/dist/showmasterpiece/server/index.js +4 -2
  44. package/dist/showmasterpiece/server/index.js.map +1 -1
  45. package/dist/showmasterpiece/server/index.mjs +4 -2
  46. package/dist/showmasterpiece/server/index.mjs.map +1 -1
  47. package/dist/showmasterpiece/service/api/index.d.mts +1 -1
  48. package/dist/showmasterpiece/service/api/index.d.ts +1 -1
  49. package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
  50. package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
  51. package/dist/showmasterpiece/service/index.d.mts +6 -6
  52. package/dist/showmasterpiece/service/index.d.ts +6 -6
  53. package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
  54. package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
  55. package/dist/showmasterpiece/service/web/index.d.mts +4 -4
  56. package/dist/showmasterpiece/service/web/index.d.ts +4 -4
  57. package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
  58. package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
  59. package/dist/showmasterpiece/ui/miniapp/index.js +4 -3
  60. package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
  61. package/dist/showmasterpiece/ui/miniapp/index.mjs +4 -3
  62. package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
  63. package/dist/showmasterpiece/ui/web/index.js +18 -2
  64. package/dist/showmasterpiece/ui/web/index.js.map +1 -1
  65. package/dist/showmasterpiece/ui/web/index.mjs +18 -2
  66. package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
  67. package/dist/showmasterpiece/web/index.js +18 -2
  68. package/dist/showmasterpiece/web/index.js.map +1 -1
  69. package/dist/showmasterpiece/web/index.mjs +18 -2
  70. package/dist/showmasterpiece/web/index.mjs.map +1 -1
  71. package/dist/vocaloidBooth/index.d.mts +64 -0
  72. package/dist/vocaloidBooth/index.d.ts +64 -0
  73. package/dist/vocaloidBooth/index.js +376 -0
  74. package/dist/vocaloidBooth/index.js.map +1 -0
  75. package/dist/vocaloidBooth/index.mjs +362 -0
  76. package/dist/vocaloidBooth/index.mjs.map +1 -0
  77. package/dist/vocaloidBooth/server/index.d.mts +110 -0
  78. package/dist/vocaloidBooth/server/index.d.ts +110 -0
  79. package/dist/vocaloidBooth/server/index.js +247 -0
  80. package/dist/vocaloidBooth/server/index.js.map +1 -0
  81. package/dist/vocaloidBooth/server/index.mjs +237 -0
  82. package/dist/vocaloidBooth/server/index.mjs.map +1 -0
  83. package/dist/vocaloidBooth/web/index.d.mts +3 -0
  84. package/dist/vocaloidBooth/web/index.d.ts +3 -0
  85. package/dist/vocaloidBooth/web/index.js +376 -0
  86. package/dist/vocaloidBooth/web/index.js.map +1 -0
  87. package/dist/vocaloidBooth/web/index.mjs +362 -0
  88. package/dist/vocaloidBooth/web/index.mjs.map +1 -0
  89. package/package.json +1 -1
@@ -342,6 +342,7 @@ interface MasterpiecesConfig {
342
342
  interface MiniappFloatingButtonsConfig {
343
343
  showCart: boolean;
344
344
  showHistory: boolean;
345
+ showAddToCart: boolean;
345
346
  }
346
347
  interface CategoryOption {
347
348
  name: string;
@@ -342,6 +342,7 @@ interface MasterpiecesConfig {
342
342
  interface MiniappFloatingButtonsConfig {
343
343
  showCart: boolean;
344
344
  showHistory: boolean;
345
+ showAddToCart: boolean;
345
346
  }
346
347
  interface CategoryOption {
347
348
  name: string;
@@ -1,4 +1,4 @@
1
- import { B as BookingStatus } from './booking-473Db8Bo.js';
1
+ import { B as BookingStatus } from './booking-BH7HM0D0.js';
2
2
 
3
3
  /**
4
4
  * ShowMasterpiece 模块 - 预订管理服务
@@ -1,4 +1,4 @@
1
- import { B as BookingStatus } from './booking-473Db8Bo.mjs';
1
+ import { B as BookingStatus } from './booking-BH7HM0D0.mjs';
2
2
 
3
3
  /**
4
4
  * ShowMasterpiece 模块 - 预订管理服务
@@ -0,0 +1,83 @@
1
+ type BoothFileKind = 'project' | 'output' | 'asset' | 'other';
2
+ interface BoothFileItem {
3
+ id: string;
4
+ fileName: string;
5
+ size: number;
6
+ mimeType?: string;
7
+ objectKey: string;
8
+ checksum?: string;
9
+ kind?: BoothFileKind;
10
+ }
11
+ interface BoothUploadRecord {
12
+ id: string;
13
+ matchCode: string;
14
+ boothId: string;
15
+ createdAt: string;
16
+ expiresAt: string;
17
+ files: BoothFileItem[];
18
+ metadata?: {
19
+ nickname?: string;
20
+ contactTail?: string;
21
+ note?: string;
22
+ };
23
+ status: 'active' | 'expired' | 'deleted';
24
+ downloadCount: number;
25
+ }
26
+ type BoothAuditEventType = 'upload.created' | 'redeem.success' | 'redeem.failed' | 'redeem.blocked' | 'record.expired';
27
+ interface BoothAuditEvent {
28
+ type: BoothAuditEventType;
29
+ at: string;
30
+ boothId?: string;
31
+ recordId?: string;
32
+ matchCode?: string;
33
+ requesterKey?: string;
34
+ detail?: Record<string, unknown>;
35
+ }
36
+ interface CreateBoothUploadInput {
37
+ boothId: string;
38
+ ttlHours?: number;
39
+ metadata?: BoothUploadRecord['metadata'];
40
+ files: Omit<BoothFileItem, 'id'>[];
41
+ }
42
+ interface CreateBoothUploadResult {
43
+ record: BoothUploadRecord;
44
+ downloadUrlPath: string;
45
+ }
46
+ interface BoothVaultStore {
47
+ saveRecord(record: BoothUploadRecord): Promise<void>;
48
+ findByMatchCode(matchCode: string): Promise<BoothUploadRecord | null>;
49
+ findByRecordId?(recordId: string): Promise<BoothUploadRecord | null>;
50
+ incrementDownloadCount(recordId: string): Promise<void>;
51
+ existsByMatchCode(matchCode: string): Promise<boolean>;
52
+ }
53
+
54
+ interface BoothRedeemGuardLike {
55
+ assertAllowed(subjectKey: string): void;
56
+ registerAttempt(subjectKey: string, success: boolean): void;
57
+ }
58
+ interface BoothVaultServiceOptions {
59
+ store: BoothVaultStore;
60
+ codeLength?: number;
61
+ defaultTtlHours?: number;
62
+ baseDownloadPath?: string;
63
+ redeemGuard?: BoothRedeemGuardLike;
64
+ onAuditEvent?: (event: BoothAuditEvent) => void;
65
+ }
66
+ declare class BoothVaultService {
67
+ private emitAudit;
68
+ private readonly store;
69
+ private readonly codeLength;
70
+ private readonly defaultTtlHours;
71
+ private readonly baseDownloadPath;
72
+ private readonly redeemGuard?;
73
+ private readonly onAuditEvent?;
74
+ constructor(options: BoothVaultServiceOptions);
75
+ createUpload(input: CreateBoothUploadInput): Promise<CreateBoothUploadResult>;
76
+ getByMatchCode(matchCode: string): Promise<BoothUploadRecord | null>;
77
+ markDownloaded(recordId: string): Promise<void>;
78
+ resolveDownloadFilesByCode(matchCode: string, options?: {
79
+ requesterKey?: string;
80
+ }): Promise<BoothUploadRecord | null>;
81
+ }
82
+
83
+ export { type BoothVaultStore as B, type CreateBoothUploadInput as C, type BoothUploadRecord as a, type BoothFileItem as b, type BoothFileKind as c, BoothVaultService as d, type CreateBoothUploadResult as e, type BoothAuditEvent as f, type BoothAuditEventType as g, type BoothRedeemGuardLike as h, type BoothVaultServiceOptions as i };
@@ -0,0 +1,83 @@
1
+ type BoothFileKind = 'project' | 'output' | 'asset' | 'other';
2
+ interface BoothFileItem {
3
+ id: string;
4
+ fileName: string;
5
+ size: number;
6
+ mimeType?: string;
7
+ objectKey: string;
8
+ checksum?: string;
9
+ kind?: BoothFileKind;
10
+ }
11
+ interface BoothUploadRecord {
12
+ id: string;
13
+ matchCode: string;
14
+ boothId: string;
15
+ createdAt: string;
16
+ expiresAt: string;
17
+ files: BoothFileItem[];
18
+ metadata?: {
19
+ nickname?: string;
20
+ contactTail?: string;
21
+ note?: string;
22
+ };
23
+ status: 'active' | 'expired' | 'deleted';
24
+ downloadCount: number;
25
+ }
26
+ type BoothAuditEventType = 'upload.created' | 'redeem.success' | 'redeem.failed' | 'redeem.blocked' | 'record.expired';
27
+ interface BoothAuditEvent {
28
+ type: BoothAuditEventType;
29
+ at: string;
30
+ boothId?: string;
31
+ recordId?: string;
32
+ matchCode?: string;
33
+ requesterKey?: string;
34
+ detail?: Record<string, unknown>;
35
+ }
36
+ interface CreateBoothUploadInput {
37
+ boothId: string;
38
+ ttlHours?: number;
39
+ metadata?: BoothUploadRecord['metadata'];
40
+ files: Omit<BoothFileItem, 'id'>[];
41
+ }
42
+ interface CreateBoothUploadResult {
43
+ record: BoothUploadRecord;
44
+ downloadUrlPath: string;
45
+ }
46
+ interface BoothVaultStore {
47
+ saveRecord(record: BoothUploadRecord): Promise<void>;
48
+ findByMatchCode(matchCode: string): Promise<BoothUploadRecord | null>;
49
+ findByRecordId?(recordId: string): Promise<BoothUploadRecord | null>;
50
+ incrementDownloadCount(recordId: string): Promise<void>;
51
+ existsByMatchCode(matchCode: string): Promise<boolean>;
52
+ }
53
+
54
+ interface BoothRedeemGuardLike {
55
+ assertAllowed(subjectKey: string): void;
56
+ registerAttempt(subjectKey: string, success: boolean): void;
57
+ }
58
+ interface BoothVaultServiceOptions {
59
+ store: BoothVaultStore;
60
+ codeLength?: number;
61
+ defaultTtlHours?: number;
62
+ baseDownloadPath?: string;
63
+ redeemGuard?: BoothRedeemGuardLike;
64
+ onAuditEvent?: (event: BoothAuditEvent) => void;
65
+ }
66
+ declare class BoothVaultService {
67
+ private emitAudit;
68
+ private readonly store;
69
+ private readonly codeLength;
70
+ private readonly defaultTtlHours;
71
+ private readonly baseDownloadPath;
72
+ private readonly redeemGuard?;
73
+ private readonly onAuditEvent?;
74
+ constructor(options: BoothVaultServiceOptions);
75
+ createUpload(input: CreateBoothUploadInput): Promise<CreateBoothUploadResult>;
76
+ getByMatchCode(matchCode: string): Promise<BoothUploadRecord | null>;
77
+ markDownloaded(recordId: string): Promise<void>;
78
+ resolveDownloadFilesByCode(matchCode: string, options?: {
79
+ requesterKey?: string;
80
+ }): Promise<BoothUploadRecord | null>;
81
+ }
82
+
83
+ export { type BoothVaultStore as B, type CreateBoothUploadInput as C, type BoothUploadRecord as a, type BoothFileItem as b, type BoothFileKind as c, BoothVaultService as d, type CreateBoothUploadResult as e, type BoothAuditEvent as f, type BoothAuditEventType as g, type BoothRedeemGuardLike as h, type BoothVaultServiceOptions as i };
@@ -1,4 +1,4 @@
1
- import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-473Db8Bo.js';
1
+ import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-BH7HM0D0.js';
2
2
  import { P as PopupConfig } from './popup-ClCAZtzk.js';
3
3
  import { CollectionOverview } from './showmasterpiece/service/api/index.js';
4
4
 
@@ -1,4 +1,4 @@
1
- import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-473Db8Bo.mjs';
1
+ import { C as CategoryOption, a as CollectionSummary, b as CreateBookingRequest, c as Booking, d as BatchBookingRequest, e as BatchBookingResponse, f as BookingListParams, g as BookingListResponse } from './booking-BH7HM0D0.mjs';
2
2
  import { P as PopupConfig } from './popup-ClCAZtzk.mjs';
3
3
  import { CollectionOverview } from './showmasterpiece/service/api/index.mjs';
4
4
 
@@ -361,9 +361,24 @@ var createImageElement = (pageIndex) => ({
361
361
  });
362
362
  var FestivalCardConfigEditor = ({ value, onChange }) => {
363
363
  const [activePageIndex, setActivePageIndex] = React3.useState(0);
364
+ const [activeElementId, setActiveElementId] = React3.useState(null);
365
+ const [draggingElementId, setDraggingElementId] = React3.useState(null);
366
+ const previewRef = React3.useRef(null);
367
+ const dragStateRef = React3.useRef(null);
364
368
  const page = value.pages[activePageIndex];
365
369
  const canEditPage = Boolean(page);
366
370
  const pageOptions = React3.useMemo(() => value.pages.map((_, index) => index), [value.pages]);
371
+ const backgroundElement = React3.useMemo(
372
+ () => page?.elements.find(
373
+ (element) => element.type === "image" && Boolean(element.isBackground)
374
+ ),
375
+ [page]
376
+ );
377
+ const foregroundElements = React3.useMemo(
378
+ () => (page?.elements ?? []).filter((element) => !(element.type === "image" && element.isBackground)),
379
+ [page]
380
+ );
381
+ const clampPercent = (valueToClamp) => Math.max(0, Math.min(100, Number.isFinite(valueToClamp) ? valueToClamp : 0));
367
382
  const handlePageCountChange = (nextRaw) => {
368
383
  const next = Number.isFinite(nextRaw) ? Math.max(1, Math.min(12, Math.floor(nextRaw))) : value.pages.length;
369
384
  const resized = resizeFestivalCardPages(value, next);
@@ -400,6 +415,38 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
400
415
  pages: value.pages.map((p, index) => index === activePageIndex ? { ...p, ...patch } : p)
401
416
  });
402
417
  };
418
+ const moveElementWithPointer = (elementId, clientX, clientY, rect) => {
419
+ const bounds = rect || previewRef.current?.getBoundingClientRect();
420
+ if (!bounds || bounds.width <= 0 || bounds.height <= 0) return;
421
+ const x = clampPercent((clientX - bounds.left) / bounds.width * 100);
422
+ const y = clampPercent((clientY - bounds.top) / bounds.height * 100);
423
+ updateElement(elementId, { x, y });
424
+ };
425
+ const handleElementPointerDown = (event, elementId) => {
426
+ if (!previewRef.current) return;
427
+ event.preventDefault();
428
+ const rect = previewRef.current.getBoundingClientRect();
429
+ dragStateRef.current = {
430
+ pointerId: event.pointerId,
431
+ elementId,
432
+ rect
433
+ };
434
+ event.currentTarget.setPointerCapture(event.pointerId);
435
+ setActiveElementId(elementId);
436
+ setDraggingElementId(elementId);
437
+ moveElementWithPointer(elementId, event.clientX, event.clientY, rect);
438
+ };
439
+ const handlePreviewPointerMove = (event) => {
440
+ const dragState = dragStateRef.current;
441
+ if (!dragState || dragState.pointerId !== event.pointerId) return;
442
+ moveElementWithPointer(dragState.elementId, event.clientX, event.clientY, dragState.rect);
443
+ };
444
+ const endPointerDrag = (event) => {
445
+ const dragState = dragStateRef.current;
446
+ if (!dragState || dragState.pointerId !== event.pointerId) return;
447
+ dragStateRef.current = null;
448
+ setDraggingElementId(null);
449
+ };
403
450
  const numberFieldClassName = "w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-slate-900 outline-none focus:border-sky-400 focus:ring-2 focus:ring-sky-100";
404
451
  return /* @__PURE__ */ React3__default.default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React3__default.default.createElement("label", { className: "grid gap-1.5" }, /* @__PURE__ */ React3__default.default.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u9875\u9762\u6570\u91CF"), /* @__PURE__ */ React3__default.default.createElement(
405
452
  "input",
@@ -493,6 +540,73 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
493
540
  className: "rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white"
494
541
  },
495
542
  "+ \u56FE\u7247"
543
+ )), /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-3" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-2 flex items-center justify-between" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs font-semibold tracking-wide text-slate-500" }, "\u62D6\u62FD\u5B9A\u4F4D\uFF08\u76F4\u63A5\u62D6\u52A8\u5143\u7D20\u8C03\u6574 X / Y\uFF09"), /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs text-slate-500" }, draggingElementId ? "\u62D6\u62FD\u4E2D..." : "\u53EF\u62D6\u62FD")), /* @__PURE__ */ React3__default.default.createElement(
544
+ "div",
545
+ {
546
+ ref: previewRef,
547
+ onPointerMove: handlePreviewPointerMove,
548
+ onPointerUp: endPointerDrag,
549
+ onPointerCancel: endPointerDrag,
550
+ className: "relative aspect-[3/4] w-full touch-none overflow-hidden rounded-xl border border-slate-300 bg-slate-900",
551
+ style: {
552
+ backgroundColor: page?.background?.color || "#0f172a",
553
+ backgroundImage: backgroundElement ? `url(${backgroundElement.src})` : page?.background?.image ? `url(${page.background.image})` : void 0,
554
+ backgroundSize: "cover",
555
+ backgroundPosition: "center"
556
+ }
557
+ },
558
+ /* @__PURE__ */ React3__default.default.createElement("div", { className: "absolute inset-0 bg-slate-950/20" }),
559
+ foregroundElements.map((element) => {
560
+ const isActive = activeElementId === element.id;
561
+ const isDragging = draggingElementId === element.id;
562
+ return /* @__PURE__ */ React3__default.default.createElement(
563
+ "div",
564
+ {
565
+ key: element.id,
566
+ role: "button",
567
+ tabIndex: 0,
568
+ onPointerDown: (event) => handleElementPointerDown(event, element.id),
569
+ onClick: () => setActiveElementId(element.id),
570
+ className: `absolute select-none rounded-md ${isDragging ? "cursor-grabbing" : "cursor-grab"} ${isActive ? "ring-2 ring-sky-300" : "ring-1 ring-white/40"}`,
571
+ style: {
572
+ left: `${element.x}%`,
573
+ top: `${element.y}%`,
574
+ width: `${element.width ?? 70}%`,
575
+ height: element.height ? `${element.height}%` : void 0,
576
+ transform: "translate(-50%, -50%)",
577
+ zIndex: isActive ? 4 : 2
578
+ }
579
+ },
580
+ element.type === "text" ? /* @__PURE__ */ React3__default.default.createElement(
581
+ "div",
582
+ {
583
+ className: "w-full rounded-md bg-black/20 px-2 py-1",
584
+ style: {
585
+ color: element.color || "#f8fafc",
586
+ fontSize: element.fontSize || 18,
587
+ fontWeight: element.fontWeight || 500,
588
+ fontFamily: element.fontFamily || "inherit",
589
+ textAlign: element.align || "left",
590
+ lineHeight: 1.35,
591
+ whiteSpace: "pre-wrap"
592
+ }
593
+ },
594
+ element.content || "\u6587\u672C"
595
+ ) : /* @__PURE__ */ React3__default.default.createElement(
596
+ "img",
597
+ {
598
+ src: element.src,
599
+ alt: element.alt || "festival-card-image",
600
+ draggable: false,
601
+ className: "h-full w-full pointer-events-none",
602
+ style: {
603
+ objectFit: element.fit || "cover",
604
+ borderRadius: element.borderRadius || 0
605
+ }
606
+ }
607
+ )
608
+ );
609
+ })
496
610
  )), /* @__PURE__ */ React3__default.default.createElement("div", { className: "grid max-h-[340px] gap-2.5 overflow-auto pr-1" }, (page?.elements ?? []).map((element) => /* @__PURE__ */ React3__default.default.createElement("div", { key: element.id, className: "rounded-xl border border-slate-200 bg-slate-50 p-3" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "mb-2 flex items-center justify-between" }, /* @__PURE__ */ React3__default.default.createElement("div", { className: "text-xs font-semibold tracking-wide text-slate-500" }, element.type.toUpperCase()), /* @__PURE__ */ React3__default.default.createElement(
497
611
  "button",
498
612
  {