@clay-ds/react 0.3.1 → 0.3.2

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/dist/catalog.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "variants": [
18
18
  "12 layouts"
19
19
  ],
20
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
20
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
21
21
  },
22
22
  "CustomerLogoSection": {
23
23
  "type": "CustomerLogoSection",
@@ -32,7 +32,7 @@
32
32
  "variants": [
33
33
  "3 color modes"
34
34
  ],
35
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
35
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
36
36
  },
37
37
  "FeaturesSection": {
38
38
  "type": "FeaturesSection",
@@ -51,7 +51,7 @@
51
51
  "side-by-side",
52
52
  "tabs-background"
53
53
  ],
54
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
54
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
55
55
  },
56
56
  "CardsSection": {
57
57
  "type": "CardsSection",
@@ -72,7 +72,7 @@
72
72
  "side-by-side",
73
73
  "horizontal-reveal"
74
74
  ],
75
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
75
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
76
76
  },
77
77
  "TestimonialsSection": {
78
78
  "type": "TestimonialsSection",
@@ -94,7 +94,7 @@
94
94
  "carousel-with-stat",
95
95
  "mixed-stat-and-quote"
96
96
  ],
97
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
97
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
98
98
  },
99
99
  "FaqSection": {
100
100
  "type": "FaqSection",
@@ -111,7 +111,7 @@
111
111
  "side-by-side",
112
112
  "centered"
113
113
  ],
114
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
114
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
115
115
  },
116
116
  "BulletsSection": {
117
117
  "type": "BulletsSection",
@@ -132,7 +132,7 @@
132
132
  "icons",
133
133
  "cardsRight"
134
134
  ],
135
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
135
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
136
136
  },
137
137
  "CtaSection": {
138
138
  "type": "CtaSection",
@@ -150,7 +150,7 @@
150
150
  "centered",
151
151
  "floating-card"
152
152
  ],
153
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
153
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
154
154
  },
155
155
  "FooterSection": {
156
156
  "type": "FooterSection",
@@ -161,7 +161,7 @@
161
161
  "logoAlt"
162
162
  ],
163
163
  "variants": [],
164
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
164
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
165
165
  },
166
166
  "ContactSection": {
167
167
  "type": "ContactSection",
@@ -180,7 +180,7 @@
180
180
  "containerWidth"
181
181
  ],
182
182
  "variants": [],
183
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
183
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
184
184
  },
185
185
  "TrustSection": {
186
186
  "type": "TrustSection",
@@ -207,7 +207,7 @@
207
207
  "badges",
208
208
  "bento"
209
209
  ],
210
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
210
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
211
211
  },
212
212
  "NumbersSection": {
213
213
  "type": "NumbersSection",
@@ -224,7 +224,7 @@
224
224
  "bento",
225
225
  "stack-bento"
226
226
  ],
227
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
227
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
228
228
  },
229
229
  "IntegrationsSection": {
230
230
  "type": "IntegrationsSection",
@@ -241,6 +241,6 @@
241
241
  "ctaHref"
242
242
  ],
243
243
  "variants": [],
244
- "generatedFromSha": "dba403a3e109ab9f7773a39bdfb8a730bf6586ab"
244
+ "generatedFromSha": "f5632e863c5ae5d4cef0779e4b2761b311816cbf"
245
245
  }
246
246
  }
package/dist/render.cjs CHANGED
@@ -297,9 +297,11 @@ function renderPageSpec(input) {
297
297
  return /* @__PURE__ */ jsxRuntime.jsx(React.Fragment, { children: render(props) }, i);
298
298
  });
299
299
  const css = loadCss();
300
+ const navLogoSrc = resolveLogoSrc("products/monday-com/Layout=Master, Type Color=Black, Com=On") ?? void 0;
301
+ const navActions = /* @__PURE__ */ jsxRuntime.jsx("a", { href: "#", style: { display: "contents" }, children: /* @__PURE__ */ jsxRuntime.jsx(footerDefaults.Button, { buttonStyle: "primary", size: "regular", children: "Get started" }) });
300
302
  const bodyHtml = server.renderToStaticMarkup(
301
303
  /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
302
- /* @__PURE__ */ jsxRuntime.jsx(footerDefaults.NavbarMenu, {}),
304
+ /* @__PURE__ */ jsxRuntime.jsx(footerDefaults.NavbarMenu, { logoSrc: navLogoSrc, actions: navActions }),
303
305
  sectionElements
304
306
  ] })
305
307
  );
@@ -1 +1 @@
1
- {"version":3,"file":"render.cjs","sources":["../src/ssr/renderPageSpec.tsx"],"sourcesContent":["/**\n * renderPageSpec — maps a typed PageSpec to real Clay React components and\n * returns self-contained static HTML + CSS.\n *\n * Node-safe (no import.meta.glob, no Vite-only APIs).\n * v1 is static-only (renderToStaticMarkup); no hydration.\n *\n * Naming skew resolved here (not in the public PageSpec contract):\n * IntegrationsSection → exported `Integrations` component\n * TrustSection layout=\"bento\" → TrustSection with layout=\"bento\"\n */\n\nimport type { ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { readFileSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createRequire } from 'node:module'\n\nimport {\n Button,\n CustomerLogo,\n CustomerLogoSection,\n HeaderSection,\n FeaturesSection,\n CardsSection,\n TestimonialsSection,\n FaqSection,\n BulletsSection,\n CtaSection,\n FooterSection,\n FOOTER_DEFAULTS,\n ContactSection,\n TrustSection,\n NumbersSection,\n Integrations,\n NavbarMenu,\n MediaSlot,\n} from '../index'\n\nimport { logoSvg } from '../logos/resolve'\nimport { PageSpec, sectionSchemas, type SectionType } from '../page-spec/index'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst require = createRequire(import.meta.url)\n\n// ── helpers ─────────────────────────────────────────────────────────────────\n\nfunction svgDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n\nfunction resolveLogoSrc(key: string): string | null {\n const svg = logoSvg(key)\n return svg ? svgDataUrl(svg) : null\n}\n\nconst BulletDefaultIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"6\" fill=\"currentColor\" />\n </svg>\n)\n\nfunction makeCtas(ctas: { label: string; href: string }[] | undefined): ReactNode {\n if (!ctas?.length) return undefined\n return (\n <>\n {ctas.map((c, i) => (\n <a key={i} href={c.href} style={{ display: 'contents' }}>\n {/* Adapter sets semantics (first CTA = primary) only; color is Clay's to decide\n (Button defaults to the brand color). Never hard-code a color here. */}\n <Button buttonStyle={i === 0 ? 'primary' : 'secondary'} size=\"regular\">\n {c.label}\n </Button>\n </a>\n ))}\n </>\n )\n}\n\nfunction makeMedia(\n m:\n | {\n src: string\n type?: 'image' | 'video'\n alt?: string\n fit?: 'contain' | 'cover' | 'fill'\n aspectRatio?: string\n }\n | undefined\n): ReactNode {\n if (!m?.src) return undefined\n const isVideo = m.type === 'video'\n return (\n <MediaSlot\n type={isVideo ? 'video' : 'image'}\n src={m.src}\n alt={m.alt}\n fit={m.fit}\n aspectRatio={m.aspectRatio}\n {...(isVideo ? { autoPlay: true, loop: true } : {})}\n />\n )\n}\n\n// ── CSS loader (cached) ──────────────────────────────────────────────────────\n\nlet _css: string | null = null\n\nfunction loadCss(): string {\n if (_css) return _css\n const tokensCssPath = require.resolve('@clay-ds/tokens/css')\n const tokensCss = readFileSync(tokensCssPath, 'utf8')\n const componentCss = readFileSync(join(__dirname, 'index.css'), 'utf8')\n _css = tokensCss + '\\n' + componentCss\n return _css\n}\n\n// ── section registry ─────────────────────────────────────────────────────────\n\ntype SectionRenderers = {\n [K in SectionType]: (props: import('zod').infer<(typeof sectionSchemas)[K]>) => ReactNode\n}\n\nconst SECTION_REGISTRY: SectionRenderers = {\n HeaderSection(data) {\n const logos = data.logoKeys?.length ? (\n <>\n {data.logoKeys.map((key, i) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n const name = key.split('/').pop() ?? key\n return <CustomerLogo key={i} src={src} name={name} placement=\"web\" />\n })}\n </>\n ) : undefined\n return (\n <HeaderSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actionCaption={data.actionCaption}\n actions={makeCtas(data.ctas)}\n logos={logos}\n media={makeMedia(data.media)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CustomerLogoSection(data) {\n // Drop unresolved keys rather than emit a broken <img src=\"\">.\n const logos = data.logoKeys\n .map((key) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n return { name: key.split('/').pop() ?? key, srcBlack: src, srcColored: src }\n })\n .filter((l): l is { name: string; srcBlack: string; srcColored: string } => l !== null)\n return (\n <CustomerLogoSection\n heading={data.heading}\n logos={logos}\n colorMode={data.colorMode}\n />\n )\n },\n\n FeaturesSection(data) {\n const items = data.items.map((it) => ({\n ...it,\n media: makeMedia(it.media),\n }))\n return (\n <FeaturesSection\n layout={data.layout}\n sectionHeading={data.sectionHeading}\n sectionTopic={data.sectionTopic}\n sectionDescription={data.sectionDescription}\n items={items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CardsSection(data) {\n const cards = data.cards?.map((c) => ({\n ...c,\n media: makeMedia(c.media),\n }))\n return (\n <CardsSection\n layout={data.layout}\n tagline={data.tagline}\n sectionHeading={data.sectionHeading}\n sectionDescription={data.sectionDescription}\n cards={cards}\n revealCards={data.revealCards}\n valueCards={data.valueCards}\n iconLinkCards={data.iconLinkCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TestimonialsSection(data) {\n const cards = data.cards?.map((c) => ({\n quote: c.quote,\n authorName: c.authorName,\n authorRole: c.authorRole,\n stars: c.stars,\n stat: c.stat,\n statLabel: c.statLabel,\n ctaLabel: c.ctaLabel,\n ctaHref: c.ctaHref,\n logo: c.logoKey\n ? (() => {\n const src = resolveLogoSrc(c.logoKey)\n if (!src) return undefined\n return (\n <CustomerLogo\n src={src}\n name={c.logoKey.split('/').pop() ?? c.logoKey}\n placement=\"marketing\"\n />\n )\n })()\n : undefined,\n }))\n return (\n <TestimonialsSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n miniTitle={data.miniTitle}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n cards={cards}\n carouselCards={data.carouselCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FaqSection(data) {\n return (\n <FaqSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n BulletsSection(data) {\n const action = data.cta ? (\n <a href={data.cta.href} style={{ display: 'contents' }}>\n <Button buttonStyle=\"secondary\" size=\"regular\">\n {data.cta.label}\n </Button>\n </a>\n ) : undefined\n return (\n <BulletsSection\n layout={data.layout}\n miniTitle={data.miniTitle}\n heading={data.heading}\n description={data.description}\n columns={data.columns}\n items={data.items.map((item) => ({\n icon: <BulletDefaultIcon />,\n title: item.title,\n description: item.description,\n }))}\n action={action}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CtaSection(data) {\n return (\n <CtaSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actions={makeCtas(data.ctas)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FooterSection(data) {\n const logoSrcValue = data.logoKey ? resolveLogoSrc(data.logoKey) : undefined\n // FOOTER_DEFAULTS deliberately omits logo (consumers supply per-brand).\n // Only pass logo when we have a resolvable src — never an empty string,\n // which would render a broken <img> and trigger a React warning.\n const logo = logoSrcValue\n ? { src: logoSrcValue, alt: data.logoAlt ?? 'monday.com', href: '/' }\n : undefined\n return <FooterSection {...FOOTER_DEFAULTS} logo={logo} />\n },\n\n ContactSection(data) {\n const logos = data.logos\n ?.map((item) => {\n const src = resolveLogoSrc(item.key)\n return src ? { src, name: item.name } : null\n })\n .filter((l): l is { src: string; name: string } => l !== null)\n return (\n <ContactSection\n heading={data.heading}\n description={data.description}\n ratingValue={data.ratingValue}\n ratingLabel={data.ratingLabel}\n formTitle={data.formTitle}\n submitLabel={data.submitLabel}\n fields={data.fields}\n logos={logos}\n badges={data.badges}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TrustSection(data) {\n return (\n <TrustSection\n layout={data.layout}\n heading={data.heading}\n ratingValue={data.ratingValue}\n ratingOut={data.ratingOut}\n ratingLabel={data.ratingLabel}\n badges={data.badges}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n topicLabel={data.topicLabel}\n securityTitle={data.securityTitle}\n securityDescription={data.securityDescription}\n securityLinkLabel={data.securityLinkLabel}\n securityLinkHref={data.securityLinkHref}\n complianceLogos={data.complianceLogos}\n statCards={data.statCards}\n />\n )\n },\n\n NumbersSection(data) {\n return (\n <NumbersSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n IntegrationsSection(data) {\n // naming skew: IntegrationsSection (agent-facing) → Integrations (React export)\n const integrations = data.integrations\n ?.map((item) => {\n const src =\n resolveLogoSrc(item.key) ??\n resolveLogoSrc(`integrations/${item.name.toLowerCase()}`)\n return src ? { name: item.name, src } : null\n })\n .filter((i): i is { name: string; src: string } => i !== null)\n return (\n <Integrations\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n integrations={integrations}\n statValue={data.statValue}\n statLabel={data.statLabel}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n />\n )\n },\n}\n\n// ── public API ───────────────────────────────────────────────────────────────\n\nexport interface RenderResult {\n /** Complete self-contained HTML document */\n html: string\n /** Combined CSS (tokens + component styles) for reference */\n css: string\n}\n\n/**\n * Parse a PageSpec and render it to static HTML using real Clay React components.\n * Throws a ZodError on invalid input.\n */\nexport function renderPageSpec(input: unknown): RenderResult {\n const spec = PageSpec.parse(input)\n\n const sectionElements = spec.sections.map((section, i) => {\n const schema = sectionSchemas[section.type as SectionType]\n const props = schema.parse(section.props)\n const render = SECTION_REGISTRY[section.type as SectionType]\n return <Fragment key={i}>{render(props as never)}</Fragment>\n })\n\n const css = loadCss()\n\n const bodyHtml = renderToStaticMarkup(\n <>\n <NavbarMenu />\n {sectionElements}\n </>\n )\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<title>${spec.brand ?? 'Landing Page'}</title>\n<style>${css}</style>\n</head>\n<body>\n${bodyHtml}\n</body>\n</html>`\n\n return { html, css }\n}\n"],"names":["__dirname","dirname","fileURLToPath","require","createRequire","logoSvg","jsx","Fragment","Button","MediaSlot","readFileSync","join","CustomerLogo","HeaderSection","CustomerLogoSection","FeaturesSection","CardsSection","TestimonialsSection","FaqSection","BulletsSection","CtaSection","FooterSection","FOOTER_DEFAULTS","ContactSection","TrustSection","NumbersSection","Integrations","PageSpec","sectionSchemas","renderToStaticMarkup","jsxs","NavbarMenu"],"mappings":"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"}
1
+ {"version":3,"file":"render.cjs","sources":["../src/ssr/renderPageSpec.tsx"],"sourcesContent":["/**\n * renderPageSpec — maps a typed PageSpec to real Clay React components and\n * returns self-contained static HTML + CSS.\n *\n * Node-safe (no import.meta.glob, no Vite-only APIs).\n * v1 is static-only (renderToStaticMarkup); no hydration.\n *\n * Naming skew resolved here (not in the public PageSpec contract):\n * IntegrationsSection → exported `Integrations` component\n * TrustSection layout=\"bento\" → TrustSection with layout=\"bento\"\n */\n\nimport type { ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { readFileSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createRequire } from 'node:module'\n\nimport {\n Button,\n CustomerLogo,\n CustomerLogoSection,\n HeaderSection,\n FeaturesSection,\n CardsSection,\n TestimonialsSection,\n FaqSection,\n BulletsSection,\n CtaSection,\n FooterSection,\n FOOTER_DEFAULTS,\n ContactSection,\n TrustSection,\n NumbersSection,\n Integrations,\n NavbarMenu,\n MediaSlot,\n} from '../index'\n\nimport { logoSvg } from '../logos/resolve'\nimport { PageSpec, sectionSchemas, type SectionType } from '../page-spec/index'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst require = createRequire(import.meta.url)\n\n// ── helpers ─────────────────────────────────────────────────────────────────\n\nfunction svgDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n\nfunction resolveLogoSrc(key: string): string | null {\n const svg = logoSvg(key)\n return svg ? svgDataUrl(svg) : null\n}\n\nconst BulletDefaultIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"6\" fill=\"currentColor\" />\n </svg>\n)\n\nfunction makeCtas(ctas: { label: string; href: string }[] | undefined): ReactNode {\n if (!ctas?.length) return undefined\n return (\n <>\n {ctas.map((c, i) => (\n <a key={i} href={c.href} style={{ display: 'contents' }}>\n {/* Adapter sets semantics (first CTA = primary) only; color is Clay's to decide\n (Button defaults to the brand color). Never hard-code a color here. */}\n <Button buttonStyle={i === 0 ? 'primary' : 'secondary'} size=\"regular\">\n {c.label}\n </Button>\n </a>\n ))}\n </>\n )\n}\n\nfunction makeMedia(\n m:\n | {\n src: string\n type?: 'image' | 'video'\n alt?: string\n fit?: 'contain' | 'cover' | 'fill'\n aspectRatio?: string\n }\n | undefined\n): ReactNode {\n if (!m?.src) return undefined\n const isVideo = m.type === 'video'\n return (\n <MediaSlot\n type={isVideo ? 'video' : 'image'}\n src={m.src}\n alt={m.alt}\n fit={m.fit}\n aspectRatio={m.aspectRatio}\n {...(isVideo ? { autoPlay: true, loop: true } : {})}\n />\n )\n}\n\n// ── CSS loader (cached) ──────────────────────────────────────────────────────\n\nlet _css: string | null = null\n\nfunction loadCss(): string {\n if (_css) return _css\n const tokensCssPath = require.resolve('@clay-ds/tokens/css')\n const tokensCss = readFileSync(tokensCssPath, 'utf8')\n const componentCss = readFileSync(join(__dirname, 'index.css'), 'utf8')\n _css = tokensCss + '\\n' + componentCss\n return _css\n}\n\n// ── section registry ─────────────────────────────────────────────────────────\n\ntype SectionRenderers = {\n [K in SectionType]: (props: import('zod').infer<(typeof sectionSchemas)[K]>) => ReactNode\n}\n\nconst SECTION_REGISTRY: SectionRenderers = {\n HeaderSection(data) {\n const logos = data.logoKeys?.length ? (\n <>\n {data.logoKeys.map((key, i) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n const name = key.split('/').pop() ?? key\n return <CustomerLogo key={i} src={src} name={name} placement=\"web\" />\n })}\n </>\n ) : undefined\n return (\n <HeaderSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actionCaption={data.actionCaption}\n actions={makeCtas(data.ctas)}\n logos={logos}\n media={makeMedia(data.media)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CustomerLogoSection(data) {\n // Drop unresolved keys rather than emit a broken <img src=\"\">.\n const logos = data.logoKeys\n .map((key) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n return { name: key.split('/').pop() ?? key, srcBlack: src, srcColored: src }\n })\n .filter((l): l is { name: string; srcBlack: string; srcColored: string } => l !== null)\n return (\n <CustomerLogoSection\n heading={data.heading}\n logos={logos}\n colorMode={data.colorMode}\n />\n )\n },\n\n FeaturesSection(data) {\n const items = data.items.map((it) => ({\n ...it,\n media: makeMedia(it.media),\n }))\n return (\n <FeaturesSection\n layout={data.layout}\n sectionHeading={data.sectionHeading}\n sectionTopic={data.sectionTopic}\n sectionDescription={data.sectionDescription}\n items={items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CardsSection(data) {\n const cards = data.cards?.map((c) => ({\n ...c,\n media: makeMedia(c.media),\n }))\n return (\n <CardsSection\n layout={data.layout}\n tagline={data.tagline}\n sectionHeading={data.sectionHeading}\n sectionDescription={data.sectionDescription}\n cards={cards}\n revealCards={data.revealCards}\n valueCards={data.valueCards}\n iconLinkCards={data.iconLinkCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TestimonialsSection(data) {\n const cards = data.cards?.map((c) => ({\n quote: c.quote,\n authorName: c.authorName,\n authorRole: c.authorRole,\n stars: c.stars,\n stat: c.stat,\n statLabel: c.statLabel,\n ctaLabel: c.ctaLabel,\n ctaHref: c.ctaHref,\n logo: c.logoKey\n ? (() => {\n const src = resolveLogoSrc(c.logoKey)\n if (!src) return undefined\n return (\n <CustomerLogo\n src={src}\n name={c.logoKey.split('/').pop() ?? c.logoKey}\n placement=\"marketing\"\n />\n )\n })()\n : undefined,\n }))\n return (\n <TestimonialsSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n miniTitle={data.miniTitle}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n cards={cards}\n carouselCards={data.carouselCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FaqSection(data) {\n return (\n <FaqSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n BulletsSection(data) {\n const action = data.cta ? (\n <a href={data.cta.href} style={{ display: 'contents' }}>\n <Button buttonStyle=\"secondary\" size=\"regular\">\n {data.cta.label}\n </Button>\n </a>\n ) : undefined\n return (\n <BulletsSection\n layout={data.layout}\n miniTitle={data.miniTitle}\n heading={data.heading}\n description={data.description}\n columns={data.columns}\n items={data.items.map((item) => ({\n icon: <BulletDefaultIcon />,\n title: item.title,\n description: item.description,\n }))}\n action={action}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CtaSection(data) {\n return (\n <CtaSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actions={makeCtas(data.ctas)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FooterSection(data) {\n const logoSrcValue = data.logoKey ? resolveLogoSrc(data.logoKey) : undefined\n // FOOTER_DEFAULTS deliberately omits logo (consumers supply per-brand).\n // Only pass logo when we have a resolvable src — never an empty string,\n // which would render a broken <img> and trigger a React warning.\n const logo = logoSrcValue\n ? { src: logoSrcValue, alt: data.logoAlt ?? 'monday.com', href: '/' }\n : undefined\n return <FooterSection {...FOOTER_DEFAULTS} logo={logo} />\n },\n\n ContactSection(data) {\n const logos = data.logos\n ?.map((item) => {\n const src = resolveLogoSrc(item.key)\n return src ? { src, name: item.name } : null\n })\n .filter((l): l is { src: string; name: string } => l !== null)\n return (\n <ContactSection\n heading={data.heading}\n description={data.description}\n ratingValue={data.ratingValue}\n ratingLabel={data.ratingLabel}\n formTitle={data.formTitle}\n submitLabel={data.submitLabel}\n fields={data.fields}\n logos={logos}\n badges={data.badges}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TrustSection(data) {\n return (\n <TrustSection\n layout={data.layout}\n heading={data.heading}\n ratingValue={data.ratingValue}\n ratingOut={data.ratingOut}\n ratingLabel={data.ratingLabel}\n badges={data.badges}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n topicLabel={data.topicLabel}\n securityTitle={data.securityTitle}\n securityDescription={data.securityDescription}\n securityLinkLabel={data.securityLinkLabel}\n securityLinkHref={data.securityLinkHref}\n complianceLogos={data.complianceLogos}\n statCards={data.statCards}\n />\n )\n },\n\n NumbersSection(data) {\n return (\n <NumbersSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n IntegrationsSection(data) {\n // naming skew: IntegrationsSection (agent-facing) → Integrations (React export)\n const integrations = data.integrations\n ?.map((item) => {\n const src =\n resolveLogoSrc(item.key) ??\n resolveLogoSrc(`integrations/${item.name.toLowerCase()}`)\n return src ? { name: item.name, src } : null\n })\n .filter((i): i is { name: string; src: string } => i !== null)\n return (\n <Integrations\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n integrations={integrations}\n statValue={data.statValue}\n statLabel={data.statLabel}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n />\n )\n },\n}\n\n// ── public API ───────────────────────────────────────────────────────────────\n\nexport interface RenderResult {\n /** Complete self-contained HTML document */\n html: string\n /** Combined CSS (tokens + component styles) for reference */\n css: string\n}\n\n/**\n * Parse a PageSpec and render it to static HTML using real Clay React components.\n * Throws a ZodError on invalid input.\n */\nexport function renderPageSpec(input: unknown): RenderResult {\n const spec = PageSpec.parse(input)\n\n const sectionElements = spec.sections.map((section, i) => {\n const schema = sectionSchemas[section.type as SectionType]\n const props = schema.parse(section.props)\n const render = SECTION_REGISTRY[section.type as SectionType]\n return <Fragment key={i}>{render(props as never)}</Fragment>\n })\n\n const css = loadCss()\n\n // Resolve the monday.com colored wordmark — Master layout, black type, \".com\" on.\n // Only pass logoSrc when we have a real src; never pass an empty string (broken <img>).\n const navLogoSrc = resolveLogoSrc('products/monday-com/Layout=Master, Type Color=Black, Com=On') ?? undefined\n\n // Default primary CTA for campaign-style bars: mirrors the real monday.com top bar.\n const navActions = (\n <a href=\"#\" style={{ display: 'contents' }}>\n <Button buttonStyle=\"primary\" size=\"regular\">Get started</Button>\n </a>\n )\n\n const bodyHtml = renderToStaticMarkup(\n <>\n <NavbarMenu logoSrc={navLogoSrc} actions={navActions} />\n {sectionElements}\n </>\n )\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<title>${spec.brand ?? 'Landing Page'}</title>\n<style>${css}</style>\n</head>\n<body>\n${bodyHtml}\n</body>\n</html>`\n\n return { html, css }\n}\n"],"names":["__dirname","dirname","fileURLToPath","require","createRequire","logoSvg","jsx","Fragment","Button","MediaSlot","readFileSync","join","CustomerLogo","HeaderSection","CustomerLogoSection","FeaturesSection","CardsSection","TestimonialsSection","FaqSection","BulletsSection","CtaSection","FooterSection","FOOTER_DEFAULTS","ContactSection","TrustSection","NumbersSection","Integrations","PageSpec","sectionSchemas","renderToStaticMarkup","jsxs","NavbarMenu"],"mappings":";;;;;;;;;;;;;AA4CA,MAAMA,cAAYC,UAAAA,QAAQC,uBAAc,OAAA,aAAA,cAAA,QAAA,KAAA,EAAA,cAAA,UAAA,EAAA,OAAA,0BAAA,uBAAA,QAAA,YAAA,MAAA,YAAA,uBAAA,OAAA,IAAA,IAAA,cAAA,SAAA,OAAA,EAAA,IAAe,CAAC;AACxD,MAAMC,YAAUC,YAAAA,iQAA6B;AAI7C,SAAS,WAAW,KAAqB;AACvC,SAAO,oCAAoC,mBAAmB,GAAG,CAAC;AACpE;AAEA,SAAS,eAAe,KAA4B;AAClD,QAAM,MAAMC,cAAAA,QAAQ,GAAG;AACvB,SAAO,MAAM,WAAW,GAAG,IAAI;AACjC;AAEA,MAAM,oBAAoB,MACxBC,2BAAAA,IAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,UAAAA,2BAAAA,IAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,eAAA,CAAe,EAAA,CACpD;AAGF,SAAS,SAAS,MAAgE;AAChF,MAAI,EAAC,6BAAM,QAAQ,QAAO;AAC1B,SACEA,2BAAAA,IAAAC,WAAAA,UAAA,EACG,UAAA,KAAK,IAAI,CAAC,GAAG,MACZD,2BAAAA,IAAC,KAAA,EAAU,MAAM,EAAE,MAAM,OAAO,EAAE,SAAS,WAAA,GAGzC,UAAAA,2BAAAA,IAACE,eAAAA,QAAA,EAAO,aAAa,MAAM,IAAI,YAAY,aAAa,MAAK,WAC1D,UAAA,EAAE,MAAA,CACL,KALM,CAMR,CACD,GACH;AAEJ;AAEA,SAAS,UACP,GASW;AACX,MAAI,EAAC,uBAAG,KAAK,QAAO;AACpB,QAAM,UAAU,EAAE,SAAS;AAC3B,SACEF,2BAAAA;AAAAA,IAACG,eAAAA;AAAAA,IAAA;AAAA,MACC,MAAM,UAAU,UAAU;AAAA,MAC1B,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,aAAa,EAAE;AAAA,MACd,GAAI,UAAU,EAAE,UAAU,MAAM,MAAM,KAAA,IAAS,CAAA;AAAA,IAAC;AAAA,EAAA;AAGvD;AAIA,IAAI,OAAsB;AAE1B,SAAS,UAAkB;AACzB,MAAI,KAAM,QAAO;AACjB,QAAM,gBAAgBN,UAAQ,QAAQ,qBAAqB;AAC3D,QAAM,YAAYO,QAAAA,aAAa,eAAe,MAAM;AACpD,QAAM,eAAeA,QAAAA,aAAaC,UAAAA,KAAKX,aAAW,WAAW,GAAG,MAAM;AACtE,SAAO,YAAY,OAAO;AAC1B,SAAO;AACT;AAQA,MAAM,mBAAqC;AAAA,EACzC,cAAc,MAAM;;AAClB,UAAM,UAAQ,UAAK,aAAL,mBAAe,UAC3BM,2BAAAA,IAAAC,WAAAA,UAAA,EACG,eAAK,SAAS,IAAI,CAAC,KAAK,MAAM;AAC7B,YAAM,MAAM,eAAe,GAAG;AAC9B,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,OAAO,IAAI,MAAM,GAAG,EAAE,SAAS;AACrC,4CAAQK,eAAAA,cAAA,EAAqB,KAAU,MAAY,WAAU,SAAnC,CAAyC;AAAA,IACrE,CAAC,GACH,IACE;AACJ,WACEN,2BAAAA;AAAAA,MAACO,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,QACpB,SAAS,SAAS,KAAK,IAAI;AAAA,QAC3B;AAAA,QACA,OAAO,UAAU,KAAK,KAAK;AAAA,QAC3B,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;AAExB,UAAM,QAAQ,KAAK,SAChB,IAAI,CAAC,QAAQ;AACZ,YAAM,MAAM,eAAe,GAAG;AAC9B,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE,IAAA,KAAS,KAAK,UAAU,KAAK,YAAY,IAAA;AAAA,IACzE,CAAC,EACA,OAAO,CAAC,MAAmE,MAAM,IAAI;AACxF,WACEP,2BAAAA;AAAAA,MAACQ,eAAAA;AAAAA,MAAA;AAAA,QACC,SAAS,KAAK;AAAA,QACd;AAAA,QACA,WAAW,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAAA,EAEA,gBAAgB,MAAM;AACpB,UAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ;AAAA,MACpC,GAAG;AAAA,MACH,OAAO,UAAU,GAAG,KAAK;AAAA,IAAA,EACzB;AACF,WACER,2BAAAA;AAAAA,MAACS,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,cAAc,KAAK;AAAA,QACnB,oBAAoB,KAAK;AAAA,QACzB;AAAA,QACA,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,aAAa,MAAM;;AACjB,UAAM,SAAQ,UAAK,UAAL,mBAAY,IAAI,CAAC,OAAO;AAAA,MACpC,GAAG;AAAA,MACH,OAAO,UAAU,EAAE,KAAK;AAAA,IAAA;AAE1B,WACET,2BAAAA;AAAAA,MAACU,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,gBAAgB,KAAK;AAAA,QACrB,oBAAoB,KAAK;AAAA,QACzB;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;;AACxB,UAAM,SAAQ,UAAK,UAAL,mBAAY,IAAI,CAAC,OAAO;AAAA,MACpC,OAAO,EAAE;AAAA,MACT,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,MACd,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,MAAM,EAAE,WACH,MAAM;AACL,cAAM,MAAM,eAAe,EAAE,OAAO;AACpC,YAAI,CAAC,IAAK,QAAO;AACjB,eACEV,2BAAAA;AAAAA,UAACM,eAAAA;AAAAA,UAAA;AAAA,YACC;AAAA,YACA,MAAM,EAAE,QAAQ,MAAM,GAAG,EAAE,IAAA,KAAS,EAAE;AAAA,YACtC,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAGhB,OACA;AAAA,IAAA;AAEN,WACEN,2BAAAA;AAAAA,MAACW,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd;AAAA,QACA,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,WAAW,MAAM;AACf,WACEX,2BAAAA;AAAAA,MAACY,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,eAAe,MAAM;AACnB,UAAM,SAAS,KAAK,MAClBZ,2BAAAA,IAAC,KAAA,EAAE,MAAM,KAAK,IAAI,MAAM,OAAO,EAAE,SAAS,cACxC,UAAAA,2BAAAA,IAACE,eAAAA,QAAA,EAAO,aAAY,aAAY,MAAK,WAClC,UAAA,KAAK,IAAI,MAAA,CACZ,EAAA,CACF,IACE;AACJ,WACEF,2BAAAA;AAAAA,MAACa,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK,MAAM,IAAI,CAAC,UAAU;AAAA,UAC/B,qCAAO,mBAAA,EAAkB;AAAA,UACzB,OAAO,KAAK;AAAA,UACZ,aAAa,KAAK;AAAA,QAAA,EAClB;AAAA,QACF;AAAA,QACA,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,WAAW,MAAM;AACf,WACEb,2BAAAA;AAAAA,MAACc,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,SAAS,SAAS,KAAK,IAAI;AAAA,QAC3B,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,cAAc,MAAM;AAClB,UAAM,eAAe,KAAK,UAAU,eAAe,KAAK,OAAO,IAAI;AAInE,UAAM,OAAO,eACT,EAAE,KAAK,cAAc,KAAK,KAAK,WAAW,cAAc,MAAM,IAAA,IAC9D;AACJ,WAAOd,2BAAAA,IAACe,eAAAA,eAAA,EAAe,GAAGC,eAAAA,iBAAiB,KAAA,CAAY;AAAA,EACzD;AAAA,EAEA,eAAe,MAAM;;AACnB,UAAM,SAAQ,UAAK,UAAL,mBACV,IAAI,CAAC,SAAS;AACd,YAAM,MAAM,eAAe,KAAK,GAAG;AACnC,aAAO,MAAM,EAAE,KAAK,MAAM,KAAK,SAAS;AAAA,IAC1C,GACC,OAAO,CAAC,MAA0C,MAAM;AAC3D,WACEhB,2BAAAA;AAAAA,MAACiB,eAAAA;AAAAA,MAAA;AAAA,QACC,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,aAAa,MAAM;AACjB,WACEjB,2BAAAA;AAAAA,MAACkB,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK;AAAA,QACpB,qBAAqB,KAAK;AAAA,QAC1B,mBAAmB,KAAK;AAAA,QACxB,kBAAkB,KAAK;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,WAAW,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAAA,EAEA,eAAe,MAAM;AACnB,WACElB,2BAAAA;AAAAA,MAACmB,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;;AAExB,UAAM,gBAAe,UAAK,iBAAL,mBACjB,IAAI,CAAC,SAAS;AACd,YAAM,MACJ,eAAe,KAAK,GAAG,KACvB,eAAe,gBAAgB,KAAK,KAAK,YAAA,CAAa,EAAE;AAC1D,aAAO,MAAM,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,IAC1C,GACC,OAAO,CAAC,MAA0C,MAAM;AAC3D,WACEnB,2BAAAA;AAAAA,MAACoB,eAAAA;AAAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpB;AACF;AAeO,SAAS,eAAe,OAA8B;AAC3D,QAAM,OAAOC,SAAAA,SAAS,MAAM,KAAK;AAEjC,QAAM,kBAAkB,KAAK,SAAS,IAAI,CAAC,SAAS,MAAM;AACxD,UAAM,SAASC,SAAAA,eAAe,QAAQ,IAAmB;AACzD,UAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACxC,UAAM,SAAS,iBAAiB,QAAQ,IAAmB;AAC3D,0CAAQrB,MAAAA,UAAA,EAAkB,UAAA,OAAO,KAAc,KAAzB,CAA2B;AAAA,EACnD,CAAC;AAED,QAAM,MAAM,QAAA;AAIZ,QAAM,aAAa,eAAe,6DAA6D,KAAK;AAGpG,QAAM,aACJD,+BAAC,KAAA,EAAE,MAAK,KAAI,OAAO,EAAE,SAAS,WAAA,GAC5B,yCAACE,eAAAA,QAAA,EAAO,aAAY,WAAU,MAAK,WAAU,yBAAW,GAC1D;AAGF,QAAM,WAAWqB,OAAAA;AAAAA,IACfC,gCAAAvB,WAAAA,UAAA,EACE,UAAA;AAAA,MAAAD,2BAAAA,IAACyB,eAAAA,YAAA,EAAW,SAAS,YAAY,SAAS,YAAY;AAAA,MACrD;AAAA,IAAA,EAAA,CACH;AAAA,EAAA;AAGF,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN,KAAK,SAAS,cAAc;AAAA,SAC5B,GAAG;AAAA;AAAA;AAAA,EAGV,QAAQ;AAAA;AAAA;AAIR,SAAO,EAAE,MAAM,IAAA;AACjB;;"}
package/dist/render.js CHANGED
@@ -294,9 +294,11 @@ function renderPageSpec(input) {
294
294
  return /* @__PURE__ */ jsx(Fragment, { children: render(props) }, i);
295
295
  });
296
296
  const css = loadCss();
297
+ const navLogoSrc = resolveLogoSrc("products/monday-com/Layout=Master, Type Color=Black, Com=On") ?? void 0;
298
+ const navActions = /* @__PURE__ */ jsx("a", { href: "#", style: { display: "contents" }, children: /* @__PURE__ */ jsx(Button, { buttonStyle: "primary", size: "regular", children: "Get started" }) });
297
299
  const bodyHtml = renderToStaticMarkup(
298
300
  /* @__PURE__ */ jsxs(Fragment$1, { children: [
299
- /* @__PURE__ */ jsx(NavbarMenu, {}),
301
+ /* @__PURE__ */ jsx(NavbarMenu, { logoSrc: navLogoSrc, actions: navActions }),
300
302
  sectionElements
301
303
  ] })
302
304
  );
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sources":["../src/ssr/renderPageSpec.tsx"],"sourcesContent":["/**\n * renderPageSpec — maps a typed PageSpec to real Clay React components and\n * returns self-contained static HTML + CSS.\n *\n * Node-safe (no import.meta.glob, no Vite-only APIs).\n * v1 is static-only (renderToStaticMarkup); no hydration.\n *\n * Naming skew resolved here (not in the public PageSpec contract):\n * IntegrationsSection → exported `Integrations` component\n * TrustSection layout=\"bento\" → TrustSection with layout=\"bento\"\n */\n\nimport type { ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { readFileSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createRequire } from 'node:module'\n\nimport {\n Button,\n CustomerLogo,\n CustomerLogoSection,\n HeaderSection,\n FeaturesSection,\n CardsSection,\n TestimonialsSection,\n FaqSection,\n BulletsSection,\n CtaSection,\n FooterSection,\n FOOTER_DEFAULTS,\n ContactSection,\n TrustSection,\n NumbersSection,\n Integrations,\n NavbarMenu,\n MediaSlot,\n} from '../index'\n\nimport { logoSvg } from '../logos/resolve'\nimport { PageSpec, sectionSchemas, type SectionType } from '../page-spec/index'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst require = createRequire(import.meta.url)\n\n// ── helpers ─────────────────────────────────────────────────────────────────\n\nfunction svgDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n\nfunction resolveLogoSrc(key: string): string | null {\n const svg = logoSvg(key)\n return svg ? svgDataUrl(svg) : null\n}\n\nconst BulletDefaultIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"6\" fill=\"currentColor\" />\n </svg>\n)\n\nfunction makeCtas(ctas: { label: string; href: string }[] | undefined): ReactNode {\n if (!ctas?.length) return undefined\n return (\n <>\n {ctas.map((c, i) => (\n <a key={i} href={c.href} style={{ display: 'contents' }}>\n {/* Adapter sets semantics (first CTA = primary) only; color is Clay's to decide\n (Button defaults to the brand color). Never hard-code a color here. */}\n <Button buttonStyle={i === 0 ? 'primary' : 'secondary'} size=\"regular\">\n {c.label}\n </Button>\n </a>\n ))}\n </>\n )\n}\n\nfunction makeMedia(\n m:\n | {\n src: string\n type?: 'image' | 'video'\n alt?: string\n fit?: 'contain' | 'cover' | 'fill'\n aspectRatio?: string\n }\n | undefined\n): ReactNode {\n if (!m?.src) return undefined\n const isVideo = m.type === 'video'\n return (\n <MediaSlot\n type={isVideo ? 'video' : 'image'}\n src={m.src}\n alt={m.alt}\n fit={m.fit}\n aspectRatio={m.aspectRatio}\n {...(isVideo ? { autoPlay: true, loop: true } : {})}\n />\n )\n}\n\n// ── CSS loader (cached) ──────────────────────────────────────────────────────\n\nlet _css: string | null = null\n\nfunction loadCss(): string {\n if (_css) return _css\n const tokensCssPath = require.resolve('@clay-ds/tokens/css')\n const tokensCss = readFileSync(tokensCssPath, 'utf8')\n const componentCss = readFileSync(join(__dirname, 'index.css'), 'utf8')\n _css = tokensCss + '\\n' + componentCss\n return _css\n}\n\n// ── section registry ─────────────────────────────────────────────────────────\n\ntype SectionRenderers = {\n [K in SectionType]: (props: import('zod').infer<(typeof sectionSchemas)[K]>) => ReactNode\n}\n\nconst SECTION_REGISTRY: SectionRenderers = {\n HeaderSection(data) {\n const logos = data.logoKeys?.length ? (\n <>\n {data.logoKeys.map((key, i) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n const name = key.split('/').pop() ?? key\n return <CustomerLogo key={i} src={src} name={name} placement=\"web\" />\n })}\n </>\n ) : undefined\n return (\n <HeaderSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actionCaption={data.actionCaption}\n actions={makeCtas(data.ctas)}\n logos={logos}\n media={makeMedia(data.media)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CustomerLogoSection(data) {\n // Drop unresolved keys rather than emit a broken <img src=\"\">.\n const logos = data.logoKeys\n .map((key) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n return { name: key.split('/').pop() ?? key, srcBlack: src, srcColored: src }\n })\n .filter((l): l is { name: string; srcBlack: string; srcColored: string } => l !== null)\n return (\n <CustomerLogoSection\n heading={data.heading}\n logos={logos}\n colorMode={data.colorMode}\n />\n )\n },\n\n FeaturesSection(data) {\n const items = data.items.map((it) => ({\n ...it,\n media: makeMedia(it.media),\n }))\n return (\n <FeaturesSection\n layout={data.layout}\n sectionHeading={data.sectionHeading}\n sectionTopic={data.sectionTopic}\n sectionDescription={data.sectionDescription}\n items={items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CardsSection(data) {\n const cards = data.cards?.map((c) => ({\n ...c,\n media: makeMedia(c.media),\n }))\n return (\n <CardsSection\n layout={data.layout}\n tagline={data.tagline}\n sectionHeading={data.sectionHeading}\n sectionDescription={data.sectionDescription}\n cards={cards}\n revealCards={data.revealCards}\n valueCards={data.valueCards}\n iconLinkCards={data.iconLinkCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TestimonialsSection(data) {\n const cards = data.cards?.map((c) => ({\n quote: c.quote,\n authorName: c.authorName,\n authorRole: c.authorRole,\n stars: c.stars,\n stat: c.stat,\n statLabel: c.statLabel,\n ctaLabel: c.ctaLabel,\n ctaHref: c.ctaHref,\n logo: c.logoKey\n ? (() => {\n const src = resolveLogoSrc(c.logoKey)\n if (!src) return undefined\n return (\n <CustomerLogo\n src={src}\n name={c.logoKey.split('/').pop() ?? c.logoKey}\n placement=\"marketing\"\n />\n )\n })()\n : undefined,\n }))\n return (\n <TestimonialsSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n miniTitle={data.miniTitle}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n cards={cards}\n carouselCards={data.carouselCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FaqSection(data) {\n return (\n <FaqSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n BulletsSection(data) {\n const action = data.cta ? (\n <a href={data.cta.href} style={{ display: 'contents' }}>\n <Button buttonStyle=\"secondary\" size=\"regular\">\n {data.cta.label}\n </Button>\n </a>\n ) : undefined\n return (\n <BulletsSection\n layout={data.layout}\n miniTitle={data.miniTitle}\n heading={data.heading}\n description={data.description}\n columns={data.columns}\n items={data.items.map((item) => ({\n icon: <BulletDefaultIcon />,\n title: item.title,\n description: item.description,\n }))}\n action={action}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CtaSection(data) {\n return (\n <CtaSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actions={makeCtas(data.ctas)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FooterSection(data) {\n const logoSrcValue = data.logoKey ? resolveLogoSrc(data.logoKey) : undefined\n // FOOTER_DEFAULTS deliberately omits logo (consumers supply per-brand).\n // Only pass logo when we have a resolvable src — never an empty string,\n // which would render a broken <img> and trigger a React warning.\n const logo = logoSrcValue\n ? { src: logoSrcValue, alt: data.logoAlt ?? 'monday.com', href: '/' }\n : undefined\n return <FooterSection {...FOOTER_DEFAULTS} logo={logo} />\n },\n\n ContactSection(data) {\n const logos = data.logos\n ?.map((item) => {\n const src = resolveLogoSrc(item.key)\n return src ? { src, name: item.name } : null\n })\n .filter((l): l is { src: string; name: string } => l !== null)\n return (\n <ContactSection\n heading={data.heading}\n description={data.description}\n ratingValue={data.ratingValue}\n ratingLabel={data.ratingLabel}\n formTitle={data.formTitle}\n submitLabel={data.submitLabel}\n fields={data.fields}\n logos={logos}\n badges={data.badges}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TrustSection(data) {\n return (\n <TrustSection\n layout={data.layout}\n heading={data.heading}\n ratingValue={data.ratingValue}\n ratingOut={data.ratingOut}\n ratingLabel={data.ratingLabel}\n badges={data.badges}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n topicLabel={data.topicLabel}\n securityTitle={data.securityTitle}\n securityDescription={data.securityDescription}\n securityLinkLabel={data.securityLinkLabel}\n securityLinkHref={data.securityLinkHref}\n complianceLogos={data.complianceLogos}\n statCards={data.statCards}\n />\n )\n },\n\n NumbersSection(data) {\n return (\n <NumbersSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n IntegrationsSection(data) {\n // naming skew: IntegrationsSection (agent-facing) → Integrations (React export)\n const integrations = data.integrations\n ?.map((item) => {\n const src =\n resolveLogoSrc(item.key) ??\n resolveLogoSrc(`integrations/${item.name.toLowerCase()}`)\n return src ? { name: item.name, src } : null\n })\n .filter((i): i is { name: string; src: string } => i !== null)\n return (\n <Integrations\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n integrations={integrations}\n statValue={data.statValue}\n statLabel={data.statLabel}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n />\n )\n },\n}\n\n// ── public API ───────────────────────────────────────────────────────────────\n\nexport interface RenderResult {\n /** Complete self-contained HTML document */\n html: string\n /** Combined CSS (tokens + component styles) for reference */\n css: string\n}\n\n/**\n * Parse a PageSpec and render it to static HTML using real Clay React components.\n * Throws a ZodError on invalid input.\n */\nexport function renderPageSpec(input: unknown): RenderResult {\n const spec = PageSpec.parse(input)\n\n const sectionElements = spec.sections.map((section, i) => {\n const schema = sectionSchemas[section.type as SectionType]\n const props = schema.parse(section.props)\n const render = SECTION_REGISTRY[section.type as SectionType]\n return <Fragment key={i}>{render(props as never)}</Fragment>\n })\n\n const css = loadCss()\n\n const bodyHtml = renderToStaticMarkup(\n <>\n <NavbarMenu />\n {sectionElements}\n </>\n )\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<title>${spec.brand ?? 'Landing Page'}</title>\n<style>${css}</style>\n</head>\n<body>\n${bodyHtml}\n</body>\n</html>`\n\n return { html, css }\n}\n"],"names":["__dirname","require","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"render.js","sources":["../src/ssr/renderPageSpec.tsx"],"sourcesContent":["/**\n * renderPageSpec — maps a typed PageSpec to real Clay React components and\n * returns self-contained static HTML + CSS.\n *\n * Node-safe (no import.meta.glob, no Vite-only APIs).\n * v1 is static-only (renderToStaticMarkup); no hydration.\n *\n * Naming skew resolved here (not in the public PageSpec contract):\n * IntegrationsSection → exported `Integrations` component\n * TrustSection layout=\"bento\" → TrustSection with layout=\"bento\"\n */\n\nimport type { ReactNode } from 'react'\nimport { Fragment } from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { readFileSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { createRequire } from 'node:module'\n\nimport {\n Button,\n CustomerLogo,\n CustomerLogoSection,\n HeaderSection,\n FeaturesSection,\n CardsSection,\n TestimonialsSection,\n FaqSection,\n BulletsSection,\n CtaSection,\n FooterSection,\n FOOTER_DEFAULTS,\n ContactSection,\n TrustSection,\n NumbersSection,\n Integrations,\n NavbarMenu,\n MediaSlot,\n} from '../index'\n\nimport { logoSvg } from '../logos/resolve'\nimport { PageSpec, sectionSchemas, type SectionType } from '../page-spec/index'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst require = createRequire(import.meta.url)\n\n// ── helpers ─────────────────────────────────────────────────────────────────\n\nfunction svgDataUrl(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\n}\n\nfunction resolveLogoSrc(key: string): string | null {\n const svg = logoSvg(key)\n return svg ? svgDataUrl(svg) : null\n}\n\nconst BulletDefaultIcon = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden=\"true\">\n <circle cx=\"10\" cy=\"10\" r=\"6\" fill=\"currentColor\" />\n </svg>\n)\n\nfunction makeCtas(ctas: { label: string; href: string }[] | undefined): ReactNode {\n if (!ctas?.length) return undefined\n return (\n <>\n {ctas.map((c, i) => (\n <a key={i} href={c.href} style={{ display: 'contents' }}>\n {/* Adapter sets semantics (first CTA = primary) only; color is Clay's to decide\n (Button defaults to the brand color). Never hard-code a color here. */}\n <Button buttonStyle={i === 0 ? 'primary' : 'secondary'} size=\"regular\">\n {c.label}\n </Button>\n </a>\n ))}\n </>\n )\n}\n\nfunction makeMedia(\n m:\n | {\n src: string\n type?: 'image' | 'video'\n alt?: string\n fit?: 'contain' | 'cover' | 'fill'\n aspectRatio?: string\n }\n | undefined\n): ReactNode {\n if (!m?.src) return undefined\n const isVideo = m.type === 'video'\n return (\n <MediaSlot\n type={isVideo ? 'video' : 'image'}\n src={m.src}\n alt={m.alt}\n fit={m.fit}\n aspectRatio={m.aspectRatio}\n {...(isVideo ? { autoPlay: true, loop: true } : {})}\n />\n )\n}\n\n// ── CSS loader (cached) ──────────────────────────────────────────────────────\n\nlet _css: string | null = null\n\nfunction loadCss(): string {\n if (_css) return _css\n const tokensCssPath = require.resolve('@clay-ds/tokens/css')\n const tokensCss = readFileSync(tokensCssPath, 'utf8')\n const componentCss = readFileSync(join(__dirname, 'index.css'), 'utf8')\n _css = tokensCss + '\\n' + componentCss\n return _css\n}\n\n// ── section registry ─────────────────────────────────────────────────────────\n\ntype SectionRenderers = {\n [K in SectionType]: (props: import('zod').infer<(typeof sectionSchemas)[K]>) => ReactNode\n}\n\nconst SECTION_REGISTRY: SectionRenderers = {\n HeaderSection(data) {\n const logos = data.logoKeys?.length ? (\n <>\n {data.logoKeys.map((key, i) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n const name = key.split('/').pop() ?? key\n return <CustomerLogo key={i} src={src} name={name} placement=\"web\" />\n })}\n </>\n ) : undefined\n return (\n <HeaderSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actionCaption={data.actionCaption}\n actions={makeCtas(data.ctas)}\n logos={logos}\n media={makeMedia(data.media)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CustomerLogoSection(data) {\n // Drop unresolved keys rather than emit a broken <img src=\"\">.\n const logos = data.logoKeys\n .map((key) => {\n const src = resolveLogoSrc(key)\n if (!src) return null\n return { name: key.split('/').pop() ?? key, srcBlack: src, srcColored: src }\n })\n .filter((l): l is { name: string; srcBlack: string; srcColored: string } => l !== null)\n return (\n <CustomerLogoSection\n heading={data.heading}\n logos={logos}\n colorMode={data.colorMode}\n />\n )\n },\n\n FeaturesSection(data) {\n const items = data.items.map((it) => ({\n ...it,\n media: makeMedia(it.media),\n }))\n return (\n <FeaturesSection\n layout={data.layout}\n sectionHeading={data.sectionHeading}\n sectionTopic={data.sectionTopic}\n sectionDescription={data.sectionDescription}\n items={items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CardsSection(data) {\n const cards = data.cards?.map((c) => ({\n ...c,\n media: makeMedia(c.media),\n }))\n return (\n <CardsSection\n layout={data.layout}\n tagline={data.tagline}\n sectionHeading={data.sectionHeading}\n sectionDescription={data.sectionDescription}\n cards={cards}\n revealCards={data.revealCards}\n valueCards={data.valueCards}\n iconLinkCards={data.iconLinkCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TestimonialsSection(data) {\n const cards = data.cards?.map((c) => ({\n quote: c.quote,\n authorName: c.authorName,\n authorRole: c.authorRole,\n stars: c.stars,\n stat: c.stat,\n statLabel: c.statLabel,\n ctaLabel: c.ctaLabel,\n ctaHref: c.ctaHref,\n logo: c.logoKey\n ? (() => {\n const src = resolveLogoSrc(c.logoKey)\n if (!src) return undefined\n return (\n <CustomerLogo\n src={src}\n name={c.logoKey.split('/').pop() ?? c.logoKey}\n placement=\"marketing\"\n />\n )\n })()\n : undefined,\n }))\n return (\n <TestimonialsSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n miniTitle={data.miniTitle}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n cards={cards}\n carouselCards={data.carouselCards}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FaqSection(data) {\n return (\n <FaqSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n BulletsSection(data) {\n const action = data.cta ? (\n <a href={data.cta.href} style={{ display: 'contents' }}>\n <Button buttonStyle=\"secondary\" size=\"regular\">\n {data.cta.label}\n </Button>\n </a>\n ) : undefined\n return (\n <BulletsSection\n layout={data.layout}\n miniTitle={data.miniTitle}\n heading={data.heading}\n description={data.description}\n columns={data.columns}\n items={data.items.map((item) => ({\n icon: <BulletDefaultIcon />,\n title: item.title,\n description: item.description,\n }))}\n action={action}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n CtaSection(data) {\n return (\n <CtaSection\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n actions={makeCtas(data.ctas)}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n FooterSection(data) {\n const logoSrcValue = data.logoKey ? resolveLogoSrc(data.logoKey) : undefined\n // FOOTER_DEFAULTS deliberately omits logo (consumers supply per-brand).\n // Only pass logo when we have a resolvable src — never an empty string,\n // which would render a broken <img> and trigger a React warning.\n const logo = logoSrcValue\n ? { src: logoSrcValue, alt: data.logoAlt ?? 'monday.com', href: '/' }\n : undefined\n return <FooterSection {...FOOTER_DEFAULTS} logo={logo} />\n },\n\n ContactSection(data) {\n const logos = data.logos\n ?.map((item) => {\n const src = resolveLogoSrc(item.key)\n return src ? { src, name: item.name } : null\n })\n .filter((l): l is { src: string; name: string } => l !== null)\n return (\n <ContactSection\n heading={data.heading}\n description={data.description}\n ratingValue={data.ratingValue}\n ratingLabel={data.ratingLabel}\n formTitle={data.formTitle}\n submitLabel={data.submitLabel}\n fields={data.fields}\n logos={logos}\n badges={data.badges}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n TrustSection(data) {\n return (\n <TrustSection\n layout={data.layout}\n heading={data.heading}\n ratingValue={data.ratingValue}\n ratingOut={data.ratingOut}\n ratingLabel={data.ratingLabel}\n badges={data.badges}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n topicLabel={data.topicLabel}\n securityTitle={data.securityTitle}\n securityDescription={data.securityDescription}\n securityLinkLabel={data.securityLinkLabel}\n securityLinkHref={data.securityLinkHref}\n complianceLogos={data.complianceLogos}\n statCards={data.statCards}\n />\n )\n },\n\n NumbersSection(data) {\n return (\n <NumbersSection\n layout={data.layout}\n heading={data.heading}\n items={data.items}\n containerWidth={data.containerWidth}\n />\n )\n },\n\n IntegrationsSection(data) {\n // naming skew: IntegrationsSection (agent-facing) → Integrations (React export)\n const integrations = data.integrations\n ?.map((item) => {\n const src =\n resolveLogoSrc(item.key) ??\n resolveLogoSrc(`integrations/${item.name.toLowerCase()}`)\n return src ? { name: item.name, src } : null\n })\n .filter((i): i is { name: string; src: string } => i !== null)\n return (\n <Integrations\n layout={data.layout}\n heading={data.heading}\n description={data.description}\n integrations={integrations}\n statValue={data.statValue}\n statLabel={data.statLabel}\n ctaLabel={data.ctaLabel}\n ctaHref={data.ctaHref}\n />\n )\n },\n}\n\n// ── public API ───────────────────────────────────────────────────────────────\n\nexport interface RenderResult {\n /** Complete self-contained HTML document */\n html: string\n /** Combined CSS (tokens + component styles) for reference */\n css: string\n}\n\n/**\n * Parse a PageSpec and render it to static HTML using real Clay React components.\n * Throws a ZodError on invalid input.\n */\nexport function renderPageSpec(input: unknown): RenderResult {\n const spec = PageSpec.parse(input)\n\n const sectionElements = spec.sections.map((section, i) => {\n const schema = sectionSchemas[section.type as SectionType]\n const props = schema.parse(section.props)\n const render = SECTION_REGISTRY[section.type as SectionType]\n return <Fragment key={i}>{render(props as never)}</Fragment>\n })\n\n const css = loadCss()\n\n // Resolve the monday.com colored wordmark — Master layout, black type, \".com\" on.\n // Only pass logoSrc when we have a real src; never pass an empty string (broken <img>).\n const navLogoSrc = resolveLogoSrc('products/monday-com/Layout=Master, Type Color=Black, Com=On') ?? undefined\n\n // Default primary CTA for campaign-style bars: mirrors the real monday.com top bar.\n const navActions = (\n <a href=\"#\" style={{ display: 'contents' }}>\n <Button buttonStyle=\"primary\" size=\"regular\">Get started</Button>\n </a>\n )\n\n const bodyHtml = renderToStaticMarkup(\n <>\n <NavbarMenu logoSrc={navLogoSrc} actions={navActions} />\n {sectionElements}\n </>\n )\n\n const html = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<title>${spec.brand ?? 'Landing Page'}</title>\n<style>${css}</style>\n</head>\n<body>\n${bodyHtml}\n</body>\n</html>`\n\n return { html, css }\n}\n"],"names":["__dirname","require","Fragment"],"mappings":";;;;;;;;;;AA4CA,MAAMA,cAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AACxD,MAAMC,YAAU,cAAc,YAAY,GAAG;AAI7C,SAAS,WAAW,KAAqB;AACvC,SAAO,oCAAoC,mBAAmB,GAAG,CAAC;AACpE;AAEA,SAAS,eAAe,KAA4B;AAClD,QAAM,MAAM,QAAQ,GAAG;AACvB,SAAO,MAAM,WAAW,GAAG,IAAI;AACjC;AAEA,MAAM,oBAAoB,MACxB,oBAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAY,QACtE,UAAA,oBAAC,UAAA,EAAO,IAAG,MAAK,IAAG,MAAK,GAAE,KAAI,MAAK,eAAA,CAAe,EAAA,CACpD;AAGF,SAAS,SAAS,MAAgE;AAChF,MAAI,EAAC,6BAAM,QAAQ,QAAO;AAC1B,SACE,oBAAAC,YAAA,EACG,UAAA,KAAK,IAAI,CAAC,GAAG,MACZ,oBAAC,KAAA,EAAU,MAAM,EAAE,MAAM,OAAO,EAAE,SAAS,WAAA,GAGzC,UAAA,oBAAC,QAAA,EAAO,aAAa,MAAM,IAAI,YAAY,aAAa,MAAK,WAC1D,UAAA,EAAE,MAAA,CACL,KALM,CAMR,CACD,GACH;AAEJ;AAEA,SAAS,UACP,GASW;AACX,MAAI,EAAC,uBAAG,KAAK,QAAO;AACpB,QAAM,UAAU,EAAE,SAAS;AAC3B,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,UAAU,UAAU;AAAA,MAC1B,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,KAAK,EAAE;AAAA,MACP,aAAa,EAAE;AAAA,MACd,GAAI,UAAU,EAAE,UAAU,MAAM,MAAM,KAAA,IAAS,CAAA;AAAA,IAAC;AAAA,EAAA;AAGvD;AAIA,IAAI,OAAsB;AAE1B,SAAS,UAAkB;AACzB,MAAI,KAAM,QAAO;AACjB,QAAM,gBAAgBD,UAAQ,QAAQ,qBAAqB;AAC3D,QAAM,YAAY,aAAa,eAAe,MAAM;AACpD,QAAM,eAAe,aAAa,KAAKD,aAAW,WAAW,GAAG,MAAM;AACtE,SAAO,YAAY,OAAO;AAC1B,SAAO;AACT;AAQA,MAAM,mBAAqC;AAAA,EACzC,cAAc,MAAM;;AAClB,UAAM,UAAQ,UAAK,aAAL,mBAAe,UAC3B,oBAAAE,YAAA,EACG,eAAK,SAAS,IAAI,CAAC,KAAK,MAAM;AAC7B,YAAM,MAAM,eAAe,GAAG;AAC9B,UAAI,CAAC,IAAK,QAAO;AACjB,YAAM,OAAO,IAAI,MAAM,GAAG,EAAE,SAAS;AACrC,iCAAQ,cAAA,EAAqB,KAAU,MAAY,WAAU,SAAnC,CAAyC;AAAA,IACrE,CAAC,GACH,IACE;AACJ,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,eAAe,KAAK;AAAA,QACpB,SAAS,SAAS,KAAK,IAAI;AAAA,QAC3B;AAAA,QACA,OAAO,UAAU,KAAK,KAAK;AAAA,QAC3B,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;AAExB,UAAM,QAAQ,KAAK,SAChB,IAAI,CAAC,QAAQ;AACZ,YAAM,MAAM,eAAe,GAAG;AAC9B,UAAI,CAAC,IAAK,QAAO;AACjB,aAAO,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE,IAAA,KAAS,KAAK,UAAU,KAAK,YAAY,IAAA;AAAA,IACzE,CAAC,EACA,OAAO,CAAC,MAAmE,MAAM,IAAI;AACxF,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,KAAK;AAAA,QACd;AAAA,QACA,WAAW,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAAA,EAEA,gBAAgB,MAAM;AACpB,UAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,QAAQ;AAAA,MACpC,GAAG;AAAA,MACH,OAAO,UAAU,GAAG,KAAK;AAAA,IAAA,EACzB;AACF,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,cAAc,KAAK;AAAA,QACnB,oBAAoB,KAAK;AAAA,QACzB;AAAA,QACA,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,aAAa,MAAM;;AACjB,UAAM,SAAQ,UAAK,UAAL,mBAAY,IAAI,CAAC,OAAO;AAAA,MACpC,GAAG;AAAA,MACH,OAAO,UAAU,EAAE,KAAK;AAAA,IAAA;AAE1B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,gBAAgB,KAAK;AAAA,QACrB,oBAAoB,KAAK;AAAA,QACzB;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;;AACxB,UAAM,SAAQ,UAAK,UAAL,mBAAY,IAAI,CAAC,OAAO;AAAA,MACpC,OAAO,EAAE;AAAA,MACT,YAAY,EAAE;AAAA,MACd,YAAY,EAAE;AAAA,MACd,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,WAAW,EAAE;AAAA,MACb,UAAU,EAAE;AAAA,MACZ,SAAS,EAAE;AAAA,MACX,MAAM,EAAE,WACH,MAAM;AACL,cAAM,MAAM,eAAe,EAAE,OAAO;AACpC,YAAI,CAAC,IAAK,QAAO;AACjB,eACE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,MAAM,EAAE,QAAQ,MAAM,GAAG,EAAE,IAAA,KAAS,EAAE;AAAA,YACtC,WAAU;AAAA,UAAA;AAAA,QAAA;AAAA,MAGhB,OACA;AAAA,IAAA;AAEN,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd;AAAA,QACA,eAAe,KAAK;AAAA,QACpB,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,WAAW,MAAM;AACf,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,eAAe,MAAM;AACnB,UAAM,SAAS,KAAK,MAClB,oBAAC,KAAA,EAAE,MAAM,KAAK,IAAI,MAAM,OAAO,EAAE,SAAS,cACxC,UAAA,oBAAC,QAAA,EAAO,aAAY,aAAY,MAAK,WAClC,UAAA,KAAK,IAAI,MAAA,CACZ,EAAA,CACF,IACE;AACJ,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,WAAW,KAAK;AAAA,QAChB,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,SAAS,KAAK;AAAA,QACd,OAAO,KAAK,MAAM,IAAI,CAAC,UAAU;AAAA,UAC/B,0BAAO,mBAAA,EAAkB;AAAA,UACzB,OAAO,KAAK;AAAA,UACZ,aAAa,KAAK;AAAA,QAAA,EAClB;AAAA,QACF;AAAA,QACA,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,WAAW,MAAM;AACf,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,SAAS,SAAS,KAAK,IAAI;AAAA,QAC3B,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,cAAc,MAAM;AAClB,UAAM,eAAe,KAAK,UAAU,eAAe,KAAK,OAAO,IAAI;AAInE,UAAM,OAAO,eACT,EAAE,KAAK,cAAc,KAAK,KAAK,WAAW,cAAc,MAAM,IAAA,IAC9D;AACJ,WAAO,oBAAC,eAAA,EAAe,GAAG,iBAAiB,KAAA,CAAY;AAAA,EACzD;AAAA,EAEA,eAAe,MAAM;;AACnB,UAAM,SAAQ,UAAK,UAAL,mBACV,IAAI,CAAC,SAAS;AACd,YAAM,MAAM,eAAe,KAAK,GAAG;AACnC,aAAO,MAAM,EAAE,KAAK,MAAM,KAAK,SAAS;AAAA,IAC1C,GACC,OAAO,CAAC,MAA0C,MAAM;AAC3D,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,aAAa,MAAM;AACjB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,QAChB,aAAa,KAAK;AAAA,QAClB,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,QACd,YAAY,KAAK;AAAA,QACjB,eAAe,KAAK;AAAA,QACpB,qBAAqB,KAAK;AAAA,QAC1B,mBAAmB,KAAK;AAAA,QACxB,kBAAkB,KAAK;AAAA,QACvB,iBAAiB,KAAK;AAAA,QACtB,WAAW,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtB;AAAA,EAEA,eAAe,MAAM;AACnB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AAAA,EAEA,oBAAoB,MAAM;;AAExB,UAAM,gBAAe,UAAK,iBAAL,mBACjB,IAAI,CAAC,SAAS;AACd,YAAM,MACJ,eAAe,KAAK,GAAG,KACvB,eAAe,gBAAgB,KAAK,KAAK,YAAA,CAAa,EAAE;AAC1D,aAAO,MAAM,EAAE,MAAM,KAAK,MAAM,QAAQ;AAAA,IAC1C,GACC,OAAO,CAAC,MAA0C,MAAM;AAC3D,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ,KAAK;AAAA,QACb,SAAS,KAAK;AAAA,QACd,aAAa,KAAK;AAAA,QAClB;AAAA,QACA,WAAW,KAAK;AAAA,QAChB,WAAW,KAAK;AAAA,QAChB,UAAU,KAAK;AAAA,QACf,SAAS,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGpB;AACF;AAeO,SAAS,eAAe,OAA8B;AAC3D,QAAM,OAAO,SAAS,MAAM,KAAK;AAEjC,QAAM,kBAAkB,KAAK,SAAS,IAAI,CAAC,SAAS,MAAM;AACxD,UAAM,SAAS,eAAe,QAAQ,IAAmB;AACzD,UAAM,QAAQ,OAAO,MAAM,QAAQ,KAAK;AACxC,UAAM,SAAS,iBAAiB,QAAQ,IAAmB;AAC3D,+BAAQA,UAAA,EAAkB,UAAA,OAAO,KAAc,KAAzB,CAA2B;AAAA,EACnD,CAAC;AAED,QAAM,MAAM,QAAA;AAIZ,QAAM,aAAa,eAAe,6DAA6D,KAAK;AAGpG,QAAM,aACJ,oBAAC,KAAA,EAAE,MAAK,KAAI,OAAO,EAAE,SAAS,WAAA,GAC5B,8BAAC,QAAA,EAAO,aAAY,WAAU,MAAK,WAAU,yBAAW,GAC1D;AAGF,QAAM,WAAW;AAAA,IACf,qBAAAA,YAAA,EACE,UAAA;AAAA,MAAA,oBAAC,YAAA,EAAW,SAAS,YAAY,SAAS,YAAY;AAAA,MACrD;AAAA,IAAA,EAAA,CACH;AAAA,EAAA;AAGF,QAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,SAKN,KAAK,SAAS,cAAc;AAAA,SAC5B,GAAG;AAAA;AAAA;AAAA,EAGV,QAAQ;AAAA;AAAA;AAIR,SAAO,EAAE,MAAM,IAAA;AACjB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clay-ds/react",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "type": "module",
5
5
  "sideEffects": [
6
6
  "**/*.css"