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.
- package/dist/{booking-473Db8Bo.d.mts → booking-BH7HM0D0.d.mts} +1 -0
- package/dist/{booking-473Db8Bo.d.ts → booking-BH7HM0D0.d.ts} +1 -0
- package/dist/{bookingAdminService-DqQ7hEGw.d.ts → bookingAdminService-nr1vOp6I.d.ts} +1 -1
- package/dist/{bookingAdminService-SBX4JA_U.d.mts → bookingAdminService-pvk2MY1r.d.mts} +1 -1
- package/dist/boothVaultService-Cn4WPhjg.d.mts +83 -0
- package/dist/boothVaultService-Cn4WPhjg.d.ts +83 -0
- package/dist/{client-Bkn6mRI7.d.ts → client-UDQ7uMFA.d.ts} +1 -1
- package/dist/{client-exYn2Qla.d.mts → client-jOToHJEx.d.mts} +1 -1
- package/dist/festivalCard/index.js +114 -0
- package/dist/festivalCard/index.js.map +1 -1
- package/dist/festivalCard/index.mjs +115 -1
- package/dist/festivalCard/index.mjs.map +1 -1
- package/dist/festivalCard/web/index.js +114 -0
- package/dist/festivalCard/web/index.js.map +1 -1
- package/dist/festivalCard/web/index.mjs +115 -1
- package/dist/festivalCard/web/index.mjs.map +1 -1
- package/dist/{index-z15F7afa.d.mts → index-Bs06cHTn.d.mts} +2 -2
- package/dist/{index-BJpxvH7X.d.ts → index-C-oNM7Gv.d.ts} +1 -1
- package/dist/{index-XTV6IU-M.d.ts → index-CUab5EBV.d.ts} +2 -2
- package/dist/{index-Cum2EknK.d.mts → index-CYDb3AKs.d.mts} +1 -1
- package/dist/{index-DyxLpkmm.d.mts → index-DBB4ad0S.d.mts} +2 -2
- package/dist/{index-CdTIsNsy.d.ts → index-DBHwbXrv.d.ts} +2 -2
- package/dist/index.d.mts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +480 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +472 -2
- package/dist/index.mjs.map +1 -1
- package/dist/showmasterpiece/core.d.mts +3 -3
- package/dist/showmasterpiece/core.d.ts +3 -3
- package/dist/showmasterpiece/db.d.mts +2 -0
- package/dist/showmasterpiece/db.d.ts +2 -0
- package/dist/showmasterpiece/db.js +4 -2
- package/dist/showmasterpiece/db.js.map +1 -1
- package/dist/showmasterpiece/db.mjs +4 -2
- package/dist/showmasterpiece/db.mjs.map +1 -1
- package/dist/showmasterpiece/index.js +18 -2
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +18 -2
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +2 -2
- package/dist/showmasterpiece/logic/index.d.ts +2 -2
- package/dist/showmasterpiece/server/index.js +4 -2
- package/dist/showmasterpiece/server/index.js.map +1 -1
- package/dist/showmasterpiece/server/index.mjs +4 -2
- package/dist/showmasterpiece/server/index.mjs.map +1 -1
- package/dist/showmasterpiece/service/api/index.d.mts +1 -1
- package/dist/showmasterpiece/service/api/index.d.ts +1 -1
- package/dist/showmasterpiece/service/client-business/index.d.mts +3 -3
- package/dist/showmasterpiece/service/client-business/index.d.ts +3 -3
- package/dist/showmasterpiece/service/index.d.mts +6 -6
- package/dist/showmasterpiece/service/index.d.ts +6 -6
- package/dist/showmasterpiece/service/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/service/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/service/web/index.d.mts +4 -4
- package/dist/showmasterpiece/service/web/index.d.ts +4 -4
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +2 -2
- package/dist/showmasterpiece/ui/miniapp/index.js +4 -3
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.mjs +4 -3
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.js +18 -2
- package/dist/showmasterpiece/ui/web/index.js.map +1 -1
- package/dist/showmasterpiece/ui/web/index.mjs +18 -2
- package/dist/showmasterpiece/ui/web/index.mjs.map +1 -1
- package/dist/showmasterpiece/web/index.js +18 -2
- package/dist/showmasterpiece/web/index.js.map +1 -1
- package/dist/showmasterpiece/web/index.mjs +18 -2
- package/dist/showmasterpiece/web/index.mjs.map +1 -1
- package/dist/vocaloidBooth/index.d.mts +64 -0
- package/dist/vocaloidBooth/index.d.ts +64 -0
- package/dist/vocaloidBooth/index.js +376 -0
- package/dist/vocaloidBooth/index.js.map +1 -0
- package/dist/vocaloidBooth/index.mjs +362 -0
- package/dist/vocaloidBooth/index.mjs.map +1 -0
- package/dist/vocaloidBooth/server/index.d.mts +110 -0
- package/dist/vocaloidBooth/server/index.d.ts +110 -0
- package/dist/vocaloidBooth/server/index.js +247 -0
- package/dist/vocaloidBooth/server/index.js.map +1 -0
- package/dist/vocaloidBooth/server/index.mjs +237 -0
- package/dist/vocaloidBooth/server/index.mjs.map +1 -0
- package/dist/vocaloidBooth/web/index.d.mts +3 -0
- package/dist/vocaloidBooth/web/index.d.ts +3 -0
- package/dist/vocaloidBooth/web/index.js +376 -0
- package/dist/vocaloidBooth/web/index.js.map +1 -0
- package/dist/vocaloidBooth/web/index.mjs +362 -0
- package/dist/vocaloidBooth/web/index.mjs.map +1 -0
- package/package.json +1 -1
|
@@ -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-
|
|
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-
|
|
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
|
{
|