@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.
- package/CHANGELOG.md +26 -0
- package/dist/next/index.cjs +102 -1
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.js +102 -1
- package/dist/next/index.js.map +1 -1
- package/dist/react/index.cjs +102 -1
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.js +102 -1
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/dist/next/index.js
CHANGED
|
@@ -454,6 +454,106 @@ function VideoBlock({ block }) {
|
|
|
454
454
|
const embedUrl = url.replace("youtube.com/watch?v=", "youtube.com/embed/").replace("youtu.be/", "youtube.com/embed/").replace("vimeo.com/", "player.vimeo.com/video/");
|
|
455
455
|
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" }) });
|
|
456
456
|
}
|
|
457
|
+
function normaliseProduct(raw) {
|
|
458
|
+
if (raw.id !== void 0 && raw.price !== void 0) return raw;
|
|
459
|
+
const firstPlan = Array.isArray(raw.plans) && raw.plans.length > 0 ? raw.plans[0] : null;
|
|
460
|
+
return {
|
|
461
|
+
id: raw._id ?? raw.id ?? String(Math.random()),
|
|
462
|
+
name: raw.name ?? "Unnamed",
|
|
463
|
+
description: raw.description,
|
|
464
|
+
price: firstPlan?.price ?? 0,
|
|
465
|
+
image: raw.image ?? raw.thumbnail ?? void 0,
|
|
466
|
+
rating: raw.rating ?? void 0,
|
|
467
|
+
category: raw.type ? raw.type.replace(/-/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()) : void 0,
|
|
468
|
+
badge: raw.duration ? `${raw.duration} months` : void 0
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
function ProductListBlock({ block }) {
|
|
472
|
+
const d = getData(block);
|
|
473
|
+
const { title, subtitle, endpoint, columns = 3, showPrice = true, showRating = true, limit = 6, currency = "$" } = d;
|
|
474
|
+
const cols = parseInt(String(columns), 10);
|
|
475
|
+
const [state, setState] = React.useState({
|
|
476
|
+
data: null,
|
|
477
|
+
loading: true,
|
|
478
|
+
error: null
|
|
479
|
+
});
|
|
480
|
+
React.useEffect(() => {
|
|
481
|
+
if (!endpoint) {
|
|
482
|
+
setState({ data: [], loading: false, error: null });
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
let cancelled = false;
|
|
486
|
+
async function fetchData() {
|
|
487
|
+
try {
|
|
488
|
+
const res = await fetch(endpoint);
|
|
489
|
+
if (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);
|
|
490
|
+
const json = await res.json();
|
|
491
|
+
if (cancelled) return;
|
|
492
|
+
const items = Array.isArray(json) ? json : json.data ?? json.products ?? [];
|
|
493
|
+
setState({ data: items.map(normaliseProduct), loading: false, error: null });
|
|
494
|
+
} catch (err) {
|
|
495
|
+
if (!cancelled) setState({ data: null, loading: false, error: err.message });
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
fetchData();
|
|
499
|
+
return () => {
|
|
500
|
+
cancelled = true;
|
|
501
|
+
};
|
|
502
|
+
}, [endpoint]);
|
|
503
|
+
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";
|
|
504
|
+
if (state.loading) {
|
|
505
|
+
return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
|
|
506
|
+
(title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
|
|
507
|
+
title && /* @__PURE__ */ jsx("div", { className: "h-8 w-64 bg-muted animate-pulse rounded mx-auto" }),
|
|
508
|
+
subtitle && /* @__PURE__ */ jsx("div", { className: "h-4 w-96 max-w-full bg-muted/60 animate-pulse rounded mx-auto mt-2" })
|
|
509
|
+
] }),
|
|
510
|
+
/* @__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: [
|
|
511
|
+
/* @__PURE__ */ jsx("div", { className: "aspect-square bg-muted animate-pulse" }),
|
|
512
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-3", children: [
|
|
513
|
+
/* @__PURE__ */ jsx("div", { className: "h-4 w-20 bg-muted/60 animate-pulse rounded" }),
|
|
514
|
+
/* @__PURE__ */ jsx("div", { className: "h-5 w-full bg-muted animate-pulse rounded" }),
|
|
515
|
+
/* @__PURE__ */ jsx("div", { className: "h-6 w-16 bg-muted animate-pulse rounded" })
|
|
516
|
+
] })
|
|
517
|
+
] }, i)) })
|
|
518
|
+
] }) });
|
|
519
|
+
}
|
|
520
|
+
if (state.error) {
|
|
521
|
+
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: [
|
|
522
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Unable to load products" }),
|
|
523
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground/70 mt-1", children: state.error })
|
|
524
|
+
] }) }) });
|
|
525
|
+
}
|
|
526
|
+
const products = (state.data || []).slice(0, limit);
|
|
527
|
+
if (products.length === 0) {
|
|
528
|
+
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" }) }) }) });
|
|
529
|
+
}
|
|
530
|
+
return /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsxs("div", { className: "max-w-6xl mx-auto px-4", children: [
|
|
531
|
+
(title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "text-center mb-8", children: [
|
|
532
|
+
title && /* @__PURE__ */ jsx("h2", { className: "text-2xl md:text-3xl font-semibold tracking-tight", children: title }),
|
|
533
|
+
subtitle && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mt-2", children: subtitle })
|
|
534
|
+
] }),
|
|
535
|
+
/* @__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: [
|
|
536
|
+
/* @__PURE__ */ jsxs("div", { className: "aspect-square relative bg-muted overflow-hidden", children: [
|
|
537
|
+
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" }) }) }),
|
|
538
|
+
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 })
|
|
539
|
+
] }),
|
|
540
|
+
/* @__PURE__ */ jsxs("div", { className: "p-4 space-y-2", children: [
|
|
541
|
+
product.category && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground uppercase tracking-wide", children: product.category }),
|
|
542
|
+
/* @__PURE__ */ jsx("h3", { className: "font-medium text-sm line-clamp-2", children: product.name }),
|
|
543
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between pt-1", children: [
|
|
544
|
+
showPrice && /* @__PURE__ */ jsxs("span", { className: "font-semibold", children: [
|
|
545
|
+
currency,
|
|
546
|
+
typeof product.price === "number" ? product.price.toFixed(2) : product.price
|
|
547
|
+
] }),
|
|
548
|
+
showRating && product.rating && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-sm text-muted-foreground", children: [
|
|
549
|
+
/* @__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" }) }),
|
|
550
|
+
/* @__PURE__ */ jsx("span", { children: product.rating })
|
|
551
|
+
] })
|
|
552
|
+
] })
|
|
553
|
+
] })
|
|
554
|
+
] }, product.id)) })
|
|
555
|
+
] }) });
|
|
556
|
+
}
|
|
457
557
|
function FieldValue({ value, fieldType }) {
|
|
458
558
|
if (value === null || value === void 0 || value === "") return null;
|
|
459
559
|
const isHtml = (v) => typeof v === "string" && /<[a-z][\s\S]*>/i.test(v);
|
|
@@ -549,7 +649,8 @@ var BUILT_IN = {
|
|
|
549
649
|
alert: (b) => /* @__PURE__ */ jsx(AlertBlock, { block: b }),
|
|
550
650
|
divider: () => /* @__PURE__ */ jsx(DividerBlock, {}),
|
|
551
651
|
spacer: (b) => /* @__PURE__ */ jsx(SpacerBlock, { block: b }),
|
|
552
|
-
video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b })
|
|
652
|
+
video: (b) => /* @__PURE__ */ jsx(VideoBlock, { block: b }),
|
|
653
|
+
"product-list": (b) => /* @__PURE__ */ jsx(ProductListBlock, { block: b })
|
|
553
654
|
};
|
|
554
655
|
function CMSBlocks({ blocks, pageType, className = "", custom = {} }) {
|
|
555
656
|
if (!blocks?.length) return null;
|
package/dist/next/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/next/revalidate.ts","../../src/next/preview-exit.ts","../../src/next/preview-entry.ts","../../src/client.ts","../../src/react/blocks.tsx","../../src/next/catch-all.tsx"],"names":["POST","GET","NextResponse","draftMode","cookies","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { revalidatePath, revalidateTag } from 'next/cache'\n\nexport interface RevalidateHandlerOptions {\n /**\n * Secret that must match the `x-cms-webhook-secret` header.\n * Defaults to process.env.CMS_WEBHOOK_SECRET\n */\n secret?: string\n /**\n * Called after successful revalidation. Use to add custom logic.\n */\n onRevalidate?: (payload: RevalidatePayload) => void | Promise<void>\n}\n\nexport interface RevalidatePayload {\n /** Sent by the CMS webhook (CMSWebhookPayload shape) */\n appId?: string\n event?: 'published' | 'deleted' | 'archived' | 'content.publish' | 'content.unpublish' | 'structure.update'\n /** Cache tag sent by the CMS (e.g. \"content-about\", \"content-list\", \"site-structure-myapp\") */\n tag?: string\n /** Additional data from the CMS webhook */\n data?: Record<string, unknown>\n /** Legacy field — accepted for backwards compatibility */\n slug?: string\n timestamp?: string\n}\n\n/**\n * Factory — create a POST handler with custom options.\n *\n * @example\n * // app/api/cms-revalidate/route.ts\n * import { createRevalidateHandler } from '@sprintup-cms/sdk/next'\n * export const POST = createRevalidateHandler({ secret: process.env.CMS_WEBHOOK_SECRET })\n */\nexport function createRevalidateHandler(options?: RevalidateHandlerOptions) {\n return async function POST(request: NextRequest): Promise<NextResponse> {\n try {\n const secret = options?.secret ?? process.env.CMS_WEBHOOK_SECRET\n const incomingSecret = request.headers.get('x-cms-webhook-secret')\n\n if (secret && incomingSecret !== secret) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const body: RevalidatePayload = await request.json()\n const { slug, tag, appId, data } = body\n\n // Must have at least a tag or a slug to know what to revalidate\n if (!tag && !slug) {\n return NextResponse.json({ error: 'Missing tag or slug in payload' }, { status: 400 })\n }\n\n // Revalidate by the tag sent directly from the CMS (primary path)\n if (tag) {\n revalidateTag(tag)\n }\n\n // Derive slug from data.slug or the tag itself (e.g. \"content-about\" → \"about\")\n const resolvedSlug = slug ?? (data?.slug as string) ?? tag?.replace(/^content-/, '')\n\n if (resolvedSlug) {\n revalidatePath(`/${resolvedSlug}`)\n revalidateTag(`cms-page-${resolvedSlug}`)\n }\n\n // Always revalidate the content list (sitemap, index pages)\n revalidateTag('cms-pages')\n\n // Revalidate the layout for structure changes or publish events so\n // nav/footer pick up the new site structure\n const isStructure = tag?.startsWith('site-structure') || body.event === 'structure.update'\n const isPublish = body.event === 'published' || body.event === 'content.publish'\n if (isStructure || isPublish) {\n revalidatePath('/', 'layout')\n }\n\n await options?.onRevalidate?.(body)\n\n return NextResponse.json({\n revalidated: true,\n tag,\n slug: resolvedSlug,\n event: body.event,\n timestamp: new Date().toISOString(),\n })\n } catch (err: any) {\n console.error('[sprintup-cms] revalidate error:', err)\n return NextResponse.json({ error: err.message }, { status: 500 })\n }\n }\n}\n\n/**\n * Default POST handler — zero-config, reads CMS_WEBHOOK_SECRET from env.\n *\n * @example\n * // app/api/cms-revalidate/route.ts\n * export { POST } from '@sprintup-cms/sdk/next'\n */\nexport const POST = createRevalidateHandler()\n","import { NextResponse } from 'next/server'\nimport { cookies, draftMode } from 'next/headers'\n\nexport interface PreviewExitOptions {\n /** Where to redirect after exiting preview. Defaults to \"/\" */\n redirectTo?: string\n}\n\n/**\n * Factory — create a GET handler for exiting preview/draft mode.\n *\n * @example\n * // app/api/cms-preview/exit/route.ts\n * import { createPreviewExitHandler } from '@sprintup-cms/sdk/next'\n * export const GET = createPreviewExitHandler({ redirectTo: '/' })\n */\nexport function createPreviewExitHandler(options?: PreviewExitOptions) {\n return async function GET(request: Request): Promise<NextResponse> {\n const draft = await draftMode()\n draft.disable()\n\n const cookieStore = await cookies()\n cookieStore.delete('cms_preview_token')\n cookieStore.delete('cms_preview_content_id')\n\n const redirectTo = options?.redirectTo ?? '/'\n const url = new URL(request.url)\n return NextResponse.redirect(new URL(redirectTo, url.origin))\n }\n}\n\n/**\n * Default GET handler.\n *\n * @example\n * // app/api/cms-preview/exit/route.ts\n * export { GET } from '@sprintup-cms/sdk/next'\n */\nexport const GET = createPreviewExitHandler()\n","import { NextRequest, NextResponse } from 'next/server'\nimport { draftMode } from 'next/headers'\n\n/**\n * GET /api/cms-preview?token=xxx\n *\n * Validates the preview token issued by the CMS, enables Next.js draftMode(),\n * and redirects to the page slug embedded in the token.\n *\n * The token is a base64-encoded JSON payload: { contentId, appId, slug, exp }\n * Signature validation is handled by checking exp — the CMS signs tokens with\n * a short TTL (default 1 hour) so expired tokens are silently rejected.\n *\n * @example\n * // app/api/cms-preview/route.ts\n * export { previewEntryGET as GET } from '@sprintup-cms/sdk/next'\n */\nexport async function previewEntryGET(request: NextRequest): Promise<NextResponse> {\n // Called by: app/api/cms-preview/route.ts → export { previewEntryGET as GET }\n // Flow: CMS editor opens /api/cms-preview?token=xxx → draftMode enabled → redirect to /{slug}\n const { searchParams, origin } = new URL(request.url)\n const token = searchParams.get('token')\n\n if (!token) {\n return NextResponse.json({ error: 'Missing token' }, { status: 400 })\n }\n\n // The CMS issues tokens as: base64url(JSON payload) + \".\" + base64url(HMAC-SHA256 signature)\n // This is NOT a JWT — it has two segments, not three.\n let payload: { contentId?: string; appId?: string; slug?: string; exp?: number }\n try {\n const [payloadB64] = token.split('.')\n if (!payloadB64) throw new Error('invalid token format')\n const json = Buffer.from(payloadB64.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8')\n payload = JSON.parse(json)\n } catch {\n return NextResponse.json({ error: 'Invalid token' }, { status: 400 })\n }\n\n // Reject expired tokens\n if (payload.exp && Date.now() > payload.exp) {\n return NextResponse.json({ error: 'Preview token has expired' }, { status: 401 })\n }\n\n const slug = payload.slug ?? ''\n\n // Enable Next.js draft mode — CMSCatchAllPage checks draftMode().isEnabled\n const draft = await draftMode()\n draft.enable()\n\n // Store the raw token in a cookie so CMSCatchAllPage can pass it to getPreviewPage()\n const response = NextResponse.redirect(new URL(`/${slug}`, origin))\n response.cookies.set('cms_preview_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 15, // 15 minutes\n path: '/',\n })\n return response\n}\n","/**\n * @sprintup-cms/sdk — Core Client\n *\n * Zero-dependency, framework-agnostic typed API client for SprintUp Forge CMS.\n *\n * @example\n * import { cmsClient } from '@sprintup-cms/sdk'\n * const page = await cmsClient.getPage('about')\n *\n * @example Custom instance\n * import { createCMSClient } from '@sprintup-cms/sdk'\n * const cms = createCMSClient({ baseUrl: '...', apiKey: '...', appId: '...' })\n */\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface CMSBlock {\n id: string\n type: string\n label?: string\n locked?: boolean\n data?: Record<string, any>\n /** Legacy field — blocks created before v1.1 used `content` instead of `data` */\n content?: Record<string, any>\n order?: number\n}\n\nexport interface CMSPage {\n _id?: string\n slug: string\n title: string\n description?: string\n pageType?: string\n pageTypeId?: string\n variant?: string\n status: 'draft' | 'published' | 'archived'\n visibility?: 'public' | 'private' | 'password'\n blocks: CMSBlock[]\n publishedAt?: string\n updatedAt?: string\n seo?: {\n title?: string\n description?: string\n keywords?: string[]\n ogImage?: string\n noIndex?: boolean\n }\n}\n\nexport interface CMSPageTypeField {\n id: string\n name: string\n label: string\n fieldType:\n | 'text' | 'textarea' | 'richtext' | 'image' | 'url'\n | 'number' | 'boolean' | 'date' | 'select' | 'relation'\n | 'email' | 'phone' | 'slug' | 'color' | 'embed'\n | 'multi-select' | 'repeater' | 'file' | 'code'\n required?: boolean\n options?: string[]\n description?: string\n maxLength?: number\n multiple?: boolean\n targetPageTypeKey?: string\n}\n\nexport interface CMSPageTypeSection {\n id: string\n name: string\n label: string\n order: number\n locked?: boolean\n fields: CMSPageTypeField[]\n}\n\nexport interface CMSPageTypeVariant {\n key: string\n label: string\n description?: string\n visibleSections?: string[]\n}\n\nexport interface CMSPageType {\n _id: string\n name: string\n key: string\n description?: string\n icon?: string\n /** Used by page-type-renderers to pick a specialised React component */\n rendererKey?: string\n /** Active variant key (set per-page) */\n variant?: string\n category: 'singleton' | 'collection' | 'global'\n contentCategory: 'singleton' | 'collection' | 'global'\n allowedRoles?: string[]\n variants: CMSPageTypeVariant[]\n sections: CMSPageTypeSection[]\n}\n\n// ── Sitemap ────────────────────────────────────────────────────────────────────\n\nexport interface CMSSitemapUrl {\n loc: string\n lastmod?: string\n changefreq?: string\n priority?: number\n title?: string\n}\n\nexport interface CMSSitemapResponse {\n enabled: boolean\n urls: CMSSitemapUrl[]\n config?: {\n defaultChangeFreq?: string\n defaultPriority?: number\n }\n}\n\n// ── Status ─────────────────────────────────────────────────────────────────────\n\nexport interface CMSStatusResponse {\n appId: string\n totalPages: number\n publishedPages: number\n connected: boolean\n pages: Array<{\n slug: string\n title: string\n pageType?: string\n group?: string\n }>\n}\n\n// ── Site Structure ─────────────────────────────────────────────────────────────\n\nexport type CMSMenuItemType = 'page' | 'url' | 'dynamic'\n\nexport interface CMSMenuItem {\n id: string\n type: CMSMenuItemType\n label: string\n contentId?: string\n url?: string\n /** Resolved href — ready to pass to <a href> or <Link href>. Never null, falls back to \"#\". */\n href: string\n locked: boolean\n openInNewTab: boolean\n children: CMSMenuItem[]\n page?: {\n title?: string\n slug?: string\n seoTitle?: string\n seoDescription?: string\n }\n}\n\nexport interface CMSPageTreeNode {\n id: string\n contentId: string\n parentId: string | null\n order: number\n locked: boolean\n visible?: boolean\n page?: {\n title?: string\n slug?: string\n seoTitle?: string\n seoDescription?: string\n }\n}\n\nexport interface CMSFooterGroup {\n id: string\n heading: string\n headingUrl?: string\n locked: boolean\n links: CMSMenuItem[]\n}\n\nexport interface CMSSiteStructure {\n appId: string\n pageTree: CMSPageTreeNode[]\n menus: {\n header: CMSMenuItem[]\n footer: CMSFooterGroup[]\n footerBottom: CMSMenuItem[]\n sidebar: CMSMenuItem[]\n [slot: string]: CMSMenuItem[] | CMSFooterGroup[]\n }\n updatedAt?: string\n}\n\n// ── Pagination & Responses ─────────────────────────────────────────────────────\n\n// v1 route returns { data, count } — flat, no nested meta object\ninterface CMSListResponse {\n data: CMSPage[]\n count: number\n appId?: string\n}\n\ninterface CMSSingleResponse {\n data: CMSPage\n}\n\n// ── Client Options ─────────────────────────────────────────────────────────────\n\nexport interface CMSClientOptions {\n /** Base URL of your Forge CMS instance, e.g. https://cms.yourschool.io */\n baseUrl?: string\n /** API key generated in CMS Admin → API Keys. Server-side only. */\n apiKey?: string\n /** App ID from CMS Admin → Apps, e.g. \"school-website\" */\n appId?: string\n}\n\nexport interface CMSGetPagesOptions {\n type?: string\n group?: string\n page?: number\n perPage?: number\n status?: 'published' | 'draft' | 'archived'\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createCMSClient(options?: CMSClientOptions) {\n /**\n * Resolve config lazily at request time — NOT at module/build time.\n * This prevents static prerendering crashes when env vars are absent during build.\n */\n function cfg() {\n return {\n baseUrl: (options?.baseUrl ?? process.env.NEXT_PUBLIC_CMS_URL ?? process.env.CMS_BASE_URL ?? '').replace(/\\/$/, ''),\n apiKey: options?.apiKey ?? process.env.CMS_API_KEY ?? '',\n appId: options?.appId ?? process.env.CMS_APP_ID ?? '',\n }\n }\n\n function headers() {\n return { 'X-CMS-API-Key': cfg().apiKey, 'Content-Type': 'application/json' }\n }\n\n // ── Pages ──────────────────────────────────────────────────────────────────\n\n async function getPages(params?: CMSGetPagesOptions): Promise<CMSPage[]> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) {\n console.warn('[sprintup-cms] Missing CMS_BASE_URL / CMS_API_KEY / CMS_APP_ID — returning []')\n return []\n }\n try {\n const qs = new URLSearchParams()\n if (params?.type) qs.set('type', params.type)\n if (params?.group) qs.set('group', params.group)\n if (params?.page) qs.set('page', String(params.page))\n if (params?.perPage) qs.set('perPage', String(params.perPage))\n const url = `${baseUrl}/api/v1/${appId}/pages${qs.size ? `?${qs}` : ''}`\n const res = await fetch(url, {\n headers: headers(),\n next: { revalidate: 60, tags: [`cms-pages-${appId}`] },\n } as RequestInit)\n if (!res.ok) { console.error(`[sprintup-cms] getPages (${res.status})`); return [] }\n const json: CMSListResponse = await res.json()\n return json.data ?? []\n } catch (err) {\n console.error('[sprintup-cms] getPages error:', err)\n return []\n }\n }\n\n async function getPage(slug: string): Promise<CMSPage | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) {\n console.warn('[sprintup-cms] Missing config — returning null')\n return null\n }\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/pages/${slug}`, {\n headers: headers(),\n next: { revalidate: 60, tags: [`cms-page-${slug}`, `cms-pages-${appId}`] },\n } as RequestInit)\n if (res.status === 404) return null\n if (!res.ok) { console.error(`[sprintup-cms] getPage \"${slug}\" (${res.status})`); return null }\n const json: CMSSingleResponse = await res.json()\n return json.data ?? null\n } catch (err) {\n console.error(`[sprintup-cms] getPage \"${slug}\" error:`, err)\n return null\n }\n }\n\n async function getBlogPosts(): Promise<CMSPage[]> {\n return getPages({ type: 'blog-post' })\n }\n\n async function getEvents(): Promise<CMSPage[]> {\n return getPages({ type: 'event-page' })\n }\n\n async function getAnnouncements(): Promise<CMSPage[]> {\n return getPages({ type: 'announcement-page' })\n }\n\n // ── Preview ────────────────────────────────────────────────────────────────\n\n async function getPreviewPage(token: string): Promise<CMSPage | null> {\n const { baseUrl, appId } = cfg()\n if (!baseUrl || !appId) {\n console.warn('[sprintup-cms] getPreviewPage: Missing baseUrl or appId — returning null')\n return null\n }\n try {\n const url = `${baseUrl}/api/v1/${appId}/preview?token=${encodeURIComponent(token)}`\n const res = await fetch(url, { cache: 'no-store' })\n if (!res.ok) {\n const errorText = await res.text().catch(() => '')\n console.error(`[sprintup-cms] getPreviewPage failed (${res.status}): ${errorText}`)\n return null\n }\n const json = await res.json()\n return json.data ?? null\n } catch (err) {\n console.error('[sprintup-cms] getPreviewPage error:', err)\n return null\n }\n }\n\n async function getPageWithPreview(slug: string, previewToken?: string | null): Promise<CMSPage | null> {\n if (previewToken) {\n const preview = await getPreviewPage(previewToken)\n if (preview?.slug === slug) return preview\n }\n return getPage(slug)\n }\n\n // ── Page Types ─────────────────────────────────────────────────────────────\n\n async function getPageType(pageTypeId: string): Promise<CMSPageType | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId || !pageTypeId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/page-types/${pageTypeId}`, {\n headers: headers(),\n next: { revalidate: 3600, tags: [`cms-page-type-${pageTypeId}`] },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch {\n return null\n }\n }\n\n // ── Site Structure ─────────────────────────────────────────────────────────\n\n async function getSiteStructure(): Promise<CMSSiteStructure | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/site-structure`, {\n headers: headers(),\n next: {\n revalidate: 300,\n tags: [`site-structure-${appId}`],\n },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch {\n return null\n }\n }\n\n /**\n * GET /api/v1/{appId}/sitemap\n * Fetch sitemap data for all published pages (priority, changefreq, lastmod).\n *\n * @example app/sitemap.ts\n * import type { MetadataRoute } from 'next'\n * import { cmsClient } from '@sprintup-cms/sdk'\n *\n * export default async function sitemap(): Promise<MetadataRoute.Sitemap> {\n * const data = await cmsClient.getSitemap()\n * if (!data?.enabled) return []\n * return data.urls.map(url => ({\n * url: `${process.env.NEXT_PUBLIC_SITE_URL}${url.loc}`,\n * lastModified: url.lastmod,\n * changeFrequency: url.changefreq as MetadataRoute.Sitemap[0]['changeFrequency'],\n * priority: url.priority,\n * }))\n * }\n */\n async function getSitemap(): Promise<CMSSitemapResponse | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/sitemap`, {\n headers: headers(),\n next: { revalidate: 3600 },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch { return null }\n }\n\n /**\n * GET /api/v1/{appId}/status\n * Verify connectivity and retrieve page counts. Never cached — always fresh.\n * Useful for debugging API key setup.\n */\n async function getStatus(): Promise<CMSStatusResponse | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/status`, {\n headers: headers(),\n cache: 'no-store',\n } as RequestInit)\n if (!res.ok) return null\n return await res.json()\n } catch { return null }\n }\n\n return {\n getPages,\n getPage,\n getBlogPosts,\n getEvents,\n getAnnouncements,\n getPreviewPage,\n getPageWithPreview,\n getPageType,\n getSiteStructure,\n getSitemap,\n getStatus,\n }\n}\n\n// ── Default singleton ─────────────────────────────────────────────────────────\n\n/** Pre-configured singleton. Reads env vars lazily at request time. */\nexport const cmsClient = createCMSClient()\n","'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","import React from 'react'\nimport { notFound } from 'next/navigation'\nimport { cookies, draftMode } from 'next/headers'\nimport type { Metadata } from 'next'\nimport { createCMSClient } from '../client'\nimport { CMSBlocks } from '../react/blocks'\n\nexport interface CMSCatchAllParams {\n slug: string[]\n}\n\nconst client = createCMSClient()\n\n// ── Metadata ──────────────────────────────────────────────────────────────────\n\nexport async function generateMetadata(\n { params }: { params: Promise<CMSCatchAllParams> }\n): Promise<Metadata> {\n const { slug } = await params\n const page = await client.getPage(slug.join('/'))\n if (!page) return { title: 'Not Found' }\n return {\n title: page.seo?.title || page.title,\n description: page.seo?.description || '',\n keywords: page.seo?.keywords?.join(', '),\n robots: page.seo?.noIndex ? 'noindex,nofollow' : undefined,\n openGraph: {\n title: page.seo?.title || page.title,\n description: page.seo?.description,\n images: page.seo?.ogImage ? [page.seo.ogImage] : undefined,\n },\n }\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport default async function CMSCatchAllPage(\n { params }: { params: Promise<CMSCatchAllParams> }\n) {\n const { slug } = await params\n const slugStr = slug.join('/')\n const draft = await draftMode()\n const cookieStore = await cookies()\n\n let page = null\n let isPreview = false\n\n if (draft.isEnabled) {\n const token = cookieStore.get('cms_preview_token')?.value\n if (token) {\n page = await client.getPreviewPage(token)\n isPreview = !!page\n }\n if (!page) page = await client.getPage(slugStr)\n } else {\n page = await client.getPage(slugStr)\n }\n\n if (!page) notFound()\n\n let pageType = null\n if (page.pageTypeId) {\n pageType = await client.getPageType(page.pageTypeId)\n }\n\n return (\n <div className=\"min-h-screen bg-background\">\n {isPreview && (\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 <span>Draft Preview</span>\n <span className=\"opacity-60 mx-1\">·</span>\n <span className=\"opacity-75 capitalize\">{page.status}</span>\n <span className=\"opacity-60 mx-1\">·</span>\n <span className=\"opacity-75 font-normal\">/{page.slug}</span>\n </div>\n <a\n href=\"/api/cms-preview/exit\"\n className=\"px-3 py-1 rounded bg-white/20 hover:bg-white/30 transition-colors text-xs\"\n >\n Exit Preview\n </a>\n </div>\n )}\n\n <article className=\"max-w-5xl mx-auto px-6 py-12\">\n {page.blocks?.length > 0 ? (\n <CMSBlocks blocks={page.blocks} pageType={pageType} />\n ) : (\n <div className=\"flex flex-col items-center justify-center py-24 text-muted-foreground border-2 border-dashed border-border rounded-xl\">\n <p className=\"text-sm\">No content added yet.</p>\n {isPreview && (\n <p className=\"text-xs mt-1 opacity-60\">Add blocks in the CMS editor to see them here.</p>\n )}\n </div>\n )}\n </article>\n </div>\n )\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/next/revalidate.ts","../../src/next/preview-exit.ts","../../src/next/preview-entry.ts","../../src/client.ts","../../src/react/blocks.tsx","../../src/next/catch-all.tsx"],"names":["POST","GET","NextResponse","draftMode","cookies","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { NextRequest, NextResponse } from 'next/server'\nimport { revalidatePath, revalidateTag } from 'next/cache'\n\nexport interface RevalidateHandlerOptions {\n /**\n * Secret that must match the `x-cms-webhook-secret` header.\n * Defaults to process.env.CMS_WEBHOOK_SECRET\n */\n secret?: string\n /**\n * Called after successful revalidation. Use to add custom logic.\n */\n onRevalidate?: (payload: RevalidatePayload) => void | Promise<void>\n}\n\nexport interface RevalidatePayload {\n /** Sent by the CMS webhook (CMSWebhookPayload shape) */\n appId?: string\n event?: 'published' | 'deleted' | 'archived' | 'content.publish' | 'content.unpublish' | 'structure.update'\n /** Cache tag sent by the CMS (e.g. \"content-about\", \"content-list\", \"site-structure-myapp\") */\n tag?: string\n /** Additional data from the CMS webhook */\n data?: Record<string, unknown>\n /** Legacy field — accepted for backwards compatibility */\n slug?: string\n timestamp?: string\n}\n\n/**\n * Factory — create a POST handler with custom options.\n *\n * @example\n * // app/api/cms-revalidate/route.ts\n * import { createRevalidateHandler } from '@sprintup-cms/sdk/next'\n * export const POST = createRevalidateHandler({ secret: process.env.CMS_WEBHOOK_SECRET })\n */\nexport function createRevalidateHandler(options?: RevalidateHandlerOptions) {\n return async function POST(request: NextRequest): Promise<NextResponse> {\n try {\n const secret = options?.secret ?? process.env.CMS_WEBHOOK_SECRET\n const incomingSecret = request.headers.get('x-cms-webhook-secret')\n\n if (secret && incomingSecret !== secret) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n\n const body: RevalidatePayload = await request.json()\n const { slug, tag, appId, data } = body\n\n // Must have at least a tag or a slug to know what to revalidate\n if (!tag && !slug) {\n return NextResponse.json({ error: 'Missing tag or slug in payload' }, { status: 400 })\n }\n\n // Revalidate by the tag sent directly from the CMS (primary path)\n if (tag) {\n revalidateTag(tag)\n }\n\n // Derive slug from data.slug or the tag itself (e.g. \"content-about\" → \"about\")\n const resolvedSlug = slug ?? (data?.slug as string) ?? tag?.replace(/^content-/, '')\n\n if (resolvedSlug) {\n revalidatePath(`/${resolvedSlug}`)\n revalidateTag(`cms-page-${resolvedSlug}`)\n }\n\n // Always revalidate the content list (sitemap, index pages)\n revalidateTag('cms-pages')\n\n // Revalidate the layout for structure changes or publish events so\n // nav/footer pick up the new site structure\n const isStructure = tag?.startsWith('site-structure') || body.event === 'structure.update'\n const isPublish = body.event === 'published' || body.event === 'content.publish'\n if (isStructure || isPublish) {\n revalidatePath('/', 'layout')\n }\n\n await options?.onRevalidate?.(body)\n\n return NextResponse.json({\n revalidated: true,\n tag,\n slug: resolvedSlug,\n event: body.event,\n timestamp: new Date().toISOString(),\n })\n } catch (err: any) {\n console.error('[sprintup-cms] revalidate error:', err)\n return NextResponse.json({ error: err.message }, { status: 500 })\n }\n }\n}\n\n/**\n * Default POST handler — zero-config, reads CMS_WEBHOOK_SECRET from env.\n *\n * @example\n * // app/api/cms-revalidate/route.ts\n * export { POST } from '@sprintup-cms/sdk/next'\n */\nexport const POST = createRevalidateHandler()\n","import { NextResponse } from 'next/server'\nimport { cookies, draftMode } from 'next/headers'\n\nexport interface PreviewExitOptions {\n /** Where to redirect after exiting preview. Defaults to \"/\" */\n redirectTo?: string\n}\n\n/**\n * Factory — create a GET handler for exiting preview/draft mode.\n *\n * @example\n * // app/api/cms-preview/exit/route.ts\n * import { createPreviewExitHandler } from '@sprintup-cms/sdk/next'\n * export const GET = createPreviewExitHandler({ redirectTo: '/' })\n */\nexport function createPreviewExitHandler(options?: PreviewExitOptions) {\n return async function GET(request: Request): Promise<NextResponse> {\n const draft = await draftMode()\n draft.disable()\n\n const cookieStore = await cookies()\n cookieStore.delete('cms_preview_token')\n cookieStore.delete('cms_preview_content_id')\n\n const redirectTo = options?.redirectTo ?? '/'\n const url = new URL(request.url)\n return NextResponse.redirect(new URL(redirectTo, url.origin))\n }\n}\n\n/**\n * Default GET handler.\n *\n * @example\n * // app/api/cms-preview/exit/route.ts\n * export { GET } from '@sprintup-cms/sdk/next'\n */\nexport const GET = createPreviewExitHandler()\n","import { NextRequest, NextResponse } from 'next/server'\nimport { draftMode } from 'next/headers'\n\n/**\n * GET /api/cms-preview?token=xxx\n *\n * Validates the preview token issued by the CMS, enables Next.js draftMode(),\n * and redirects to the page slug embedded in the token.\n *\n * The token is a base64-encoded JSON payload: { contentId, appId, slug, exp }\n * Signature validation is handled by checking exp — the CMS signs tokens with\n * a short TTL (default 1 hour) so expired tokens are silently rejected.\n *\n * @example\n * // app/api/cms-preview/route.ts\n * export { previewEntryGET as GET } from '@sprintup-cms/sdk/next'\n */\nexport async function previewEntryGET(request: NextRequest): Promise<NextResponse> {\n // Called by: app/api/cms-preview/route.ts → export { previewEntryGET as GET }\n // Flow: CMS editor opens /api/cms-preview?token=xxx → draftMode enabled → redirect to /{slug}\n const { searchParams, origin } = new URL(request.url)\n const token = searchParams.get('token')\n\n if (!token) {\n return NextResponse.json({ error: 'Missing token' }, { status: 400 })\n }\n\n // The CMS issues tokens as: base64url(JSON payload) + \".\" + base64url(HMAC-SHA256 signature)\n // This is NOT a JWT — it has two segments, not three.\n let payload: { contentId?: string; appId?: string; slug?: string; exp?: number }\n try {\n const [payloadB64] = token.split('.')\n if (!payloadB64) throw new Error('invalid token format')\n const json = Buffer.from(payloadB64.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8')\n payload = JSON.parse(json)\n } catch {\n return NextResponse.json({ error: 'Invalid token' }, { status: 400 })\n }\n\n // Reject expired tokens\n if (payload.exp && Date.now() > payload.exp) {\n return NextResponse.json({ error: 'Preview token has expired' }, { status: 401 })\n }\n\n const slug = payload.slug ?? ''\n\n // Enable Next.js draft mode — CMSCatchAllPage checks draftMode().isEnabled\n const draft = await draftMode()\n draft.enable()\n\n // Store the raw token in a cookie so CMSCatchAllPage can pass it to getPreviewPage()\n const response = NextResponse.redirect(new URL(`/${slug}`, origin))\n response.cookies.set('cms_preview_token', token, {\n httpOnly: true,\n secure: process.env.NODE_ENV === 'production',\n sameSite: 'lax',\n maxAge: 60 * 15, // 15 minutes\n path: '/',\n })\n return response\n}\n","/**\n * @sprintup-cms/sdk — Core Client\n *\n * Zero-dependency, framework-agnostic typed API client for SprintUp Forge CMS.\n *\n * @example\n * import { cmsClient } from '@sprintup-cms/sdk'\n * const page = await cmsClient.getPage('about')\n *\n * @example Custom instance\n * import { createCMSClient } from '@sprintup-cms/sdk'\n * const cms = createCMSClient({ baseUrl: '...', apiKey: '...', appId: '...' })\n */\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface CMSBlock {\n id: string\n type: string\n label?: string\n locked?: boolean\n data?: Record<string, any>\n /** Legacy field — blocks created before v1.1 used `content` instead of `data` */\n content?: Record<string, any>\n order?: number\n}\n\nexport interface CMSPage {\n _id?: string\n slug: string\n title: string\n description?: string\n pageType?: string\n pageTypeId?: string\n variant?: string\n status: 'draft' | 'published' | 'archived'\n visibility?: 'public' | 'private' | 'password'\n blocks: CMSBlock[]\n publishedAt?: string\n updatedAt?: string\n seo?: {\n title?: string\n description?: string\n keywords?: string[]\n ogImage?: string\n noIndex?: boolean\n }\n}\n\nexport interface CMSPageTypeField {\n id: string\n name: string\n label: string\n fieldType:\n | 'text' | 'textarea' | 'richtext' | 'image' | 'url'\n | 'number' | 'boolean' | 'date' | 'select' | 'relation'\n | 'email' | 'phone' | 'slug' | 'color' | 'embed'\n | 'multi-select' | 'repeater' | 'file' | 'code'\n required?: boolean\n options?: string[]\n description?: string\n maxLength?: number\n multiple?: boolean\n targetPageTypeKey?: string\n}\n\nexport interface CMSPageTypeSection {\n id: string\n name: string\n label: string\n order: number\n locked?: boolean\n fields: CMSPageTypeField[]\n}\n\nexport interface CMSPageTypeVariant {\n key: string\n label: string\n description?: string\n visibleSections?: string[]\n}\n\nexport interface CMSPageType {\n _id: string\n name: string\n key: string\n description?: string\n icon?: string\n /** Used by page-type-renderers to pick a specialised React component */\n rendererKey?: string\n /** Active variant key (set per-page) */\n variant?: string\n category: 'singleton' | 'collection' | 'global'\n contentCategory: 'singleton' | 'collection' | 'global'\n allowedRoles?: string[]\n variants: CMSPageTypeVariant[]\n sections: CMSPageTypeSection[]\n}\n\n// ── Sitemap ────────────────────────────────────────────────────────────────────\n\nexport interface CMSSitemapUrl {\n loc: string\n lastmod?: string\n changefreq?: string\n priority?: number\n title?: string\n}\n\nexport interface CMSSitemapResponse {\n enabled: boolean\n urls: CMSSitemapUrl[]\n config?: {\n defaultChangeFreq?: string\n defaultPriority?: number\n }\n}\n\n// ── Status ─────────────────────────────────────────────────────────────────────\n\nexport interface CMSStatusResponse {\n appId: string\n totalPages: number\n publishedPages: number\n connected: boolean\n pages: Array<{\n slug: string\n title: string\n pageType?: string\n group?: string\n }>\n}\n\n// ── Site Structure ─────────────────────────────────────────────────────────────\n\nexport type CMSMenuItemType = 'page' | 'url' | 'dynamic'\n\nexport interface CMSMenuItem {\n id: string\n type: CMSMenuItemType\n label: string\n contentId?: string\n url?: string\n /** Resolved href — ready to pass to <a href> or <Link href>. Never null, falls back to \"#\". */\n href: string\n locked: boolean\n openInNewTab: boolean\n children: CMSMenuItem[]\n page?: {\n title?: string\n slug?: string\n seoTitle?: string\n seoDescription?: string\n }\n}\n\nexport interface CMSPageTreeNode {\n id: string\n contentId: string\n parentId: string | null\n order: number\n locked: boolean\n visible?: boolean\n page?: {\n title?: string\n slug?: string\n seoTitle?: string\n seoDescription?: string\n }\n}\n\nexport interface CMSFooterGroup {\n id: string\n heading: string\n headingUrl?: string\n locked: boolean\n links: CMSMenuItem[]\n}\n\nexport interface CMSSiteStructure {\n appId: string\n pageTree: CMSPageTreeNode[]\n menus: {\n header: CMSMenuItem[]\n footer: CMSFooterGroup[]\n footerBottom: CMSMenuItem[]\n sidebar: CMSMenuItem[]\n [slot: string]: CMSMenuItem[] | CMSFooterGroup[]\n }\n updatedAt?: string\n}\n\n// ── Pagination & Responses ─────────────────────────────────────────────────────\n\n// v1 route returns { data, count } — flat, no nested meta object\ninterface CMSListResponse {\n data: CMSPage[]\n count: number\n appId?: string\n}\n\ninterface CMSSingleResponse {\n data: CMSPage\n}\n\n// ── Client Options ─────────────────────────────────────────────────────────────\n\nexport interface CMSClientOptions {\n /** Base URL of your Forge CMS instance, e.g. https://cms.yourschool.io */\n baseUrl?: string\n /** API key generated in CMS Admin → API Keys. Server-side only. */\n apiKey?: string\n /** App ID from CMS Admin → Apps, e.g. \"school-website\" */\n appId?: string\n}\n\nexport interface CMSGetPagesOptions {\n type?: string\n group?: string\n page?: number\n perPage?: number\n status?: 'published' | 'draft' | 'archived'\n}\n\n// ── Factory ───────────────────────────────────────────────────────────────────\n\nexport function createCMSClient(options?: CMSClientOptions) {\n /**\n * Resolve config lazily at request time — NOT at module/build time.\n * This prevents static prerendering crashes when env vars are absent during build.\n */\n function cfg() {\n return {\n baseUrl: (options?.baseUrl ?? process.env.NEXT_PUBLIC_CMS_URL ?? process.env.CMS_BASE_URL ?? '').replace(/\\/$/, ''),\n apiKey: options?.apiKey ?? process.env.CMS_API_KEY ?? '',\n appId: options?.appId ?? process.env.CMS_APP_ID ?? '',\n }\n }\n\n function headers() {\n return { 'X-CMS-API-Key': cfg().apiKey, 'Content-Type': 'application/json' }\n }\n\n // ── Pages ──────────────────────────────────────────────────────────────────\n\n async function getPages(params?: CMSGetPagesOptions): Promise<CMSPage[]> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) {\n console.warn('[sprintup-cms] Missing CMS_BASE_URL / CMS_API_KEY / CMS_APP_ID — returning []')\n return []\n }\n try {\n const qs = new URLSearchParams()\n if (params?.type) qs.set('type', params.type)\n if (params?.group) qs.set('group', params.group)\n if (params?.page) qs.set('page', String(params.page))\n if (params?.perPage) qs.set('perPage', String(params.perPage))\n const url = `${baseUrl}/api/v1/${appId}/pages${qs.size ? `?${qs}` : ''}`\n const res = await fetch(url, {\n headers: headers(),\n next: { revalidate: 60, tags: [`cms-pages-${appId}`] },\n } as RequestInit)\n if (!res.ok) { console.error(`[sprintup-cms] getPages (${res.status})`); return [] }\n const json: CMSListResponse = await res.json()\n return json.data ?? []\n } catch (err) {\n console.error('[sprintup-cms] getPages error:', err)\n return []\n }\n }\n\n async function getPage(slug: string): Promise<CMSPage | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) {\n console.warn('[sprintup-cms] Missing config — returning null')\n return null\n }\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/pages/${slug}`, {\n headers: headers(),\n next: { revalidate: 60, tags: [`cms-page-${slug}`, `cms-pages-${appId}`] },\n } as RequestInit)\n if (res.status === 404) return null\n if (!res.ok) { console.error(`[sprintup-cms] getPage \"${slug}\" (${res.status})`); return null }\n const json: CMSSingleResponse = await res.json()\n return json.data ?? null\n } catch (err) {\n console.error(`[sprintup-cms] getPage \"${slug}\" error:`, err)\n return null\n }\n }\n\n async function getBlogPosts(): Promise<CMSPage[]> {\n return getPages({ type: 'blog-post' })\n }\n\n async function getEvents(): Promise<CMSPage[]> {\n return getPages({ type: 'event-page' })\n }\n\n async function getAnnouncements(): Promise<CMSPage[]> {\n return getPages({ type: 'announcement-page' })\n }\n\n // ── Preview ────────────────────────────────────────────────────────────────\n\n async function getPreviewPage(token: string): Promise<CMSPage | null> {\n const { baseUrl, appId } = cfg()\n if (!baseUrl || !appId) {\n console.warn('[sprintup-cms] getPreviewPage: Missing baseUrl or appId — returning null')\n return null\n }\n try {\n const url = `${baseUrl}/api/v1/${appId}/preview?token=${encodeURIComponent(token)}`\n const res = await fetch(url, { cache: 'no-store' })\n if (!res.ok) {\n const errorText = await res.text().catch(() => '')\n console.error(`[sprintup-cms] getPreviewPage failed (${res.status}): ${errorText}`)\n return null\n }\n const json = await res.json()\n return json.data ?? null\n } catch (err) {\n console.error('[sprintup-cms] getPreviewPage error:', err)\n return null\n }\n }\n\n async function getPageWithPreview(slug: string, previewToken?: string | null): Promise<CMSPage | null> {\n if (previewToken) {\n const preview = await getPreviewPage(previewToken)\n if (preview?.slug === slug) return preview\n }\n return getPage(slug)\n }\n\n // ── Page Types ─────────────────────────────────────────────────────────────\n\n async function getPageType(pageTypeId: string): Promise<CMSPageType | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId || !pageTypeId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/page-types/${pageTypeId}`, {\n headers: headers(),\n next: { revalidate: 3600, tags: [`cms-page-type-${pageTypeId}`] },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch {\n return null\n }\n }\n\n // ── Site Structure ─────────────────────────────────────────────────────────\n\n async function getSiteStructure(): Promise<CMSSiteStructure | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/site-structure`, {\n headers: headers(),\n next: {\n revalidate: 300,\n tags: [`site-structure-${appId}`],\n },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch {\n return null\n }\n }\n\n /**\n * GET /api/v1/{appId}/sitemap\n * Fetch sitemap data for all published pages (priority, changefreq, lastmod).\n *\n * @example app/sitemap.ts\n * import type { MetadataRoute } from 'next'\n * import { cmsClient } from '@sprintup-cms/sdk'\n *\n * export default async function sitemap(): Promise<MetadataRoute.Sitemap> {\n * const data = await cmsClient.getSitemap()\n * if (!data?.enabled) return []\n * return data.urls.map(url => ({\n * url: `${process.env.NEXT_PUBLIC_SITE_URL}${url.loc}`,\n * lastModified: url.lastmod,\n * changeFrequency: url.changefreq as MetadataRoute.Sitemap[0]['changeFrequency'],\n * priority: url.priority,\n * }))\n * }\n */\n async function getSitemap(): Promise<CMSSitemapResponse | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/sitemap`, {\n headers: headers(),\n next: { revalidate: 3600 },\n } as RequestInit)\n if (!res.ok) return null\n const json = await res.json()\n return json.data ?? null\n } catch { return null }\n }\n\n /**\n * GET /api/v1/{appId}/status\n * Verify connectivity and retrieve page counts. Never cached — always fresh.\n * Useful for debugging API key setup.\n */\n async function getStatus(): Promise<CMSStatusResponse | null> {\n const { baseUrl, apiKey, appId } = cfg()\n if (!baseUrl || !apiKey || !appId) return null\n try {\n const res = await fetch(`${baseUrl}/api/v1/${appId}/status`, {\n headers: headers(),\n cache: 'no-store',\n } as RequestInit)\n if (!res.ok) return null\n return await res.json()\n } catch { return null }\n }\n\n return {\n getPages,\n getPage,\n getBlogPosts,\n getEvents,\n getAnnouncements,\n getPreviewPage,\n getPageWithPreview,\n getPageType,\n getSiteStructure,\n getSitemap,\n getStatus,\n }\n}\n\n// ── Default singleton ─────────────────────────────────────────────────────────\n\n/** Pre-configured singleton. Reads env vars lazily at request time. */\nexport const cmsClient = createCMSClient()\n","'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","import React from 'react'\nimport { notFound } from 'next/navigation'\nimport { cookies, draftMode } from 'next/headers'\nimport type { Metadata } from 'next'\nimport { createCMSClient } from '../client'\nimport { CMSBlocks } from '../react/blocks'\n\nexport interface CMSCatchAllParams {\n slug: string[]\n}\n\nconst client = createCMSClient()\n\n// ── Metadata ──────────────────────────────────────────────────────────────────\n\nexport async function generateMetadata(\n { params }: { params: Promise<CMSCatchAllParams> }\n): Promise<Metadata> {\n const { slug } = await params\n const page = await client.getPage(slug.join('/'))\n if (!page) return { title: 'Not Found' }\n return {\n title: page.seo?.title || page.title,\n description: page.seo?.description || '',\n keywords: page.seo?.keywords?.join(', '),\n robots: page.seo?.noIndex ? 'noindex,nofollow' : undefined,\n openGraph: {\n title: page.seo?.title || page.title,\n description: page.seo?.description,\n images: page.seo?.ogImage ? [page.seo.ogImage] : undefined,\n },\n }\n}\n\n// ── Page ──────────────────────────────────────────────────────────────────────\n\nexport default async function CMSCatchAllPage(\n { params }: { params: Promise<CMSCatchAllParams> }\n) {\n const { slug } = await params\n const slugStr = slug.join('/')\n const draft = await draftMode()\n const cookieStore = await cookies()\n\n let page = null\n let isPreview = false\n\n if (draft.isEnabled) {\n const token = cookieStore.get('cms_preview_token')?.value\n if (token) {\n page = await client.getPreviewPage(token)\n isPreview = !!page\n }\n if (!page) page = await client.getPage(slugStr)\n } else {\n page = await client.getPage(slugStr)\n }\n\n if (!page) notFound()\n\n let pageType = null\n if (page.pageTypeId) {\n pageType = await client.getPageType(page.pageTypeId)\n }\n\n return (\n <div className=\"min-h-screen bg-background\">\n {isPreview && (\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 <span>Draft Preview</span>\n <span className=\"opacity-60 mx-1\">·</span>\n <span className=\"opacity-75 capitalize\">{page.status}</span>\n <span className=\"opacity-60 mx-1\">·</span>\n <span className=\"opacity-75 font-normal\">/{page.slug}</span>\n </div>\n <a\n href=\"/api/cms-preview/exit\"\n className=\"px-3 py-1 rounded bg-white/20 hover:bg-white/30 transition-colors text-xs\"\n >\n Exit Preview\n </a>\n </div>\n )}\n\n <article className=\"max-w-5xl mx-auto px-6 py-12\">\n {page.blocks?.length > 0 ? (\n <CMSBlocks blocks={page.blocks} pageType={pageType} />\n ) : (\n <div className=\"flex flex-col items-center justify-center py-24 text-muted-foreground border-2 border-dashed border-border rounded-xl\">\n <p className=\"text-sm\">No content added yet.</p>\n {isPreview && (\n <p className=\"text-xs mt-1 opacity-60\">Add blocks in the CMS editor to see them here.</p>\n )}\n </div>\n )}\n </article>\n </div>\n )\n}\n\n\n"]}
|