@contractspec/bundle.marketing 1.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build$colon$types.log +1 -0
- package/.turbo/turbo-build.log +175 -0
- package/.turbo/turbo-lint.log +3 -0
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +416 -0
- package/README.md +57 -0
- package/dist/components/marketing/ChangelogPage.d.ts +21 -0
- package/dist/components/marketing/ChangelogPage.d.ts.map +1 -0
- package/dist/components/marketing/ChangelogPage.js +65 -0
- package/dist/components/marketing/ChangelogPage.js.map +1 -0
- package/dist/components/marketing/CofounderPage.d.ts +7 -0
- package/dist/components/marketing/CofounderPage.d.ts.map +1 -0
- package/dist/components/marketing/CofounderPage.js +468 -0
- package/dist/components/marketing/CofounderPage.js.map +1 -0
- package/dist/components/marketing/ContactClient.d.ts +7 -0
- package/dist/components/marketing/ContactClient.d.ts.map +1 -0
- package/dist/components/marketing/ContactClient.js +158 -0
- package/dist/components/marketing/ContactClient.js.map +1 -0
- package/dist/components/marketing/ContributePage.d.ts +9 -0
- package/dist/components/marketing/ContributePage.d.ts.map +1 -0
- package/dist/components/marketing/ContributePage.js +362 -0
- package/dist/components/marketing/ContributePage.js.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts +9 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.js +215 -0
- package/dist/components/marketing/DesignPartnerPage.js.map +1 -0
- package/dist/components/marketing/LandingPage.d.ts +7 -0
- package/dist/components/marketing/LandingPage.d.ts.map +1 -0
- package/dist/components/marketing/LandingPage.js +38 -0
- package/dist/components/marketing/LandingPage.js.map +1 -0
- package/dist/components/marketing/PricingClient.d.ts +7 -0
- package/dist/components/marketing/PricingClient.d.ts.map +1 -0
- package/dist/components/marketing/PricingClient.js +521 -0
- package/dist/components/marketing/PricingClient.js.map +1 -0
- package/dist/components/marketing/ProductClientPage.d.ts +7 -0
- package/dist/components/marketing/ProductClientPage.d.ts.map +1 -0
- package/dist/components/marketing/ProductClientPage.js +460 -0
- package/dist/components/marketing/ProductClientPage.js.map +1 -0
- package/dist/components/marketing/index.d.ts +11 -0
- package/dist/components/marketing/index.js +12 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts +16 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -0
- package/dist/components/marketing/pricing-thinking-modal.js +202 -0
- package/dist/components/marketing/pricing-thinking-modal.js.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts +7 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.js +68 -0
- package/dist/components/marketing/sections/AudienceSection.js.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts +7 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.js +59 -0
- package/dist/components/marketing/sections/CorePositioningSection.js.map +1 -0
- package/dist/components/marketing/sections/CtaSection.d.ts +7 -0
- package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CtaSection.js +54 -0
- package/dist/components/marketing/sections/CtaSection.js.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts +7 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.js +45 -0
- package/dist/components/marketing/sections/DevelopersSection.js.map +1 -0
- package/dist/components/marketing/sections/FearsSection.d.ts +7 -0
- package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/FearsSection.js +48 -0
- package/dist/components/marketing/sections/FearsSection.js.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts +7 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js +77 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts +45 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.js +44 -0
- package/dist/components/marketing/sections/IconGridSection.js.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts +7 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.js +59 -0
- package/dist/components/marketing/sections/OutputsSection.js.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts +7 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.js +46 -0
- package/dist/components/marketing/sections/ProblemSection.js.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts +7 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.js +46 -0
- package/dist/components/marketing/sections/SolutionSection.js.map +1 -0
- package/dist/components/marketing/sections/StepsSection.d.ts +7 -0
- package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/StepsSection.js +52 -0
- package/dist/components/marketing/sections/StepsSection.js.map +1 -0
- package/dist/components/marketing/waitlist-section.d.ts +15 -0
- package/dist/components/marketing/waitlist-section.d.ts.map +1 -0
- package/dist/components/marketing/waitlist-section.js +578 -0
- package/dist/components/marketing/waitlist-section.js.map +1 -0
- package/dist/components/templates/TemplatesClientPage.d.ts +7 -0
- package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesClientPage.js +625 -0
- package/dist/components/templates/TemplatesClientPage.js.map +1 -0
- package/dist/components/templates/TemplatesPage.d.ts +7 -0
- package/dist/components/templates/TemplatesPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPage.js +125 -0
- package/dist/components/templates/TemplatesPage.js.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts +15 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.js +137 -0
- package/dist/components/templates/TemplatesPreviewModal.js.map +1 -0
- package/dist/components/templates/index.d.ts +4 -0
- package/dist/components/templates/index.js +5 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +28 -0
- package/dist/libs/email/client.d.ts +15 -0
- package/dist/libs/email/client.d.ts.map +1 -0
- package/dist/libs/email/client.js +113 -0
- package/dist/libs/email/client.js.map +1 -0
- package/dist/libs/email/contact.d.ts +7 -0
- package/dist/libs/email/contact.d.ts.map +1 -0
- package/dist/libs/email/contact.js +71 -0
- package/dist/libs/email/contact.js.map +1 -0
- package/dist/libs/email/newsletter.d.ts +7 -0
- package/dist/libs/email/newsletter.d.ts.map +1 -0
- package/dist/libs/email/newsletter.js +95 -0
- package/dist/libs/email/newsletter.js.map +1 -0
- package/dist/libs/email/types.d.ts +53 -0
- package/dist/libs/email/types.d.ts.map +1 -0
- package/dist/libs/email/types.js +1 -0
- package/dist/libs/email/utils.d.ts +6 -0
- package/dist/libs/email/utils.d.ts.map +1 -0
- package/dist/libs/email/utils.js +7 -0
- package/dist/libs/email/utils.js.map +1 -0
- package/dist/libs/email/waitlist-application.d.ts +7 -0
- package/dist/libs/email/waitlist-application.d.ts.map +1 -0
- package/dist/libs/email/waitlist-application.js +170 -0
- package/dist/libs/email/waitlist-application.js.map +1 -0
- package/dist/libs/email/waitlist.d.ts +7 -0
- package/dist/libs/email/waitlist.d.ts.map +1 -0
- package/dist/libs/email/waitlist.js +105 -0
- package/dist/libs/email/waitlist.js.map +1 -0
- package/dist/libs/pricing-examples.d.ts +22 -0
- package/dist/libs/pricing-examples.d.ts.map +1 -0
- package/dist/libs/pricing-examples.js +21 -0
- package/dist/libs/pricing-examples.js.map +1 -0
- package/dist/registry/engine.d.ts +17 -0
- package/dist/registry/engine.d.ts.map +1 -0
- package/dist/registry/engine.js +24 -0
- package/dist/registry/engine.js.map +1 -0
- package/dist/registry/factory.d.ts +64 -0
- package/dist/registry/factory.d.ts.map +1 -0
- package/dist/registry/factory.js +61 -0
- package/dist/registry/factory.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry-docs.d.ts +15 -0
- package/dist/registry/registry-docs.d.ts.map +1 -0
- package/dist/registry/registry-docs.js +305 -0
- package/dist/registry/registry-docs.js.map +1 -0
- package/dist/registry/registry-landing.d.ts +19 -0
- package/dist/registry/registry-landing.d.ts.map +1 -0
- package/dist/registry/registry-landing.js +95 -0
- package/dist/registry/registry-landing.js.map +1 -0
- package/dist/registry/registry.d.ts +30 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +61 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/types.d.ts +19 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +0 -0
- package/dist/registry/utils.d.ts +31 -0
- package/dist/registry/utils.d.ts.map +1 -0
- package/dist/registry/utils.js +54 -0
- package/dist/registry/utils.js.map +1 -0
- package/package.json +151 -0
- package/src/components/marketing/ChangelogPage.tsx +110 -0
- package/src/components/marketing/CofounderPage.tsx +409 -0
- package/src/components/marketing/ContactClient.tsx +174 -0
- package/src/components/marketing/ContributePage.tsx +319 -0
- package/src/components/marketing/DesignPartnerPage.tsx +181 -0
- package/src/components/marketing/LandingPage.tsx +30 -0
- package/src/components/marketing/PricingClient.tsx +446 -0
- package/src/components/marketing/ProductClientPage.tsx +391 -0
- package/src/components/marketing/index.ts +10 -0
- package/src/components/marketing/pricing-thinking-modal.tsx +224 -0
- package/src/components/marketing/sections/AudienceSection.tsx +66 -0
- package/src/components/marketing/sections/CorePositioningSection.tsx +44 -0
- package/src/components/marketing/sections/CtaSection.tsx +57 -0
- package/src/components/marketing/sections/DevelopersSection.tsx +38 -0
- package/src/components/marketing/sections/FearsSection.tsx +45 -0
- package/src/components/marketing/sections/HeroMarketingSection.tsx +73 -0
- package/src/components/marketing/sections/IconGridSection.tsx +91 -0
- package/src/components/marketing/sections/OutputsSection.tsx +59 -0
- package/src/components/marketing/sections/ProblemSection.tsx +47 -0
- package/src/components/marketing/sections/SolutionSection.tsx +47 -0
- package/src/components/marketing/sections/StepsSection.tsx +55 -0
- package/src/components/marketing/waitlist-section.tsx +606 -0
- package/src/components/templates/TemplatesClientPage.tsx +711 -0
- package/src/components/templates/TemplatesPage.tsx +129 -0
- package/src/components/templates/TemplatesPreviewModal.tsx +260 -0
- package/src/components/templates/index.ts +3 -0
- package/src/index.ts +15 -0
- package/src/libs/email/client.test.ts +107 -0
- package/src/libs/email/client.ts +146 -0
- package/src/libs/email/contact.ts +80 -0
- package/src/libs/email/newsletter.ts +108 -0
- package/src/libs/email/types.ts +59 -0
- package/src/libs/email/utils.ts +8 -0
- package/src/libs/email/waitlist-application.ts +192 -0
- package/src/libs/email/waitlist.ts +118 -0
- package/src/libs/pricing-examples.ts +19 -0
- package/src/registry/engine.ts +38 -0
- package/src/registry/factory.ts +110 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/registry-docs.ts +843 -0
- package/src/registry/registry-landing.ts +118 -0
- package/src/registry/registry.ts +85 -0
- package/src/registry/types.ts +17 -0
- package/src/registry/utils.ts +99 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.js +10 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { Box, HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
4
|
+
import { ButtonLink, MarketingSection } from "@contractspec/lib.design-system";
|
|
5
|
+
import { analyticsEventNames, captureAnalyticsEvent } from "@contractspec/bundle.library/libs/posthog/client";
|
|
6
|
+
import { H1, Lead, Small } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
7
|
+
import { ChevronRight } from "lucide-react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
|
|
10
|
+
//#region src/components/marketing/sections/HeroMarketingSection.tsx
|
|
11
|
+
const heroChips = [
|
|
12
|
+
"Multi-Surface Sync",
|
|
13
|
+
"No Lock-in",
|
|
14
|
+
"Standard Tech"
|
|
15
|
+
];
|
|
16
|
+
function HeroMarketingSection() {
|
|
17
|
+
return /* @__PURE__ */ jsx(MarketingSection, {
|
|
18
|
+
tone: "gradient",
|
|
19
|
+
padding: "spacious",
|
|
20
|
+
align: "center",
|
|
21
|
+
children: /* @__PURE__ */ jsxs(VStack, {
|
|
22
|
+
gap: "lg",
|
|
23
|
+
align: "center",
|
|
24
|
+
className: "text-center",
|
|
25
|
+
children: [
|
|
26
|
+
/* @__PURE__ */ jsx(Box, {
|
|
27
|
+
as: "div",
|
|
28
|
+
role: "presentation",
|
|
29
|
+
className: "bg-muted text-muted-foreground inline-flex items-center rounded-full px-3 py-1 text-xs font-medium tracking-wider uppercase",
|
|
30
|
+
children: "Open Source Core"
|
|
31
|
+
}),
|
|
32
|
+
/* @__PURE__ */ jsx(H1, {
|
|
33
|
+
className: "text-4xl leading-tight font-bold text-balance md:text-5xl",
|
|
34
|
+
children: "Stabilize your AI-generated code"
|
|
35
|
+
}),
|
|
36
|
+
/* @__PURE__ */ jsx(Lead, {
|
|
37
|
+
className: "text-muted-foreground text-lg text-balance md:text-xl",
|
|
38
|
+
children: "ContractSpec is the compiler that keeps AI-written software coherent, safe, and regenerable. You keep your app. You own the code. One module at a time."
|
|
39
|
+
}),
|
|
40
|
+
/* @__PURE__ */ jsxs(HStack, {
|
|
41
|
+
gap: "md",
|
|
42
|
+
justify: "center",
|
|
43
|
+
wrap: "wrap",
|
|
44
|
+
children: [/* @__PURE__ */ jsxs(ButtonLink, {
|
|
45
|
+
href: "/install",
|
|
46
|
+
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, { surface: "hero" }),
|
|
47
|
+
children: ["Install OSS ", /* @__PURE__ */ jsx(ChevronRight, { size: 16 })]
|
|
48
|
+
}), /* @__PURE__ */ jsx(ButtonLink, {
|
|
49
|
+
variant: "ghost",
|
|
50
|
+
href: "/contact#waitlist",
|
|
51
|
+
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, { surface: "hero" }),
|
|
52
|
+
children: "Join Studio Waitlist"
|
|
53
|
+
})]
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ jsx(HStack, {
|
|
56
|
+
gap: "sm",
|
|
57
|
+
justify: "center",
|
|
58
|
+
wrap: "wrap",
|
|
59
|
+
className: "pt-2",
|
|
60
|
+
children: heroChips.map((chip) => /* @__PURE__ */ jsx(Box, {
|
|
61
|
+
as: "div",
|
|
62
|
+
role: "presentation",
|
|
63
|
+
className: "border-border text-foreground inline-flex items-center rounded-full border px-3 py-1 text-sm",
|
|
64
|
+
children: /* @__PURE__ */ jsx(Small, {
|
|
65
|
+
className: "font-medium",
|
|
66
|
+
children: chip
|
|
67
|
+
})
|
|
68
|
+
}, chip))
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
})
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//#endregion
|
|
76
|
+
export { HeroMarketingSection };
|
|
77
|
+
//# sourceMappingURL=HeroMarketingSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeroMarketingSection.js","names":[],"sources":["../../../../src/components/marketing/sections/HeroMarketingSection.tsx"],"sourcesContent":["'use client';\n\nimport { ButtonLink, MarketingSection } from '@contractspec/lib.design-system';\nimport {\n analyticsEventNames,\n captureAnalyticsEvent,\n} from '@contractspec/bundle.library/libs/posthog/client';\nimport { Box, HStack, VStack } from '@contractspec/lib.ui-kit-web/ui/stack';\nimport { H1, Lead, Small } from '@contractspec/lib.ui-kit-web/ui/typography';\nimport { ChevronRight } from 'lucide-react';\n\nconst heroChips = ['Multi-Surface Sync', 'No Lock-in', 'Standard Tech'];\n\nexport function HeroMarketingSection() {\n return (\n <MarketingSection tone=\"gradient\" padding=\"spacious\" align=\"center\">\n <VStack gap=\"lg\" align=\"center\" className=\"text-center\">\n <Box\n as=\"div\"\n role=\"presentation\"\n className=\"bg-muted text-muted-foreground inline-flex items-center rounded-full px-3 py-1 text-xs font-medium tracking-wider uppercase\"\n >\n Open Source Core\n </Box>\n <H1 className=\"text-4xl leading-tight font-bold text-balance md:text-5xl\">\n Stabilize your AI-generated code\n </H1>\n <Lead className=\"text-muted-foreground text-lg text-balance md:text-xl\">\n ContractSpec is the compiler that keeps AI-written software coherent,\n safe, and regenerable. You keep your app. You own the code. One module\n at a time.\n </Lead>\n\n <HStack gap=\"md\" justify=\"center\" wrap=\"wrap\">\n <ButtonLink\n href=\"/install\"\n onClick={() =>\n captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {\n surface: 'hero',\n })\n }\n >\n Install OSS <ChevronRight size={16} />\n </ButtonLink>\n <ButtonLink\n variant=\"ghost\"\n href=\"/contact#waitlist\"\n onClick={() =>\n captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {\n surface: 'hero',\n })\n }\n >\n Join Studio Waitlist\n </ButtonLink>\n </HStack>\n\n <HStack gap=\"sm\" justify=\"center\" wrap=\"wrap\" className=\"pt-2\">\n {heroChips.map((chip) => (\n <Box\n key={chip}\n as=\"div\"\n role=\"presentation\"\n className=\"border-border text-foreground inline-flex items-center rounded-full border px-3 py-1 text-sm\"\n >\n <Small className=\"font-medium\">{chip}</Small>\n </Box>\n ))}\n </HStack>\n </VStack>\n </MarketingSection>\n );\n}\n"],"mappings":";;;;;;;;;;AAWA,MAAM,YAAY;CAAC;CAAsB;CAAc;CAAgB;AAEvE,SAAgB,uBAAuB;AACrC,QACE,oBAAC;EAAiB,MAAK;EAAW,SAAQ;EAAW,OAAM;YACzD,qBAAC;GAAO,KAAI;GAAK,OAAM;GAAS,WAAU;;IACxC,oBAAC;KACC,IAAG;KACH,MAAK;KACL,WAAU;eACX;MAEK;IACN,oBAAC;KAAG,WAAU;eAA4D;MAErE;IACL,oBAAC;KAAK,WAAU;eAAwD;MAIjE;IAEP,qBAAC;KAAO,KAAI;KAAK,SAAQ;KAAS,MAAK;gBACrC,qBAAC;MACC,MAAK;MACL,eACE,sBAAsB,oBAAoB,mBAAmB,EAC3D,SAAS,QACV,CAAC;iBAEL,gBACa,oBAAC,gBAAa,MAAM,KAAM;OAC3B,EACb,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,eACE,sBAAsB,oBAAoB,kBAAkB,EAC1D,SAAS,QACV,CAAC;gBAEL;OAEY;MACN;IAET,oBAAC;KAAO,KAAI;KAAK,SAAQ;KAAS,MAAK;KAAO,WAAU;eACrD,UAAU,KAAK,SACd,oBAAC;MAEC,IAAG;MACH,MAAK;MACL,WAAU;gBAEV,oBAAC;OAAM,WAAU;iBAAe;QAAa;QALxC,KAMD,CACN;MACK;;IACF;GACQ"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MarketingCardTone, MarketingSectionPadding, MarketingSectionTone } from "@contractspec/lib.design-system";
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
|
+
import * as React$1 from "react";
|
|
4
|
+
import { VariantProps } from "class-variance-authority";
|
|
5
|
+
import * as class_variance_authority_types0 from "class-variance-authority/types";
|
|
6
|
+
|
|
7
|
+
//#region src/components/marketing/sections/IconGridSection.d.ts
|
|
8
|
+
type IconComponent = React$1.ComponentType<{
|
|
9
|
+
className?: string;
|
|
10
|
+
size?: number;
|
|
11
|
+
}>;
|
|
12
|
+
interface IconGridItem {
|
|
13
|
+
icon: IconComponent;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
iconClassName?: string;
|
|
17
|
+
tone?: MarketingCardTone;
|
|
18
|
+
}
|
|
19
|
+
interface IconGridSectionProps {
|
|
20
|
+
eyebrow?: string;
|
|
21
|
+
title: string;
|
|
22
|
+
subtitle?: string;
|
|
23
|
+
items: IconGridItem[];
|
|
24
|
+
tone?: MarketingSectionTone;
|
|
25
|
+
padding?: MarketingSectionPadding;
|
|
26
|
+
columns?: 2 | 3 | 4;
|
|
27
|
+
iconRole?: IconGridSectionRole;
|
|
28
|
+
}
|
|
29
|
+
declare const itemVariants: (props?: ({
|
|
30
|
+
iconRole?: "iconFirst" | "listing" | "support" | null | undefined;
|
|
31
|
+
} & class_variance_authority_types0.ClassProp) | undefined) => string;
|
|
32
|
+
type IconGridSectionRole = VariantProps<typeof itemVariants>['iconRole'];
|
|
33
|
+
declare function IconGridSection({
|
|
34
|
+
eyebrow,
|
|
35
|
+
title,
|
|
36
|
+
subtitle,
|
|
37
|
+
items,
|
|
38
|
+
tone,
|
|
39
|
+
padding,
|
|
40
|
+
columns,
|
|
41
|
+
iconRole
|
|
42
|
+
}: IconGridSectionProps): react_jsx_runtime0.JSX.Element;
|
|
43
|
+
//#endregion
|
|
44
|
+
export { IconGridItem, IconGridSection, IconGridSectionRole };
|
|
45
|
+
//# sourceMappingURL=IconGridSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconGridSection.d.ts","names":[],"sources":["../../../../src/components/marketing/sections/IconGridSection.tsx"],"mappings":";;;;;;;KAWK,aAAA,GAAgB,OAAA,CAAM,aAAA;EAAgB,SAAA;EAAoB,IAAA;AAAA;AAAA,UAE9C,YAAA;EACf,IAAA,EAAM,aAAA;EACN,KAAA;EACA,WAAA;EACA,aAAA;EACA,IAAA,GAAO,iBAAA;AAAA;AAAA,UAGC,oBAAA;EACR,OAAA;EACA,KAAA;EACA,QAAA;EACA,KAAA,EAAO,YAAA;EACP,IAAA,GAAO,oBAAA;EACP,OAAA,GAAU,uBAAA;EACV,OAAA;EACA,QAAA,GAAW,mBAAA;AAAA;AAAA,cAGP,YAAA,GAAY,KAAA;;IAShB,+BAAA,CAAA,SAAA;AAAA,KAEU,mBAAA,GAAsB,YAAA,QAAoB,YAAA;AAAA,iBAEtC,eAAA,CAAA;EACd,OAAA;EACA,KAAA;EACA,QAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;EACA,OAAA;EACA;AAAA,GACC,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { MarketingCardsSection, MarketingIconCard } from "@contractspec/lib.design-system";
|
|
2
|
+
import { Muted } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import "react";
|
|
5
|
+
import { cva } from "class-variance-authority";
|
|
6
|
+
|
|
7
|
+
//#region src/components/marketing/sections/IconGridSection.tsx
|
|
8
|
+
const itemVariants = cva("", {
|
|
9
|
+
variants: { iconRole: {
|
|
10
|
+
iconFirst: "",
|
|
11
|
+
listing: "items-start",
|
|
12
|
+
support: "items-start"
|
|
13
|
+
} },
|
|
14
|
+
defaultVariants: { iconRole: "iconFirst" }
|
|
15
|
+
});
|
|
16
|
+
function IconGridSection({ eyebrow, title, subtitle, items, tone = "default", padding, columns = 3, iconRole = "iconFirst" }) {
|
|
17
|
+
return /* @__PURE__ */ jsx(MarketingCardsSection, {
|
|
18
|
+
tone,
|
|
19
|
+
padding,
|
|
20
|
+
eyebrow: eyebrow ? /* @__PURE__ */ jsx(Muted, {
|
|
21
|
+
className: "text-xs font-semibold tracking-[0.2em] uppercase",
|
|
22
|
+
children: eyebrow
|
|
23
|
+
}) : null,
|
|
24
|
+
title,
|
|
25
|
+
subtitle: subtitle ? /* @__PURE__ */ jsx(Muted, {
|
|
26
|
+
className: "text-lg",
|
|
27
|
+
children: subtitle
|
|
28
|
+
}) : null,
|
|
29
|
+
columns,
|
|
30
|
+
children: items.map((card) => /* @__PURE__ */ jsx(MarketingIconCard, {
|
|
31
|
+
icon: card.icon,
|
|
32
|
+
title: card.title,
|
|
33
|
+
description: card.description,
|
|
34
|
+
tone: card.tone,
|
|
35
|
+
iconClassName: card.iconClassName,
|
|
36
|
+
variant: iconRole === "listing" ? "listing" : iconRole === "support" ? "support" : "iconFirst",
|
|
37
|
+
className: itemVariants({ iconRole })
|
|
38
|
+
}, card.title))
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//#endregion
|
|
43
|
+
export { IconGridSection };
|
|
44
|
+
//# sourceMappingURL=IconGridSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IconGridSection.js","names":[],"sources":["../../../../src/components/marketing/sections/IconGridSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n MarketingCardsSection,\n MarketingIconCard,\n type MarketingCardTone,\n type MarketingSectionPadding,\n type MarketingSectionTone,\n} from '@contractspec/lib.design-system';\nimport { Muted } from '@contractspec/lib.ui-kit-web/ui/typography';\n\ntype IconComponent = React.ComponentType<{ className?: string; size?: number }>;\n\nexport interface IconGridItem {\n icon: IconComponent;\n title: string;\n description: string;\n iconClassName?: string;\n tone?: MarketingCardTone;\n}\n\ninterface IconGridSectionProps {\n eyebrow?: string;\n title: string;\n subtitle?: string;\n items: IconGridItem[];\n tone?: MarketingSectionTone;\n padding?: MarketingSectionPadding;\n columns?: 2 | 3 | 4;\n iconRole?: IconGridSectionRole;\n}\n\nconst itemVariants = cva('', {\n variants: {\n iconRole: {\n iconFirst: '',\n listing: 'items-start',\n support: 'items-start',\n },\n },\n defaultVariants: { iconRole: 'iconFirst' },\n});\n\nexport type IconGridSectionRole = VariantProps<typeof itemVariants>['iconRole'];\n\nexport function IconGridSection({\n eyebrow,\n title,\n subtitle,\n items,\n tone = 'default',\n padding,\n columns = 3,\n iconRole = 'iconFirst',\n}: IconGridSectionProps) {\n return (\n <MarketingCardsSection\n tone={tone}\n padding={padding}\n eyebrow={\n eyebrow ? (\n <Muted className=\"text-xs font-semibold tracking-[0.2em] uppercase\">\n {eyebrow}\n </Muted>\n ) : null\n }\n title={title}\n subtitle={subtitle ? <Muted className=\"text-lg\">{subtitle}</Muted> : null}\n columns={columns}\n >\n {items.map((card) => (\n <MarketingIconCard\n key={card.title}\n icon={card.icon}\n title={card.title}\n description={card.description}\n tone={card.tone}\n iconClassName={card.iconClassName}\n variant={\n iconRole === 'listing'\n ? 'listing'\n : iconRole === 'support'\n ? 'support'\n : 'iconFirst'\n }\n className={itemVariants({ iconRole })}\n />\n ))}\n </MarketingCardsSection>\n );\n}\n"],"mappings":";;;;;;;AAgCA,MAAM,eAAe,IAAI,IAAI;CAC3B,UAAU,EACR,UAAU;EACR,WAAW;EACX,SAAS;EACT,SAAS;EACV,EACF;CACD,iBAAiB,EAAE,UAAU,aAAa;CAC3C,CAAC;AAIF,SAAgB,gBAAgB,EAC9B,SACA,OACA,UACA,OACA,OAAO,WACP,SACA,UAAU,GACV,WAAW,eACY;AACvB,QACE,oBAAC;EACO;EACG;EACT,SACE,UACE,oBAAC;GAAM,WAAU;aACd;IACK,GACN;EAEC;EACP,UAAU,WAAW,oBAAC;GAAM,WAAU;aAAW;IAAiB,GAAG;EAC5D;YAER,MAAM,KAAK,SACV,oBAAC;GAEC,MAAM,KAAK;GACX,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,MAAM,KAAK;GACX,eAAe,KAAK;GACpB,SACE,aAAa,YACT,YACA,aAAa,YACX,YACA;GAER,WAAW,aAAa,EAAE,UAAU,CAAC;KAbhC,KAAK,MAcV,CACF;GACoB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/sections/OutputsSection.d.ts
|
|
4
|
+
declare function OutputsSection(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { OutputsSection };
|
|
7
|
+
//# sourceMappingURL=OutputsSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputsSection.d.ts","names":[],"sources":["../../../../src/components/marketing/sections/OutputsSection.tsx"],"mappings":";;;iBAuCgB,cAAA,CAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { IconGridSection } from "./IconGridSection.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/marketing/sections/OutputsSection.tsx
|
|
6
|
+
const outputs = [
|
|
7
|
+
{
|
|
8
|
+
title: "REST API",
|
|
9
|
+
description: "Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.",
|
|
10
|
+
icon: "🔌"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
title: "GraphQL Schema",
|
|
14
|
+
description: "Automatically generated resolvers. Standard Pothos/Apollo output.",
|
|
15
|
+
icon: "📊"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
title: "Database Schema",
|
|
19
|
+
description: "Prisma migrations and types. Standard SQL underneath.",
|
|
20
|
+
icon: "🗄️"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
title: "MCP Tools",
|
|
24
|
+
description: "AI agent tool definitions. Works with Claude, GPT, and any MCP client.",
|
|
25
|
+
icon: "🤖"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
title: "Client SDKs",
|
|
29
|
+
description: "Type-safe API clients. Standard fetch/axios underneath.",
|
|
30
|
+
icon: "📦"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: "UI Components",
|
|
34
|
+
description: "React forms and views from specs. Standard JSX output.",
|
|
35
|
+
icon: "🎨"
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
function OutputsSection() {
|
|
39
|
+
return /* @__PURE__ */ jsx(IconGridSection, {
|
|
40
|
+
tone: "muted",
|
|
41
|
+
columns: 3,
|
|
42
|
+
title: "What ContractSpec generates",
|
|
43
|
+
subtitle: "One contract, multiple outputs. All in sync. All standard tech.",
|
|
44
|
+
iconRole: "iconFirst",
|
|
45
|
+
items: outputs.map((item) => ({
|
|
46
|
+
icon: () => /* @__PURE__ */ jsx("span", {
|
|
47
|
+
"aria-hidden": true,
|
|
48
|
+
className: "text-3xl",
|
|
49
|
+
children: item.icon
|
|
50
|
+
}),
|
|
51
|
+
title: item.title,
|
|
52
|
+
description: item.description
|
|
53
|
+
}))
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
//#endregion
|
|
58
|
+
export { OutputsSection };
|
|
59
|
+
//# sourceMappingURL=OutputsSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputsSection.js","names":[],"sources":["../../../../src/components/marketing/sections/OutputsSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { IconGridSection } from './IconGridSection';\n\nconst outputs = [\n {\n title: 'REST API',\n description:\n 'Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.',\n icon: '🔌',\n },\n {\n title: 'GraphQL Schema',\n description:\n 'Automatically generated resolvers. Standard Pothos/Apollo output.',\n icon: '📊',\n },\n {\n title: 'Database Schema',\n description: 'Prisma migrations and types. Standard SQL underneath.',\n icon: '🗄️',\n },\n {\n title: 'MCP Tools',\n description:\n 'AI agent tool definitions. Works with Claude, GPT, and any MCP client.',\n icon: '🤖',\n },\n {\n title: 'Client SDKs',\n description: 'Type-safe API clients. Standard fetch/axios underneath.',\n icon: '📦',\n },\n {\n title: 'UI Components',\n description: 'React forms and views from specs. Standard JSX output.',\n icon: '🎨',\n },\n];\n\nexport function OutputsSection() {\n return (\n <IconGridSection\n tone=\"muted\"\n columns={3}\n title=\"What ContractSpec generates\"\n subtitle=\"One contract, multiple outputs. All in sync. All standard tech.\"\n iconRole=\"iconFirst\"\n items={outputs.map((item) => ({\n icon: () => (\n <span aria-hidden className=\"text-3xl\">\n {item.icon}\n </span>\n ),\n title: item.title,\n description: item.description,\n }))}\n />\n );\n}\n"],"mappings":";;;;;AAGA,MAAM,UAAU;CACd;EACE,OAAO;EACP,aACE;EACF,MAAM;EACP;CACD;EACE,OAAO;EACP,aACE;EACF,MAAM;EACP;CACD;EACE,OAAO;EACP,aAAa;EACb,MAAM;EACP;CACD;EACE,OAAO;EACP,aACE;EACF,MAAM;EACP;CACD;EACE,OAAO;EACP,aAAa;EACb,MAAM;EACP;CACD;EACE,OAAO;EACP,aAAa;EACb,MAAM;EACP;CACF;AAED,SAAgB,iBAAiB;AAC/B,QACE,oBAAC;EACC,MAAK;EACL,SAAS;EACT,OAAM;EACN,UAAS;EACT,UAAS;EACT,OAAO,QAAQ,KAAK,UAAU;GAC5B,YACE,oBAAC;IAAK;IAAY,WAAU;cACzB,KAAK;KACD;GAET,OAAO,KAAK;GACZ,aAAa,KAAK;GACnB,EAAE;GACH"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/sections/ProblemSection.d.ts
|
|
4
|
+
declare function ProblemSection(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { ProblemSection };
|
|
7
|
+
//# sourceMappingURL=ProblemSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProblemSection.d.ts","names":[],"sources":["../../../../src/components/marketing/sections/ProblemSection.tsx"],"mappings":";;;iBAmCgB,cAAA,CAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IconGridSection } from "./IconGridSection.js";
|
|
2
|
+
import { AlertTriangle, Layers, RefreshCw, XCircle } from "lucide-react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import "react";
|
|
5
|
+
|
|
6
|
+
//#region src/components/marketing/sections/ProblemSection.tsx
|
|
7
|
+
const problemItems = [
|
|
8
|
+
{
|
|
9
|
+
icon: AlertTriangle,
|
|
10
|
+
title: "Can't enforce invariants",
|
|
11
|
+
description: "AI-generated code drifts from business rules over time. No source of truth means no safety.",
|
|
12
|
+
iconClassName: "text-red-400"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
icon: Layers,
|
|
16
|
+
title: "Multi-surface chaos",
|
|
17
|
+
description: "API, DB, UI, and events get out of sync. One change breaks three surfaces.",
|
|
18
|
+
iconClassName: "text-orange-400"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
icon: RefreshCw,
|
|
22
|
+
title: "Hallucinated refactors",
|
|
23
|
+
description: "AI \"improvements\" introduce subtle bugs and break contracts you didn’t know existed.",
|
|
24
|
+
iconClassName: "text-amber-400"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
icon: XCircle,
|
|
28
|
+
title: "Unmaintainable spaghetti",
|
|
29
|
+
description: "Teams ship fast initially, then spend months untangling AI-generated chaos.",
|
|
30
|
+
iconClassName: "text-red-400"
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
function ProblemSection() {
|
|
34
|
+
return /* @__PURE__ */ jsx(IconGridSection, {
|
|
35
|
+
tone: "muted",
|
|
36
|
+
columns: 4,
|
|
37
|
+
eyebrow: "The Problem",
|
|
38
|
+
title: "AI agents write code fast. Then the chaos begins.",
|
|
39
|
+
subtitle: "In 2025, \"vibe coding\" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.",
|
|
40
|
+
items: problemItems
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ProblemSection };
|
|
46
|
+
//# sourceMappingURL=ProblemSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProblemSection.js","names":[],"sources":["../../../../src/components/marketing/sections/ProblemSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { IconGridSection, type IconGridItem } from './IconGridSection';\nimport { AlertTriangle, Layers, RefreshCw, XCircle } from 'lucide-react';\n\nconst problemItems: IconGridItem[] = [\n {\n icon: AlertTriangle,\n title: \"Can't enforce invariants\",\n description:\n 'AI-generated code drifts from business rules over time. No source of truth means no safety.',\n iconClassName: 'text-red-400',\n },\n {\n icon: Layers,\n title: 'Multi-surface chaos',\n description:\n 'API, DB, UI, and events get out of sync. One change breaks three surfaces.',\n iconClassName: 'text-orange-400',\n },\n {\n icon: RefreshCw,\n title: 'Hallucinated refactors',\n description:\n 'AI \"improvements\" introduce subtle bugs and break contracts you didn’t know existed.',\n iconClassName: 'text-amber-400',\n },\n {\n icon: XCircle,\n title: 'Unmaintainable spaghetti',\n description:\n 'Teams ship fast initially, then spend months untangling AI-generated chaos.',\n iconClassName: 'text-red-400',\n },\n];\n\nexport function ProblemSection() {\n return (\n <IconGridSection\n tone=\"muted\"\n columns={4}\n eyebrow=\"The Problem\"\n title=\"AI agents write code fast. Then the chaos begins.\"\n subtitle='In 2025, \"vibe coding\" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.'\n items={problemItems}\n />\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,eAA+B;CACnC;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACF;AAED,SAAgB,iBAAiB;AAC/B,QACE,oBAAC;EACC,MAAK;EACL,SAAS;EACT,SAAQ;EACR,OAAM;EACN,UAAS;EACT,OAAO;GACP"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/sections/SolutionSection.d.ts
|
|
4
|
+
declare function SolutionSection(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { SolutionSection };
|
|
7
|
+
//# sourceMappingURL=SolutionSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolutionSection.d.ts","names":[],"sources":["../../../../src/components/marketing/sections/SolutionSection.tsx"],"mappings":";;;iBAmCgB,eAAA,CAAA,GAAe,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { IconGridSection } from "./IconGridSection.js";
|
|
2
|
+
import { FileCode, Layers, RefreshCw, Shield } from "lucide-react";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import "react";
|
|
5
|
+
|
|
6
|
+
//#region src/components/marketing/sections/SolutionSection.tsx
|
|
7
|
+
const solutionItems = [
|
|
8
|
+
{
|
|
9
|
+
icon: FileCode,
|
|
10
|
+
title: "Canonical Source of Truth",
|
|
11
|
+
description: "Contracts define what the system should do, not just what it does. AI agents read specs, not implementations.",
|
|
12
|
+
iconClassName: "text-emerald-400"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
icon: Layers,
|
|
16
|
+
title: "Multi-Surface Consistency",
|
|
17
|
+
description: "One spec generates API, DB, UI, events, and MCP tools. All surfaces stay in sync because they share the same source.",
|
|
18
|
+
iconClassName: "text-blue-400"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
icon: RefreshCw,
|
|
22
|
+
title: "Safe Regeneration",
|
|
23
|
+
description: "Regenerate code anytime without fear. Specs enforce invariants. Breaking changes caught at compile time.",
|
|
24
|
+
iconClassName: "text-violet-400"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
icon: Shield,
|
|
28
|
+
title: "AI Governance",
|
|
29
|
+
description: "Constrain what AI agents can change. Enforce contracts they must respect. Flag violations automatically.",
|
|
30
|
+
iconClassName: "text-pink-400"
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
function SolutionSection() {
|
|
34
|
+
return /* @__PURE__ */ jsx(IconGridSection, {
|
|
35
|
+
tone: "default",
|
|
36
|
+
columns: 4,
|
|
37
|
+
eyebrow: "The Solution",
|
|
38
|
+
title: "ContractSpec: The safety layer for AI-coded systems",
|
|
39
|
+
subtitle: "Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in.",
|
|
40
|
+
items: solutionItems
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { SolutionSection };
|
|
46
|
+
//# sourceMappingURL=SolutionSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SolutionSection.js","names":[],"sources":["../../../../src/components/marketing/sections/SolutionSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { IconGridSection, type IconGridItem } from './IconGridSection';\nimport { FileCode, Layers, RefreshCw, Shield } from 'lucide-react';\n\nconst solutionItems: IconGridItem[] = [\n {\n icon: FileCode,\n title: 'Canonical Source of Truth',\n description:\n 'Contracts define what the system should do, not just what it does. AI agents read specs, not implementations.',\n iconClassName: 'text-emerald-400',\n },\n {\n icon: Layers,\n title: 'Multi-Surface Consistency',\n description:\n 'One spec generates API, DB, UI, events, and MCP tools. All surfaces stay in sync because they share the same source.',\n iconClassName: 'text-blue-400',\n },\n {\n icon: RefreshCw,\n title: 'Safe Regeneration',\n description:\n 'Regenerate code anytime without fear. Specs enforce invariants. Breaking changes caught at compile time.',\n iconClassName: 'text-violet-400',\n },\n {\n icon: Shield,\n title: 'AI Governance',\n description:\n 'Constrain what AI agents can change. Enforce contracts they must respect. Flag violations automatically.',\n iconClassName: 'text-pink-400',\n },\n];\n\nexport function SolutionSection() {\n return (\n <IconGridSection\n tone=\"default\"\n columns={4}\n eyebrow=\"The Solution\"\n title=\"ContractSpec: The safety layer for AI-coded systems\"\n subtitle=\"Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in.\"\n items={solutionItems}\n />\n );\n}\n"],"mappings":";;;;;;AAIA,MAAM,gBAAgC;CACpC;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACF,eAAe;EAChB;CACF;AAED,SAAgB,kBAAkB;AAChC,QACE,oBAAC;EACC,MAAK;EACL,SAAS;EACT,SAAQ;EACR,OAAM;EACN,UAAS;EACT,OAAO;GACP"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/sections/StepsSection.d.ts
|
|
4
|
+
declare function StepsSection(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { StepsSection };
|
|
7
|
+
//# sourceMappingURL=StepsSection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepsSection.d.ts","names":[],"sources":["../../../../src/components/marketing/sections/StepsSection.tsx"],"mappings":";;;iBA8BgB,YAAA,CAAA,GAAY,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { IconGridSection } from "./IconGridSection.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import "react";
|
|
4
|
+
|
|
5
|
+
//#region src/components/marketing/sections/StepsSection.tsx
|
|
6
|
+
const steps = [
|
|
7
|
+
{
|
|
8
|
+
step: 1,
|
|
9
|
+
title: "Pick one module",
|
|
10
|
+
description: "Start with one API endpoint, one entity, one surface. No big-bang migration."
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
step: 2,
|
|
14
|
+
title: "Define the contract",
|
|
15
|
+
description: "Write a spec in TypeScript. Just types and Zod schemas you already know."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
step: 3,
|
|
19
|
+
title: "Generate & compare",
|
|
20
|
+
description: "See what ContractSpec generates. Compare to your existing code. Keep what works."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
step: 4,
|
|
24
|
+
title: "Expand gradually",
|
|
25
|
+
description: "Add more contracts as you see value. No pressure. No lock-in. Your pace."
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
function StepsSection() {
|
|
29
|
+
return /* @__PURE__ */ jsx(IconGridSection, {
|
|
30
|
+
tone: "default",
|
|
31
|
+
columns: 4,
|
|
32
|
+
title: "How incremental adoption works",
|
|
33
|
+
padding: "comfortable",
|
|
34
|
+
iconRole: "listing",
|
|
35
|
+
items: steps.map((item) => ({
|
|
36
|
+
icon: ({ className }) => /* @__PURE__ */ jsx("div", {
|
|
37
|
+
className: `bg-primary/15 flex h-10 w-10 items-center justify-center rounded-lg ${className ?? ""}`,
|
|
38
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
39
|
+
className: "text-primary text-sm font-semibold",
|
|
40
|
+
children: item.step
|
|
41
|
+
})
|
|
42
|
+
}),
|
|
43
|
+
title: item.title,
|
|
44
|
+
description: item.description,
|
|
45
|
+
tone: "muted"
|
|
46
|
+
}))
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//#endregion
|
|
51
|
+
export { StepsSection };
|
|
52
|
+
//# sourceMappingURL=StepsSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StepsSection.js","names":[],"sources":["../../../../src/components/marketing/sections/StepsSection.tsx"],"sourcesContent":["import * as React from 'react';\nimport { IconGridSection } from './IconGridSection';\n\nconst steps = [\n {\n step: 1,\n title: 'Pick one module',\n description:\n 'Start with one API endpoint, one entity, one surface. No big-bang migration.',\n },\n {\n step: 2,\n title: 'Define the contract',\n description:\n 'Write a spec in TypeScript. Just types and Zod schemas you already know.',\n },\n {\n step: 3,\n title: 'Generate & compare',\n description:\n 'See what ContractSpec generates. Compare to your existing code. Keep what works.',\n },\n {\n step: 4,\n title: 'Expand gradually',\n description:\n 'Add more contracts as you see value. No pressure. No lock-in. Your pace.',\n },\n];\n\nexport function StepsSection() {\n return (\n <IconGridSection\n tone=\"default\"\n columns={4}\n title=\"How incremental adoption works\"\n padding=\"comfortable\"\n iconRole=\"listing\"\n items={steps.map((item) => ({\n icon: ({ className }) => (\n <div\n className={`bg-primary/15 flex h-10 w-10 items-center justify-center rounded-lg ${className ?? ''}`}\n >\n <span className=\"text-primary text-sm font-semibold\">\n {item.step}\n </span>\n </div>\n ),\n title: item.title,\n description: item.description,\n tone: 'muted',\n }))}\n />\n );\n}\n"],"mappings":";;;;;AAGA,MAAM,QAAQ;CACZ;EACE,MAAM;EACN,OAAO;EACP,aACE;EACH;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACH;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACH;CACD;EACE,MAAM;EACN,OAAO;EACP,aACE;EACH;CACF;AAED,SAAgB,eAAe;AAC7B,QACE,oBAAC;EACC,MAAK;EACL,SAAS;EACT,OAAM;EACN,SAAQ;EACR,UAAS;EACT,OAAO,MAAM,KAAK,UAAU;GAC1B,OAAO,EAAE,gBACP,oBAAC;IACC,WAAW,uEAAuE,aAAa;cAE/F,oBAAC;KAAK,WAAU;eACb,KAAK;MACD;KACH;GAER,OAAO,KAAK;GACZ,aAAa,KAAK;GAClB,MAAM;GACP,EAAE;GACH"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/waitlist-section.d.ts
|
|
4
|
+
interface WaitlistSectionProps {
|
|
5
|
+
variant?: 'default' | 'compact';
|
|
6
|
+
context?: 'pricing' | 'contact';
|
|
7
|
+
scrollToId?: string;
|
|
8
|
+
}
|
|
9
|
+
declare function WaitlistSection({
|
|
10
|
+
variant,
|
|
11
|
+
context
|
|
12
|
+
}: WaitlistSectionProps): react_jsx_runtime0.JSX.Element;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { WaitlistSection };
|
|
15
|
+
//# sourceMappingURL=waitlist-section.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waitlist-section.d.ts","names":[],"sources":["../../../src/components/marketing/waitlist-section.tsx"],"mappings":";;;UAuBU,oBAAA;EACR,OAAA;EACA,OAAA;EACA,UAAA;AAAA;AAAA,iBA4Bc,eAAA,CAAA;EACd,OAAA;EAEA;AAAA,GACC,oBAAA,GAAoB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|