@sonordev/site-kit 1.2.7 → 1.2.8
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-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-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/index.d.mts +2 -2
- package/dist/layout/index.d.ts +2 -2
- package/dist/layout/index.js +17 -17
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +10 -10
- 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-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
package/dist/seo/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/seo/getManagedMetadata.ts","../../src/seo/withManagedMetadata.ts","../../src/seo/ManagedSchema.tsx","../../src/seo/ManagedFAQ.tsx","../../src/seo/ManagedInternalLinks.tsx","../../src/seo/ManagedContent.tsx","../../src/seo/LocationPageContent.tsx"],"names":["getSEOPageData","ensureMetadata","getABTest","recordABImpression","getSchemaMarkups","getEntityEnhancedSchema","jsx","jsxs","getFAQData","Fragment","getInternalLinks","getContentBlock","getEntities","cache"],"mappings":"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","file":"index.js","sourcesContent":["import type { Metadata } from 'next'\nimport { getSEOPageData, getABTest, recordABImpression, ensureMetadata } from './server-api'\nimport type { \n GetManagedMetadataOptions, \n ManagedMetadataResult,\n GetABVariantOptions,\n ABTestResult \n} from './types'\n\n/**\n * Get managed metadata for a page\n * \n * Use in generateMetadata() to fetch Portal-managed SEO data\n * \n * @example\n * ```tsx\n * export async function generateMetadata({ params }) {\n * return getManagedMetadata({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: `/services/${params.slug}`,\n * fallback: {\n * title: 'Our Services',\n * description: 'Learn about our services'\n * }\n * })\n * }\n * ```\n */\nexport async function getManagedMetadata(\n options: GetManagedMetadataOptions\n): Promise<ManagedMetadataResult> {\n const { path, fallback = {}, overrides = {}, favicon: faviconMode = 'metadata' } = options\n const omitIcons = faviconMode === 'component'\n\n const result = await getSEOPageData(path)\n const pageData = result?.page\n const projectData = result?.project\n\n // If no managed data, return fallback (still include favicon from project if available, unless using component)\n if (!pageData) {\n const fallbackMeta: ManagedMetadataResult = {\n ...fallback,\n ...overrides,\n _managed: false,\n _source: 'fallback',\n } as ManagedMetadataResult\n\n if (!omitIcons && projectData?.logo_url) {\n fallbackMeta.icons = {\n icon: projectData.logo_url,\n apple: projectData.logo_url,\n }\n }\n\n return fallbackMeta\n }\n\n // Build metadata from managed values, falling back to provided fallbacks\n const metadata: ManagedMetadataResult = {\n _managed: true,\n _source: 'database',\n }\n\n if (!omitIcons && projectData?.logo_url) {\n metadata.icons = {\n icon: projectData.logo_url,\n apple: projectData.logo_url,\n }\n }\n\n // Signal fallback — when page exists but both title & description are empty,\n // trigger Signal AI to generate them (idempotent, saves to DB for next request)\n let signalData: Awaited<ReturnType<typeof ensureMetadata>> = null\n if (!pageData.managed_title && !pageData.managed_meta_description && !pageData.managed_description) {\n try {\n signalData = await ensureMetadata(path)\n } catch {\n // Signal failure is silent — fall through to existing fallback chain\n }\n }\n\n // Title\n if (pageData.managed_title) {\n metadata.title = pageData.managed_title\n } else if (signalData?.managed_title) {\n metadata.title = signalData.managed_title\n metadata._source = 'signal'\n } else if (fallback.title) {\n metadata.title = fallback.title\n }\n\n // Description\n if (pageData.managed_meta_description || pageData.managed_description) {\n metadata.description = pageData.managed_meta_description || pageData.managed_description\n } else if (signalData?.managed_meta_description) {\n metadata.description = signalData.managed_meta_description\n metadata._source = 'signal'\n } else if (fallback.description) {\n metadata.description = fallback.description\n }\n\n // Keywords\n if (pageData.managed_keywords?.length) {\n metadata.keywords = pageData.managed_keywords\n } else if (signalData?.managed_keywords?.length) {\n metadata.keywords = signalData.managed_keywords\n metadata._source = 'signal'\n } else if (fallback.keywords) {\n metadata.keywords = fallback.keywords\n }\n\n // Robots\n if (pageData.managed_robots) {\n metadata.robots = pageData.managed_robots\n }\n\n // Canonical\n if (pageData.managed_canonical) {\n metadata.alternates = {\n ...metadata.alternates,\n canonical: pageData.managed_canonical,\n }\n }\n\n // Open Graph\n const ogTitle = pageData.managed_og_title || pageData.managed_title\n const ogDescription = pageData.managed_og_description || pageData.managed_meta_description || pageData.managed_description\n const ogImage = pageData.managed_og_image\n\n if (ogTitle || ogDescription || ogImage) {\n metadata.openGraph = {\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(ogImage && { images: [{ url: ogImage }] }),\n }\n }\n\n // Twitter (use OG values as fallback)\n if (ogTitle || ogDescription || ogImage) {\n metadata.twitter = {\n card: 'summary_large_image',\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(ogImage && { images: [ogImage] }),\n }\n }\n\n // Apply overrides last\n return {\n ...metadata,\n ...overrides,\n _managed: true,\n _source: 'database',\n }\n}\n\n/**\n * Get A/B test variant for a field\n * \n * @example\n * ```tsx\n * const variant = await getABVariant({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: '/pricing',\n * field: 'title',\n * sessionId: cookies().get('session_id')?.value\n * })\n * \n * if (variant) {\n * // Use variant.value instead of default\n * }\n * ```\n */\nexport async function getABVariant(\n options: GetABVariantOptions\n): Promise<ABTestResult | null> {\n const { path, field, sessionId } = options\n\n const test = await getABTest(path, field)\n\n if (!test) {\n return null\n }\n\n // Determine variant based on session ID or random\n let variant: 'a' | 'b'\n \n if (sessionId) {\n // Consistent variant for same session\n const hash = sessionId.split('').reduce((acc, char) => {\n return ((acc << 5) - acc) + char.charCodeAt(0)\n }, 0)\n variant = (Math.abs(hash) % 100) < (test.traffic_split * 100) ? 'a' : 'b'\n } else {\n // Random variant\n variant = Math.random() < test.traffic_split ? 'a' : 'b'\n }\n\n // Record impression (fire and forget)\n recordABImpression(test.id, variant, sessionId).catch(() => {\n // Silently fail - don't block rendering\n })\n\n return {\n testId: test.id,\n variant,\n value: variant === 'a' ? test.variant_a : test.variant_b,\n }\n}\n\n/**\n * Get managed metadata with A/B test support\n * \n * Automatically applies running A/B test variants to metadata\n */\nexport async function getManagedMetadataWithAB(\n options: GetManagedMetadataOptions & { sessionId?: string }\n): Promise<ManagedMetadataResult> {\n const { sessionId, ...metadataOptions } = options\n \n // Get base metadata\n const metadata = await getManagedMetadata(metadataOptions)\n\n // Check for title A/B test\n const titleTest = await getABVariant({\n path: options.path,\n field: 'title',\n sessionId,\n })\n\n if (titleTest) {\n metadata.title = titleTest.value\n }\n\n // Check for description A/B test\n const descTest = await getABVariant({\n path: options.path,\n field: 'description',\n sessionId,\n })\n\n if (descTest) {\n metadata.description = descTest.value\n }\n\n return metadata\n}\n","/**\n * @sonordev/site-kit/seo - withManagedMetadata\n *\n * Higher-order function that wraps Next.js generateMetadata to auto-merge\n * Portal-managed SEO data. Portal values serve as defaults; page-level\n * metadata returned by the caller takes priority.\n *\n * @example Zero-config (Portal manages everything):\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about')\n * ```\n *\n * @example With local overrides:\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about', async () => ({\n * title: 'About Us',\n * }))\n * ```\n *\n * @example Dynamic paths:\n * ```ts\n * export const generateMetadata = withManagedMetadata(\n * async ({ params }) => `/services/${(await params).slug}`\n * )\n * ```\n */\n\nimport type { Metadata, ResolvingMetadata } from 'next'\nimport { getManagedMetadata } from './getManagedMetadata'\n\ntype MetadataArgs = {\n params: Promise<Record<string, string>>\n searchParams?: Promise<Record<string, string>>\n}\n\ntype PathResolver =\n | string\n | ((args: MetadataArgs) => string | Promise<string>)\n\ntype PageMetadataFn = (\n args: MetadataArgs,\n parent: ResolvingMetadata\n) => Promise<Metadata> | Metadata\n\n/**\n * Wrap generateMetadata to auto-merge Portal managed metadata.\n *\n * - `path` can be a static string or a function that derives the path\n * from the page's params.\n * - `pageMetadata` (optional) returns page-specific overrides.\n * Anything it returns wins over Portal values.\n */\nexport function withManagedMetadata(\n path: PathResolver,\n pageMetadata?: PageMetadataFn,\n) {\n return async function generateMetadata(\n args: MetadataArgs,\n parent: ResolvingMetadata,\n ): Promise<Metadata> {\n const resolvedPath =\n typeof path === 'function' ? await path(args) : path\n\n // Fetch managed metadata from Portal (acts as defaults)\n const managed = await getManagedMetadata({ path: resolvedPath })\n\n // If no page-specific function, just return managed\n if (!pageMetadata) {\n return managed\n }\n\n // Get page-specific metadata (overrides managed)\n const pageSpecific = await pageMetadata(args, parent)\n\n // Deep merge: page-specific wins over managed\n return {\n ...managed,\n ...pageSpecific,\n openGraph: {\n ...(managed.openGraph as Record<string, unknown> | undefined),\n ...(pageSpecific.openGraph as Record<string, unknown> | undefined),\n },\n twitter: {\n ...(managed.twitter as Record<string, unknown> | undefined),\n ...(pageSpecific.twitter as Record<string, unknown> | undefined),\n },\n } as Metadata\n }\n}\n","import * as React from 'react'\nimport { getSchemaMarkups, getEntityEnhancedSchema, getSEOPageData } from './server-api'\nimport type { ManagedSchemaProps } from './types'\n\n/**\n * Speakable configuration for schema markup\n */\nexport interface SpeakableSpec {\n /** CSS selectors for speakable content */\n cssSelector?: string[]\n /** XPath selectors for speakable content */\n xpath?: string[]\n}\n\n/**\n * Extended schema props with speakable and entity support\n */\nexport interface EnhancedManagedSchemaProps extends ManagedSchemaProps {\n /** Add speakable specification to page schema */\n speakable?: SpeakableSpec | boolean\n /** Page type for speakable (WebPage or Article) */\n pageType?: 'WebPage' | 'Article'\n /** Page name for speakable schema */\n pageName?: string\n /** Page URL for speakable schema */\n pageUrl?: string\n /** Include entity-enhanced schema from knowledge graph (AI Visibility) */\n includeEntityGraph?: boolean\n}\n\n/**\n * Default speakable selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = [\n 'h1',\n '[data-speakable=\"true\"]',\n '.page-summary',\n '.key-points',\n '.aeo-block[data-speakable=\"true\"]',\n]\n\n/**\n * ManagedSchema - Server Component that injects JSON-LD schema\n * \n * Fetches schema markup from Portal and renders as script tags.\n * Now with speakable support for voice assistants and AI systems.\n * \n * @example\n * ```tsx\n * // app/services/[slug]/page.tsx\n * import { ManagedSchema } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <ManagedSchema \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * speakable={true}\n * pageName=\"Family Law Services\"\n * pageUrl=\"https://example.com/services/family-law\"\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nexport async function ManagedSchema({\n path,\n additionalSchemas = [],\n includeTypes,\n excludeTypes,\n speakable,\n pageType = 'WebPage',\n pageName,\n pageUrl,\n includeEntityGraph = true,\n}: EnhancedManagedSchemaProps): Promise<React.ReactElement | null> {\n // Fetch managed schemas from seo_schema_markup table (explicit schemas)\n const schemas = await getSchemaMarkups(path, {\n includeTypes,\n excludeTypes,\n })\n\n // Fetch page data to get auto-generated managed_schema from Signal meta optimization\n const pageData = await getSEOPageData(path)\n\n // Fetch entity-enhanced schemas if enabled\n let entitySchemas: object[] = []\n if (includeEntityGraph) {\n try {\n entitySchemas = await getEntityEnhancedSchema(path)\n } catch {\n // Entity graph unavailable — continue without\n }\n }\n\n const page = pageData?.page\n const siteUrl = pageData?.project?.site_url || ''\n\n // Combine all schemas: entity-enhanced + managed + page-auto-generated + additional\n const allSchemas = [\n ...entitySchemas,\n ...schemas.map((s: { schema_json?: object }) => s.schema_json),\n // Include auto-generated schema from Signal meta optimization\n ...(page?.managed_schema ? [page.managed_schema] : []),\n ...additionalSchemas,\n ]\n\n // Auto-generate BreadcrumbList if none exists and path has segments\n const hasBreadcrumb = allSchemas.some(\n (s) => s && typeof s === 'object' && (s as Record<string, unknown>)['@type'] === 'BreadcrumbList'\n )\n if (!hasBreadcrumb && path !== '/' && siteUrl) {\n allSchemas.push(createBreadcrumbSchema(siteUrl, path))\n }\n\n // Add speakable schema if requested\n if (speakable && pageName && pageUrl) {\n const speakableSchema = createSpeakableWebPageSchema(\n pageType,\n pageName,\n pageUrl,\n typeof speakable === 'object' ? speakable : undefined\n )\n allSchemas.push(speakableSchema)\n }\n\n // If still empty, try entity-enhanced schema as last-resort fallback\n if (allSchemas.length === 0 && !includeEntityGraph) {\n try {\n const fallbackSchemas = await getEntityEnhancedSchema(path)\n allSchemas.push(...fallbackSchemas)\n } catch {\n // Silent fallback\n }\n }\n\n if (allSchemas.length === 0) {\n return null\n }\n\n // If multiple schemas, wrap in @graph\n const schemaContent = allSchemas.length === 1\n ? allSchemas[0]\n : {\n '@context': 'https://schema.org',\n '@graph': allSchemas\n .filter(s => s && typeof s === 'object')\n .map(s => {\n // Remove @context from individual schemas when in graph\n const { '@context': _, ...rest } = s as Record<string, unknown>\n return rest\n }),\n }\n\n // Add @context if not in graph mode\n const finalSchema = allSchemas.length === 1\n ? { '@context': 'https://schema.org', ...schemaContent as Record<string, unknown> }\n : schemaContent\n\n return (\n <script\n type=\"application/ld+json\"\n async\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(finalSchema, null, 0),\n }}\n />\n )\n}\n\n/**\n * LLMSchema - Server Component that injects LLM-optimized structured data\n * \n * This component renders AI-visibility optimized data that helps LLM crawlers\n * (like ChatGPT, Claude, Perplexity) better understand page content.\n * \n * The schema includes:\n * - Detailed description (100-200 words for context)\n * - Keywords and topics\n * - Target audience\n * - Content relationships\n * \n * @example\n * ```tsx\n * import { LLMSchema } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <LLMSchema \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nexport async function LLMSchema({\n path,\n}: {\n projectId?: string\n path: string\n}): Promise<React.ReactElement | null> {\n const { page: pageData } = await getSEOPageData(path)\n\n if (!pageData?.managed_llm_schema) {\n return null\n }\n\n // Render as a special JSON-LD type that LLM crawlers can parse\n const llmSchema = {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n ...pageData.managed_llm_schema,\n // Add AI-specific metadata hints\n additionalType: 'https://uptrade.ai/ns/LLMOptimizedContent',\n }\n\n return (\n <script\n type=\"application/ld+json\"\n data-llm-optimized=\"true\"\n async\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(llmSchema, null, 0),\n }}\n />\n )\n}\n\n/**\n * Generate schema for a specific type with managed data\n * \n * Helper to create common schema types\n */\nexport function createSchema(\n type: string,\n data: Record<string, unknown>\n): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': type,\n ...data,\n }\n}\n\n/**\n * Create a WebPage or Article schema with speakable specification\n * \n * This helps voice assistants and AI systems identify key content to read aloud.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\nexport function createSpeakableWebPageSchema(\n type: 'WebPage' | 'Article',\n name: string,\n url: string,\n speakable?: SpeakableSpec\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n if (speakable?.cssSelector?.length) {\n speakableSpec.cssSelector = speakable.cssSelector\n } else if (speakable?.xpath?.length) {\n speakableSpec.xpath = speakable.xpath\n } else {\n // Use default selectors\n speakableSpec.cssSelector = DEFAULT_SPEAKABLE_SELECTORS\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n }\n}\n\n/**\n * Create BreadcrumbList schema from path\n */\nexport function createBreadcrumbSchema(\n baseUrl: string,\n path: string,\n labels?: Record<string, string>\n): Record<string, unknown> {\n const segments = path.split('/').filter(Boolean)\n \n const items = segments.map((segment, index) => {\n const itemPath = '/' + segments.slice(0, index + 1).join('/')\n const label = labels?.[segment] || segment.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n \n return {\n '@type': 'ListItem',\n position: index + 1,\n name: label,\n item: `${baseUrl}${itemPath}`,\n }\n })\n\n // Add home as first item\n items.unshift({\n '@type': 'ListItem',\n position: 0,\n name: 'Home',\n item: baseUrl,\n })\n\n // Re-number positions\n items.forEach((item, index) => {\n item.position = index + 1\n })\n\n return createSchema('BreadcrumbList', {\n itemListElement: items,\n })\n}\n\nexport default ManagedSchema\n","import * as React from 'react'\nimport { getFAQData } from './server-api'\nimport type { ManagedFAQProps, FAQItem } from './types'\nimport { createSchema } from './ManagedSchema'\n\n/**\n * Inline styles for the accordion FAQ (no external CSS dependency)\n */\nconst faqStyles = `\n.uptrade-faq-items {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.uptrade-faq-item {\n border-bottom: 1px solid rgba(0,0,0,0.08);\n}\n.uptrade-faq-item:first-child {\n border-top: 1px solid rgba(0,0,0,0.08);\n}\n.uptrade-faq-item summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding: 1.25rem 0;\n font-weight: 600;\n font-size: 1.05rem;\n line-height: 1.5;\n color: inherit;\n list-style: none;\n user-select: none;\n transition: color 0.15s ease;\n}\n.uptrade-faq-item summary:hover {\n opacity: 0.8;\n}\n.uptrade-faq-item summary::-webkit-details-marker {\n display: none;\n}\n.uptrade-faq-item summary::marker {\n display: none;\n content: '';\n}\n.uptrade-faq-chevron {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 1rem;\n transition: transform 0.2s ease;\n opacity: 0.5;\n}\n.uptrade-faq-item[open] .uptrade-faq-chevron {\n transform: rotate(180deg);\n}\n.uptrade-faq-answer {\n padding: 0 0 1.25rem 0;\n color: rgba(0,0,0,0.6);\n line-height: 1.75;\n font-size: 0.95rem;\n}\n.uptrade-faq-answer p {\n margin: 0 0 0.75rem 0;\n}\n.uptrade-faq-answer p:last-child {\n margin-bottom: 0;\n}\n.uptrade-faq-answer ul, .uptrade-faq-answer ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n}\n.uptrade-faq-answer li {\n margin-bottom: 0.25rem;\n}\n.uptrade-faq-answer a {\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.uptrade-faq-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n}\n.uptrade-faq-description {\n color: rgba(0,0,0,0.6);\n margin-bottom: 2rem;\n font-size: 1rem;\n line-height: 1.6;\n}\n`\n\n/**\n * Chevron SVG (no icon library dependency)\n */\nfunction ChevronDown() {\n return (\n <svg\n className=\"uptrade-faq-chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\n/**\n * Default FAQ item renderer – uses native <details>/<summary> for toggle\n */\nfunction DefaultFAQItem({ item, index }: { item: FAQItem; index: number }) {\n return (\n <details key={item.id} className=\"uptrade-faq-item\">\n <summary>\n <span>{item.question}</span>\n <ChevronDown />\n </summary>\n <div\n className=\"uptrade-faq-answer\"\n dangerouslySetInnerHTML={{ __html: item.answer }}\n />\n </details>\n )\n}\n\n/**\n * Generate FAQ schema from items\n * \n * IMPORTANT: This is the ONLY place FAQ schema (FAQPage) is generated.\n * The CLI setup command does NOT generate FAQ schema - it only extracts/uploads\n * FAQ data to the Portal. This component then dynamically generates the schema\n * from that data, ensuring FAQ changes in Portal automatically update the schema.\n */\nfunction generateFAQSchema(items: FAQItem[]): Record<string, unknown> {\n return createSchema('FAQPage', {\n mainEntity: items\n .filter(item => item.is_visible)\n .map(item => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n })\n}\n\n/**\n * ManagedFAQ - Server Component that renders FAQ section with schema\n * \n * Fetches FAQ content from Portal and renders with optional schema injection\n * \n * @example\n * ```tsx\n * // app/services/plumbing/page.tsx\n * import { ManagedFAQ } from '@sonordev/seo'\n * \n * export default async function PlumbingPage() {\n * return (\n * <main>\n * <h1>Plumbing Services</h1>\n * <section>\n * <ManagedFAQ \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path=\"/services/plumbing\"\n * showTitle\n * includeSchema\n * />\n * </section>\n * </main>\n * )\n * }\n * ```\n */\nexport async function ManagedFAQ({\n path,\n className,\n renderItem,\n includeSchema = true,\n showTitle = true,\n}: ManagedFAQProps): Promise<React.ReactElement | null> {\n const faqData = await getFAQData(path)\n\n if (!faqData || !faqData.items?.length) {\n return null\n }\n\n const visibleItems = faqData.items.filter((item: FAQItem) => item.is_visible)\n \n if (visibleItems.length === 0) {\n return null\n }\n\n // Sort by order\n visibleItems.sort((a: FAQItem, b: FAQItem) => a.order - b.order)\n\n const shouldIncludeSchema = includeSchema && faqData.include_schema\n\n return (\n <>\n {shouldIncludeSchema && (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(generateFAQSchema(visibleItems), null, 0),\n }}\n />\n )}\n {/* Embedded styles for accordion FAQ (no external CSS file needed) */}\n <style dangerouslySetInnerHTML={{ __html: faqStyles }} />\n <div className={className || 'uptrade-faq'}>\n {showTitle && faqData.title && (\n <h2 className=\"uptrade-faq-title\">{faqData.title}</h2>\n )}\n {faqData.description && (\n <p className=\"uptrade-faq-description\">{faqData.description}</p>\n )}\n <div className=\"uptrade-faq-items\">\n {visibleItems.map((item: FAQItem, index: number) => \n renderItem \n ? renderItem(item, index)\n : <DefaultFAQItem key={item.id} item={item} index={index} />\n )}\n </div>\n </div>\n </>\n )\n}\n\nexport default ManagedFAQ\n","import * as React from 'react'\nimport { getInternalLinks } from './server-api'\nimport type { ManagedInternalLinksProps, ManagedLink } from './types'\n\n/**\n * Default link renderer\n */\nfunction DefaultLinkRenderer({ link }: { link: ManagedLink }) {\n const href = link.target_url || link.target_path\n \n return (\n <a \n key={link.id}\n href={href}\n className=\"uptrade-internal-link\"\n >\n {link.anchor_text}\n </a>\n )\n}\n\n/**\n * ManagedInternalLinks - Server Component for AI-suggested internal links\n * \n * Fetches internal link suggestions from Portal and renders them\n * \n * @example\n * ```tsx\n * // In your article component\n * import { ManagedInternalLinks } from '@sonordev/seo'\n * \n * export default async function BlogPost({ params }) {\n * return (\n * <article>\n * <p>Your content here...</p>\n * \n * <ManagedInternalLinks \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/blog/${params.slug}`}\n * position=\"bottom\"\n * limit={5}\n * />\n * </article>\n * )\n * }\n * ```\n */\nexport async function ManagedInternalLinks({\n path,\n position = 'bottom',\n limit = 5,\n className,\n renderLink,\n}: ManagedInternalLinksProps): Promise<React.ReactElement | null> {\n const links = await getInternalLinks(path, { position, limit })\n\n if (!links.length) {\n return null\n }\n\n const containerClass = className || `uptrade-internal-links uptrade-internal-links--${position}`\n\n // Different layouts based on position\n if (position === 'inline') {\n // Inline links are meant to be inserted into content\n return (\n <span className={containerClass}>\n {links.map((link: ManagedLink) => \n renderLink ? renderLink(link) : <DefaultLinkRenderer key={link.id} link={link} />\n )}\n </span>\n )\n }\n\n if (position === 'sidebar') {\n return (\n <aside className={containerClass}>\n <h4 className=\"uptrade-internal-links-title\">Related Pages</h4>\n <ul className=\"uptrade-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </aside>\n )\n }\n\n if (position === 'related') {\n return (\n <nav className={containerClass} aria-label=\"Related content\">\n <h3 className=\"uptrade-internal-links-title\">You May Also Like</h3>\n <div className=\"uptrade-internal-links-grid\">\n {links.map((link: ManagedLink) => (\n <div key={link.id} className=\"uptrade-internal-link-card\">\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n {link.context && (\n <p className=\"uptrade-internal-link-context\">{link.context}</p>\n )}\n </div>\n ))}\n </div>\n </nav>\n )\n }\n\n // Default: bottom position\n return (\n <div className={containerClass}>\n <h4 className=\"uptrade-internal-links-title\">Related Articles</h4>\n <ul className=\"uptrade-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport default ManagedInternalLinks\n","import * as React from 'react'\nimport { getContentBlock, getEntities, getPrimaryEntity } from './server-api'\nimport type { ManagedContentProps, ManagedContentBlock, SEOEntity } from './types'\n\n/**\n * Parse and render markdown content (basic support)\n * For full markdown, use a proper parser in your custom renderer\n */\nfunction renderMarkdown(content: string): string {\n return content\n // Headers\n .replace(/^### (.*$)/gim, '<h3>$1</h3>')\n .replace(/^## (.*$)/gim, '<h2>$1</h2>')\n .replace(/^# (.*$)/gim, '<h1>$1</h1>')\n // Bold\n .replace(/\\*\\*(.*)\\*\\*/gim, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.*)\\*/gim, '<em>$1</em>')\n // Links\n .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>')\n // Paragraphs\n .replace(/\\n\\n/gim, '</p><p>')\n .replace(/^(.+)$/gim, '<p>$1</p>')\n}\n\n/**\n * Inject entity annotations into HTML content\n * Wraps entity mentions with data-sonor-entity attributes for knowledge graph linking\n */\nfunction injectEntityAnnotations(html: string, entities: SEOEntity[]): string {\n if (!entities.length) return html\n \n let annotatedHtml = html\n \n // Sort entities by name length (longest first) to avoid partial matches\n const sortedEntities = [...entities].sort((a, b) => b.name.length - a.name.length)\n \n for (const entity of sortedEntities) {\n // Skip very short names to avoid false positives\n if (entity.name.length < 3) continue\n \n // Create case-insensitive regex for entity name\n // Avoid matching inside HTML tags or existing annotations\n const regex = new RegExp(\n `(?<![\\\\w-])(?<!data-sonor-entity=\")${escapeRegExp(entity.name)}(?![\\\\w-])`,\n 'gi'\n )\n \n // Determine schema type for microdata\n const schemaType = getSchemaTypeForEntity(entity.entity_type)\n \n annotatedHtml = annotatedHtml.replace(regex, (match) => {\n return `<span class=\"aeo-entity aeo-entity-${entity.entity_type}\" ` +\n `data-sonor-entity=\"${entity.id}\" ` +\n `data-sonor-entity-type=\"${entity.entity_type}\" ` +\n `data-sonor-entity-name=\"${entity.name}\" ` +\n `itemscope itemtype=\"https://schema.org/${schemaType}\">` +\n `<span itemprop=\"name\">${match}</span></span>`\n })\n }\n \n return annotatedHtml\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getSchemaTypeForEntity(entityType: string): string {\n const typeMap: Record<string, string> = {\n organization: 'Organization',\n person: 'Person',\n service: 'Service',\n product: 'Product',\n location: 'Place',\n concept: 'Thing',\n credential: 'EducationalOccupationalCredential',\n }\n return typeMap[entityType] || 'Thing'\n}\n\n/**\n * ManagedContent - Server Component for CMS-controlled content blocks\n * \n * Fetches content sections from Portal and renders them\n * Supports HTML, Markdown, JSON, and React component references\n * \n * @example\n * ```tsx\n * // Hero section managed by Portal\n * import { ManagedContent } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <main>\n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"hero\"\n * fallback={<DefaultHero />}\n * />\n * \n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"features\"\n * />\n * \n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"cta\"\n * />\n * </main>\n * )\n * }\n * ```\n */\nexport async function ManagedContent({\n path,\n section,\n fallback,\n className,\n components = {},\n injectEntityAnnotations: shouldInjectEntities = false,\n}: ManagedContentProps): Promise<React.ReactElement | null> {\n const block = await getContentBlock(path, section)\n\n if (!block) {\n if (fallback) {\n return <>{fallback}</>\n }\n return null\n }\n\n // Fetch entities if annotation is enabled\n let entities: SEOEntity[] = []\n if (shouldInjectEntities) {\n try {\n entities = await getEntities() as SEOEntity[]\n } catch (err) {\n console.warn('@sonordev/seo: Failed to fetch entities for annotation:', err)\n }\n }\n\n const containerClass = className || `uptrade-content uptrade-content--${section}`\n\n // Helper to process HTML with optional entity injection\n const processHtml = (html: string): string => {\n if (shouldInjectEntities && entities.length > 0) {\n return injectEntityAnnotations(html, entities)\n }\n return html\n }\n\n // Handle different content types\n switch (block.content_type) {\n case 'html':\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: processHtml(block.content as string) }}\n />\n )\n\n case 'markdown':\n const htmlContent = processHtml(renderMarkdown(block.content as string))\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n )\n\n case 'json':\n // JSON content for structured data - render as data attributes or custom handling\n const jsonData = typeof block.content === 'string' \n ? JSON.parse(block.content)\n : block.content\n\n return (\n <div \n className={containerClass}\n data-content={JSON.stringify(jsonData)}\n >\n {/* Render JSON structure - customize based on your needs */}\n {jsonData.title && <h2>{jsonData.title}</h2>}\n {jsonData.subtitle && <p className=\"subtitle\">{jsonData.subtitle}</p>}\n {jsonData.content && <div dangerouslySetInnerHTML={{ __html: jsonData.content }} />}\n {jsonData.items && (\n <ul>\n {jsonData.items.map((item: { text: string } | string, index: number) => (\n <li key={index}>{typeof item === 'string' ? item : item.text}</li>\n ))}\n </ul>\n )}\n </div>\n )\n\n case 'react':\n // React component reference - lookup from provided components map\n const componentData = typeof block.content === 'string'\n ? JSON.parse(block.content)\n : block.content as Record<string, unknown>\n\n const componentName = componentData.component as string\n const componentProps = componentData.props as Record<string, unknown> || {}\n\n const Component = components[componentName]\n \n if (!Component) {\n console.warn(`@sonordev/seo: Component \"${componentName}\" not found in components map`)\n return fallback ? <>{fallback}</> : null\n }\n\n return (\n <div className={containerClass}>\n <Component {...componentProps} />\n </div>\n )\n\n default:\n console.warn(`@sonordev/seo: Unknown content type \"${block.content_type}\"`)\n return fallback ? <>{fallback}</> : null\n }\n}\n\n/**\n * Get content block data without rendering\n * \n * Useful when you need to access the raw data\n */\nexport async function getManagedContentData(\n path: string,\n section: string\n): Promise<ManagedContentBlock | null> {\n return getContentBlock(path, section)\n}\n\nexport default ManagedContent\n","/**\n * LocationPageContent - Server Component for fetching location page sections\n * \n * Usage:\n * <LocationPageContent \n * projectId=\"uuid\" \n * path=\"/areas/seattle-wa/plumbing\" \n * section=\"hero\" \n * />\n * \n * This component fetches content from seo_location_pages.sections for a given\n * path and section, making it editable in Portal without code deploys.\n */\n\nimport * as React from 'react'\nimport { cache } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocationPageContentProps {\n /** Uptrade project ID */\n projectId: string\n /** Page path (e.g., /areas/seattle-wa/plumbing) */\n path: string\n /** Section ID or type to fetch (e.g., \"hero\", \"intro\", \"services\") */\n section: string\n /** Fallback content if section not found */\n fallback?: React.ReactNode\n /** Additional className for wrapper */\n className?: string\n /** Custom renderer for the section data */\n render?: (data: LocationSectionData) => React.ReactNode\n}\n\nexport interface LocationSectionData {\n type: string\n content: any\n}\n\nexport interface HeroSectionContent {\n title: string\n subtitle?: string\n cta_text?: string\n cta_href?: string\n stats?: Array<{ label: string; value: string }>\n background_image?: string\n}\n\nexport interface ServiceGridContent {\n services: Array<{\n title: string\n description: string\n href: string\n icon?: string\n }>\n}\n\nexport interface TextSectionContent {\n heading?: string\n paragraphs: string[]\n html?: string\n}\n\n// ============================================\n// API Config\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com'\n return { apiUrl }\n}\n\n// ============================================\n// Cached API Call\n// ============================================\n\n/**\n * Fetch location page section content from Portal\n * Cached with React's cache() for request deduplication\n */\nexport const getLocationSection = cache(async (\n projectId: string,\n path: string,\n section: string\n): Promise<LocationSectionData | null> => {\n const { apiUrl } = getApiConfig()\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/location-content`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_id: projectId,\n path,\n section,\n }),\n next: { revalidate: 3600 }, // Cache for 1 hour\n })\n \n if (!response.ok) {\n console.error(`LocationPageContent: Failed to fetch section \"${section}\" for path \"${path}\"`)\n return null\n }\n \n const data = await response.json()\n return data\n } catch (error) {\n console.error('LocationPageContent: API error:', error)\n return null\n }\n})\n\n// ============================================\n// Default Renderers\n// ============================================\n\nfunction HeroRenderer({ data, className }: { data: HeroSectionContent; className?: string }) {\n return (\n <section className={className || 'location-hero'}>\n <h1>{data.title}</h1>\n {data.subtitle && <p className=\"subtitle\">{data.subtitle}</p>}\n {data.stats && (\n <div className=\"stats-grid\">\n {data.stats.map((stat, i) => (\n <div key={i} className=\"stat\">\n <span className=\"stat-value\">{stat.value}</span>\n <span className=\"stat-label\">{stat.label}</span>\n </div>\n ))}\n </div>\n )}\n {data.cta_text && data.cta_href && (\n <a href={data.cta_href} className=\"cta-button\">\n {data.cta_text}\n </a>\n )}\n </section>\n )\n}\n\nfunction TextRenderer({ data, className }: { data: TextSectionContent; className?: string }) {\n if (data.html) {\n return (\n <section \n className={className || 'location-text'} \n dangerouslySetInnerHTML={{ __html: data.html }} \n />\n )\n }\n \n return (\n <section className={className || 'location-text'}>\n {data.heading && <h2>{data.heading}</h2>}\n {data.paragraphs.map((p, i) => (\n <p key={i}>{p}</p>\n ))}\n </section>\n )\n}\n\nfunction ServicesGridRenderer({ data, className }: { data: ServiceGridContent; className?: string }) {\n return (\n <section className={className || 'location-services-grid'}>\n <div className=\"services-list\">\n {data.services.map((service, i) => (\n <a key={i} href={service.href} className=\"service-card\">\n {service.icon && <span className=\"service-icon\">{service.icon}</span>}\n <h3>{service.title}</h3>\n <p>{service.description}</p>\n </a>\n ))}\n </div>\n </section>\n )\n}\n\nfunction DefaultRenderer({ data, className }: { data: any; className?: string }) {\n // Fallback: just render as JSON for debugging\n if (process.env.NODE_ENV === 'development') {\n return (\n <section className={className}>\n <pre style={{ fontSize: '12px', background: '#f0f0f0', padding: '1rem' }}>\n {JSON.stringify(data, null, 2)}\n </pre>\n </section>\n )\n }\n \n // In production, try to render content as text/html\n if (typeof data.content === 'string') {\n return (\n <section \n className={className} \n dangerouslySetInnerHTML={{ __html: data.content }} \n />\n )\n }\n \n return null\n}\n\n// ============================================\n// Main Component\n// ============================================\n\n/**\n * LocationPageContent - Server Component\n * \n * Fetches and renders a section of a location page from Portal.\n * Content is fully editable in Portal → SEO → Location Pages.\n */\nexport async function LocationPageContent({\n projectId,\n path,\n section,\n fallback = null,\n className,\n render,\n}: LocationPageContentProps): Promise<React.ReactElement | null> {\n const data = await getLocationSection(projectId, path, section)\n \n if (!data) {\n return fallback as React.ReactElement | null\n }\n \n // If custom renderer provided, use it\n if (render) {\n return <>{render(data)}</>\n }\n \n // Use default renderers based on section type\n switch (data.type) {\n case 'hero':\n return <HeroRenderer data={data.content as HeroSectionContent} className={className} />\n \n case 'text':\n case 'intro':\n case 'about':\n case 'about_location':\n return <TextRenderer data={data.content as TextSectionContent} className={className} />\n \n case 'services_grid':\n case 'services':\n return <ServicesGridRenderer data={data.content as ServiceGridContent} className={className} />\n \n default:\n return <DefaultRenderer data={data} className={className} />\n }\n}\n\n// Export types for external use\nexport type {\n HeroSectionContent as LocationHeroContent,\n ServiceGridContent as LocationServicesContent,\n TextSectionContent as LocationTextContent,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/seo/getManagedMetadata.ts","../../src/seo/withManagedMetadata.ts","../../src/seo/ManagedSchema.tsx","../../src/seo/ManagedFAQ.tsx","../../src/seo/ManagedInternalLinks.tsx","../../src/seo/ManagedContent.tsx","../../src/seo/LocationPageContent.tsx"],"names":["getSEOPageData","ensureMetadata","getABTest","recordABImpression","getSchemaMarkups","getEntityEnhancedSchema","jsx","jsxs","getFAQData","Fragment","getInternalLinks","getContentBlock","getEntities","cache"],"mappings":";;;;;;;;;;;AA4BA,eAAsB,mBACpB,OAAA,EACgC;AAChC,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,GAAW,EAAC,EAAG,SAAA,GAAY,EAAC,EAAG,OAAA,EAAS,WAAA,GAAc,UAAA,EAAW,GAAI,OAAA;AACnF,EAAA,MAAM,YAAY,WAAA,KAAgB,WAAA;AAElC,EAAA,MAAM,MAAA,GAAS,MAAMA,+BAAA,CAAe,IAAI,CAAA;AACxC,EAAA,MAAM,WAAW,MAAA,EAAQ,IAAA;AACzB,EAAA,MAAM,cAAc,MAAA,EAAQ,OAAA;AAG5B,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,YAAA,GAAsC;AAAA,MAC1C,GAAG,QAAA;AAAA,MACH,GAAG,SAAA;AAAA,MACH,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS;AAAA,KACX;AAEA,IAAA,IAAI,CAAC,SAAA,IAAa,WAAA,EAAa,QAAA,EAAU;AACvC,MAAA,YAAA,CAAa,KAAA,GAAQ;AAAA,QACnB,MAAM,WAAA,CAAY,QAAA;AAAA,QAClB,OAAO,WAAA,CAAY;AAAA,OACrB;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAkC;AAAA,IACtC,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,IAAI,CAAC,SAAA,IAAa,WAAA,EAAa,QAAA,EAAU;AACvC,IAAA,QAAA,CAAS,KAAA,GAAQ;AAAA,MACf,MAAM,WAAA,CAAY,QAAA;AAAA,MAClB,OAAO,WAAA,CAAY;AAAA,KACrB;AAAA,EACF;AAIA,EAAA,IAAI,UAAA,GAAyD,IAAA;AAC7D,EAAA,IAAI,CAAC,SAAS,aAAA,IAAiB,CAAC,SAAS,wBAAA,IAA4B,CAAC,SAAS,mBAAA,EAAqB;AAClG,IAAA,IAAI;AACF,MAAA,UAAA,GAAa,MAAMC,gCAAe,IAAI,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,aAAA,EAAe;AAC1B,IAAA,QAAA,CAAS,QAAQ,QAAA,CAAS,aAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,YAAY,aAAA,EAAe;AACpC,IAAA,QAAA,CAAS,QAAQ,UAAA,CAAW,aAAA;AAC5B,IAAA,QAAA,CAAS,OAAA,GAAU,QAAA;AAAA,EACrB,CAAA,MAAA,IAAW,SAAS,KAAA,EAAO;AACzB,IAAA,QAAA,CAAS,QAAQ,QAAA,CAAS,KAAA;AAAA,EAC5B;AAGA,EAAA,IAAI,QAAA,CAAS,wBAAA,IAA4B,QAAA,CAAS,mBAAA,EAAqB;AACrE,IAAA,QAAA,CAAS,WAAA,GAAc,QAAA,CAAS,wBAAA,IAA4B,QAAA,CAAS,mBAAA;AAAA,EACvE,CAAA,MAAA,IAAW,YAAY,wBAAA,EAA0B;AAC/C,IAAA,QAAA,CAAS,cAAc,UAAA,CAAW,wBAAA;AAClC,IAAA,QAAA,CAAS,OAAA,GAAU,QAAA;AAAA,EACrB,CAAA,MAAA,IAAW,SAAS,WAAA,EAAa;AAC/B,IAAA,QAAA,CAAS,cAAc,QAAA,CAAS,WAAA;AAAA,EAClC;AAGA,EAAA,IAAI,QAAA,CAAS,kBAAkB,MAAA,EAAQ;AACrC,IAAA,QAAA,CAAS,WAAW,QAAA,CAAS,gBAAA;AAAA,EAC/B,CAAA,MAAA,IAAW,UAAA,EAAY,gBAAA,EAAkB,MAAA,EAAQ;AAC/C,IAAA,QAAA,CAAS,WAAW,UAAA,CAAW,gBAAA;AAC/B,IAAA,QAAA,CAAS,OAAA,GAAU,QAAA;AAAA,EACrB,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,QAAA,CAAS,WAAW,QAAA,CAAS,QAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,IAAA,QAAA,CAAS,SAAS,QAAA,CAAS,cAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,SAAS,iBAAA,EAAmB;AAC9B,IAAA,QAAA,CAAS,UAAA,GAAa;AAAA,MACpB,GAAG,QAAA,CAAS,UAAA;AAAA,MACZ,WAAW,QAAA,CAAS;AAAA,KACtB;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,gBAAA,IAAoB,QAAA,CAAS,aAAA;AACtD,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,sBAAA,IAA0B,QAAA,CAAS,4BAA4B,QAAA,CAAS,mBAAA;AACvG,EAAA,MAAM,UAAU,QAAA,CAAS,gBAAA;AAEzB,EAAA,IAAI,OAAA,IAAW,iBAAiB,OAAA,EAAS;AACvC,IAAA,QAAA,CAAS,SAAA,GAAY;AAAA,MACnB,GAAI,OAAA,IAAW,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,MAChC,GAAI,aAAA,IAAiB,EAAE,WAAA,EAAa,aAAA,EAAc;AAAA,MAClD,GAAI,WAAW,EAAE,MAAA,EAAQ,CAAC,EAAE,GAAA,EAAK,OAAA,EAAS,CAAA;AAAE,KAC9C;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,iBAAiB,OAAA,EAAS;AACvC,IAAA,QAAA,CAAS,OAAA,GAAU;AAAA,MACjB,IAAA,EAAM,qBAAA;AAAA,MACN,GAAI,OAAA,IAAW,EAAE,KAAA,EAAO,OAAA,EAAQ;AAAA,MAChC,GAAI,aAAA,IAAiB,EAAE,WAAA,EAAa,aAAA,EAAc;AAAA,MAClD,GAAI,OAAA,IAAW,EAAE,MAAA,EAAQ,CAAC,OAAO,CAAA;AAAE,KACrC;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,GAAG,SAAA;AAAA,IACH,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS;AAAA,GACX;AACF;AAmBA,eAAsB,aACpB,OAAA,EAC8B;AAC9B,EAAA,MAAM,EAAE,IAAA,EAAM,KAAA,EAAO,SAAA,EAAU,GAAI,OAAA;AAEnC,EAAA,MAAM,IAAA,GAAO,MAAMC,0BAAA,CAAU,IAAA,EAAM,KAAK,CAAA;AAExC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,MAAM,IAAA,GAAO,UAAU,KAAA,CAAM,EAAE,EAAE,MAAA,CAAO,CAAC,KAAK,IAAA,KAAS;AACrD,MAAA,OAAA,CAAS,GAAA,IAAO,CAAA,IAAK,GAAA,GAAO,IAAA,CAAK,WAAW,CAAC,CAAA;AAAA,IAC/C,GAAG,CAAC,CAAA;AACJ,IAAA,OAAA,GAAW,IAAA,CAAK,IAAI,IAAI,CAAA,GAAI,MAAQ,IAAA,CAAK,aAAA,GAAgB,MAAO,GAAA,GAAM,GAAA;AAAA,EACxE,CAAA,MAAO;AAEL,IAAA,OAAA,GAAU,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,CAAK,gBAAgB,GAAA,GAAM,GAAA;AAAA,EACvD;AAGA,EAAAC,mCAAA,CAAmB,KAAK,EAAA,EAAI,OAAA,EAAS,SAAS,CAAA,CAAE,MAAM,MAAM;AAAA,EAE5D,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAQ,IAAA,CAAK,EAAA;AAAA,IACb,OAAA;AAAA,IACA,KAAA,EAAO,OAAA,KAAY,GAAA,GAAM,IAAA,CAAK,YAAY,IAAA,CAAK;AAAA,GACjD;AACF;AAOA,eAAsB,yBACpB,OAAA,EACgC;AAChC,EAAA,MAAM,EAAE,SAAA,EAAW,GAAG,eAAA,EAAgB,GAAI,OAAA;AAG1C,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,eAAe,CAAA;AAGzD,EAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa;AAAA,IACnC,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,KAAA,EAAO,OAAA;AAAA,IACP;AAAA,GACD,CAAA;AAED,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,QAAA,CAAS,QAAQ,SAAA,CAAU,KAAA;AAAA,EAC7B;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa;AAAA,IAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,KAAA,EAAO,aAAA;AAAA,IACP;AAAA,GACD,CAAA;AAED,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,QAAA,CAAS,cAAc,QAAA,CAAS,KAAA;AAAA,EAClC;AAEA,EAAA,OAAO,QAAA;AACT;;;AClMO,SAAS,mBAAA,CACd,MACA,YAAA,EACA;AACA,EAAA,OAAO,eAAe,gBAAA,CACpB,IAAA,EACA,MAAA,EACmB;AACnB,IAAA,MAAM,eACJ,OAAO,IAAA,KAAS,aAAa,MAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAGlD,IAAA,MAAM,UAAU,MAAM,kBAAA,CAAmB,EAAE,IAAA,EAAM,cAAc,CAAA;AAG/D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,OAAA;AAAA,IACT;AAGA,IAAA,MAAM,YAAA,GAAe,MAAM,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAGpD,IAAA,OAAO;AAAA,MACL,GAAG,OAAA;AAAA,MACH,GAAG,YAAA;AAAA,MACH,SAAA,EAAW;AAAA,QACT,GAAI,OAAA,CAAQ,SAAA;AAAA,QACZ,GAAI,YAAA,CAAa;AAAA,OACnB;AAAA,MACA,OAAA,EAAS;AAAA,QACP,GAAI,OAAA,CAAQ,OAAA;AAAA,QACZ,GAAI,YAAA,CAAa;AAAA;AACnB,KACF;AAAA,EACF,CAAA;AACF;ACvDO,IAAM,2BAAA,GAA8B;AAAA,EACzC,IAAA;AAAA,EACA,yBAAA;AAAA,EACA,eAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA;AA6BA,eAAsB,aAAA,CAAc;AAAA,EAClC,IAAA;AAAA,EACA,oBAAoB,EAAC;AAAA,EACrB,YAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,SAAA;AAAA,EACX,QAAA;AAAA,EACA,OAAA;AAAA,EACA,kBAAA,GAAqB;AACvB,CAAA,EAAmE;AAEjE,EAAA,MAAM,OAAA,GAAU,MAAMC,iCAAA,CAAiB,IAAA,EAAM;AAAA,IAC3C,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,QAAA,GAAW,MAAMJ,+BAAA,CAAe,IAAI,CAAA;AAG1C,EAAA,IAAI,gBAA0B,EAAC;AAC/B,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,IAAI;AACF,MAAA,aAAA,GAAgB,MAAMK,yCAAwB,IAAI,CAAA;AAAA,IACpD,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,QAAA,EAAU,IAAA;AACvB,EAAA,MAAM,OAAA,GAAU,QAAA,EAAU,OAAA,EAAS,QAAA,IAAY,EAAA;AAG/C,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,aAAA;AAAA,IACH,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAgC,EAAE,WAAW,CAAA;AAAA;AAAA,IAE7D,GAAI,IAAA,EAAM,cAAA,GAAiB,CAAC,IAAA,CAAK,cAAc,IAAI,EAAC;AAAA,IACpD,GAAG;AAAA,GACL;AAGA,EAAA,MAAM,gBAAgB,UAAA,CAAW,IAAA;AAAA,IAC/B,CAAC,MAAM,CAAA,IAAK,OAAO,MAAM,QAAA,IAAa,CAAA,CAA8B,OAAO,CAAA,KAAM;AAAA,GACnF;AACA,EAAA,IAAI,CAAC,aAAA,IAAiB,IAAA,KAAS,GAAA,IAAO,OAAA,EAAS;AAC7C,IAAA,UAAA,CAAW,IAAA,CAAK,sBAAA,CAAuB,OAAA,EAAS,IAAI,CAAC,CAAA;AAAA,EACvD;AAGA,EAAA,IAAI,SAAA,IAAa,YAAY,OAAA,EAAS;AACpC,IAAA,MAAM,eAAA,GAAkB,4BAAA;AAAA,MACtB,QAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY;AAAA,KAC9C;AACA,IAAA,UAAA,CAAW,KAAK,eAAe,CAAA;AAAA,EACjC;AAGA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,IAAK,CAAC,kBAAA,EAAoB;AAClD,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,MAAMA,wCAAA,CAAwB,IAAI,CAAA;AAC1D,MAAA,UAAA,CAAW,IAAA,CAAK,GAAG,eAAe,CAAA;AAAA,IACpC,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,gBAAgB,UAAA,CAAW,MAAA,KAAW,CAAA,GACxC,UAAA,CAAW,CAAC,CAAA,GACZ;AAAA,IACE,UAAA,EAAY,oBAAA;AAAA,IACZ,QAAA,EAAU,UAAA,CACP,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,IAAK,OAAO,CAAA,KAAM,QAAQ,CAAA,CACtC,GAAA,CAAI,CAAA,CAAA,KAAK;AAER,MAAA,MAAM,EAAE,UAAA,EAAY,CAAA,EAAG,GAAG,MAAK,GAAI,CAAA;AACnC,MAAA,OAAO,IAAA;AAAA,IACT,CAAC;AAAA,GACL;AAGJ,EAAA,MAAM,WAAA,GAAc,WAAW,MAAA,KAAW,CAAA,GACtC,EAAE,UAAA,EAAY,oBAAA,EAAsB,GAAG,aAAA,EAAyC,GAChF,aAAA;AAEJ,EAAA,uBACEC,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,qBAAA;AAAA,MACL,KAAA,EAAK,IAAA;AAAA,MACL,uBAAA,EAAyB;AAAA,QACvB,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,MAAM,CAAC;AAAA;AAC7C;AAAA,GACF;AAEJ;AA+BA,eAAsB,SAAA,CAAU;AAAA,EAC9B;AACF,CAAA,EAGuC;AACrC,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,MAAMN,gCAAe,IAAI,CAAA;AAEpD,EAAA,IAAI,CAAC,UAAU,kBAAA,EAAoB;AACjC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,SAAA;AAAA,IACT,GAAG,QAAA,CAAS,kBAAA;AAAA;AAAA,IAEZ,cAAA,EAAgB;AAAA,GAClB;AAEA,EAAA,uBACEM,cAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,qBAAA;AAAA,MACL,oBAAA,EAAmB,MAAA;AAAA,MACnB,KAAA,EAAK,IAAA;AAAA,MACL,uBAAA,EAAyB;AAAA,QACvB,MAAA,EAAQ,IAAA,CAAK,SAAA,CAAU,SAAA,EAAW,MAAM,CAAC;AAAA;AAC3C;AAAA,GACF;AAEJ;AAOO,SAAS,YAAA,CACd,MACA,IAAA,EACyB;AACzB,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,GAAG;AAAA,GACL;AACF;AAUO,SAAS,4BAAA,CACd,IAAA,EACA,IAAA,EACA,GAAA,EACA,SAAA,EACyB;AACzB,EAAA,MAAM,aAAA,GAAyC;AAAA,IAC7C,OAAA,EAAS;AAAA,GACX;AAEA,EAAA,IAAI,SAAA,EAAW,aAAa,MAAA,EAAQ;AAClC,IAAA,aAAA,CAAc,cAAc,SAAA,CAAU,WAAA;AAAA,EACxC,CAAA,MAAA,IAAW,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ;AACnC,IAAA,aAAA,CAAc,QAAQ,SAAA,CAAU,KAAA;AAAA,EAClC,CAAA,MAAO;AAEL,IAAA,aAAA,CAAc,WAAA,GAAc,2BAAA;AAAA,EAC9B;AAEA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,IAAA;AAAA,IACT,IAAA;AAAA,IACA,GAAA;AAAA,IACA,SAAA,EAAW;AAAA,GACb;AACF;AAKO,SAAS,sBAAA,CACd,OAAA,EACA,IAAA,EACA,MAAA,EACyB;AACzB,EAAA,MAAM,WAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAE/C,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,SAAS,KAAA,KAAU;AAC7C,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,KAAA,CAAM,GAAG,KAAA,GAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAC5D,IAAA,MAAM,KAAA,GAAQ,MAAA,GAAS,OAAO,CAAA,IAAK,QAAQ,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,CAAE,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,CAAA;AAEnG,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,UAAA;AAAA,MACT,UAAU,KAAA,GAAQ,CAAA;AAAA,MAClB,IAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAM,CAAA,EAAG,OAAO,CAAA,EAAG,QAAQ,CAAA;AAAA,KAC7B;AAAA,EACF,CAAC,CAAA;AAGD,EAAA,KAAA,CAAM,OAAA,CAAQ;AAAA,IACZ,OAAA,EAAS,UAAA;AAAA,IACT,QAAA,EAAU,CAAA;AAAA,IACV,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACP,CAAA;AAGD,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AAC7B,IAAA,IAAA,CAAK,WAAW,KAAA,GAAQ,CAAA;AAAA,EAC1B,CAAC,CAAA;AAED,EAAA,OAAO,aAAa,gBAAA,EAAkB;AAAA,IACpC,eAAA,EAAiB;AAAA,GAClB,CAAA;AACH;AC7TA,IAAM,SAAA,GAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAuFlB,SAAS,WAAA,GAAc;AACrB,EAAA,uBACEA,cAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAU,qBAAA;AAAA,MACV,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAe,OAAA;AAAA,MAEf,QAAA,kBAAAA,cAAAA,CAAC,UAAA,EAAA,EAAS,MAAA,EAAO,gBAAA,EAAiB;AAAA;AAAA,GACpC;AAEJ;AAKA,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,KAAA,EAAM,EAAqC;AACzE,EAAA,uBACEC,eAAA,CAAC,SAAA,EAAA,EAAsB,SAAA,EAAU,kBAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,IAAA,CAAK,QAAA,EAAS,CAAA;AAAA,sBACrBA,eAAC,WAAA,EAAA,EAAY;AAAA,KAAA,EACf,CAAA;AAAA,oBACAA,cAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,oBAAA;AAAA,QACV,uBAAA,EAAyB,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA;AAAO;AAAA;AACjD,GAAA,EAAA,EARY,KAAK,EASnB,CAAA;AAEJ;AAUA,SAAS,kBAAkB,KAAA,EAA2C;AACpE,EAAA,OAAO,aAAa,SAAA,EAAW;AAAA,IAC7B,UAAA,EAAY,MACT,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,UAAU,CAAA,CAC9B,IAAI,CAAA,IAAA,MAAS;AAAA,MACZ,OAAA,EAAS,UAAA;AAAA,MACT,MAAM,IAAA,CAAK,QAAA;AAAA,MACX,cAAA,EAAgB;AAAA,QACd,OAAA,EAAS,QAAA;AAAA,QACT,MAAM,IAAA,CAAK;AAAA;AACb,KACF,CAAE;AAAA,GACL,CAAA;AACH;AA6BA,eAAsB,UAAA,CAAW;AAAA,EAC/B,IAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA,GAAgB,IAAA;AAAA,EAChB,SAAA,GAAY;AACd,CAAA,EAAwD;AACtD,EAAA,MAAM,OAAA,GAAU,MAAME,2BAAA,CAAW,IAAI,CAAA;AAErC,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,OAAO,MAAA,EAAQ;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAC,IAAA,KAAkB,KAAK,UAAU,CAAA;AAE5E,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,YAAA,CAAa,KAAK,CAAC,CAAA,EAAY,MAAe,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAE/D,EAAA,MAAM,mBAAA,GAAsB,iBAAiB,OAAA,CAAQ,cAAA;AAErD,EAAA,uBACED,eAAA,CAAAE,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,mBAAA,oBACCH,cAAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,qBAAA;AAAA,QACL,uBAAA,EAAyB;AAAA,UACvB,QAAQ,IAAA,CAAK,SAAA,CAAU,kBAAkB,YAAY,CAAA,EAAG,MAAM,CAAC;AAAA;AACjE;AAAA,KACF;AAAA,oBAGFA,cAAAA,CAAC,OAAA,EAAA,EAAM,yBAAyB,EAAE,MAAA,EAAQ,WAAU,EAAG,CAAA;AAAA,oBACvDC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,SAAA,IAAa,aAAA,EAC1B,QAAA,EAAA;AAAA,MAAA,SAAA,IAAa,OAAA,CAAQ,yBACpBD,cAAAA,CAAC,QAAG,SAAA,EAAU,mBAAA,EAAqB,kBAAQ,KAAA,EAAM,CAAA;AAAA,MAElD,OAAA,CAAQ,+BACPA,cAAAA,CAAC,OAAE,SAAA,EAAU,yBAAA,EAA2B,kBAAQ,WAAA,EAAY,CAAA;AAAA,sBAE9DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBACZ,QAAA,EAAA,YAAA,CAAa,GAAA;AAAA,QAAI,CAAC,IAAA,EAAe,KAAA,KAChC,UAAA,GACI,WAAW,IAAA,EAAM,KAAK,CAAA,mBACtBA,cAAAA,CAAC,cAAA,EAAA,EAA6B,IAAA,EAAY,KAAA,EAAA,EAArB,KAAK,EAA8B;AAAA,OAC9D,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AClOA,SAAS,mBAAA,CAAoB,EAAE,IAAA,EAAK,EAA0B;AAC5D,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,WAAA;AAErC,EAAA,uBACEA,cAAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MAEC,IAAA;AAAA,MACA,SAAA,EAAU,uBAAA;AAAA,MAET,QAAA,EAAA,IAAA,CAAK;AAAA,KAAA;AAAA,IAJD,IAAA,CAAK;AAAA,GAKZ;AAEJ;AA4BA,eAAsB,oBAAA,CAAqB;AAAA,EACzC,IAAA;AAAA,EACA,QAAA,GAAW,QAAA;AAAA,EACX,KAAA,GAAQ,CAAA;AAAA,EACR,SAAA;AAAA,EACA;AACF,CAAA,EAAkE;AAChE,EAAA,MAAM,QAAQ,MAAMI,iCAAA,CAAiB,MAAM,EAAE,QAAA,EAAU,OAAO,CAAA;AAE9D,EAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,cAAA,GAAiB,SAAA,IAAa,CAAA,+CAAA,EAAkD,QAAQ,CAAA,CAAA;AAG9F,EAAA,IAAI,aAAa,QAAA,EAAU;AAEzB,IAAA,uBACEJ,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,gBACd,QAAA,EAAA,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,IAAA,KACV,UAAA,GAAa,UAAA,CAAW,IAAI,CAAA,mBAAIA,cAAAA,CAAC,mBAAA,EAAA,EAAkC,IAAA,EAAA,EAAT,IAAA,CAAK,EAAgB;AAAA,KACjF,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACEC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,cAAA,EAChB,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,eAAA,EAAa,CAAA;AAAA,sBAC1DA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EACX,gBAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,cAAAA,CAAC,IAAA,EAAA,EACE,uBAAa,UAAA,CAAW,IAAI,CAAA,mBAAIA,cAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAY,CAAA,EAAA,EAD3D,IAAA,CAAK,EAEd,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,EAAgB,cAAW,iBAAA,EACzC,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,mBAAA,EAAiB,CAAA;AAAA,sBAC9DA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACZ,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVC,eAAAA,CAAC,KAAA,EAAA,EAAkB,WAAU,4BAAA,EAC1B,QAAA,EAAA;AAAA,QAAA,UAAA,GAAa,WAAW,IAAI,CAAA,mBAAID,cAAAA,CAAC,uBAAoB,IAAA,EAAY,CAAA;AAAA,QACjE,IAAA,CAAK,2BACJA,cAAAA,CAAC,OAAE,SAAA,EAAU,+BAAA,EAAiC,eAAK,OAAA,EAAQ;AAAA,OAAA,EAAA,EAHrD,IAAA,CAAK,EAKf,CACD,CAAA,EACH;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,EACd,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,8BAAA,EAA+B,QAAA,EAAA,kBAAA,EAAgB,CAAA;AAAA,oBAC7DA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BAAA,EACX,gBAAM,GAAA,CAAI,CAAC,IAAA,qBACVA,cAAAA,CAAC,IAAA,EAAA,EACE,uBAAa,UAAA,CAAW,IAAI,CAAA,mBAAIA,cAAAA,CAAC,mBAAA,EAAA,EAAoB,MAAY,CAAA,EAAA,EAD3D,IAAA,CAAK,EAEd,CACD,CAAA,EACH;AAAA,GAAA,EACF,CAAA;AAEJ;AChHA,SAAS,eAAe,OAAA,EAAyB;AAC/C,EAAA,OAAO,OAAA,CAEJ,OAAA,CAAQ,eAAA,EAAiB,aAAa,CAAA,CACtC,OAAA,CAAQ,cAAA,EAAgB,aAAa,CAAA,CACrC,OAAA,CAAQ,aAAA,EAAe,aAAa,EAEpC,OAAA,CAAQ,iBAAA,EAAmB,qBAAqB,CAAA,CAEhD,OAAA,CAAQ,aAAA,EAAe,aAAa,CAAA,CAEpC,QAAQ,uBAAA,EAAyB,qBAAqB,CAAA,CAEtD,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAA,CAC5B,OAAA,CAAQ,aAAa,WAAW,CAAA;AACrC;AAMA,SAAS,uBAAA,CAAwB,MAAc,QAAA,EAA+B;AAC5E,EAAA,IAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,OAAO,IAAA;AAE7B,EAAA,IAAI,aAAA,GAAgB,IAAA;AAGpB,EAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,QAAQ,EAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,CAAA,CAAE,KAAK,MAAM,CAAA;AAEjF,EAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AAEnC,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AAI5B,IAAA,MAAM,QAAQ,IAAI,MAAA;AAAA,MAChB,CAAA,mCAAA,EAAsC,YAAA,CAAa,MAAA,CAAO,IAAI,CAAC,CAAA,UAAA,CAAA;AAAA,MAC/D;AAAA,KACF;AAGA,IAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,MAAA,CAAO,WAAW,CAAA;AAE5D,IAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,CAAC,KAAA,KAAU;AACtD,MAAA,OAAO,CAAA,mCAAA,EAAsC,MAAA,CAAO,WAAW,CAAA,qBAAA,EACvC,OAAO,EAAE,CAAA,0BAAA,EACJ,MAAA,CAAO,WAAW,6BAClB,MAAA,CAAO,IAAI,CAAA,yCAAA,EACI,UAAU,2BAC3B,KAAK,CAAA,cAAA,CAAA;AAAA,IAClC,CAAC,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AACrD;AAEA,SAAS,uBAAuB,UAAA,EAA4B;AAC1D,EAAA,MAAM,OAAA,GAAkC;AAAA,IACtC,YAAA,EAAc,cAAA;AAAA,IACd,MAAA,EAAQ,QAAA;AAAA,IACR,OAAA,EAAS,SAAA;AAAA,IACT,OAAA,EAAS,SAAA;AAAA,IACT,QAAA,EAAU,OAAA;AAAA,IACV,OAAA,EAAS,OAAA;AAAA,IACT,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,OAAA,CAAQ,UAAU,CAAA,IAAK,OAAA;AAChC;AAuCA,eAAsB,cAAA,CAAe;AAAA,EACnC,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAa,EAAC;AAAA,EACd,yBAAyB,oBAAA,GAAuB;AAClD,CAAA,EAA4D;AAC1D,EAAA,MAAM,KAAA,GAAQ,MAAMK,gCAAA,CAAgB,IAAA,EAAM,OAAO,CAAA;AAEjD,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,uBAAOL,cAAAA,CAAAG,mBAAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,IACrB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAwB,EAAC;AAC7B,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,IAAI;AACF,MAAA,QAAA,GAAW,MAAMG,4BAAA,EAAY;AAAA,IAC/B,SAAS,GAAA,EAAK;AACZ,MAAA,OAAA,CAAQ,IAAA,CAAK,2DAA2D,GAAG,CAAA;AAAA,IAC7E;AAAA,EACF;AAEA,EAAA,MAAM,cAAA,GAAiB,SAAA,IAAa,CAAA,iCAAA,EAAoC,OAAO,CAAA,CAAA;AAG/E,EAAA,MAAM,WAAA,GAAc,CAAC,IAAA,KAAyB;AAC5C,IAAA,IAAI,oBAAA,IAAwB,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC/C,MAAA,OAAO,uBAAA,CAAwB,MAAM,QAAQ,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA;AAGA,EAAA,QAAQ,MAAM,YAAA;AAAc,IAC1B,KAAK,MAAA;AACH,MAAA,uBACEN,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,cAAA;AAAA,UACX,yBAAyB,EAAE,MAAA,EAAQ,WAAA,CAAY,KAAA,CAAM,OAAiB,CAAA;AAAE;AAAA,OAC1E;AAAA,IAGJ,KAAK,UAAA;AACH,MAAA,MAAM,WAAA,GAAc,WAAA,CAAY,cAAA,CAAe,KAAA,CAAM,OAAiB,CAAC,CAAA;AACvE,MAAA,uBACEA,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,cAAA;AAAA,UACX,uBAAA,EAAyB,EAAE,MAAA,EAAQ,WAAA;AAAY;AAAA,OACjD;AAAA,IAGJ,KAAK,MAAA;AAEH,MAAA,MAAM,QAAA,GAAW,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GACtC,KAAK,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,GACxB,KAAA,CAAM,OAAA;AAEV,MAAA,uBACEC,eAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,cAAA;AAAA,UACX,cAAA,EAAc,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA;AAAA,UAGpC,QAAA,EAAA;AAAA,YAAA,QAAA,CAAS,KAAA,oBAASD,cAAAA,CAAC,IAAA,EAAA,EAAI,mBAAS,KAAA,EAAM,CAAA;AAAA,YACtC,QAAA,CAAS,4BAAYA,cAAAA,CAAC,OAAE,SAAA,EAAU,UAAA,EAAY,mBAAS,QAAA,EAAS,CAAA;AAAA,YAChE,QAAA,CAAS,OAAA,oBAAWA,cAAAA,CAAC,KAAA,EAAA,EAAI,yBAAyB,EAAE,MAAA,EAAQ,QAAA,CAAS,OAAA,EAAQ,EAAG,CAAA;AAAA,YAChF,QAAA,CAAS,yBACRA,cAAAA,CAAC,QACE,QAAA,EAAA,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAiC,KAAA,qBACpDA,cAAAA,CAAC,IAAA,EAAA,EAAgB,iBAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,CAAK,IAAA,EAAA,EAA/C,KAAoD,CAC9D,CAAA,EACH;AAAA;AAAA;AAAA,OAEJ;AAAA,IAGJ,KAAK,OAAA;AAEH,MAAA,MAAM,aAAA,GAAgB,OAAO,KAAA,CAAM,OAAA,KAAY,QAAA,GAC3C,KAAK,KAAA,CAAM,KAAA,CAAM,OAAO,CAAA,GACxB,KAAA,CAAM,OAAA;AAEV,MAAA,MAAM,gBAAgB,aAAA,CAAc,SAAA;AACpC,MAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,KAAA,IAAoC,EAAC;AAE1E,MAAA,MAAM,SAAA,GAAY,WAAW,aAAa,CAAA;AAE1C,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAA6B,aAAa,CAAA,6BAAA,CAA+B,CAAA;AACtF,QAAA,OAAO,2BAAWA,cAAAA,CAAAG,mBAAAA,EAAA,EAAG,oBAAS,CAAA,GAAM,IAAA;AAAA,MACtC;AAEA,MAAA,uBACEH,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,cAAA,EACd,0BAAAA,cAAAA,CAAC,SAAA,EAAA,EAAW,GAAG,cAAA,EAAgB,CAAA,EACjC,CAAA;AAAA,IAGJ;AACE,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qCAAA,EAAwC,KAAA,CAAM,YAAY,CAAA,CAAA,CAAG,CAAA;AAC1E,MAAA,OAAO,2BAAWA,cAAAA,CAAAG,mBAAAA,EAAA,EAAG,oBAAS,CAAA,GAAM,IAAA;AAAA;AAE1C;AAOA,eAAsB,qBAAA,CACpB,MACA,OAAA,EACqC;AACrC,EAAA,OAAOE,gCAAA,CAAgB,MAAM,OAAO,CAAA;AACtC;ACxKA,SAAS,YAAA,GAAe;AACtB,EAAA,MAAM,MAAA,GAAS,QAAQ,GAAA,CAAI,aAAA,IAAiB,QAAQ,GAAA,CAAI,eAAA,IAAmB,OAAA,CAAQ,GAAA,CAAI,2BAAA,IAA+B,sBAAA;AACtH,EAAA,OAAO,EAAE,MAAA,EAAO;AAClB;AAUO,IAAM,kBAAA,GAAqBE,WAAA,CAAM,OACtC,SAAA,EACA,MACA,OAAA,KACwC;AACxC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAEhC,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,CAAA,EAAG,MAAM,CAAA,gCAAA,CAAA,EAAoC;AAAA,MACxE,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,QACnB,UAAA,EAAY,SAAA;AAAA,QACZ,IAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,MACD,IAAA,EAAM,EAAE,UAAA,EAAY,IAAA;AAAK;AAAA,KAC1B,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,8CAAA,EAAiD,OAAO,CAAA,YAAA,EAAe,IAAI,CAAA,CAAA,CAAG,CAAA;AAC5F,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,IAAA,OAAO,IAAA;AAAA,EACT,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,mCAAmC,KAAK,CAAA;AACtD,IAAA,OAAO,IAAA;AAAA,EACT;AACF,CAAC;AAMD,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,SAAA,EAAU,EAAqD;AAC3F,EAAA,uBACEN,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,aAAa,eAAA,EAC/B,QAAA,EAAA;AAAA,oBAAAD,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,IACf,IAAA,CAAK,4BAAYA,cAAAA,CAAC,OAAE,SAAA,EAAU,UAAA,EAAY,eAAK,QAAA,EAAS,CAAA;AAAA,IACxD,KAAK,KAAA,oBACJA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,YAAA,EACZ,QAAA,EAAA,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,CAAA,qBACrBC,eAAAA,CAAC,KAAA,EAAA,EAAY,WAAU,MAAA,EACrB,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,eAAK,KAAA,EAAM,CAAA;AAAA,sBACzCA,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,YAAA,EAAc,eAAK,KAAA,EAAM;AAAA,KAAA,EAAA,EAFjC,CAGV,CACD,CAAA,EACH,CAAA;AAAA,IAED,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,QAAA,oBACrBA,cAAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,IAAA,CAAK,QAAA,EAAU,SAAA,EAAU,YAAA,EAC/B,eAAK,QAAA,EACR;AAAA,GAAA,EAEJ,CAAA;AAEJ;AAEA,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,SAAA,EAAU,EAAqD;AAC3F,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,uBACEA,cAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,WAAW,SAAA,IAAa,eAAA;AAAA,QACxB,uBAAA,EAAyB,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAA;AAAK;AAAA,KAC/C;AAAA,EAEJ;AAEA,EAAA,uBACEC,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,aAAa,eAAA,EAC9B,QAAA,EAAA;AAAA,IAAA,IAAA,CAAK,OAAA,oBAAWD,cAAAA,CAAC,IAAA,EAAA,EAAI,eAAK,OAAA,EAAQ,CAAA;AAAA,IAClC,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBACvBA,cAAAA,CAAC,GAAA,EAAA,EAAW,QAAA,EAAA,CAAA,EAAA,EAAJ,CAAM,CACf;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,SAAS,oBAAA,CAAqB,EAAE,IAAA,EAAM,SAAA,EAAU,EAAqD;AACnG,EAAA,uBACEA,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAW,SAAA,IAAa,0BAC/B,QAAA,kBAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA,IAAA,CAAK,SAAS,GAAA,CAAI,CAAC,OAAA,EAAS,CAAA,qBAC3BC,eAAAA,CAAC,OAAU,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,SAAA,EAAU,cAAA,EACtC,QAAA,EAAA;AAAA,IAAA,OAAA,CAAQ,wBAAQD,cAAAA,CAAC,UAAK,SAAA,EAAU,cAAA,EAAgB,kBAAQ,IAAA,EAAK,CAAA;AAAA,oBAC9DA,cAAAA,CAAC,IAAA,EAAA,EAAI,QAAA,EAAA,OAAA,CAAQ,KAAA,EAAM,CAAA;AAAA,oBACnBA,cAAAA,CAAC,GAAA,EAAA,EAAG,QAAA,EAAA,OAAA,CAAQ,WAAA,EAAY;AAAA,GAAA,EAAA,EAHlB,CAIR,CACD,CAAA,EACH,CAAA,EACF,CAAA;AAEJ;AAEA,SAAS,eAAA,CAAgB,EAAE,IAAA,EAAM,SAAA,EAAU,EAAsC;AAE/E,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,aAAA,EAAe;AAC1C,IAAA,uBACEA,eAAC,SAAA,EAAA,EAAQ,SAAA,EACP,0BAAAA,cAAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,QAAA,EAAU,MAAA,EAAQ,YAAY,SAAA,EAAW,OAAA,EAAS,QAAO,EACpE,QAAA,EAAA,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAA,EAC/B,CAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,OAAO,IAAA,CAAK,OAAA,KAAY,QAAA,EAAU;AACpC,IAAA,uBACEA,cAAAA;AAAA,MAAC,SAAA;AAAA,MAAA;AAAA,QACC,SAAA;AAAA,QACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,IAAA,CAAK,OAAA;AAAQ;AAAA,KAClD;AAAA,EAEJ;AAEA,EAAA,OAAO,IAAA;AACT;AAYA,eAAsB,mBAAA,CAAoB;AAAA,EACxC,SAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAAiE;AAC/D,EAAA,MAAM,IAAA,GAAO,MAAM,kBAAA,CAAmB,SAAA,EAAW,MAAM,OAAO,CAAA;AAE9D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOA,cAAAA,CAAAG,mBAAAA,EAAA,EAAG,QAAA,EAAA,MAAA,CAAO,IAAI,CAAA,EAAE,CAAA;AAAA,EACzB;AAGA,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,MAAA;AACH,MAAA,uBAAOH,cAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,IAAA,CAAK,SAA+B,SAAA,EAAsB,CAAA;AAAA,IAEvF,KAAK,MAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,gBAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,IAAA,CAAK,SAA+B,SAAA,EAAsB,CAAA;AAAA,IAEvF,KAAK,eAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,uBAAOA,cAAAA,CAAC,oBAAA,EAAA,EAAqB,IAAA,EAAM,IAAA,CAAK,SAA+B,SAAA,EAAsB,CAAA;AAAA,IAE/F;AACE,MAAA,uBAAOA,cAAAA,CAAC,eAAA,EAAA,EAAgB,IAAA,EAAY,SAAA,EAAsB,CAAA;AAAA;AAEhE","file":"index.js","sourcesContent":["import type { Metadata } from 'next'\nimport { getSEOPageData, getABTest, recordABImpression, ensureMetadata } from './server-api'\nimport type { \n GetManagedMetadataOptions, \n ManagedMetadataResult,\n GetABVariantOptions,\n ABTestResult \n} from './types'\n\n/**\n * Get managed metadata for a page\n * \n * Use in generateMetadata() to fetch Portal-managed SEO data\n * \n * @example\n * ```tsx\n * export async function generateMetadata({ params }) {\n * return getManagedMetadata({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: `/services/${params.slug}`,\n * fallback: {\n * title: 'Our Services',\n * description: 'Learn about our services'\n * }\n * })\n * }\n * ```\n */\nexport async function getManagedMetadata(\n options: GetManagedMetadataOptions\n): Promise<ManagedMetadataResult> {\n const { path, fallback = {}, overrides = {}, favicon: faviconMode = 'metadata' } = options\n const omitIcons = faviconMode === 'component'\n\n const result = await getSEOPageData(path)\n const pageData = result?.page\n const projectData = result?.project\n\n // If no managed data, return fallback (still include favicon from project if available, unless using component)\n if (!pageData) {\n const fallbackMeta: ManagedMetadataResult = {\n ...fallback,\n ...overrides,\n _managed: false,\n _source: 'fallback',\n } as ManagedMetadataResult\n\n if (!omitIcons && projectData?.logo_url) {\n fallbackMeta.icons = {\n icon: projectData.logo_url,\n apple: projectData.logo_url,\n }\n }\n\n return fallbackMeta\n }\n\n // Build metadata from managed values, falling back to provided fallbacks\n const metadata: ManagedMetadataResult = {\n _managed: true,\n _source: 'database',\n }\n\n if (!omitIcons && projectData?.logo_url) {\n metadata.icons = {\n icon: projectData.logo_url,\n apple: projectData.logo_url,\n }\n }\n\n // Signal fallback — when page exists but both title & description are empty,\n // trigger Signal AI to generate them (idempotent, saves to DB for next request)\n let signalData: Awaited<ReturnType<typeof ensureMetadata>> = null\n if (!pageData.managed_title && !pageData.managed_meta_description && !pageData.managed_description) {\n try {\n signalData = await ensureMetadata(path)\n } catch {\n // Signal failure is silent — fall through to existing fallback chain\n }\n }\n\n // Title\n if (pageData.managed_title) {\n metadata.title = pageData.managed_title\n } else if (signalData?.managed_title) {\n metadata.title = signalData.managed_title\n metadata._source = 'signal'\n } else if (fallback.title) {\n metadata.title = fallback.title\n }\n\n // Description\n if (pageData.managed_meta_description || pageData.managed_description) {\n metadata.description = pageData.managed_meta_description || pageData.managed_description\n } else if (signalData?.managed_meta_description) {\n metadata.description = signalData.managed_meta_description\n metadata._source = 'signal'\n } else if (fallback.description) {\n metadata.description = fallback.description\n }\n\n // Keywords\n if (pageData.managed_keywords?.length) {\n metadata.keywords = pageData.managed_keywords\n } else if (signalData?.managed_keywords?.length) {\n metadata.keywords = signalData.managed_keywords\n metadata._source = 'signal'\n } else if (fallback.keywords) {\n metadata.keywords = fallback.keywords\n }\n\n // Robots\n if (pageData.managed_robots) {\n metadata.robots = pageData.managed_robots\n }\n\n // Canonical\n if (pageData.managed_canonical) {\n metadata.alternates = {\n ...metadata.alternates,\n canonical: pageData.managed_canonical,\n }\n }\n\n // Open Graph\n const ogTitle = pageData.managed_og_title || pageData.managed_title\n const ogDescription = pageData.managed_og_description || pageData.managed_meta_description || pageData.managed_description\n const ogImage = pageData.managed_og_image\n\n if (ogTitle || ogDescription || ogImage) {\n metadata.openGraph = {\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(ogImage && { images: [{ url: ogImage }] }),\n }\n }\n\n // Twitter (use OG values as fallback)\n if (ogTitle || ogDescription || ogImage) {\n metadata.twitter = {\n card: 'summary_large_image',\n ...(ogTitle && { title: ogTitle }),\n ...(ogDescription && { description: ogDescription }),\n ...(ogImage && { images: [ogImage] }),\n }\n }\n\n // Apply overrides last\n return {\n ...metadata,\n ...overrides,\n _managed: true,\n _source: 'database',\n }\n}\n\n/**\n * Get A/B test variant for a field\n * \n * @example\n * ```tsx\n * const variant = await getABVariant({\n * projectId: process.env.UPTRADE_PROJECT_ID!,\n * path: '/pricing',\n * field: 'title',\n * sessionId: cookies().get('session_id')?.value\n * })\n * \n * if (variant) {\n * // Use variant.value instead of default\n * }\n * ```\n */\nexport async function getABVariant(\n options: GetABVariantOptions\n): Promise<ABTestResult | null> {\n const { path, field, sessionId } = options\n\n const test = await getABTest(path, field)\n\n if (!test) {\n return null\n }\n\n // Determine variant based on session ID or random\n let variant: 'a' | 'b'\n \n if (sessionId) {\n // Consistent variant for same session\n const hash = sessionId.split('').reduce((acc, char) => {\n return ((acc << 5) - acc) + char.charCodeAt(0)\n }, 0)\n variant = (Math.abs(hash) % 100) < (test.traffic_split * 100) ? 'a' : 'b'\n } else {\n // Random variant\n variant = Math.random() < test.traffic_split ? 'a' : 'b'\n }\n\n // Record impression (fire and forget)\n recordABImpression(test.id, variant, sessionId).catch(() => {\n // Silently fail - don't block rendering\n })\n\n return {\n testId: test.id,\n variant,\n value: variant === 'a' ? test.variant_a : test.variant_b,\n }\n}\n\n/**\n * Get managed metadata with A/B test support\n * \n * Automatically applies running A/B test variants to metadata\n */\nexport async function getManagedMetadataWithAB(\n options: GetManagedMetadataOptions & { sessionId?: string }\n): Promise<ManagedMetadataResult> {\n const { sessionId, ...metadataOptions } = options\n \n // Get base metadata\n const metadata = await getManagedMetadata(metadataOptions)\n\n // Check for title A/B test\n const titleTest = await getABVariant({\n path: options.path,\n field: 'title',\n sessionId,\n })\n\n if (titleTest) {\n metadata.title = titleTest.value\n }\n\n // Check for description A/B test\n const descTest = await getABVariant({\n path: options.path,\n field: 'description',\n sessionId,\n })\n\n if (descTest) {\n metadata.description = descTest.value\n }\n\n return metadata\n}\n","/**\n * @sonordev/site-kit/seo - withManagedMetadata\n *\n * Higher-order function that wraps Next.js generateMetadata to auto-merge\n * Portal-managed SEO data. Portal values serve as defaults; page-level\n * metadata returned by the caller takes priority.\n *\n * @example Zero-config (Portal manages everything):\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about')\n * ```\n *\n * @example With local overrides:\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about', async () => ({\n * title: 'About Us',\n * }))\n * ```\n *\n * @example Dynamic paths:\n * ```ts\n * export const generateMetadata = withManagedMetadata(\n * async ({ params }) => `/services/${(await params).slug}`\n * )\n * ```\n */\n\nimport type { Metadata, ResolvingMetadata } from 'next'\nimport { getManagedMetadata } from './getManagedMetadata'\n\ntype MetadataArgs = {\n params: Promise<Record<string, string>>\n searchParams?: Promise<Record<string, string>>\n}\n\ntype PathResolver =\n | string\n | ((args: MetadataArgs) => string | Promise<string>)\n\ntype PageMetadataFn = (\n args: MetadataArgs,\n parent: ResolvingMetadata\n) => Promise<Metadata> | Metadata\n\n/**\n * Wrap generateMetadata to auto-merge Portal managed metadata.\n *\n * - `path` can be a static string or a function that derives the path\n * from the page's params.\n * - `pageMetadata` (optional) returns page-specific overrides.\n * Anything it returns wins over Portal values.\n */\nexport function withManagedMetadata(\n path: PathResolver,\n pageMetadata?: PageMetadataFn,\n) {\n return async function generateMetadata(\n args: MetadataArgs,\n parent: ResolvingMetadata,\n ): Promise<Metadata> {\n const resolvedPath =\n typeof path === 'function' ? await path(args) : path\n\n // Fetch managed metadata from Portal (acts as defaults)\n const managed = await getManagedMetadata({ path: resolvedPath })\n\n // If no page-specific function, just return managed\n if (!pageMetadata) {\n return managed\n }\n\n // Get page-specific metadata (overrides managed)\n const pageSpecific = await pageMetadata(args, parent)\n\n // Deep merge: page-specific wins over managed\n return {\n ...managed,\n ...pageSpecific,\n openGraph: {\n ...(managed.openGraph as Record<string, unknown> | undefined),\n ...(pageSpecific.openGraph as Record<string, unknown> | undefined),\n },\n twitter: {\n ...(managed.twitter as Record<string, unknown> | undefined),\n ...(pageSpecific.twitter as Record<string, unknown> | undefined),\n },\n } as Metadata\n }\n}\n","import * as React from 'react'\nimport { getSchemaMarkups, getEntityEnhancedSchema, getSEOPageData } from './server-api'\nimport type { ManagedSchemaProps } from './types'\n\n/**\n * Speakable configuration for schema markup\n */\nexport interface SpeakableSpec {\n /** CSS selectors for speakable content */\n cssSelector?: string[]\n /** XPath selectors for speakable content */\n xpath?: string[]\n}\n\n/**\n * Extended schema props with speakable and entity support\n */\nexport interface EnhancedManagedSchemaProps extends ManagedSchemaProps {\n /** Add speakable specification to page schema */\n speakable?: SpeakableSpec | boolean\n /** Page type for speakable (WebPage or Article) */\n pageType?: 'WebPage' | 'Article'\n /** Page name for speakable schema */\n pageName?: string\n /** Page URL for speakable schema */\n pageUrl?: string\n /** Include entity-enhanced schema from knowledge graph (AI Visibility) */\n includeEntityGraph?: boolean\n}\n\n/**\n * Default speakable selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = [\n 'h1',\n '[data-speakable=\"true\"]',\n '.page-summary',\n '.key-points',\n '.aeo-block[data-speakable=\"true\"]',\n]\n\n/**\n * ManagedSchema - Server Component that injects JSON-LD schema\n * \n * Fetches schema markup from Portal and renders as script tags.\n * Now with speakable support for voice assistants and AI systems.\n * \n * @example\n * ```tsx\n * // app/services/[slug]/page.tsx\n * import { ManagedSchema } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <ManagedSchema \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * speakable={true}\n * pageName=\"Family Law Services\"\n * pageUrl=\"https://example.com/services/family-law\"\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nexport async function ManagedSchema({\n path,\n additionalSchemas = [],\n includeTypes,\n excludeTypes,\n speakable,\n pageType = 'WebPage',\n pageName,\n pageUrl,\n includeEntityGraph = true,\n}: EnhancedManagedSchemaProps): Promise<React.ReactElement | null> {\n // Fetch managed schemas from seo_schema_markup table (explicit schemas)\n const schemas = await getSchemaMarkups(path, {\n includeTypes,\n excludeTypes,\n })\n\n // Fetch page data to get auto-generated managed_schema from Signal meta optimization\n const pageData = await getSEOPageData(path)\n\n // Fetch entity-enhanced schemas if enabled\n let entitySchemas: object[] = []\n if (includeEntityGraph) {\n try {\n entitySchemas = await getEntityEnhancedSchema(path)\n } catch {\n // Entity graph unavailable — continue without\n }\n }\n\n const page = pageData?.page\n const siteUrl = pageData?.project?.site_url || ''\n\n // Combine all schemas: entity-enhanced + managed + page-auto-generated + additional\n const allSchemas = [\n ...entitySchemas,\n ...schemas.map((s: { schema_json?: object }) => s.schema_json),\n // Include auto-generated schema from Signal meta optimization\n ...(page?.managed_schema ? [page.managed_schema] : []),\n ...additionalSchemas,\n ]\n\n // Auto-generate BreadcrumbList if none exists and path has segments\n const hasBreadcrumb = allSchemas.some(\n (s) => s && typeof s === 'object' && (s as Record<string, unknown>)['@type'] === 'BreadcrumbList'\n )\n if (!hasBreadcrumb && path !== '/' && siteUrl) {\n allSchemas.push(createBreadcrumbSchema(siteUrl, path))\n }\n\n // Add speakable schema if requested\n if (speakable && pageName && pageUrl) {\n const speakableSchema = createSpeakableWebPageSchema(\n pageType,\n pageName,\n pageUrl,\n typeof speakable === 'object' ? speakable : undefined\n )\n allSchemas.push(speakableSchema)\n }\n\n // If still empty, try entity-enhanced schema as last-resort fallback\n if (allSchemas.length === 0 && !includeEntityGraph) {\n try {\n const fallbackSchemas = await getEntityEnhancedSchema(path)\n allSchemas.push(...fallbackSchemas)\n } catch {\n // Silent fallback\n }\n }\n\n if (allSchemas.length === 0) {\n return null\n }\n\n // If multiple schemas, wrap in @graph\n const schemaContent = allSchemas.length === 1\n ? allSchemas[0]\n : {\n '@context': 'https://schema.org',\n '@graph': allSchemas\n .filter(s => s && typeof s === 'object')\n .map(s => {\n // Remove @context from individual schemas when in graph\n const { '@context': _, ...rest } = s as Record<string, unknown>\n return rest\n }),\n }\n\n // Add @context if not in graph mode\n const finalSchema = allSchemas.length === 1\n ? { '@context': 'https://schema.org', ...schemaContent as Record<string, unknown> }\n : schemaContent\n\n return (\n <script\n type=\"application/ld+json\"\n async\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(finalSchema, null, 0),\n }}\n />\n )\n}\n\n/**\n * LLMSchema - Server Component that injects LLM-optimized structured data\n * \n * This component renders AI-visibility optimized data that helps LLM crawlers\n * (like ChatGPT, Claude, Perplexity) better understand page content.\n * \n * The schema includes:\n * - Detailed description (100-200 words for context)\n * - Keywords and topics\n * - Target audience\n * - Content relationships\n * \n * @example\n * ```tsx\n * import { LLMSchema } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <LLMSchema \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nexport async function LLMSchema({\n path,\n}: {\n projectId?: string\n path: string\n}): Promise<React.ReactElement | null> {\n const { page: pageData } = await getSEOPageData(path)\n\n if (!pageData?.managed_llm_schema) {\n return null\n }\n\n // Render as a special JSON-LD type that LLM crawlers can parse\n const llmSchema = {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n ...pageData.managed_llm_schema,\n // Add AI-specific metadata hints\n additionalType: 'https://uptrade.ai/ns/LLMOptimizedContent',\n }\n\n return (\n <script\n type=\"application/ld+json\"\n data-llm-optimized=\"true\"\n async\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(llmSchema, null, 0),\n }}\n />\n )\n}\n\n/**\n * Generate schema for a specific type with managed data\n * \n * Helper to create common schema types\n */\nexport function createSchema(\n type: string,\n data: Record<string, unknown>\n): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': type,\n ...data,\n }\n}\n\n/**\n * Create a WebPage or Article schema with speakable specification\n * \n * This helps voice assistants and AI systems identify key content to read aloud.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\nexport function createSpeakableWebPageSchema(\n type: 'WebPage' | 'Article',\n name: string,\n url: string,\n speakable?: SpeakableSpec\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n if (speakable?.cssSelector?.length) {\n speakableSpec.cssSelector = speakable.cssSelector\n } else if (speakable?.xpath?.length) {\n speakableSpec.xpath = speakable.xpath\n } else {\n // Use default selectors\n speakableSpec.cssSelector = DEFAULT_SPEAKABLE_SELECTORS\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n }\n}\n\n/**\n * Create BreadcrumbList schema from path\n */\nexport function createBreadcrumbSchema(\n baseUrl: string,\n path: string,\n labels?: Record<string, string>\n): Record<string, unknown> {\n const segments = path.split('/').filter(Boolean)\n \n const items = segments.map((segment, index) => {\n const itemPath = '/' + segments.slice(0, index + 1).join('/')\n const label = labels?.[segment] || segment.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n \n return {\n '@type': 'ListItem',\n position: index + 1,\n name: label,\n item: `${baseUrl}${itemPath}`,\n }\n })\n\n // Add home as first item\n items.unshift({\n '@type': 'ListItem',\n position: 0,\n name: 'Home',\n item: baseUrl,\n })\n\n // Re-number positions\n items.forEach((item, index) => {\n item.position = index + 1\n })\n\n return createSchema('BreadcrumbList', {\n itemListElement: items,\n })\n}\n\nexport default ManagedSchema\n","import * as React from 'react'\nimport { getFAQData } from './server-api'\nimport type { ManagedFAQProps, FAQItem } from './types'\nimport { createSchema } from './ManagedSchema'\n\n/**\n * Inline styles for the accordion FAQ (no external CSS dependency)\n */\nconst faqStyles = `\n.uptrade-faq-items {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.uptrade-faq-item {\n border-bottom: 1px solid rgba(0,0,0,0.08);\n}\n.uptrade-faq-item:first-child {\n border-top: 1px solid rgba(0,0,0,0.08);\n}\n.uptrade-faq-item summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding: 1.25rem 0;\n font-weight: 600;\n font-size: 1.05rem;\n line-height: 1.5;\n color: inherit;\n list-style: none;\n user-select: none;\n transition: color 0.15s ease;\n}\n.uptrade-faq-item summary:hover {\n opacity: 0.8;\n}\n.uptrade-faq-item summary::-webkit-details-marker {\n display: none;\n}\n.uptrade-faq-item summary::marker {\n display: none;\n content: '';\n}\n.uptrade-faq-chevron {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 1rem;\n transition: transform 0.2s ease;\n opacity: 0.5;\n}\n.uptrade-faq-item[open] .uptrade-faq-chevron {\n transform: rotate(180deg);\n}\n.uptrade-faq-answer {\n padding: 0 0 1.25rem 0;\n color: rgba(0,0,0,0.6);\n line-height: 1.75;\n font-size: 0.95rem;\n}\n.uptrade-faq-answer p {\n margin: 0 0 0.75rem 0;\n}\n.uptrade-faq-answer p:last-child {\n margin-bottom: 0;\n}\n.uptrade-faq-answer ul, .uptrade-faq-answer ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n}\n.uptrade-faq-answer li {\n margin-bottom: 0.25rem;\n}\n.uptrade-faq-answer a {\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.uptrade-faq-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n}\n.uptrade-faq-description {\n color: rgba(0,0,0,0.6);\n margin-bottom: 2rem;\n font-size: 1rem;\n line-height: 1.6;\n}\n`\n\n/**\n * Chevron SVG (no icon library dependency)\n */\nfunction ChevronDown() {\n return (\n <svg\n className=\"uptrade-faq-chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\n/**\n * Default FAQ item renderer – uses native <details>/<summary> for toggle\n */\nfunction DefaultFAQItem({ item, index }: { item: FAQItem; index: number }) {\n return (\n <details key={item.id} className=\"uptrade-faq-item\">\n <summary>\n <span>{item.question}</span>\n <ChevronDown />\n </summary>\n <div\n className=\"uptrade-faq-answer\"\n dangerouslySetInnerHTML={{ __html: item.answer }}\n />\n </details>\n )\n}\n\n/**\n * Generate FAQ schema from items\n * \n * IMPORTANT: This is the ONLY place FAQ schema (FAQPage) is generated.\n * The CLI setup command does NOT generate FAQ schema - it only extracts/uploads\n * FAQ data to the Portal. This component then dynamically generates the schema\n * from that data, ensuring FAQ changes in Portal automatically update the schema.\n */\nfunction generateFAQSchema(items: FAQItem[]): Record<string, unknown> {\n return createSchema('FAQPage', {\n mainEntity: items\n .filter(item => item.is_visible)\n .map(item => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n })\n}\n\n/**\n * ManagedFAQ - Server Component that renders FAQ section with schema\n * \n * Fetches FAQ content from Portal and renders with optional schema injection\n * \n * @example\n * ```tsx\n * // app/services/plumbing/page.tsx\n * import { ManagedFAQ } from '@sonordev/seo'\n * \n * export default async function PlumbingPage() {\n * return (\n * <main>\n * <h1>Plumbing Services</h1>\n * <section>\n * <ManagedFAQ \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path=\"/services/plumbing\"\n * showTitle\n * includeSchema\n * />\n * </section>\n * </main>\n * )\n * }\n * ```\n */\nexport async function ManagedFAQ({\n path,\n className,\n renderItem,\n includeSchema = true,\n showTitle = true,\n}: ManagedFAQProps): Promise<React.ReactElement | null> {\n const faqData = await getFAQData(path)\n\n if (!faqData || !faqData.items?.length) {\n return null\n }\n\n const visibleItems = faqData.items.filter((item: FAQItem) => item.is_visible)\n \n if (visibleItems.length === 0) {\n return null\n }\n\n // Sort by order\n visibleItems.sort((a: FAQItem, b: FAQItem) => a.order - b.order)\n\n const shouldIncludeSchema = includeSchema && faqData.include_schema\n\n return (\n <>\n {shouldIncludeSchema && (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify(generateFAQSchema(visibleItems), null, 0),\n }}\n />\n )}\n {/* Embedded styles for accordion FAQ (no external CSS file needed) */}\n <style dangerouslySetInnerHTML={{ __html: faqStyles }} />\n <div className={className || 'uptrade-faq'}>\n {showTitle && faqData.title && (\n <h2 className=\"uptrade-faq-title\">{faqData.title}</h2>\n )}\n {faqData.description && (\n <p className=\"uptrade-faq-description\">{faqData.description}</p>\n )}\n <div className=\"uptrade-faq-items\">\n {visibleItems.map((item: FAQItem, index: number) => \n renderItem \n ? renderItem(item, index)\n : <DefaultFAQItem key={item.id} item={item} index={index} />\n )}\n </div>\n </div>\n </>\n )\n}\n\nexport default ManagedFAQ\n","import * as React from 'react'\nimport { getInternalLinks } from './server-api'\nimport type { ManagedInternalLinksProps, ManagedLink } from './types'\n\n/**\n * Default link renderer\n */\nfunction DefaultLinkRenderer({ link }: { link: ManagedLink }) {\n const href = link.target_url || link.target_path\n \n return (\n <a \n key={link.id}\n href={href}\n className=\"uptrade-internal-link\"\n >\n {link.anchor_text}\n </a>\n )\n}\n\n/**\n * ManagedInternalLinks - Server Component for AI-suggested internal links\n * \n * Fetches internal link suggestions from Portal and renders them\n * \n * @example\n * ```tsx\n * // In your article component\n * import { ManagedInternalLinks } from '@sonordev/seo'\n * \n * export default async function BlogPost({ params }) {\n * return (\n * <article>\n * <p>Your content here...</p>\n * \n * <ManagedInternalLinks \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/blog/${params.slug}`}\n * position=\"bottom\"\n * limit={5}\n * />\n * </article>\n * )\n * }\n * ```\n */\nexport async function ManagedInternalLinks({\n path,\n position = 'bottom',\n limit = 5,\n className,\n renderLink,\n}: ManagedInternalLinksProps): Promise<React.ReactElement | null> {\n const links = await getInternalLinks(path, { position, limit })\n\n if (!links.length) {\n return null\n }\n\n const containerClass = className || `uptrade-internal-links uptrade-internal-links--${position}`\n\n // Different layouts based on position\n if (position === 'inline') {\n // Inline links are meant to be inserted into content\n return (\n <span className={containerClass}>\n {links.map((link: ManagedLink) => \n renderLink ? renderLink(link) : <DefaultLinkRenderer key={link.id} link={link} />\n )}\n </span>\n )\n }\n\n if (position === 'sidebar') {\n return (\n <aside className={containerClass}>\n <h4 className=\"uptrade-internal-links-title\">Related Pages</h4>\n <ul className=\"uptrade-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </aside>\n )\n }\n\n if (position === 'related') {\n return (\n <nav className={containerClass} aria-label=\"Related content\">\n <h3 className=\"uptrade-internal-links-title\">You May Also Like</h3>\n <div className=\"uptrade-internal-links-grid\">\n {links.map((link: ManagedLink) => (\n <div key={link.id} className=\"uptrade-internal-link-card\">\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n {link.context && (\n <p className=\"uptrade-internal-link-context\">{link.context}</p>\n )}\n </div>\n ))}\n </div>\n </nav>\n )\n }\n\n // Default: bottom position\n return (\n <div className={containerClass}>\n <h4 className=\"uptrade-internal-links-title\">Related Articles</h4>\n <ul className=\"uptrade-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport default ManagedInternalLinks\n","import * as React from 'react'\nimport { getContentBlock, getEntities, getPrimaryEntity } from './server-api'\nimport type { ManagedContentProps, ManagedContentBlock, SEOEntity } from './types'\n\n/**\n * Parse and render markdown content (basic support)\n * For full markdown, use a proper parser in your custom renderer\n */\nfunction renderMarkdown(content: string): string {\n return content\n // Headers\n .replace(/^### (.*$)/gim, '<h3>$1</h3>')\n .replace(/^## (.*$)/gim, '<h2>$1</h2>')\n .replace(/^# (.*$)/gim, '<h1>$1</h1>')\n // Bold\n .replace(/\\*\\*(.*)\\*\\*/gim, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.*)\\*/gim, '<em>$1</em>')\n // Links\n .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>')\n // Paragraphs\n .replace(/\\n\\n/gim, '</p><p>')\n .replace(/^(.+)$/gim, '<p>$1</p>')\n}\n\n/**\n * Inject entity annotations into HTML content\n * Wraps entity mentions with data-sonor-entity attributes for knowledge graph linking\n */\nfunction injectEntityAnnotations(html: string, entities: SEOEntity[]): string {\n if (!entities.length) return html\n \n let annotatedHtml = html\n \n // Sort entities by name length (longest first) to avoid partial matches\n const sortedEntities = [...entities].sort((a, b) => b.name.length - a.name.length)\n \n for (const entity of sortedEntities) {\n // Skip very short names to avoid false positives\n if (entity.name.length < 3) continue\n \n // Create case-insensitive regex for entity name\n // Avoid matching inside HTML tags or existing annotations\n const regex = new RegExp(\n `(?<![\\\\w-])(?<!data-sonor-entity=\")${escapeRegExp(entity.name)}(?![\\\\w-])`,\n 'gi'\n )\n \n // Determine schema type for microdata\n const schemaType = getSchemaTypeForEntity(entity.entity_type)\n \n annotatedHtml = annotatedHtml.replace(regex, (match) => {\n return `<span class=\"aeo-entity aeo-entity-${entity.entity_type}\" ` +\n `data-sonor-entity=\"${entity.id}\" ` +\n `data-sonor-entity-type=\"${entity.entity_type}\" ` +\n `data-sonor-entity-name=\"${entity.name}\" ` +\n `itemscope itemtype=\"https://schema.org/${schemaType}\">` +\n `<span itemprop=\"name\">${match}</span></span>`\n })\n }\n \n return annotatedHtml\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getSchemaTypeForEntity(entityType: string): string {\n const typeMap: Record<string, string> = {\n organization: 'Organization',\n person: 'Person',\n service: 'Service',\n product: 'Product',\n location: 'Place',\n concept: 'Thing',\n credential: 'EducationalOccupationalCredential',\n }\n return typeMap[entityType] || 'Thing'\n}\n\n/**\n * ManagedContent - Server Component for CMS-controlled content blocks\n * \n * Fetches content sections from Portal and renders them\n * Supports HTML, Markdown, JSON, and React component references\n * \n * @example\n * ```tsx\n * // Hero section managed by Portal\n * import { ManagedContent } from '@sonordev/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <main>\n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"hero\"\n * fallback={<DefaultHero />}\n * />\n * \n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"features\"\n * />\n * \n * <ManagedContent \n * projectId={process.env.UPTRADE_PROJECT_ID!}\n * path={`/services/${params.slug}`}\n * section=\"cta\"\n * />\n * </main>\n * )\n * }\n * ```\n */\nexport async function ManagedContent({\n path,\n section,\n fallback,\n className,\n components = {},\n injectEntityAnnotations: shouldInjectEntities = false,\n}: ManagedContentProps): Promise<React.ReactElement | null> {\n const block = await getContentBlock(path, section)\n\n if (!block) {\n if (fallback) {\n return <>{fallback}</>\n }\n return null\n }\n\n // Fetch entities if annotation is enabled\n let entities: SEOEntity[] = []\n if (shouldInjectEntities) {\n try {\n entities = await getEntities() as SEOEntity[]\n } catch (err) {\n console.warn('@sonordev/seo: Failed to fetch entities for annotation:', err)\n }\n }\n\n const containerClass = className || `uptrade-content uptrade-content--${section}`\n\n // Helper to process HTML with optional entity injection\n const processHtml = (html: string): string => {\n if (shouldInjectEntities && entities.length > 0) {\n return injectEntityAnnotations(html, entities)\n }\n return html\n }\n\n // Handle different content types\n switch (block.content_type) {\n case 'html':\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: processHtml(block.content as string) }}\n />\n )\n\n case 'markdown':\n const htmlContent = processHtml(renderMarkdown(block.content as string))\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n )\n\n case 'json':\n // JSON content for structured data - render as data attributes or custom handling\n const jsonData = typeof block.content === 'string' \n ? JSON.parse(block.content)\n : block.content\n\n return (\n <div \n className={containerClass}\n data-content={JSON.stringify(jsonData)}\n >\n {/* Render JSON structure - customize based on your needs */}\n {jsonData.title && <h2>{jsonData.title}</h2>}\n {jsonData.subtitle && <p className=\"subtitle\">{jsonData.subtitle}</p>}\n {jsonData.content && <div dangerouslySetInnerHTML={{ __html: jsonData.content }} />}\n {jsonData.items && (\n <ul>\n {jsonData.items.map((item: { text: string } | string, index: number) => (\n <li key={index}>{typeof item === 'string' ? item : item.text}</li>\n ))}\n </ul>\n )}\n </div>\n )\n\n case 'react':\n // React component reference - lookup from provided components map\n const componentData = typeof block.content === 'string'\n ? JSON.parse(block.content)\n : block.content as Record<string, unknown>\n\n const componentName = componentData.component as string\n const componentProps = componentData.props as Record<string, unknown> || {}\n\n const Component = components[componentName]\n \n if (!Component) {\n console.warn(`@sonordev/seo: Component \"${componentName}\" not found in components map`)\n return fallback ? <>{fallback}</> : null\n }\n\n return (\n <div className={containerClass}>\n <Component {...componentProps} />\n </div>\n )\n\n default:\n console.warn(`@sonordev/seo: Unknown content type \"${block.content_type}\"`)\n return fallback ? <>{fallback}</> : null\n }\n}\n\n/**\n * Get content block data without rendering\n * \n * Useful when you need to access the raw data\n */\nexport async function getManagedContentData(\n path: string,\n section: string\n): Promise<ManagedContentBlock | null> {\n return getContentBlock(path, section)\n}\n\nexport default ManagedContent\n","/**\n * LocationPageContent - Server Component for fetching location page sections\n * \n * Usage:\n * <LocationPageContent \n * projectId=\"uuid\" \n * path=\"/areas/seattle-wa/plumbing\" \n * section=\"hero\" \n * />\n * \n * This component fetches content from seo_location_pages.sections for a given\n * path and section, making it editable in Portal without code deploys.\n */\n\nimport * as React from 'react'\nimport { cache } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocationPageContentProps {\n /** Sonor project ID */\n projectId: string\n /** Page path (e.g., /areas/seattle-wa/plumbing) */\n path: string\n /** Section ID or type to fetch (e.g., \"hero\", \"intro\", \"services\") */\n section: string\n /** Fallback content if section not found */\n fallback?: React.ReactNode\n /** Additional className for wrapper */\n className?: string\n /** Custom renderer for the section data */\n render?: (data: LocationSectionData) => React.ReactNode\n}\n\nexport interface LocationSectionData {\n type: string\n content: any\n}\n\nexport interface HeroSectionContent {\n title: string\n subtitle?: string\n cta_text?: string\n cta_href?: string\n stats?: Array<{ label: string; value: string }>\n background_image?: string\n}\n\nexport interface ServiceGridContent {\n services: Array<{\n title: string\n description: string\n href: string\n icon?: string\n }>\n}\n\nexport interface TextSectionContent {\n heading?: string\n paragraphs: string[]\n html?: string\n}\n\n// ============================================\n// API Config\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = process.env.SONOR_API_URL || process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io'\n return { apiUrl }\n}\n\n// ============================================\n// Cached API Call\n// ============================================\n\n/**\n * Fetch location page section content from Portal\n * Cached with React's cache() for request deduplication\n */\nexport const getLocationSection = cache(async (\n projectId: string,\n path: string,\n section: string\n): Promise<LocationSectionData | null> => {\n const { apiUrl } = getApiConfig()\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/location-content`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_id: projectId,\n path,\n section,\n }),\n next: { revalidate: 3600 }, // Cache for 1 hour\n })\n \n if (!response.ok) {\n console.error(`LocationPageContent: Failed to fetch section \"${section}\" for path \"${path}\"`)\n return null\n }\n \n const data = await response.json()\n return data\n } catch (error) {\n console.error('LocationPageContent: API error:', error)\n return null\n }\n})\n\n// ============================================\n// Default Renderers\n// ============================================\n\nfunction HeroRenderer({ data, className }: { data: HeroSectionContent; className?: string }) {\n return (\n <section className={className || 'location-hero'}>\n <h1>{data.title}</h1>\n {data.subtitle && <p className=\"subtitle\">{data.subtitle}</p>}\n {data.stats && (\n <div className=\"stats-grid\">\n {data.stats.map((stat, i) => (\n <div key={i} className=\"stat\">\n <span className=\"stat-value\">{stat.value}</span>\n <span className=\"stat-label\">{stat.label}</span>\n </div>\n ))}\n </div>\n )}\n {data.cta_text && data.cta_href && (\n <a href={data.cta_href} className=\"cta-button\">\n {data.cta_text}\n </a>\n )}\n </section>\n )\n}\n\nfunction TextRenderer({ data, className }: { data: TextSectionContent; className?: string }) {\n if (data.html) {\n return (\n <section \n className={className || 'location-text'} \n dangerouslySetInnerHTML={{ __html: data.html }} \n />\n )\n }\n \n return (\n <section className={className || 'location-text'}>\n {data.heading && <h2>{data.heading}</h2>}\n {data.paragraphs.map((p, i) => (\n <p key={i}>{p}</p>\n ))}\n </section>\n )\n}\n\nfunction ServicesGridRenderer({ data, className }: { data: ServiceGridContent; className?: string }) {\n return (\n <section className={className || 'location-services-grid'}>\n <div className=\"services-list\">\n {data.services.map((service, i) => (\n <a key={i} href={service.href} className=\"service-card\">\n {service.icon && <span className=\"service-icon\">{service.icon}</span>}\n <h3>{service.title}</h3>\n <p>{service.description}</p>\n </a>\n ))}\n </div>\n </section>\n )\n}\n\nfunction DefaultRenderer({ data, className }: { data: any; className?: string }) {\n // Fallback: just render as JSON for debugging\n if (process.env.NODE_ENV === 'development') {\n return (\n <section className={className}>\n <pre style={{ fontSize: '12px', background: '#f0f0f0', padding: '1rem' }}>\n {JSON.stringify(data, null, 2)}\n </pre>\n </section>\n )\n }\n \n // In production, try to render content as text/html\n if (typeof data.content === 'string') {\n return (\n <section \n className={className} \n dangerouslySetInnerHTML={{ __html: data.content }} \n />\n )\n }\n \n return null\n}\n\n// ============================================\n// Main Component\n// ============================================\n\n/**\n * LocationPageContent - Server Component\n * \n * Fetches and renders a section of a location page from Portal.\n * Content is fully editable in Portal → SEO → Location Pages.\n */\nexport async function LocationPageContent({\n projectId,\n path,\n section,\n fallback = null,\n className,\n render,\n}: LocationPageContentProps): Promise<React.ReactElement | null> {\n const data = await getLocationSection(projectId, path, section)\n \n if (!data) {\n return fallback as React.ReactElement | null\n }\n \n // If custom renderer provided, use it\n if (render) {\n return <>{render(data)}</>\n }\n \n // Use default renderers based on section type\n switch (data.type) {\n case 'hero':\n return <HeroRenderer data={data.content as HeroSectionContent} className={className} />\n \n case 'text':\n case 'intro':\n case 'about':\n case 'about_location':\n return <TextRenderer data={data.content as TextSectionContent} className={className} />\n \n case 'services_grid':\n case 'services':\n return <ServicesGridRenderer data={data.content as ServiceGridContent} className={className} />\n \n default:\n return <DefaultRenderer data={data} className={className} />\n }\n}\n\n// Export types for external use\nexport type {\n HeroSectionContent as LocationHeroContent,\n ServiceGridContent as LocationServicesContent,\n TextSectionContent as LocationTextContent,\n}\n"]}
|
package/dist/seo/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { ManagedNoScripts, ManagedScripts } from '../chunk-
|
|
2
|
-
export { SitemapSync } from '../chunk-
|
|
3
|
-
export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-
|
|
4
|
-
import { getSEOPageData, ensureMetadata, getABTest, recordABImpression, getSchemaMarkups, getEntityEnhancedSchema, getFAQData, getInternalLinks, getContentBlock, getEntities } from '../chunk-
|
|
5
|
-
export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-
|
|
1
|
+
export { ManagedNoScripts, ManagedScripts } from '../chunk-5F7FFUPJ.mjs';
|
|
2
|
+
export { SitemapSync } from '../chunk-JIDOXTX2.mjs';
|
|
3
|
+
export { generateSitemap, getRedirect, getRobotsDirective, isIndexable } from '../chunk-2RHO4KSK.mjs';
|
|
4
|
+
import { getSEOPageData, ensureMetadata, getABTest, recordABImpression, getSchemaMarkups, getEntityEnhancedSchema, getFAQData, getInternalLinks, getContentBlock, getEntities } from '../chunk-SQSBAPWA.mjs';
|
|
5
|
+
export { getABTest, getContentBlock, getEntities, getEntityEnhancedSchema, getFAQData, getInternalLinks, getManagedScripts, getPrimaryEntity, getRedirectData, getRobotsData, getSEOPageData, getSchemaMarkups, getSitemapEntries, getVisibilityScore, getVisibilitySummary, recordABImpression, registerSitemap } from '../chunk-SQSBAPWA.mjs';
|
|
6
6
|
import '../chunk-4XPGGLVP.mjs';
|
|
7
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
8
|
import { cache } from 'react';
|
|
@@ -661,7 +661,7 @@ async function getManagedContentData(path, section) {
|
|
|
661
661
|
return getContentBlock(path, section);
|
|
662
662
|
}
|
|
663
663
|
function getApiConfig() {
|
|
664
|
-
const apiUrl = process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.
|
|
664
|
+
const apiUrl = process.env.SONOR_API_URL || process.env.UPTRADE_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io";
|
|
665
665
|
return { apiUrl };
|
|
666
666
|
}
|
|
667
667
|
var getLocationSection = cache(async (projectId, path, section) => {
|