@mission-studio/puck 1.0.21 → 1.0.24

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 (33) hide show
  1. package/dist/Popup-Dg78fu78.d.mts +260 -0
  2. package/dist/Popup-L7kcJo05.d.ts +260 -0
  3. package/dist/ResponsiveToggleField-65CqZEK-.d.mts +10 -0
  4. package/dist/ResponsiveToggleField-QCve94L_.d.ts +10 -0
  5. package/dist/chunk-MYS3PLMF.mjs +463 -0
  6. package/dist/chunk-TRPKXVMO.mjs +695 -0
  7. package/dist/{chunk-MWW5LYLN.mjs → chunk-YIPEC4L4.mjs} +709 -1075
  8. package/dist/components/page/astro/index.d.mts +54 -0
  9. package/dist/components/page/astro/index.d.ts +54 -0
  10. package/dist/components/page/astro/index.js +2056 -0
  11. package/dist/components/page/astro/index.mjs +51 -0
  12. package/dist/config/server.js +630 -700
  13. package/dist/config/server.mjs +33 -83
  14. package/dist/config-entry.js +592 -478
  15. package/dist/config-entry.mjs +11 -11
  16. package/dist/{ResponsiveToggleField-CfBKL5oY.d.ts → defaults-j55hBQHu.d.mts} +2 -8
  17. package/dist/{ResponsiveToggleField-BihXsGIJ.d.mts → defaults-z8Ft2j5r.d.ts} +2 -8
  18. package/dist/editor.d.mts +5 -4
  19. package/dist/editor.d.ts +5 -4
  20. package/dist/index.d.mts +5 -3
  21. package/dist/index.d.ts +5 -3
  22. package/dist/index.js +388 -274
  23. package/dist/index.mjs +11 -11
  24. package/dist/renderer.d.mts +9 -250
  25. package/dist/renderer.d.ts +9 -250
  26. package/dist/renderer.js +388 -274
  27. package/dist/renderer.mjs +11 -11
  28. package/dist/resolve/index.d.mts +1 -1
  29. package/dist/resolve/index.d.ts +1 -1
  30. package/dist/{types-D-CIduaE.d.mts → types-HQ6hIbYr.d.mts} +1 -1
  31. package/dist/{types-D-CIduaE.d.ts → types-HQ6hIbYr.d.ts} +1 -1
  32. package/package.json +6 -1
  33. package/dist/chunk-WFLVAZV2.mjs +0 -142
@@ -146,181 +146,7 @@ function Paragraph({
146
146
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { id, style, children: resolvedText });
147
147
  }
148
148
 
149
- // entries/context.tsx
150
- var import_react = require("react");
151
- var import_jsx_runtime3 = require("react/jsx-runtime");
152
- var EntriesContext = (0, import_react.createContext)(null);
153
- function useEntries() {
154
- const context = (0, import_react.useContext)(EntriesContext);
155
- if (!context) {
156
- return {
157
- entries: [],
158
- entryNames: [],
159
- getEntry: () => void 0,
160
- getEntryValue: () => void 0
161
- };
162
- }
163
- return context;
164
- }
165
-
166
- // hooks/useGtmEvent.ts
167
- function useGtmEvent() {
168
- return (eventName, data) => {
169
- if (typeof window === "undefined") return;
170
- if (typeof window.gtag === "function") {
171
- window.gtag("event", eventName, data || {});
172
- }
173
- };
174
- }
175
-
176
- // hooks/useUtmParams.ts
177
- var import_react2 = require("react");
178
- function useUtmParams() {
179
- const [utmParams, setUtmParams] = (0, import_react2.useState)({});
180
- (0, import_react2.useEffect)(() => {
181
- if (typeof window === "undefined") return;
182
- const urlParams = new URLSearchParams(window.location.search);
183
- const source = urlParams.get("utm_source");
184
- const medium = urlParams.get("utm_medium");
185
- const campaign = urlParams.get("utm_campaign");
186
- const content = urlParams.get("utm_content");
187
- const term = urlParams.get("utm_term");
188
- const params = {};
189
- if (source) {
190
- params.source = source;
191
- sessionStorage.setItem("utm_source", source);
192
- } else {
193
- const stored = sessionStorage.getItem("utm_source");
194
- if (stored) params.source = stored;
195
- }
196
- if (medium) {
197
- params.medium = medium;
198
- sessionStorage.setItem("utm_medium", medium);
199
- } else {
200
- const stored = sessionStorage.getItem("utm_medium");
201
- if (stored) params.medium = stored;
202
- }
203
- if (campaign) {
204
- params.campaign = campaign;
205
- sessionStorage.setItem("utm_campaign", campaign);
206
- } else {
207
- const stored = sessionStorage.getItem("utm_campaign");
208
- if (stored) params.campaign = stored;
209
- }
210
- if (content) {
211
- params.content = content;
212
- sessionStorage.setItem("utm_content", content);
213
- } else {
214
- const stored = sessionStorage.getItem("utm_content");
215
- if (stored) params.content = stored;
216
- }
217
- if (term) {
218
- params.term = term;
219
- sessionStorage.setItem("utm_term", term);
220
- } else {
221
- const stored = sessionStorage.getItem("utm_term");
222
- if (stored) params.term = stored;
223
- }
224
- setUtmParams(params);
225
- }, []);
226
- return utmParams;
227
- }
228
-
229
- // theme/context.tsx
230
- var import_react3 = require("react");
231
-
232
- // theme/defaults.ts
233
- var DEFAULT_THEME = {
234
- id: "default",
235
- name: "Default Theme",
236
- colors: {
237
- primary: { color: "#3B82F6", opacity: 100 },
238
- secondary: { color: "#8B5CF6", opacity: 100 },
239
- accent: { color: "#10B981", opacity: 100 },
240
- background: { color: "#FFFFFF", opacity: 100 },
241
- foreground: { color: "#111827", opacity: 100 },
242
- muted: { color: "#F3F4F6", opacity: 100 }
243
- },
244
- typography: {
245
- fontFamily: {
246
- heading: "system-ui, sans-serif",
247
- body: "system-ui, sans-serif"
248
- },
249
- fontSize: {
250
- base: "base",
251
- heading: "4xl"
252
- },
253
- fontWeight: {
254
- normal: 400,
255
- heading: 700
256
- }
257
- },
258
- spacing: {
259
- xs: 8,
260
- sm: 12,
261
- md: 16,
262
- lg: 24,
263
- xl: 32
264
- },
265
- borders: {
266
- radiusSmall: 4,
267
- radiusMedium: 8,
268
- radiusLarge: 16
269
- },
270
- shadows: {
271
- small: "sm",
272
- medium: "md",
273
- large: "lg"
274
- }
275
- };
276
-
277
- // theme/context.tsx
278
- var import_jsx_runtime4 = require("react/jsx-runtime");
279
- var ThemeContext = (0, import_react3.createContext)(null);
280
- function useTheme() {
281
- const context = (0, import_react3.useContext)(ThemeContext);
282
- if (!context) {
283
- return {
284
- theme: DEFAULT_THEME,
285
- resolveColor: (key) => DEFAULT_THEME.colors[key],
286
- resolveSpacing: (key) => DEFAULT_THEME.spacing[key],
287
- resolveBorderRadius: (key) => DEFAULT_THEME.borders[key],
288
- resolveShadow: (key) => DEFAULT_THEME.shadows[key]
289
- };
290
- }
291
- return context;
292
- }
293
-
294
- // utils/index.ts
295
- var import_tailwind_merge = require("tailwind-merge");
296
- var import_clsx = require("clsx");
297
- function hexToRgba(hex, opacity) {
298
- if (hex.startsWith("rgba(")) {
299
- const rgbaMatch = hex.match(
300
- /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/
301
- );
302
- if (rgbaMatch) {
303
- return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${opacity / 100})`;
304
- }
305
- }
306
- if (hex.startsWith("rgb(")) {
307
- const rgbMatch = hex.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
308
- if (rgbMatch) {
309
- return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${opacity / 100})`;
310
- }
311
- }
312
- const sanitized = hex.replace("#", "");
313
- const r = parseInt(sanitized.slice(0, 2), 16);
314
- const g = parseInt(sanitized.slice(2, 4), 16);
315
- const b = parseInt(sanitized.slice(4, 6), 16);
316
- return `rgba(${r}, ${g}, ${b}, ${opacity / 100})`;
317
- }
318
- function cn(...inputs) {
319
- return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
320
- }
321
-
322
- // components/page/Button.tsx
323
- var import_jsx_runtime5 = require("react/jsx-runtime");
149
+ // components/page/primitives/Button.ts
324
150
  var sizeStyles = {
325
151
  sm: { padding: "8px 16px", fontSize: "0.875rem" },
326
152
  md: { padding: "12px 24px", fontSize: "1rem" },
@@ -334,75 +160,8 @@ var radiusMap = {
334
160
  lg: "16px",
335
161
  full: "9999px"
336
162
  };
337
- function isThemeableValue(value) {
338
- return typeof value === "object" && value !== null && "useTheme" in value;
339
- }
340
- function isEntryBoundValue(value) {
341
- return typeof value === "object" && value !== null && "useEntry" in value;
342
- }
343
- function Button({
344
- text,
345
- href,
346
- target = "_self",
347
- variant = "solid",
348
- size = "md",
349
- color,
350
- textColor,
351
- borderRadius = "md",
352
- fullWidth = false,
353
- align = "center",
354
- id
355
- }) {
356
- const { resolveColor: resolveColor2 } = useTheme();
357
- const { getEntryValue } = useEntries();
358
- const utm = useUtmParams();
359
- const sendEvent = useGtmEvent();
360
- const resolvedText = (() => {
361
- if (!text) return "Button";
362
- if (typeof text === "string") return text;
363
- if (isEntryBoundValue(text)) {
364
- if (text.useEntry) {
365
- return String(getEntryValue(text.entryName, text.fieldKey) ?? "Button");
366
- }
367
- return text.value;
368
- }
369
- return "Button";
370
- })();
371
- const handleClick = () => {
372
- const sessionId = typeof window !== "undefined" ? sessionStorage.getItem("session_id") : null;
373
- sendEvent("button_click", {
374
- text: resolvedText,
375
- href: href || void 0,
376
- variant,
377
- session_id: sessionId,
378
- ...utm
379
- });
380
- };
381
- const resolvedColor = (() => {
382
- if (!color) return resolveColor2("primary");
383
- if (typeof color === "string") return { color, opacity: 100 };
384
- if (isThemeableValue(color)) {
385
- return color.useTheme ? resolveColor2(color.themeKey) : color.value;
386
- }
387
- if ("color" in color) return color;
388
- return resolveColor2("primary");
389
- })();
390
- const resolvedTextColor = (() => {
391
- if (!textColor) {
392
- if (variant === "solid") return { color: "#FFFFFF", opacity: 100 };
393
- return resolvedColor;
394
- }
395
- if (typeof textColor === "string")
396
- return { color: textColor, opacity: 100 };
397
- if (isThemeableValue(textColor)) {
398
- return textColor.useTheme ? resolveColor2(textColor.themeKey) : textColor.value;
399
- }
400
- if ("color" in textColor) return textColor;
401
- return { color: "#FFFFFF", opacity: 100 };
402
- })();
403
- const bgColor = hexToRgba(resolvedColor.color, resolvedColor.opacity);
404
- const fgColor = hexToRgba(resolvedTextColor.color, resolvedTextColor.opacity);
405
- const baseStyle = {
163
+ function getBaseStyle(size, borderRadius, fullWidth) {
164
+ return {
406
165
  ...sizeStyles[size],
407
166
  borderRadius: radiusMap[borderRadius],
408
167
  fontWeight: 600,
@@ -415,6 +174,8 @@ function Button({
415
174
  width: fullWidth ? "100%" : "auto",
416
175
  border: "none"
417
176
  };
177
+ }
178
+ function getVariantStyles(variant, bgColor, fgColor) {
418
179
  const variantStyles = {
419
180
  solid: {
420
181
  backgroundColor: bgColor,
@@ -436,14 +197,45 @@ function Button({
436
197
  textDecoration: "underline"
437
198
  }
438
199
  };
439
- const style = { ...baseStyle, ...variantStyles[variant] };
440
- const wrapperStyle = {
200
+ return variantStyles[variant] || variantStyles.solid;
201
+ }
202
+ function getWrapperStyle(align) {
203
+ return {
441
204
  display: "flex",
442
205
  justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center"
443
206
  };
444
- const content = /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("span", { style, children: resolvedText });
207
+ }
208
+
209
+ // components/page/astro/Button.tsx
210
+ var import_jsx_runtime3 = require("react/jsx-runtime");
211
+ function Button({
212
+ text,
213
+ href,
214
+ target = "_self",
215
+ variant = "solid",
216
+ size = "md",
217
+ color,
218
+ textColor,
219
+ borderRadius = "md",
220
+ fullWidth = false,
221
+ align = "center",
222
+ id
223
+ }) {
224
+ const resolvedText = typeof text === "string" ? text : "Button";
225
+ const bgColor = typeof color === "string" ? color : "rgba(99, 102, 241, 1)";
226
+ const fgColor = typeof textColor === "string" ? textColor : variant === "solid" ? "rgba(255, 255, 255, 1)" : bgColor;
227
+ const baseStyle = getBaseStyle(size, borderRadius, fullWidth);
228
+ const variantStyle = getVariantStyles(variant, bgColor, fgColor);
229
+ const style = { ...baseStyle, ...variantStyle };
230
+ const wrapperStyle = getWrapperStyle(align);
231
+ const dataAttrs = {
232
+ "data-gtm-event": "button_click",
233
+ "data-gtm-text": resolvedText,
234
+ "data-gtm-href": href || "",
235
+ "data-gtm-variant": variant
236
+ };
445
237
  if (href) {
446
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
238
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
447
239
  "a",
448
240
  {
449
241
  id,
@@ -451,16 +243,15 @@ function Button({
451
243
  target,
452
244
  style,
453
245
  rel: target === "_blank" ? "noopener noreferrer" : void 0,
454
- onClick: handleClick,
246
+ ...dataAttrs,
455
247
  children: resolvedText
456
248
  }
457
249
  ) });
458
250
  }
459
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("button", { id, type: "button", style, onClick: handleClick, children: resolvedText }) });
251
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("button", { id, type: "button", style, ...dataAttrs, children: resolvedText }) });
460
252
  }
461
253
 
462
- // components/page/Image.tsx
463
- var import_jsx_runtime6 = require("react/jsx-runtime");
254
+ // components/page/primitives/Image.ts
464
255
  var widthMap = {
465
256
  auto: "auto",
466
257
  full: "100%",
@@ -491,66 +282,16 @@ var shadowMap = {
491
282
  lg: "0 10px 15px rgba(0,0,0,0.1)",
492
283
  xl: "0 20px 25px rgba(0,0,0,0.15)"
493
284
  };
494
- function isThemeableValue2(value) {
495
- return typeof value === "object" && value !== null && "useTheme" in value;
496
- }
497
- function isEntryBoundValue2(value) {
498
- return typeof value === "object" && value !== null && "useEntry" in value;
499
- }
500
- function Image({
501
- src,
502
- alt = "",
503
- width = "full",
504
- aspectRatio = "auto",
505
- objectFit = "cover",
506
- borderRadius = "none",
507
- shadow = "none",
508
- align = "center",
509
- caption,
510
- captionColor,
511
- id
512
- }) {
513
- const { resolveColor: resolveColor2 } = useTheme();
514
- const { getEntryValue } = useEntries();
515
- const resolvedSrc = (() => {
516
- if (!src) return "";
517
- if (typeof src === "string") return src;
518
- if (isEntryBoundValue2(src)) {
519
- if (src.useEntry) {
520
- return String(getEntryValue(src.entryName, src.fieldKey) ?? "");
521
- }
522
- return src.value;
523
- }
524
- return "";
525
- })();
526
- const resolvedCaption = (() => {
527
- if (!caption) return "";
528
- if (typeof caption === "string") return caption;
529
- if (isEntryBoundValue2(caption)) {
530
- if (caption.useEntry) {
531
- return String(getEntryValue(caption.entryName, caption.fieldKey) ?? "");
532
- }
533
- return caption.value;
534
- }
535
- return "";
536
- })();
537
- const resolvedCaptionColor = (() => {
538
- if (!captionColor) return resolveColor2("muted");
539
- if (typeof captionColor === "string")
540
- return { color: captionColor, opacity: 100 };
541
- if (isThemeableValue2(captionColor)) {
542
- return captionColor.useTheme ? resolveColor2(captionColor.themeKey) : captionColor.value;
543
- }
544
- if ("color" in captionColor) return captionColor;
545
- return resolveColor2("muted");
546
- })();
547
- const wrapperStyle = {
285
+ function getWrapperStyle2(align) {
286
+ return {
548
287
  display: "flex",
549
288
  flexDirection: "column",
550
289
  alignItems: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center",
551
290
  gap: "8px"
552
291
  };
553
- const imageStyle = {
292
+ }
293
+ function getImageStyle(width, aspectRatio, objectFit, borderRadius, shadow) {
294
+ return {
554
295
  width: widthMap[width],
555
296
  maxWidth: "100%",
556
297
  aspectRatio: aspectRatioMap[aspectRatio],
@@ -559,18 +300,49 @@ function Image({
559
300
  boxShadow: shadowMap[shadow],
560
301
  display: "block"
561
302
  };
562
- const captionStyle = {
303
+ }
304
+ function getCaptionStyle(align, width, captionColor) {
305
+ return {
563
306
  fontSize: "0.875rem",
564
- color: hexToRgba(resolvedCaptionColor.color, resolvedCaptionColor.opacity),
307
+ color: captionColor,
565
308
  textAlign: align,
566
309
  maxWidth: widthMap[width]
567
310
  };
311
+ }
312
+
313
+ // components/page/astro/Image.tsx
314
+ var import_jsx_runtime4 = require("react/jsx-runtime");
315
+ function Image({
316
+ src,
317
+ alt = "",
318
+ width = "full",
319
+ aspectRatio = "auto",
320
+ objectFit = "cover",
321
+ borderRadius = "none",
322
+ shadow = "none",
323
+ align = "center",
324
+ caption,
325
+ captionColor,
326
+ id
327
+ }) {
328
+ const resolvedSrc = typeof src === "string" ? src : "";
329
+ const resolvedCaption = typeof caption === "string" ? caption : "";
330
+ const resolvedCaptionColorStr = typeof captionColor === "string" ? captionColor : "rgba(107, 114, 128, 1)";
331
+ const wrapperStyle = getWrapperStyle2(align);
332
+ const imageStyle2 = getImageStyle(
333
+ width,
334
+ aspectRatio,
335
+ objectFit,
336
+ borderRadius,
337
+ shadow
338
+ );
339
+ const captionStyle = getCaptionStyle(align, width, resolvedCaptionColorStr);
568
340
  if (!resolvedSrc) {
569
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
341
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
570
342
  "div",
571
343
  {
572
344
  style: {
573
- ...imageStyle,
345
+ ...imageStyle2,
574
346
  backgroundColor: "#e5e7eb",
575
347
  display: "flex",
576
348
  alignItems: "center",
@@ -582,15 +354,16 @@ function Image({
582
354
  }
583
355
  ) });
584
356
  }
585
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("figure", { id, style: { ...wrapperStyle, margin: 0 }, children: [
586
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("img", { src: resolvedSrc, alt, style: imageStyle, loading: "lazy" }),
587
- resolvedCaption && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("figcaption", { style: captionStyle, children: resolvedCaption })
357
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)("figure", { id, style: { ...wrapperStyle, margin: 0 }, children: [
358
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("img", { src: resolvedSrc, alt, style: imageStyle2, loading: "lazy" }),
359
+ resolvedCaption && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("figcaption", { style: captionStyle, children: resolvedCaption })
588
360
  ] });
589
361
  }
590
362
 
591
- // components/page/ImageCarousel.tsx
592
- var import_react4 = require("react");
593
- var import_jsx_runtime7 = require("react/jsx-runtime");
363
+ // components/page/astro/ImageCarousel.tsx
364
+ var import_react = require("react");
365
+
366
+ // components/page/primitives/ImageCarousel.ts
594
367
  var aspectRatioMap2 = {
595
368
  "16:9": "16 / 9",
596
369
  "4:3": "4 / 3",
@@ -603,115 +376,38 @@ var radiusMap3 = {
603
376
  md: "8px",
604
377
  lg: "16px"
605
378
  };
606
- function isThemeableValue3(value) {
607
- return typeof value === "object" && value !== null && "useTheme" in value;
608
- }
609
- function ImageCarousel({
610
- images = [],
611
- aspectRatio = "16:9",
612
- borderRadius = "none",
613
- showDots = true,
614
- showArrows = true,
615
- arrowColor,
616
- dotColor,
617
- id
618
- }) {
619
- const [currentIndex, setCurrentIndex] = (0, import_react4.useState)(0);
620
- const { resolveColor: resolveColor2 } = useTheme();
621
- const utm = useUtmParams();
622
- const sendEvent = useGtmEvent();
623
- const resolvedArrowColor = (() => {
624
- if (!arrowColor) return { color: "#FFFFFF", opacity: 100 };
625
- if (typeof arrowColor === "string")
626
- return { color: arrowColor, opacity: 100 };
627
- if (isThemeableValue3(arrowColor)) {
628
- return arrowColor.useTheme ? resolveColor2(arrowColor.themeKey) : arrowColor.value;
629
- }
630
- if ("color" in arrowColor) return arrowColor;
631
- return { color: "#FFFFFF", opacity: 100 };
632
- })();
633
- const resolvedDotColor = (() => {
634
- if (!dotColor) return resolveColor2("primary");
635
- if (typeof dotColor === "string") return { color: dotColor, opacity: 100 };
636
- if (isThemeableValue3(dotColor)) {
637
- return dotColor.useTheme ? resolveColor2(dotColor.themeKey) : dotColor.value;
638
- }
639
- if ("color" in dotColor) return dotColor;
640
- return resolveColor2("primary");
641
- })();
642
- const goToPrevious = () => {
643
- const newIndex = currentIndex === 0 ? images.length - 1 : currentIndex - 1;
644
- setCurrentIndex(newIndex);
645
- sendEvent("carousel_navigate", {
646
- direction: "previous",
647
- slideIndex: newIndex,
648
- totalSlides: images.length,
649
- ...utm
650
- });
651
- };
652
- const goToNext = () => {
653
- const newIndex = currentIndex === images.length - 1 ? 0 : currentIndex + 1;
654
- setCurrentIndex(newIndex);
655
- sendEvent("carousel_navigate", {
656
- direction: "next",
657
- slideIndex: newIndex,
658
- totalSlides: images.length,
659
- ...utm
660
- });
661
- };
662
- const goToSlide = (index) => {
663
- setCurrentIndex(index);
664
- sendEvent("carousel_navigate", {
665
- direction: "direct",
666
- slideIndex: index,
667
- totalSlides: images.length,
668
- ...utm
669
- });
670
- };
671
- if (images.length === 0) {
672
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
673
- "div",
674
- {
675
- style: {
676
- aspectRatio: aspectRatioMap2[aspectRatio],
677
- backgroundColor: "#e5e7eb",
678
- borderRadius: radiusMap3[borderRadius],
679
- display: "flex",
680
- alignItems: "center",
681
- justifyContent: "center",
682
- color: "#9ca3af"
683
- },
684
- children: "No images"
685
- }
686
- );
687
- }
688
- const containerStyle = {
379
+ function getContainerStyle(aspectRatio, borderRadius) {
380
+ return {
689
381
  position: "relative",
690
382
  aspectRatio: aspectRatioMap2[aspectRatio],
691
383
  borderRadius: radiusMap3[borderRadius],
692
384
  overflow: "hidden"
693
385
  };
694
- const slideContainerStyle = {
386
+ }
387
+ function getSlideContainerStyle(currentIndex) {
388
+ return {
695
389
  display: "flex",
696
390
  transition: "transform 0.3s ease-in-out",
697
391
  transform: `translateX(-${currentIndex * 100}%)`,
698
392
  height: "100%"
699
393
  };
700
- const slideStyle = {
701
- minWidth: "100%",
702
- height: "100%"
703
- };
704
- const imageStyle = {
705
- width: "100%",
706
- height: "100%",
707
- objectFit: "cover"
708
- };
709
- const arrowStyle = {
394
+ }
395
+ var slideStyle = {
396
+ minWidth: "100%",
397
+ height: "100%"
398
+ };
399
+ var imageStyle = {
400
+ width: "100%",
401
+ height: "100%",
402
+ objectFit: "cover"
403
+ };
404
+ function getArrowStyle(arrowColor) {
405
+ return {
710
406
  position: "absolute",
711
407
  top: "50%",
712
408
  transform: "translateY(-50%)",
713
409
  backgroundColor: "rgba(0,0,0,0.5)",
714
- color: hexToRgba(resolvedArrowColor.color, resolvedArrowColor.opacity),
410
+ color: arrowColor,
715
411
  border: "none",
716
412
  borderRadius: "50%",
717
413
  width: "40px",
@@ -723,25 +419,102 @@ function ImageCarousel({
723
419
  fontSize: "20px",
724
420
  zIndex: 1
725
421
  };
726
- const dotsContainerStyle = {
727
- position: "absolute",
728
- bottom: "16px",
729
- left: "50%",
730
- transform: "translateX(-50%)",
731
- display: "flex",
732
- gap: "8px",
733
- zIndex: 1
734
- };
735
- const dotStyle = (isActive) => ({
422
+ }
423
+ var dotsContainerStyle = {
424
+ position: "absolute",
425
+ bottom: "16px",
426
+ left: "50%",
427
+ transform: "translateX(-50%)",
428
+ display: "flex",
429
+ gap: "8px",
430
+ zIndex: 1
431
+ };
432
+ function getDotStyle(isActive, dotColor) {
433
+ return {
736
434
  width: "10px",
737
435
  height: "10px",
738
436
  borderRadius: "50%",
739
437
  border: "none",
740
438
  cursor: "pointer",
741
- backgroundColor: isActive ? hexToRgba(resolvedDotColor.color, resolvedDotColor.opacity) : "rgba(255,255,255,0.5)"
742
- });
743
- return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { id, style: containerStyle, children: [
744
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: slideContainerStyle, children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: slideStyle, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
439
+ backgroundColor: isActive ? dotColor : "rgba(255,255,255,0.5)"
440
+ };
441
+ }
442
+ function getEmptyState(aspectRatio, borderRadius) {
443
+ return {
444
+ aspectRatio: aspectRatioMap2[aspectRatio],
445
+ backgroundColor: "#e5e7eb",
446
+ borderRadius: radiusMap3[borderRadius],
447
+ display: "flex",
448
+ alignItems: "center",
449
+ justifyContent: "center",
450
+ color: "#9ca3af"
451
+ };
452
+ }
453
+
454
+ // components/page/astro/ImageCarousel.tsx
455
+ var import_jsx_runtime5 = require("react/jsx-runtime");
456
+ function ImageCarousel({
457
+ images = [],
458
+ aspectRatio = "16:9",
459
+ borderRadius = "none",
460
+ showDots = true,
461
+ showArrows = true,
462
+ arrowColor,
463
+ dotColor,
464
+ id
465
+ }) {
466
+ const [currentIndex, setCurrentIndex] = (0, import_react.useState)(0);
467
+ const arrowColorStr = typeof arrowColor === "string" ? arrowColor : "rgba(255, 255, 255, 1)";
468
+ const dotColorStr = typeof dotColor === "string" ? dotColor : "rgba(99, 102, 241, 1)";
469
+ const goToPrevious = () => {
470
+ const newIndex = currentIndex === 0 ? images.length - 1 : currentIndex - 1;
471
+ setCurrentIndex(newIndex);
472
+ if (typeof window !== "undefined") {
473
+ window.dispatchEvent(
474
+ new CustomEvent("carousel_navigate", {
475
+ detail: {
476
+ direction: "previous",
477
+ slideIndex: newIndex,
478
+ totalSlides: images.length
479
+ }
480
+ })
481
+ );
482
+ }
483
+ };
484
+ const goToNext = () => {
485
+ const newIndex = currentIndex === images.length - 1 ? 0 : currentIndex + 1;
486
+ setCurrentIndex(newIndex);
487
+ if (typeof window !== "undefined") {
488
+ window.dispatchEvent(
489
+ new CustomEvent("carousel_navigate", {
490
+ detail: {
491
+ direction: "next",
492
+ slideIndex: newIndex,
493
+ totalSlides: images.length
494
+ }
495
+ })
496
+ );
497
+ }
498
+ };
499
+ const goToSlide = (index) => {
500
+ setCurrentIndex(index);
501
+ if (typeof window !== "undefined") {
502
+ window.dispatchEvent(
503
+ new CustomEvent("carousel_navigate", {
504
+ detail: {
505
+ direction: "direct",
506
+ slideIndex: index,
507
+ totalSlides: images.length
508
+ }
509
+ })
510
+ );
511
+ }
512
+ };
513
+ if (images.length === 0) {
514
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: getEmptyState(aspectRatio, borderRadius), children: "No images" });
515
+ }
516
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)("div", { id, style: getContainerStyle(aspectRatio, borderRadius), children: [
517
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: getSlideContainerStyle(currentIndex), children: images.map((image, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: slideStyle, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
745
518
  "img",
746
519
  {
747
520
  src: image.src,
@@ -750,34 +523,34 @@ function ImageCarousel({
750
523
  loading: "lazy"
751
524
  }
752
525
  ) }, index)) }),
753
- showArrows && images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(import_jsx_runtime7.Fragment, { children: [
754
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
526
+ showArrows && images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime5.jsxs)(import_jsx_runtime5.Fragment, { children: [
527
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
755
528
  "button",
756
529
  {
757
530
  type: "button",
758
531
  onClick: goToPrevious,
759
- style: { ...arrowStyle, left: "16px" },
532
+ style: { ...getArrowStyle(arrowColorStr), left: "16px" },
760
533
  "aria-label": "Previous slide",
761
534
  children: "\u2039"
762
535
  }
763
536
  ),
764
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
537
+ /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
765
538
  "button",
766
539
  {
767
540
  type: "button",
768
541
  onClick: goToNext,
769
- style: { ...arrowStyle, right: "16px" },
542
+ style: { ...getArrowStyle(arrowColorStr), right: "16px" },
770
543
  "aria-label": "Next slide",
771
544
  children: "\u203A"
772
545
  }
773
546
  )
774
547
  ] }),
775
- showDots && images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: dotsContainerStyle, children: images.map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
548
+ showDots && images.length > 1 && /* @__PURE__ */ (0, import_jsx_runtime5.jsx)("div", { style: dotsContainerStyle, children: images.map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
776
549
  "button",
777
550
  {
778
551
  type: "button",
779
552
  onClick: () => goToSlide(index),
780
- style: dotStyle(index === currentIndex),
553
+ style: getDotStyle(index === currentIndex, dotColorStr),
781
554
  "aria-label": `Go to slide ${index + 1}`
782
555
  },
783
556
  index
@@ -785,8 +558,25 @@ function ImageCarousel({
785
558
  ] });
786
559
  }
787
560
 
561
+ // entries/context.tsx
562
+ var import_react2 = require("react");
563
+ var import_jsx_runtime6 = require("react/jsx-runtime");
564
+ var EntriesContext = (0, import_react2.createContext)(null);
565
+ function useEntries() {
566
+ const context = (0, import_react2.useContext)(EntriesContext);
567
+ if (!context) {
568
+ return {
569
+ entries: [],
570
+ entryNames: [],
571
+ getEntry: () => void 0,
572
+ getEntryValue: () => void 0
573
+ };
574
+ }
575
+ return context;
576
+ }
577
+
788
578
  // components/page/VideoEmbed.tsx
789
- var import_jsx_runtime8 = require("react/jsx-runtime");
579
+ var import_jsx_runtime7 = require("react/jsx-runtime");
790
580
  var aspectRatioMap3 = {
791
581
  "16:9": "56.25%",
792
582
  // 9/16 * 100
@@ -807,7 +597,7 @@ var maxWidthMap = {
807
597
  xl: "1000px",
808
598
  full: "100%"
809
599
  };
810
- function isEntryBoundValue3(value) {
600
+ function isEntryBoundValue(value) {
811
601
  return typeof value === "object" && value !== null && "useEntry" in value;
812
602
  }
813
603
  function parseVideoUrl(url) {
@@ -844,7 +634,7 @@ function VideoEmbed({
844
634
  const resolvedUrl = (() => {
845
635
  if (!url) return "";
846
636
  if (typeof url === "string") return url;
847
- if (isEntryBoundValue3(url)) {
637
+ if (isEntryBoundValue(url)) {
848
638
  if (url.useEntry) {
849
639
  return String(getEntryValue(url.entryName, url.fieldKey) ?? "");
850
640
  }
@@ -853,7 +643,7 @@ function VideoEmbed({
853
643
  return "";
854
644
  })();
855
645
  if (!resolvedUrl) {
856
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
646
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
857
647
  "div",
858
648
  {
859
649
  style: {
@@ -898,7 +688,7 @@ function VideoEmbed({
898
688
  height: "100%",
899
689
  border: "none"
900
690
  };
901
- return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { id, style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("div", { style: containerStyle, children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
691
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { id, style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { style: containerStyle, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
902
692
  "iframe",
903
693
  {
904
694
  src: finalUrl,
@@ -910,8 +700,8 @@ function VideoEmbed({
910
700
  ) }) });
911
701
  }
912
702
 
913
- // components/page/Icon.tsx
914
- var import_jsx_runtime9 = require("react/jsx-runtime");
703
+ // components/page/primitives/Icon.tsx
704
+ var import_jsx_runtime8 = require("react/jsx-runtime");
915
705
  var sizeMap = {
916
706
  sm: { size: "16px", strokeWidth: 2 },
917
707
  md: { size: "24px", strokeWidth: 2 },
@@ -920,7 +710,7 @@ var sizeMap = {
920
710
  "2xl": { size: "64px", strokeWidth: 1.5 }
921
711
  };
922
712
  var icons = {
923
- check: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
713
+ check: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
924
714
  "svg",
925
715
  {
926
716
  width: size,
@@ -931,10 +721,10 @@ var icons = {
931
721
  strokeWidth,
932
722
  strokeLinecap: "round",
933
723
  strokeLinejoin: "round",
934
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polyline", { points: "20 6 9 17 4 12" })
724
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polyline", { points: "20 6 9 17 4 12" })
935
725
  }
936
726
  ),
937
- x: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
727
+ x: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
938
728
  "svg",
939
729
  {
940
730
  width: size,
@@ -946,12 +736,12 @@ var icons = {
946
736
  strokeLinecap: "round",
947
737
  strokeLinejoin: "round",
948
738
  children: [
949
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
950
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
739
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
740
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
951
741
  ]
952
742
  }
953
743
  ),
954
- star: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
744
+ star: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
955
745
  "svg",
956
746
  {
957
747
  width: size,
@@ -962,10 +752,10 @@ var icons = {
962
752
  strokeWidth,
963
753
  strokeLinecap: "round",
964
754
  strokeLinejoin: "round",
965
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" })
755
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polygon", { points: "12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2" })
966
756
  }
967
757
  ),
968
- heart: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
758
+ heart: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
969
759
  "svg",
970
760
  {
971
761
  width: size,
@@ -976,10 +766,10 @@ var icons = {
976
766
  strokeWidth,
977
767
  strokeLinecap: "round",
978
768
  strokeLinejoin: "round",
979
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" })
769
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" })
980
770
  }
981
771
  ),
982
- arrowRight: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
772
+ arrowRight: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
983
773
  "svg",
984
774
  {
985
775
  width: size,
@@ -991,12 +781,12 @@ var icons = {
991
781
  strokeLinecap: "round",
992
782
  strokeLinejoin: "round",
993
783
  children: [
994
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
995
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polyline", { points: "12 5 19 12 12 19" })
784
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("line", { x1: "5", y1: "12", x2: "19", y2: "12" }),
785
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polyline", { points: "12 5 19 12 12 19" })
996
786
  ]
997
787
  }
998
788
  ),
999
- arrowLeft: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
789
+ arrowLeft: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1000
790
  "svg",
1001
791
  {
1002
792
  width: size,
@@ -1008,12 +798,12 @@ var icons = {
1008
798
  strokeLinecap: "round",
1009
799
  strokeLinejoin: "round",
1010
800
  children: [
1011
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("line", { x1: "19", y1: "12", x2: "5", y2: "12" }),
1012
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polyline", { points: "12 19 5 12 12 5" })
801
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("line", { x1: "19", y1: "12", x2: "5", y2: "12" }),
802
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polyline", { points: "12 19 5 12 12 5" })
1013
803
  ]
1014
804
  }
1015
805
  ),
1016
- mail: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
806
+ mail: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1017
807
  "svg",
1018
808
  {
1019
809
  width: size,
@@ -1025,12 +815,12 @@ var icons = {
1025
815
  strokeLinecap: "round",
1026
816
  strokeLinejoin: "round",
1027
817
  children: [
1028
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" }),
1029
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polyline", { points: "22,6 12,13 2,6" })
818
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z" }),
819
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polyline", { points: "22,6 12,13 2,6" })
1030
820
  ]
1031
821
  }
1032
822
  ),
1033
- phone: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
823
+ phone: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1034
824
  "svg",
1035
825
  {
1036
826
  width: size,
@@ -1041,10 +831,10 @@ var icons = {
1041
831
  strokeWidth,
1042
832
  strokeLinecap: "round",
1043
833
  strokeLinejoin: "round",
1044
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" })
834
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z" })
1045
835
  }
1046
836
  ),
1047
- mapPin: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
837
+ mapPin: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1048
838
  "svg",
1049
839
  {
1050
840
  width: size,
@@ -1056,12 +846,12 @@ var icons = {
1056
846
  strokeLinecap: "round",
1057
847
  strokeLinejoin: "round",
1058
848
  children: [
1059
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" }),
1060
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("circle", { cx: "12", cy: "10", r: "3" })
849
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z" }),
850
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "12", cy: "10", r: "3" })
1061
851
  ]
1062
852
  }
1063
853
  ),
1064
- zap: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
854
+ zap: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1065
855
  "svg",
1066
856
  {
1067
857
  width: size,
@@ -1072,10 +862,10 @@ var icons = {
1072
862
  strokeWidth,
1073
863
  strokeLinecap: "round",
1074
864
  strokeLinejoin: "round",
1075
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" })
865
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("polygon", { points: "13 2 3 14 12 14 11 22 21 10 12 10 13 2" })
1076
866
  }
1077
867
  ),
1078
- shield: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
868
+ shield: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(
1079
869
  "svg",
1080
870
  {
1081
871
  width: size,
@@ -1086,10 +876,10 @@ var icons = {
1086
876
  strokeWidth,
1087
877
  strokeLinecap: "round",
1088
878
  strokeLinejoin: "round",
1089
- children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" })
879
+ children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z" })
1090
880
  }
1091
881
  ),
1092
- users: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime9.jsxs)(
882
+ users: ({ size, color, strokeWidth }) => /* @__PURE__ */ (0, import_jsx_runtime8.jsxs)(
1093
883
  "svg",
1094
884
  {
1095
885
  width: size,
@@ -1101,17 +891,24 @@ var icons = {
1101
891
  strokeLinecap: "round",
1102
892
  strokeLinejoin: "round",
1103
893
  children: [
1104
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }),
1105
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
1106
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M23 21v-2a4 4 0 0 0-3-3.87" }),
1107
- /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })
894
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }),
895
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("circle", { cx: "9", cy: "7", r: "4" }),
896
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M23 21v-2a4 4 0 0 0-3-3.87" }),
897
+ /* @__PURE__ */ (0, import_jsx_runtime8.jsx)("path", { d: "M16 3.13a4 4 0 0 1 0 7.75" })
1108
898
  ]
1109
899
  }
1110
900
  )
1111
901
  };
1112
- function isThemeableValue4(value) {
1113
- return typeof value === "object" && value !== null && "useTheme" in value;
902
+ function getWrapperStyle3(align) {
903
+ return {
904
+ display: "flex",
905
+ justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center"
906
+ };
1114
907
  }
908
+ var availableIcons = Object.keys(icons);
909
+
910
+ // components/page/astro/Icon.tsx
911
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1115
912
  function Icon({
1116
913
  name = "check",
1117
914
  size = "md",
@@ -1119,23 +916,10 @@ function Icon({
1119
916
  align = "center",
1120
917
  id
1121
918
  }) {
1122
- const { resolveColor: resolveColor2 } = useTheme();
1123
- const resolvedColor = (() => {
1124
- if (!color) return resolveColor2("primary");
1125
- if (typeof color === "string") return { color, opacity: 100 };
1126
- if (isThemeableValue4(color)) {
1127
- return color.useTheme ? resolveColor2(color.themeKey) : color.value;
1128
- }
1129
- if ("color" in color) return color;
1130
- return resolveColor2("primary");
1131
- })();
919
+ const colorValue = typeof color === "string" ? color : "rgba(99, 102, 241, 1)";
1132
920
  const IconComponent = icons[name.toLowerCase()] || icons.check;
1133
921
  const { size: iconSize, strokeWidth } = sizeMap[size];
1134
- const colorValue = hexToRgba(resolvedColor.color, resolvedColor.opacity);
1135
- const wrapperStyle = {
1136
- display: "flex",
1137
- justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center"
1138
- };
922
+ const wrapperStyle = getWrapperStyle3(align);
1139
923
  return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)("div", { id, style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1140
924
  IconComponent,
1141
925
  {
@@ -1145,7 +929,34 @@ function Icon({
1145
929
  }
1146
930
  ) });
1147
931
  }
1148
- var availableIcons = Object.keys(icons);
932
+
933
+ // utils/index.ts
934
+ var import_tailwind_merge = require("tailwind-merge");
935
+ var import_clsx = require("clsx");
936
+ function hexToRgba(hex, opacity) {
937
+ if (hex.startsWith("rgba(")) {
938
+ const rgbaMatch = hex.match(
939
+ /rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*[\d.]+)?\)/
940
+ );
941
+ if (rgbaMatch) {
942
+ return `rgba(${rgbaMatch[1]}, ${rgbaMatch[2]}, ${rgbaMatch[3]}, ${opacity / 100})`;
943
+ }
944
+ }
945
+ if (hex.startsWith("rgb(")) {
946
+ const rgbMatch = hex.match(/rgb\((\d+),\s*(\d+),\s*(\d+)\)/);
947
+ if (rgbMatch) {
948
+ return `rgba(${rgbMatch[1]}, ${rgbMatch[2]}, ${rgbMatch[3]}, ${opacity / 100})`;
949
+ }
950
+ }
951
+ const sanitized = hex.replace("#", "");
952
+ const r = parseInt(sanitized.slice(0, 2), 16);
953
+ const g = parseInt(sanitized.slice(2, 4), 16);
954
+ const b = parseInt(sanitized.slice(4, 6), 16);
955
+ return `rgba(${r}, ${g}, ${b}, ${opacity / 100})`;
956
+ }
957
+ function cn(...inputs) {
958
+ return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
959
+ }
1149
960
 
1150
961
  // design-system/shadows.ts
1151
962
  var shadowPresets = [
@@ -1183,26 +994,7 @@ var getShadowCSS = (value) => {
1183
994
  return preset?.css ?? "none";
1184
995
  };
1185
996
 
1186
- // components/page/Section.tsx
1187
- var import_jsx_runtime10 = require("react/jsx-runtime");
1188
- function isThemeableValue5(value) {
1189
- return typeof value === "object" && value !== null && "useTheme" in value;
1190
- }
1191
- function resolveBackgroundColor(bg, resolveColor2) {
1192
- if (!bg) return void 0;
1193
- if (typeof bg === "string") return bg;
1194
- if (isThemeableValue5(bg)) {
1195
- if (bg.useTheme) {
1196
- const themeColor = resolveColor2(bg.themeKey);
1197
- return hexToRgba(themeColor.color, themeColor.opacity);
1198
- }
1199
- return hexToRgba(bg.value.color, bg.value.opacity);
1200
- }
1201
- if ("color" in bg && "opacity" in bg) {
1202
- return hexToRgba(bg.color, bg.opacity);
1203
- }
1204
- return void 0;
1205
- }
997
+ // components/page/primitives/Section.ts
1206
998
  function getVisibilityClasses(visibility) {
1207
999
  if (!visibility) return "";
1208
1000
  if (!visibility.mobile && !visibility.desktop) {
@@ -1216,6 +1008,20 @@ function getVisibilityClasses(visibility) {
1216
1008
  }
1217
1009
  return "";
1218
1010
  }
1011
+ function getSectionStyle(verticalPadding, horizontalPadding, gap, backgroundColor, backgroundImage, shadow, borderRadius) {
1012
+ return {
1013
+ padding: `${verticalPadding}px ${horizontalPadding}px`,
1014
+ gap: `${gap}px`,
1015
+ backgroundColor,
1016
+ backgroundImage: backgroundImage ? `url(${backgroundImage})` : void 0,
1017
+ backgroundSize: "cover",
1018
+ backgroundPosition: "center",
1019
+ borderRadius: `${borderRadius}px`
1020
+ };
1021
+ }
1022
+
1023
+ // components/page/astro/Section.tsx
1024
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1219
1025
  function Section({
1220
1026
  children: _children,
1221
1027
  verticalPadding = 48,
@@ -1230,30 +1036,32 @@ function Section({
1230
1036
  visibility,
1231
1037
  puck
1232
1038
  }) {
1233
- const { resolveColor: resolveColor2 } = useTheme();
1234
1039
  const DropZone = puck?.renderDropZone;
1040
+ const bgColor = typeof backgroundColor === "string" ? backgroundColor : void 0;
1041
+ const style = {
1042
+ ...getSectionStyle(
1043
+ verticalPadding,
1044
+ horizontalPadding,
1045
+ gap,
1046
+ bgColor,
1047
+ backgroundImage,
1048
+ shadow,
1049
+ borderRadius
1050
+ ),
1051
+ boxShadow: getShadowCSS(shadow)
1052
+ };
1235
1053
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1236
1054
  "section",
1237
1055
  {
1238
1056
  id: anchorLink,
1239
1057
  className: cn("flex w-full flex-col", getVisibilityClasses(visibility)),
1240
- style: {
1241
- padding: `${verticalPadding}px ${horizontalPadding}px`,
1242
- gap: `${gap}px`,
1243
- backgroundColor: resolveBackgroundColor(backgroundColor, resolveColor2),
1244
- backgroundImage: backgroundImage ? `url(${backgroundImage})` : void 0,
1245
- backgroundSize: "cover",
1246
- backgroundPosition: "center",
1247
- boxShadow: getShadowCSS(shadow),
1248
- borderRadius: `${borderRadius}px`
1249
- },
1058
+ style,
1250
1059
  children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "mx-auto w-full", style: { maxWidth: contentMaxWidth }, children: DropZone && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(DropZone, { zone: "content" }) })
1251
1060
  }
1252
1061
  );
1253
1062
  }
1254
1063
 
1255
- // components/page/Container.tsx
1256
- var import_jsx_runtime11 = require("react/jsx-runtime");
1064
+ // components/page/primitives/Container.ts
1257
1065
  var maxWidthMap2 = {
1258
1066
  sm: "640px",
1259
1067
  md: "768px",
@@ -1269,9 +1077,22 @@ var paddingMap = {
1269
1077
  lg: "32px",
1270
1078
  xl: "48px"
1271
1079
  };
1272
- function isThemeableValue6(value) {
1273
- return typeof value === "object" && value !== null && "useTheme" in value;
1080
+ function getContainerStyle2(maxWidth, paddingX, paddingY, centered, backgroundColor) {
1081
+ return {
1082
+ maxWidth: maxWidthMap2[maxWidth],
1083
+ marginLeft: centered ? "auto" : void 0,
1084
+ marginRight: centered ? "auto" : void 0,
1085
+ paddingLeft: paddingMap[paddingX],
1086
+ paddingRight: paddingMap[paddingX],
1087
+ paddingTop: paddingMap[paddingY],
1088
+ paddingBottom: paddingMap[paddingY],
1089
+ backgroundColor,
1090
+ width: "100%"
1091
+ };
1274
1092
  }
1093
+
1094
+ // components/page/astro/Container.tsx
1095
+ var import_jsx_runtime11 = require("react/jsx-runtime");
1275
1096
  function Container({
1276
1097
  maxWidth = "lg",
1277
1098
  padding,
@@ -1282,36 +1103,21 @@ function Container({
1282
1103
  id,
1283
1104
  puck
1284
1105
  }) {
1285
- const { resolveColor: resolveColor2 } = useTheme();
1286
1106
  const DropZone = puck?.renderDropZone;
1287
- const resolvedBgColor = (() => {
1288
- if (!backgroundColor) return null;
1289
- if (typeof backgroundColor === "string")
1290
- return { color: backgroundColor, opacity: 100 };
1291
- if (isThemeableValue6(backgroundColor)) {
1292
- return backgroundColor.useTheme ? resolveColor2(backgroundColor.themeKey) : backgroundColor.value;
1293
- }
1294
- if ("color" in backgroundColor) return backgroundColor;
1295
- return null;
1296
- })();
1107
+ const bgColor = typeof backgroundColor === "string" ? backgroundColor : void 0;
1297
1108
  const effectivePaddingX = padding || paddingX;
1298
1109
  const effectivePaddingY = padding || paddingY;
1299
- const style = {
1300
- maxWidth: maxWidthMap2[maxWidth],
1301
- marginLeft: centered ? "auto" : void 0,
1302
- marginRight: centered ? "auto" : void 0,
1303
- paddingLeft: paddingMap[effectivePaddingX],
1304
- paddingRight: paddingMap[effectivePaddingX],
1305
- paddingTop: paddingMap[effectivePaddingY],
1306
- paddingBottom: paddingMap[effectivePaddingY],
1307
- backgroundColor: resolvedBgColor ? hexToRgba(resolvedBgColor.color, resolvedBgColor.opacity) : void 0,
1308
- width: "100%"
1309
- };
1110
+ const style = getContainerStyle2(
1111
+ maxWidth,
1112
+ effectivePaddingX,
1113
+ effectivePaddingY,
1114
+ centered,
1115
+ bgColor
1116
+ );
1310
1117
  return /* @__PURE__ */ (0, import_jsx_runtime11.jsx)("div", { id, style, children: DropZone && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DropZone, { zone: "container-content" }) });
1311
1118
  }
1312
1119
 
1313
- // components/page/Columns.tsx
1314
- var import_jsx_runtime12 = require("react/jsx-runtime");
1120
+ // components/page/primitives/Columns.ts
1315
1121
  var gapMap = {
1316
1122
  none: "0",
1317
1123
  sm: "16px",
@@ -1325,6 +1131,17 @@ var alignMap = {
1325
1131
  bottom: "flex-end",
1326
1132
  stretch: "stretch"
1327
1133
  };
1134
+ function getContainerStyle3(columns, gap, verticalAlign) {
1135
+ return {
1136
+ display: "grid",
1137
+ gridTemplateColumns: `repeat(${columns}, 1fr)`,
1138
+ gap: gapMap[gap],
1139
+ alignItems: alignMap[verticalAlign]
1140
+ };
1141
+ }
1142
+
1143
+ // components/page/astro/Columns.tsx
1144
+ var import_jsx_runtime12 = require("react/jsx-runtime");
1328
1145
  function Columns({
1329
1146
  columns = 2,
1330
1147
  gap = "md",
@@ -1334,17 +1151,11 @@ function Columns({
1334
1151
  puck
1335
1152
  }) {
1336
1153
  const DropZone = puck?.renderDropZone;
1337
- const containerStyle = {
1338
- display: "grid",
1339
- gridTemplateColumns: `repeat(${columns}, 1fr)`,
1340
- gap: gapMap[gap],
1341
- alignItems: alignMap[verticalAlign]
1342
- };
1154
+ const containerStyle = getContainerStyle3(columns, gap, verticalAlign);
1343
1155
  return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { id, style: containerStyle, children: Array.from({ length: columns }).map((_, index) => /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { style: { minWidth: 0 }, children: DropZone && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(DropZone, { zone: `column-${index}` }) }, index)) });
1344
1156
  }
1345
1157
 
1346
- // components/page/Card.tsx
1347
- var import_jsx_runtime13 = require("react/jsx-runtime");
1158
+ // components/page/primitives/Card.ts
1348
1159
  var borderWidthMap = {
1349
1160
  none: "0",
1350
1161
  thin: "1px",
@@ -1372,9 +1183,18 @@ var paddingMap2 = {
1372
1183
  lg: "32px",
1373
1184
  xl: "48px"
1374
1185
  };
1375
- function isThemeableValue7(value) {
1376
- return typeof value === "object" && value !== null && "useTheme" in value;
1186
+ function getCardStyle(backgroundColor, borderColor, borderWidth, borderRadius, shadow, padding) {
1187
+ return {
1188
+ backgroundColor,
1189
+ border: borderWidth !== "none" ? `${borderWidthMap[borderWidth]} solid ${borderColor}` : "none",
1190
+ borderRadius: radiusMap5[borderRadius],
1191
+ boxShadow: shadowMap2[shadow],
1192
+ padding: paddingMap2[padding]
1193
+ };
1377
1194
  }
1195
+
1196
+ // components/page/astro/Card.tsx
1197
+ var import_jsx_runtime13 = require("react/jsx-runtime");
1378
1198
  function Card({
1379
1199
  backgroundColor,
1380
1200
  borderColor,
@@ -1385,40 +1205,21 @@ function Card({
1385
1205
  id,
1386
1206
  puck
1387
1207
  }) {
1388
- const { resolveColor: resolveColor2 } = useTheme();
1389
1208
  const DropZone = puck?.renderDropZone;
1390
- const resolvedBgColor = (() => {
1391
- if (!backgroundColor) return resolveColor2("background");
1392
- if (typeof backgroundColor === "string")
1393
- return { color: backgroundColor, opacity: 100 };
1394
- if (isThemeableValue7(backgroundColor)) {
1395
- return backgroundColor.useTheme ? resolveColor2(backgroundColor.themeKey) : backgroundColor.value;
1396
- }
1397
- if ("color" in backgroundColor) return backgroundColor;
1398
- return resolveColor2("background");
1399
- })();
1400
- const resolvedBorderColor = (() => {
1401
- if (!borderColor) return resolveColor2("muted");
1402
- if (typeof borderColor === "string")
1403
- return { color: borderColor, opacity: 100 };
1404
- if (isThemeableValue7(borderColor)) {
1405
- return borderColor.useTheme ? resolveColor2(borderColor.themeKey) : borderColor.value;
1406
- }
1407
- if ("color" in borderColor) return borderColor;
1408
- return resolveColor2("muted");
1409
- })();
1410
- const style = {
1411
- backgroundColor: hexToRgba(resolvedBgColor.color, resolvedBgColor.opacity),
1412
- border: borderWidth !== "none" ? `${borderWidthMap[borderWidth]} solid ${hexToRgba(resolvedBorderColor.color, resolvedBorderColor.opacity)}` : "none",
1413
- borderRadius: radiusMap5[borderRadius],
1414
- boxShadow: shadowMap2[shadow],
1415
- padding: paddingMap2[padding]
1416
- };
1209
+ const bgColor = typeof backgroundColor === "string" ? backgroundColor : "rgba(255, 255, 255, 1)";
1210
+ const bColor = typeof borderColor === "string" ? borderColor : "rgba(229, 231, 235, 1)";
1211
+ const style = getCardStyle(
1212
+ bgColor,
1213
+ bColor,
1214
+ borderWidth,
1215
+ borderRadius,
1216
+ shadow,
1217
+ padding
1218
+ );
1417
1219
  return /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("div", { id, style, children: DropZone && /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(DropZone, { zone: "card-content" }) });
1418
1220
  }
1419
1221
 
1420
- // components/page/Divider.tsx
1421
- var import_jsx_runtime14 = require("react/jsx-runtime");
1222
+ // components/page/primitives/Divider.ts
1422
1223
  var thicknessMap = {
1423
1224
  thin: "1px",
1424
1225
  medium: "2px",
@@ -1436,9 +1237,24 @@ var spacingMap = {
1436
1237
  lg: "32px",
1437
1238
  xl: "48px"
1438
1239
  };
1439
- function isThemeableValue8(value) {
1440
- return typeof value === "object" && value !== null && "useTheme" in value;
1240
+ function getWrapperStyle4(align, spacing) {
1241
+ return {
1242
+ display: "flex",
1243
+ justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center",
1244
+ padding: `${spacingMap[spacing]} 0`
1245
+ };
1246
+ }
1247
+ function getHrStyle(width, thickness, lineStyle, color) {
1248
+ return {
1249
+ width: widthMap2[width],
1250
+ border: "none",
1251
+ borderTop: `${thicknessMap[thickness]} ${lineStyle} ${color}`,
1252
+ margin: 0
1253
+ };
1441
1254
  }
1255
+
1256
+ // components/page/astro/Divider.tsx
1257
+ var import_jsx_runtime14 = require("react/jsx-runtime");
1442
1258
  function Divider({
1443
1259
  style: lineStyle = "solid",
1444
1260
  thickness = "thin",
@@ -1448,32 +1264,13 @@ function Divider({
1448
1264
  spacing = "md",
1449
1265
  id
1450
1266
  }) {
1451
- const { resolveColor: resolveColor2 } = useTheme();
1452
- const resolvedColor = (() => {
1453
- if (!color) return resolveColor2("muted");
1454
- if (typeof color === "string") return { color, opacity: 100 };
1455
- if (isThemeableValue8(color)) {
1456
- return color.useTheme ? resolveColor2(color.themeKey) : color.value;
1457
- }
1458
- if ("color" in color) return color;
1459
- return resolveColor2("muted");
1460
- })();
1461
- const wrapperStyle = {
1462
- display: "flex",
1463
- justifyContent: align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center",
1464
- padding: `${spacingMap[spacing]} 0`
1465
- };
1466
- const hrStyle = {
1467
- width: widthMap2[width],
1468
- border: "none",
1469
- borderTop: `${thicknessMap[thickness]} ${lineStyle} ${hexToRgba(resolvedColor.color, resolvedColor.opacity)}`,
1470
- margin: 0
1471
- };
1267
+ const colorValue = typeof color === "string" ? color : "rgba(107, 114, 128, 1)";
1268
+ const wrapperStyle = getWrapperStyle4(align, spacing);
1269
+ const hrStyle = getHrStyle(width, thickness, lineStyle, colorValue);
1472
1270
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("div", { id, style: wrapperStyle, children: /* @__PURE__ */ (0, import_jsx_runtime14.jsx)("hr", { style: hrStyle }) });
1473
1271
  }
1474
1272
 
1475
- // components/page/Spacer.tsx
1476
- var import_jsx_runtime15 = require("react/jsx-runtime");
1273
+ // components/page/primitives/Spacer.ts
1477
1274
  var sizeMap2 = {
1478
1275
  xs: "8px",
1479
1276
  sm: "16px",
@@ -1483,6 +1280,9 @@ var sizeMap2 = {
1483
1280
  "2xl": "64px",
1484
1281
  "3xl": "96px"
1485
1282
  };
1283
+
1284
+ // components/page/astro/Spacer.tsx
1285
+ var import_jsx_runtime15 = require("react/jsx-runtime");
1486
1286
  function Spacer({ size = "md", id }) {
1487
1287
  const style = {
1488
1288
  height: sizeMap2[size],
@@ -1491,8 +1291,73 @@ function Spacer({ size = "md", id }) {
1491
1291
  return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { id, style, "aria-hidden": "true" });
1492
1292
  }
1493
1293
 
1494
- // components/page/TextBlock.tsx
1294
+ // theme/context.tsx
1295
+ var import_react3 = require("react");
1296
+
1297
+ // theme/defaults.ts
1298
+ var DEFAULT_THEME = {
1299
+ id: "default",
1300
+ name: "Default Theme",
1301
+ colors: {
1302
+ primary: { color: "#3B82F6", opacity: 100 },
1303
+ secondary: { color: "#8B5CF6", opacity: 100 },
1304
+ accent: { color: "#10B981", opacity: 100 },
1305
+ background: { color: "#FFFFFF", opacity: 100 },
1306
+ foreground: { color: "#111827", opacity: 100 },
1307
+ muted: { color: "#F3F4F6", opacity: 100 }
1308
+ },
1309
+ typography: {
1310
+ fontFamily: {
1311
+ heading: "system-ui, sans-serif",
1312
+ body: "system-ui, sans-serif"
1313
+ },
1314
+ fontSize: {
1315
+ base: "base",
1316
+ heading: "4xl"
1317
+ },
1318
+ fontWeight: {
1319
+ normal: 400,
1320
+ heading: 700
1321
+ }
1322
+ },
1323
+ spacing: {
1324
+ xs: 8,
1325
+ sm: 12,
1326
+ md: 16,
1327
+ lg: 24,
1328
+ xl: 32
1329
+ },
1330
+ borders: {
1331
+ radiusSmall: 4,
1332
+ radiusMedium: 8,
1333
+ radiusLarge: 16
1334
+ },
1335
+ shadows: {
1336
+ small: "sm",
1337
+ medium: "md",
1338
+ large: "lg"
1339
+ }
1340
+ };
1341
+
1342
+ // theme/context.tsx
1495
1343
  var import_jsx_runtime16 = require("react/jsx-runtime");
1344
+ var ThemeContext = (0, import_react3.createContext)(null);
1345
+ function useTheme() {
1346
+ const context = (0, import_react3.useContext)(ThemeContext);
1347
+ if (!context) {
1348
+ return {
1349
+ theme: DEFAULT_THEME,
1350
+ resolveColor: (key) => DEFAULT_THEME.colors[key],
1351
+ resolveSpacing: (key) => DEFAULT_THEME.spacing[key],
1352
+ resolveBorderRadius: (key) => DEFAULT_THEME.borders[key],
1353
+ resolveShadow: (key) => DEFAULT_THEME.shadows[key]
1354
+ };
1355
+ }
1356
+ return context;
1357
+ }
1358
+
1359
+ // components/page/TextBlock.tsx
1360
+ var import_jsx_runtime17 = require("react/jsx-runtime");
1496
1361
  var alignmentMap = {
1497
1362
  left: "text-left",
1498
1363
  center: "text-center",
@@ -1505,16 +1370,16 @@ var sizeMap3 = {
1505
1370
  large: "text-5xl",
1506
1371
  xlarge: "text-6xl"
1507
1372
  };
1508
- function isThemeableValue9(value) {
1373
+ function isThemeableValue(value) {
1509
1374
  return typeof value === "object" && value !== null && "useTheme" in value;
1510
1375
  }
1511
- function isEntryBoundValue4(value) {
1376
+ function isEntryBoundValue2(value) {
1512
1377
  return typeof value === "object" && value !== null && "useEntry" in value;
1513
1378
  }
1514
1379
  function resolveColor(color, resolveThemeColor) {
1515
1380
  if (!color) return "#000000";
1516
1381
  if (typeof color === "string") return color;
1517
- if (isThemeableValue9(color)) {
1382
+ if (isThemeableValue(color)) {
1518
1383
  if (color.useTheme) {
1519
1384
  const themeColor = resolveThemeColor(color.themeKey);
1520
1385
  return hexToRgba(themeColor.color, themeColor.opacity);
@@ -1529,7 +1394,7 @@ function resolveColor(color, resolveThemeColor) {
1529
1394
  function resolveColorHex(color, resolveThemeColor) {
1530
1395
  if (!color) return "#000000";
1531
1396
  if (typeof color === "string") return color;
1532
- if (isThemeableValue9(color)) {
1397
+ if (isThemeableValue(color)) {
1533
1398
  if (color.useTheme) {
1534
1399
  return resolveThemeColor(color.themeKey).color;
1535
1400
  }
@@ -1558,7 +1423,7 @@ function TextBlock({
1558
1423
  const resolveText = (value) => {
1559
1424
  if (!value) return void 0;
1560
1425
  if (typeof value === "string") return value;
1561
- if (isEntryBoundValue4(value)) {
1426
+ if (isEntryBoundValue2(value)) {
1562
1427
  if (value.useEntry) {
1563
1428
  const entryVal = getEntryValue(value.entryName, value.fieldKey);
1564
1429
  return entryVal != null ? String(entryVal) : void 0;
@@ -1578,13 +1443,13 @@ function TextBlock({
1578
1443
  WebkitTextFillColor: "transparent",
1579
1444
  backgroundClip: "text"
1580
1445
  } : { color: titleColorValue };
1581
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
1446
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
1582
1447
  "div",
1583
1448
  {
1584
1449
  id: anchorLink,
1585
1450
  className: cn("flex flex-col gap-4", alignmentMap[alignment]),
1586
1451
  children: [
1587
- resolvedTitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1452
+ resolvedTitle && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1588
1453
  "h2",
1589
1454
  {
1590
1455
  className: cn("font-bold", sizeMap3[textSize]),
@@ -1592,8 +1457,8 @@ function TextBlock({
1592
1457
  children: resolvedTitle
1593
1458
  }
1594
1459
  ),
1595
- resolvedSubtitle && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("p", { className: "text-xl", style: { color: subtitleColorValue }, children: resolvedSubtitle }),
1596
- resolvedBody && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1460
+ resolvedSubtitle && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "text-xl", style: { color: subtitleColorValue }, children: resolvedSubtitle }),
1461
+ resolvedBody && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1597
1462
  "div",
1598
1463
  {
1599
1464
  className: "prose max-w-none",
@@ -1607,7 +1472,7 @@ function TextBlock({
1607
1472
  }
1608
1473
 
1609
1474
  // components/page/CustomImage.tsx
1610
- var import_jsx_runtime17 = require("react/jsx-runtime");
1475
+ var import_jsx_runtime18 = require("react/jsx-runtime");
1611
1476
  var alignmentMap2 = {
1612
1477
  left: "mr-auto",
1613
1478
  center: "mx-auto",
@@ -1621,9 +1486,9 @@ function CustomImage({
1621
1486
  fitContent = false
1622
1487
  }) {
1623
1488
  if (!image) {
1624
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "flex h-48 w-full items-center justify-center bg-gray-200 text-gray-400", children: "No image" });
1489
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("div", { className: "flex h-48 w-full items-center justify-center bg-gray-200 text-gray-400", children: "No image" });
1625
1490
  }
1626
- return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
1491
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1627
1492
  "img",
1628
1493
  {
1629
1494
  src: image,
@@ -1640,7 +1505,7 @@ function CustomImage({
1640
1505
 
1641
1506
  // components/page/FeaturesList.tsx
1642
1507
  var import_lucide_react = require("lucide-react");
1643
- var import_jsx_runtime18 = require("react/jsx-runtime");
1508
+ var import_jsx_runtime19 = require("react/jsx-runtime");
1644
1509
  var sizeMap4 = {
1645
1510
  small: { icon: 24, title: "text-base", desc: "text-sm" },
1646
1511
  medium: { icon: 32, title: "text-lg", desc: "text-base" },
@@ -1658,7 +1523,7 @@ function FeaturesList({
1658
1523
  const formatted = iconName.charAt(0).toUpperCase() + iconName.slice(1);
1659
1524
  return import_lucide_react.icons[formatted] || null;
1660
1525
  };
1661
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1526
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1662
1527
  "div",
1663
1528
  {
1664
1529
  id: anchorLink,
@@ -1669,7 +1534,7 @@ function FeaturesList({
1669
1534
  ),
1670
1535
  children: features.map((feature, index) => {
1671
1536
  const IconComponent = feature.icon ? getIcon(feature.icon) : null;
1672
- return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
1537
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1673
1538
  "div",
1674
1539
  {
1675
1540
  className: cn(
@@ -1678,7 +1543,7 @@ function FeaturesList({
1678
1543
  align === "right" && "flex-row-reverse"
1679
1544
  ),
1680
1545
  children: [
1681
- feature.image ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1546
+ feature.image ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1682
1547
  "img",
1683
1548
  {
1684
1549
  src: feature.image,
@@ -1686,7 +1551,7 @@ function FeaturesList({
1686
1551
  className: "object-contain",
1687
1552
  style: { width: sizeConfig.icon, height: sizeConfig.icon }
1688
1553
  }
1689
- ) : IconComponent ? /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
1554
+ ) : IconComponent ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1690
1555
  IconComponent,
1691
1556
  {
1692
1557
  size: sizeConfig.icon,
@@ -1694,9 +1559,9 @@ function FeaturesList({
1694
1559
  className: "flex-shrink-0"
1695
1560
  }
1696
1561
  ) : null,
1697
- /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "flex flex-col gap-1", children: [
1698
- feature.title && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("h3", { className: cn("font-semibold", sizeConfig.title), children: feature.title }),
1699
- feature.description && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("p", { className: cn("text-gray-600", sizeConfig.desc), children: feature.description })
1562
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { className: "flex flex-col gap-1", children: [
1563
+ feature.title && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h3", { className: cn("font-semibold", sizeConfig.title), children: feature.title }),
1564
+ feature.description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: cn("text-gray-600", sizeConfig.desc), children: feature.description })
1700
1565
  ] })
1701
1566
  ]
1702
1567
  },
@@ -1709,7 +1574,7 @@ function FeaturesList({
1709
1574
 
1710
1575
  // components/page/FeatureGrid.tsx
1711
1576
  var import_lucide_react2 = require("lucide-react");
1712
- var import_jsx_runtime19 = require("react/jsx-runtime");
1577
+ var import_jsx_runtime20 = require("react/jsx-runtime");
1713
1578
  var sizeMap5 = {
1714
1579
  small: { icon: 24, title: "text-base", desc: "text-sm" },
1715
1580
  medium: { icon: 32, title: "text-lg", desc: "text-base" },
@@ -1736,8 +1601,8 @@ function FeatureGrid({
1736
1601
  3: "grid-cols-1 md:grid-cols-2 lg:grid-cols-3",
1737
1602
  4: "grid-cols-1 md:grid-cols-2 lg:grid-cols-4"
1738
1603
  };
1739
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)("div", { id: anchorLink, className: "flex flex-col gap-8", children: [
1740
- (heading || description) && /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1604
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { id: anchorLink, className: "flex flex-col gap-8", children: [
1605
+ (heading || description) && /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1741
1606
  "div",
1742
1607
  {
1743
1608
  className: cn(
@@ -1746,14 +1611,14 @@ function FeatureGrid({
1746
1611
  align === "right" && "text-right"
1747
1612
  ),
1748
1613
  children: [
1749
- heading && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("h2", { className: "text-3xl font-bold", style: { color: textColor }, children: heading }),
1750
- description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: "text-gray-600", children: description })
1614
+ heading && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("h2", { className: "text-3xl font-bold", style: { color: textColor }, children: heading }),
1615
+ description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-gray-600", children: description })
1751
1616
  ]
1752
1617
  }
1753
1618
  ),
1754
- /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("div", { className: cn("grid gap-6", columnClass[columns]), children: features.map((feature, index) => {
1619
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: cn("grid gap-6", columnClass[columns]), children: features.map((feature, index) => {
1755
1620
  const IconComponent = feature.icon ? getIcon(feature.icon) : null;
1756
- return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
1621
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
1757
1622
  "div",
1758
1623
  {
1759
1624
  className: cn(
@@ -1761,7 +1626,7 @@ function FeatureGrid({
1761
1626
  align === "center" && "items-center text-center"
1762
1627
  ),
1763
1628
  children: [
1764
- feature.image ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1629
+ feature.image ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1765
1630
  "img",
1766
1631
  {
1767
1632
  src: feature.image,
@@ -1769,14 +1634,14 @@ function FeatureGrid({
1769
1634
  className: "object-contain",
1770
1635
  style: { width: sizeConfig.icon, height: sizeConfig.icon }
1771
1636
  }
1772
- ) : IconComponent ? /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1637
+ ) : IconComponent ? /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1773
1638
  IconComponent,
1774
1639
  {
1775
1640
  size: sizeConfig.icon,
1776
1641
  style: { color: iconColor }
1777
1642
  }
1778
1643
  ) : null,
1779
- feature.title && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
1644
+ feature.title && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1780
1645
  "h3",
1781
1646
  {
1782
1647
  className: cn("font-semibold", sizeConfig.title),
@@ -1784,7 +1649,7 @@ function FeatureGrid({
1784
1649
  children: feature.title
1785
1650
  }
1786
1651
  ),
1787
- feature.description && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("p", { className: cn("text-gray-600", sizeConfig.desc), children: feature.description })
1652
+ feature.description && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: cn("text-gray-600", sizeConfig.desc), children: feature.description })
1788
1653
  ]
1789
1654
  },
1790
1655
  index
@@ -1795,7 +1660,72 @@ function FeatureGrid({
1795
1660
 
1796
1661
  // components/page/Footer.tsx
1797
1662
  var import_lucide_react3 = require("lucide-react");
1798
- var import_jsx_runtime20 = require("react/jsx-runtime");
1663
+
1664
+ // hooks/useGtmEvent.ts
1665
+ function useGtmEvent() {
1666
+ return (eventName, data) => {
1667
+ if (typeof window === "undefined") return;
1668
+ if (typeof window.gtag === "function") {
1669
+ window.gtag("event", eventName, data || {});
1670
+ }
1671
+ };
1672
+ }
1673
+
1674
+ // hooks/useUtmParams.ts
1675
+ var import_react4 = require("react");
1676
+ function useUtmParams() {
1677
+ const [utmParams, setUtmParams] = (0, import_react4.useState)({});
1678
+ (0, import_react4.useEffect)(() => {
1679
+ if (typeof window === "undefined") return;
1680
+ const urlParams = new URLSearchParams(window.location.search);
1681
+ const source = urlParams.get("utm_source");
1682
+ const medium = urlParams.get("utm_medium");
1683
+ const campaign = urlParams.get("utm_campaign");
1684
+ const content = urlParams.get("utm_content");
1685
+ const term = urlParams.get("utm_term");
1686
+ const params = {};
1687
+ if (source) {
1688
+ params.source = source;
1689
+ sessionStorage.setItem("utm_source", source);
1690
+ } else {
1691
+ const stored = sessionStorage.getItem("utm_source");
1692
+ if (stored) params.source = stored;
1693
+ }
1694
+ if (medium) {
1695
+ params.medium = medium;
1696
+ sessionStorage.setItem("utm_medium", medium);
1697
+ } else {
1698
+ const stored = sessionStorage.getItem("utm_medium");
1699
+ if (stored) params.medium = stored;
1700
+ }
1701
+ if (campaign) {
1702
+ params.campaign = campaign;
1703
+ sessionStorage.setItem("utm_campaign", campaign);
1704
+ } else {
1705
+ const stored = sessionStorage.getItem("utm_campaign");
1706
+ if (stored) params.campaign = stored;
1707
+ }
1708
+ if (content) {
1709
+ params.content = content;
1710
+ sessionStorage.setItem("utm_content", content);
1711
+ } else {
1712
+ const stored = sessionStorage.getItem("utm_content");
1713
+ if (stored) params.content = stored;
1714
+ }
1715
+ if (term) {
1716
+ params.term = term;
1717
+ sessionStorage.setItem("utm_term", term);
1718
+ } else {
1719
+ const stored = sessionStorage.getItem("utm_term");
1720
+ if (stored) params.term = stored;
1721
+ }
1722
+ setUtmParams(params);
1723
+ }, []);
1724
+ return utmParams;
1725
+ }
1726
+
1727
+ // components/page/Footer.tsx
1728
+ var import_jsx_runtime21 = require("react/jsx-runtime");
1799
1729
  function Footer({
1800
1730
  logo,
1801
1731
  copyright = "\xA9 2024 Company. All rights reserved.",
@@ -1830,15 +1760,15 @@ function Footer({
1830
1760
  ].filter(
1831
1761
  (link) => !!link.url
1832
1762
  );
1833
- return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1763
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1834
1764
  "footer",
1835
1765
  {
1836
1766
  className: "w-full px-6 py-8",
1837
1767
  style: { backgroundColor, color: textColor },
1838
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)("div", { className: "mx-auto flex max-w-7xl flex-col items-center justify-between gap-6 md:flex-row", children: [
1839
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex items-center gap-4", children: logo && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("img", { src: logo, alt: "Logo", className: "h-8" }) }),
1840
- DropZone && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(DropZone, { zone: "footer-content" }),
1841
- /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("div", { className: "flex items-center gap-4", children: socialLinks.map(({ url, Icon: Icon3 }, index) => /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
1768
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "mx-auto flex max-w-7xl flex-col items-center justify-between gap-6 md:flex-row", children: [
1769
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "flex items-center gap-4", children: logo && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("img", { src: logo, alt: "Logo", className: "h-8" }) }),
1770
+ DropZone && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DropZone, { zone: "footer-content" }),
1771
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("div", { className: "flex items-center gap-4", children: socialLinks.map(({ url, Icon: Icon3 }, index) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1842
1772
  "a",
1843
1773
  {
1844
1774
  href: url,
@@ -1846,11 +1776,11 @@ function Footer({
1846
1776
  rel: "noopener noreferrer",
1847
1777
  className: "transition-opacity hover:opacity-80",
1848
1778
  onClick: () => handleSocialClick(url),
1849
- children: /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(Icon3, { size: 24, style: { color: textColor } })
1779
+ children: /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(Icon3, { size: 24, style: { color: textColor } })
1850
1780
  },
1851
1781
  index
1852
1782
  )) }),
1853
- copyright && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("p", { className: "text-sm opacity-80", children: copyright })
1783
+ copyright && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("p", { className: "text-sm opacity-80", children: copyright })
1854
1784
  ] })
1855
1785
  }
1856
1786
  );
@@ -1859,7 +1789,7 @@ function Footer({
1859
1789
  // components/page/Topbar.tsx
1860
1790
  var import_react5 = require("react");
1861
1791
  var import_lucide_react4 = require("lucide-react");
1862
- var import_jsx_runtime21 = require("react/jsx-runtime");
1792
+ var import_jsx_runtime22 = require("react/jsx-runtime");
1863
1793
  function Topbar({
1864
1794
  logo,
1865
1795
  logoUrl = "/",
@@ -1892,7 +1822,7 @@ function Topbar({
1892
1822
  const renderLink = (item, index) => {
1893
1823
  const className = "hover:opacity-80 transition-opacity";
1894
1824
  if (item.linkType === "external") {
1895
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1825
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1896
1826
  "a",
1897
1827
  {
1898
1828
  href: item.url,
@@ -1906,7 +1836,7 @@ function Topbar({
1906
1836
  );
1907
1837
  }
1908
1838
  if (item.linkType === "scrollTo") {
1909
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1839
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1910
1840
  "a",
1911
1841
  {
1912
1842
  href: item.url,
@@ -1917,7 +1847,7 @@ function Topbar({
1917
1847
  index
1918
1848
  );
1919
1849
  }
1920
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1850
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1921
1851
  "a",
1922
1852
  {
1923
1853
  href: item.url,
@@ -1928,19 +1858,19 @@ function Topbar({
1928
1858
  index
1929
1859
  );
1930
1860
  };
1931
- return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1861
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1932
1862
  "nav",
1933
1863
  {
1934
1864
  className: "sticky top-0 z-50 w-full px-6 py-4",
1935
1865
  style: { backgroundColor, color: textColor },
1936
1866
  children: [
1937
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1867
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1938
1868
  "div",
1939
1869
  {
1940
1870
  className: "mx-auto flex items-center justify-between",
1941
1871
  style: { maxWidth },
1942
1872
  children: [
1943
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
1873
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1944
1874
  "a",
1945
1875
  {
1946
1876
  href: logoUrl,
@@ -1951,25 +1881,25 @@ function Topbar({
1951
1881
  linkType: "internal",
1952
1882
  ...utm
1953
1883
  }),
1954
- children: logo ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("img", { src: logo, alt: "Logo", className: "h-8" }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "text-xl font-bold", children: "Logo" })
1884
+ children: logo ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("img", { src: logo, alt: "Logo", className: "h-8" }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "text-xl font-bold", children: "Logo" })
1955
1885
  }
1956
1886
  ),
1957
- /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "hidden items-center gap-8 md:flex", children: [
1887
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("div", { className: "hidden items-center gap-8 md:flex", children: [
1958
1888
  navItems.map(renderLink),
1959
- DropZone && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DropZone, { zone: "cta" })
1889
+ DropZone && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(DropZone, { zone: "cta" })
1960
1890
  ] }),
1961
- /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("button", { className: "md:hidden", onClick: handleMobileMenuToggle, children: mobileMenuOpen ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react4.X, { size: 24 }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(import_lucide_react4.Menu, { size: 24 }) })
1891
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("button", { className: "md:hidden", onClick: handleMobileMenuToggle, children: mobileMenuOpen ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react4.X, { size: 24 }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react4.Menu, { size: 24 }) })
1962
1892
  ]
1963
1893
  }
1964
1894
  ),
1965
- mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)(
1895
+ mobileMenuOpen && /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1966
1896
  "div",
1967
1897
  {
1968
1898
  className: "absolute top-full right-0 left-0 flex flex-col gap-4 px-6 py-4 md:hidden",
1969
1899
  style: { backgroundColor },
1970
1900
  children: [
1971
1901
  navItems.map(renderLink),
1972
- DropZone && /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(DropZone, { zone: "cta" })
1902
+ DropZone && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(DropZone, { zone: "cta" })
1973
1903
  ]
1974
1904
  }
1975
1905
  )
@@ -1981,12 +1911,12 @@ function Topbar({
1981
1911
  // components/page/Popup.tsx
1982
1912
  var import_react6 = require("react");
1983
1913
  var import_lucide_react5 = require("lucide-react");
1984
- var import_jsx_runtime22 = require("react/jsx-runtime");
1914
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1985
1915
  function Icon2({ name, ...props }) {
1986
1916
  const formatted = name.charAt(0).toUpperCase() + name.slice(1);
1987
1917
  const IconComponent = import_lucide_react5.icons[formatted];
1988
1918
  if (!IconComponent) return null;
1989
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(IconComponent, { ...props });
1919
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(IconComponent, { ...props });
1990
1920
  }
1991
1921
  var widthMap3 = {
1992
1922
  small: "max-w-sm",
@@ -2024,7 +1954,7 @@ function Popup({
2024
1954
  setIsOpen(false);
2025
1955
  sendEvent("popup_close", { ctaText, ...utm });
2026
1956
  };
2027
- const trigger = textLink ? /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1957
+ const trigger = textLink ? /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2028
1958
  "button",
2029
1959
  {
2030
1960
  onClick: handleOpen,
@@ -2032,7 +1962,7 @@ function Popup({
2032
1962
  style: { color: buttonColor },
2033
1963
  children: ctaText
2034
1964
  }
2035
- ) : /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1965
+ ) : /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2036
1966
  "button",
2037
1967
  {
2038
1968
  onClick: handleOpen,
@@ -2042,20 +1972,20 @@ function Popup({
2042
1972
  ),
2043
1973
  style: { backgroundColor: buttonColor, color: textColor },
2044
1974
  children: [
2045
- icon && iconPosition === "left" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Icon2, { name: icon, size: 18 }),
1975
+ icon && iconPosition === "left" && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon2, { name: icon, size: 18 }),
2046
1976
  ctaText,
2047
- icon && iconPosition === "right" && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(Icon2, { name: icon, size: 18 })
1977
+ icon && iconPosition === "right" && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon2, { name: icon, size: 18 })
2048
1978
  ]
2049
1979
  }
2050
1980
  );
2051
- return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(import_jsx_runtime22.Fragment, { children: [
1981
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(import_jsx_runtime23.Fragment, { children: [
2052
1982
  trigger,
2053
- isOpen && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1983
+ isOpen && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2054
1984
  "div",
2055
1985
  {
2056
1986
  className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4",
2057
1987
  onClick: handleClose,
2058
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
1988
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
2059
1989
  "div",
2060
1990
  {
2061
1991
  className: cn(
@@ -2064,15 +1994,15 @@ function Popup({
2064
1994
  ),
2065
1995
  onClick: (e) => e.stopPropagation(),
2066
1996
  children: [
2067
- /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
1997
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
2068
1998
  "button",
2069
1999
  {
2070
2000
  onClick: handleClose,
2071
2001
  className: "absolute top-4 right-4 text-gray-500 hover:text-gray-700",
2072
- children: /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(import_lucide_react5.X, { size: 24 })
2002
+ children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(import_lucide_react5.X, { size: 24 })
2073
2003
  }
2074
2004
  ),
2075
- puck && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(puck.renderDropZone, { zone: "popup-content" })
2005
+ puck && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(puck.renderDropZone, { zone: "popup-content" })
2076
2006
  ]
2077
2007
  }
2078
2008
  )
@@ -2082,7 +2012,7 @@ function Popup({
2082
2012
  }
2083
2013
 
2084
2014
  // config/server.tsx
2085
- var import_jsx_runtime23 = require("react/jsx-runtime");
2015
+ var import_jsx_runtime24 = require("react/jsx-runtime");
2086
2016
  var config = {
2087
2017
  categories: {
2088
2018
  typography: {
@@ -2124,64 +2054,64 @@ var config = {
2124
2054
  },
2125
2055
  components: {
2126
2056
  Heading: {
2127
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Heading, { ...props })
2057
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Heading, { ...props })
2128
2058
  },
2129
2059
  Paragraph: {
2130
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Paragraph, { ...props })
2060
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Paragraph, { ...props })
2131
2061
  },
2132
2062
  Button: {
2133
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Button, { ...props })
2063
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Button, { ...props })
2134
2064
  },
2135
2065
  Image: {
2136
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Image, { ...props })
2066
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Image, { ...props })
2137
2067
  },
2138
2068
  ImageCarousel: {
2139
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ImageCarousel, { ...props })
2069
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ImageCarousel, { ...props })
2140
2070
  },
2141
2071
  VideoEmbed: {
2142
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(VideoEmbed, { ...props })
2072
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(VideoEmbed, { ...props })
2143
2073
  },
2144
2074
  Icon: {
2145
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Icon, { ...props })
2075
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Icon, { ...props })
2146
2076
  },
2147
2077
  Section: {
2148
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Section, { ...props })
2078
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Section, { ...props })
2149
2079
  },
2150
2080
  Container: {
2151
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Container, { ...props })
2081
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Container, { ...props })
2152
2082
  },
2153
2083
  Columns: {
2154
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Columns, { ...props })
2084
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Columns, { ...props })
2155
2085
  },
2156
2086
  Card: {
2157
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Card, { ...props })
2087
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Card, { ...props })
2158
2088
  },
2159
2089
  Divider: {
2160
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Divider, { ...props })
2090
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Divider, { ...props })
2161
2091
  },
2162
2092
  Spacer: {
2163
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Spacer, { ...props })
2093
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Spacer, { ...props })
2164
2094
  },
2165
2095
  TextBlock: {
2166
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(TextBlock, { ...props })
2096
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(TextBlock, { ...props })
2167
2097
  },
2168
2098
  CustomImage: {
2169
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(CustomImage, { ...props })
2099
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(CustomImage, { ...props })
2170
2100
  },
2171
2101
  FeaturesList: {
2172
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FeaturesList, { ...props })
2102
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(FeaturesList, { ...props })
2173
2103
  },
2174
2104
  FeatureGrid: {
2175
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(FeatureGrid, { ...props })
2105
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(FeatureGrid, { ...props })
2176
2106
  },
2177
2107
  Footer: {
2178
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Footer, { ...props })
2108
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Footer, { ...props })
2179
2109
  },
2180
2110
  Topbar: {
2181
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Topbar, { ...props })
2111
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Topbar, { ...props })
2182
2112
  },
2183
2113
  Popup: {
2184
- render: (props) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(Popup, { ...props })
2114
+ render: (props) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(Popup, { ...props })
2185
2115
  }
2186
2116
  }
2187
2117
  };