@contractspec/bundle.marketing 3.7.5 → 3.7.7

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 +84 -84
  2. package/AGENTS.md +29 -21
  3. package/CHANGELOG.md +27 -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 +2324 -3578
  27. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  28. package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
  29. package/dist/browser/components/templates/index.js +2361 -3615
  30. package/dist/browser/index.js +2363 -3617
  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 +2324 -3578
  67. package/dist/components/templates/TemplatesPage.js +1 -1
  68. package/dist/components/templates/TemplatesPreviewModal.js +3 -3
  69. package/dist/components/templates/index.js +2361 -3615
  70. package/dist/index.js +2363 -3617
  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 +2324 -3578
  98. package/dist/node/components/templates/TemplatesPage.js +1 -1
  99. package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
  100. package/dist/node/components/templates/index.js +2361 -3615
  101. package/dist/node/index.js +2363 -3617
  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 +29 -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 +727 -685
  144. package/src/components/templates/TemplatesPage.tsx +110 -110
  145. package/src/components/templates/TemplatesPreviewModal.tsx +197 -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,10 +1,10 @@
1
- export { LandingPage } from './LandingPage';
2
- export { ProductClientPage } from './ProductClientPage';
3
- export { PricingClient } from './PricingClient';
4
- export { ContactClient } from './ContactClient';
5
1
  export { ChangelogPage } from './ChangelogPage';
6
2
  export { CofounderPage } from './CofounderPage';
3
+ export { ContactClient } from './ContactClient';
7
4
  export { ContributePage } from './ContributePage';
8
5
  export { DesignPartnerPage } from './DesignPartnerPage';
9
- export { StudioSignupSection } from './studio-signup-section';
6
+ export { LandingPage } from './LandingPage';
7
+ export { PricingClient } from './PricingClient';
8
+ export { ProductClientPage } from './ProductClientPage';
10
9
  export { PricingThinkingModal } from './pricing-thinking-modal';
10
+ export { StudioSignupSection } from './studio-signup-section';
@@ -1,224 +1,224 @@
1
1
  'use client';
2
2
 
3
- import { CheckCircle } from 'lucide-react';
3
+ import { Button } from '@contractspec/lib.design-system';
4
4
  import {
5
- Dialog,
6
- DialogContent,
7
- DialogDescription,
8
- DialogHeader,
9
- DialogTitle,
5
+ Dialog,
6
+ DialogContent,
7
+ DialogDescription,
8
+ DialogHeader,
9
+ DialogTitle,
10
10
  } from '@contractspec/lib.ui-kit-web/ui/dialog';
11
- import { Button } from '@contractspec/lib.design-system';
11
+ import { CheckCircle } from 'lucide-react';
12
12
  import { PRICING_EXAMPLES } from '../../libs/pricing-examples';
13
13
 
14
14
  interface PricingTier {
15
- tag: string;
16
- title: string;
17
- priceLine: string;
18
- bullets: string[];
19
- note: string;
15
+ tag: string;
16
+ title: string;
17
+ priceLine: string;
18
+ bullets: string[];
19
+ note: string;
20
20
  }
21
21
 
22
22
  interface UsageMetric {
23
- name: string;
24
- freeTier: string;
25
- beyond: string;
23
+ name: string;
24
+ freeTier: string;
25
+ beyond: string;
26
26
  }
27
27
 
28
28
  const pricingTiers: PricingTier[] = [
29
- {
30
- tag: 'Planned',
31
- title: 'Free',
32
- priceLine: 'For hobbyists and pre-PMF teams',
33
- bullets: [
34
- '1 active project',
35
- 'Small spec size',
36
- `Example: ~${PRICING_EXAMPLES.free.regenerationsPerMonth} free regenerations per month`,
37
- `Example: ~${PRICING_EXAMPLES.free.aiActionsPerMonth} free AI agent actions per month`,
38
- 'Unlimited collaborators',
39
- ],
40
- note: 'Good enough to build and launch a real product before paying.',
41
- },
42
- {
43
- tag: 'Planned',
44
- title: 'Builder',
45
- priceLine: 'Usage-based, for solo builders and small teams',
46
- bullets: [
47
- 'More projects',
48
- `More monthly regenerations included (e.g. ${PRICING_EXAMPLES.builder.regenerationsPerMonthHint})`,
49
- `More AI agent actions included (e.g. ${PRICING_EXAMPLES.builder.aiActionsPerMonthHint})`,
50
- 'Pay-as-you-go for extra regenerations and AI',
51
- 'Basic environments (dev / prod)',
52
- ],
53
- note: 'Pay for how fast and how often you evolve your system, not for seats.',
54
- },
55
- {
56
- tag: 'Planned',
57
- title: 'Team & Platform',
58
- priceLine: 'For teams standardizing on ContractSpec',
59
- bullets: [
60
- 'Multiple projects and environments',
61
- 'Higher regeneration and AI action limits',
62
- 'Cheaper overages as you scale',
63
- 'Advanced RBAC and governance',
64
- 'SSO, audit trails, and longer retention',
65
- ],
66
- note: 'For platform teams using ContractSpec as infra for multiple apps.',
67
- },
29
+ {
30
+ tag: 'Planned',
31
+ title: 'Free',
32
+ priceLine: 'For hobbyists and pre-PMF teams',
33
+ bullets: [
34
+ '1 active project',
35
+ 'Small spec size',
36
+ `Example: ~${PRICING_EXAMPLES.free.regenerationsPerMonth} free regenerations per month`,
37
+ `Example: ~${PRICING_EXAMPLES.free.aiActionsPerMonth} free AI agent actions per month`,
38
+ 'Unlimited collaborators',
39
+ ],
40
+ note: 'Good enough to build and launch a real product before paying.',
41
+ },
42
+ {
43
+ tag: 'Planned',
44
+ title: 'Builder',
45
+ priceLine: 'Usage-based, for solo builders and small teams',
46
+ bullets: [
47
+ 'More projects',
48
+ `More monthly regenerations included (e.g. ${PRICING_EXAMPLES.builder.regenerationsPerMonthHint})`,
49
+ `More AI agent actions included (e.g. ${PRICING_EXAMPLES.builder.aiActionsPerMonthHint})`,
50
+ 'Pay-as-you-go for extra regenerations and AI',
51
+ 'Basic environments (dev / prod)',
52
+ ],
53
+ note: 'Pay for how fast and how often you evolve your system, not for seats.',
54
+ },
55
+ {
56
+ tag: 'Planned',
57
+ title: 'Team & Platform',
58
+ priceLine: 'For teams standardizing on ContractSpec',
59
+ bullets: [
60
+ 'Multiple projects and environments',
61
+ 'Higher regeneration and AI action limits',
62
+ 'Cheaper overages as you scale',
63
+ 'Advanced RBAC and governance',
64
+ 'SSO, audit trails, and longer retention',
65
+ ],
66
+ note: 'For platform teams using ContractSpec as infra for multiple apps.',
67
+ },
68
68
  ];
69
69
 
70
70
  const usageMetrics: UsageMetric[] = [
71
- {
72
- name: 'Regenerations',
73
- freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.regenerationsPerMonth} regenerations / month`,
74
- beyond: 'Beyond: pay per additional regeneration, with volume discounts.',
75
- },
76
- {
77
- name: 'AI agent actions',
78
- freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.aiActionsPerMonth} AI agent actions / month`,
79
- beyond: 'Beyond: pay-as-you-go for extra AI usage.',
80
- },
81
- {
82
- name: 'Projects',
83
- freeTier: `Free tier: ${PRICING_EXAMPLES.free.projects} project`,
84
- beyond:
85
- 'Builder / Team: more projects included; extra projects available as you scale.',
86
- },
71
+ {
72
+ name: 'Regenerations',
73
+ freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.regenerationsPerMonth} regenerations / month`,
74
+ beyond: 'Beyond: pay per additional regeneration, with volume discounts.',
75
+ },
76
+ {
77
+ name: 'AI agent actions',
78
+ freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.aiActionsPerMonth} AI agent actions / month`,
79
+ beyond: 'Beyond: pay-as-you-go for extra AI usage.',
80
+ },
81
+ {
82
+ name: 'Projects',
83
+ freeTier: `Free tier: ${PRICING_EXAMPLES.free.projects} project`,
84
+ beyond:
85
+ 'Builder / Team: more projects included; extra projects available as you scale.',
86
+ },
87
87
  ];
88
88
 
89
89
  interface PricingThinkingModalProps {
90
- open: boolean;
91
- onOpenChange: (open: boolean) => void;
92
- onApplyClick?: () => void;
90
+ open: boolean;
91
+ onOpenChange: (open: boolean) => void;
92
+ onApplyClick?: () => void;
93
93
  }
94
94
 
95
95
  export function PricingThinkingModal({
96
- open,
97
- onOpenChange,
98
- onApplyClick,
96
+ open,
97
+ onOpenChange,
98
+ onApplyClick,
99
99
  }: PricingThinkingModalProps) {
100
- return (
101
- <Dialog open={open} onOpenChange={onOpenChange}>
102
- <DialogContent className="max-h-[90vh] w-full overflow-y-auto md:max-w-5xl">
103
- <DialogHeader>
104
- <DialogTitle>Tentative pricing (work in progress)</DialogTitle>
105
- <DialogDescription>
106
- ContractSpec Studio is live. This is a draft of how paid plans are
107
- expected to evolve as usage grows.
108
- </DialogDescription>
109
- </DialogHeader>
100
+ return (
101
+ <Dialog open={open} onOpenChange={onOpenChange}>
102
+ <DialogContent className="max-h-[90vh] w-full overflow-y-auto md:max-w-5xl">
103
+ <DialogHeader>
104
+ <DialogTitle>Tentative pricing (work in progress)</DialogTitle>
105
+ <DialogDescription>
106
+ ContractSpec Studio is live. This is a draft of how paid plans are
107
+ expected to evolve as usage grows.
108
+ </DialogDescription>
109
+ </DialogHeader>
110
110
 
111
- <div className="space-y-8">
112
- {/* High-level tiers */}
113
- <div className="space-y-4">
114
- <div className="flex items-center gap-2">
115
- <span className="text-muted-foreground text-xs font-medium">
116
- Draft
117
- </span>
118
- <span className="text-muted-foreground text-xs">•</span>
119
- <span className="text-muted-foreground text-xs">
120
- Subject to change
121
- </span>
122
- </div>
123
- <div className="grid gap-4 md:grid-cols-3">
124
- {pricingTiers.map((tier) => (
125
- <div
126
- key={tier.title}
127
- className="card-subtle relative space-y-4 p-6"
128
- >
129
- <div className="bg-muted border-border absolute -top-2 left-1/2 -translate-x-1/2 rounded-full border px-2 py-0.5 text-xs font-medium">
130
- {tier.tag}
131
- </div>
132
- <div className="space-y-2 pt-2">
133
- <h3 className="text-xl font-bold">{tier.title}</h3>
134
- <p className="text-muted-foreground text-sm">
135
- {tier.priceLine}
136
- </p>
137
- </div>
138
- <ul className="space-y-2">
139
- {tier.bullets.map((bullet, i) => (
140
- <li
141
- key={i}
142
- className="text-muted-foreground flex gap-2 text-sm"
143
- >
144
- <CheckCircle
145
- size={14}
146
- className="mt-0.5 shrink-0 text-violet-400"
147
- />
148
- {bullet}
149
- </li>
150
- ))}
151
- </ul>
152
- <p className="text-muted-foreground text-xs italic">
153
- {tier.note}
154
- </p>
155
- </div>
156
- ))}
157
- </div>
158
- </div>
111
+ <div className="space-y-8">
112
+ {/* High-level tiers */}
113
+ <div className="space-y-4">
114
+ <div className="flex items-center gap-2">
115
+ <span className="font-medium text-muted-foreground text-xs">
116
+ Draft
117
+ </span>
118
+ <span className="text-muted-foreground text-xs">•</span>
119
+ <span className="text-muted-foreground text-xs">
120
+ Subject to change
121
+ </span>
122
+ </div>
123
+ <div className="grid gap-4 md:grid-cols-3">
124
+ {pricingTiers.map((tier) => (
125
+ <div
126
+ key={tier.title}
127
+ className="card-subtle relative space-y-4 p-6"
128
+ >
129
+ <div className="absolute -top-2 left-1/2 -translate-x-1/2 rounded-full border border-border bg-muted px-2 py-0.5 font-medium text-xs">
130
+ {tier.tag}
131
+ </div>
132
+ <div className="space-y-2 pt-2">
133
+ <h3 className="font-bold text-xl">{tier.title}</h3>
134
+ <p className="text-muted-foreground text-sm">
135
+ {tier.priceLine}
136
+ </p>
137
+ </div>
138
+ <ul className="space-y-2">
139
+ {tier.bullets.map((bullet, i) => (
140
+ <li
141
+ key={i}
142
+ className="flex gap-2 text-muted-foreground text-sm"
143
+ >
144
+ <CheckCircle
145
+ size={14}
146
+ className="mt-0.5 shrink-0 text-violet-400"
147
+ />
148
+ {bullet}
149
+ </li>
150
+ ))}
151
+ </ul>
152
+ <p className="text-muted-foreground text-xs italic">
153
+ {tier.note}
154
+ </p>
155
+ </div>
156
+ ))}
157
+ </div>
158
+ </div>
159
159
 
160
- {/* Usage-based detail */}
161
- <div className="border-border space-y-4 border-t pt-6">
162
- <div>
163
- <h3 className="text-lg font-bold">
164
- Usage-based, with a generous free tier
165
- </h3>
166
- <p className="text-muted-foreground mt-2 text-sm">
167
- Inspired by products like PostHog, we plan to keep a generous
168
- free tier on all plans, then charge based on actual usage:
169
- regenerations, AI agent actions, and the number of projects you
170
- run on ContractSpec.
171
- </p>
172
- <p className="text-muted-foreground mt-3 text-xs italic">
173
- Free tier limits are intentionally small but useful: enough to
174
- try the agent and regenerate a real project, not enough to run a
175
- full team's workload for free.
176
- </p>
177
- </div>
178
- <div className="grid gap-4 md:grid-cols-3">
179
- {usageMetrics.map((metric) => (
180
- <div key={metric.name} className="card-subtle space-y-2 p-4">
181
- <h4 className="text-sm font-semibold">{metric.name}</h4>
182
- <p className="text-muted-foreground text-xs">
183
- {metric.freeTier}
184
- </p>
185
- <p className="text-muted-foreground text-xs">
186
- {metric.beyond}
187
- </p>
188
- </div>
189
- ))}
190
- </div>
191
- </div>
160
+ {/* Usage-based detail */}
161
+ <div className="space-y-4 border-border border-t pt-6">
162
+ <div>
163
+ <h3 className="font-bold text-lg">
164
+ Usage-based, with a generous free tier
165
+ </h3>
166
+ <p className="mt-2 text-muted-foreground text-sm">
167
+ Inspired by products like PostHog, we plan to keep a generous
168
+ free tier on all plans, then charge based on actual usage:
169
+ regenerations, AI agent actions, and the number of projects you
170
+ run on ContractSpec.
171
+ </p>
172
+ <p className="mt-3 text-muted-foreground text-xs italic">
173
+ Free tier limits are intentionally small but useful: enough to
174
+ try the agent and regenerate a real project, not enough to run a
175
+ full team's workload for free.
176
+ </p>
177
+ </div>
178
+ <div className="grid gap-4 md:grid-cols-3">
179
+ {usageMetrics.map((metric) => (
180
+ <div key={metric.name} className="card-subtle space-y-2 p-4">
181
+ <h4 className="font-semibold text-sm">{metric.name}</h4>
182
+ <p className="text-muted-foreground text-xs">
183
+ {metric.freeTier}
184
+ </p>
185
+ <p className="text-muted-foreground text-xs">
186
+ {metric.beyond}
187
+ </p>
188
+ </div>
189
+ ))}
190
+ </div>
191
+ </div>
192
192
 
193
- {/* Footer / Disclaimer */}
194
- <div className="border-border space-y-4 border-t pt-6">
195
- <p className="text-muted-foreground text-xs">
196
- These numbers are examples only. Final pricing and limits will
197
- evolve as we learn from design partners.
198
- </p>
199
- <p className="text-muted-foreground text-xs">
200
- This is a tentative pricing model. We're pre-PMF and pricing is
201
- still in draft, subject to change based on what we learn.
202
- </p>
203
- <p className="text-muted-foreground text-xs">
204
- Design partners get priority onboarding and partner incentives as
205
- paid plans launch.
206
- </p>
207
- {onApplyClick && (
208
- <Button
209
- onClick={() => {
210
- onOpenChange(false);
211
- onApplyClick();
212
- }}
213
- className="w-full"
214
- variant="outline"
215
- >
216
- Try Studio
217
- </Button>
218
- )}
219
- </div>
220
- </div>
221
- </DialogContent>
222
- </Dialog>
223
- );
193
+ {/* Footer / Disclaimer */}
194
+ <div className="space-y-4 border-border border-t pt-6">
195
+ <p className="text-muted-foreground text-xs">
196
+ These numbers are examples only. Final pricing and limits will
197
+ evolve as we learn from design partners.
198
+ </p>
199
+ <p className="text-muted-foreground text-xs">
200
+ This is a tentative pricing model. We're pre-PMF and pricing is
201
+ still in draft, subject to change based on what we learn.
202
+ </p>
203
+ <p className="text-muted-foreground text-xs">
204
+ Design partners get priority onboarding and partner incentives as
205
+ paid plans launch.
206
+ </p>
207
+ {onApplyClick && (
208
+ <Button
209
+ onClick={() => {
210
+ onOpenChange(false);
211
+ onApplyClick();
212
+ }}
213
+ className="w-full"
214
+ variant="outline"
215
+ >
216
+ Try Studio
217
+ </Button>
218
+ )}
219
+ </div>
220
+ </div>
221
+ </DialogContent>
222
+ </Dialog>
223
+ );
224
224
  }
@@ -1,66 +1,65 @@
1
- import * as React from 'react';
2
1
  import {
3
- MarketingCard,
4
- MarketingCardContent,
5
- MarketingCardHeader,
6
- MarketingCardTitle,
7
- MarketingCardsSection,
2
+ MarketingCard,
3
+ MarketingCardContent,
4
+ MarketingCardHeader,
5
+ MarketingCardsSection,
6
+ MarketingCardTitle,
8
7
  } from '@contractspec/lib.design-system';
9
8
  import { VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
10
9
  import { Muted, Small } from '@contractspec/lib.ui-kit-web/ui/typography';
11
10
 
12
11
  const audiences = [
13
- {
14
- tier: 'Tier 1: Priority',
15
- title: 'AI-Native Startups & Technical Founders',
16
- body: 'Solo founders or small teams using Cursor, Copilot, Claude, or AI agents heavily. Messy AI-generated backends and frontends, inconsistent APIs, code that is hard to refactor.',
17
- need: 'Need: A way to stabilize AI-generated code without rewriting it.',
18
- },
19
- {
20
- tier: 'Tier 1: Priority',
21
- title: 'Small Teams with AI-Generated Chaos',
22
- body: '2-10 person teams that shipped fast with AI and now have tech debt. Multiple surfaces out of sync, no source of truth, afraid to touch AI-generated code.',
23
- need: 'Need: Incremental stabilization, safe regeneration, contracts as guardrails.',
24
- },
25
- {
26
- tier: 'Tier 2: Growth',
27
- title: 'AI Dev Agencies',
28
- body: 'Agencies building many projects for clients using AI-assisted development. Repeating the same patterns, inconsistent quality across projects, handoff nightmares.',
29
- need: 'Need: Reusable templates, consistent contracts, professional handoff artifacts.',
30
- },
31
- {
32
- tier: 'Tier 2: Growth',
33
- title: 'Scaleups with Compliance Needs',
34
- body: "Growing companies that need audit trails, API governance, or regulatory compliance. AI-generated code doesn't meet compliance requirements.",
35
- need: 'Need: Governance layer, change tracking, contract enforcement.',
36
- },
12
+ {
13
+ tier: 'Tier 1: Priority',
14
+ title: 'AI-Native Startups & Technical Founders',
15
+ body: 'Solo founders or small teams using Cursor, Copilot, Claude, or AI agents heavily. Messy AI-generated backends and frontends, inconsistent APIs, code that is hard to refactor.',
16
+ need: 'Need: A way to stabilize AI-generated code without rewriting it.',
17
+ },
18
+ {
19
+ tier: 'Tier 1: Priority',
20
+ title: 'Small Teams with AI-Generated Chaos',
21
+ body: '2-10 person teams that shipped fast with AI and now have tech debt. Multiple surfaces out of sync, no source of truth, afraid to touch AI-generated code.',
22
+ need: 'Need: Incremental stabilization, safe regeneration, contracts as guardrails.',
23
+ },
24
+ {
25
+ tier: 'Tier 2: Growth',
26
+ title: 'AI Dev Agencies',
27
+ body: 'Agencies building many projects for clients using AI-assisted development. Repeating the same patterns, inconsistent quality across projects, handoff nightmares.',
28
+ need: 'Need: Reusable templates, consistent contracts, professional handoff artifacts.',
29
+ },
30
+ {
31
+ tier: 'Tier 2: Growth',
32
+ title: 'Scaleups with Compliance Needs',
33
+ body: "Growing companies that need audit trails, API governance, or regulatory compliance. AI-generated code doesn't meet compliance requirements.",
34
+ need: 'Need: Governance layer, change tracking, contract enforcement.',
35
+ },
37
36
  ];
38
37
 
39
38
  export function AudienceSection() {
40
- return (
41
- <MarketingCardsSection
42
- tone="default"
43
- columns={2}
44
- eyebrow="Who It's For"
45
- title="Built for teams drowning in AI-generated code"
46
- maxWidth="xl"
47
- >
48
- {audiences.map((item) => (
49
- <MarketingCard key={item.title} tone="muted">
50
- <MarketingCardHeader className="space-y-2">
51
- <Small className="font-semibold text-blue-400">{item.tier}</Small>
52
- <MarketingCardTitle className="text-xl">
53
- {item.title}
54
- </MarketingCardTitle>
55
- </MarketingCardHeader>
56
- <MarketingCardContent>
57
- <VStack gap="sm">
58
- <Muted className="text-sm leading-relaxed">{item.body}</Muted>
59
- <Small className="font-medium text-violet-400">{item.need}</Small>
60
- </VStack>
61
- </MarketingCardContent>
62
- </MarketingCard>
63
- ))}
64
- </MarketingCardsSection>
65
- );
39
+ return (
40
+ <MarketingCardsSection
41
+ tone="default"
42
+ columns={2}
43
+ eyebrow="Who It's For"
44
+ title="Built for teams drowning in AI-generated code"
45
+ maxWidth="xl"
46
+ >
47
+ {audiences.map((item) => (
48
+ <MarketingCard key={item.title} tone="muted">
49
+ <MarketingCardHeader className="space-y-2">
50
+ <Small className="font-semibold text-blue-400">{item.tier}</Small>
51
+ <MarketingCardTitle className="text-xl">
52
+ {item.title}
53
+ </MarketingCardTitle>
54
+ </MarketingCardHeader>
55
+ <MarketingCardContent>
56
+ <VStack gap="sm">
57
+ <Muted className="text-sm leading-relaxed">{item.body}</Muted>
58
+ <Small className="font-medium text-violet-400">{item.need}</Small>
59
+ </VStack>
60
+ </MarketingCardContent>
61
+ </MarketingCard>
62
+ ))}
63
+ </MarketingCardsSection>
64
+ );
66
65
  }
@@ -1,44 +1,44 @@
1
- import * as React from 'react';
2
1
  import { ButtonLink, MarketingSection } from '@contractspec/lib.design-system';
3
2
  import { VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
4
3
  import { H2, Lead, Small } from '@contractspec/lib.ui-kit-web/ui/typography';
5
4
  import { ChevronRight } from 'lucide-react';
6
5
 
7
6
  export function CorePositioningSection() {
8
- return (
9
- <MarketingSection
10
- tone="gradient"
11
- padding="comfortable"
12
- align="center"
13
- maxWidth="lg"
14
- >
15
- <VStack gap="md" align="center">
16
- <H2 className="text-center text-3xl font-bold md:text-4xl">
17
- You keep your app.
18
- <br />
19
- We stabilize it, one module at a time.
20
- </H2>
21
- <Lead className="text-center">
22
- You own the code. It&apos;s standard tech.
23
- <br />
24
- <Small className="font-semibold text-violet-400">
25
- We&apos;re the compiler, not the prison.
26
- </Small>
27
- </Lead>
28
- <VStack
29
- as="div"
30
- gap="sm"
31
- align="center"
32
- className="pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center"
33
- >
34
- <ButtonLink href="https://www.contractspec.studio">
35
- Try Studio <ChevronRight size={16} />
36
- </ButtonLink>
37
- <ButtonLink variant="ghost" href="/contact">
38
- Book a call
39
- </ButtonLink>
40
- </VStack>
41
- </VStack>
42
- </MarketingSection>
43
- );
7
+ return (
8
+ <MarketingSection
9
+ tone="gradient"
10
+ padding="comfortable"
11
+ align="center"
12
+ maxWidth="lg"
13
+ >
14
+ <VStack gap="md" align="center">
15
+ <H2 className="text-center font-bold text-3xl md:text-4xl">
16
+ You keep your app.
17
+ <br />
18
+ We stabilize it, one module at a time.
19
+ </H2>
20
+ <Lead className="text-center">
21
+ You own the code. It&apos;s standard tech.
22
+ <br />
23
+ <Small className="font-semibold text-violet-400">
24
+ Start with the open foundation. Adopt the operating layer when it
25
+ helps.
26
+ </Small>
27
+ </Lead>
28
+ <VStack
29
+ as="div"
30
+ gap="sm"
31
+ align="center"
32
+ className="pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center"
33
+ >
34
+ <ButtonLink href="https://www.contractspec.studio">
35
+ Try Studio <ChevronRight size={16} />
36
+ </ButtonLink>
37
+ <ButtonLink variant="ghost" href="/contact">
38
+ Book a call
39
+ </ButtonLink>
40
+ </VStack>
41
+ </VStack>
42
+ </MarketingSection>
43
+ );
44
44
  }