@contractspec/bundle.marketing 3.7.6 → 3.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/.turbo/turbo-build.log +87 -87
  2. package/AGENTS.md +29 -21
  3. package/CHANGELOG.md +59 -0
  4. package/README.md +36 -49
  5. package/dist/browser/components/marketing/ChangelogPage.js +8 -8
  6. package/dist/browser/components/marketing/CofounderPage.js +167 -523
  7. package/dist/browser/components/marketing/ContactClient.js +200 -207
  8. package/dist/browser/components/marketing/ContributePage.js +211 -463
  9. package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
  10. package/dist/browser/components/marketing/LandingPage.js +464 -568
  11. package/dist/browser/components/marketing/PricingClient.js +213 -839
  12. package/dist/browser/components/marketing/ProductClientPage.js +265 -463
  13. package/dist/browser/components/marketing/index.js +2007 -3338
  14. package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
  15. package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
  16. package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
  17. package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
  18. package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
  19. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
  20. package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
  21. package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
  22. package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
  23. package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
  24. package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
  25. package/dist/browser/components/marketing/studio-signup-section.js +25 -41
  26. package/dist/browser/components/templates/TemplatesClientPage.js +2374 -3571
  27. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  28. package/dist/browser/components/templates/TemplatesPreviewModal.js +27 -3
  29. package/dist/browser/components/templates/index.js +2412 -3609
  30. package/dist/browser/index.js +2415 -3612
  31. package/dist/browser/libs/email/client.js +1 -1
  32. package/dist/browser/libs/email/contact.js +1 -1
  33. package/dist/browser/libs/email/newsletter.js +1 -1
  34. package/dist/browser/libs/email/waitlist-application.js +1 -1
  35. package/dist/browser/libs/email/waitlist.js +1 -1
  36. package/dist/browser/registry/engine.js +2003 -3334
  37. package/dist/browser/registry/index.js +2003 -3334
  38. package/dist/browser/registry/registry-docs.js +2 -2
  39. package/dist/browser/registry/registry-landing.js +2007 -3338
  40. package/dist/browser/registry/registry.js +2003 -3334
  41. package/dist/browser/registry/utils.js +2003 -3334
  42. package/dist/components/marketing/ChangelogPage.js +8 -8
  43. package/dist/components/marketing/CofounderPage.js +167 -523
  44. package/dist/components/marketing/ContactClient.js +200 -207
  45. package/dist/components/marketing/ContributePage.d.ts +0 -2
  46. package/dist/components/marketing/ContributePage.js +211 -463
  47. package/dist/components/marketing/DesignPartnerPage.js +165 -218
  48. package/dist/components/marketing/LandingPage.js +464 -568
  49. package/dist/components/marketing/PricingClient.js +213 -839
  50. package/dist/components/marketing/ProductClientPage.js +265 -463
  51. package/dist/components/marketing/index.d.ts +5 -5
  52. package/dist/components/marketing/index.js +2007 -3338
  53. package/dist/components/marketing/pricing-thinking-modal.js +12 -12
  54. package/dist/components/marketing/sections/AudienceSection.js +2 -2
  55. package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
  56. package/dist/components/marketing/sections/CtaSection.js +3 -3
  57. package/dist/components/marketing/sections/FearsSection.js +3 -3
  58. package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
  59. package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
  60. package/dist/components/marketing/sections/IconGridSection.js +2 -2
  61. package/dist/components/marketing/sections/OutputsSection.js +2 -2
  62. package/dist/components/marketing/sections/ProblemSection.js +2 -2
  63. package/dist/components/marketing/sections/SolutionSection.js +2 -2
  64. package/dist/components/marketing/sections/StepsSection.js +4 -4
  65. package/dist/components/marketing/studio-signup-section.js +25 -41
  66. package/dist/components/templates/TemplatesClientPage.js +2374 -3571
  67. package/dist/components/templates/TemplatesPage.js +1 -1
  68. package/dist/components/templates/TemplatesPreviewModal.js +27 -3
  69. package/dist/components/templates/index.js +2412 -3609
  70. package/dist/index.js +2415 -3612
  71. package/dist/libs/email/client.js +1 -1
  72. package/dist/libs/email/contact.js +1 -1
  73. package/dist/libs/email/newsletter.js +1 -1
  74. package/dist/libs/email/waitlist-application.js +1 -1
  75. package/dist/libs/email/waitlist.js +1 -1
  76. package/dist/node/components/marketing/ChangelogPage.js +8 -8
  77. package/dist/node/components/marketing/CofounderPage.js +167 -523
  78. package/dist/node/components/marketing/ContactClient.js +200 -207
  79. package/dist/node/components/marketing/ContributePage.js +211 -463
  80. package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
  81. package/dist/node/components/marketing/LandingPage.js +464 -568
  82. package/dist/node/components/marketing/PricingClient.js +213 -839
  83. package/dist/node/components/marketing/ProductClientPage.js +265 -463
  84. package/dist/node/components/marketing/index.js +2007 -3338
  85. package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
  86. package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
  87. package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
  88. package/dist/node/components/marketing/sections/CtaSection.js +3 -3
  89. package/dist/node/components/marketing/sections/FearsSection.js +3 -3
  90. package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
  91. package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
  92. package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
  93. package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
  94. package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
  95. package/dist/node/components/marketing/sections/StepsSection.js +4 -4
  96. package/dist/node/components/marketing/studio-signup-section.js +25 -41
  97. package/dist/node/components/templates/TemplatesClientPage.js +2374 -3571
  98. package/dist/node/components/templates/TemplatesPage.js +1 -1
  99. package/dist/node/components/templates/TemplatesPreviewModal.js +27 -3
  100. package/dist/node/components/templates/index.js +2412 -3609
  101. package/dist/node/index.js +2415 -3612
  102. package/dist/node/libs/email/client.js +1 -1
  103. package/dist/node/libs/email/contact.js +1 -1
  104. package/dist/node/libs/email/newsletter.js +1 -1
  105. package/dist/node/libs/email/waitlist-application.js +1 -1
  106. package/dist/node/libs/email/waitlist.js +1 -1
  107. package/dist/node/registry/engine.js +2003 -3334
  108. package/dist/node/registry/index.js +2003 -3334
  109. package/dist/node/registry/registry-docs.js +2 -2
  110. package/dist/node/registry/registry-landing.js +2007 -3338
  111. package/dist/node/registry/registry.js +2003 -3334
  112. package/dist/node/registry/utils.js +2003 -3334
  113. package/dist/registry/engine.js +2003 -3334
  114. package/dist/registry/index.js +2003 -3334
  115. package/dist/registry/registry-docs.js +2 -2
  116. package/dist/registry/registry-landing.js +2007 -3338
  117. package/dist/registry/registry.js +2003 -3334
  118. package/dist/registry/utils.js +2003 -3334
  119. package/package.json +31 -29
  120. package/src/bundles/MarketingBundle.ts +273 -273
  121. package/src/components/marketing/ChangelogPage.tsx +72 -100
  122. package/src/components/marketing/CofounderPage.tsx +120 -384
  123. package/src/components/marketing/ContactClient.tsx +164 -154
  124. package/src/components/marketing/ContributePage.tsx +139 -313
  125. package/src/components/marketing/DesignPartnerPage.tsx +133 -171
  126. package/src/components/marketing/LandingPage.tsx +353 -25
  127. package/src/components/marketing/PricingClient.tsx +192 -437
  128. package/src/components/marketing/ProductClientPage.tsx +255 -377
  129. package/src/components/marketing/index.ts +5 -5
  130. package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
  131. package/src/components/marketing/sections/AudienceSection.tsx +55 -56
  132. package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
  133. package/src/components/marketing/sections/CtaSection.tsx +49 -50
  134. package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
  135. package/src/components/marketing/sections/FearsSection.tsx +36 -37
  136. package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
  137. package/src/components/marketing/sections/IconGridSection.tsx +71 -71
  138. package/src/components/marketing/sections/OutputsSection.tsx +51 -52
  139. package/src/components/marketing/sections/ProblemSection.tsx +39 -40
  140. package/src/components/marketing/sections/SolutionSection.tsx +39 -40
  141. package/src/components/marketing/sections/StepsSection.tsx +47 -48
  142. package/src/components/marketing/studio-signup-section.tsx +39 -41
  143. package/src/components/templates/TemplatesClientPage.tsx +763 -685
  144. package/src/components/templates/TemplatesPage.tsx +110 -110
  145. package/src/components/templates/TemplatesPreviewModal.tsx +251 -198
  146. package/src/index.ts +4 -4
  147. package/src/libs/email/client.test.ts +81 -81
  148. package/src/libs/email/client.ts +111 -111
  149. package/src/libs/email/contact.ts +35 -35
  150. package/src/libs/email/newsletter.ts +46 -46
  151. package/src/libs/email/types.ts +29 -29
  152. package/src/libs/email/utils.ts +5 -5
  153. package/src/libs/email/waitlist-application.ts +72 -72
  154. package/src/libs/email/waitlist.ts +46 -46
  155. package/src/libs/pricing-examples.ts +12 -12
  156. package/src/registry/engine.ts +16 -16
  157. package/src/registry/factory.ts +57 -57
  158. package/src/registry/registry-docs.ts +656 -666
  159. package/src/registry/registry-landing.ts +94 -95
  160. package/src/registry/registry.ts +36 -37
  161. package/src/registry/types.ts +2 -2
  162. package/src/registry/utils.ts +56 -56
  163. package/tsconfig.json +11 -11
  164. package/tsdown.config.js +5 -5
@@ -1,59 +1,58 @@
1
- import * as React from 'react';
2
1
  import { IconGridSection } from './IconGridSection';
3
2
 
4
3
  const outputs = [
5
- {
6
- title: 'REST API',
7
- description:
8
- 'Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.',
9
- icon: '🔌',
10
- },
11
- {
12
- title: 'GraphQL Schema',
13
- description:
14
- '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:
25
- 'AI agent tool definitions. Works with Claude, GPT, and any MCP client.',
26
- icon: '🤖',
27
- },
28
- {
29
- title: 'Client SDKs',
30
- description: 'Type-safe API clients. Standard fetch/axios underneath.',
31
- icon: '📦',
32
- },
33
- {
34
- title: 'UI Components',
35
- description: 'React forms and views from specs. Standard JSX output.',
36
- icon: '🎨',
37
- },
4
+ {
5
+ title: 'REST API',
6
+ description:
7
+ 'Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.',
8
+ icon: '🔌',
9
+ },
10
+ {
11
+ title: 'GraphQL Schema',
12
+ description:
13
+ 'Automatically generated resolvers. Standard Pothos/Apollo output.',
14
+ icon: '📊',
15
+ },
16
+ {
17
+ title: 'Database Schema',
18
+ description: 'Prisma migrations and types. Standard SQL underneath.',
19
+ icon: '🗄️',
20
+ },
21
+ {
22
+ title: 'MCP Tools',
23
+ description:
24
+ '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
+ },
38
37
  ];
39
38
 
40
39
  export function OutputsSection() {
41
- return (
42
- <IconGridSection
43
- tone="muted"
44
- columns={3}
45
- title="What ContractSpec generates"
46
- subtitle="One contract, multiple outputs. All in sync. All standard tech."
47
- iconRole="iconFirst"
48
- items={outputs.map((item) => ({
49
- icon: () => (
50
- <span aria-hidden className="text-3xl">
51
- {item.icon}
52
- </span>
53
- ),
54
- title: item.title,
55
- description: item.description,
56
- }))}
57
- />
58
- );
40
+ return (
41
+ <IconGridSection
42
+ tone="muted"
43
+ columns={3}
44
+ title="What ContractSpec generates"
45
+ subtitle="One contract, multiple outputs. All in sync. All standard tech."
46
+ iconRole="iconFirst"
47
+ items={outputs.map((item) => ({
48
+ icon: () => (
49
+ <span aria-hidden className="text-3xl">
50
+ {item.icon}
51
+ </span>
52
+ ),
53
+ title: item.title,
54
+ description: item.description,
55
+ }))}
56
+ />
57
+ );
59
58
  }
@@ -1,47 +1,46 @@
1
- import * as React from 'react';
2
- import { IconGridSection, type IconGridItem } from './IconGridSection';
3
1
  import { AlertTriangle, Layers, RefreshCw, XCircle } from 'lucide-react';
2
+ import { type IconGridItem, IconGridSection } from './IconGridSection';
4
3
 
5
4
  const problemItems: IconGridItem[] = [
6
- {
7
- icon: AlertTriangle,
8
- title: "Can't enforce invariants",
9
- description:
10
- 'AI-generated code drifts from business rules over time. No source of truth means no safety.',
11
- iconClassName: 'text-red-400',
12
- },
13
- {
14
- icon: Layers,
15
- title: 'Multi-surface chaos',
16
- description:
17
- '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:
24
- 'AI "improvements" introduce subtle bugs and break contracts you didn’t know existed.',
25
- iconClassName: 'text-amber-400',
26
- },
27
- {
28
- icon: XCircle,
29
- title: 'Unmaintainable spaghetti',
30
- description:
31
- 'Teams ship fast initially, then spend months untangling AI-generated chaos.',
32
- iconClassName: 'text-red-400',
33
- },
5
+ {
6
+ icon: AlertTriangle,
7
+ title: "Can't enforce invariants",
8
+ description:
9
+ 'AI-generated code drifts from business rules over time. No source of truth means no safety.',
10
+ iconClassName: 'text-red-400',
11
+ },
12
+ {
13
+ icon: Layers,
14
+ title: 'Multi-surface chaos',
15
+ description:
16
+ 'API, DB, UI, and events get out of sync. One change breaks three surfaces.',
17
+ iconClassName: 'text-orange-400',
18
+ },
19
+ {
20
+ icon: RefreshCw,
21
+ title: 'Hallucinated refactors',
22
+ description:
23
+ '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:
30
+ 'Teams ship fast initially, then spend months untangling AI-generated chaos.',
31
+ iconClassName: 'text-red-400',
32
+ },
34
33
  ];
35
34
 
36
35
  export function ProblemSection() {
37
- return (
38
- <IconGridSection
39
- tone="muted"
40
- columns={4}
41
- eyebrow="The Problem"
42
- title="AI agents write code fast. Then the chaos begins."
43
- subtitle='In 2025, "vibe coding" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.'
44
- items={problemItems}
45
- />
46
- );
36
+ return (
37
+ <IconGridSection
38
+ tone="muted"
39
+ columns={4}
40
+ eyebrow="The Problem"
41
+ title="AI agents write code fast. Then the chaos begins."
42
+ subtitle='In 2025, "vibe coding" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.'
43
+ items={problemItems}
44
+ />
45
+ );
47
46
  }
@@ -1,47 +1,46 @@
1
- import * as React from 'react';
2
- import { IconGridSection, type IconGridItem } from './IconGridSection';
3
1
  import { FileCode, Layers, RefreshCw, Shield } from 'lucide-react';
2
+ import { type IconGridItem, IconGridSection } from './IconGridSection';
4
3
 
5
4
  const solutionItems: IconGridItem[] = [
6
- {
7
- icon: FileCode,
8
- title: 'Canonical Source of Truth',
9
- description:
10
- 'Contracts define what the system should do, not just what it does. AI agents read specs, not implementations.',
11
- iconClassName: 'text-emerald-400',
12
- },
13
- {
14
- icon: Layers,
15
- title: 'Multi-Surface Consistency',
16
- description:
17
- '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:
24
- 'Regenerate code anytime without fear. Specs enforce invariants. Breaking changes caught at compile time.',
25
- iconClassName: 'text-violet-400',
26
- },
27
- {
28
- icon: Shield,
29
- title: 'AI Governance',
30
- description:
31
- 'Constrain what AI agents can change. Enforce contracts they must respect. Flag violations automatically.',
32
- iconClassName: 'text-pink-400',
33
- },
5
+ {
6
+ icon: FileCode,
7
+ title: 'Canonical Source of Truth',
8
+ description:
9
+ 'Contracts define what the system should do, not just what it does. AI agents read specs, not implementations.',
10
+ iconClassName: 'text-emerald-400',
11
+ },
12
+ {
13
+ icon: Layers,
14
+ title: 'Multi-Surface Consistency',
15
+ description:
16
+ 'One spec generates API, DB, UI, events, and MCP tools. All surfaces stay in sync because they share the same source.',
17
+ iconClassName: 'text-blue-400',
18
+ },
19
+ {
20
+ icon: RefreshCw,
21
+ title: 'Safe Regeneration',
22
+ description:
23
+ '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:
30
+ 'Constrain what AI agents can change. Enforce contracts they must respect. Flag violations automatically.',
31
+ iconClassName: 'text-pink-400',
32
+ },
34
33
  ];
35
34
 
36
35
  export function SolutionSection() {
37
- return (
38
- <IconGridSection
39
- tone="default"
40
- columns={4}
41
- eyebrow="The Solution"
42
- title="ContractSpec: The safety layer for AI-coded systems"
43
- subtitle="Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in."
44
- items={solutionItems}
45
- />
46
- );
36
+ return (
37
+ <IconGridSection
38
+ tone="default"
39
+ columns={4}
40
+ eyebrow="The Solution"
41
+ title="ContractSpec: The safety layer for AI-coded systems"
42
+ subtitle="Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in."
43
+ items={solutionItems}
44
+ />
45
+ );
47
46
  }
@@ -1,55 +1,54 @@
1
- import * as React from 'react';
2
1
  import { IconGridSection } from './IconGridSection';
3
2
 
4
3
  const steps = [
5
- {
6
- step: 1,
7
- title: 'Pick one module',
8
- description:
9
- 'Start with one API endpoint, one entity, one surface. No big-bang migration.',
10
- },
11
- {
12
- step: 2,
13
- title: 'Define the contract',
14
- description:
15
- 'Write a spec in TypeScript. Just types and Zod schemas you already know.',
16
- },
17
- {
18
- step: 3,
19
- title: 'Generate & compare',
20
- description:
21
- 'See what ContractSpec generates. Compare to your existing code. Keep what works.',
22
- },
23
- {
24
- step: 4,
25
- title: 'Expand gradually',
26
- description:
27
- 'Add more contracts as you see value. No pressure. No lock-in. Your pace.',
28
- },
4
+ {
5
+ step: 1,
6
+ title: 'Pick one module',
7
+ description:
8
+ 'Start with one API endpoint, one entity, one surface. No big-bang migration.',
9
+ },
10
+ {
11
+ step: 2,
12
+ title: 'Define the contract',
13
+ description:
14
+ 'Write a spec in TypeScript. Just types and Zod schemas you already know.',
15
+ },
16
+ {
17
+ step: 3,
18
+ title: 'Generate & compare',
19
+ description:
20
+ 'See what ContractSpec generates. Compare to your existing code. Keep what works.',
21
+ },
22
+ {
23
+ step: 4,
24
+ title: 'Expand gradually',
25
+ description:
26
+ 'Add more contracts as you see value. No pressure. No lock-in. Your pace.',
27
+ },
29
28
  ];
30
29
 
31
30
  export function StepsSection() {
32
- return (
33
- <IconGridSection
34
- tone="default"
35
- columns={4}
36
- title="How incremental adoption works"
37
- padding="comfortable"
38
- iconRole="listing"
39
- items={steps.map((item) => ({
40
- icon: ({ className }) => (
41
- <div
42
- className={`bg-primary/15 flex h-10 w-10 items-center justify-center rounded-lg ${className ?? ''}`}
43
- >
44
- <span className="text-primary text-sm font-semibold">
45
- {item.step}
46
- </span>
47
- </div>
48
- ),
49
- title: item.title,
50
- description: item.description,
51
- tone: 'muted',
52
- }))}
53
- />
54
- );
31
+ return (
32
+ <IconGridSection
33
+ tone="default"
34
+ columns={4}
35
+ title="How incremental adoption works"
36
+ padding="comfortable"
37
+ iconRole="listing"
38
+ items={steps.map((item) => ({
39
+ icon: ({ className }) => (
40
+ <div
41
+ className={`flex h-10 w-10 items-center justify-center rounded-lg bg-primary/15 ${className ?? ''}`}
42
+ >
43
+ <span className="font-semibold text-primary text-sm">
44
+ {item.step}
45
+ </span>
46
+ </div>
47
+ ),
48
+ title: item.title,
49
+ description: item.description,
50
+ tone: 'muted',
51
+ }))}
52
+ />
53
+ );
55
54
  }
@@ -1,56 +1,54 @@
1
1
  'use client';
2
2
 
3
+ import { ArrowRight, Sparkles } from 'lucide-react';
3
4
  import Link from 'next/link';
4
- import { ArrowRight, Rocket } from 'lucide-react';
5
- import { Button } from '@contractspec/lib.design-system';
6
5
 
7
6
  interface StudioSignupSectionProps {
8
- variant?: 'default' | 'compact';
7
+ variant?: 'default' | 'compact';
9
8
  }
10
9
 
11
10
  const studioUrl = 'https://www.contractspec.studio';
12
11
  const studioDocsUrl = 'https://www.contractspec.studio/docs';
13
12
 
14
13
  export function StudioSignupSection({
15
- variant = 'default',
14
+ variant = 'default',
16
15
  }: StudioSignupSectionProps) {
17
- const isCompact = variant === 'compact';
16
+ const isCompact = variant === 'compact';
18
17
 
19
- return (
20
- <div
21
- id="studio-signup"
22
- className={isCompact ? 'space-y-4' : 'card-subtle space-y-6 p-8'}
23
- >
24
- <div className="space-y-4">
25
- <div className="inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1">
26
- <Rocket size={14} className="text-violet-300" />
27
- <span className="text-sm font-medium text-violet-300">
28
- ContractSpec Studio
29
- </span>
30
- </div>
31
- <h2 className={isCompact ? 'text-xl font-bold' : 'text-2xl font-bold'}>
32
- Try ContractSpec Studio
33
- </h2>
34
- <p className="text-muted-foreground text-sm">
35
- The AI-powered product decision engine that turns product signals into
36
- spec-first deliverables.
37
- </p>
38
- <p className="text-muted-foreground text-xs">
39
- Evidence -&gt; Correlation -&gt; Decision -&gt; Change -&gt; Export
40
- -&gt; Check -&gt; Notify -&gt; Autopilot
41
- </p>
42
- </div>
18
+ return (
19
+ <div
20
+ id="studio-signup"
21
+ className={`${isCompact ? 'space-y-5 rounded-[28px] border border-border bg-card p-6' : 'editorial-panel space-y-6'}`}
22
+ >
23
+ <div className="space-y-4">
24
+ <div className="badge">
25
+ <Sparkles size={14} />
26
+ Studio on top
27
+ </div>
28
+ <h2
29
+ className={
30
+ isCompact
31
+ ? 'font-serif text-3xl tracking-[-0.04em]'
32
+ : 'font-serif text-4xl tracking-[-0.04em]'
33
+ }
34
+ >
35
+ See the operating layer built on top of the open system.
36
+ </h2>
37
+ <p className="text-muted-foreground text-sm leading-7">
38
+ Studio packages the workflow for evidence, drafting, review, export,
39
+ and follow-up. It should feel like the best product built on top of
40
+ ContractSpec, not a different story.
41
+ </p>
42
+ </div>
43
43
 
44
- <div className="flex flex-col gap-3 sm:flex-row">
45
- <Button asChild className="w-full sm:w-auto">
46
- <Link href={studioUrl}>
47
- Get Started Free <ArrowRight className="ml-2 h-4 w-4" />
48
- </Link>
49
- </Button>
50
- <Button asChild variant="outline" className="w-full sm:w-auto">
51
- <Link href={studioDocsUrl}>Read Studio Docs</Link>
52
- </Button>
53
- </div>
54
- </div>
55
- );
44
+ <div className="grid gap-3 sm:grid-cols-2">
45
+ <Link href={studioUrl} className="btn-primary">
46
+ Explore Studio <ArrowRight className="ml-2 h-4 w-4" />
47
+ </Link>
48
+ <Link href={studioDocsUrl} className="btn-ghost">
49
+ Read Studio docs
50
+ </Link>
51
+ </div>
52
+ </div>
53
+ );
56
54
  }