@sprintup-cms/sdk 1.5.1 → 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.
@@ -186,52 +186,173 @@ 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
+ }
289
+ function FieldValue({ value, fieldType }) {
290
+ if (value === null || value === void 0 || value === "") return null;
291
+ const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
292
+ if (fieldType === "richtext" || isHtml(value)) {
293
+ return /* @__PURE__ */ jsx(
294
+ "div",
295
+ {
296
+ className: "prose prose-neutral dark:prose-invert max-w-none",
297
+ dangerouslySetInnerHTML: { __html: String(value) }
298
+ }
299
+ );
300
+ }
301
+ if (fieldType === "image") {
302
+ return /* @__PURE__ */ jsx("img", { src: String(value), alt: "", className: "rounded-lg border max-h-96 object-cover w-full" });
303
+ }
304
+ if (fieldType === "boolean") {
305
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: value ? "Yes" : "No" });
306
+ }
307
+ if (fieldType === "url") {
308
+ return /* @__PURE__ */ jsx("a", { href: String(value), className: "text-primary underline underline-offset-2 break-all", children: String(value) });
309
+ }
310
+ if (Array.isArray(value)) {
311
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: value.join(", ") });
312
+ }
313
+ return /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: String(value) });
314
+ }
315
+ function StructuredBlock({ block, pageType }) {
316
+ const nested = block.content ?? block.data ?? {};
317
+ if (pageType?.sections?.length) {
318
+ return /* @__PURE__ */ jsx("div", { className: "space-y-8", children: pageType.sections.map((section) => {
319
+ const sectionData = nested[section.name] ?? {};
320
+ const filledFields = section.fields.filter((f) => {
321
+ const v = sectionData[f.name];
322
+ return v !== void 0 && v !== null && v !== "";
323
+ });
324
+ if (filledFields.length === 0) return null;
325
+ return /* @__PURE__ */ jsx("section", { className: "space-y-4", children: filledFields.map((field) => {
326
+ const value = sectionData[field.name];
327
+ if (value === void 0 || value === null || value === "") return null;
328
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(FieldValue, { value, fieldType: field.fieldType }) }, field.id);
329
+ }) }, section.id);
330
+ }) });
331
+ }
332
+ const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
333
+ return /* @__PURE__ */ jsx("div", { className: "space-y-8", children: Object.entries(nested).map(([sectionName, fields]) => {
334
+ if (!fields || typeof fields !== "object" || Array.isArray(fields)) return null;
335
+ const entries = Object.entries(fields).filter(([, v]) => v !== "" && v !== null && v !== void 0);
336
+ if (entries.length === 0) return null;
337
+ return /* @__PURE__ */ jsx("section", { className: "space-y-4", children: entries.map(([fieldName, value]) => {
338
+ if (typeof value === "object" && !Array.isArray(value)) return null;
339
+ return /* @__PURE__ */ jsx("div", { children: isHtml(value) ? /* @__PURE__ */ jsx("div", { className: "prose prose-neutral dark:prose-invert max-w-none", dangerouslySetInnerHTML: { __html: String(value) } }) : Array.isArray(value) ? /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: value.join(", ") }) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: String(value) }) }, fieldName);
340
+ }) }, sectionName);
341
+ }) });
342
+ }
189
343
  function SectionBlock({ block, pageType }) {
190
344
  const d = getData(block);
191
345
  const section = pageType?.sections.find((s) => s.name === block.type);
192
346
  if (section) {
193
- const filledFields = section.fields.filter((f) => d[f.name] !== void 0 && d[f.name] !== "" && d[f.name] !== null);
347
+ const filledFields = section.fields.filter((f) => {
348
+ const v = d[f.name];
349
+ return v !== void 0 && v !== null && v !== "";
350
+ });
194
351
  if (filledFields.length === 0) return null;
195
- return /* @__PURE__ */ jsx("section", { className: "py-4 space-y-4 border-b border-border last:border-0", children: filledFields.map((field) => {
352
+ return /* @__PURE__ */ jsx("section", { className: "space-y-4", children: filledFields.map((field) => {
196
353
  const value = d[field.name];
197
- if (!value && value !== 0 && value !== false) return null;
198
- if (field.fieldType === "richtext") {
199
- return /* @__PURE__ */ jsxs("div", { children: [
200
- /* @__PURE__ */ jsx("p", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1", children: field.label }),
201
- /* @__PURE__ */ jsx("div", { className: "prose prose-neutral dark:prose-invert max-w-none text-sm", dangerouslySetInnerHTML: { __html: String(value) } })
202
- ] }, field.id);
203
- }
204
- if (field.fieldType === "image") {
205
- return /* @__PURE__ */ jsx("figure", { children: /* @__PURE__ */ jsx("img", { src: String(value), alt: field.label, className: "rounded-lg border max-h-96 object-cover" }) }, field.id);
206
- }
207
- if (field.fieldType === "boolean") {
208
- return /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
209
- /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
210
- field.label,
211
- ":"
212
- ] }),
213
- " ",
214
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: value ? "Yes" : "No" })
215
- ] }, field.id);
216
- }
217
- if (field.fieldType === "url") {
218
- return /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
219
- /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
220
- field.label,
221
- ":"
222
- ] }),
223
- " ",
224
- /* @__PURE__ */ jsx("a", { href: String(value), className: "text-primary underline underline-offset-2 break-all", children: String(value) })
225
- ] }, field.id);
226
- }
227
- return /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
228
- /* @__PURE__ */ jsxs("span", { className: "font-medium", children: [
229
- field.label,
230
- ":"
231
- ] }),
232
- " ",
233
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: String(value) })
234
- ] }, field.id);
354
+ if (value === void 0 || value === null || value === "") return null;
355
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(FieldValue, { value, fieldType: field.fieldType }) }, field.id);
235
356
  }) });
236
357
  }
237
358
  const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
@@ -239,21 +360,13 @@ function SectionBlock({ block, pageType }) {
239
360
  ([, v]) => v !== "" && v !== null && v !== void 0 && typeof v !== "object" && !Array.isArray(v)
240
361
  );
241
362
  if (entries.length === 0) return null;
242
- return /* @__PURE__ */ jsxs("section", { className: "py-4 space-y-2 border-b border-border last:border-0", children: [
243
- block.label && /* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm text-muted-foreground uppercase tracking-wide", children: block.label }),
244
- entries.map(
245
- ([key, value]) => isHtml(value) ? /* @__PURE__ */ jsx("div", { className: "prose prose-neutral dark:prose-invert max-w-none text-sm", dangerouslySetInnerHTML: { __html: String(value) } }, key) : /* @__PURE__ */ jsxs("p", { className: "text-sm", children: [
246
- /* @__PURE__ */ jsxs("span", { className: "font-medium capitalize", children: [
247
- key.replace(/_/g, " "),
248
- ":"
249
- ] }),
250
- " ",
251
- /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: String(value) })
252
- ] }, key)
253
- )
254
- ] });
363
+ return /* @__PURE__ */ jsx("section", { className: "space-y-2", children: entries.map(
364
+ ([key, value]) => isHtml(value) ? /* @__PURE__ */ jsx("div", { className: "prose prose-neutral dark:prose-invert max-w-none", dangerouslySetInnerHTML: { __html: String(value) } }, key) : /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: String(value) }, key)
365
+ ) });
255
366
  }
256
367
  var BUILT_IN = {
368
+ // Structured page type — content is nested { sectionName: { fieldName: value } }
369
+ "__structured__": (b, pt) => /* @__PURE__ */ jsx(StructuredBlock, { block: b, pageType: pt }),
257
370
  heading: (b) => /* @__PURE__ */ jsx(HeadingBlock, { block: b }),
258
371
  text: (b) => /* @__PURE__ */ jsx(TextBlock, { block: b }),
259
372
  richtext: (b) => /* @__PURE__ */ jsx(RichTextBlock, { block: b }),
@@ -268,7 +381,8 @@ var BUILT_IN = {
268
381
  alert: (b) => /* @__PURE__ */ jsx(AlertBlock, { block: b }),
269
382
  divider: () => /* @__PURE__ */ jsx(DividerBlock, {}),
270
383
  spacer: (b) => /* @__PURE__ */ jsx(SpacerBlock, { block: b }),
271
- video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b })
384
+ video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b }),
385
+ "product-list": (b) => /* @__PURE__ */ jsx(ProductListBlock, { block: b })
272
386
  };
273
387
  function CMSBlocks({ blocks, pageType, className = "", custom = {} }) {
274
388
  if (!blocks?.length) return null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react/blocks.tsx","../../src/react/preview-banner.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.js","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// ── Section block (structured page type sections) ─────────────────────────────\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 we have schema info, render labelled fields\n if (section) {\n const filledFields = section.fields.filter(f => d[f.name] !== undefined && d[f.name] !== '' && d[f.name] !== null)\n if (filledFields.length === 0) return null\n return (\n <section className=\"py-4 space-y-4 border-b border-border last:border-0\">\n {filledFields.map(field => {\n const value = d[field.name]\n if (!value && value !== 0 && value !== false) return null\n if (field.fieldType === 'richtext') {\n return (\n <div key={field.id}>\n <p className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1\">{field.label}</p>\n <div className=\"prose prose-neutral dark:prose-invert max-w-none text-sm\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n </div>\n )\n }\n if (field.fieldType === 'image') {\n return (\n <figure key={field.id}>\n <img src={String(value)} alt={field.label} className=\"rounded-lg border max-h-96 object-cover\" />\n </figure>\n )\n }\n if (field.fieldType === 'boolean') {\n return (\n <p key={field.id} className=\"text-sm\">\n <span className=\"font-medium\">{field.label}:</span>{' '}\n <span className=\"text-muted-foreground\">{value ? 'Yes' : 'No'}</span>\n </p>\n )\n }\n if (field.fieldType === 'url') {\n return (\n <p key={field.id} className=\"text-sm\">\n <span className=\"font-medium\">{field.label}:</span>{' '}\n <a href={String(value)} className=\"text-primary underline underline-offset-2 break-all\">{String(value)}</a>\n </p>\n )\n }\n return (\n <p key={field.id} className=\"text-sm\">\n <span className=\"font-medium\">{field.label}:</span>{' '}\n <span className=\"text-muted-foreground\">{String(value)}</span>\n </p>\n )\n })}\n </section>\n )\n }\n\n // No schema — render scalar values only, skip arrays and objects to avoid [object Object]\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=\"py-4 space-y-2 border-b border-border last:border-0\">\n {block.label && <h3 className=\"font-semibold text-sm text-muted-foreground uppercase tracking-wide\">{block.label}</h3>}\n {entries.map(([key, value]) =>\n isHtml(value) ? (\n <div key={key} className=\"prose prose-neutral dark:prose-invert max-w-none text-sm\" dangerouslySetInnerHTML={{ __html: String(value) }} />\n ) : (\n <p key={key} className=\"text-sm\">\n <span className=\"font-medium capitalize\">{key.replace(/_/g, ' ')}:</span>{' '}\n <span className=\"text-muted-foreground\">{String(value)}</span>\n </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 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":["jsxs","jsx"],"mappings":"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","file":"index.js","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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sprintup-cms/sdk",
3
- "version": "1.5.1",
3
+ "version": "1.7.0",
4
4
  "description": "Official SDK for SprintUp Forge CMS — typed API client, Next.js helpers, and React block renderer",
5
5
  "author": "SprintUp <hello@sprintup.io>",
6
6
  "license": "MIT",