@fayz-ai/plugin-linkinbio 0.9.0

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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/index.cjs +33 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.ts +10 -0
  6. package/dist/index.d.ts.map +1 -0
  7. package/dist/index.js +31 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/public/BioPage.d.ts +8 -0
  10. package/dist/public/BioPage.d.ts.map +1 -0
  11. package/dist/public/BioPageRenderer.d.ts +11 -0
  12. package/dist/public/BioPageRenderer.d.ts.map +1 -0
  13. package/dist/public/__tests__/manifest.test.d.ts +2 -0
  14. package/dist/public/__tests__/manifest.test.d.ts.map +1 -0
  15. package/dist/public/blocks/BioSection.d.ts +7 -0
  16. package/dist/public/blocks/BioSection.d.ts.map +1 -0
  17. package/dist/public/blocks/CTASection.d.ts +7 -0
  18. package/dist/public/blocks/CTASection.d.ts.map +1 -0
  19. package/dist/public/blocks/EmbedSection.d.ts +7 -0
  20. package/dist/public/blocks/EmbedSection.d.ts.map +1 -0
  21. package/dist/public/blocks/FeaturedBlock.d.ts +7 -0
  22. package/dist/public/blocks/FeaturedBlock.d.ts.map +1 -0
  23. package/dist/public/blocks/GallerySection.d.ts +7 -0
  24. package/dist/public/blocks/GallerySection.d.ts.map +1 -0
  25. package/dist/public/blocks/HeroSection.d.ts +9 -0
  26. package/dist/public/blocks/HeroSection.d.ts.map +1 -0
  27. package/dist/public/blocks/LinksBlock.d.ts +7 -0
  28. package/dist/public/blocks/LinksBlock.d.ts.map +1 -0
  29. package/dist/public/blocks/MusicReleasesBlock.d.ts +7 -0
  30. package/dist/public/blocks/MusicReleasesBlock.d.ts.map +1 -0
  31. package/dist/public/blocks/ProfileHeader.d.ts +8 -0
  32. package/dist/public/blocks/ProfileHeader.d.ts.map +1 -0
  33. package/dist/public/blocks/ProjectSection.d.ts +7 -0
  34. package/dist/public/blocks/ProjectSection.d.ts.map +1 -0
  35. package/dist/public/blocks/SocialLinksSection.d.ts +7 -0
  36. package/dist/public/blocks/SocialLinksSection.d.ts.map +1 -0
  37. package/dist/public/blocks/StatsSection.d.ts +7 -0
  38. package/dist/public/blocks/StatsSection.d.ts.map +1 -0
  39. package/dist/public/blocks/TextSection.d.ts +7 -0
  40. package/dist/public/blocks/TextSection.d.ts.map +1 -0
  41. package/dist/public/blocks/TourDatesBlock.d.ts +7 -0
  42. package/dist/public/blocks/TourDatesBlock.d.ts.map +1 -0
  43. package/dist/public/blocks/VenueListSection.d.ts +7 -0
  44. package/dist/public/blocks/VenueListSection.d.ts.map +1 -0
  45. package/dist/public/blocks/VideoGridSection.d.ts +7 -0
  46. package/dist/public/blocks/VideoGridSection.d.ts.map +1 -0
  47. package/dist/public/blocks/index.d.ts +17 -0
  48. package/dist/public/blocks/index.d.ts.map +1 -0
  49. package/dist/public/components/Carousel.d.ts +11 -0
  50. package/dist/public/components/Carousel.d.ts.map +1 -0
  51. package/dist/public/components/PlatformIcon.d.ts +9 -0
  52. package/dist/public/components/PlatformIcon.d.ts.map +1 -0
  53. package/dist/public/components/Reveal.d.ts +13 -0
  54. package/dist/public/components/Reveal.d.ts.map +1 -0
  55. package/dist/public/context.d.ts +18 -0
  56. package/dist/public/context.d.ts.map +1 -0
  57. package/dist/public/createPublicLinkInBioPlugin.d.ts +38 -0
  58. package/dist/public/createPublicLinkInBioPlugin.d.ts.map +1 -0
  59. package/dist/public/data.d.ts +11 -0
  60. package/dist/public/data.d.ts.map +1 -0
  61. package/dist/public/data.supabase.d.ts +11 -0
  62. package/dist/public/data.supabase.d.ts.map +1 -0
  63. package/dist/public/index.cjs +1750 -0
  64. package/dist/public/index.cjs.map +1 -0
  65. package/dist/public/index.d.ts +18 -0
  66. package/dist/public/index.d.ts.map +1 -0
  67. package/dist/public/index.js +1731 -0
  68. package/dist/public/index.js.map +1 -0
  69. package/dist/public/registry.d.ts +17 -0
  70. package/dist/public/registry.d.ts.map +1 -0
  71. package/dist/public/utils.d.ts +9 -0
  72. package/dist/public/utils.d.ts.map +1 -0
  73. package/dist/types.d.ts +251 -0
  74. package/dist/types.d.ts.map +1 -0
  75. package/package.json +68 -0
  76. package/src/index.ts +56 -0
  77. package/src/public/BioPage.tsx +123 -0
  78. package/src/public/BioPageRenderer.tsx +249 -0
  79. package/src/public/__tests__/manifest.test.ts +39 -0
  80. package/src/public/blocks/BioSection.tsx +66 -0
  81. package/src/public/blocks/CTASection.tsx +56 -0
  82. package/src/public/blocks/EmbedSection.tsx +53 -0
  83. package/src/public/blocks/FeaturedBlock.tsx +70 -0
  84. package/src/public/blocks/GallerySection.tsx +148 -0
  85. package/src/public/blocks/HeroSection.tsx +107 -0
  86. package/src/public/blocks/LinksBlock.tsx +80 -0
  87. package/src/public/blocks/MusicReleasesBlock.tsx +83 -0
  88. package/src/public/blocks/ProfileHeader.tsx +176 -0
  89. package/src/public/blocks/ProjectSection.tsx +158 -0
  90. package/src/public/blocks/SocialLinksSection.tsx +125 -0
  91. package/src/public/blocks/StatsSection.tsx +46 -0
  92. package/src/public/blocks/TextSection.tsx +29 -0
  93. package/src/public/blocks/TourDatesBlock.tsx +83 -0
  94. package/src/public/blocks/VenueListSection.tsx +91 -0
  95. package/src/public/blocks/VideoGridSection.tsx +105 -0
  96. package/src/public/blocks/index.ts +16 -0
  97. package/src/public/components/Carousel.tsx +90 -0
  98. package/src/public/components/PlatformIcon.tsx +56 -0
  99. package/src/public/components/Reveal.tsx +58 -0
  100. package/src/public/context.tsx +30 -0
  101. package/src/public/createPublicLinkInBioPlugin.ts +81 -0
  102. package/src/public/data.supabase.ts +31 -0
  103. package/src/public/data.ts +29 -0
  104. package/src/public/index.ts +75 -0
  105. package/src/public/registry.ts +40 -0
  106. package/src/public/utils.ts +102 -0
  107. package/src/types.ts +328 -0
@@ -0,0 +1,1750 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var core = require('@fayz-ai/core');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var reactRouterDom = require('react-router-dom');
7
+ var lucideReact = require('lucide-react');
8
+ var si = require('react-icons/si');
9
+
10
+ // src/public/createPublicLinkInBioPlugin.ts
11
+
12
+ // src/public/data.ts
13
+ function createMockBioPageProvider(options = {}) {
14
+ const seed = options.seed ?? {};
15
+ return {
16
+ async getBySlug(slug) {
17
+ return seed[slug] ?? null;
18
+ }
19
+ };
20
+ }
21
+ function createSupabaseBioPageProvider(options = {}) {
22
+ const table = options.table ?? "press_kits";
23
+ return {
24
+ async getBySlug(slug) {
25
+ const client = core.getSupabaseClientOptional();
26
+ if (!client) return null;
27
+ const { data, error } = await client.from(table).select("data, is_published").eq("slug", slug).maybeSingle();
28
+ if (error || !data) return null;
29
+ if (!data.is_published) return null;
30
+ return data.data;
31
+ }
32
+ };
33
+ }
34
+ var LinkInBioContext = react.createContext(null);
35
+ function LinkInBioProvider({
36
+ value,
37
+ children
38
+ }) {
39
+ return /* @__PURE__ */ jsxRuntime.jsx(LinkInBioContext.Provider, { value, children });
40
+ }
41
+ function useLinkInBio() {
42
+ const ctx = react.useContext(LinkInBioContext);
43
+ if (!ctx) {
44
+ throw new Error("useLinkInBio must be used within a LinkInBioProvider (mount the plugin Provider).");
45
+ }
46
+ return ctx;
47
+ }
48
+ function renderMarkdown(md) {
49
+ return md.split(/\n\n+/).map((block) => {
50
+ const html = block.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>").replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>").replace(/\*(.+?)\*/g, "<em>$1</em>").replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" rel="noopener noreferrer">$1</a>').replace(/\n/g, "<br />");
51
+ return `<p>${html}</p>`;
52
+ }).join("");
53
+ }
54
+ var platformColors = {
55
+ instagram: "#E4405F",
56
+ spotify: "#1DB954",
57
+ soundcloud: "#FF5500",
58
+ youtube: "#FF0000",
59
+ tiktok: "#000000",
60
+ whatsapp: "#25D366",
61
+ email: "#EA4335",
62
+ twitter: "#1DA1F2",
63
+ facebook: "#1877F2",
64
+ bandcamp: "#629AA9",
65
+ mixcloud: "#5000FF",
66
+ beatport: "#94D500",
67
+ "apple-music": "#FC3C44",
68
+ deezer: "#FEAA2D",
69
+ telegram: "#0088CC",
70
+ website: "#888888",
71
+ custom: "#888888"
72
+ };
73
+ var platformLabels = {
74
+ instagram: "Instagram",
75
+ spotify: "Spotify",
76
+ soundcloud: "SoundCloud",
77
+ youtube: "YouTube",
78
+ tiktok: "TikTok",
79
+ whatsapp: "WhatsApp",
80
+ email: "Email",
81
+ twitter: "Twitter / X",
82
+ facebook: "Facebook",
83
+ bandcamp: "Bandcamp",
84
+ mixcloud: "Mixcloud",
85
+ beatport: "Beatport",
86
+ "apple-music": "Apple Music",
87
+ deezer: "Deezer",
88
+ telegram: "Telegram",
89
+ website: "Website",
90
+ custom: "Link"
91
+ };
92
+ var platformIconMap = {
93
+ instagram: lucideReact.Instagram,
94
+ spotify: lucideReact.Music,
95
+ soundcloud: lucideReact.Music,
96
+ youtube: lucideReact.Youtube,
97
+ tiktok: lucideReact.Music,
98
+ whatsapp: lucideReact.Phone,
99
+ email: lucideReact.Mail,
100
+ twitter: lucideReact.Twitter,
101
+ facebook: lucideReact.Facebook,
102
+ bandcamp: lucideReact.Music,
103
+ mixcloud: lucideReact.Music,
104
+ beatport: lucideReact.Music,
105
+ "apple-music": lucideReact.Music,
106
+ deezer: lucideReact.Music,
107
+ telegram: lucideReact.Globe,
108
+ website: lucideReact.Globe,
109
+ custom: lucideReact.Globe
110
+ };
111
+ var borderRadiusMap = {
112
+ none: "0px",
113
+ sm: "4px",
114
+ md: "8px",
115
+ lg: "16px",
116
+ full: "9999px"
117
+ };
118
+ function getBrandingVars(branding) {
119
+ return {
120
+ "--pk-primary": branding.primaryColor,
121
+ "--pk-secondary": branding.secondaryColor,
122
+ "--pk-accent": branding.accentColor,
123
+ "--pk-bg": branding.backgroundColor,
124
+ "--pk-text": branding.textColor,
125
+ "--pk-muted": branding.mutedTextColor,
126
+ "--pk-radius": borderRadiusMap[branding.borderRadius ?? "md"],
127
+ "--pk-font-heading": branding.fontHeading ?? "'Space Grotesk', sans-serif",
128
+ "--pk-font-body": branding.fontBody ?? "'DM Sans', sans-serif",
129
+ "--pk-alt-bg": branding.sectionAltBg ?? branding.backgroundColor,
130
+ "--pk-alt-bg2": branding.sectionAltBg2 ?? branding.backgroundColor
131
+ };
132
+ }
133
+
134
+ // src/public/registry.ts
135
+ var registry = /* @__PURE__ */ new Map();
136
+ function registerBlock(type, component) {
137
+ registry.set(type, component);
138
+ }
139
+ function getBlock(type) {
140
+ return registry.get(type);
141
+ }
142
+ function hasBlock(type) {
143
+ return registry.has(type);
144
+ }
145
+ function Reveal({
146
+ children,
147
+ delay = 0,
148
+ className
149
+ }) {
150
+ const ref = react.useRef(null);
151
+ const [shown, setShown] = react.useState(false);
152
+ react.useEffect(() => {
153
+ const el = ref.current;
154
+ if (!el) return;
155
+ const reduce = typeof window !== "undefined" && window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
156
+ if (reduce || typeof IntersectionObserver === "undefined") {
157
+ setShown(true);
158
+ return;
159
+ }
160
+ const io = new IntersectionObserver(
161
+ ([entry]) => {
162
+ if (entry.isIntersecting) {
163
+ setShown(true);
164
+ io.disconnect();
165
+ }
166
+ },
167
+ { threshold: 0.1, rootMargin: "0px 0px -6% 0px" }
168
+ );
169
+ io.observe(el);
170
+ return () => io.disconnect();
171
+ }, []);
172
+ return /* @__PURE__ */ jsxRuntime.jsx(
173
+ "div",
174
+ {
175
+ ref,
176
+ className,
177
+ style: {
178
+ opacity: shown ? 1 : 0,
179
+ transform: shown ? "none" : "translateY(22px)",
180
+ transition: `opacity 0.6s ease ${delay}ms, transform 0.6s cubic-bezier(0.2,0.7,0.2,1) ${delay}ms`,
181
+ willChange: "opacity, transform"
182
+ },
183
+ children
184
+ }
185
+ );
186
+ }
187
+ function HeroSection({ section, identity, branding }) {
188
+ const hasLogo = section.showLogo && branding.logoUrl;
189
+ return /* @__PURE__ */ jsxRuntime.jsxs(
190
+ "section",
191
+ {
192
+ className: "relative flex flex-col items-center justify-center min-h-screen overflow-hidden",
193
+ id: section.id,
194
+ children: [
195
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute inset-0", children: [
196
+ section.backgroundImageUrl && /* @__PURE__ */ jsxRuntime.jsx(
197
+ "img",
198
+ {
199
+ src: section.backgroundImageUrl,
200
+ alt: identity.name,
201
+ className: "h-full w-full object-cover"
202
+ }
203
+ ),
204
+ section.overlayGradient && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0", style: { background: section.overlayGradient } })
205
+ ] }),
206
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative z-10 flex flex-col items-center text-center px-6 pt-20 pb-24", children: [
207
+ hasLogo ? /* @__PURE__ */ jsxRuntime.jsx(
208
+ "img",
209
+ {
210
+ src: branding.logoUrl,
211
+ alt: `${identity.name} logo`,
212
+ className: "mb-6 h-48 w-auto md:h-64 lg:h-80 object-contain drop-shadow-2xl"
213
+ }
214
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
215
+ "h1",
216
+ {
217
+ className: "text-5xl md:text-7xl lg:text-8xl font-bold tracking-tight mb-4 drop-shadow-lg",
218
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
219
+ children: identity.name
220
+ }
221
+ ),
222
+ identity.tagline && /* @__PURE__ */ jsxRuntime.jsx(
223
+ "p",
224
+ {
225
+ className: "text-lg md:text-xl mb-6 max-w-lg opacity-70",
226
+ style: { color: "var(--pk-text)" },
227
+ children: identity.tagline
228
+ }
229
+ ),
230
+ section.showGenres && identity.genres.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap justify-center gap-2 mb-4", children: identity.genres.map((genre) => /* @__PURE__ */ jsxRuntime.jsx(
231
+ "span",
232
+ {
233
+ className: "px-4 py-1.5 text-sm font-semibold backdrop-blur-sm",
234
+ style: {
235
+ backgroundColor: "rgba(255,255,255,0.08)",
236
+ color: "var(--pk-primary)",
237
+ border: "1px solid rgba(255,255,255,0.12)",
238
+ borderRadius: "9999px"
239
+ },
240
+ children: genre
241
+ },
242
+ genre
243
+ )) }),
244
+ section.showLocation && identity.location && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm mt-2 opacity-50", style: { color: "var(--pk-text)" }, children: identity.location }),
245
+ section.ctaText && section.ctaUrl && /* @__PURE__ */ jsxRuntime.jsx(
246
+ "a",
247
+ {
248
+ href: section.ctaUrl,
249
+ target: "_blank",
250
+ rel: "noopener noreferrer",
251
+ className: "mt-8 inline-block px-10 py-4 font-bold text-lg tracking-wider transition-transform hover:scale-105",
252
+ style: {
253
+ backgroundColor: "var(--pk-primary)",
254
+ color: "var(--pk-bg)",
255
+ borderRadius: "9999px"
256
+ },
257
+ children: section.ctaText
258
+ }
259
+ )
260
+ ] }),
261
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-8 left-1/2 -translate-x-1/2 z-10 animate-bounce opacity-40", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", style: { color: "var(--pk-text)" }, children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 5v14M5 12l7 7 7-7" }) }) })
262
+ ]
263
+ }
264
+ );
265
+ }
266
+ function BioSection({ section }) {
267
+ const hasImage = section.imageUrl && section.imagePosition !== "none";
268
+ const isTop = section.imagePosition === "top";
269
+ const isSide = section.imagePosition === "left" || section.imagePosition === "right";
270
+ const isRight = section.imagePosition === "right";
271
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-4xl mx-auto", children: [
272
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
273
+ "h2",
274
+ {
275
+ className: "text-3xl md:text-4xl font-bold mb-8",
276
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
277
+ children: section.title
278
+ }
279
+ ),
280
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isSide && hasImage ? `grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-12 items-start` : "", children: [
281
+ hasImage && isTop && /* @__PURE__ */ jsxRuntime.jsx(
282
+ "img",
283
+ {
284
+ src: section.imageUrl,
285
+ alt: "",
286
+ className: "w-full max-h-96 object-cover mb-8",
287
+ style: { borderRadius: "var(--pk-radius)" },
288
+ loading: "lazy"
289
+ }
290
+ ),
291
+ hasImage && isSide && !isRight && /* @__PURE__ */ jsxRuntime.jsx(
292
+ "img",
293
+ {
294
+ src: section.imageUrl,
295
+ alt: "",
296
+ className: "w-full aspect-[3/4] object-cover",
297
+ style: { borderRadius: "var(--pk-radius)" },
298
+ loading: "lazy"
299
+ }
300
+ ),
301
+ /* @__PURE__ */ jsxRuntime.jsx(
302
+ "div",
303
+ {
304
+ className: "prose prose-invert max-w-none text-base md:text-lg leading-relaxed [&_p]:mb-4 [&_strong]:font-semibold [&_a]:underline [&_a]:decoration-[var(--pk-primary)]",
305
+ style: { color: "var(--pk-muted)" },
306
+ dangerouslySetInnerHTML: { __html: renderMarkdown(section.content) }
307
+ }
308
+ ),
309
+ hasImage && isSide && isRight && /* @__PURE__ */ jsxRuntime.jsx(
310
+ "img",
311
+ {
312
+ src: section.imageUrl,
313
+ alt: "",
314
+ className: "w-full aspect-[3/4] object-cover",
315
+ style: { borderRadius: "var(--pk-radius)" },
316
+ loading: "lazy"
317
+ }
318
+ )
319
+ ] })
320
+ ] }) });
321
+ }
322
+ function isInstagramEmbed(item) {
323
+ return item.url.includes("instagram.com");
324
+ }
325
+ function getInstagramEmbedUrl(url) {
326
+ const match = url.match(/instagram\.com\/(reel|p)\/([^/?]+)/);
327
+ if (match) return `https://www.instagram.com/${match[1]}/${match[2]}/embed`;
328
+ return url;
329
+ }
330
+ function MediaItem({ item, index, cols, isFeatured, onImageClick }) {
331
+ if (isInstagramEmbed(item)) {
332
+ return /* @__PURE__ */ jsxRuntime.jsx(
333
+ "div",
334
+ {
335
+ className: `overflow-hidden ${isFeatured && index === 0 ? "col-span-2" : ""}`,
336
+ style: { borderRadius: "var(--pk-radius)" },
337
+ children: /* @__PURE__ */ jsxRuntime.jsx(
338
+ "iframe",
339
+ {
340
+ src: getInstagramEmbedUrl(item.url),
341
+ className: "w-full border-0",
342
+ style: { minHeight: cols <= 2 ? "500px" : "420px" },
343
+ loading: "lazy",
344
+ allowtransparency: "true",
345
+ allow: "encrypted-media",
346
+ title: item.alt ?? "Instagram"
347
+ }
348
+ )
349
+ }
350
+ );
351
+ }
352
+ return /* @__PURE__ */ jsxRuntime.jsx(
353
+ "img",
354
+ {
355
+ src: item.url,
356
+ alt: item.alt ?? "",
357
+ className: `w-full object-cover cursor-pointer hover:opacity-90 transition-opacity ${isFeatured && index === 0 ? "col-span-2 aspect-[16/9]" : "aspect-square"}`,
358
+ style: { borderRadius: "var(--pk-radius)" },
359
+ loading: "lazy",
360
+ onClick: () => onImageClick(index)
361
+ }
362
+ );
363
+ }
364
+ function GallerySection({ section }) {
365
+ const [lightboxIdx, setLightboxIdx] = react.useState(null);
366
+ const cols = section.columns ?? 3;
367
+ const isFeatured = section.layout === "featured-grid";
368
+ const isCarousel = section.layout === "carousel";
369
+ const imageItems = section.media.filter((m) => !isInstagramEmbed(m));
370
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto", children: [
371
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
372
+ "h2",
373
+ {
374
+ className: "text-3xl md:text-4xl font-bold mb-8",
375
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
376
+ children: section.title
377
+ }
378
+ ),
379
+ isCarousel ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-4 overflow-x-auto snap-x snap-mandatory pb-4 -mx-6 px-6 scrollbar-hide", children: section.media.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-none w-72 md:w-96 snap-center", children: /* @__PURE__ */ jsxRuntime.jsx(MediaItem, { item, index: i, cols, isFeatured: false, onImageClick: setLightboxIdx }) }, i)) }) : /* @__PURE__ */ jsxRuntime.jsx(
380
+ "div",
381
+ {
382
+ className: `grid gap-3 md:gap-4 ${isFeatured ? "grid-cols-2" : cols === 2 ? "grid-cols-1 sm:grid-cols-2" : cols === 4 ? "grid-cols-2 md:grid-cols-4" : "grid-cols-2 md:grid-cols-3"}`,
383
+ children: section.media.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(MediaItem, { item, index: i, cols, isFeatured, onImageClick: setLightboxIdx }, i))
384
+ }
385
+ ),
386
+ lightboxIdx !== null && imageItems[lightboxIdx] && /* @__PURE__ */ jsxRuntime.jsxs(
387
+ "div",
388
+ {
389
+ className: "fixed inset-0 z-50 flex items-center justify-center bg-black/90 p-4",
390
+ onClick: () => setLightboxIdx(null),
391
+ children: [
392
+ /* @__PURE__ */ jsxRuntime.jsx(
393
+ "button",
394
+ {
395
+ className: "absolute top-4 right-4 text-white text-3xl font-light hover:opacity-70 z-10",
396
+ onClick: () => setLightboxIdx(null),
397
+ children: "\xD7"
398
+ }
399
+ ),
400
+ /* @__PURE__ */ jsxRuntime.jsx(
401
+ "button",
402
+ {
403
+ className: "absolute left-4 top-1/2 -translate-y-1/2 text-white text-4xl font-light hover:opacity-70 z-10",
404
+ onClick: (e) => {
405
+ e.stopPropagation();
406
+ setLightboxIdx((lightboxIdx - 1 + imageItems.length) % imageItems.length);
407
+ },
408
+ children: "\u2039"
409
+ }
410
+ ),
411
+ /* @__PURE__ */ jsxRuntime.jsx(
412
+ "button",
413
+ {
414
+ className: "absolute right-4 top-1/2 -translate-y-1/2 text-white text-4xl font-light hover:opacity-70 z-10",
415
+ onClick: (e) => {
416
+ e.stopPropagation();
417
+ setLightboxIdx((lightboxIdx + 1) % imageItems.length);
418
+ },
419
+ children: "\u203A"
420
+ }
421
+ ),
422
+ /* @__PURE__ */ jsxRuntime.jsx(
423
+ "img",
424
+ {
425
+ src: imageItems[lightboxIdx].url,
426
+ alt: imageItems[lightboxIdx].alt ?? "",
427
+ className: "max-h-[85vh] max-w-[90vw] object-contain",
428
+ onClick: (e) => e.stopPropagation()
429
+ }
430
+ )
431
+ ]
432
+ }
433
+ )
434
+ ] }) });
435
+ }
436
+ function VideoGridSection({ section }) {
437
+ const isFeatured = section.layout === "featured";
438
+ const isList = section.layout === "list";
439
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto", children: [
440
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
441
+ "h2",
442
+ {
443
+ className: "text-3xl md:text-4xl font-bold mb-8",
444
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
445
+ children: section.title
446
+ }
447
+ ),
448
+ isFeatured && section.videos.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
449
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video w-full overflow-hidden", style: { borderRadius: "var(--pk-radius)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
450
+ "iframe",
451
+ {
452
+ src: `https://www.youtube.com/embed/${section.videos[0].videoId}`,
453
+ title: section.videos[0].title ?? "Video",
454
+ className: "h-full w-full",
455
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
456
+ allowFullScreen: true,
457
+ loading: "lazy"
458
+ }
459
+ ) }),
460
+ section.videos[0].title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", style: { color: "var(--pk-muted)" }, children: section.videos[0].title }),
461
+ section.videos.length > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4", children: section.videos.slice(1).map((video, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
462
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video overflow-hidden", style: { borderRadius: "var(--pk-radius)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
463
+ "iframe",
464
+ {
465
+ src: `https://www.youtube.com/embed/${video.videoId}`,
466
+ title: video.title ?? "Video",
467
+ className: "h-full w-full",
468
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
469
+ allowFullScreen: true,
470
+ loading: "lazy"
471
+ }
472
+ ) }),
473
+ video.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm", style: { color: "var(--pk-muted)" }, children: video.title })
474
+ ] }, i)) })
475
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `grid gap-4 md:gap-6 ${isList ? "grid-cols-1" : "grid-cols-1 md:grid-cols-2 lg:grid-cols-3"}`, children: [
476
+ section.videos.map((video, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
477
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video overflow-hidden", style: { borderRadius: "var(--pk-radius)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
478
+ "iframe",
479
+ {
480
+ src: `https://www.youtube.com/embed/${video.videoId}`,
481
+ title: video.title ?? "Video",
482
+ className: "h-full w-full",
483
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
484
+ allowFullScreen: true,
485
+ loading: "lazy"
486
+ }
487
+ ) }),
488
+ video.title && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-sm", style: { color: "var(--pk-muted)" }, children: video.title })
489
+ ] }, i)),
490
+ section.channelUrl && /* @__PURE__ */ jsxRuntime.jsx(
491
+ "a",
492
+ {
493
+ href: section.channelUrl,
494
+ target: "_blank",
495
+ rel: "noopener noreferrer",
496
+ className: "aspect-video overflow-hidden flex items-center justify-center border border-white/10 hover:border-white/30 transition-colors",
497
+ style: { borderRadius: "var(--pk-radius)", background: "var(--pk-alt-bg, rgba(255,255,255,0.05))" },
498
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-lg font-semibold", style: { color: "var(--pk-text)", fontFamily: "var(--pk-font-heading)" }, children: "Ver todos \u2192" })
499
+ }
500
+ )
501
+ ] })
502
+ ] }) });
503
+ }
504
+ var BRAND = {
505
+ instagram: si.SiInstagram,
506
+ youtube: si.SiYoutube,
507
+ soundcloud: si.SiSoundcloud,
508
+ tiktok: si.SiTiktok,
509
+ spotify: si.SiSpotify,
510
+ whatsapp: si.SiWhatsapp,
511
+ "apple-music": si.SiApplemusic,
512
+ bandcamp: si.SiBandcamp,
513
+ facebook: si.SiFacebook,
514
+ twitter: si.SiX,
515
+ telegram: si.SiTelegram,
516
+ beatport: si.SiBeatport,
517
+ mixcloud: si.SiMixcloud,
518
+ drive: si.SiGoogledrive,
519
+ email: lucideReact.Mail,
520
+ website: lucideReact.Globe
521
+ };
522
+ function PlatformIcon({
523
+ platform,
524
+ size = 20,
525
+ style,
526
+ className
527
+ }) {
528
+ const Icon = BRAND[platform] ?? lucideReact.ExternalLink;
529
+ return /* @__PURE__ */ jsxRuntime.jsx(Icon, { size, style, className });
530
+ }
531
+ function SocialLinksSection({ section }) {
532
+ const layout = section.layout ?? "buttons";
533
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-xl mx-auto", children: [
534
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
535
+ "h2",
536
+ {
537
+ className: "text-3xl md:text-4xl font-bold mb-10 text-center",
538
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
539
+ children: section.title
540
+ }
541
+ ),
542
+ layout === "icons" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap justify-center gap-5", children: section.links.map((link) => {
543
+ const color = platformColors[link.platform];
544
+ return /* @__PURE__ */ jsxRuntime.jsx(
545
+ "a",
546
+ {
547
+ href: link.url,
548
+ target: "_blank",
549
+ rel: "noopener noreferrer",
550
+ className: "group flex items-center justify-center w-16 h-16 rounded-full transition-all duration-300 hover:scale-110 hover:shadow-lg",
551
+ style: {
552
+ backgroundColor: color + "15",
553
+ boxShadow: `0 0 0 1px ${color}25`
554
+ },
555
+ title: link.label ?? platformLabels[link.platform],
556
+ children: /* @__PURE__ */ jsxRuntime.jsx(PlatformIcon, { platform: link.platform, size: 26, style: { color } })
557
+ },
558
+ link.platform + link.url
559
+ );
560
+ }) }),
561
+ layout === "buttons" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: section.links.map((link) => {
562
+ const color = platformColors[link.platform];
563
+ return /* @__PURE__ */ jsxRuntime.jsxs(
564
+ "a",
565
+ {
566
+ href: link.url,
567
+ target: "_blank",
568
+ rel: "noopener noreferrer",
569
+ className: "group relative flex items-center gap-5 px-6 py-4 font-medium transition-all duration-300 hover:scale-[1.02] overflow-hidden",
570
+ style: {
571
+ backgroundColor: color + "10",
572
+ color: "var(--pk-text)",
573
+ borderRadius: "var(--pk-radius)",
574
+ border: `1px solid ${color}30`
575
+ },
576
+ children: [
577
+ /* @__PURE__ */ jsxRuntime.jsx(
578
+ "div",
579
+ {
580
+ className: "absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300",
581
+ style: { background: `linear-gradient(135deg, ${color}18, transparent 60%)` }
582
+ }
583
+ ),
584
+ /* @__PURE__ */ jsxRuntime.jsx(
585
+ "div",
586
+ {
587
+ className: "relative z-10 flex items-center justify-center w-10 h-10 rounded-full shrink-0",
588
+ style: { backgroundColor: color + "20" },
589
+ children: /* @__PURE__ */ jsxRuntime.jsx(PlatformIcon, { platform: link.platform, size: 20, style: { color } })
590
+ }
591
+ ),
592
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "relative z-10 text-base", children: link.label ?? platformLabels[link.platform] }),
593
+ /* @__PURE__ */ jsxRuntime.jsx(
594
+ lucideReact.ExternalLink,
595
+ {
596
+ size: 16,
597
+ className: "relative z-10 ml-auto opacity-0 group-hover:opacity-50 transition-opacity duration-300",
598
+ style: { color: "var(--pk-text)" }
599
+ }
600
+ )
601
+ ]
602
+ },
603
+ link.platform + link.url
604
+ );
605
+ }) }),
606
+ layout === "list" && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-1", children: section.links.map((link) => {
607
+ const color = platformColors[link.platform];
608
+ return /* @__PURE__ */ jsxRuntime.jsxs(
609
+ "a",
610
+ {
611
+ href: link.url,
612
+ target: "_blank",
613
+ rel: "noopener noreferrer",
614
+ className: "group flex items-center gap-4 py-4 px-3 transition-all duration-200 hover:bg-white/5 rounded-lg",
615
+ children: [
616
+ /* @__PURE__ */ jsxRuntime.jsx(
617
+ "div",
618
+ {
619
+ className: "flex items-center justify-center w-9 h-9 rounded-full shrink-0",
620
+ style: { backgroundColor: color + "18" },
621
+ children: /* @__PURE__ */ jsxRuntime.jsx(PlatformIcon, { platform: link.platform, size: 18, style: { color } })
622
+ }
623
+ ),
624
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", style: { color: "var(--pk-text)" }, children: link.label ?? platformLabels[link.platform] }),
625
+ /* @__PURE__ */ jsxRuntime.jsx(
626
+ lucideReact.ExternalLink,
627
+ {
628
+ size: 14,
629
+ className: "ml-auto opacity-0 group-hover:opacity-40 transition-opacity",
630
+ style: { color: "var(--pk-text)" }
631
+ }
632
+ )
633
+ ]
634
+ },
635
+ link.platform + link.url
636
+ );
637
+ }) })
638
+ ] }) });
639
+ }
640
+ function EmbedSection({ section }) {
641
+ const isVideo = section.aspectRatio === "16:9" || section.embedType === "youtube";
642
+ const height = section.height ?? (isVideo ? void 0 : 352);
643
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-4xl mx-auto", children: [
644
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
645
+ "h2",
646
+ {
647
+ className: "text-3xl md:text-4xl font-bold mb-8",
648
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
649
+ children: section.title
650
+ }
651
+ ),
652
+ section.embedHtml && section.embedType === "custom" ? /* @__PURE__ */ jsxRuntime.jsx(
653
+ "div",
654
+ {
655
+ className: "overflow-hidden",
656
+ style: { borderRadius: "var(--pk-radius)" },
657
+ dangerouslySetInnerHTML: { __html: section.embedHtml }
658
+ }
659
+ ) : isVideo ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video overflow-hidden", style: { borderRadius: "var(--pk-radius)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
660
+ "iframe",
661
+ {
662
+ src: section.embedUrl,
663
+ className: "h-full w-full",
664
+ allow: "autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture",
665
+ loading: "lazy",
666
+ title: section.title ?? "Embed"
667
+ }
668
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden", style: { borderRadius: "var(--pk-radius)", height }, children: /* @__PURE__ */ jsxRuntime.jsx(
669
+ "iframe",
670
+ {
671
+ src: section.embedUrl,
672
+ className: "w-full h-full",
673
+ allow: "autoplay; clipboard-write; encrypted-media; fullscreen",
674
+ loading: "lazy",
675
+ title: section.title ?? "Embed"
676
+ }
677
+ ) })
678
+ ] }) });
679
+ }
680
+ function ProjectSection({ section }) {
681
+ const isSideBySide = section.layout === "side-by-side";
682
+ const hasMedia = section.media && section.media.length > 0;
683
+ const firstMedia = hasMedia ? section.media[0] : null;
684
+ const isVideo = firstMedia?.type === "video";
685
+ const MediaBlock = () => {
686
+ if (!firstMedia) return null;
687
+ if (isVideo) {
688
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full", style: { paddingBottom: "56.25%", borderRadius: "var(--pk-radius)", overflow: "hidden" }, children: /* @__PURE__ */ jsxRuntime.jsx(
689
+ "iframe",
690
+ {
691
+ src: firstMedia.url,
692
+ className: "absolute inset-0 w-full h-full",
693
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
694
+ allowFullScreen: true,
695
+ loading: "lazy",
696
+ title: firstMedia.alt ?? section.title ?? "Video"
697
+ }
698
+ ) });
699
+ }
700
+ return /* @__PURE__ */ jsxRuntime.jsx(
701
+ "img",
702
+ {
703
+ src: firstMedia.url,
704
+ alt: firstMedia.alt ?? "",
705
+ className: "w-full h-full object-cover",
706
+ style: { borderRadius: "var(--pk-radius)" },
707
+ loading: "lazy"
708
+ }
709
+ );
710
+ };
711
+ const ContentBlock = () => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col justify-center", children: [
712
+ section.label && /* @__PURE__ */ jsxRuntime.jsx(
713
+ "span",
714
+ {
715
+ className: "inline-block self-start px-4 py-1.5 text-xs font-bold uppercase tracking-[0.15em] mb-5",
716
+ style: {
717
+ backgroundColor: "transparent",
718
+ color: "var(--pk-accent)",
719
+ border: "1px solid var(--pk-accent)",
720
+ borderRadius: "4px"
721
+ },
722
+ children: section.label
723
+ }
724
+ ),
725
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
726
+ "h2",
727
+ {
728
+ className: "text-3xl md:text-4xl lg:text-5xl font-bold mb-5",
729
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
730
+ children: section.title
731
+ }
732
+ ),
733
+ section.content && /* @__PURE__ */ jsxRuntime.jsx(
734
+ "div",
735
+ {
736
+ className: "text-base md:text-lg leading-relaxed [&_p]:mb-4 [&_strong]:font-semibold [&_strong]:text-white [&_em]:italic",
737
+ style: { color: "var(--pk-muted)" },
738
+ dangerouslySetInnerHTML: { __html: renderMarkdown(section.content) }
739
+ }
740
+ ),
741
+ section.tags && section.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2 mt-5", children: section.tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
742
+ "span",
743
+ {
744
+ className: "px-3 py-1 text-xs font-medium",
745
+ style: {
746
+ color: "var(--pk-muted)",
747
+ border: "1px solid rgba(255,255,255,0.1)",
748
+ borderRadius: "var(--pk-radius)"
749
+ },
750
+ children: tag
751
+ },
752
+ tag
753
+ )) }),
754
+ section.links && section.links.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-4 mt-6", children: section.links.map((link) => /* @__PURE__ */ jsxRuntime.jsx(
755
+ "a",
756
+ {
757
+ href: link.url,
758
+ target: "_blank",
759
+ rel: "noopener noreferrer",
760
+ className: "text-sm font-medium underline underline-offset-4 hover:opacity-80 transition-opacity",
761
+ style: { color: "var(--pk-primary)" },
762
+ children: link.label
763
+ },
764
+ link.url
765
+ )) })
766
+ ] });
767
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-20 md:py-28 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-5xl mx-auto", children: isSideBySide && hasMedia ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8 md:gap-16 items-center", children: [
768
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "order-1", children: /* @__PURE__ */ jsxRuntime.jsx(ContentBlock, {}) }),
769
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "order-2", children: /* @__PURE__ */ jsxRuntime.jsx(MediaBlock, {}) })
770
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
771
+ /* @__PURE__ */ jsxRuntime.jsx(ContentBlock, {}),
772
+ hasMedia && /* @__PURE__ */ jsxRuntime.jsx("div", { className: `grid grid-cols-1 gap-4 mt-8 ${section.media.length > 1 ? "md:grid-cols-2" : ""}`, children: section.media.map(
773
+ (item, i) => item.type === "video" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video overflow-hidden", style: { borderRadius: "var(--pk-radius)" }, children: /* @__PURE__ */ jsxRuntime.jsx(
774
+ "iframe",
775
+ {
776
+ src: item.url,
777
+ className: "h-full w-full",
778
+ allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",
779
+ allowFullScreen: true,
780
+ loading: "lazy",
781
+ title: item.alt ?? "Video"
782
+ }
783
+ ) }, i) : /* @__PURE__ */ jsxRuntime.jsx(
784
+ "img",
785
+ {
786
+ src: item.url,
787
+ alt: item.alt ?? "",
788
+ className: "w-full aspect-[4/3] object-cover",
789
+ style: { borderRadius: "var(--pk-radius)" },
790
+ loading: "lazy"
791
+ },
792
+ i
793
+ )
794
+ ) })
795
+ ] }) }) });
796
+ }
797
+ function StatsSection({ section }) {
798
+ const isGrid = section.layout === "grid";
799
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-4xl mx-auto", children: [
800
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
801
+ "h2",
802
+ {
803
+ className: "text-3xl md:text-4xl font-bold mb-8 text-center",
804
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
805
+ children: section.title
806
+ }
807
+ ),
808
+ /* @__PURE__ */ jsxRuntime.jsx(
809
+ "div",
810
+ {
811
+ className: isGrid ? "grid grid-cols-2 md:grid-cols-4 gap-6" : "flex flex-wrap justify-center gap-8 md:gap-12",
812
+ children: section.stats.map((stat, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
813
+ /* @__PURE__ */ jsxRuntime.jsx(
814
+ "div",
815
+ {
816
+ className: "text-3xl md:text-4xl font-bold mb-1",
817
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-primary)" },
818
+ children: stat.value
819
+ }
820
+ ),
821
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm", style: { color: "var(--pk-muted)" }, children: stat.label })
822
+ ] }, i))
823
+ }
824
+ )
825
+ ] }) });
826
+ }
827
+ function VenueListSection({ section }) {
828
+ const layout = section.layout ?? "grid";
829
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-5xl mx-auto", children: [
830
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
831
+ "h2",
832
+ {
833
+ className: "text-3xl md:text-4xl font-bold mb-10",
834
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
835
+ children: section.title
836
+ }
837
+ ),
838
+ layout === "logo-cloud" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap justify-center gap-6 md:gap-8", children: section.venues.map((venue, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-2", children: [
839
+ venue.logoUrl ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: venue.logoUrl, alt: venue.name, className: "h-12 w-12 object-contain opacity-70", loading: "lazy" }) : /* @__PURE__ */ jsxRuntime.jsx(
840
+ "div",
841
+ {
842
+ className: "h-12 w-12 flex items-center justify-center text-lg font-bold opacity-70",
843
+ style: { backgroundColor: "rgba(255,255,255,0.06)", color: "var(--pk-text)", borderRadius: "var(--pk-radius)" },
844
+ children: venue.name[0]
845
+ }
846
+ ),
847
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-center", style: { color: "var(--pk-muted)" }, children: venue.name })
848
+ ] }, i)) }) : layout === "list" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: section.venues.map((venue, i) => /* @__PURE__ */ jsxRuntime.jsxs(
849
+ "div",
850
+ {
851
+ className: "flex items-center justify-between py-3 px-4",
852
+ style: { backgroundColor: "rgba(255,255,255,0.04)", borderRadius: "var(--pk-radius)" },
853
+ children: [
854
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-medium", style: { color: "var(--pk-text)" }, children: venue.name }),
855
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", style: { color: "var(--pk-muted)" }, children: [venue.city, venue.year].filter(Boolean).join(" \xB7 ") })
856
+ ]
857
+ },
858
+ i
859
+ )) }) : (
860
+ /* Organic flowing tag cloud */
861
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-3", children: section.venues.map((venue, i) => {
862
+ const isLong = venue.name.length > 12;
863
+ const isShort = venue.name.length < 6;
864
+ const sizeClass = isLong ? "text-base md:text-lg px-6 py-3" : isShort ? "text-sm px-4 py-2.5" : "text-sm md:text-base px-5 py-3";
865
+ const isHighlight = i % 5 === 0 || i % 7 === 0;
866
+ return /* @__PURE__ */ jsxRuntime.jsx(
867
+ "div",
868
+ {
869
+ className: `inline-flex flex-col items-start transition-all duration-300 hover:scale-105 ${sizeClass}`,
870
+ style: {
871
+ backgroundColor: isHighlight ? "rgba(255,255,255,0.08)" : "rgba(255,255,255,0.03)",
872
+ border: isHighlight ? "1px solid rgba(255,255,255,0.12)" : "1px solid rgba(255,255,255,0.06)",
873
+ borderRadius: "9999px"
874
+ },
875
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold whitespace-nowrap", style: { color: "var(--pk-text)" }, children: [
876
+ venue.name,
877
+ venue.city && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-normal ml-2 opacity-50", style: { color: "var(--pk-muted)", fontSize: "0.8em" }, children: venue.city })
878
+ ] })
879
+ },
880
+ i
881
+ );
882
+ }) })
883
+ )
884
+ ] }) });
885
+ }
886
+ function CTASection({ section }) {
887
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-24 md:py-36 px-6 text-center", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-2xl mx-auto", children: [
888
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
889
+ "h2",
890
+ {
891
+ className: "text-4xl md:text-5xl lg:text-6xl font-bold mb-6",
892
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
893
+ children: section.title
894
+ }
895
+ ),
896
+ section.content && /* @__PURE__ */ jsxRuntime.jsx(
897
+ "div",
898
+ {
899
+ className: "text-base md:text-lg mb-10 [&_p]:mb-2",
900
+ style: { color: "var(--pk-muted)" },
901
+ dangerouslySetInnerHTML: { __html: renderMarkdown(section.content) }
902
+ }
903
+ ),
904
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col sm:flex-row items-center justify-center gap-5", children: section.ctaButtons.map((btn) => {
905
+ const isPrimary = btn.variant === "primary";
906
+ const isOutline = btn.variant === "outline";
907
+ return /* @__PURE__ */ jsxRuntime.jsx(
908
+ "a",
909
+ {
910
+ href: btn.url,
911
+ target: "_blank",
912
+ rel: "noopener noreferrer",
913
+ className: "inline-flex items-center justify-center px-10 py-4 text-base font-bold tracking-[0.1em] uppercase transition-all duration-300 hover:scale-105 min-w-[200px]",
914
+ style: {
915
+ backgroundColor: isPrimary ? "var(--pk-primary)" : isOutline ? "transparent" : "var(--pk-secondary)",
916
+ color: isPrimary ? "var(--pk-bg)" : "var(--pk-text)",
917
+ border: isOutline ? "2px solid rgba(255,255,255,0.2)" : "none",
918
+ borderRadius: "9999px",
919
+ boxShadow: isPrimary ? "0 8px 32px rgba(0,0,0,0.3)" : "none"
920
+ },
921
+ children: btn.label
922
+ },
923
+ btn.url
924
+ );
925
+ }) })
926
+ ] }) });
927
+ }
928
+ function TextSection({ section }) {
929
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-16 md:py-24 px-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-3xl mx-auto", children: [
930
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
931
+ "h2",
932
+ {
933
+ className: "text-3xl md:text-4xl font-bold mb-8",
934
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
935
+ children: section.title
936
+ }
937
+ ),
938
+ /* @__PURE__ */ jsxRuntime.jsx(
939
+ "div",
940
+ {
941
+ className: "text-base md:text-lg leading-relaxed [&_p]:mb-4 [&_strong]:font-semibold [&_em]:italic [&_a]:underline [&_a]:decoration-[var(--pk-primary)]",
942
+ style: { color: "var(--pk-muted)" },
943
+ dangerouslySetInnerHTML: { __html: renderMarkdown(section.content) }
944
+ }
945
+ )
946
+ ] }) });
947
+ }
948
+ function ProfileHeader({ section, page }) {
949
+ const { identity, branding } = page;
950
+ const isHub = page.layout === "hub";
951
+ const socials = section.socials ?? page.socialLinks ?? [];
952
+ const hasLogo = section.showLogo && branding.logoUrl;
953
+ const heroRef = react.useRef(null);
954
+ const [sy, setSy] = react.useState(0);
955
+ react.useEffect(() => {
956
+ const container = document.querySelector(".fixed.inset-0");
957
+ if (!container) return;
958
+ const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
959
+ if (reduce) return;
960
+ let raf = 0;
961
+ const onScroll = () => {
962
+ if (raf) return;
963
+ raf = requestAnimationFrame(() => {
964
+ setSy(container.scrollTop);
965
+ raf = 0;
966
+ });
967
+ };
968
+ container.addEventListener("scroll", onScroll, { passive: true });
969
+ return () => {
970
+ container.removeEventListener("scroll", onScroll);
971
+ if (raf) cancelAnimationFrame(raf);
972
+ };
973
+ }, []);
974
+ const heroH = heroRef.current?.offsetHeight ?? 700;
975
+ const p = Math.min(1, sy / heroH);
976
+ const imageOffsetTop = section.imageOffsetTop ?? "0px";
977
+ const imageTransform = `translateY(calc(${imageOffsetTop} + ${sy * 0.22}px)) scale(1.18)`;
978
+ const logoTransform = `translateY(${-sy * 0.5}px) scale(${1 - p * 0.12})`;
979
+ const logoOpacity = Math.max(0, 1 - p * 1.25);
980
+ const hintOpacity = Math.max(0, 1 - p * 4);
981
+ const scrollTo = (id) => {
982
+ const el = typeof document !== "undefined" ? document.getElementById(id) : null;
983
+ el?.scrollIntoView({ behavior: "smooth", block: "start" });
984
+ };
985
+ return /* @__PURE__ */ jsxRuntime.jsxs("header", { id: section.id, className: "relative", children: [
986
+ /* @__PURE__ */ jsxRuntime.jsxs(
987
+ "div",
988
+ {
989
+ ref: heroRef,
990
+ className: `relative w-full h-[86vh] max-h-[880px] overflow-hidden ${isHub ? "sm:rounded-[26px]" : ""}`,
991
+ children: [
992
+ section.imageUrl && /* @__PURE__ */ jsxRuntime.jsx(
993
+ "img",
994
+ {
995
+ src: section.imageUrl,
996
+ alt: identity.name,
997
+ className: "absolute inset-0 h-full w-full object-cover will-change-transform",
998
+ style: { transform: imageTransform, objectPosition: section.imageObjectPosition }
999
+ }
1000
+ ),
1001
+ /* @__PURE__ */ jsxRuntime.jsx(
1002
+ "div",
1003
+ {
1004
+ className: "absolute inset-0",
1005
+ style: {
1006
+ background: section.overlayGradient ?? "linear-gradient(to bottom, rgba(0,0,0,0.05) 0%, rgba(0,0,0,0.35) 60%, var(--pk-bg) 100%)"
1007
+ }
1008
+ }
1009
+ ),
1010
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-x-0 bottom-0 flex flex-col items-center text-center px-6 pb-14", children: hasLogo ? /* @__PURE__ */ jsxRuntime.jsx(
1011
+ "img",
1012
+ {
1013
+ src: branding.logoUrl,
1014
+ alt: `${identity.name} logo`,
1015
+ className: "w-[82%] max-w-[380px] h-auto object-contain drop-shadow-[0_4px_24px_rgba(0,0,0,0.55)] will-change-transform",
1016
+ style: { transform: logoTransform, opacity: logoOpacity }
1017
+ }
1018
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1019
+ "h1",
1020
+ {
1021
+ className: "text-5xl sm:text-6xl font-bold tracking-tight drop-shadow-lg will-change-transform",
1022
+ style: {
1023
+ fontFamily: "var(--pk-font-heading)",
1024
+ color: "var(--pk-text)",
1025
+ transform: logoTransform,
1026
+ opacity: logoOpacity
1027
+ },
1028
+ children: identity.name
1029
+ }
1030
+ ) }),
1031
+ /* @__PURE__ */ jsxRuntime.jsx(
1032
+ "div",
1033
+ {
1034
+ className: "absolute bottom-4 left-1/2 -translate-x-1/2 animate-bounce",
1035
+ style: { opacity: hintOpacity, color: "var(--pk-text)" },
1036
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { size: 22 })
1037
+ }
1038
+ )
1039
+ ]
1040
+ }
1041
+ ),
1042
+ (identity.tagline || section.showLocation && identity.location) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mt-5 px-4", children: [
1043
+ identity.tagline && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-medium", style: { color: "var(--pk-text)" }, children: identity.tagline }),
1044
+ section.showLocation && identity.location && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs mt-1 opacity-60", style: { color: "var(--pk-muted)" }, children: identity.location })
1045
+ ] }),
1046
+ socials.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap justify-center gap-3 mt-4 px-4", children: socials.map((link) => /* @__PURE__ */ jsxRuntime.jsx(
1047
+ "a",
1048
+ {
1049
+ href: link.url,
1050
+ target: "_blank",
1051
+ rel: "noopener noreferrer",
1052
+ "aria-label": link.label ?? platformLabels[link.platform] ?? "Link",
1053
+ className: "flex items-center justify-center w-11 h-11 rounded-full transition-transform hover:scale-110",
1054
+ style: { backgroundColor: "rgba(255,255,255,0.07)", color: "var(--pk-text)" },
1055
+ children: /* @__PURE__ */ jsxRuntime.jsx(PlatformIcon, { platform: link.platform, size: 19 })
1056
+ },
1057
+ link.platform + link.url
1058
+ )) }),
1059
+ section.navPills && section.navPills.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
1060
+ "nav",
1061
+ {
1062
+ className: "flex gap-2 overflow-x-auto scrollbar-hide mt-4 px-4 pb-1 justify-start sm:justify-center",
1063
+ "aria-label": "Se\xE7\xF5es",
1064
+ children: section.navPills.map((pill) => /* @__PURE__ */ jsxRuntime.jsx(
1065
+ "button",
1066
+ {
1067
+ type: "button",
1068
+ onClick: () => scrollTo(pill.targetId),
1069
+ className: "whitespace-nowrap px-4 py-2 text-sm font-medium rounded-full transition-colors shrink-0",
1070
+ style: {
1071
+ backgroundColor: "rgba(255,255,255,0.06)",
1072
+ color: "var(--pk-text)",
1073
+ border: "1px solid rgba(255,255,255,0.08)"
1074
+ },
1075
+ children: pill.label
1076
+ },
1077
+ pill.targetId
1078
+ ))
1079
+ }
1080
+ )
1081
+ ] });
1082
+ }
1083
+ function LinkCard({ item }) {
1084
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1085
+ "a",
1086
+ {
1087
+ href: item.url,
1088
+ target: "_blank",
1089
+ rel: "noopener noreferrer",
1090
+ className: "group flex items-center gap-4 p-3 transition-all duration-200 hover:scale-[1.015] active:scale-[0.99]",
1091
+ style: {
1092
+ backgroundColor: "rgba(255,255,255,0.05)",
1093
+ border: "1px solid rgba(255,255,255,0.07)",
1094
+ borderRadius: "var(--pk-radius)"
1095
+ },
1096
+ children: [
1097
+ /* @__PURE__ */ jsxRuntime.jsx(
1098
+ "div",
1099
+ {
1100
+ className: "shrink-0 flex items-center justify-center w-12 h-12 overflow-hidden",
1101
+ style: { borderRadius: "calc(var(--pk-radius) - 4px)", backgroundColor: "rgba(255,255,255,0.06)" },
1102
+ children: item.thumbnailUrl ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: item.thumbnailUrl, alt: "", className: "w-full h-full object-cover", loading: "lazy" }) : /* @__PURE__ */ jsxRuntime.jsx(PlatformIcon, { platform: item.icon ?? "custom", size: 20, style: { color: "var(--pk-primary)" } })
1103
+ }
1104
+ ),
1105
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
1106
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1107
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-semibold truncate", style: { color: "var(--pk-text)" }, children: item.title }),
1108
+ item.badge && /* @__PURE__ */ jsxRuntime.jsx(
1109
+ "span",
1110
+ {
1111
+ className: "text-[10px] font-bold uppercase tracking-wide px-2 py-0.5 rounded-full shrink-0",
1112
+ style: { backgroundColor: "var(--pk-primary)", color: "var(--pk-bg)" },
1113
+ children: item.badge
1114
+ }
1115
+ )
1116
+ ] }),
1117
+ item.subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs truncate mt-0.5", style: { color: "var(--pk-muted)" }, children: item.subtitle })
1118
+ ] }),
1119
+ /* @__PURE__ */ jsxRuntime.jsx(
1120
+ lucideReact.ChevronRight,
1121
+ {
1122
+ size: 18,
1123
+ className: "shrink-0 opacity-40 group-hover:opacity-80 group-hover:translate-x-0.5 transition-all",
1124
+ style: { color: "var(--pk-text)" }
1125
+ }
1126
+ )
1127
+ ]
1128
+ }
1129
+ );
1130
+ }
1131
+ function LinksBlock({ section }) {
1132
+ const isGrid = section.layout === "grid";
1133
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "py-6", id: section.id, children: [
1134
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
1135
+ "h2",
1136
+ {
1137
+ className: "text-xl md:text-2xl font-bold mb-4 px-1",
1138
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
1139
+ children: section.title
1140
+ }
1141
+ ),
1142
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: isGrid ? "grid grid-cols-2 gap-3" : "flex flex-col gap-3", children: section.links.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(LinkCard, { item }, item.url + i)) })
1143
+ ] });
1144
+ }
1145
+ function Carousel({ title, children }) {
1146
+ const trackRef = react.useRef(null);
1147
+ const [atStart, setAtStart] = react.useState(true);
1148
+ const [atEnd, setAtEnd] = react.useState(false);
1149
+ const update = () => {
1150
+ const el = trackRef.current;
1151
+ if (!el) return;
1152
+ setAtStart(el.scrollLeft <= 2);
1153
+ setAtEnd(el.scrollLeft + el.clientWidth >= el.scrollWidth - 2);
1154
+ };
1155
+ react.useEffect(() => {
1156
+ update();
1157
+ const el = trackRef.current;
1158
+ if (!el) return;
1159
+ el.addEventListener("scroll", update, { passive: true });
1160
+ window.addEventListener("resize", update);
1161
+ return () => {
1162
+ el.removeEventListener("scroll", update);
1163
+ window.removeEventListener("resize", update);
1164
+ };
1165
+ }, []);
1166
+ const nudge = (dir) => {
1167
+ const el = trackRef.current;
1168
+ if (!el) return;
1169
+ el.scrollBy({ left: dir * el.clientWidth * 0.8, behavior: "smooth" });
1170
+ };
1171
+ const arrowStyle = (disabled) => ({
1172
+ backgroundColor: "rgba(255,255,255,0.06)",
1173
+ color: "var(--pk-text)",
1174
+ opacity: disabled ? 0.25 : 1,
1175
+ borderRadius: "9999px"
1176
+ });
1177
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
1178
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between mb-4 px-1", children: [
1179
+ title && /* @__PURE__ */ jsxRuntime.jsx(
1180
+ "h2",
1181
+ {
1182
+ className: "text-xl md:text-2xl font-bold",
1183
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
1184
+ children: title
1185
+ }
1186
+ ),
1187
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-2", children: [
1188
+ /* @__PURE__ */ jsxRuntime.jsx(
1189
+ "button",
1190
+ {
1191
+ type: "button",
1192
+ "aria-label": "Anterior",
1193
+ onClick: () => nudge(-1),
1194
+ disabled: atStart,
1195
+ className: "flex items-center justify-center w-9 h-9 transition-opacity",
1196
+ style: arrowStyle(atStart),
1197
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { size: 18 })
1198
+ }
1199
+ ),
1200
+ /* @__PURE__ */ jsxRuntime.jsx(
1201
+ "button",
1202
+ {
1203
+ type: "button",
1204
+ "aria-label": "Pr\xF3ximo",
1205
+ onClick: () => nudge(1),
1206
+ disabled: atEnd,
1207
+ className: "flex items-center justify-center w-9 h-9 transition-opacity",
1208
+ style: arrowStyle(atEnd),
1209
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { size: 18 })
1210
+ }
1211
+ )
1212
+ ] })
1213
+ ] }),
1214
+ /* @__PURE__ */ jsxRuntime.jsx(
1215
+ "div",
1216
+ {
1217
+ ref: trackRef,
1218
+ className: "flex gap-3 overflow-x-auto snap-x snap-mandatory scrollbar-hide pb-1",
1219
+ children
1220
+ }
1221
+ )
1222
+ ] });
1223
+ }
1224
+ function ReleaseCard({ item, cta, wide }) {
1225
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1226
+ "a",
1227
+ {
1228
+ href: item.url,
1229
+ target: "_blank",
1230
+ rel: "noopener noreferrer",
1231
+ className: `group ${wide ? "flex-none w-40 snap-start" : ""} flex flex-col transition-transform hover:scale-[1.02]`,
1232
+ children: [
1233
+ /* @__PURE__ */ jsxRuntime.jsxs(
1234
+ "div",
1235
+ {
1236
+ className: "relative w-full aspect-square overflow-hidden",
1237
+ style: { borderRadius: "var(--pk-radius)", backgroundColor: "rgba(255,255,255,0.05)" },
1238
+ children: [
1239
+ /* @__PURE__ */ jsxRuntime.jsx("img", { src: item.artworkUrl, alt: item.title, className: "w-full h-full object-cover", loading: "lazy" }),
1240
+ /* @__PURE__ */ jsxRuntime.jsx(
1241
+ "div",
1242
+ {
1243
+ className: "absolute inset-0 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity",
1244
+ style: { background: "rgba(0,0,0,0.35)" },
1245
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1246
+ "span",
1247
+ {
1248
+ className: "flex items-center justify-center w-11 h-11 rounded-full",
1249
+ style: { backgroundColor: "var(--pk-primary)", color: "var(--pk-bg)" },
1250
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { size: 20, fill: "currentColor" })
1251
+ }
1252
+ )
1253
+ }
1254
+ )
1255
+ ]
1256
+ }
1257
+ ),
1258
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 px-0.5", children: [
1259
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold truncate", style: { color: "var(--pk-text)" }, children: item.title }),
1260
+ item.artist && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs truncate", style: { color: "var(--pk-muted)" }, children: item.artist }),
1261
+ /* @__PURE__ */ jsxRuntime.jsxs(
1262
+ "span",
1263
+ {
1264
+ className: "inline-flex items-center gap-1 mt-1.5 px-3 py-1 text-xs font-semibold rounded-full",
1265
+ style: { backgroundColor: "rgba(255,255,255,0.08)", color: "var(--pk-text)" },
1266
+ children: [
1267
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { size: 11, fill: "currentColor" }),
1268
+ " ",
1269
+ cta
1270
+ ]
1271
+ }
1272
+ )
1273
+ ] })
1274
+ ]
1275
+ }
1276
+ );
1277
+ }
1278
+ function MusicReleasesBlock({ section }) {
1279
+ const cta = section.ctaLabel ?? "Ouvir";
1280
+ if (section.layout === "grid") {
1281
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "py-6", id: section.id, children: [
1282
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
1283
+ "h2",
1284
+ {
1285
+ className: "text-xl md:text-2xl font-bold mb-4 px-1",
1286
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
1287
+ children: section.title
1288
+ }
1289
+ ),
1290
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-2 gap-4", children: section.releases.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(ReleaseCard, { item, cta }, item.url + i)) })
1291
+ ] });
1292
+ }
1293
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-6", id: section.id, children: /* @__PURE__ */ jsxRuntime.jsx(Carousel, { title: section.title, children: section.releases.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(ReleaseCard, { item, cta, wide: true }, item.url + i)) }) });
1294
+ }
1295
+ var MONTHS_PT = ["JAN", "FEV", "MAR", "ABR", "MAI", "JUN", "JUL", "AGO", "SET", "OUT", "NOV", "DEZ"];
1296
+ function parseDate(date) {
1297
+ const m = date.match(/^(\d{4})-(\d{2})-(\d{2})/);
1298
+ if (m) {
1299
+ const monthIdx = Math.min(11, Math.max(0, parseInt(m[2], 10) - 1));
1300
+ return { month: MONTHS_PT[monthIdx], day: String(parseInt(m[3], 10)), year: m[1] };
1301
+ }
1302
+ return { month: "", day: date, year: "" };
1303
+ }
1304
+ function DateRow({ item, cta }) {
1305
+ const { month, day, year } = parseDate(item.date);
1306
+ const hasLink = !!item.url;
1307
+ const label = hasLink ? cta : item.soldOut ? "Esgotado" : "Em breve";
1308
+ const Tag = hasLink ? "a" : "div";
1309
+ return /* @__PURE__ */ jsxRuntime.jsxs(
1310
+ Tag,
1311
+ {
1312
+ ...hasLink ? { href: item.url, target: "_blank", rel: "noopener noreferrer" } : {},
1313
+ className: `flex items-center gap-4 p-3 transition-all duration-200 ${hasLink ? "hover:scale-[1.01]" : "cursor-default"}`,
1314
+ style: {
1315
+ backgroundColor: "rgba(255,255,255,0.04)",
1316
+ border: "1px solid rgba(255,255,255,0.07)",
1317
+ borderRadius: "var(--pk-radius)"
1318
+ },
1319
+ children: [
1320
+ /* @__PURE__ */ jsxRuntime.jsxs(
1321
+ "div",
1322
+ {
1323
+ className: "shrink-0 flex flex-col items-center justify-center w-14 h-16",
1324
+ style: { backgroundColor: "rgba(255,255,255,0.05)", borderRadius: "calc(var(--pk-radius) - 4px)" },
1325
+ children: [
1326
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] font-bold tracking-wider", style: { color: "var(--pk-primary)" }, children: month }),
1327
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xl font-bold leading-none", style: { color: "var(--pk-text)", fontFamily: "var(--pk-font-heading)" }, children: day }),
1328
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[10px] opacity-60", style: { color: "var(--pk-muted)" }, children: year })
1329
+ ]
1330
+ }
1331
+ ),
1332
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
1333
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-semibold truncate", style: { color: "var(--pk-text)" }, children: item.venue }),
1334
+ item.city && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs truncate flex items-center gap-1 mt-0.5", style: { color: "var(--pk-muted)" }, children: [
1335
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPin, { size: 11 }),
1336
+ " ",
1337
+ item.city
1338
+ ] })
1339
+ ] }),
1340
+ /* @__PURE__ */ jsxRuntime.jsx(
1341
+ "span",
1342
+ {
1343
+ className: "shrink-0 px-4 py-1.5 text-xs font-semibold rounded-full",
1344
+ style: hasLink ? { backgroundColor: "var(--pk-primary)", color: "var(--pk-bg)" } : { backgroundColor: "transparent", color: "var(--pk-muted)", border: "1px solid rgba(255,255,255,0.12)" },
1345
+ children: label
1346
+ }
1347
+ )
1348
+ ]
1349
+ }
1350
+ );
1351
+ }
1352
+ function TourDatesBlock({ section }) {
1353
+ const cta = section.ctaLabel ?? "Ingressos";
1354
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "py-6", id: section.id, children: [
1355
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
1356
+ "h2",
1357
+ {
1358
+ className: "text-xl md:text-2xl font-bold mb-4 px-1",
1359
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
1360
+ children: section.title
1361
+ }
1362
+ ),
1363
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-3", children: section.dates.map((item, i) => /* @__PURE__ */ jsxRuntime.jsx(DateRow, { item, cta }, item.date + item.venue + i)) })
1364
+ ] });
1365
+ }
1366
+ function FeaturedBlock({ section }) {
1367
+ return /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "py-6", id: section.id, children: [
1368
+ section.title && /* @__PURE__ */ jsxRuntime.jsx(
1369
+ "h2",
1370
+ {
1371
+ className: "text-xl md:text-2xl font-bold mb-4 px-1",
1372
+ style: { fontFamily: "var(--pk-font-heading)", color: "var(--pk-text)" },
1373
+ children: section.title
1374
+ }
1375
+ ),
1376
+ /* @__PURE__ */ jsxRuntime.jsxs(
1377
+ "a",
1378
+ {
1379
+ href: section.url,
1380
+ target: "_blank",
1381
+ rel: "noopener noreferrer",
1382
+ className: "group flex items-center gap-4 p-4 overflow-hidden transition-all duration-300 hover:scale-[1.01]",
1383
+ style: {
1384
+ borderRadius: "var(--pk-radius)",
1385
+ border: "1px solid rgba(255,255,255,0.09)",
1386
+ background: "linear-gradient(135deg, color-mix(in srgb, var(--pk-primary) 14%, transparent), rgba(255,255,255,0.03) 55%)"
1387
+ },
1388
+ children: [
1389
+ section.imageUrl && /* @__PURE__ */ jsxRuntime.jsx(
1390
+ "div",
1391
+ {
1392
+ className: "shrink-0 w-20 h-20 overflow-hidden",
1393
+ style: { borderRadius: "calc(var(--pk-radius) - 4px)" },
1394
+ children: /* @__PURE__ */ jsxRuntime.jsx(
1395
+ "img",
1396
+ {
1397
+ src: section.imageUrl,
1398
+ alt: section.headline,
1399
+ className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-500",
1400
+ loading: "lazy"
1401
+ }
1402
+ )
1403
+ }
1404
+ ),
1405
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
1406
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-base font-bold leading-tight", style: { color: "var(--pk-text)", fontFamily: "var(--pk-font-heading)" }, children: section.headline }),
1407
+ section.subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs mt-1 line-clamp-2", style: { color: "var(--pk-muted)" }, children: section.subtitle }),
1408
+ section.ctaLabel && /* @__PURE__ */ jsxRuntime.jsx(
1409
+ "span",
1410
+ {
1411
+ className: "inline-flex items-center gap-1 mt-2 px-3 py-1 text-xs font-semibold rounded-full",
1412
+ style: { backgroundColor: "var(--pk-primary)", color: "var(--pk-bg)" },
1413
+ children: section.ctaLabel
1414
+ }
1415
+ )
1416
+ ] }),
1417
+ /* @__PURE__ */ jsxRuntime.jsx(
1418
+ lucideReact.ArrowUpRight,
1419
+ {
1420
+ size: 20,
1421
+ className: "shrink-0 opacity-50 group-hover:opacity-90 group-hover:translate-x-0.5 group-hover:-translate-y-0.5 transition-all",
1422
+ style: { color: "var(--pk-text)" }
1423
+ }
1424
+ )
1425
+ ]
1426
+ }
1427
+ )
1428
+ ] });
1429
+ }
1430
+ var ALT_BG_TYPES = /* @__PURE__ */ new Set(["bio", "gallery", "video-grid", "project", "embed", "stats", "venue-list", "text", "social-links"]);
1431
+ function BioPageRenderer({ page, poweredBy }) {
1432
+ const { identity, branding, sections, floatingCta } = page;
1433
+ const isHub = page.layout === "hub";
1434
+ const scrollRef = react.useRef(null);
1435
+ const [scrollProgress, setScrollProgress] = react.useState(0);
1436
+ const [showFloatingCta, setShowFloatingCta] = react.useState(false);
1437
+ react.useEffect(() => {
1438
+ const container = scrollRef.current?.closest(".fixed.inset-0");
1439
+ if (!container) return;
1440
+ const onScroll = () => {
1441
+ const { scrollTop, scrollHeight, clientHeight } = container;
1442
+ const progress = scrollHeight > clientHeight ? scrollTop / (scrollHeight - clientHeight) : 0;
1443
+ setScrollProgress(progress);
1444
+ setShowFloatingCta(scrollTop > clientHeight * 0.5);
1445
+ };
1446
+ container.addEventListener("scroll", onScroll, { passive: true });
1447
+ return () => container.removeEventListener("scroll", onScroll);
1448
+ }, []);
1449
+ let altIndex = 0;
1450
+ const sectionBgs = /* @__PURE__ */ new Map();
1451
+ if (!isHub) {
1452
+ for (const s of sections) {
1453
+ if (s.visible === false) continue;
1454
+ if (ALT_BG_TYPES.has(s.type)) {
1455
+ const bgs = [void 0, "var(--pk-alt-bg)", "var(--pk-alt-bg2)"];
1456
+ sectionBgs.set(s.id, bgs[altIndex % bgs.length]);
1457
+ altIndex++;
1458
+ }
1459
+ }
1460
+ }
1461
+ function renderInner(section) {
1462
+ const Custom = getBlock(section.type);
1463
+ if (Custom) return /* @__PURE__ */ jsxRuntime.jsx(Custom, { block: section, page });
1464
+ switch (section.type) {
1465
+ case "hero":
1466
+ return /* @__PURE__ */ jsxRuntime.jsx(HeroSection, { section, identity, branding });
1467
+ case "profile-header":
1468
+ return /* @__PURE__ */ jsxRuntime.jsx(ProfileHeader, { section, page });
1469
+ case "bio":
1470
+ return /* @__PURE__ */ jsxRuntime.jsx(BioSection, { section });
1471
+ case "gallery":
1472
+ return /* @__PURE__ */ jsxRuntime.jsx(GallerySection, { section });
1473
+ case "video-grid":
1474
+ return /* @__PURE__ */ jsxRuntime.jsx(VideoGridSection, { section });
1475
+ case "social-links":
1476
+ return /* @__PURE__ */ jsxRuntime.jsx(SocialLinksSection, { section });
1477
+ case "embed":
1478
+ return /* @__PURE__ */ jsxRuntime.jsx(EmbedSection, { section });
1479
+ case "project":
1480
+ return /* @__PURE__ */ jsxRuntime.jsx(ProjectSection, { section });
1481
+ case "stats":
1482
+ return /* @__PURE__ */ jsxRuntime.jsx(StatsSection, { section });
1483
+ case "venue-list":
1484
+ return /* @__PURE__ */ jsxRuntime.jsx(VenueListSection, { section });
1485
+ case "cta":
1486
+ return /* @__PURE__ */ jsxRuntime.jsx(CTASection, { section });
1487
+ case "text":
1488
+ return /* @__PURE__ */ jsxRuntime.jsx(TextSection, { section });
1489
+ case "links":
1490
+ return /* @__PURE__ */ jsxRuntime.jsx(LinksBlock, { section });
1491
+ case "music-releases":
1492
+ return /* @__PURE__ */ jsxRuntime.jsx(MusicReleasesBlock, { section });
1493
+ case "tour-dates":
1494
+ return /* @__PURE__ */ jsxRuntime.jsx(TourDatesBlock, { section });
1495
+ case "featured":
1496
+ return /* @__PURE__ */ jsxRuntime.jsx(FeaturedBlock, { section });
1497
+ default:
1498
+ return null;
1499
+ }
1500
+ }
1501
+ function renderSection(section, index) {
1502
+ if (section.visible === false) return null;
1503
+ const inner = renderInner(section);
1504
+ if (inner === null) return null;
1505
+ if (isHub) {
1506
+ if (section.type === "profile-header")
1507
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "-mx-3 -mt-3 sm:mx-0 sm:mt-0", children: inner }, section.id);
1508
+ return /* @__PURE__ */ jsxRuntime.jsx(Reveal, { children: inner }, section.id);
1509
+ }
1510
+ if (section.type === "hero") return /* @__PURE__ */ jsxRuntime.jsx("div", { children: inner }, section.id);
1511
+ const bg = sectionBgs.get(section.id);
1512
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { style: bg ? { backgroundColor: bg } : void 0, children: /* @__PURE__ */ jsxRuntime.jsx(Reveal, { delay: index === 0 ? 0 : 40, children: inner }) }, section.id);
1513
+ }
1514
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: scrollRef, className: "min-h-full", children: [
1515
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed top-0 left-0 right-0 z-50 h-[3px]", style: { backgroundColor: "transparent" }, children: /* @__PURE__ */ jsxRuntime.jsx(
1516
+ "div",
1517
+ {
1518
+ className: "h-full transition-[width] duration-100 ease-out",
1519
+ style: {
1520
+ width: `${scrollProgress * 100}%`,
1521
+ background: `linear-gradient(90deg, var(--pk-primary), var(--pk-accent))`
1522
+ }
1523
+ }
1524
+ ) }),
1525
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isHub ? "max-w-[480px] mx-auto px-3 sm:px-4 pt-3 pb-6" : "", children: [
1526
+ sections.map(renderSection),
1527
+ /* @__PURE__ */ jsxRuntime.jsxs("footer", { className: "pt-10 pb-24 px-6 text-center", style: { backgroundColor: "var(--pk-bg)" }, children: [
1528
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs opacity-40", style: { color: "var(--pk-muted)" }, children: [
1529
+ "\xA9 ",
1530
+ (/* @__PURE__ */ new Date()).getFullYear(),
1531
+ " ",
1532
+ identity.name
1533
+ ] }),
1534
+ poweredBy && /* @__PURE__ */ jsxRuntime.jsx(
1535
+ "a",
1536
+ {
1537
+ href: poweredBy.url,
1538
+ className: "text-xs opacity-25 mt-1 hover:opacity-40 transition-opacity",
1539
+ style: { color: "var(--pk-muted)" },
1540
+ children: poweredBy.label
1541
+ }
1542
+ )
1543
+ ] })
1544
+ ] }),
1545
+ isHub ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "fixed z-50 right-4 bottom-6 flex flex-col items-center gap-3", children: [
1546
+ /* @__PURE__ */ jsxRuntime.jsx(
1547
+ "button",
1548
+ {
1549
+ type: "button",
1550
+ "aria-label": "Voltar ao topo",
1551
+ onClick: () => scrollRef.current?.closest(".fixed.inset-0")?.scrollTo({
1552
+ top: 0,
1553
+ behavior: "smooth"
1554
+ }),
1555
+ className: "flex items-center justify-center w-11 h-11 rounded-full transition-all duration-300",
1556
+ style: {
1557
+ opacity: showFloatingCta ? 1 : 0,
1558
+ transform: showFloatingCta ? "none" : "translateY(12px)",
1559
+ pointerEvents: showFloatingCta ? "auto" : "none",
1560
+ color: "var(--pk-primary)",
1561
+ border: "1.5px solid var(--pk-primary)",
1562
+ backgroundColor: "color-mix(in srgb, var(--pk-bg) 70%, transparent)",
1563
+ backdropFilter: "blur(6px)"
1564
+ },
1565
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { size: 20 })
1566
+ }
1567
+ ),
1568
+ floatingCta && /* @__PURE__ */ jsxRuntime.jsx(
1569
+ "a",
1570
+ {
1571
+ href: floatingCta.url,
1572
+ target: "_blank",
1573
+ rel: "noopener noreferrer",
1574
+ "aria-label": floatingCta.label,
1575
+ className: "flex items-center justify-center w-14 h-14 rounded-full transition-transform hover:scale-105",
1576
+ style: {
1577
+ backgroundColor: "var(--pk-primary)",
1578
+ color: "var(--pk-bg)",
1579
+ boxShadow: "0 8px 28px rgba(0,0,0,0.45)"
1580
+ },
1581
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MessageCircle, { size: 24 })
1582
+ }
1583
+ )
1584
+ ] }) : floatingCta && /* @__PURE__ */ jsxRuntime.jsx(
1585
+ "a",
1586
+ {
1587
+ href: floatingCta.url,
1588
+ target: "_blank",
1589
+ rel: "noopener noreferrer",
1590
+ className: "fixed z-50 transition-all duration-500 ease-out",
1591
+ style: {
1592
+ bottom: showFloatingCta ? "2rem" : "-4rem",
1593
+ left: "50%",
1594
+ transform: "translateX(-50%)",
1595
+ opacity: showFloatingCta ? 1 : 0,
1596
+ backgroundColor: "var(--pk-primary)",
1597
+ color: "var(--pk-bg)",
1598
+ fontFamily: "var(--pk-font-heading)",
1599
+ borderRadius: "9999px",
1600
+ padding: "1rem 2.5rem",
1601
+ fontSize: "1rem",
1602
+ fontWeight: 700,
1603
+ letterSpacing: "0.1em",
1604
+ boxShadow: "0 8px 32px rgba(0,0,0,0.4)"
1605
+ },
1606
+ children: floatingCta.label
1607
+ }
1608
+ )
1609
+ ] });
1610
+ }
1611
+ function BioPage() {
1612
+ const { slug } = reactRouterDom.useParams();
1613
+ const { provider, poweredBy, titleSuffix } = useLinkInBio();
1614
+ const [page, setPage] = react.useState(null);
1615
+ const [resolved, setResolved] = react.useState(false);
1616
+ react.useEffect(() => {
1617
+ if (!slug) {
1618
+ setResolved(true);
1619
+ return;
1620
+ }
1621
+ let cancelled = false;
1622
+ setResolved(false);
1623
+ provider.getBySlug(slug).then((pk) => {
1624
+ if (cancelled) return;
1625
+ setPage(pk);
1626
+ setResolved(true);
1627
+ }).catch(() => {
1628
+ if (cancelled) return;
1629
+ setResolved(true);
1630
+ });
1631
+ return () => {
1632
+ cancelled = true;
1633
+ };
1634
+ }, [slug, provider]);
1635
+ react.useEffect(() => {
1636
+ if (!page) return;
1637
+ document.title = page.seo.title ?? `${page.identity.name} | ${titleSuffix}`;
1638
+ const metaDesc = document.querySelector('meta[name="description"]');
1639
+ if (metaDesc && page.seo.description) {
1640
+ metaDesc.setAttribute("content", page.seo.description);
1641
+ }
1642
+ const fontsToLoad = [];
1643
+ const { fontHeading, fontBody } = page.branding;
1644
+ if (fontHeading && !fontHeading.includes("Space Grotesk")) {
1645
+ const family = fontHeading.replace(/['"]/g, "").split(",")[0].trim();
1646
+ fontsToLoad.push(family);
1647
+ }
1648
+ if (fontBody && !fontBody.includes("DM Sans")) {
1649
+ const family = fontBody.replace(/['"]/g, "").split(",")[0].trim();
1650
+ fontsToLoad.push(family);
1651
+ }
1652
+ const linkElements = [];
1653
+ if (fontsToLoad.length > 0) {
1654
+ const families = fontsToLoad.map((f) => `family=${f.replace(/\s/g, "+")}:wght@400;600;700`).join("&");
1655
+ const link = document.createElement("link");
1656
+ link.rel = "stylesheet";
1657
+ link.href = `https://fonts.googleapis.com/css2?${families}&display=swap`;
1658
+ document.head.appendChild(link);
1659
+ linkElements.push(link);
1660
+ }
1661
+ return () => {
1662
+ linkElements.forEach((el) => el.remove());
1663
+ };
1664
+ }, [page, titleSuffix]);
1665
+ if (!resolved) {
1666
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dark fixed inset-0 flex items-center justify-center bg-background text-foreground", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-2 h-2 rounded-full bg-foreground/40 animate-pulse", "aria-label": "carregando" }) });
1667
+ }
1668
+ if (!page) {
1669
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "dark fixed inset-0 flex items-center justify-center bg-background text-foreground", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center px-6", children: [
1670
+ /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-large font-bold mb-4", style: { fontFamily: "var(--font-display)" }, children: "404" }),
1671
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-foreground-secondary mb-6", children: "P\xE1gina n\xE3o encontrada." }),
1672
+ /* @__PURE__ */ jsxRuntime.jsx(
1673
+ "a",
1674
+ {
1675
+ href: "/",
1676
+ className: "text-sm underline underline-offset-4 text-foreground-secondary hover:text-foreground transition-colors",
1677
+ children: "voltar ao in\xEDcio"
1678
+ }
1679
+ )
1680
+ ] }) });
1681
+ }
1682
+ const brandingVars = getBrandingVars(page.branding);
1683
+ return /* @__PURE__ */ jsxRuntime.jsx(
1684
+ "div",
1685
+ {
1686
+ className: "fixed inset-0 overflow-y-auto overflow-x-hidden",
1687
+ style: {
1688
+ ...brandingVars,
1689
+ backgroundColor: "var(--pk-bg)",
1690
+ color: "var(--pk-text)",
1691
+ fontFamily: "var(--pk-font-body)"
1692
+ },
1693
+ children: /* @__PURE__ */ jsxRuntime.jsx(BioPageRenderer, { page, poweredBy })
1694
+ }
1695
+ );
1696
+ }
1697
+
1698
+ // src/public/createPublicLinkInBioPlugin.ts
1699
+ function createPublicLinkInBioPlugin(options = {}) {
1700
+ const basePath = options.basePath ?? "/p";
1701
+ const table = options.table ?? "press_kits";
1702
+ const seed = options.seed ?? {};
1703
+ const provider = options.dataProvider ?? (options.useSupabase === false ? createMockBioPageProvider({ seed }) : core.createSafeDataProvider(
1704
+ () => createSupabaseBioPageProvider({ table }),
1705
+ () => createMockBioPageProvider({ seed })
1706
+ ));
1707
+ const contextValue = {
1708
+ provider,
1709
+ poweredBy: options.poweredBy,
1710
+ titleSuffix: options.titleSuffix ?? "Bio"
1711
+ };
1712
+ const Provider = ({ children }) => react.createElement(LinkInBioProvider, { value: contextValue, children });
1713
+ Provider.displayName = "LinkInBioProvider";
1714
+ const manifest = {
1715
+ id: "linkinbio",
1716
+ name: "Link in Bio",
1717
+ icon: "Link",
1718
+ version: "0.1.0",
1719
+ scope: options.scope ?? "universal",
1720
+ verticalId: options.verticalId,
1721
+ scaffolds: ["website", "landing_page"],
1722
+ defaultEnabled: options.defaultEnabled ?? true,
1723
+ dependencies: [],
1724
+ navigation: [],
1725
+ routes: [{ path: `${basePath}/:slug`, component: BioPage, guard: "public", fullBleed: true }],
1726
+ widgets: []
1727
+ };
1728
+ return { manifest, Provider, dataProvider: provider };
1729
+ }
1730
+
1731
+ exports.BioPage = BioPage;
1732
+ exports.BioPageRenderer = BioPageRenderer;
1733
+ exports.Carousel = Carousel;
1734
+ exports.LinkInBioProvider = LinkInBioProvider;
1735
+ exports.Reveal = Reveal;
1736
+ exports.borderRadiusMap = borderRadiusMap;
1737
+ exports.createMockBioPageProvider = createMockBioPageProvider;
1738
+ exports.createPublicLinkInBioPlugin = createPublicLinkInBioPlugin;
1739
+ exports.createSupabaseBioPageProvider = createSupabaseBioPageProvider;
1740
+ exports.getBlock = getBlock;
1741
+ exports.getBrandingVars = getBrandingVars;
1742
+ exports.hasBlock = hasBlock;
1743
+ exports.platformColors = platformColors;
1744
+ exports.platformIconMap = platformIconMap;
1745
+ exports.platformLabels = platformLabels;
1746
+ exports.registerBlock = registerBlock;
1747
+ exports.renderMarkdown = renderMarkdown;
1748
+ exports.useLinkInBio = useLinkInBio;
1749
+ //# sourceMappingURL=index.cjs.map
1750
+ //# sourceMappingURL=index.cjs.map