@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,174 +1,184 @@
1
1
  'use client';
2
2
 
3
- import { useActionState } from 'react';
4
3
  import {
5
- Calendar,
6
- MessageSquare,
7
- CheckCircle,
8
- AlertCircle,
4
+ ActionForm,
5
+ Button,
6
+ Input,
7
+ Textarea,
8
+ } from '@contractspec/lib.design-system';
9
+ import {
10
+ AlertCircle,
11
+ Calendar,
12
+ CheckCircle,
13
+ MessageSquare,
9
14
  } from 'lucide-react';
15
+ import { useActionState } from 'react';
10
16
  import { submitContactForm } from '../../libs/email/contact';
11
- import type { SubmitContactFormResult } from '../../libs/email/types'; // Assuming these are exported from root or similar, need to check where submitContactForm lives.
12
- // Wait check imports again. submitContactForm is imported from @contractspec/bundle.marketing.
13
- // In bundle.marketing, it is likely in 'src/actions' or 'src/utils'.
14
- // I need to check where submitContactForm is defined in bundle.marketing.
17
+ import type { SubmitContactFormResult } from '../../libs/email/types';
15
18
  import { StudioSignupSection } from './studio-signup-section';
16
- import {
17
- ActionForm,
18
- Button,
19
- Input,
20
- Textarea,
21
- } from '@contractspec/lib.design-system';
22
- import { VStack, HStack } from '@contractspec/lib.ui-kit-web/ui/stack';
23
- import {
24
- H2,
25
- H1,
26
- Small,
27
- Muted,
28
- } from '@contractspec/lib.ui-kit-web/ui/typography';
29
19
 
30
20
  export function ContactClient() {
31
- // Contact form handler
32
- const handleContactSubmit = async (
33
- _prevState: SubmitContactFormResult | null,
34
- formData: FormData
35
- ): Promise<SubmitContactFormResult> => {
36
- const result = await submitContactForm(formData);
37
-
38
- if (result.success) {
39
- return {
40
- success: true,
41
- text: "Message sent successfully! We'll get back to you soon.",
42
- };
43
- } else {
44
- return {
45
- success: false,
46
- text: result.text || 'Failed to send message. Please try again.',
47
- };
48
- }
49
- };
21
+ const handleContactSubmit = async (
22
+ _prevState: SubmitContactFormResult | null,
23
+ formData: FormData
24
+ ): Promise<SubmitContactFormResult> => {
25
+ const result = await submitContactForm(formData);
50
26
 
51
- const [contactResult, contactAction, contactPending] = useActionState<
52
- SubmitContactFormResult | null,
53
- FormData
54
- >(handleContactSubmit, null);
27
+ if (result.success) {
28
+ return {
29
+ success: true,
30
+ text: "Message sent successfully. We'll get back to you soon.",
31
+ };
32
+ }
55
33
 
56
- return (
57
- <section className="section-padding hero-gradient w-full">
58
- <VStack className="mx-auto max-w-4xl gap-16">
59
- <VStack className="gap-4 text-center">
60
- <H1 className="text-5xl font-bold">Get in touch</H1>
61
- <Muted className="text-lg">
62
- Choose how you'd like to connect with us
63
- </Muted>
64
- </VStack>
34
+ return {
35
+ success: false,
36
+ text: result.text || 'Failed to send message. Please try again.',
37
+ };
38
+ };
65
39
 
66
- {/* Studio Signup Section */}
67
- <StudioSignupSection />
40
+ const [contactResult, contactAction, contactPending] = useActionState<
41
+ SubmitContactFormResult | null,
42
+ FormData
43
+ >(handleContactSubmit, null);
68
44
 
69
- {/* Book a Call Section */}
70
- <VStack className="card-subtle gap-6 p-8" id="call">
71
- <HStack className="items-center gap-3">
72
- <Calendar className="text-blue-400" size={24} />
73
- <VStack className="items-start gap-1">
74
- <H2 className="text-2xl font-bold">Book a 20-min call</H2>
75
- <Muted className="text-sm">
76
- Schedule a walkthrough with our team to see ContractSpec in
77
- action
78
- </Muted>
79
- </VStack>
80
- </HStack>
45
+ return (
46
+ <main>
47
+ <section className="section-padding hero-gradient border-border/70 border-b">
48
+ <div className="editorial-shell grid gap-8 lg:grid-cols-[1.05fr_0.95fr]">
49
+ <div className="space-y-5">
50
+ <p className="editorial-kicker">Contact</p>
51
+ <h1 className="editorial-title max-w-4xl">
52
+ Talk to the team behind the open system and the Studio product.
53
+ </h1>
54
+ <p className="editorial-subtitle">
55
+ Reach out when you are evaluating the OSS foundation, deciding
56
+ whether Studio fits your workflow, or want a direct conversation
57
+ about adoption.
58
+ </p>
59
+ </div>
60
+ <StudioSignupSection variant="compact" />
61
+ </div>
62
+ </section>
81
63
 
82
- <div className="border-border overflow-hidden rounded-lg border">
83
- <object
84
- data="https://meet.reclaimai.com/e/f863cb29-caac-44b6-972b-1407dd9545a3"
85
- width="100%"
86
- height="700px"
87
- style={{ outline: 'none' }}
88
- aria-label="Calendar booking widget"
89
- />
90
- </div>
91
- </VStack>
64
+ <section className="editorial-section">
65
+ <div className="editorial-shell grid gap-8 lg:grid-cols-2">
66
+ <div className="editorial-panel space-y-6" id="call">
67
+ <div className="space-y-3">
68
+ <div className="badge">
69
+ <Calendar size={14} />
70
+ Book a conversation
71
+ </div>
72
+ <h2 className="font-serif text-4xl tracking-[-0.04em]">
73
+ Walk through your current system with us.
74
+ </h2>
75
+ <p className="text-muted-foreground text-sm leading-7">
76
+ Use the call when you want a direct conversation about fit,
77
+ adoption order, or the right entry point between OSS and Studio.
78
+ </p>
79
+ </div>
80
+ <div className="overflow-hidden rounded-[28px] border border-border">
81
+ <object
82
+ data="https://meet.reclaimai.com/e/f863cb29-caac-44b6-972b-1407dd9545a3"
83
+ width="100%"
84
+ height="700px"
85
+ style={{ outline: 'none' }}
86
+ aria-label="Calendar booking widget"
87
+ />
88
+ </div>
89
+ </div>
92
90
 
93
- {/* Send Message Section */}
94
- <VStack className="card-subtle gap-6 p-8" id="message">
95
- <HStack className="items-center gap-3">
96
- <MessageSquare className="text-emerald-400" size={24} />
97
- <VStack className="items-start gap-1">
98
- <H2 className="text-2xl font-bold">Send us a message</H2>
99
- <Muted className="text-sm">
100
- Have questions or feedback? We'd love to hear from you
101
- </Muted>
102
- </VStack>
103
- </HStack>
91
+ <div className="editorial-panel space-y-6" id="message">
92
+ <div className="space-y-3">
93
+ <div className="badge">
94
+ <MessageSquare size={14} />
95
+ Send a message
96
+ </div>
97
+ <h2 className="font-serif text-4xl tracking-[-0.04em]">
98
+ Share context, questions, or a project we should understand.
99
+ </h2>
100
+ </div>
104
101
 
105
- <ActionForm action={contactAction}>
106
- <VStack className="gap-4">
107
- <VStack className="gap-2">
108
- <Small className="text-sm font-medium">Name</Small>
109
- <Input
110
- id="contact-name"
111
- name="name"
112
- type="text"
113
- placeholder="Your name"
114
- disabled={contactPending || contactResult?.success}
115
- required
116
- />
117
- </VStack>
102
+ <ActionForm action={contactAction}>
103
+ <div className="space-y-4">
104
+ <div className="space-y-2">
105
+ <label htmlFor="contact-name" className="font-medium text-sm">
106
+ Name
107
+ </label>
108
+ <Input
109
+ id="contact-name"
110
+ name="name"
111
+ type="text"
112
+ placeholder="Your name"
113
+ disabled={contactPending || contactResult?.success}
114
+ required
115
+ />
116
+ </div>
118
117
 
119
- <VStack className="gap-2">
120
- <Small className="text-sm font-medium">Email</Small>
121
- <Input
122
- id="contact-email"
123
- name="email"
124
- type="email"
125
- keyboard={{ kind: 'email' }}
126
- placeholder="your@email.com"
127
- disabled={contactPending || contactResult?.success}
128
- required
129
- />
130
- </VStack>
118
+ <div className="space-y-2">
119
+ <label
120
+ htmlFor="contact-email"
121
+ className="font-medium text-sm"
122
+ >
123
+ Email
124
+ </label>
125
+ <Input
126
+ id="contact-email"
127
+ name="email"
128
+ type="email"
129
+ keyboard={{ kind: 'email' }}
130
+ placeholder="you@company.com"
131
+ disabled={contactPending || contactResult?.success}
132
+ required
133
+ />
134
+ </div>
131
135
 
132
- <VStack className="gap-2">
133
- <Small className="text-sm font-medium">Message</Small>
134
- <Textarea
135
- id="contact-message"
136
- name="message"
137
- placeholder="Tell us what's on your mind..."
138
- disabled={contactPending || contactResult?.success}
139
- rows={6}
140
- required
141
- />
142
- </VStack>
136
+ <div className="space-y-2">
137
+ <label
138
+ htmlFor="contact-message"
139
+ className="font-medium text-sm"
140
+ >
141
+ Message
142
+ </label>
143
+ <Textarea
144
+ id="contact-message"
145
+ name="message"
146
+ placeholder="What are you trying to stabilize, and where is the current system breaking down?"
147
+ disabled={contactPending || contactResult?.success}
148
+ rows={7}
149
+ required
150
+ />
151
+ </div>
143
152
 
144
- {contactResult && !contactPending && (
145
- <HStack
146
- className={`items-center gap-2 rounded-lg p-3 text-sm ${
147
- contactResult.success
148
- ? 'border border-green-500/20 bg-green-500/10 text-green-400'
149
- : 'border border-red-500/20 bg-red-500/10 text-red-400'
150
- }`}
151
- >
152
- {contactResult.success ? (
153
- <CheckCircle size={16} />
154
- ) : (
155
- <AlertCircle size={16} />
156
- )}
157
- <Small>{contactResult.text}</Small>
158
- </HStack>
159
- )}
153
+ {contactResult && !contactPending ? (
154
+ <div
155
+ className={`flex items-center gap-2 rounded-2xl border px-4 py-3 text-sm ${
156
+ contactResult.success
157
+ ? 'border-green-600/20 bg-green-600/10 text-green-700'
158
+ : 'border-red-600/20 bg-red-600/10 text-red-700'
159
+ }`}
160
+ >
161
+ {contactResult.success ? (
162
+ <CheckCircle size={16} />
163
+ ) : (
164
+ <AlertCircle size={16} />
165
+ )}
166
+ <span>{contactResult.text}</span>
167
+ </div>
168
+ ) : null}
160
169
 
161
- <Button
162
- type="submit"
163
- disabled={contactPending || contactResult?.success}
164
- className="w-full"
165
- >
166
- {contactPending ? 'Sending...' : 'Send message'}
167
- </Button>
168
- </VStack>
169
- </ActionForm>
170
- </VStack>
171
- </VStack>
172
- </section>
173
- );
170
+ <Button
171
+ type="submit"
172
+ disabled={contactPending || contactResult?.success}
173
+ className="w-full"
174
+ >
175
+ {contactPending ? 'Sending...' : 'Send message'}
176
+ </Button>
177
+ </div>
178
+ </ActionForm>
179
+ </div>
180
+ </div>
181
+ </section>
182
+ </main>
183
+ );
174
184
  }