@sonordev/site-kit 1.2.7 → 1.2.9
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/README.md +5 -3
- package/dist/analytics/index.js +6 -6
- package/dist/analytics/index.mjs +2 -2
- package/dist/{api-CWtoFJCO.d.mts → api-DTKSHh_w.d.mts} +1 -1
- package/dist/{api-CWtoFJCO.d.ts → api-DTKSHh_w.d.ts} +1 -1
- package/dist/blog/index.js +10 -10
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +10 -10
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server.js +2 -2
- package/dist/blog/server.js.map +1 -1
- package/dist/blog/server.mjs +2 -2
- package/dist/blog/server.mjs.map +1 -1
- package/dist/{chunk-7RYCHO6D.mjs → chunk-2RHO4KSK.mjs} +9 -9
- package/dist/{chunk-7RYCHO6D.mjs.map → chunk-2RHO4KSK.mjs.map} +1 -1
- package/dist/{chunk-EEZCR6E6.js → chunk-2XOW276O.js} +5 -5
- package/dist/{chunk-EEZCR6E6.js.map → chunk-2XOW276O.js.map} +1 -1
- package/dist/{chunk-JTLOJLWQ.mjs → chunk-36Y7OWES.mjs} +4 -4
- package/dist/chunk-36Y7OWES.mjs.map +1 -0
- package/dist/{chunk-DQYMKR27.mjs → chunk-47Y3YSES.mjs} +10 -10
- package/dist/chunk-47Y3YSES.mjs.map +1 -0
- package/dist/{chunk-MV3QN7PW.mjs → chunk-5F7FFUPJ.mjs} +3 -3
- package/dist/{chunk-MV3QN7PW.mjs.map → chunk-5F7FFUPJ.mjs.map} +1 -1
- package/dist/{chunk-AFAO3TGS.mjs → chunk-5YDPPOUU.mjs} +10 -10
- package/dist/chunk-5YDPPOUU.mjs.map +1 -0
- package/dist/{chunk-D63MUKZ6.mjs → chunk-6YXRLC6W.mjs} +5 -5
- package/dist/chunk-6YXRLC6W.mjs.map +1 -0
- package/dist/{chunk-7RF6PVHA.mjs → chunk-7FKPJQVS.mjs} +33 -68
- package/dist/chunk-7FKPJQVS.mjs.map +1 -0
- package/dist/{chunk-BYLIU6XG.js → chunk-7ROZJDXE.js} +10 -10
- package/dist/chunk-7ROZJDXE.js.map +1 -0
- package/dist/{chunk-UWE5PCYJ.mjs → chunk-APZMXRI3.mjs} +3 -3
- package/dist/chunk-APZMXRI3.mjs.map +1 -0
- package/dist/{chunk-622GAQP5.js → chunk-BBITDUZQ.js} +6 -6
- package/dist/chunk-BBITDUZQ.js.map +1 -0
- package/dist/{chunk-DDKW2FNA.js → chunk-BFJDUTXK.js} +8 -8
- package/dist/chunk-BFJDUTXK.js.map +1 -0
- package/dist/chunk-C3A5HXHX.mjs +78 -0
- package/dist/chunk-C3A5HXHX.mjs.map +1 -0
- package/dist/{chunk-XZJOZJB6.js → chunk-CFEOOJUT.js} +12 -12
- package/dist/{chunk-XZJOZJB6.js.map → chunk-CFEOOJUT.js.map} +1 -1
- package/dist/{chunk-M2T6R7BA.mjs → chunk-DOSSLBNW.mjs} +4 -4
- package/dist/chunk-DOSSLBNW.mjs.map +1 -0
- package/dist/{chunk-OB7E654K.js → chunk-DY4K6X3A.js} +6 -6
- package/dist/chunk-DY4K6X3A.js.map +1 -0
- package/dist/{chunk-7UKPRW25.mjs → chunk-EISQ7LJG.mjs} +6 -6
- package/dist/chunk-EISQ7LJG.mjs.map +1 -0
- package/dist/{chunk-7557OTHW.js → chunk-EUNL6GAL.js} +5 -5
- package/dist/chunk-EUNL6GAL.js.map +1 -0
- package/dist/{chunk-KUGMH4ZF.js → chunk-G6VGUAK2.js} +4 -4
- package/dist/chunk-G6VGUAK2.js.map +1 -0
- package/dist/{chunk-XQQWI6WB.js → chunk-GVXZWXQ7.js} +10 -10
- package/dist/chunk-GVXZWXQ7.js.map +1 -0
- package/dist/{chunk-24277A3Q.mjs → chunk-HF2FWDBJ.mjs} +9 -9
- package/dist/chunk-HF2FWDBJ.mjs.map +1 -0
- package/dist/{chunk-72MQFHYJ.js → chunk-IFAW7JFO.js} +16 -16
- package/dist/chunk-IFAW7JFO.js.map +1 -0
- package/dist/{chunk-P3UWIUJS.mjs → chunk-IKIJEKU3.mjs} +16 -16
- package/dist/chunk-IKIJEKU3.mjs.map +1 -0
- package/dist/{chunk-PKN27UMH.mjs → chunk-JIDOXTX2.mjs} +3 -3
- package/dist/{chunk-PKN27UMH.mjs.map → chunk-JIDOXTX2.mjs.map} +1 -1
- package/dist/{chunk-7FUV73JZ.js → chunk-JM3ZR6LB.js} +9 -9
- package/dist/chunk-JM3ZR6LB.js.map +1 -0
- package/dist/{chunk-OIIKTGRL.mjs → chunk-JMNSED4O.mjs} +8 -8
- package/dist/chunk-JMNSED4O.mjs.map +1 -0
- package/dist/chunk-MG23BS36.js +82 -0
- package/dist/chunk-MG23BS36.js.map +1 -0
- package/dist/{chunk-TFLQX7K7.mjs → chunk-N24BPFF6.mjs} +6 -6
- package/dist/chunk-N24BPFF6.mjs.map +1 -0
- package/dist/{chunk-LIVWLY2P.js → chunk-PPRAW576.js} +3 -3
- package/dist/{chunk-LIVWLY2P.js.map → chunk-PPRAW576.js.map} +1 -1
- package/dist/chunk-QETK4P5G.mjs +142 -0
- package/dist/chunk-QETK4P5G.mjs.map +1 -0
- package/dist/{chunk-W4PALSGM.js → chunk-REMHGWXT.js} +3 -3
- package/dist/chunk-REMHGWXT.js.map +1 -0
- package/dist/{chunk-DW5UJKHH.js → chunk-RMOL4TZ6.js} +8 -8
- package/dist/chunk-RMOL4TZ6.js.map +1 -0
- package/dist/{chunk-KKU3K7RG.js → chunk-SLB5V4RT.js} +33 -67
- package/dist/chunk-SLB5V4RT.js.map +1 -0
- package/dist/{chunk-K23A4G76.mjs → chunk-SQSBAPWA.mjs} +8 -8
- package/dist/chunk-SQSBAPWA.mjs.map +1 -0
- package/dist/{chunk-WECQ6KOB.js → chunk-TG46LJFB.js} +4 -4
- package/dist/chunk-TG46LJFB.js.map +1 -0
- package/dist/{chunk-43GBM4SX.js → chunk-TKQLH33E.js} +3 -3
- package/dist/chunk-TKQLH33E.js.map +1 -0
- package/dist/{chunk-UYFDNX2F.js → chunk-TLHRV3LZ.js} +5 -5
- package/dist/chunk-TLHRV3LZ.js.map +1 -0
- package/dist/{chunk-6ZCISNAB.mjs → chunk-UPR5FEIO.mjs} +3 -3
- package/dist/chunk-UPR5FEIO.mjs.map +1 -0
- package/dist/chunk-VTECURKB.js +144 -0
- package/dist/chunk-VTECURKB.js.map +1 -0
- package/dist/{chunk-GCJXQ4AG.mjs → chunk-VZMDH3R4.mjs} +5 -5
- package/dist/chunk-VZMDH3R4.mjs.map +1 -0
- package/dist/{chunk-LBVWVP72.js → chunk-X4J33XQD.js} +7 -7
- package/dist/chunk-X4J33XQD.js.map +1 -0
- package/dist/{chunk-QXV4667R.mjs → chunk-XFOL6JDF.mjs} +5 -5
- package/dist/chunk-XFOL6JDF.mjs.map +1 -0
- package/dist/cli/index.js +80 -91
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +76 -87
- package/dist/cli/index.mjs.map +1 -1
- package/dist/cms/index.d.mts +139 -0
- package/dist/cms/index.d.ts +139 -0
- package/dist/cms/index.js +409 -0
- package/dist/cms/index.js.map +1 -0
- package/dist/cms/index.mjs +388 -0
- package/dist/cms/index.mjs.map +1 -0
- package/dist/cms/server.d.mts +47 -0
- package/dist/cms/server.d.ts +47 -0
- package/dist/cms/server.js +21 -0
- package/dist/{server-api-GJPNRYUP.js.map → cms/server.js.map} +1 -1
- package/dist/cms/server.mjs +4 -0
- package/dist/{server-api-EWXKOQZA.mjs.map → cms/server.mjs.map} +1 -1
- package/dist/commerce/index.js +42 -42
- package/dist/commerce/index.mjs +1 -1
- package/dist/commerce/server.d.mts +1 -1
- package/dist/commerce/server.d.ts +1 -1
- package/dist/commerce/server.js.map +1 -1
- package/dist/commerce/server.mjs.map +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/index.mjs +1 -1
- package/dist/config/index.mjs.map +1 -1
- package/dist/engage/index.js +4 -4
- package/dist/engage/index.mjs +1 -1
- package/dist/forms/index.js +5 -5
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +5 -5
- package/dist/forms/index.mjs.map +1 -1
- package/dist/generators-DOFWGRXS.js +37 -0
- package/dist/{generators-DTMO36DV.js.map → generators-DOFWGRXS.js.map} +1 -1
- package/dist/generators-R62APO62.mjs +4 -0
- package/dist/{generators-2XKQMPKH.mjs.map → generators-R62APO62.mjs.map} +1 -1
- package/dist/images/index.d.mts +1 -1
- package/dist/images/index.d.ts +1 -1
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +2 -2
- package/dist/images/server.d.mts +3 -3
- package/dist/images/server.d.ts +3 -3
- package/dist/images/server.js +4 -4
- package/dist/images/server.mjs +1 -1
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +81 -81
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +28 -28
- package/dist/index.mjs.map +1 -1
- package/dist/layout/client.d.mts +18 -0
- package/dist/layout/client.d.ts +18 -0
- package/dist/layout/client.js +18 -0
- package/dist/layout/client.js.map +1 -0
- package/dist/layout/client.mjs +9 -0
- package/dist/layout/client.mjs.map +1 -0
- package/dist/layout/index.d.mts +4 -27
- package/dist/layout/index.d.ts +4 -27
- package/dist/layout/index.js +15 -145
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +11 -141
- package/dist/layout/index.mjs.map +1 -1
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- package/dist/manifest/index.js +4 -4
- package/dist/manifest/index.js.map +1 -1
- package/dist/manifest/index.mjs +3 -3
- package/dist/manifest/index.mjs.map +1 -1
- package/dist/middleware/index.js +3 -3
- package/dist/middleware/index.mjs +2 -2
- package/dist/{migrator-2MQHOFDQ.mjs → migrator-3WQB3KQ2.mjs} +3 -3
- package/dist/{migrator-2MQHOFDQ.mjs.map → migrator-3WQB3KQ2.mjs.map} +1 -1
- package/dist/migrator-HFVQYK5R.js +37 -0
- package/dist/{migrator-THJCF6MZ.js.map → migrator-HFVQYK5R.js.map} +1 -1
- package/dist/redirects/index.d.mts +2 -2
- package/dist/redirects/index.d.ts +2 -2
- package/dist/redirects/index.js +6 -6
- package/dist/redirects/index.mjs +2 -2
- package/dist/reputation/index.js +4 -4
- package/dist/reputation/index.mjs +1 -1
- package/dist/robots/index.d.mts +1 -1
- package/dist/robots/index.d.ts +1 -1
- package/dist/robots/index.js +3 -3
- package/dist/robots/index.js.map +1 -1
- package/dist/robots/index.mjs +2 -2
- package/dist/robots/index.mjs.map +1 -1
- package/dist/seo/index.d.mts +1 -1
- package/dist/seo/index.d.ts +1 -1
- package/dist/seo/index.js +43 -43
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +6 -6
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/register-sitemap-cli.js +18 -18
- package/dist/seo/register-sitemap-cli.js.map +1 -1
- package/dist/seo/register-sitemap-cli.mjs +18 -18
- package/dist/seo/register-sitemap-cli.mjs.map +1 -1
- package/dist/seo/server.d.mts +1 -1
- package/dist/seo/server.d.ts +1 -1
- package/dist/seo/server.js +10 -10
- package/dist/seo/server.js.map +1 -1
- package/dist/seo/server.mjs +8 -8
- package/dist/seo/server.mjs.map +1 -1
- package/dist/{server-api-GJPNRYUP.js → server-api-C5JXIROA.js} +21 -21
- package/dist/server-api-C5JXIROA.js.map +1 -0
- package/dist/{server-api-EWXKOQZA.mjs → server-api-HTSLBT6F.mjs} +3 -3
- package/dist/server-api-HTSLBT6F.mjs.map +1 -0
- package/dist/setup/client.js +7 -7
- package/dist/setup/client.mjs +2 -2
- package/dist/setup/index.js +9 -9
- package/dist/setup/index.mjs +3 -3
- package/dist/setup/server.js +2 -2
- package/dist/setup/server.mjs +1 -1
- package/dist/site-config/index.d.mts +1 -1
- package/dist/site-config/index.d.ts +1 -1
- package/dist/site-config/index.js +3 -3
- package/dist/site-config/index.mjs +1 -1
- package/dist/sitemap/index.d.mts +2 -2
- package/dist/sitemap/index.d.ts +2 -2
- package/dist/sitemap/index.js +10 -10
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +8 -8
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/types-5RCOK10v.d.mts +25 -0
- package/dist/types-5RCOK10v.d.ts +25 -0
- package/dist/types-BG-x8yhh.d.mts +106 -0
- package/dist/types-BG-x8yhh.d.ts +106 -0
- package/package.json +13 -1
- package/dist/chunk-24277A3Q.mjs.map +0 -1
- package/dist/chunk-43GBM4SX.js.map +0 -1
- package/dist/chunk-622GAQP5.js.map +0 -1
- package/dist/chunk-6ZCISNAB.mjs.map +0 -1
- package/dist/chunk-72MQFHYJ.js.map +0 -1
- package/dist/chunk-7557OTHW.js.map +0 -1
- package/dist/chunk-7FUV73JZ.js.map +0 -1
- package/dist/chunk-7RF6PVHA.mjs.map +0 -1
- package/dist/chunk-7UKPRW25.mjs.map +0 -1
- package/dist/chunk-AFAO3TGS.mjs.map +0 -1
- package/dist/chunk-BYLIU6XG.js.map +0 -1
- package/dist/chunk-D63MUKZ6.mjs.map +0 -1
- package/dist/chunk-DDKW2FNA.js.map +0 -1
- package/dist/chunk-DQYMKR27.mjs.map +0 -1
- package/dist/chunk-DW5UJKHH.js.map +0 -1
- package/dist/chunk-GCJXQ4AG.mjs.map +0 -1
- package/dist/chunk-JTLOJLWQ.mjs.map +0 -1
- package/dist/chunk-K23A4G76.mjs.map +0 -1
- package/dist/chunk-KKU3K7RG.js.map +0 -1
- package/dist/chunk-KUGMH4ZF.js.map +0 -1
- package/dist/chunk-LBVWVP72.js.map +0 -1
- package/dist/chunk-M2T6R7BA.mjs.map +0 -1
- package/dist/chunk-OB7E654K.js.map +0 -1
- package/dist/chunk-OIIKTGRL.mjs.map +0 -1
- package/dist/chunk-P3UWIUJS.mjs.map +0 -1
- package/dist/chunk-QXV4667R.mjs.map +0 -1
- package/dist/chunk-TFLQX7K7.mjs.map +0 -1
- package/dist/chunk-UWE5PCYJ.mjs.map +0 -1
- package/dist/chunk-UYFDNX2F.js.map +0 -1
- package/dist/chunk-W4PALSGM.js.map +0 -1
- package/dist/chunk-WECQ6KOB.js.map +0 -1
- package/dist/chunk-XQQWI6WB.js.map +0 -1
- package/dist/generators-2XKQMPKH.mjs +0 -4
- package/dist/generators-DTMO36DV.js +0 -33
- package/dist/migrator-THJCF6MZ.js +0 -37
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["imageUrlBuilder","jsx","jsxs","PortableText","getCmsPage","Fragment","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
import { getCmsPage } from '../chunk-C3A5HXHX.mjs';
|
|
2
|
+
import '../chunk-4XPGGLVP.mjs';
|
|
3
|
+
import { PortableText } from '@portabletext/react';
|
|
4
|
+
import imageUrlBuilder from '@sanity/image-url';
|
|
5
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
import { useState, useEffect } from 'react';
|
|
7
|
+
|
|
8
|
+
var _builder = null;
|
|
9
|
+
var DEFAULT_CONFIG = {
|
|
10
|
+
projectId: "l55lyemx",
|
|
11
|
+
dataset: "production"
|
|
12
|
+
};
|
|
13
|
+
function configureSanityImages(config) {
|
|
14
|
+
_builder = imageUrlBuilder(config);
|
|
15
|
+
}
|
|
16
|
+
function getBuilder() {
|
|
17
|
+
if (!_builder) {
|
|
18
|
+
_builder = imageUrlBuilder(DEFAULT_CONFIG);
|
|
19
|
+
}
|
|
20
|
+
return _builder;
|
|
21
|
+
}
|
|
22
|
+
function sanityImageUrl(image, options = {}) {
|
|
23
|
+
if (!image?.asset?._ref) return "";
|
|
24
|
+
let builder = getBuilder().image(image).auto("format");
|
|
25
|
+
if (options.width) builder = builder.width(options.width);
|
|
26
|
+
if (options.height) builder = builder.height(options.height);
|
|
27
|
+
if (options.dpr) builder = builder.dpr(options.dpr);
|
|
28
|
+
if (options.quality) builder = builder.quality(options.quality);
|
|
29
|
+
if (options.format) builder = builder.format(options.format);
|
|
30
|
+
if (options.fit) builder = builder.fit(options.fit);
|
|
31
|
+
if (options.blur) builder = builder.blur(options.blur);
|
|
32
|
+
return builder.url();
|
|
33
|
+
}
|
|
34
|
+
function sanityImageSrcSet(image, widths = [400, 800, 1200, 1600], options = {}) {
|
|
35
|
+
if (!image?.asset?._ref) return "";
|
|
36
|
+
return widths.map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`).join(", ");
|
|
37
|
+
}
|
|
38
|
+
function hotspotToObjectPosition(image) {
|
|
39
|
+
if (!image?.hotspot) return void 0;
|
|
40
|
+
return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`;
|
|
41
|
+
}
|
|
42
|
+
var defaultComponents = {
|
|
43
|
+
block: {
|
|
44
|
+
h1: ({ children }) => /* @__PURE__ */ jsx("h1", { className: "sonor-cms-h1", children }),
|
|
45
|
+
h2: ({ children }) => /* @__PURE__ */ jsx("h2", { className: "sonor-cms-h2", children }),
|
|
46
|
+
h3: ({ children }) => /* @__PURE__ */ jsx("h3", { className: "sonor-cms-h3", children }),
|
|
47
|
+
h4: ({ children }) => /* @__PURE__ */ jsx("h4", { className: "sonor-cms-h4", children }),
|
|
48
|
+
normal: ({ children }) => /* @__PURE__ */ jsx("p", { className: "sonor-cms-p", children }),
|
|
49
|
+
blockquote: ({ children }) => /* @__PURE__ */ jsx("blockquote", { className: "sonor-cms-blockquote", children })
|
|
50
|
+
},
|
|
51
|
+
marks: {
|
|
52
|
+
strong: ({ children }) => /* @__PURE__ */ jsx("strong", { children }),
|
|
53
|
+
em: ({ children }) => /* @__PURE__ */ jsx("em", { children }),
|
|
54
|
+
code: ({ children }) => /* @__PURE__ */ jsx("code", { className: "sonor-cms-code", children }),
|
|
55
|
+
underline: ({ children }) => /* @__PURE__ */ jsx("u", { children }),
|
|
56
|
+
"strike-through": ({ children }) => /* @__PURE__ */ jsx("s", { children }),
|
|
57
|
+
link: ({ children, value }) => {
|
|
58
|
+
const href = value?.href || "#";
|
|
59
|
+
const isExternal = href.startsWith("http");
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
"a",
|
|
62
|
+
{
|
|
63
|
+
href,
|
|
64
|
+
className: "sonor-cms-link",
|
|
65
|
+
...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : {},
|
|
66
|
+
children
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
highlight: ({ children }) => /* @__PURE__ */ jsx("mark", { className: "sonor-cms-highlight", children })
|
|
71
|
+
},
|
|
72
|
+
list: {
|
|
73
|
+
bullet: ({ children }) => /* @__PURE__ */ jsx("ul", { className: "sonor-cms-ul", children }),
|
|
74
|
+
number: ({ children }) => /* @__PURE__ */ jsx("ol", { className: "sonor-cms-ol", children })
|
|
75
|
+
},
|
|
76
|
+
listItem: {
|
|
77
|
+
bullet: ({ children }) => /* @__PURE__ */ jsx("li", { children }),
|
|
78
|
+
number: ({ children }) => /* @__PURE__ */ jsx("li", { children })
|
|
79
|
+
},
|
|
80
|
+
types: {
|
|
81
|
+
image: ({ value }) => {
|
|
82
|
+
if (!value?.asset?._ref && !value?.url) return null;
|
|
83
|
+
const src = value.url || sanityImageUrl(value, { width: 1200 });
|
|
84
|
+
const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : void 0;
|
|
85
|
+
const objectPosition = hotspotToObjectPosition(value);
|
|
86
|
+
return /* @__PURE__ */ jsxs("figure", { className: "sonor-cms-figure", children: [
|
|
87
|
+
/* @__PURE__ */ jsx(
|
|
88
|
+
"img",
|
|
89
|
+
{
|
|
90
|
+
src,
|
|
91
|
+
srcSet,
|
|
92
|
+
sizes: "(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px",
|
|
93
|
+
alt: value.alt || "",
|
|
94
|
+
className: "sonor-cms-img",
|
|
95
|
+
loading: "lazy",
|
|
96
|
+
style: objectPosition ? { objectPosition } : void 0
|
|
97
|
+
}
|
|
98
|
+
),
|
|
99
|
+
value.caption && /* @__PURE__ */ jsx("figcaption", { className: "sonor-cms-figcaption", children: typeof value.caption === "string" ? value.caption : null })
|
|
100
|
+
] });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
function PortableTextRenderer({
|
|
105
|
+
value,
|
|
106
|
+
components: overrides,
|
|
107
|
+
className
|
|
108
|
+
}) {
|
|
109
|
+
if (!value || !Array.isArray(value) || value.length === 0) return null;
|
|
110
|
+
const merged = overrides ? {
|
|
111
|
+
...defaultComponents,
|
|
112
|
+
block: { ...defaultComponents.block, ...overrides.block },
|
|
113
|
+
marks: { ...defaultComponents.marks, ...overrides.marks },
|
|
114
|
+
types: { ...defaultComponents.types, ...overrides.types },
|
|
115
|
+
list: { ...defaultComponents.list, ...overrides.list },
|
|
116
|
+
listItem: { ...defaultComponents.listItem, ...overrides.listItem }
|
|
117
|
+
} : defaultComponents;
|
|
118
|
+
return /* @__PURE__ */ jsx("div", { className: className || "sonor-cms-content", children: /* @__PURE__ */ jsx(PortableText, { value, components: merged }) });
|
|
119
|
+
}
|
|
120
|
+
function HeroSection({ data, portableTextComponents }) {
|
|
121
|
+
const headline = data.headline;
|
|
122
|
+
const subheadline = data.subheadline;
|
|
123
|
+
const ctaText = data.ctaText;
|
|
124
|
+
const ctaLink = data.ctaLink;
|
|
125
|
+
const bgImage = data.backgroundImage;
|
|
126
|
+
const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 });
|
|
127
|
+
const bgPosition = hotspotToObjectPosition(bgImage) || "50% 50%";
|
|
128
|
+
return /* @__PURE__ */ jsxs(
|
|
129
|
+
"section",
|
|
130
|
+
{
|
|
131
|
+
className: "sonor-cms-hero",
|
|
132
|
+
style: bgUrl ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: "cover" } : void 0,
|
|
133
|
+
children: [
|
|
134
|
+
headline && /* @__PURE__ */ jsx(PortableTextRenderer, { value: headline, components: portableTextComponents, className: "sonor-cms-hero-headline" }),
|
|
135
|
+
subheadline && /* @__PURE__ */ jsx(PortableTextRenderer, { value: subheadline, components: portableTextComponents, className: "sonor-cms-hero-subheadline" }),
|
|
136
|
+
ctaText && ctaLink && /* @__PURE__ */ jsx("a", { href: ctaLink, className: "sonor-cms-hero-cta", children: ctaText })
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
function RichTextSection({ data, portableTextComponents }) {
|
|
142
|
+
const content = data.content;
|
|
143
|
+
if (!content) return null;
|
|
144
|
+
return /* @__PURE__ */ jsx("section", { className: "sonor-cms-richtext", children: /* @__PURE__ */ jsx(PortableTextRenderer, { value: content, components: portableTextComponents }) });
|
|
145
|
+
}
|
|
146
|
+
function CtaSection({ data, portableTextComponents }) {
|
|
147
|
+
const headline = data.headline;
|
|
148
|
+
const description = data.description;
|
|
149
|
+
const buttonText = data.buttonText;
|
|
150
|
+
const buttonLink = data.buttonLink;
|
|
151
|
+
return /* @__PURE__ */ jsxs("section", { className: "sonor-cms-cta", children: [
|
|
152
|
+
headline && /* @__PURE__ */ jsx(PortableTextRenderer, { value: headline, components: portableTextComponents, className: "sonor-cms-cta-headline" }),
|
|
153
|
+
description && /* @__PURE__ */ jsx(PortableTextRenderer, { value: description, components: portableTextComponents, className: "sonor-cms-cta-description" }),
|
|
154
|
+
buttonText && buttonLink && /* @__PURE__ */ jsx("a", { href: buttonLink, className: "sonor-cms-cta-button", children: buttonText })
|
|
155
|
+
] });
|
|
156
|
+
}
|
|
157
|
+
function GallerySection({ data, portableTextComponents }) {
|
|
158
|
+
const images = data.images || [];
|
|
159
|
+
const layout = data.layout || "grid";
|
|
160
|
+
const caption = data.caption;
|
|
161
|
+
if (images.length === 0) return null;
|
|
162
|
+
return /* @__PURE__ */ jsxs("section", { className: "sonor-cms-gallery", children: [
|
|
163
|
+
/* @__PURE__ */ jsx("div", { className: `sonor-cms-gallery-${layout}`, children: images.map((img, i) => {
|
|
164
|
+
const objectPosition = hotspotToObjectPosition(img);
|
|
165
|
+
return /* @__PURE__ */ jsx("figure", { className: "sonor-cms-gallery-item", children: /* @__PURE__ */ jsx(
|
|
166
|
+
"img",
|
|
167
|
+
{
|
|
168
|
+
src: sanityImageUrl(img, { width: 800 }),
|
|
169
|
+
srcSet: sanityImageSrcSet(img, [400, 800, 1200]),
|
|
170
|
+
sizes: "(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw",
|
|
171
|
+
alt: img.alt || "",
|
|
172
|
+
loading: "lazy",
|
|
173
|
+
style: objectPosition ? { objectPosition } : void 0
|
|
174
|
+
}
|
|
175
|
+
) }, img.asset?._ref || i);
|
|
176
|
+
}) }),
|
|
177
|
+
caption && /* @__PURE__ */ jsx(PortableTextRenderer, { value: caption, components: portableTextComponents, className: "sonor-cms-gallery-caption" })
|
|
178
|
+
] });
|
|
179
|
+
}
|
|
180
|
+
function TestimonialsSection({ data, portableTextComponents }) {
|
|
181
|
+
const items = data.items || [];
|
|
182
|
+
const layout = data.layout || "grid";
|
|
183
|
+
if (items.length === 0) return null;
|
|
184
|
+
return /* @__PURE__ */ jsx("section", { className: `sonor-cms-testimonials sonor-cms-testimonials-${layout}`, children: items.map((item, i) => /* @__PURE__ */ jsxs("blockquote", { className: "sonor-cms-testimonial", children: [
|
|
185
|
+
/* @__PURE__ */ jsx(PortableTextRenderer, { value: item.quote, components: portableTextComponents, className: "sonor-cms-testimonial-quote" }),
|
|
186
|
+
/* @__PURE__ */ jsxs("footer", { className: "sonor-cms-testimonial-footer", children: [
|
|
187
|
+
item.avatar?.asset?._ref && /* @__PURE__ */ jsx(
|
|
188
|
+
"img",
|
|
189
|
+
{
|
|
190
|
+
src: sanityImageUrl(item.avatar, { width: 80, height: 80, fit: "crop" }),
|
|
191
|
+
alt: item.avatar.alt || item.author,
|
|
192
|
+
className: "sonor-cms-testimonial-avatar",
|
|
193
|
+
width: 80,
|
|
194
|
+
height: 80,
|
|
195
|
+
loading: "lazy"
|
|
196
|
+
}
|
|
197
|
+
),
|
|
198
|
+
/* @__PURE__ */ jsxs("cite", { className: "sonor-cms-testimonial-author", children: [
|
|
199
|
+
item.author,
|
|
200
|
+
item.role && /* @__PURE__ */ jsxs("span", { className: "sonor-cms-testimonial-role", children: [
|
|
201
|
+
", ",
|
|
202
|
+
item.role
|
|
203
|
+
] })
|
|
204
|
+
] })
|
|
205
|
+
] })
|
|
206
|
+
] }, i)) });
|
|
207
|
+
}
|
|
208
|
+
function FaqSection({ data, portableTextComponents }) {
|
|
209
|
+
const items = data.items || [];
|
|
210
|
+
if (items.length === 0) return null;
|
|
211
|
+
return /* @__PURE__ */ jsx("section", { className: "sonor-cms-faq", children: items.map((item, i) => /* @__PURE__ */ jsxs("details", { className: "sonor-cms-faq-item", children: [
|
|
212
|
+
/* @__PURE__ */ jsx("summary", { className: "sonor-cms-faq-question", children: item.question }),
|
|
213
|
+
/* @__PURE__ */ jsx("div", { className: "sonor-cms-faq-answer", children: /* @__PURE__ */ jsx(PortableTextRenderer, { value: item.answer, components: portableTextComponents }) })
|
|
214
|
+
] }, i)) });
|
|
215
|
+
}
|
|
216
|
+
function FormSection({ data, portableTextComponents }) {
|
|
217
|
+
const formSlug = data.formSlug;
|
|
218
|
+
const heading = data.heading;
|
|
219
|
+
return /* @__PURE__ */ jsxs("section", { className: "sonor-cms-form", children: [
|
|
220
|
+
heading && /* @__PURE__ */ jsx(PortableTextRenderer, { value: heading, components: portableTextComponents, className: "sonor-cms-form-heading" }),
|
|
221
|
+
formSlug ? /* @__PURE__ */ jsx(
|
|
222
|
+
"div",
|
|
223
|
+
{
|
|
224
|
+
className: "sonor-cms-form-embed",
|
|
225
|
+
"data-form-slug": formSlug
|
|
226
|
+
}
|
|
227
|
+
) : /* @__PURE__ */ jsx("p", { className: "sonor-cms-form-placeholder", children: "Form not configured" })
|
|
228
|
+
] });
|
|
229
|
+
}
|
|
230
|
+
function CustomSection({ data, displayName }) {
|
|
231
|
+
const componentName = data.componentName;
|
|
232
|
+
data.props || {};
|
|
233
|
+
return /* @__PURE__ */ jsx("section", { className: "sonor-cms-custom", "data-component": componentName, children: /* @__PURE__ */ jsxs("div", { className: "sonor-cms-custom-placeholder", children: [
|
|
234
|
+
"Custom component: ",
|
|
235
|
+
componentName || displayName
|
|
236
|
+
] }) });
|
|
237
|
+
}
|
|
238
|
+
var defaultRenderers = {
|
|
239
|
+
hero: HeroSection,
|
|
240
|
+
richText: RichTextSection,
|
|
241
|
+
cta: CtaSection,
|
|
242
|
+
gallery: GallerySection,
|
|
243
|
+
testimonials: TestimonialsSection,
|
|
244
|
+
faq: FaqSection,
|
|
245
|
+
form: FormSection,
|
|
246
|
+
custom: CustomSection
|
|
247
|
+
};
|
|
248
|
+
function CmsSection({ section, sectionComponents, portableTextComponents }) {
|
|
249
|
+
const Renderer = sectionComponents?.[section.sectionType] || defaultRenderers[section.sectionType];
|
|
250
|
+
if (!Renderer) {
|
|
251
|
+
if (process.env.NODE_ENV === "development") {
|
|
252
|
+
console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`);
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return /* @__PURE__ */ jsx(
|
|
257
|
+
"div",
|
|
258
|
+
{
|
|
259
|
+
className: `sonor-cms-section sonor-cms-section-${section.sectionType}`,
|
|
260
|
+
"data-section-id": section._id,
|
|
261
|
+
"data-section-type": section.sectionType,
|
|
262
|
+
children: /* @__PURE__ */ jsx(
|
|
263
|
+
Renderer,
|
|
264
|
+
{
|
|
265
|
+
data: section.data,
|
|
266
|
+
sectionType: section.sectionType,
|
|
267
|
+
displayName: section.displayName,
|
|
268
|
+
portableTextComponents
|
|
269
|
+
}
|
|
270
|
+
)
|
|
271
|
+
}
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
async function CmsPage({
|
|
275
|
+
path,
|
|
276
|
+
sectionComponents,
|
|
277
|
+
portableTextComponents,
|
|
278
|
+
fallback,
|
|
279
|
+
className
|
|
280
|
+
}) {
|
|
281
|
+
const page = await getCmsPage(path);
|
|
282
|
+
if (!page) {
|
|
283
|
+
if (fallback) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
284
|
+
return null;
|
|
285
|
+
}
|
|
286
|
+
if (!page.sections || page.sections.length === 0) {
|
|
287
|
+
if (fallback) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
return /* @__PURE__ */ jsx(
|
|
291
|
+
"div",
|
|
292
|
+
{
|
|
293
|
+
className: className || "sonor-cms-page",
|
|
294
|
+
"data-cms-page-id": page._id,
|
|
295
|
+
"data-cms-path": page.path,
|
|
296
|
+
children: page.sections.map((section) => /* @__PURE__ */ jsx(
|
|
297
|
+
CmsSection,
|
|
298
|
+
{
|
|
299
|
+
section,
|
|
300
|
+
sectionComponents,
|
|
301
|
+
portableTextComponents
|
|
302
|
+
},
|
|
303
|
+
section._id
|
|
304
|
+
))
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
function CmsPreview({
|
|
309
|
+
apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io",
|
|
310
|
+
apiKey,
|
|
311
|
+
path,
|
|
312
|
+
pollInterval = 3e3,
|
|
313
|
+
sectionComponents,
|
|
314
|
+
portableTextComponents,
|
|
315
|
+
className
|
|
316
|
+
}) {
|
|
317
|
+
const [page, setPage] = useState(null);
|
|
318
|
+
const [error, setError] = useState(null);
|
|
319
|
+
useEffect(() => {
|
|
320
|
+
let cancelled = false;
|
|
321
|
+
async function fetchPage() {
|
|
322
|
+
try {
|
|
323
|
+
const res = await fetch(`${apiUrl}/api/public/cms/page`, {
|
|
324
|
+
method: "POST",
|
|
325
|
+
headers: {
|
|
326
|
+
"Content-Type": "application/json",
|
|
327
|
+
"x-api-key": apiKey
|
|
328
|
+
},
|
|
329
|
+
body: JSON.stringify({ path })
|
|
330
|
+
});
|
|
331
|
+
if (!res.ok) {
|
|
332
|
+
setError(`Error ${res.status}`);
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const data = await res.json();
|
|
336
|
+
if (!cancelled && data?.found && data.page) {
|
|
337
|
+
setPage(data.page);
|
|
338
|
+
setError(null);
|
|
339
|
+
}
|
|
340
|
+
} catch (err) {
|
|
341
|
+
if (!cancelled) {
|
|
342
|
+
setError("Failed to load preview");
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
fetchPage();
|
|
347
|
+
if (pollInterval > 0) {
|
|
348
|
+
const interval = setInterval(fetchPage, pollInterval);
|
|
349
|
+
return () => {
|
|
350
|
+
cancelled = true;
|
|
351
|
+
clearInterval(interval);
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
return () => {
|
|
355
|
+
cancelled = true;
|
|
356
|
+
};
|
|
357
|
+
}, [apiUrl, apiKey, path, pollInterval]);
|
|
358
|
+
if (error) {
|
|
359
|
+
return /* @__PURE__ */ jsx("div", { className: "sonor-cms-preview-error", children: /* @__PURE__ */ jsxs("p", { children: [
|
|
360
|
+
"Preview error: ",
|
|
361
|
+
error
|
|
362
|
+
] }) });
|
|
363
|
+
}
|
|
364
|
+
if (!page) {
|
|
365
|
+
return /* @__PURE__ */ jsx("div", { className: "sonor-cms-preview-loading", children: /* @__PURE__ */ jsx("p", { children: "Loading preview..." }) });
|
|
366
|
+
}
|
|
367
|
+
return /* @__PURE__ */ jsx(
|
|
368
|
+
"div",
|
|
369
|
+
{
|
|
370
|
+
className: className || "sonor-cms-page sonor-cms-preview",
|
|
371
|
+
"data-cms-preview": "true",
|
|
372
|
+
"data-cms-path": page.path,
|
|
373
|
+
children: page.sections?.map((section) => /* @__PURE__ */ jsx(
|
|
374
|
+
CmsSection,
|
|
375
|
+
{
|
|
376
|
+
section,
|
|
377
|
+
sectionComponents,
|
|
378
|
+
portableTextComponents
|
|
379
|
+
},
|
|
380
|
+
section._id
|
|
381
|
+
))
|
|
382
|
+
}
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export { CmsPage, CmsPreview, CmsSection, CtaSection, CustomSection, FaqSection, FormSection, GallerySection, HeroSection, PortableTextRenderer, RichTextSection, TestimonialsSection, configureSanityImages, hotspotToObjectPosition, sanityImageSrcSet, sanityImageUrl };
|
|
387
|
+
//# sourceMappingURL=index.mjs.map
|
|
388
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { C as CmsPageData, a as CmsSectionData } from '../types-BG-x8yhh.mjs';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @sonordev/site-kit/cms - Server-Only API Functions
|
|
5
|
+
*
|
|
6
|
+
* Fetches CMS page/section data from Portal API.
|
|
7
|
+
* Uses the same secure API pattern as seo/server-api.ts.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Fetch a published CMS page by path — cached per request.
|
|
12
|
+
* Returns the full page with all sections and their Portable Text content.
|
|
13
|
+
* @server-only
|
|
14
|
+
*/
|
|
15
|
+
declare const getCmsPage: (path: string) => Promise<CmsPageData | null>;
|
|
16
|
+
/**
|
|
17
|
+
* Fetch a single published CMS section by ID — cached per request.
|
|
18
|
+
* @server-only
|
|
19
|
+
*/
|
|
20
|
+
declare const getCmsSection: (sectionId: string) => Promise<CmsSectionData | null>;
|
|
21
|
+
/**
|
|
22
|
+
* Fetch CMS page and return Next.js Metadata object.
|
|
23
|
+
* Use in generateMetadata() for CMS-managed pages.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```ts
|
|
27
|
+
* import { getCmsPageMetadata } from '@sonordev/site-kit/cms/server'
|
|
28
|
+
*
|
|
29
|
+
* export async function generateMetadata({ params }) {
|
|
30
|
+
* return getCmsPageMetadata(`/${params.slug}`)
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
* @server-only
|
|
34
|
+
*/
|
|
35
|
+
declare const getCmsPageMetadata: (path: string) => Promise<{
|
|
36
|
+
title?: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
robots?: {
|
|
39
|
+
index: boolean;
|
|
40
|
+
};
|
|
41
|
+
openGraph?: {
|
|
42
|
+
title?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
};
|
|
45
|
+
} | null>;
|
|
46
|
+
|
|
47
|
+
export { getCmsPage, getCmsPageMetadata, getCmsSection };
|