@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 @@
|
|
|
1
|
+
{"version":3,"file":"CofounderPage.js","names":[],"sources":["../../../src/components/marketing/CofounderPage.tsx"],"sourcesContent":["'use client';\n\nimport { ButtonLink, MarketingSection } from '@contractspec/lib.design-system';\nimport { Box, HStack, VStack } from '@contractspec/lib.ui-kit-web/ui/stack';\nimport {\n H1,\n H2,\n H3,\n Lead,\n Muted,\n Small,\n} from '@contractspec/lib.ui-kit-web/ui/typography';\nimport {\n Check,\n Clock,\n MapPin,\n MessageSquare,\n Percent,\n Rocket,\n Target,\n Users,\n X,\n} from 'lucide-react';\n\nconst COFOUNDER_EMAIL = 'tboutron@contractspec.io';\nconst APPLY_SUBJECT = 'Co-founder application: ContractSpec';\nconst APPLY_BODY = `Hi Theo,\n\nI am reaching out about co-founding ContractSpec.\n\nLinkedIn: [your link]\nProof of work #1: [link]\nProof of work #2: [link]\n\nWhy ContractSpec:\n[your answer]\n\nWhat I would own in the first 90 days:\n[your answer]\n`;\n\nconst mailtoLink = `mailto:${COFOUNDER_EMAIL}?subject=${encodeURIComponent(APPLY_SUBJECT)}&body=${encodeURIComponent(APPLY_BODY)}`;\n\n/* -------------------------------------------------------------------------- */\n/* Section Components */\n/* -------------------------------------------------------------------------- */\n\nfunction HeroSection() {\n return (\n <MarketingSection tone=\"gradient\" padding=\"spacious\" align=\"center\">\n <VStack gap=\"lg\" align=\"center\" className=\"text-center\">\n <H1 className=\"text-4xl leading-tight font-bold text-balance md:text-5xl\">\n Co-founder wanted\n </H1>\n <Lead className=\"text-muted-foreground max-w-2xl text-lg text-balance md:text-xl\">\n ContractSpec is a contract-first compiler for AI-generated code.\n Define specs, enforce policies, regenerate safely. Pre-PMF. Building\n in public.\n </Lead>\n <HStack gap=\"md\" justify=\"center\" wrap=\"wrap\" className=\"pt-2\">\n <ButtonLink href={mailtoLink}>Talk about co-founding</ButtonLink>\n <ButtonLink variant=\"ghost\" href=\"/contact\">\n Become a design partner\n </ButtonLink>\n </HStack>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction WhatExistsSection() {\n const realNow = [\n 'ContractSpec Core: open-source spec compiler',\n 'Working CLI and TypeScript runtime',\n 'Design partner pipeline open',\n 'Solo founder, bootstrapped',\n ];\n\n const planned = [\n 'Visual studio for specs',\n 'Auto-evolution engine',\n 'Multi-tenant SaaS',\n 'Integration marketplace',\n ];\n\n return (\n <MarketingSection padding=\"comfortable\" align=\"center\" maxWidth=\"lg\">\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">What exists today</H2>\n <div className=\"grid w-full gap-8 md:grid-cols-2\">\n <VStack gap=\"sm\" align=\"start\">\n <H3 className=\"text-lg font-semibold text-emerald-400\">Real now</H3>\n <ul className=\"space-y-2\">\n {realNow.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <Check size={16} className=\"mt-1 shrink-0 text-emerald-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n </VStack>\n <VStack gap=\"sm\" align=\"start\">\n <H3 className=\"text-lg font-semibold text-blue-400\">Planned</H3>\n <ul className=\"space-y-2\">\n {planned.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <Target size={16} className=\"mt-1 shrink-0 text-blue-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n </VStack>\n </div>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction RoleSection() {\n const gtmDeliverables = [\n 'Run 5+ sales conversations per week',\n 'Own the design partner pipeline end-to-end',\n 'Write positioning copy that ships',\n 'Build and maintain partnership channels',\n 'Turn user feedback into roadmap signal',\n ];\n\n const productDeliverables = [\n 'Ship UI/UX improvements weekly',\n 'Define specs based on user research',\n 'Own the studio experience',\n 'Collaborate on architecture decisions',\n ];\n\n return (\n <MarketingSection\n // tone=\"subtle\"\n padding=\"comfortable\"\n align=\"center\"\n maxWidth=\"lg\"\n >\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">The role</H2>\n <VStack gap=\"md\" align=\"start\" className=\"w-full\">\n <H3 className=\"text-xl font-semibold\">\n Option A: GTM / Sales / Partnerships\n </H3>\n <Muted>Weekly deliverables, not vague traits:</Muted>\n <ul className=\"space-y-2\">\n {gtmDeliverables.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <Rocket size={16} className=\"mt-1 shrink-0 text-amber-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n </VStack>\n <VStack gap=\"md\" align=\"start\" className=\"w-full pt-4\">\n <H3 className=\"text-xl font-semibold\">Option B: Product / Design</H3>\n <Muted>If this is your strength:</Muted>\n <ul className=\"space-y-2\">\n {productDeliverables.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <Rocket size={16} className=\"mt-1 shrink-0 text-purple-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n </VStack>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction IdealCofounderSection() {\n const qualities = [\n \"You have shipped products people paid for — links or it didn't happen\",\n 'You have sold something (product, consulting, yourself)',\n 'You write clearly and fast — emails, docs, copy',\n 'You have taste: you know good UX when you see it',\n 'You can work 6+ months without a salary',\n 'You are allergic to meetings that could be docs',\n 'You have built in public or contributed to open source',\n 'You are based in Europe or overlap significantly with CET',\n ];\n\n return (\n <MarketingSection padding=\"comfortable\" align=\"center\" maxWidth=\"lg\">\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">The ideal co-founder</H2>\n <ul className=\"space-y-3\">\n {qualities.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <Check size={16} className=\"mt-1 shrink-0 text-emerald-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n <Box className=\"border-border mt-4 rounded-lg border p-4\">\n <VStack gap=\"sm\" align=\"start\">\n <H3 className=\"text-lg font-semibold\">Proof of work examples</H3>\n <Muted className=\"text-sm\">\n GitHub profile, shipped product, writing (blog/Twitter/essays),\n revenue screenshot, open-source contributions, or anything that\n shows you execute.\n </Muted>\n </VStack>\n </Box>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction WhatYouGetSection() {\n const benefits = [\n {\n icon: <Percent size={20} className=\"text-emerald-400\" />,\n title: 'Equity-first',\n desc: 'Meaningful co-founder equity. Salary is minimal/zero until revenue covers it.',\n },\n {\n icon: <Users size={20} className=\"text-blue-400\" />,\n title: 'Real ownership',\n desc: 'You own your domain. No permission-seeking. Ship and iterate.',\n },\n {\n icon: <MessageSquare size={20} className=\"text-amber-400\" />,\n title: 'Written-first decisions',\n desc: 'We default to async, docs, and fast decisions. Meetings are last resort.',\n },\n ];\n\n const values = [\n 'Contracts over conventions',\n 'Clarity over cleverness',\n 'Safety over speed (in code)',\n 'Leverage over labor',\n ];\n\n return (\n <MarketingSection\n // tone=\"subtle\"\n padding=\"comfortable\"\n align=\"center\"\n maxWidth=\"lg\"\n >\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">What you get</H2>\n <div className=\"grid w-full gap-6 md:grid-cols-3\">\n {benefits.map((b) => (\n <VStack\n key={b.title}\n gap=\"sm\"\n align=\"start\"\n className=\"border-border rounded-lg border p-4\"\n >\n {b.icon}\n <H3 className=\"text-lg font-semibold\">{b.title}</H3>\n <Muted className=\"text-sm\">{b.desc}</Muted>\n </VStack>\n ))}\n </div>\n <VStack gap=\"sm\" align=\"start\" className=\"w-full pt-4\">\n <H3 className=\"text-lg font-semibold\">Our values</H3>\n <HStack gap=\"sm\" wrap=\"wrap\">\n {values.map((v) => (\n <Box\n key={v}\n className=\"border-border rounded-full border px-3 py-1 text-sm\"\n >\n {v}\n </Box>\n ))}\n </HStack>\n </VStack>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction RedFlagsSection() {\n const redFlags = [\n 'Needs a big salary now',\n 'Hates selling or talking to users',\n 'Vague about past execution',\n 'Wants to \"advise\" instead of build',\n 'Needs a big team to feel productive',\n 'Cannot write clearly',\n ];\n\n return (\n <MarketingSection padding=\"comfortable\" align=\"center\" maxWidth=\"lg\">\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">Non-negotiables / red flags</H2>\n <Muted>If any of these apply, this is not the right fit:</Muted>\n <ul className=\"space-y-2\">\n {redFlags.map((item) => (\n <li key={item} className=\"flex items-start gap-2\">\n <X size={16} className=\"mt-1 shrink-0 text-red-400\" />\n <Small>{item}</Small>\n </li>\n ))}\n </ul>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction FAQSection() {\n const faqs = [\n {\n icon: <Users size={18} />,\n q: 'Why co-founder instead of hiring?',\n a: \"I need a partner who thinks like an owner, not an employee. Someone who will stay when things get hard and share in the upside when they don't.\",\n },\n {\n icon: <Clock size={18} />,\n q: 'What is the timeline to revenue?',\n a: 'Design partners are converting now. Goal: paying customers in 2025. But this is startup life — timelines are best guesses.',\n },\n {\n icon: <MapPin size={18} />,\n q: 'Is this remote?',\n a: 'Yes. Async-first. Occasional in-person (Paris-based) for planning. Europe timezone overlap strongly preferred.',\n },\n {\n icon: <Percent size={18} />,\n q: 'How much equity?',\n a: 'Depends on what you bring, when you join, and how much you can commit. Expect meaningful co-founder equity with 4-year vesting. We will discuss specifics in person.',\n },\n ];\n\n return (\n <MarketingSection\n // tone=\"subtle\"\n padding=\"comfortable\"\n align=\"center\"\n maxWidth=\"lg\"\n >\n <VStack gap=\"lg\">\n <H2 className=\"text-3xl font-bold\">FAQ</H2>\n <VStack gap=\"md\" className=\"w-full\">\n {faqs.map((faq) => (\n <VStack\n key={faq.q}\n gap=\"xs\"\n align=\"start\"\n className=\"border-border w-full rounded-lg border p-4\"\n >\n <HStack gap=\"sm\" align=\"center\">\n <span className=\"text-muted-foreground\">{faq.icon}</span>\n <H3 className=\"text-lg font-semibold\">{faq.q}</H3>\n </HStack>\n <Muted>{faq.a}</Muted>\n </VStack>\n ))}\n </VStack>\n </VStack>\n </MarketingSection>\n );\n}\n\nfunction FinalCtaSection() {\n return (\n <MarketingSection\n tone=\"gradient\"\n padding=\"comfortable\"\n align=\"center\"\n maxWidth=\"lg\"\n >\n <VStack gap=\"md\" align=\"center\" className=\"text-center\">\n <H2 className=\"text-3xl font-bold md:text-4xl\">Ready to talk?</H2>\n <Lead className=\"text-muted-foreground max-w-xl\">\n Send an email with: your LinkedIn, 2 proof-of-work links, why\n ContractSpec, and what you would own in the first 90 days.\n </Lead>\n <HStack gap=\"md\" justify=\"center\" wrap=\"wrap\" className=\"pt-2\">\n <ButtonLink href={mailtoLink}>Talk about co-founding</ButtonLink>\n <ButtonLink variant=\"ghost\" href=\"/contact\">\n Become a design partner\n </ButtonLink>\n </HStack>\n <Muted className=\"pt-4 text-sm\">\n CHAMAN VENTURES, SASU · RCS Paris · SIREN 989 498 902 · 229 rue\n Saint-Honoré, 75001 Paris\n </Muted>\n </VStack>\n </MarketingSection>\n );\n}\n\n/* -------------------------------------------------------------------------- */\n/* Main Component */\n/* -------------------------------------------------------------------------- */\n\nexport function CofounderPage() {\n return (\n <VStack as=\"main\" gap=\"none\">\n <HeroSection />\n <WhatExistsSection />\n <RoleSection />\n <IdealCofounderSection />\n <WhatYouGetSection />\n <RedFlagsSection />\n <FAQSection />\n <FinalCtaSection />\n </VStack>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/ContactClient.d.ts
|
|
4
|
+
declare function ContactClient(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { ContactClient };
|
|
7
|
+
//# sourceMappingURL=ContactClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContactClient.d.ts","names":[],"sources":["../../../src/components/marketing/ContactClient.tsx"],"mappings":";;;iBA6BgB,aAAA,CAAA,GAAa,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { WaitlistSection } from "./waitlist-section.js";
|
|
4
|
+
import { submitContactForm } from "../../libs/email/contact.js";
|
|
5
|
+
import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
6
|
+
import { ActionForm, Button, Input, Textarea } from "@contractspec/lib.design-system";
|
|
7
|
+
import { H1, H2, Muted, Small } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
8
|
+
import { AlertCircle, Calendar, CheckCircle, MessageSquare } from "lucide-react";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { useActionState } from "react";
|
|
11
|
+
|
|
12
|
+
//#region src/components/marketing/ContactClient.tsx
|
|
13
|
+
function ContactClient() {
|
|
14
|
+
const handleContactSubmit = async (_prevState, formData) => {
|
|
15
|
+
const result = await submitContactForm(formData);
|
|
16
|
+
if (result.success) return {
|
|
17
|
+
success: true,
|
|
18
|
+
text: "Message sent successfully! We'll get back to you soon."
|
|
19
|
+
};
|
|
20
|
+
else return {
|
|
21
|
+
success: false,
|
|
22
|
+
text: result.text || "Failed to send message. Please try again."
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
const [contactResult, contactAction, contactPending] = useActionState(handleContactSubmit, null);
|
|
26
|
+
return /* @__PURE__ */ jsx("section", {
|
|
27
|
+
className: "section-padding hero-gradient w-full",
|
|
28
|
+
children: /* @__PURE__ */ jsxs(VStack, {
|
|
29
|
+
className: "mx-auto max-w-4xl gap-16",
|
|
30
|
+
children: [
|
|
31
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
32
|
+
className: "gap-4 text-center",
|
|
33
|
+
children: [/* @__PURE__ */ jsx(H1, {
|
|
34
|
+
className: "text-5xl font-bold",
|
|
35
|
+
children: "Get in touch"
|
|
36
|
+
}), /* @__PURE__ */ jsx(Muted, {
|
|
37
|
+
className: "text-lg",
|
|
38
|
+
children: "Choose how you'd like to connect with us"
|
|
39
|
+
})]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ jsx(WaitlistSection, { context: "contact" }),
|
|
42
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
43
|
+
className: "card-subtle gap-6 p-8",
|
|
44
|
+
id: "call",
|
|
45
|
+
children: [/* @__PURE__ */ jsxs(HStack, {
|
|
46
|
+
className: "items-center gap-3",
|
|
47
|
+
children: [/* @__PURE__ */ jsx(Calendar, {
|
|
48
|
+
className: "text-blue-400",
|
|
49
|
+
size: 24
|
|
50
|
+
}), /* @__PURE__ */ jsxs(VStack, {
|
|
51
|
+
className: "items-start gap-1",
|
|
52
|
+
children: [/* @__PURE__ */ jsx(H2, {
|
|
53
|
+
className: "text-2xl font-bold",
|
|
54
|
+
children: "Book a 20-min call"
|
|
55
|
+
}), /* @__PURE__ */ jsx(Muted, {
|
|
56
|
+
className: "text-sm",
|
|
57
|
+
children: "Schedule a walkthrough with our team to see ContractSpec in action"
|
|
58
|
+
})]
|
|
59
|
+
})]
|
|
60
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
61
|
+
className: "border-border overflow-hidden rounded-lg border",
|
|
62
|
+
children: /* @__PURE__ */ jsx("object", {
|
|
63
|
+
data: "https://meet.reclaimai.com/e/f863cb29-caac-44b6-972b-1407dd9545a3",
|
|
64
|
+
width: "100%",
|
|
65
|
+
height: "700px",
|
|
66
|
+
style: { outline: "none" },
|
|
67
|
+
"aria-label": "Calendar booking widget"
|
|
68
|
+
})
|
|
69
|
+
})]
|
|
70
|
+
}),
|
|
71
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
72
|
+
className: "card-subtle gap-6 p-8",
|
|
73
|
+
id: "message",
|
|
74
|
+
children: [/* @__PURE__ */ jsxs(HStack, {
|
|
75
|
+
className: "items-center gap-3",
|
|
76
|
+
children: [/* @__PURE__ */ jsx(MessageSquare, {
|
|
77
|
+
className: "text-emerald-400",
|
|
78
|
+
size: 24
|
|
79
|
+
}), /* @__PURE__ */ jsxs(VStack, {
|
|
80
|
+
className: "items-start gap-1",
|
|
81
|
+
children: [/* @__PURE__ */ jsx(H2, {
|
|
82
|
+
className: "text-2xl font-bold",
|
|
83
|
+
children: "Send us a message"
|
|
84
|
+
}), /* @__PURE__ */ jsx(Muted, {
|
|
85
|
+
className: "text-sm",
|
|
86
|
+
children: "Have questions or feedback? We'd love to hear from you"
|
|
87
|
+
})]
|
|
88
|
+
})]
|
|
89
|
+
}), /* @__PURE__ */ jsx(ActionForm, {
|
|
90
|
+
action: contactAction,
|
|
91
|
+
children: /* @__PURE__ */ jsxs(VStack, {
|
|
92
|
+
className: "gap-4",
|
|
93
|
+
children: [
|
|
94
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
95
|
+
className: "gap-2",
|
|
96
|
+
children: [/* @__PURE__ */ jsx(Small, {
|
|
97
|
+
className: "text-sm font-medium",
|
|
98
|
+
children: "Name"
|
|
99
|
+
}), /* @__PURE__ */ jsx(Input, {
|
|
100
|
+
id: "contact-name",
|
|
101
|
+
name: "name",
|
|
102
|
+
type: "text",
|
|
103
|
+
placeholder: "Your name",
|
|
104
|
+
disabled: contactPending || contactResult?.success,
|
|
105
|
+
required: true
|
|
106
|
+
})]
|
|
107
|
+
}),
|
|
108
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
109
|
+
className: "gap-2",
|
|
110
|
+
children: [/* @__PURE__ */ jsx(Small, {
|
|
111
|
+
className: "text-sm font-medium",
|
|
112
|
+
children: "Email"
|
|
113
|
+
}), /* @__PURE__ */ jsx(Input, {
|
|
114
|
+
id: "contact-email",
|
|
115
|
+
name: "email",
|
|
116
|
+
type: "email",
|
|
117
|
+
keyboard: { kind: "email" },
|
|
118
|
+
placeholder: "your@email.com",
|
|
119
|
+
disabled: contactPending || contactResult?.success,
|
|
120
|
+
required: true
|
|
121
|
+
})]
|
|
122
|
+
}),
|
|
123
|
+
/* @__PURE__ */ jsxs(VStack, {
|
|
124
|
+
className: "gap-2",
|
|
125
|
+
children: [/* @__PURE__ */ jsx(Small, {
|
|
126
|
+
className: "text-sm font-medium",
|
|
127
|
+
children: "Message"
|
|
128
|
+
}), /* @__PURE__ */ jsx(Textarea, {
|
|
129
|
+
id: "contact-message",
|
|
130
|
+
name: "message",
|
|
131
|
+
placeholder: "Tell us what's on your mind...",
|
|
132
|
+
disabled: contactPending || contactResult?.success,
|
|
133
|
+
rows: 6,
|
|
134
|
+
required: true
|
|
135
|
+
})]
|
|
136
|
+
}),
|
|
137
|
+
contactResult && !contactPending && /* @__PURE__ */ jsxs(HStack, {
|
|
138
|
+
className: `items-center gap-2 rounded-lg p-3 text-sm ${contactResult.success ? "border border-green-500/20 bg-green-500/10 text-green-400" : "border border-red-500/20 bg-red-500/10 text-red-400"}`,
|
|
139
|
+
children: [contactResult.success ? /* @__PURE__ */ jsx(CheckCircle, { size: 16 }) : /* @__PURE__ */ jsx(AlertCircle, { size: 16 }), /* @__PURE__ */ jsx(Small, { children: contactResult.text })]
|
|
140
|
+
}),
|
|
141
|
+
/* @__PURE__ */ jsx(Button, {
|
|
142
|
+
type: "submit",
|
|
143
|
+
disabled: contactPending || contactResult?.success,
|
|
144
|
+
className: "w-full",
|
|
145
|
+
children: contactPending ? "Sending..." : "Send message"
|
|
146
|
+
})
|
|
147
|
+
]
|
|
148
|
+
})
|
|
149
|
+
})]
|
|
150
|
+
})
|
|
151
|
+
]
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
//#endregion
|
|
157
|
+
export { ContactClient };
|
|
158
|
+
//# sourceMappingURL=ContactClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContactClient.js","names":[],"sources":["../../../src/components/marketing/ContactClient.tsx"],"sourcesContent":["'use client';\n\nimport { useActionState } from 'react';\nimport {\n Calendar,\n MessageSquare,\n CheckCircle,\n AlertCircle,\n} from 'lucide-react';\nimport { submitContactForm } from '../../libs/email/contact';\nimport type { SubmitContactFormResult } from '../../libs/email/types'; // Assuming these are exported from root or similar, need to check where submitContactForm lives.\n// Wait check imports again. submitContactForm is imported from @contractspec/bundle.marketing.\n// In bundle.marketing, it is likely in 'src/actions' or 'src/utils'.\n// I need to check where submitContactForm is defined in bundle.marketing.\nimport { WaitlistSection } from './waitlist-section';\nimport {\n ActionForm,\n Button,\n Input,\n Textarea,\n} from '@contractspec/lib.design-system';\nimport { VStack, HStack } from '@contractspec/lib.ui-kit-web/ui/stack';\nimport {\n H2,\n H1,\n Small,\n Muted,\n} from '@contractspec/lib.ui-kit-web/ui/typography';\n\nexport function ContactClient() {\n // Contact form handler\n const handleContactSubmit = async (\n _prevState: SubmitContactFormResult | null,\n formData: FormData\n ): Promise<SubmitContactFormResult> => {\n const result = await submitContactForm(formData);\n\n if (result.success) {\n return {\n success: true,\n text: \"Message sent successfully! We'll get back to you soon.\",\n };\n } else {\n return {\n success: false,\n text: result.text || 'Failed to send message. Please try again.',\n };\n }\n };\n\n const [contactResult, contactAction, contactPending] = useActionState<\n SubmitContactFormResult | null,\n FormData\n >(handleContactSubmit, null);\n\n return (\n <section className=\"section-padding hero-gradient w-full\">\n <VStack className=\"mx-auto max-w-4xl gap-16\">\n <VStack className=\"gap-4 text-center\">\n <H1 className=\"text-5xl font-bold\">Get in touch</H1>\n <Muted className=\"text-lg\">\n Choose how you'd like to connect with us\n </Muted>\n </VStack>\n\n {/* Waitlist Registration Section */}\n <WaitlistSection context=\"contact\" />\n\n {/* Book a Call Section */}\n <VStack className=\"card-subtle gap-6 p-8\" id=\"call\">\n <HStack className=\"items-center gap-3\">\n <Calendar className=\"text-blue-400\" size={24} />\n <VStack className=\"items-start gap-1\">\n <H2 className=\"text-2xl font-bold\">Book a 20-min call</H2>\n <Muted className=\"text-sm\">\n Schedule a walkthrough with our team to see ContractSpec in\n action\n </Muted>\n </VStack>\n </HStack>\n\n <div className=\"border-border overflow-hidden rounded-lg border\">\n <object\n data=\"https://meet.reclaimai.com/e/f863cb29-caac-44b6-972b-1407dd9545a3\"\n width=\"100%\"\n height=\"700px\"\n style={{ outline: 'none' }}\n aria-label=\"Calendar booking widget\"\n />\n </div>\n </VStack>\n\n {/* Send Message Section */}\n <VStack className=\"card-subtle gap-6 p-8\" id=\"message\">\n <HStack className=\"items-center gap-3\">\n <MessageSquare className=\"text-emerald-400\" size={24} />\n <VStack className=\"items-start gap-1\">\n <H2 className=\"text-2xl font-bold\">Send us a message</H2>\n <Muted className=\"text-sm\">\n Have questions or feedback? We'd love to hear from you\n </Muted>\n </VStack>\n </HStack>\n\n <ActionForm action={contactAction}>\n <VStack className=\"gap-4\">\n <VStack className=\"gap-2\">\n <Small className=\"text-sm font-medium\">Name</Small>\n <Input\n id=\"contact-name\"\n name=\"name\"\n type=\"text\"\n placeholder=\"Your name\"\n disabled={contactPending || contactResult?.success}\n required\n />\n </VStack>\n\n <VStack className=\"gap-2\">\n <Small className=\"text-sm font-medium\">Email</Small>\n <Input\n id=\"contact-email\"\n name=\"email\"\n type=\"email\"\n keyboard={{ kind: 'email' }}\n placeholder=\"your@email.com\"\n disabled={contactPending || contactResult?.success}\n required\n />\n </VStack>\n\n <VStack className=\"gap-2\">\n <Small className=\"text-sm font-medium\">Message</Small>\n <Textarea\n id=\"contact-message\"\n name=\"message\"\n placeholder=\"Tell us what's on your mind...\"\n disabled={contactPending || contactResult?.success}\n rows={6}\n required\n />\n </VStack>\n\n {contactResult && !contactPending && (\n <HStack\n className={`items-center gap-2 rounded-lg p-3 text-sm ${\n contactResult.success\n ? 'border border-green-500/20 bg-green-500/10 text-green-400'\n : 'border border-red-500/20 bg-red-500/10 text-red-400'\n }`}\n >\n {contactResult.success ? (\n <CheckCircle size={16} />\n ) : (\n <AlertCircle size={16} />\n )}\n <Small>{contactResult.text}</Small>\n </HStack>\n )}\n\n <Button\n type=\"submit\"\n disabled={contactPending || contactResult?.success}\n className=\"w-full\"\n >\n {contactPending ? 'Sending...' : 'Send message'}\n </Button>\n </VStack>\n </ActionForm>\n </VStack>\n </VStack>\n </section>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA6BA,SAAgB,gBAAgB;CAE9B,MAAM,sBAAsB,OAC1B,YACA,aACqC;EACrC,MAAM,SAAS,MAAM,kBAAkB,SAAS;AAEhD,MAAI,OAAO,QACT,QAAO;GACL,SAAS;GACT,MAAM;GACP;MAED,QAAO;GACL,SAAS;GACT,MAAM,OAAO,QAAQ;GACtB;;CAIL,MAAM,CAAC,eAAe,eAAe,kBAAkB,eAGrD,qBAAqB,KAAK;AAE5B,QACE,oBAAC;EAAQ,WAAU;YACjB,qBAAC;GAAO,WAAU;;IAChB,qBAAC;KAAO,WAAU;gBAChB,oBAAC;MAAG,WAAU;gBAAqB;OAAiB,EACpD,oBAAC;MAAM,WAAU;gBAAU;OAEnB;MACD;IAGT,oBAAC,mBAAgB,SAAQ,YAAY;IAGrC,qBAAC;KAAO,WAAU;KAAwB,IAAG;gBAC3C,qBAAC;MAAO,WAAU;iBAChB,oBAAC;OAAS,WAAU;OAAgB,MAAM;QAAM,EAChD,qBAAC;OAAO,WAAU;kBAChB,oBAAC;QAAG,WAAU;kBAAqB;SAAuB,EAC1D,oBAAC;QAAM,WAAU;kBAAU;SAGnB;QACD;OACF,EAET,oBAAC;MAAI,WAAU;gBACb,oBAAC;OACC,MAAK;OACL,OAAM;OACN,QAAO;OACP,OAAO,EAAE,SAAS,QAAQ;OAC1B,cAAW;QACX;OACE;MACC;IAGT,qBAAC;KAAO,WAAU;KAAwB,IAAG;gBAC3C,qBAAC;MAAO,WAAU;iBAChB,oBAAC;OAAc,WAAU;OAAmB,MAAM;QAAM,EACxD,qBAAC;OAAO,WAAU;kBAChB,oBAAC;QAAG,WAAU;kBAAqB;SAAsB,EACzD,oBAAC;QAAM,WAAU;kBAAU;SAEnB;QACD;OACF,EAET,oBAAC;MAAW,QAAQ;gBAClB,qBAAC;OAAO,WAAU;;QAChB,qBAAC;SAAO,WAAU;oBAChB,oBAAC;UAAM,WAAU;oBAAsB;WAAY,EACnD,oBAAC;UACC,IAAG;UACH,MAAK;UACL,MAAK;UACL,aAAY;UACZ,UAAU,kBAAkB,eAAe;UAC3C;WACA;UACK;QAET,qBAAC;SAAO,WAAU;oBAChB,oBAAC;UAAM,WAAU;oBAAsB;WAAa,EACpD,oBAAC;UACC,IAAG;UACH,MAAK;UACL,MAAK;UACL,UAAU,EAAE,MAAM,SAAS;UAC3B,aAAY;UACZ,UAAU,kBAAkB,eAAe;UAC3C;WACA;UACK;QAET,qBAAC;SAAO,WAAU;oBAChB,oBAAC;UAAM,WAAU;oBAAsB;WAAe,EACtD,oBAAC;UACC,IAAG;UACH,MAAK;UACL,aAAY;UACZ,UAAU,kBAAkB,eAAe;UAC3C,MAAM;UACN;WACA;UACK;QAER,iBAAiB,CAAC,kBACjB,qBAAC;SACC,WAAW,6CACT,cAAc,UACV,8DACA;oBAGL,cAAc,UACb,oBAAC,eAAY,MAAM,KAAM,GAEzB,oBAAC,eAAY,MAAM,KAAM,EAE3B,oBAAC,mBAAO,cAAc,OAAa;UAC5B;QAGX,oBAAC;SACC,MAAK;SACL,UAAU,kBAAkB,eAAe;SAC3C,WAAU;mBAET,iBAAiB,eAAe;UAC1B;;QACF;OACE;MACN;;IACF;GACD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import { Metadata } from "next";
|
|
3
|
+
|
|
4
|
+
//#region src/components/marketing/ContributePage.d.ts
|
|
5
|
+
declare const metadata: Metadata;
|
|
6
|
+
declare function ContributePage(): react_jsx_runtime0.JSX.Element;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { ContributePage, metadata };
|
|
9
|
+
//# sourceMappingURL=ContributePage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContributePage.d.ts","names":[],"sources":["../../../src/components/marketing/ContributePage.tsx"],"mappings":";;;;cAEa,QAAA,EAAU,QAAA;AAAA,iBAeP,cAAA,CAAA,GAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/ContributePage.tsx
|
|
4
|
+
const metadata = {
|
|
5
|
+
title: "Contribute to ContractSpec",
|
|
6
|
+
description: "Join the ContractSpec open-source community. Report issues, improve docs, build integrations, and help shape the future of spec-first development.",
|
|
7
|
+
openGraph: {
|
|
8
|
+
title: "Contribute to ContractSpec",
|
|
9
|
+
description: "Get started contributing in under 3 minutes. Docs, examples, integrations, and more.",
|
|
10
|
+
url: "https://contractspec.io/contribute"
|
|
11
|
+
},
|
|
12
|
+
alternates: { canonical: "https://contractspec.io/contribute" }
|
|
13
|
+
};
|
|
14
|
+
function ContributePage() {
|
|
15
|
+
return /* @__PURE__ */ jsx("main", {
|
|
16
|
+
className: "flex grow flex-col items-center justify-center",
|
|
17
|
+
children: /* @__PURE__ */ jsx("section", {
|
|
18
|
+
className: "section-padding",
|
|
19
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
20
|
+
className: "prose prose-invert mx-auto max-w-2xl",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx("h1", {
|
|
23
|
+
className: "mb-8 text-4xl font-bold",
|
|
24
|
+
children: "Contribute to ContractSpec"
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ jsxs("div", {
|
|
27
|
+
className: "not-prose border-border bg-muted/30 mb-12 rounded-lg border p-6",
|
|
28
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
29
|
+
className: "text-foreground mb-4 text-xl font-bold",
|
|
30
|
+
children: "⚡ Quick Start — 3 Minutes to Your First Contribution"
|
|
31
|
+
}), /* @__PURE__ */ jsxs("ol", {
|
|
32
|
+
className: "text-muted-foreground list-inside list-decimal space-y-2",
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
35
|
+
"Read the",
|
|
36
|
+
" ",
|
|
37
|
+
/* @__PURE__ */ jsx("a", {
|
|
38
|
+
href: "https://github.com/contractspec/contractspec/blob/main/CONTRIBUTING.md",
|
|
39
|
+
className: "text-primary hover:underline",
|
|
40
|
+
target: "_blank",
|
|
41
|
+
rel: "noopener noreferrer",
|
|
42
|
+
children: "CONTRIBUTING guide"
|
|
43
|
+
})
|
|
44
|
+
] }),
|
|
45
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
46
|
+
"Pick a",
|
|
47
|
+
" ",
|
|
48
|
+
/* @__PURE__ */ jsx("a", {
|
|
49
|
+
href: "https://github.com/contractspec/contractspec/labels/good%20first%20issue",
|
|
50
|
+
className: "text-primary hover:underline",
|
|
51
|
+
target: "_blank",
|
|
52
|
+
rel: "noopener noreferrer",
|
|
53
|
+
children: "good first issue"
|
|
54
|
+
}),
|
|
55
|
+
" ",
|
|
56
|
+
"or",
|
|
57
|
+
" ",
|
|
58
|
+
/* @__PURE__ */ jsx("a", {
|
|
59
|
+
href: "https://github.com/contractspec/contractspec/labels/help%20wanted",
|
|
60
|
+
className: "text-primary hover:underline",
|
|
61
|
+
target: "_blank",
|
|
62
|
+
rel: "noopener noreferrer",
|
|
63
|
+
children: "help wanted"
|
|
64
|
+
}),
|
|
65
|
+
" ",
|
|
66
|
+
"label"
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ jsx("li", { children: "Open a draft PR early — we'll guide you from there" })
|
|
69
|
+
]
|
|
70
|
+
})]
|
|
71
|
+
}),
|
|
72
|
+
/* @__PURE__ */ jsxs("section", {
|
|
73
|
+
className: "mb-10 space-y-4",
|
|
74
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
75
|
+
className: "text-foreground text-2xl font-bold",
|
|
76
|
+
children: "Why Open Source?"
|
|
77
|
+
}), /* @__PURE__ */ jsxs("ul", {
|
|
78
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Transparency:" }), " You can see exactly how your code is compiled and deployed"] }),
|
|
81
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Trust:" }), " No black boxes — audit the compiler that shapes your AI-generated code"] }),
|
|
82
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Faster ecosystem:" }), " Community contributions accelerate adoption and surface real-world edge cases"] }),
|
|
83
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Community review:" }), " More eyes catch more bugs, and better patterns emerge"] }),
|
|
84
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "No lock-in:" }), " You own your code. The spec is portable."] })
|
|
85
|
+
]
|
|
86
|
+
})]
|
|
87
|
+
}),
|
|
88
|
+
/* @__PURE__ */ jsxs("section", {
|
|
89
|
+
className: "mb-10 space-y-4",
|
|
90
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
91
|
+
className: "text-foreground text-2xl font-bold",
|
|
92
|
+
children: "Where to Contribute"
|
|
93
|
+
}), /* @__PURE__ */ jsxs("ul", {
|
|
94
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
95
|
+
children: [
|
|
96
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
97
|
+
/* @__PURE__ */ jsx("a", {
|
|
98
|
+
href: "https://github.com/contractspec",
|
|
99
|
+
className: "text-primary hover:underline",
|
|
100
|
+
target: "_blank",
|
|
101
|
+
rel: "noopener noreferrer",
|
|
102
|
+
children: "GitHub Organization"
|
|
103
|
+
}),
|
|
104
|
+
" ",
|
|
105
|
+
"— All repos live here"
|
|
106
|
+
] }),
|
|
107
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
108
|
+
/* @__PURE__ */ jsx("a", {
|
|
109
|
+
href: "https://github.com/contractspec/contractspec",
|
|
110
|
+
className: "text-primary hover:underline",
|
|
111
|
+
target: "_blank",
|
|
112
|
+
rel: "noopener noreferrer",
|
|
113
|
+
children: "Main Repository"
|
|
114
|
+
}),
|
|
115
|
+
" ",
|
|
116
|
+
"— Core compiler and specs"
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
119
|
+
/* @__PURE__ */ jsx("a", {
|
|
120
|
+
href: "https://github.com/contractspec/contractspec/discussions",
|
|
121
|
+
className: "text-primary hover:underline",
|
|
122
|
+
target: "_blank",
|
|
123
|
+
rel: "noopener noreferrer",
|
|
124
|
+
children: "Discussions"
|
|
125
|
+
}),
|
|
126
|
+
" ",
|
|
127
|
+
"— Questions, ideas, and RFCs"
|
|
128
|
+
] })
|
|
129
|
+
]
|
|
130
|
+
})]
|
|
131
|
+
}),
|
|
132
|
+
/* @__PURE__ */ jsxs("section", {
|
|
133
|
+
className: "mb-10 space-y-4",
|
|
134
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
135
|
+
className: "text-foreground text-2xl font-bold",
|
|
136
|
+
children: "Ways to Contribute"
|
|
137
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
138
|
+
className: "text-muted-foreground space-y-3",
|
|
139
|
+
children: [
|
|
140
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
141
|
+
/* @__PURE__ */ jsx("strong", {
|
|
142
|
+
className: "text-foreground",
|
|
143
|
+
children: "📄 Documentation:"
|
|
144
|
+
}),
|
|
145
|
+
" ",
|
|
146
|
+
"Fix typos, improve explanations, add missing guides"
|
|
147
|
+
] }),
|
|
148
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
149
|
+
/* @__PURE__ */ jsx("strong", {
|
|
150
|
+
className: "text-foreground",
|
|
151
|
+
children: "📦 Examples & Templates:"
|
|
152
|
+
}),
|
|
153
|
+
" ",
|
|
154
|
+
"Build real-world specs for common use cases"
|
|
155
|
+
] }),
|
|
156
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
157
|
+
/* @__PURE__ */ jsx("strong", {
|
|
158
|
+
className: "text-foreground",
|
|
159
|
+
children: "🔌 Integrations & Adapters:"
|
|
160
|
+
}),
|
|
161
|
+
" ",
|
|
162
|
+
"Connect ContractSpec to frameworks, databases, and tools"
|
|
163
|
+
] }),
|
|
164
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
165
|
+
/* @__PURE__ */ jsx("strong", {
|
|
166
|
+
className: "text-foreground",
|
|
167
|
+
children: "🐛 Bug Reports:"
|
|
168
|
+
}),
|
|
169
|
+
" ",
|
|
170
|
+
"File issues with clear reproduction steps — minimal cases help the most"
|
|
171
|
+
] }),
|
|
172
|
+
/* @__PURE__ */ jsxs("p", { children: [
|
|
173
|
+
/* @__PURE__ */ jsx("strong", {
|
|
174
|
+
className: "text-foreground",
|
|
175
|
+
children: "🔒 Security Reports:"
|
|
176
|
+
}),
|
|
177
|
+
" ",
|
|
178
|
+
"Found a vulnerability? See",
|
|
179
|
+
" ",
|
|
180
|
+
/* @__PURE__ */ jsx("a", {
|
|
181
|
+
href: "#security",
|
|
182
|
+
className: "text-primary hover:underline",
|
|
183
|
+
children: "Security"
|
|
184
|
+
}),
|
|
185
|
+
" ",
|
|
186
|
+
"below"
|
|
187
|
+
] })
|
|
188
|
+
]
|
|
189
|
+
})]
|
|
190
|
+
}),
|
|
191
|
+
/* @__PURE__ */ jsxs("section", {
|
|
192
|
+
className: "mb-10 space-y-4",
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ jsx("h2", {
|
|
195
|
+
className: "text-foreground text-2xl font-bold",
|
|
196
|
+
children: "Quality Bar"
|
|
197
|
+
}),
|
|
198
|
+
/* @__PURE__ */ jsx("p", {
|
|
199
|
+
className: "text-muted-foreground",
|
|
200
|
+
children: "We keep the bar high so the codebase stays maintainable. Every PR should:"
|
|
201
|
+
}),
|
|
202
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
203
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
204
|
+
children: [
|
|
205
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Include tests" }), " — Unit tests for logic, integration tests for adapters"] }),
|
|
206
|
+
/* @__PURE__ */ jsxs("li", { children: [
|
|
207
|
+
/* @__PURE__ */ jsx("strong", { children: "Be fully typed" }),
|
|
208
|
+
" — No ",
|
|
209
|
+
/* @__PURE__ */ jsx("code", { children: "any" }),
|
|
210
|
+
". Strict TypeScript only."
|
|
211
|
+
] }),
|
|
212
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Stay small" }), " — One concern per PR. Easier to review, faster to merge."] }),
|
|
213
|
+
/* @__PURE__ */ jsxs("li", { children: [/* @__PURE__ */ jsx("strong", { children: "Use clear commit messages" }), " — Describe _what_ and _why_, not just _how_"] })
|
|
214
|
+
]
|
|
215
|
+
}),
|
|
216
|
+
/* @__PURE__ */ jsxs("div", {
|
|
217
|
+
className: "bg-muted/20 mt-4 rounded-md p-4",
|
|
218
|
+
children: [/* @__PURE__ */ jsx("h3", {
|
|
219
|
+
className: "text-foreground mb-2 font-semibold",
|
|
220
|
+
children: "Spec-First Mindset"
|
|
221
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
222
|
+
className: "text-muted-foreground text-sm",
|
|
223
|
+
children: "ContractSpec exists to enforce contracts between humans, AI, and code. When contributing, think spec-first: define the behavior before the implementation. A well-defined spec makes changes safe to regenerate and easy to validate."
|
|
224
|
+
})]
|
|
225
|
+
})
|
|
226
|
+
]
|
|
227
|
+
}),
|
|
228
|
+
/* @__PURE__ */ jsxs("section", {
|
|
229
|
+
className: "mb-10 space-y-4",
|
|
230
|
+
children: [
|
|
231
|
+
/* @__PURE__ */ jsx("h2", {
|
|
232
|
+
className: "text-foreground text-2xl font-bold",
|
|
233
|
+
children: "Governance & Decision Making"
|
|
234
|
+
}),
|
|
235
|
+
/* @__PURE__ */ jsxs("p", {
|
|
236
|
+
className: "text-muted-foreground",
|
|
237
|
+
children: [
|
|
238
|
+
"ContractSpec uses a",
|
|
239
|
+
" ",
|
|
240
|
+
/* @__PURE__ */ jsx("strong", {
|
|
241
|
+
className: "text-foreground",
|
|
242
|
+
children: "founder-led maintainer model"
|
|
243
|
+
}),
|
|
244
|
+
":"
|
|
245
|
+
]
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
248
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
249
|
+
children: [
|
|
250
|
+
/* @__PURE__ */ jsx("li", { children: "The founder has final say on significant decisions — for now" }),
|
|
251
|
+
/* @__PURE__ */ jsx("li", { children: "All reasoning is shared publicly in issues or PRs" }),
|
|
252
|
+
/* @__PURE__ */ jsx("li", { children: "Community input shapes direction; we don't merge in silence" }),
|
|
253
|
+
/* @__PURE__ */ jsx("li", { children: "This model may evolve as the project matures and trusted maintainers emerge" })
|
|
254
|
+
]
|
|
255
|
+
})
|
|
256
|
+
]
|
|
257
|
+
}),
|
|
258
|
+
/* @__PURE__ */ jsxs("section", {
|
|
259
|
+
className: "mb-10 space-y-4",
|
|
260
|
+
id: "security",
|
|
261
|
+
children: [
|
|
262
|
+
/* @__PURE__ */ jsx("h2", {
|
|
263
|
+
className: "text-foreground text-2xl font-bold",
|
|
264
|
+
children: "Security"
|
|
265
|
+
}),
|
|
266
|
+
/* @__PURE__ */ jsxs("p", {
|
|
267
|
+
className: "text-muted-foreground",
|
|
268
|
+
children: [
|
|
269
|
+
"If you discover a security vulnerability, please",
|
|
270
|
+
" ",
|
|
271
|
+
/* @__PURE__ */ jsx("strong", {
|
|
272
|
+
className: "text-foreground",
|
|
273
|
+
children: "do not"
|
|
274
|
+
}),
|
|
275
|
+
" open a public issue."
|
|
276
|
+
]
|
|
277
|
+
}),
|
|
278
|
+
/* @__PURE__ */ jsxs("p", {
|
|
279
|
+
className: "text-muted-foreground",
|
|
280
|
+
children: [
|
|
281
|
+
"Instead, email us at",
|
|
282
|
+
" ",
|
|
283
|
+
/* @__PURE__ */ jsx("a", {
|
|
284
|
+
href: "mailto:security@contractspec.io",
|
|
285
|
+
className: "text-primary hover:underline",
|
|
286
|
+
children: "security@contractspec.io"
|
|
287
|
+
}),
|
|
288
|
+
" ",
|
|
289
|
+
"with:"
|
|
290
|
+
]
|
|
291
|
+
}),
|
|
292
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
293
|
+
className: "text-muted-foreground list-inside list-disc space-y-2",
|
|
294
|
+
children: [
|
|
295
|
+
/* @__PURE__ */ jsx("li", { children: "A clear description of the vulnerability" }),
|
|
296
|
+
/* @__PURE__ */ jsx("li", { children: "Steps to reproduce" }),
|
|
297
|
+
/* @__PURE__ */ jsx("li", { children: "Potential impact" })
|
|
298
|
+
]
|
|
299
|
+
}),
|
|
300
|
+
/* @__PURE__ */ jsx("p", {
|
|
301
|
+
className: "text-muted-foreground",
|
|
302
|
+
children: "We'll acknowledge within 48 hours and work with you to coordinate disclosure."
|
|
303
|
+
})
|
|
304
|
+
]
|
|
305
|
+
}),
|
|
306
|
+
/* @__PURE__ */ jsxs("section", {
|
|
307
|
+
className: "mb-10 space-y-4",
|
|
308
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
309
|
+
className: "text-foreground text-2xl font-bold",
|
|
310
|
+
children: "Code of Conduct"
|
|
311
|
+
}), /* @__PURE__ */ jsxs("p", {
|
|
312
|
+
className: "text-muted-foreground",
|
|
313
|
+
children: [
|
|
314
|
+
"We expect all contributors to follow our",
|
|
315
|
+
" ",
|
|
316
|
+
/* @__PURE__ */ jsx("a", {
|
|
317
|
+
href: "https://github.com/contractspec/contractspec/blob/main/CODE_OF_CONDUCT.md",
|
|
318
|
+
className: "text-primary hover:underline",
|
|
319
|
+
target: "_blank",
|
|
320
|
+
rel: "noopener noreferrer",
|
|
321
|
+
children: "Code of Conduct"
|
|
322
|
+
}),
|
|
323
|
+
". Be respectful, constructive, and assume good intent."
|
|
324
|
+
]
|
|
325
|
+
})]
|
|
326
|
+
}),
|
|
327
|
+
/* @__PURE__ */ jsxs("section", {
|
|
328
|
+
className: "border-border mt-12 space-y-4 border-t pt-8",
|
|
329
|
+
children: [
|
|
330
|
+
/* @__PURE__ */ jsx("h2", {
|
|
331
|
+
className: "text-foreground text-2xl font-bold",
|
|
332
|
+
children: "Want to Go Deeper?"
|
|
333
|
+
}),
|
|
334
|
+
/* @__PURE__ */ jsx("p", {
|
|
335
|
+
className: "text-muted-foreground",
|
|
336
|
+
children: "If you're considering a long-term commitment to ContractSpec — reviewing PRs regularly, shaping roadmap, mentoring new contributors — we'd love to talk."
|
|
337
|
+
}),
|
|
338
|
+
/* @__PURE__ */ jsxs("p", {
|
|
339
|
+
className: "text-muted-foreground",
|
|
340
|
+
children: [
|
|
341
|
+
"This isn't a job offer. It's an invitation to help build something meaningful together. Reach out at",
|
|
342
|
+
" ",
|
|
343
|
+
/* @__PURE__ */ jsx("a", {
|
|
344
|
+
href: "mailto:maintainers@contractspec.io",
|
|
345
|
+
className: "text-primary hover:underline",
|
|
346
|
+
children: "maintainers@contractspec.io"
|
|
347
|
+
}),
|
|
348
|
+
" ",
|
|
349
|
+
"and tell us what you'd bring to the table."
|
|
350
|
+
]
|
|
351
|
+
})
|
|
352
|
+
]
|
|
353
|
+
})
|
|
354
|
+
]
|
|
355
|
+
})
|
|
356
|
+
})
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
//#endregion
|
|
361
|
+
export { ContributePage, metadata };
|
|
362
|
+
//# sourceMappingURL=ContributePage.js.map
|