sa2kit 1.6.70 → 1.6.72

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 (43) hide show
  1. package/dist/festivalCard/core/index.d.mts +1 -1
  2. package/dist/festivalCard/core/index.d.ts +1 -1
  3. package/dist/festivalCard/core/index.js +4 -2
  4. package/dist/festivalCard/core/index.js.map +1 -1
  5. package/dist/festivalCard/core/index.mjs +4 -2
  6. package/dist/festivalCard/core/index.mjs.map +1 -1
  7. package/dist/festivalCard/index.d.mts +2 -2
  8. package/dist/festivalCard/index.d.ts +2 -2
  9. package/dist/festivalCard/index.js +79 -139
  10. package/dist/festivalCard/index.js.map +1 -1
  11. package/dist/festivalCard/index.mjs +79 -139
  12. package/dist/festivalCard/index.mjs.map +1 -1
  13. package/dist/festivalCard/miniapp/index.d.mts +3 -3
  14. package/dist/festivalCard/miniapp/index.d.ts +3 -3
  15. package/dist/festivalCard/miniapp/index.js +21 -15
  16. package/dist/festivalCard/miniapp/index.js.map +1 -1
  17. package/dist/festivalCard/miniapp/index.mjs +21 -15
  18. package/dist/festivalCard/miniapp/index.mjs.map +1 -1
  19. package/dist/festivalCard/routes/index.d.mts +1 -1
  20. package/dist/festivalCard/routes/index.d.ts +1 -1
  21. package/dist/festivalCard/routes/index.js +4 -2
  22. package/dist/festivalCard/routes/index.js.map +1 -1
  23. package/dist/festivalCard/routes/index.mjs +4 -2
  24. package/dist/festivalCard/routes/index.mjs.map +1 -1
  25. package/dist/festivalCard/server/index.d.mts +1 -1
  26. package/dist/festivalCard/server/index.d.ts +1 -1
  27. package/dist/festivalCard/web/index.d.mts +3 -3
  28. package/dist/festivalCard/web/index.d.ts +3 -3
  29. package/dist/festivalCard/web/index.js +79 -139
  30. package/dist/festivalCard/web/index.js.map +1 -1
  31. package/dist/festivalCard/web/index.mjs +79 -139
  32. package/dist/festivalCard/web/index.mjs.map +1 -1
  33. package/dist/{festivalCardService-CgNBOjjO.d.mts → festivalCardService-CqBTVC6x.d.mts} +1 -1
  34. package/dist/{festivalCardService-ClJiAP6P.d.ts → festivalCardService-iFKu0k9q.d.ts} +1 -1
  35. package/dist/index.d.mts +2 -2
  36. package/dist/index.d.ts +2 -2
  37. package/dist/index.js +79 -139
  38. package/dist/index.js.map +1 -1
  39. package/dist/index.mjs +79 -139
  40. package/dist/index.mjs.map +1 -1
  41. package/dist/{types-COyg0XDw.d.mts → types-D2WetAPc.d.mts} +1 -0
  42. package/dist/{types-COyg0XDw.d.ts → types-D2WetAPc.d.ts} +1 -0
  43. package/package.json +1 -1
package/dist/index.mjs CHANGED
@@ -7185,7 +7185,8 @@ var DEFAULT_FESTIVAL_CARD_CONFIG = {
7185
7185
  src: "https://images.unsplash.com/photo-1512389142860-9c449e58a543?auto=format&fit=crop&w=1200&q=80",
7186
7186
  fit: "cover",
7187
7187
  borderRadius: 16,
7188
- alt: "holiday"
7188
+ alt: "holiday",
7189
+ isBackground: false
7189
7190
  }
7190
7191
  ]
7191
7192
  },
@@ -7244,7 +7245,8 @@ var DEFAULT_FESTIVAL_CARD_CONFIG = {
7244
7245
  src: "https://images.unsplash.com/photo-1456324504439-367cee3b3c32?auto=format&fit=crop&w=1200&q=80",
7245
7246
  fit: "cover",
7246
7247
  borderRadius: 14,
7247
- alt: "gift"
7248
+ alt: "gift",
7249
+ isBackground: false
7248
7250
  },
7249
7251
  {
7250
7252
  id: "p3-text-1",
@@ -7310,9 +7312,10 @@ var useFestivalCardConfig = (options) => {
7310
7312
  const [loading, setLoading] = useState(Boolean(options?.fetchConfig));
7311
7313
  const [saving, setSaving] = useState(false);
7312
7314
  useEffect(() => {
7313
- if (!options?.fetchConfig) return;
7315
+ const fetchConfig = options?.fetchConfig;
7316
+ if (!fetchConfig) return;
7314
7317
  let active = true;
7315
- void options.fetchConfig().then((value) => {
7318
+ void fetchConfig().then((value) => {
7316
7319
  if (!active) return;
7317
7320
  setConfig(normalizeFestivalCardConfig(value));
7318
7321
  }).finally(() => {
@@ -7321,16 +7324,17 @@ var useFestivalCardConfig = (options) => {
7321
7324
  return () => {
7322
7325
  active = false;
7323
7326
  };
7324
- }, [options]);
7327
+ }, [options?.fetchConfig]);
7325
7328
  const save = useCallback(async () => {
7326
- if (!options?.onSave) return;
7329
+ const onSave = options?.onSave;
7330
+ if (!onSave) return;
7327
7331
  setSaving(true);
7328
7332
  try {
7329
- await options.onSave(config);
7333
+ await onSave(config);
7330
7334
  } finally {
7331
7335
  setSaving(false);
7332
7336
  }
7333
- }, [config, options]);
7337
+ }, [config, options?.onSave]);
7334
7338
  return useMemo(
7335
7339
  () => ({
7336
7340
  config,
@@ -7344,6 +7348,7 @@ var useFestivalCardConfig = (options) => {
7344
7348
  };
7345
7349
  var elementStyle = (element) => ({
7346
7350
  position: "absolute",
7351
+ zIndex: 2,
7347
7352
  left: `${element.x}%`,
7348
7353
  top: `${element.y}%`,
7349
7354
  width: `${element.width ?? 70}%`,
@@ -7386,22 +7391,23 @@ var renderElement = (element) => {
7386
7391
  );
7387
7392
  };
7388
7393
  var FestivalCardPageRenderer = ({ page }) => {
7394
+ const backgroundElement = page.elements.find(
7395
+ (element) => element.type === "image" && Boolean(element.isBackground)
7396
+ );
7397
+ const foregroundElements = page.elements.filter((element) => !(element.type === "image" && element.isBackground));
7389
7398
  return /* @__PURE__ */ React42__default.createElement(
7390
7399
  "div",
7391
7400
  {
7401
+ className: "relative h-full w-full overflow-hidden rounded-2xl",
7392
7402
  style: {
7393
- position: "relative",
7394
- width: "100%",
7395
- height: "100%",
7396
- overflow: "hidden",
7397
- borderRadius: 16,
7398
7403
  backgroundColor: page.background?.color || "#0f172a",
7399
- backgroundImage: page.background?.image ? `url(${page.background.image})` : void 0,
7404
+ backgroundImage: backgroundElement ? `url(${backgroundElement.src})` : page.background?.image ? `url(${page.background.image})` : void 0,
7400
7405
  backgroundSize: "cover",
7401
7406
  backgroundPosition: "center"
7402
7407
  }
7403
7408
  },
7404
- page.elements.map(renderElement)
7409
+ /* @__PURE__ */ React42__default.createElement("div", { className: "absolute inset-0 bg-slate-950/20" }),
7410
+ foregroundElements.map(renderElement)
7405
7411
  );
7406
7412
  };
7407
7413
 
@@ -7415,100 +7421,31 @@ var FestivalCardBook3D = ({ config, className }) => {
7415
7421
  return /* @__PURE__ */ React42__default.createElement("div", { className }, /* @__PURE__ */ React42__default.createElement(
7416
7422
  "div",
7417
7423
  {
7424
+ className: "w-full min-h-[560px] rounded-3xl p-6 shadow-2xl shadow-slate-900/50",
7418
7425
  style: {
7419
- width: "100%",
7420
- minHeight: 560,
7421
- borderRadius: 24,
7422
- padding: 24,
7423
- background: `linear-gradient(145deg, ${normalized.background?.colorA || "#0c1a34"} 0%, ${normalized.background?.colorB || "#1f4f8a"} 100%)`,
7424
- boxShadow: "0 26px 70px rgba(2, 6, 23, 0.45)"
7426
+ background: `linear-gradient(145deg, ${normalized.background?.colorA || "#0c1a34"} 0%, ${normalized.background?.colorB || "#1f4f8a"} 100%)`
7425
7427
  }
7426
7428
  },
7427
- /* @__PURE__ */ React42__default.createElement(
7428
- "div",
7429
- {
7430
- style: {
7431
- marginBottom: 14,
7432
- color: "#f8fafc",
7433
- fontSize: 14,
7434
- opacity: 0.9,
7435
- textAlign: "center"
7436
- }
7437
- },
7438
- normalized.coverTitle || "Festival Card",
7439
- " \xB7 \u7B2C ",
7440
- currentPage + 1,
7441
- " / ",
7442
- pages.length,
7443
- " \u9875"
7444
- ),
7445
- /* @__PURE__ */ React42__default.createElement("div", { style: { perspective: 1400, width: "100%", maxWidth: 920, margin: "0 auto" } }, /* @__PURE__ */ React42__default.createElement(
7429
+ /* @__PURE__ */ React42__default.createElement("div", { className: "mx-auto w-full max-w-5xl text-center text-slate-100" }, /* @__PURE__ */ React42__default.createElement("h3", { className: "mb-4 text-lg font-semibold" }, normalized.coverTitle || "Festival Card")),
7430
+ /* @__PURE__ */ React42__default.createElement("div", { className: "mx-auto w-full max-w-5xl" }, /* @__PURE__ */ React42__default.createElement("div", { className: "relative h-[460px]" }, pages.map((page, index) => /* @__PURE__ */ React42__default.createElement(
7446
7431
  "div",
7447
7432
  {
7433
+ key: page.id,
7434
+ className: "absolute inset-0 transition-opacity duration-500 ease-out",
7448
7435
  style: {
7449
- position: "relative",
7450
- height: 460,
7451
- transformStyle: "preserve-3d"
7436
+ opacity: index === currentPage ? 1 : 0,
7437
+ pointerEvents: index === currentPage ? "auto" : "none"
7452
7438
  }
7453
7439
  },
7454
- pages.map((page, index) => {
7455
- const isFlipped = index < currentPage;
7456
- const zIndex = pages.length - index;
7457
- return /* @__PURE__ */ React42__default.createElement(
7458
- "div",
7459
- {
7460
- key: page.id,
7461
- style: {
7462
- position: "absolute",
7463
- inset: 0,
7464
- transformStyle: "preserve-3d",
7465
- transformOrigin: "left center",
7466
- transform: `rotateY(${isFlipped ? -170 : 0}deg)`,
7467
- transition: "transform 600ms cubic-bezier(0.2, 0.8, 0.2, 1)",
7468
- zIndex
7469
- }
7470
- },
7471
- /* @__PURE__ */ React42__default.createElement(
7472
- "div",
7473
- {
7474
- style: {
7475
- position: "absolute",
7476
- inset: 0,
7477
- backfaceVisibility: "hidden"
7478
- }
7479
- },
7480
- /* @__PURE__ */ React42__default.createElement(FestivalCardPageRenderer, { page })
7481
- ),
7482
- /* @__PURE__ */ React42__default.createElement(
7483
- "div",
7484
- {
7485
- style: {
7486
- position: "absolute",
7487
- inset: 0,
7488
- transform: "rotateY(180deg)",
7489
- backfaceVisibility: "hidden",
7490
- borderRadius: 16,
7491
- background: "#0f172a"
7492
- }
7493
- }
7494
- )
7495
- );
7496
- })
7497
- )),
7498
- /* @__PURE__ */ React42__default.createElement("div", { style: { display: "flex", justifyContent: "center", gap: 12, marginTop: 18 } }, /* @__PURE__ */ React42__default.createElement(
7440
+ /* @__PURE__ */ React42__default.createElement(FestivalCardPageRenderer, { page })
7441
+ )))),
7442
+ /* @__PURE__ */ React42__default.createElement("div", { className: "mt-5 flex justify-center gap-3" }, /* @__PURE__ */ React42__default.createElement(
7499
7443
  "button",
7500
7444
  {
7501
7445
  type: "button",
7502
7446
  disabled: !canPrev,
7503
7447
  onClick: () => setCurrentPage((p) => Math.max(0, p - 1)),
7504
- style: {
7505
- border: "none",
7506
- borderRadius: 999,
7507
- padding: "9px 16px",
7508
- fontSize: 14,
7509
- cursor: canPrev ? "pointer" : "not-allowed",
7510
- opacity: canPrev ? 1 : 0.4
7511
- }
7448
+ className: "rounded-full bg-white px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45"
7512
7449
  },
7513
7450
  "\u4E0A\u4E00\u9875"
7514
7451
  ), /* @__PURE__ */ React42__default.createElement(
@@ -7517,14 +7454,7 @@ var FestivalCardBook3D = ({ config, className }) => {
7517
7454
  type: "button",
7518
7455
  disabled: !canNext,
7519
7456
  onClick: () => setCurrentPage((p) => Math.min(pages.length - 1, p + 1)),
7520
- style: {
7521
- border: "none",
7522
- borderRadius: 999,
7523
- padding: "9px 16px",
7524
- fontSize: 14,
7525
- cursor: canNext ? "pointer" : "not-allowed",
7526
- opacity: canNext ? 1 : 0.4
7527
- }
7457
+ className: "rounded-full bg-sky-300 px-5 py-2 text-sm font-medium text-slate-900 disabled:cursor-not-allowed disabled:opacity-45"
7528
7458
  },
7529
7459
  "\u4E0B\u4E00\u9875"
7530
7460
  ))
@@ -7535,7 +7465,7 @@ var FestivalCardBook3D = ({ config, className }) => {
7535
7465
  autoPlay: normalized.backgroundMusic.autoPlay,
7536
7466
  loop: normalized.backgroundMusic.loop,
7537
7467
  controls: true,
7538
- style: { width: "100%", marginTop: 10 }
7468
+ className: "mt-3 w-full"
7539
7469
  }
7540
7470
  ) : null);
7541
7471
  };
@@ -7577,16 +7507,17 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
7577
7507
  )
7578
7508
  });
7579
7509
  };
7580
- return /* @__PURE__ */ React42__default.createElement("div", { style: { borderRadius: 16, background: "#0f172a", color: "#e2e8f0", padding: 16 } }, /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gap: 12 } }, /* @__PURE__ */ React42__default.createElement("label", { style: { display: "grid", gap: 6 } }, /* @__PURE__ */ React42__default.createElement("span", null, "\u9875\u9762\u6570\u91CF"), /* @__PURE__ */ React42__default.createElement(
7510
+ return /* @__PURE__ */ React42__default.createElement("div", { className: "rounded-2xl border border-slate-200 bg-white p-4 text-slate-900 shadow-sm" }, /* @__PURE__ */ React42__default.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React42__default.createElement("label", { className: "grid gap-1.5" }, /* @__PURE__ */ React42__default.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u9875\u9762\u6570\u91CF"), /* @__PURE__ */ React42__default.createElement(
7581
7511
  "input",
7582
7512
  {
7583
7513
  type: "number",
7584
7514
  min: 1,
7585
7515
  max: 12,
7586
7516
  value: value.pages.length,
7587
- onChange: (event) => onChange(resizeFestivalCardPages(value, Number(event.target.value)))
7517
+ onChange: (event) => onChange(resizeFestivalCardPages(value, Number(event.target.value))),
7518
+ 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"
7588
7519
  }
7589
- )), /* @__PURE__ */ React42__default.createElement("label", { style: { display: "grid", gap: 6 } }, /* @__PURE__ */ React42__default.createElement("span", null, "\u80CC\u666F\u97F3\u4E50 URL"), /* @__PURE__ */ React42__default.createElement(
7520
+ )), /* @__PURE__ */ React42__default.createElement("label", { className: "grid gap-1.5" }, /* @__PURE__ */ React42__default.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u80CC\u666F\u97F3\u4E50 URL"), /* @__PURE__ */ React42__default.createElement(
7590
7521
  "input",
7591
7522
  {
7592
7523
  type: "url",
@@ -7597,9 +7528,18 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
7597
7528
  ...value.backgroundMusic,
7598
7529
  src: event.target.value
7599
7530
  }
7600
- })
7531
+ }),
7532
+ 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"
7601
7533
  }
7602
- )), /* @__PURE__ */ React42__default.createElement("label", { style: { display: "grid", gap: 6 } }, /* @__PURE__ */ React42__default.createElement("span", null, "\u7F16\u8F91\u9875\u9762"), /* @__PURE__ */ React42__default.createElement("select", { value: activePageIndex, onChange: (event) => setActivePageIndex(Number(event.target.value)) }, pageOptions.map((index) => /* @__PURE__ */ React42__default.createElement("option", { key: index, value: index }, "\u7B2C ", index + 1, " \u9875"))))), canEditPage ? /* @__PURE__ */ React42__default.createElement("div", { style: { marginTop: 16 } }, /* @__PURE__ */ React42__default.createElement("div", { style: { display: "flex", gap: 8, marginBottom: 12 } }, /* @__PURE__ */ React42__default.createElement(
7534
+ )), /* @__PURE__ */ React42__default.createElement("label", { className: "grid gap-1.5" }, /* @__PURE__ */ React42__default.createElement("span", { className: "text-sm font-medium text-slate-700" }, "\u7F16\u8F91\u9875\u9762"), /* @__PURE__ */ React42__default.createElement(
7535
+ "select",
7536
+ {
7537
+ value: activePageIndex,
7538
+ onChange: (event) => setActivePageIndex(Number(event.target.value)),
7539
+ 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"
7540
+ },
7541
+ pageOptions.map((index) => /* @__PURE__ */ React42__default.createElement("option", { key: index, value: index }, "\u7B2C ", index + 1, " \u9875"))
7542
+ ))), canEditPage ? /* @__PURE__ */ React42__default.createElement("div", { className: "mt-4" }, /* @__PURE__ */ React42__default.createElement("div", { className: "mb-3 flex gap-2" }, /* @__PURE__ */ React42__default.createElement(
7603
7543
  "button",
7604
7544
  {
7605
7545
  type: "button",
@@ -7608,7 +7548,8 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
7608
7548
  pages: value.pages.map(
7609
7549
  (p, index) => index === activePageIndex ? { ...p, elements: [...p.elements, createTextElement(index)] } : p
7610
7550
  )
7611
- })
7551
+ }),
7552
+ className: "rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white"
7612
7553
  },
7613
7554
  "+ \u6587\u5B57"
7614
7555
  ), /* @__PURE__ */ React42__default.createElement(
@@ -7620,26 +7561,35 @@ var FestivalCardConfigEditor = ({ value, onChange }) => {
7620
7561
  pages: value.pages.map(
7621
7562
  (p, index) => index === activePageIndex ? { ...p, elements: [...p.elements, createImageElement(index)] } : p
7622
7563
  )
7623
- })
7564
+ }),
7565
+ className: "rounded-lg bg-sky-600 px-3 py-2 text-sm font-medium text-white"
7624
7566
  },
7625
7567
  "+ \u56FE\u7247"
7626
- )), /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gap: 10, maxHeight: 340, overflow: "auto" } }, (page?.elements ?? []).map((element) => /* @__PURE__ */ React42__default.createElement("div", { key: element.id, style: { border: "1px solid #334155", borderRadius: 10, padding: 10 } }, /* @__PURE__ */ React42__default.createElement("div", { style: { marginBottom: 8 } }, element.type.toUpperCase()), element.type === "text" ? /* @__PURE__ */ React42__default.createElement(
7568
+ )), /* @__PURE__ */ React42__default.createElement("div", { className: "grid max-h-[340px] gap-2.5 overflow-auto pr-1" }, (page?.elements ?? []).map((element) => /* @__PURE__ */ React42__default.createElement("div", { key: element.id, className: "rounded-xl border border-slate-200 bg-slate-50 p-3" }, /* @__PURE__ */ React42__default.createElement("div", { className: "mb-2 text-xs font-semibold tracking-wide text-slate-500" }, element.type.toUpperCase()), element.type === "text" ? /* @__PURE__ */ React42__default.createElement(
7627
7569
  "textarea",
7628
7570
  {
7629
7571
  value: element.content,
7630
7572
  onChange: (event) => updateElement(element.id, { content: event.target.value }),
7631
7573
  rows: 3,
7632
- style: { width: "100%" }
7574
+ 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"
7633
7575
  }
7634
- ) : /* @__PURE__ */ React42__default.createElement(
7576
+ ) : /* @__PURE__ */ React42__default.createElement("div", { className: "grid gap-2" }, /* @__PURE__ */ React42__default.createElement(
7635
7577
  "input",
7636
7578
  {
7637
7579
  type: "url",
7638
7580
  value: element.src,
7639
7581
  onChange: (event) => updateElement(element.id, { src: event.target.value }),
7640
- style: { width: "100%" }
7582
+ 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"
7583
+ }
7584
+ ), /* @__PURE__ */ React42__default.createElement("label", { className: "inline-flex items-center gap-2 text-sm text-slate-700" }, /* @__PURE__ */ React42__default.createElement(
7585
+ "input",
7586
+ {
7587
+ type: "checkbox",
7588
+ checked: Boolean(element.isBackground),
7589
+ onChange: (event) => updateElement(element.id, { isBackground: event.target.checked }),
7590
+ className: "h-4 w-4 rounded border-slate-300 text-sky-600"
7641
7591
  }
7642
- ))))) : null);
7592
+ ), "\u4F5C\u4E3A\u672C\u9875\u80CC\u666F\u56FE")))))) : null);
7643
7593
  };
7644
7594
 
7645
7595
  // src/festivalCard/components/FestivalCardStudio.tsx
@@ -7650,13 +7600,13 @@ var FestivalCardStudio = ({ initialConfig, fetchConfig, onSave }) => {
7650
7600
  onSave
7651
7601
  });
7652
7602
  if (loading) return /* @__PURE__ */ React42__default.createElement("div", null, "\u52A0\u8F7D\u4E2D...");
7653
- return /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gridTemplateColumns: "1.4fr 1fr", gap: 16 } }, /* @__PURE__ */ React42__default.createElement(FestivalCardBook3D, { config }), /* @__PURE__ */ React42__default.createElement("div", null, /* @__PURE__ */ React42__default.createElement(FestivalCardConfigEditor, { value: config, onChange: setConfig }), onSave ? /* @__PURE__ */ React42__default.createElement(
7603
+ return /* @__PURE__ */ React42__default.createElement("div", { className: "grid gap-4 lg:grid-cols-[1.45fr_1fr]" }, /* @__PURE__ */ React42__default.createElement(FestivalCardBook3D, { config, className: "h-full" }), /* @__PURE__ */ React42__default.createElement("div", null, /* @__PURE__ */ React42__default.createElement(FestivalCardConfigEditor, { value: config, onChange: setConfig }), onSave ? /* @__PURE__ */ React42__default.createElement(
7654
7604
  "button",
7655
7605
  {
7656
7606
  type: "button",
7657
7607
  onClick: () => void save(),
7658
7608
  disabled: saving,
7659
- style: { marginTop: 12, width: "100%", padding: "10px 16px" }
7609
+ className: "mt-3 w-full rounded-lg bg-slate-900 px-4 py-2.5 text-sm font-medium text-white disabled:opacity-60"
7660
7610
  },
7661
7611
  saving ? "\u4FDD\u5B58\u4E2D..." : "\u4FDD\u5B58\u914D\u7F6E"
7662
7612
  ) : null));
@@ -7720,7 +7670,15 @@ var FestivalCardConfigPage = ({
7720
7670
  await reloadList();
7721
7671
  };
7722
7672
  const mainLink = useMemo(() => `${mainPagePath}?cardId=${encodeURIComponent(selectedId)}`, [mainPagePath, selectedId]);
7723
- return /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gap: 12 } }, /* @__PURE__ */ React42__default.createElement("div", { style: { display: "flex", gap: 10, alignItems: "center" } }, /* @__PURE__ */ React42__default.createElement("select", { value: selectedId, onChange: (event) => setSelectedId(event.target.value) }, list.map((item) => /* @__PURE__ */ React42__default.createElement("option", { key: item.id, value: item.id }, item.name || item.id))), /* @__PURE__ */ React42__default.createElement("button", { type: "button", onClick: () => void createNew() }, "\u65B0\u5EFA\u5361\u7247"), /* @__PURE__ */ React42__default.createElement("a", { href: mainLink, style: { color: "#2563eb", fontSize: 14 } }, "\u6253\u5F00\u4E3B\u9875\u9762")), /* @__PURE__ */ React42__default.createElement(FestivalCardStudio, { fetchConfig, onSave: saveConfig }));
7673
+ return /* @__PURE__ */ React42__default.createElement("div", { className: "grid gap-3" }, /* @__PURE__ */ React42__default.createElement("div", { className: "flex flex-wrap items-center gap-2" }, /* @__PURE__ */ React42__default.createElement(
7674
+ "select",
7675
+ {
7676
+ value: selectedId,
7677
+ onChange: (event) => setSelectedId(event.target.value),
7678
+ className: "min-w-[200px] 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"
7679
+ },
7680
+ list.map((item) => /* @__PURE__ */ React42__default.createElement("option", { key: item.id, value: item.id }, item.name || item.id))
7681
+ ), /* @__PURE__ */ React42__default.createElement("button", { type: "button", onClick: () => void createNew(), className: "rounded-lg bg-slate-900 px-3 py-2 text-sm font-medium text-white" }, "\u65B0\u5EFA\u5361\u7247"), /* @__PURE__ */ React42__default.createElement("a", { href: mainLink, className: "rounded-lg border border-sky-200 bg-sky-50 px-3 py-2 text-sm text-sky-700" }, "\u6253\u5F00\u4E3B\u9875\u9762")), /* @__PURE__ */ React42__default.createElement(FestivalCardStudio, { fetchConfig, onSave: saveConfig }));
7724
7682
  };
7725
7683
  var isSummary = (value) => {
7726
7684
  if (!value || typeof value !== "object") return false;
@@ -7744,7 +7702,6 @@ var FestivalCardManagedPage = ({
7744
7702
  cardId,
7745
7703
  configPagePath = "/festivalCard/config"
7746
7704
  }) => {
7747
- const [list, setList] = useState([]);
7748
7705
  const [currentCardId, setCurrentCardId] = useState(cardId || "");
7749
7706
  const [config, setConfig] = useState(null);
7750
7707
  const [loading, setLoading] = useState(true);
@@ -7753,7 +7710,6 @@ var FestivalCardManagedPage = ({
7753
7710
  const response = await fetch(apiBase, { cache: "no-store" });
7754
7711
  const data = await response.json();
7755
7712
  const items = parseListResponse(data);
7756
- setList(items);
7757
7713
  const first = items[0];
7758
7714
  if (!currentCardId && first) {
7759
7715
  setCurrentCardId(first.id);
@@ -7770,23 +7726,7 @@ var FestivalCardManagedPage = ({
7770
7726
  if (!currentCardId) return configPagePath;
7771
7727
  return `${configPagePath}?cardId=${encodeURIComponent(currentCardId)}`;
7772
7728
  }, [configPagePath, currentCardId]);
7773
- return /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gridTemplateColumns: "240px 1fr", gap: 14 } }, /* @__PURE__ */ React42__default.createElement("aside", { style: { borderRadius: 16, padding: 12, background: "#0f172a", color: "#e2e8f0" } }, /* @__PURE__ */ React42__default.createElement("div", { style: { fontSize: 14, marginBottom: 8 } }, "\u5361\u7247\u5217\u8868"), /* @__PURE__ */ React42__default.createElement("div", { style: { display: "grid", gap: 8 } }, list.map((item) => /* @__PURE__ */ React42__default.createElement(
7774
- "button",
7775
- {
7776
- key: item.id,
7777
- type: "button",
7778
- onClick: () => setCurrentCardId(item.id),
7779
- style: {
7780
- borderRadius: 8,
7781
- border: "1px solid #334155",
7782
- padding: "8px 10px",
7783
- textAlign: "left",
7784
- background: currentCardId === item.id ? "#1e293b" : "#0b1220",
7785
- color: "#e2e8f0"
7786
- }
7787
- },
7788
- item.name || item.id
7789
- ))), /* @__PURE__ */ React42__default.createElement("a", { href: configLink, style: { display: "inline-block", marginTop: 12, color: "#93c5fd", fontSize: 13 } }, "\u8FDB\u5165\u914D\u7F6E\u9875")), /* @__PURE__ */ React42__default.createElement("div", null, loading || !config ? /* @__PURE__ */ React42__default.createElement("div", null, "\u52A0\u8F7D\u4E2D...") : /* @__PURE__ */ React42__default.createElement(FestivalCardBook3D, { config })));
7729
+ return /* @__PURE__ */ React42__default.createElement("div", { className: "space-y-4" }, /* @__PURE__ */ React42__default.createElement("div", { className: "flex justify-end" }, /* @__PURE__ */ React42__default.createElement("a", { href: configLink, className: "rounded-lg border border-slate-700 bg-slate-900 px-3 py-1.5 text-sm text-sky-300" }, "\u8FDB\u5165\u914D\u7F6E\u9875")), /* @__PURE__ */ React42__default.createElement("div", null, loading || !config ? /* @__PURE__ */ React42__default.createElement("div", { className: "py-12 text-center text-slate-400" }, "\u52A0\u8F7D\u4E2D...") : /* @__PURE__ */ React42__default.createElement(FestivalCardBook3D, { config })));
7790
7730
  };
7791
7731
 
7792
7732
  // src/festivalCard/server/db.ts