@sprintup-cms/sdk 1.5.2 → 1.7.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.
@@ -192,6 +192,106 @@ function VideoBlock({ block }) {
192
192
  const embedUrl = url.replace("youtube.com/watch?v=", "youtube.com/embed/").replace("youtu.be/", "youtube.com/embed/").replace("vimeo.com/", "player.vimeo.com/video/");
193
193
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-video rounded-lg overflow-hidden border bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx("iframe", { src: embedUrl, allow: "autoplay; fullscreen", allowFullScreen: true, className: "w-full h-full", title: d.title || "Video" }) });
194
194
  }
195
+ function normaliseProduct(raw) {
196
+ if (raw.id !== void 0 && raw.price !== void 0) return raw;
197
+ const firstPlan = Array.isArray(raw.plans) && raw.plans.length > 0 ? raw.plans[0] : null;
198
+ return {
199
+ id: raw._id ?? raw.id ?? String(Math.random()),
200
+ name: raw.name ?? "Unnamed",
201
+ description: raw.description,
202
+ price: firstPlan?.price ?? 0,
203
+ image: raw.image ?? raw.thumbnail ?? void 0,
204
+ rating: raw.rating ?? void 0,
205
+ category: raw.type ? raw.type.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()) : void 0,
206
+ badge: raw.duration ? `${raw.duration} months` : void 0
207
+ };
208
+ }
209
+ function ProductListBlock({ block }) {
210
+ const d = getData(block);
211
+ const { title, subtitle, endpoint, columns = 3, showPrice = true, showRating = true, limit = 6, currency = "$" } = d;
212
+ const cols = parseInt(String(columns), 10);
213
+ const [state, setState] = React__default.default.useState({
214
+ data: null,
215
+ loading: true,
216
+ error: null
217
+ });
218
+ React__default.default.useEffect(() => {
219
+ if (!endpoint) {
220
+ setState({ data: [], loading: false, error: null });
221
+ return;
222
+ }
223
+ let cancelled = false;
224
+ async function fetchData() {
225
+ try {
226
+ const res = await fetch(endpoint);
227
+ if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);
228
+ const json = await res.json();
229
+ if (cancelled) return;
230
+ const items = Array.isArray(json) ? json : json.data ?? json.products ?? [];
231
+ setState({ data: items.map(normaliseProduct), loading: false, error: null });
232
+ } catch (err) {
233
+ if (!cancelled) setState({ data: null, loading: false, error: err.message });
234
+ }
235
+ }
236
+ fetchData();
237
+ return () => {
238
+ cancelled = true;
239
+ };
240
+ }, [endpoint]);
241
+ const gridCols = cols === 2 ? "sm:grid-cols-2" : cols === 4 ? "sm:grid-cols-2 lg:grid-cols-4" : "sm:grid-cols-2 lg:grid-cols-3";
242
+ if (state.loading) {
243
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
244
+ (title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-8", children: [
245
+ title && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 w-64 bg-muted animate-pulse rounded mx-auto" }),
246
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-96 max-w-full bg-muted/60 animate-pulse rounded mx-auto mt-2" })
247
+ ] }),
248
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `grid gap-6 grid-cols-1 ${gridCols}`, children: Array.from({ length: Math.min(limit, 6) }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border rounded-lg overflow-hidden", children: [
249
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "aspect-square bg-muted animate-pulse" }),
250
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 space-y-3", children: [
251
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-20 bg-muted/60 animate-pulse rounded" }),
252
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-5 w-full bg-muted animate-pulse rounded" }),
253
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-6 w-16 bg-muted animate-pulse rounded" })
254
+ ] })
255
+ ] }, i)) })
256
+ ] }) });
257
+ }
258
+ if (state.error) {
259
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-6xl mx-auto px-4", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center py-12 border border-dashed border-border rounded-lg bg-muted/20", children: [
260
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Unable to load products" }),
261
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground/70 mt-1", children: state.error })
262
+ ] }) }) });
263
+ }
264
+ const products = (state.data || []).slice(0, limit);
265
+ if (products.length === 0) {
266
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-6xl mx-auto px-4", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-center py-12 border border-dashed border-border rounded-lg bg-muted/10", children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "No products available" }) }) }) });
267
+ }
268
+ return /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
269
+ (title || subtitle) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center mb-8", children: [
270
+ title && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl md:text-3xl font-semibold tracking-tight", children: title }),
271
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mt-2", children: subtitle })
272
+ ] }),
273
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: `grid gap-6 grid-cols-1 ${gridCols}`, children: products.map((product) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border rounded-lg overflow-hidden group hover:shadow-md transition-shadow", children: [
274
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "aspect-square relative bg-muted overflow-hidden", children: [
275
+ product.image ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: product.image, alt: product.name, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full h-full flex items-center justify-center text-muted-foreground/30", children: /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-12 h-12", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" }) }) }),
276
+ product.badge && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute top-3 left-3 text-xs px-2 py-1 rounded bg-primary text-primary-foreground", children: product.badge })
277
+ ] }),
278
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 space-y-2", children: [
279
+ product.category && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground uppercase tracking-wide", children: product.category }),
280
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-medium text-sm line-clamp-2", children: product.name }),
281
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between pt-1", children: [
282
+ showPrice && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-semibold", children: [
283
+ currency,
284
+ typeof product.price === "number" ? product.price.toFixed(2) : product.price
285
+ ] }),
286
+ showRating && product.rating && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
287
+ /* @__PURE__ */ jsxRuntime.jsx("svg", { className: "w-3.5 h-3.5 fill-yellow-400 text-yellow-400", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsxRuntime.jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }),
288
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: product.rating })
289
+ ] })
290
+ ] })
291
+ ] })
292
+ ] }, product.id)) })
293
+ ] }) });
294
+ }
195
295
  function FieldValue({ value, fieldType }) {
196
296
  if (value === null || value === void 0 || value === "") return null;
197
297
  const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
@@ -287,7 +387,8 @@ var BUILT_IN = {
287
387
  alert: (b) => /* @__PURE__ */ jsxRuntime.jsx(AlertBlock, { block: b }),
288
388
  divider: () => /* @__PURE__ */ jsxRuntime.jsx(DividerBlock, {}),
289
389
  spacer: (b) => /* @__PURE__ */ jsxRuntime.jsx(SpacerBlock, { block: b }),
290
- video: (b) => /* @__PURE__ */ jsxRuntime.jsx(VideoBlock, { block: b })
390
+ video: (b) => /* @__PURE__ */ jsxRuntime.jsx(VideoBlock, { block: b }),
391
+ "product-list": (b) => /* @__PURE__ */ jsxRuntime.jsx(ProductListBlock, { block: b })
291
392
  };
292
393
  function CMSBlocks({ blocks, pageType, className = "", custom = {} }) {
293
394
  if (!blocks?.length) return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/blocks.tsx","../../src/react/preview-banner.tsx"],"names":["React","jsx","jsxs","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport React from 'react'\nimport type { CMSBlock, CMSPageType } from '../client'\n\nexport interface CMSBlocksProps {\n blocks: CMSBlock[]\n pageType?: CMSPageType | null\n className?: string\n /**\n * Custom block renderers — extend or override built-in blocks.\n * @example\n * <CMSBlocks blocks={blocks} custom={{ 'my-hero': (block) => <MyHero {...block.data} /> }} />\n */\n custom?: Record<string, (block: CMSBlock) => React.ReactNode>\n}\n\n/**\n * Resolves block data from either `data` (v1.1+) or legacy `content` field.\n */\nfunction getData(block: CMSBlock): Record<string, any> {\n return block.data ?? block.content ?? {}\n}\n\n// ── Built-in block renderers ──────────────────────────────────────────────────\n\nfunction HeadingBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const text = d.text || d.heading || d.title || ''\n const level = Number(d.level) || 2\n const cls = {\n 1: 'text-4xl font-bold tracking-tight',\n 2: 'text-2xl font-bold mt-8',\n 3: 'text-xl font-semibold mt-6',\n 4: 'text-lg font-medium mt-4',\n }[level] ?? 'text-2xl font-bold'\n return React.createElement(`h${level}`, { className: cls }, text)\n}\n\nfunction TextBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const raw = d.text || d.content || ''\n // If the stored value contains HTML tags, render it properly rather than as raw tag text\n const isHtml = typeof raw === 'string' && /<[a-z][\\s\\S]*>/i.test(raw)\n if (isHtml) {\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: raw }}\n />\n )\n }\n return <p className=\"text-base leading-relaxed text-muted-foreground\">{raw}</p>\n}\n\nfunction RichTextBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const html = d.content || d.richtext || d.text || ''\n if (!html) return null\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n}\n\nfunction ImageBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const src = d.src || d.url || d.image || ''\n if (!src) return null\n return (\n <figure className=\"my-6\">\n <img src={src} alt={d.alt || ''} className=\"w-full rounded-lg border object-cover\" />\n {d.caption && (\n <figcaption className=\"mt-2 text-sm text-muted-foreground text-center\">{d.caption}</figcaption>\n )}\n </figure>\n )\n}\n\nfunction HeroBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <section className=\"py-12 md:py-20\">\n <div className=\"max-w-3xl\">\n {d.badge && (\n <span className=\"inline-block px-3 py-1 text-xs font-semibold rounded-full bg-secondary text-secondary-foreground mb-4\">\n {d.badge}\n </span>\n )}\n <h1 className=\"text-4xl md:text-5xl font-bold tracking-tight mb-4 text-balance\">{d.title}</h1>\n {d.subtitle && <p className=\"text-xl text-muted-foreground mb-8\">{d.subtitle}</p>}\n {(d.primaryButton || d.cta) && (\n <div className=\"flex gap-4 flex-wrap\">\n {(d.primaryButton || d.cta) && (\n <a href={d.primaryUrl || d.ctaUrl || '#'}\n className=\"inline-flex items-center px-6 py-3 rounded-lg bg-primary text-primary-foreground font-semibold hover:opacity-90 transition-opacity\">\n {d.primaryButton || d.cta}\n </a>\n )}\n {d.secondaryButton && (\n <a href={d.secondaryUrl || '#'}\n className=\"inline-flex items-center px-6 py-3 rounded-lg border border-border font-semibold hover:bg-muted transition-colors\">\n {d.secondaryButton}\n </a>\n )}\n </div>\n )}\n </div>\n </section>\n )\n}\n\nfunction CTABlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <section className=\"py-12 px-8 rounded-xl bg-primary text-primary-foreground text-center\">\n <h2 className=\"text-2xl md:text-3xl font-bold mb-4\">{d.title}</h2>\n {d.subtitle && <p className=\"text-primary-foreground/80 mb-6 max-w-2xl mx-auto\">{d.subtitle}</p>}\n <div className=\"flex gap-4 justify-center flex-wrap\">\n {d.primaryButton && (\n <a href={d.primaryUrl || '#'}\n className=\"px-6 py-3 rounded-lg bg-background text-foreground font-semibold hover:opacity-90 transition-opacity\">\n {d.primaryButton}\n </a>\n )}\n {d.secondaryButton && (\n <a href={d.secondaryUrl || '#'}\n className=\"px-6 py-3 rounded-lg border border-primary-foreground/20 text-primary-foreground font-semibold hover:bg-primary-foreground/10 transition-colors\">\n {d.secondaryButton}\n </a>\n )}\n </div>\n </section>\n )\n}\n\nfunction FAQBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const items: { question: string; answer: string }[] = d.items || []\n return (\n <section className=\"py-8\">\n {d.title && <h2 className=\"text-2xl font-bold mb-6\">{d.title}</h2>}\n <div className=\"space-y-4\">\n {items.map((item, i) => (\n <details key={i} className=\"group border border-border rounded-lg\">\n <summary className=\"flex items-center justify-between p-4 cursor-pointer font-medium select-none\">\n {item.question}\n <span className=\"transition-transform group-open:rotate-45 text-lg leading-none\">+</span>\n </summary>\n <div className=\"px-4 pb-4 text-muted-foreground\">{item.answer}</div>\n </details>\n ))}\n </div>\n </section>\n )\n}\n\nfunction StatsBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const items: { value: string; label: string }[] = d.items || d.stats || []\n return (\n <section className=\"py-8\">\n {d.title && <h2 className=\"text-2xl font-bold mb-6 text-center\">{d.title}</h2>}\n <div className={`grid gap-6 grid-cols-2 md:grid-cols-${Math.min(items.length, 4)}`}>\n {items.map((s, i) => (\n <div key={i} className=\"text-center p-6 rounded-lg border bg-card\">\n <div className=\"text-3xl font-bold text-primary\">{s.value}</div>\n <div className=\"text-sm text-muted-foreground mt-1\">{s.label}</div>\n </div>\n ))}\n </div>\n </section>\n )\n}\n\nfunction TestimonialBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <div className=\"border border-border rounded-xl p-6 bg-card\">\n <blockquote className=\"text-lg italic mb-4 text-foreground\">\"{d.quote}\"</blockquote>\n <div className=\"flex items-center gap-3\">\n {d.avatar && <img src={d.avatar} alt=\"\" className=\"w-10 h-10 rounded-full object-cover\" />}\n <div>\n <div className=\"font-semibold\">{d.author}</div>\n {d.role && <div className=\"text-sm text-muted-foreground\">{d.role}</div>}\n </div>\n </div>\n </div>\n )\n}\n\nfunction QuoteBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <blockquote className=\"border-l-4 border-primary pl-6 py-2 italic text-lg\">\n {d.text}\n {d.author && <footer className=\"mt-2 text-sm text-muted-foreground not-italic\">— {d.author}</footer>}\n </blockquote>\n )\n}\n\nfunction AlertBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const colors: Record<string, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800 dark:bg-blue-950 dark:border-blue-800 dark:text-blue-200',\n success: 'bg-green-50 border-green-200 text-green-800 dark:bg-green-950 dark:border-green-800 dark:text-green-200',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800 dark:bg-yellow-950 dark:border-yellow-800 dark:text-yellow-200',\n error: 'bg-red-50 border-red-200 text-red-800 dark:bg-red-950 dark:border-red-800 dark:text-red-200',\n }\n const variant = d.variant || d.type || 'info'\n return (\n <div className={`p-4 rounded-lg border ${colors[variant] ?? colors.info}`}>\n {d.title && <div className=\"font-semibold mb-1\">{d.title}</div>}\n <p>{d.message || d.text || ''}</p>\n </div>\n )\n}\n\nfunction DividerBlock() {\n return <hr className=\"my-8 border-border\" />\n}\n\nfunction SpacerBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const sizes: Record<string, string> = { sm: 'h-4', md: 'h-8', lg: 'h-16', xl: 'h-24' }\n return <div className={sizes[d.size] ?? 'h-8'} />\n}\n\nfunction VideoBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const url = d.url || d.embed || ''\n if (!url) return null\n // Convert YouTube/Vimeo watch URLs to embed URLs\n const embedUrl = url\n .replace('youtube.com/watch?v=', 'youtube.com/embed/')\n .replace('youtu.be/', 'youtube.com/embed/')\n .replace('vimeo.com/', 'player.vimeo.com/video/')\n return (\n <div className=\"aspect-video rounded-lg overflow-hidden border bg-muted\">\n <iframe src={embedUrl} allow=\"autoplay; fullscreen\" allowFullScreen className=\"w-full h-full\" title={d.title || 'Video'} />\n </div>\n )\n}\n\n// ── Renders a single field value based on its field type ──────────────────────\n\nfunction FieldValue({ value, fieldType }: { value: any; fieldType: string }) {\n if (value === null || value === undefined || value === '') return null\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n\n if (fieldType === 'richtext' || isHtml(value)) {\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: String(value) }}\n />\n )\n }\n if (fieldType === 'image') {\n return <img src={String(value)} alt=\"\" className=\"rounded-lg border max-h-96 object-cover w-full\" />\n }\n if (fieldType === 'boolean') {\n return <span className=\"text-muted-foreground\">{value ? 'Yes' : 'No'}</span>\n }\n if (fieldType === 'url') {\n return <a href={String(value)} className=\"text-primary underline underline-offset-2 break-all\">{String(value)}</a>\n }\n if (Array.isArray(value)) {\n return <span className=\"text-muted-foreground\">{value.join(', ')}</span>\n }\n return <span className=\"text-muted-foreground\">{String(value)}</span>\n}\n\n// ── Structured block: type === '__structured__', content is nested { sectionName: { fieldName: value } }\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction StructuredBlock({ block, pageType }: { block: CMSBlock; pageType?: CMSPageType | null }) {\n // content is { sectionName: { fieldName: value } } after API denormalization\n const nested: Record<string, Record<string, any>> = (block.content ?? block.data ?? {}) as any\n\n // If we have the page type schema, use it to drive rendering with correct field types\n if (pageType?.sections?.length) {\n return (\n <div className=\"space-y-8\">\n {pageType.sections.map(section => {\n const sectionData = nested[section.name] ?? {}\n const filledFields = section.fields.filter(f => {\n const v = sectionData[f.name]\n return v !== undefined && v !== null && v !== ''\n })\n if (filledFields.length === 0) return null\n return (\n <section key={section.id} className=\"space-y-4\">\n {filledFields.map(field => {\n const value = sectionData[field.name]\n if (value === undefined || value === null || value === '') return null\n return (\n <div key={field.id}>\n <FieldValue value={value} fieldType={field.fieldType} />\n </div>\n )\n })}\n </section>\n )\n })}\n </div>\n )\n }\n\n // No schema — iterate the nested sections and render scalar + html values\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n return (\n <div className=\"space-y-8\">\n {Object.entries(nested).map(([sectionName, fields]) => {\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) return null\n const entries = Object.entries(fields).filter(([, v]) => v !== '' && v !== null && v !== undefined)\n if (entries.length === 0) return null\n return (\n <section key={sectionName} className=\"space-y-4\">\n {entries.map(([fieldName, value]) => {\n if (typeof value === 'object' && !Array.isArray(value)) return null\n return (\n <div key={fieldName}>\n {isHtml(value) ? (\n <div className=\"prose prose-neutral dark:prose-invert max-w-none\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n ) : Array.isArray(value) ? (\n <p className=\"text-muted-foreground\">{value.join(', ')}</p>\n ) : (\n <p className=\"text-muted-foreground\">{String(value)}</p>\n )}\n </div>\n )\n })}\n </section>\n )\n })}\n </div>\n )\n}\n\n// ── Named section block (block.type matches a pageType section name) ──────────\n\nfunction SectionBlock({ block, pageType }: { block: CMSBlock; pageType?: CMSPageType | null }) {\n const d = getData(block)\n const section = pageType?.sections.find(s => s.name === block.type)\n\n if (section) {\n const filledFields = section.fields.filter(f => {\n const v = d[f.name]\n return v !== undefined && v !== null && v !== ''\n })\n if (filledFields.length === 0) return null\n return (\n <section className=\"space-y-4\">\n {filledFields.map(field => {\n const value = d[field.name]\n if (value === undefined || value === null || value === '') return null\n return (\n <div key={field.id}>\n <FieldValue value={value} fieldType={field.fieldType} />\n </div>\n )\n })}\n </section>\n )\n }\n\n // No schema — render scalar values only\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n const entries = Object.entries(d).filter(([, v]) =>\n v !== '' && v !== null && v !== undefined &&\n typeof v !== 'object' && !Array.isArray(v)\n )\n if (entries.length === 0) return null\n return (\n <section className=\"space-y-2\">\n {entries.map(([key, value]) =>\n isHtml(value) ? (\n <div key={key} className=\"prose prose-neutral dark:prose-invert max-w-none\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n ) : (\n <p key={key} className=\"text-muted-foreground\">{String(value)}</p>\n )\n )}\n </section>\n )\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nconst BUILT_IN: Record<string, (block: CMSBlock, pageType?: CMSPageType | null) => React.ReactNode> = {\n // Structured page type — content is nested { sectionName: { fieldName: value } }\n '__structured__': (b, pt) => <StructuredBlock block={b} pageType={pt} />,\n heading: (b) => <HeadingBlock block={b} />,\n text: (b) => <TextBlock block={b} />,\n richtext: (b) => <RichTextBlock block={b} />,\n image: (b) => <ImageBlock block={b} />,\n hero: (b) => <HeroBlock block={b} />,\n 'hero-section': (b) => <HeroBlock block={b} />,\n cta: (b) => <CTABlock block={b} />,\n faq: (b) => <FAQBlock block={b} />,\n stats: (b) => <StatsBlock block={b} />,\n testimonial: (b) => <TestimonialBlock block={b} />,\n quote: (b) => <QuoteBlock block={b} />,\n alert: (b) => <AlertBlock block={b} />,\n divider: () => <DividerBlock />,\n spacer: (b) => <SpacerBlock block={b} />,\n video: (b) => <VideoBlock block={b} />,\n}\n\nexport function CMSBlocks({ blocks, pageType, className = '', custom = {} }: CMSBlocksProps) {\n if (!blocks?.length) return null\n\n return (\n <div className={`space-y-8 ${className}`}>\n {blocks.map(block => {\n // 1. Custom renderer takes priority\n if (custom[block.type]) return <React.Fragment key={block.id}>{custom[block.type](block)}</React.Fragment>\n // 2. Built-in renderer\n if (BUILT_IN[block.type]) return <React.Fragment key={block.id}>{BUILT_IN[block.type](block, pageType)}</React.Fragment>\n // 3. Structured section block (from page type sections)\n return <SectionBlock key={block.id} block={block} pageType={pageType} />\n })}\n </div>\n )\n}\n","'use client'\n\nimport React from 'react'\n\nexport interface CMSPreviewBannerProps {\n isPreview: boolean\n status?: string\n slug?: string\n /** URL for the exit preview link. Defaults to /api/cms-preview/exit */\n exitUrl?: string\n}\n\nexport function CMSPreviewBanner({ isPreview, status, slug, exitUrl = '/api/cms-preview/exit' }: CMSPreviewBannerProps) {\n if (!isPreview) return null\n return (\n <div className=\"sticky top-0 z-50 flex items-center justify-between px-4 py-2.5 bg-amber-500 text-white text-sm font-medium shadow\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n <span>Draft Preview</span>\n {status && <><span className=\"opacity-60\">·</span><span className=\"opacity-75 capitalize\">{status}</span></>}\n {slug && <><span className=\"opacity-60\">·</span><span className=\"opacity-75 font-normal\">/{slug}</span></>}\n </div>\n <a href={exitUrl} className=\"px-3 py-1 rounded bg-white/20 hover:bg-white/30 transition-colors text-xs\">\n Exit Preview\n </a>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/react/blocks.tsx","../../src/react/preview-banner.tsx"],"names":["React","jsx","jsxs","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\nimport React from 'react'\nimport type { CMSBlock, CMSPageType } from '../client'\n\nexport interface CMSBlocksProps {\n blocks: CMSBlock[]\n pageType?: CMSPageType | null\n className?: string\n /**\n * Custom block renderers — extend or override built-in blocks.\n * @example\n * <CMSBlocks blocks={blocks} custom={{ 'my-hero': (block) => <MyHero {...block.data} /> }} />\n */\n custom?: Record<string, (block: CMSBlock) => React.ReactNode>\n}\n\n/**\n * Resolves block data from either `data` (v1.1+) or legacy `content` field.\n */\nfunction getData(block: CMSBlock): Record<string, any> {\n return block.data ?? block.content ?? {}\n}\n\n// ── Built-in block renderers ──────────────────────────────────────────────────\n\nfunction HeadingBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const text = d.text || d.heading || d.title || ''\n const level = Number(d.level) || 2\n const cls = {\n 1: 'text-4xl font-bold tracking-tight',\n 2: 'text-2xl font-bold mt-8',\n 3: 'text-xl font-semibold mt-6',\n 4: 'text-lg font-medium mt-4',\n }[level] ?? 'text-2xl font-bold'\n return React.createElement(`h${level}`, { className: cls }, text)\n}\n\nfunction TextBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const raw = d.text || d.content || ''\n // If the stored value contains HTML tags, render it properly rather than as raw tag text\n const isHtml = typeof raw === 'string' && /<[a-z][\\s\\S]*>/i.test(raw)\n if (isHtml) {\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: raw }}\n />\n )\n }\n return <p className=\"text-base leading-relaxed text-muted-foreground\">{raw}</p>\n}\n\nfunction RichTextBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const html = d.content || d.richtext || d.text || ''\n if (!html) return null\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n}\n\nfunction ImageBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const src = d.src || d.url || d.image || ''\n if (!src) return null\n return (\n <figure className=\"my-6\">\n <img src={src} alt={d.alt || ''} className=\"w-full rounded-lg border object-cover\" />\n {d.caption && (\n <figcaption className=\"mt-2 text-sm text-muted-foreground text-center\">{d.caption}</figcaption>\n )}\n </figure>\n )\n}\n\nfunction HeroBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <section className=\"py-12 md:py-20\">\n <div className=\"max-w-3xl\">\n {d.badge && (\n <span className=\"inline-block px-3 py-1 text-xs font-semibold rounded-full bg-secondary text-secondary-foreground mb-4\">\n {d.badge}\n </span>\n )}\n <h1 className=\"text-4xl md:text-5xl font-bold tracking-tight mb-4 text-balance\">{d.title}</h1>\n {d.subtitle && <p className=\"text-xl text-muted-foreground mb-8\">{d.subtitle}</p>}\n {(d.primaryButton || d.cta) && (\n <div className=\"flex gap-4 flex-wrap\">\n {(d.primaryButton || d.cta) && (\n <a href={d.primaryUrl || d.ctaUrl || '#'}\n className=\"inline-flex items-center px-6 py-3 rounded-lg bg-primary text-primary-foreground font-semibold hover:opacity-90 transition-opacity\">\n {d.primaryButton || d.cta}\n </a>\n )}\n {d.secondaryButton && (\n <a href={d.secondaryUrl || '#'}\n className=\"inline-flex items-center px-6 py-3 rounded-lg border border-border font-semibold hover:bg-muted transition-colors\">\n {d.secondaryButton}\n </a>\n )}\n </div>\n )}\n </div>\n </section>\n )\n}\n\nfunction CTABlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <section className=\"py-12 px-8 rounded-xl bg-primary text-primary-foreground text-center\">\n <h2 className=\"text-2xl md:text-3xl font-bold mb-4\">{d.title}</h2>\n {d.subtitle && <p className=\"text-primary-foreground/80 mb-6 max-w-2xl mx-auto\">{d.subtitle}</p>}\n <div className=\"flex gap-4 justify-center flex-wrap\">\n {d.primaryButton && (\n <a href={d.primaryUrl || '#'}\n className=\"px-6 py-3 rounded-lg bg-background text-foreground font-semibold hover:opacity-90 transition-opacity\">\n {d.primaryButton}\n </a>\n )}\n {d.secondaryButton && (\n <a href={d.secondaryUrl || '#'}\n className=\"px-6 py-3 rounded-lg border border-primary-foreground/20 text-primary-foreground font-semibold hover:bg-primary-foreground/10 transition-colors\">\n {d.secondaryButton}\n </a>\n )}\n </div>\n </section>\n )\n}\n\nfunction FAQBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const items: { question: string; answer: string }[] = d.items || []\n return (\n <section className=\"py-8\">\n {d.title && <h2 className=\"text-2xl font-bold mb-6\">{d.title}</h2>}\n <div className=\"space-y-4\">\n {items.map((item, i) => (\n <details key={i} className=\"group border border-border rounded-lg\">\n <summary className=\"flex items-center justify-between p-4 cursor-pointer font-medium select-none\">\n {item.question}\n <span className=\"transition-transform group-open:rotate-45 text-lg leading-none\">+</span>\n </summary>\n <div className=\"px-4 pb-4 text-muted-foreground\">{item.answer}</div>\n </details>\n ))}\n </div>\n </section>\n )\n}\n\nfunction StatsBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const items: { value: string; label: string }[] = d.items || d.stats || []\n return (\n <section className=\"py-8\">\n {d.title && <h2 className=\"text-2xl font-bold mb-6 text-center\">{d.title}</h2>}\n <div className={`grid gap-6 grid-cols-2 md:grid-cols-${Math.min(items.length, 4)}`}>\n {items.map((s, i) => (\n <div key={i} className=\"text-center p-6 rounded-lg border bg-card\">\n <div className=\"text-3xl font-bold text-primary\">{s.value}</div>\n <div className=\"text-sm text-muted-foreground mt-1\">{s.label}</div>\n </div>\n ))}\n </div>\n </section>\n )\n}\n\nfunction TestimonialBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <div className=\"border border-border rounded-xl p-6 bg-card\">\n <blockquote className=\"text-lg italic mb-4 text-foreground\">\"{d.quote}\"</blockquote>\n <div className=\"flex items-center gap-3\">\n {d.avatar && <img src={d.avatar} alt=\"\" className=\"w-10 h-10 rounded-full object-cover\" />}\n <div>\n <div className=\"font-semibold\">{d.author}</div>\n {d.role && <div className=\"text-sm text-muted-foreground\">{d.role}</div>}\n </div>\n </div>\n </div>\n )\n}\n\nfunction QuoteBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n return (\n <blockquote className=\"border-l-4 border-primary pl-6 py-2 italic text-lg\">\n {d.text}\n {d.author && <footer className=\"mt-2 text-sm text-muted-foreground not-italic\">— {d.author}</footer>}\n </blockquote>\n )\n}\n\nfunction AlertBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const colors: Record<string, string> = {\n info: 'bg-blue-50 border-blue-200 text-blue-800 dark:bg-blue-950 dark:border-blue-800 dark:text-blue-200',\n success: 'bg-green-50 border-green-200 text-green-800 dark:bg-green-950 dark:border-green-800 dark:text-green-200',\n warning: 'bg-yellow-50 border-yellow-200 text-yellow-800 dark:bg-yellow-950 dark:border-yellow-800 dark:text-yellow-200',\n error: 'bg-red-50 border-red-200 text-red-800 dark:bg-red-950 dark:border-red-800 dark:text-red-200',\n }\n const variant = d.variant || d.type || 'info'\n return (\n <div className={`p-4 rounded-lg border ${colors[variant] ?? colors.info}`}>\n {d.title && <div className=\"font-semibold mb-1\">{d.title}</div>}\n <p>{d.message || d.text || ''}</p>\n </div>\n )\n}\n\nfunction DividerBlock() {\n return <hr className=\"my-8 border-border\" />\n}\n\nfunction SpacerBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const sizes: Record<string, string> = { sm: 'h-4', md: 'h-8', lg: 'h-16', xl: 'h-24' }\n return <div className={sizes[d.size] ?? 'h-8'} />\n}\n\nfunction VideoBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const url = d.url || d.embed || ''\n if (!url) return null\n // Convert YouTube/Vimeo watch URLs to embed URLs\n const embedUrl = url\n .replace('youtube.com/watch?v=', 'youtube.com/embed/')\n .replace('youtu.be/', 'youtube.com/embed/')\n .replace('vimeo.com/', 'player.vimeo.com/video/')\n return (\n <div className=\"aspect-video rounded-lg overflow-hidden border bg-muted\">\n <iframe src={embedUrl} allow=\"autoplay; fullscreen\" allowFullScreen className=\"w-full h-full\" title={d.title || 'Video'} />\n </div>\n )\n}\n\n// ── Product List Block (dynamic, fetches from API) ────────────────────────────\n\ninterface Product {\n id: string\n name: string\n price: number\n image?: string\n rating?: number\n category?: string\n description?: string\n badge?: string\n}\n\nfunction normaliseProduct(raw: Record<string, any>): Product {\n if (raw.id !== undefined && raw.price !== undefined) return raw as Product\n const firstPlan = Array.isArray(raw.plans) && raw.plans.length > 0 ? raw.plans[0] : null\n return {\n id: raw._id ?? raw.id ?? String(Math.random()),\n name: raw.name ?? 'Unnamed',\n description: raw.description,\n price: firstPlan?.price ?? 0,\n image: raw.image ?? raw.thumbnail ?? undefined,\n rating: raw.rating ?? undefined,\n category: raw.type ? raw.type.replace(/-/g, ' ').replace(/\\b\\w/g, (c: string) => c.toUpperCase()) : undefined,\n badge: raw.duration ? `${raw.duration} months` : undefined,\n }\n}\n\nfunction ProductListBlock({ block }: { block: CMSBlock }) {\n const d = getData(block)\n const { title, subtitle, endpoint, columns = 3, showPrice = true, showRating = true, limit = 6, currency = '$' } = d\n const cols = parseInt(String(columns), 10)\n\n const [state, setState] = React.useState<{ data: Product[] | null; loading: boolean; error: string | null }>({\n data: null,\n loading: true,\n error: null,\n })\n\n React.useEffect(() => {\n if (!endpoint) {\n setState({ data: [], loading: false, error: null })\n return\n }\n let cancelled = false\n async function fetchData() {\n try {\n const res = await fetch(endpoint)\n if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`)\n const json = await res.json()\n if (cancelled) return\n const items = Array.isArray(json) ? json : (json.data ?? json.products ?? [])\n setState({ data: items.map(normaliseProduct), loading: false, error: null })\n } catch (err: any) {\n if (!cancelled) setState({ data: null, loading: false, error: err.message })\n }\n }\n fetchData()\n return () => { cancelled = true }\n }, [endpoint])\n\n const gridCols = cols === 2 ? 'sm:grid-cols-2' : cols === 4 ? 'sm:grid-cols-2 lg:grid-cols-4' : 'sm:grid-cols-2 lg:grid-cols-3'\n\n // Loading skeleton\n if (state.loading) {\n return (\n <section className=\"py-12\">\n <div className=\"max-w-6xl mx-auto px-4\">\n {(title || subtitle) && (\n <div className=\"text-center mb-8\">\n {title && <div className=\"h-8 w-64 bg-muted animate-pulse rounded mx-auto\" />}\n {subtitle && <div className=\"h-4 w-96 max-w-full bg-muted/60 animate-pulse rounded mx-auto mt-2\" />}\n </div>\n )}\n <div className={`grid gap-6 grid-cols-1 ${gridCols}`}>\n {Array.from({ length: Math.min(limit, 6) }).map((_, i) => (\n <div key={i} className=\"border rounded-lg overflow-hidden\">\n <div className=\"aspect-square bg-muted animate-pulse\" />\n <div className=\"p-4 space-y-3\">\n <div className=\"h-4 w-20 bg-muted/60 animate-pulse rounded\" />\n <div className=\"h-5 w-full bg-muted animate-pulse rounded\" />\n <div className=\"h-6 w-16 bg-muted animate-pulse rounded\" />\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n )\n }\n\n // Error state\n if (state.error) {\n return (\n <section className=\"py-12\">\n <div className=\"max-w-6xl mx-auto px-4\">\n <div className=\"text-center py-12 border border-dashed border-border rounded-lg bg-muted/20\">\n <p className=\"text-sm font-medium text-muted-foreground\">Unable to load products</p>\n <p className=\"text-xs text-muted-foreground/70 mt-1\">{state.error}</p>\n </div>\n </div>\n </section>\n )\n }\n\n const products = (state.data || []).slice(0, limit)\n\n // Empty state\n if (products.length === 0) {\n return (\n <section className=\"py-12\">\n <div className=\"max-w-6xl mx-auto px-4\">\n <div className=\"text-center py-12 border border-dashed border-border rounded-lg bg-muted/10\">\n <p className=\"text-sm text-muted-foreground\">No products available</p>\n </div>\n </div>\n </section>\n )\n }\n\n return (\n <section className=\"py-12\">\n <div className=\"max-w-6xl mx-auto px-4\">\n {(title || subtitle) && (\n <div className=\"text-center mb-8\">\n {title && <h2 className=\"text-2xl md:text-3xl font-semibold tracking-tight\">{title}</h2>}\n {subtitle && <p className=\"text-muted-foreground mt-2\">{subtitle}</p>}\n </div>\n )}\n <div className={`grid gap-6 grid-cols-1 ${gridCols}`}>\n {products.map((product) => (\n <div key={product.id} className=\"border rounded-lg overflow-hidden group hover:shadow-md transition-shadow\">\n <div className=\"aspect-square relative bg-muted overflow-hidden\">\n {product.image ? (\n <img src={product.image} alt={product.name} className=\"w-full h-full object-cover group-hover:scale-105 transition-transform duration-300\" />\n ) : (\n <div className=\"w-full h-full flex items-center justify-center text-muted-foreground/30\">\n <svg className=\"w-12 h-12\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5} d=\"M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z\" />\n </svg>\n </div>\n )}\n {product.badge && (\n <span className=\"absolute top-3 left-3 text-xs px-2 py-1 rounded bg-primary text-primary-foreground\">{product.badge}</span>\n )}\n </div>\n <div className=\"p-4 space-y-2\">\n {product.category && <p className=\"text-xs text-muted-foreground uppercase tracking-wide\">{product.category}</p>}\n <h3 className=\"font-medium text-sm line-clamp-2\">{product.name}</h3>\n <div className=\"flex items-center justify-between pt-1\">\n {showPrice && <span className=\"font-semibold\">{currency}{typeof product.price === 'number' ? product.price.toFixed(2) : product.price}</span>}\n {showRating && product.rating && (\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <svg className=\"w-3.5 h-3.5 fill-yellow-400 text-yellow-400\" viewBox=\"0 0 24 24\"><path d=\"M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\"/></svg>\n <span>{product.rating}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n ))}\n </div>\n </div>\n </section>\n )\n}\n\n// ── Renders a single field value based on its field type ──────────────────────\n\nfunction FieldValue({ value, fieldType }: { value: any; fieldType: string }) {\n if (value === null || value === undefined || value === '') return null\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n\n if (fieldType === 'richtext' || isHtml(value)) {\n return (\n <div\n className=\"prose prose-neutral dark:prose-invert max-w-none\"\n dangerouslySetInnerHTML={{ __html: String(value) }}\n />\n )\n }\n if (fieldType === 'image') {\n return <img src={String(value)} alt=\"\" className=\"rounded-lg border max-h-96 object-cover w-full\" />\n }\n if (fieldType === 'boolean') {\n return <span className=\"text-muted-foreground\">{value ? 'Yes' : 'No'}</span>\n }\n if (fieldType === 'url') {\n return <a href={String(value)} className=\"text-primary underline underline-offset-2 break-all\">{String(value)}</a>\n }\n if (Array.isArray(value)) {\n return <span className=\"text-muted-foreground\">{value.join(', ')}</span>\n }\n return <span className=\"text-muted-foreground\">{String(value)}</span>\n}\n\n// ── Structured block: type === '__structured__', content is nested { sectionName: { fieldName: value } }\n// ─────────────────────────────────────────────────────────────────────────────\n\nfunction StructuredBlock({ block, pageType }: { block: CMSBlock; pageType?: CMSPageType | null }) {\n // content is { sectionName: { fieldName: value } } after API denormalization\n const nested: Record<string, Record<string, any>> = (block.content ?? block.data ?? {}) as any\n\n // If we have the page type schema, use it to drive rendering with correct field types\n if (pageType?.sections?.length) {\n return (\n <div className=\"space-y-8\">\n {pageType.sections.map(section => {\n const sectionData = nested[section.name] ?? {}\n const filledFields = section.fields.filter(f => {\n const v = sectionData[f.name]\n return v !== undefined && v !== null && v !== ''\n })\n if (filledFields.length === 0) return null\n return (\n <section key={section.id} className=\"space-y-4\">\n {filledFields.map(field => {\n const value = sectionData[field.name]\n if (value === undefined || value === null || value === '') return null\n return (\n <div key={field.id}>\n <FieldValue value={value} fieldType={field.fieldType} />\n </div>\n )\n })}\n </section>\n )\n })}\n </div>\n )\n }\n\n // No schema — iterate the nested sections and render scalar + html values\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n return (\n <div className=\"space-y-8\">\n {Object.entries(nested).map(([sectionName, fields]) => {\n if (!fields || typeof fields !== 'object' || Array.isArray(fields)) return null\n const entries = Object.entries(fields).filter(([, v]) => v !== '' && v !== null && v !== undefined)\n if (entries.length === 0) return null\n return (\n <section key={sectionName} className=\"space-y-4\">\n {entries.map(([fieldName, value]) => {\n if (typeof value === 'object' && !Array.isArray(value)) return null\n return (\n <div key={fieldName}>\n {isHtml(value) ? (\n <div className=\"prose prose-neutral dark:prose-invert max-w-none\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n ) : Array.isArray(value) ? (\n <p className=\"text-muted-foreground\">{value.join(', ')}</p>\n ) : (\n <p className=\"text-muted-foreground\">{String(value)}</p>\n )}\n </div>\n )\n })}\n </section>\n )\n })}\n </div>\n )\n}\n\n// ── Named section block (block.type matches a pageType section name) ──────────\n\nfunction SectionBlock({ block, pageType }: { block: CMSBlock; pageType?: CMSPageType | null }) {\n const d = getData(block)\n const section = pageType?.sections.find(s => s.name === block.type)\n\n if (section) {\n const filledFields = section.fields.filter(f => {\n const v = d[f.name]\n return v !== undefined && v !== null && v !== ''\n })\n if (filledFields.length === 0) return null\n return (\n <section className=\"space-y-4\">\n {filledFields.map(field => {\n const value = d[field.name]\n if (value === undefined || value === null || value === '') return null\n return (\n <div key={field.id}>\n <FieldValue value={value} fieldType={field.fieldType} />\n </div>\n )\n })}\n </section>\n )\n }\n\n // No schema — render scalar values only\n const isHtml = (v: any) => typeof v === 'string' && /<[a-z][\\s\\S]*>/i.test(v)\n const entries = Object.entries(d).filter(([, v]) =>\n v !== '' && v !== null && v !== undefined &&\n typeof v !== 'object' && !Array.isArray(v)\n )\n if (entries.length === 0) return null\n return (\n <section className=\"space-y-2\">\n {entries.map(([key, value]) =>\n isHtml(value) ? (\n <div key={key} className=\"prose prose-neutral dark:prose-invert max-w-none\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n ) : (\n <p key={key} className=\"text-muted-foreground\">{String(value)}</p>\n )\n )}\n </section>\n )\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nconst BUILT_IN: Record<string, (block: CMSBlock, pageType?: CMSPageType | null) => React.ReactNode> = {\n // Structured page type — content is nested { sectionName: { fieldName: value } }\n '__structured__': (b, pt) => <StructuredBlock block={b} pageType={pt} />,\n heading: (b) => <HeadingBlock block={b} />,\n text: (b) => <TextBlock block={b} />,\n richtext: (b) => <RichTextBlock block={b} />,\n image: (b) => <ImageBlock block={b} />,\n hero: (b) => <HeroBlock block={b} />,\n 'hero-section': (b) => <HeroBlock block={b} />,\n cta: (b) => <CTABlock block={b} />,\n faq: (b) => <FAQBlock block={b} />,\n stats: (b) => <StatsBlock block={b} />,\n testimonial: (b) => <TestimonialBlock block={b} />,\n quote: (b) => <QuoteBlock block={b} />,\n alert: (b) => <AlertBlock block={b} />,\n divider: () => <DividerBlock />,\n spacer: (b) => <SpacerBlock block={b} />,\n video: (b) => <VideoBlock block={b} />,\n 'product-list': (b) => <ProductListBlock block={b} />,\n}\n\nexport function CMSBlocks({ blocks, pageType, className = '', custom = {} }: CMSBlocksProps) {\n if (!blocks?.length) return null\n\n return (\n <div className={`space-y-8 ${className}`}>\n {blocks.map(block => {\n // 1. Custom renderer takes priority\n if (custom[block.type]) return <React.Fragment key={block.id}>{custom[block.type](block)}</React.Fragment>\n // 2. Built-in renderer\n if (BUILT_IN[block.type]) return <React.Fragment key={block.id}>{BUILT_IN[block.type](block, pageType)}</React.Fragment>\n // 3. Structured section block (from page type sections)\n return <SectionBlock key={block.id} block={block} pageType={pageType} />\n })}\n </div>\n )\n}\n","'use client'\n\nimport React from 'react'\n\nexport interface CMSPreviewBannerProps {\n isPreview: boolean\n status?: string\n slug?: string\n /** URL for the exit preview link. Defaults to /api/cms-preview/exit */\n exitUrl?: string\n}\n\nexport function CMSPreviewBanner({ isPreview, status, slug, exitUrl = '/api/cms-preview/exit' }: CMSPreviewBannerProps) {\n if (!isPreview) return null\n return (\n <div className=\"sticky top-0 z-50 flex items-center justify-between px-4 py-2.5 bg-amber-500 text-white text-sm font-medium shadow\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-4 h-4 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M2.458 12C3.732 7.943 7.523 5 12 5c4.478 0 8.268 2.943 9.542 7-1.274 4.057-5.064 7-9.542 7-4.477 0-8.268-2.943-9.542-7z\" />\n </svg>\n <span>Draft Preview</span>\n {status && <><span className=\"opacity-60\">·</span><span className=\"opacity-75 capitalize\">{status}</span></>}\n {slug && <><span className=\"opacity-60\">·</span><span className=\"opacity-75 font-normal\">/{slug}</span></>}\n </div>\n <a href={exitUrl} className=\"px-3 py-1 rounded bg-white/20 hover:bg-white/30 transition-colors text-xs\">\n Exit Preview\n </a>\n </div>\n )\n}\n"]}
@@ -186,6 +186,106 @@ function VideoBlock({ block }) {
186
186
  const embedUrl = url.replace("youtube.com/watch?v=", "youtube.com/embed/").replace("youtu.be/", "youtube.com/embed/").replace("vimeo.com/", "player.vimeo.com/video/");
187
187
  return /* @__PURE__ */ jsx("div", { className: "aspect-video rounded-lg overflow-hidden border bg-muted", children: /* @__PURE__ */ jsx("iframe", { src: embedUrl, allow: "autoplay; fullscreen", allowFullScreen: true, className: "w-full h-full", title: d.title || "Video" }) });
188
188
  }
189
+ function normaliseProduct(raw) {
190
+ if (raw.id !== void 0 && raw.price !== void 0) return raw;
191
+ const firstPlan = Array.isArray(raw.plans) && raw.plans.length > 0 ? raw.plans[0] : null;
192
+ return {
193
+ id: raw._id ?? raw.id ?? String(Math.random()),
194
+ name: raw.name ?? "Unnamed",
195
+ description: raw.description,
196
+ price: firstPlan?.price ?? 0,
197
+ image: raw.image ?? raw.thumbnail ?? void 0,
198
+ rating: raw.rating ?? void 0,
199
+ category: raw.type ? raw.type.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()) : void 0,
200
+ badge: raw.duration ? `${raw.duration} months` : void 0
201
+ };
202
+ }
203
+ function ProductListBlock({ block }) {
204
+ const d = getData(block);
205
+ const { title, subtitle, endpoint, columns = 3, showPrice = true, showRating = true, limit = 6, currency = "$" } = d;
206
+ const cols = parseInt(String(columns), 10);
207
+ const [state, setState] = React.useState({
208
+ data: null,
209
+ loading: true,
210
+ error: null
211
+ });
212
+ React.useEffect(() => {
213
+ if (!endpoint) {
214
+ setState({ data: [], loading: false, error: null });
215
+ return;
216
+ }
217
+ let cancelled = false;
218
+ async function fetchData() {
219
+ try {
220
+ const res = await fetch(endpoint);
221
+ if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);
222
+ const json = await res.json();
223
+ if (cancelled) return;
224
+ const items = Array.isArray(json) ? json : json.data ?? json.products ?? [];
225
+ setState({ data: items.map(normaliseProduct), loading: false, error: null });
226
+ } catch (err) {
227
+ if (!cancelled) setState({ data: null, loading: false, error: err.message });
228
+ }
229
+ }
230
+ fetchData();
231
+ return () => {
232
+ cancelled = true;
233
+ };
234
+ }, [endpoint]);
235
+ const gridCols = cols === 2 ? "sm:grid-cols-2" : cols === 4 ? "sm:grid-cols-2 lg:grid-cols-4" : "sm:grid-cols-2 lg:grid-cols-3";
236
+ if (state.loading) {
237
+ return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
238
+ (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
239
+ title && /* @__PURE__ */ jsx("div", { className: "h-8 w-64 bg-muted animate-pulse rounded mx-auto" }),
240
+ subtitle && /* @__PURE__ */ jsx("div", { className: "h-4 w-96 max-w-full bg-muted/60 animate-pulse rounded mx-auto mt-2" })
241
+ ] }),
242
+ /* @__PURE__ */ jsx("div", { className: `grid gap-6 grid-cols-1 ${gridCols}`, children: Array.from({ length: Math.min(limit, 6) }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "border rounded-lg overflow-hidden", children: [
243
+ /* @__PURE__ */ jsx("div", { className: "aspect-square bg-muted animate-pulse" }),
244
+ /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-3", children: [
245
+ /* @__PURE__ */ jsx("div", { className: "h-4 w-20 bg-muted/60 animate-pulse rounded" }),
246
+ /* @__PURE__ */ jsx("div", { className: "h-5 w-full bg-muted animate-pulse rounded" }),
247
+ /* @__PURE__ */ jsx("div", { className: "h-6 w-16 bg-muted animate-pulse rounded" })
248
+ ] })
249
+ ] }, i)) })
250
+ ] }) });
251
+ }
252
+ if (state.error) {
253
+ return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsx("div", { className: "max-w-6xl mx-auto px-4", children: /* @__PURE__ */ jsxs("div", { className: "text-center py-12 border border-dashed border-border rounded-lg bg-muted/20", children: [
254
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Unable to load products" }),
255
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/70 mt-1", children: state.error })
256
+ ] }) }) });
257
+ }
258
+ const products = (state.data || []).slice(0, limit);
259
+ if (products.length === 0) {
260
+ return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsx("div", { className: "max-w-6xl mx-auto px-4", children: /* @__PURE__ */ jsx("div", { className: "text-center py-12 border border-dashed border-border rounded-lg bg-muted/10", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No products available" }) }) }) });
261
+ }
262
+ return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
263
+ (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
264
+ title && /* @__PURE__ */ jsx("h2", { className: "text-2xl md:text-3xl font-semibold tracking-tight", children: title }),
265
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-2", children: subtitle })
266
+ ] }),
267
+ /* @__PURE__ */ jsx("div", { className: `grid gap-6 grid-cols-1 ${gridCols}`, children: products.map((product) => /* @__PURE__ */ jsxs("div", { className: "border rounded-lg overflow-hidden group hover:shadow-md transition-shadow", children: [
268
+ /* @__PURE__ */ jsxs("div", { className: "aspect-square relative bg-muted overflow-hidden", children: [
269
+ product.image ? /* @__PURE__ */ jsx("img", { src: product.image, alt: product.name, className: "w-full h-full object-cover group-hover:scale-105 transition-transform duration-300" }) : /* @__PURE__ */ jsx("div", { className: "w-full h-full flex items-center justify-center text-muted-foreground/30", children: /* @__PURE__ */ jsx("svg", { className: "w-12 h-12", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 1.5, d: "M16 11V7a4 4 0 00-8 0v4M5 9h14l1 12H4L5 9z" }) }) }),
270
+ product.badge && /* @__PURE__ */ jsx("span", { className: "absolute top-3 left-3 text-xs px-2 py-1 rounded bg-primary text-primary-foreground", children: product.badge })
271
+ ] }),
272
+ /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-2", children: [
273
+ product.category && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground uppercase tracking-wide", children: product.category }),
274
+ /* @__PURE__ */ jsx("h3", { className: "font-medium text-sm line-clamp-2", children: product.name }),
275
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-1", children: [
276
+ showPrice && /* @__PURE__ */ jsxs("span", { className: "font-semibold", children: [
277
+ currency,
278
+ typeof product.price === "number" ? product.price.toFixed(2) : product.price
279
+ ] }),
280
+ showRating && product.rating && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
281
+ /* @__PURE__ */ jsx("svg", { className: "w-3.5 h-3.5 fill-yellow-400 text-yellow-400", viewBox: "0 0 24 24", children: /* @__PURE__ */ jsx("path", { d: "M12 2l3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z" }) }),
282
+ /* @__PURE__ */ jsx("span", { children: product.rating })
283
+ ] })
284
+ ] })
285
+ ] })
286
+ ] }, product.id)) })
287
+ ] }) });
288
+ }
189
289
  function FieldValue({ value, fieldType }) {
190
290
  if (value === null || value === void 0 || value === "") return null;
191
291
  const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
@@ -281,7 +381,8 @@ var BUILT_IN = {
281
381
  alert: (b) => /* @__PURE__ */ jsx(AlertBlock, { block: b }),
282
382
  divider: () => /* @__PURE__ */ jsx(DividerBlock, {}),
283
383
  spacer: (b) => /* @__PURE__ */ jsx(SpacerBlock, { block: b }),
284
- video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b })
384
+ video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b }),
385
+ "product-list": (b) => /* @__PURE__ */ jsx(ProductListBlock, { block: b })
285
386
  };
286
387
  function CMSBlocks({ blocks, pageType, className = "", custom = {} }) {
287
388
  if (!blocks?.length) return null;