@contractspec/bundle.marketing 1.12.0 → 1.13.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.log +146 -175
- package/.turbo/turbo-prebuild.log +1 -0
- package/CHANGELOG.md +29 -0
- package/dist/browser/components/marketing/ChangelogPage.js +92 -0
- package/dist/browser/components/marketing/CofounderPage.js +581 -0
- package/dist/browser/components/marketing/ContactClient.js +1379 -0
- package/dist/browser/components/marketing/ContributePage.js +487 -0
- package/dist/browser/components/marketing/DesignPartnerPage.js +272 -0
- package/dist/browser/components/marketing/LandingPage.js +629 -0
- package/dist/browser/components/marketing/PricingClient.js +1972 -0
- package/dist/browser/components/marketing/ProductClientPage.js +563 -0
- package/dist/browser/components/marketing/index.js +4818 -0
- package/dist/browser/components/marketing/pricing-thinking-modal.js +258 -0
- package/dist/browser/components/marketing/sections/AudienceSection.js +90 -0
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +72 -0
- package/dist/browser/components/marketing/sections/CtaSection.js +67 -0
- package/dist/browser/components/marketing/sections/DevelopersSection.js +50 -0
- package/dist/browser/components/marketing/sections/FearsSection.js +105 -0
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +93 -0
- package/dist/browser/components/marketing/sections/IconGridSection.js +63 -0
- package/dist/browser/components/marketing/sections/OutputsSection.js +116 -0
- package/dist/browser/components/marketing/sections/ProblemSection.js +103 -0
- package/dist/browser/components/marketing/sections/SolutionSection.js +103 -0
- package/dist/browser/components/marketing/sections/StepsSection.js +109 -0
- package/dist/browser/components/marketing/waitlist-section.js +1104 -0
- package/dist/browser/components/templates/TemplatesClientPage.js +5662 -0
- package/dist/browser/components/templates/TemplatesPage.js +177 -0
- package/dist/browser/components/templates/TemplatesPreviewModal.js +124 -0
- package/dist/browser/components/templates/index.js +5831 -0
- package/dist/browser/index.js +6485 -0
- package/dist/browser/libs/email/client.js +122 -0
- package/dist/browser/libs/email/contact.js +190 -0
- package/dist/browser/libs/email/newsletter.js +215 -0
- package/dist/browser/libs/email/types.js +2 -0
- package/dist/browser/libs/email/utils.js +16 -0
- package/dist/browser/libs/email/waitlist-application.js +295 -0
- package/dist/browser/libs/email/waitlist.js +225 -0
- package/dist/browser/libs/pricing-examples.js +26 -0
- package/dist/browser/registry/engine.js +5293 -0
- package/dist/browser/registry/factory.js +52 -0
- package/dist/browser/registry/index.js +5358 -0
- package/dist/browser/registry/registry-docs.js +343 -0
- package/dist/browser/registry/registry-landing.js +4937 -0
- package/dist/browser/registry/registry.js +5279 -0
- package/dist/browser/registry/types.js +0 -0
- package/dist/browser/registry/utils.js +5340 -0
- package/dist/components/marketing/ChangelogPage.d.ts +11 -17
- package/dist/components/marketing/ChangelogPage.d.ts.map +1 -1
- package/dist/components/marketing/ChangelogPage.js +84 -62
- package/dist/components/marketing/CofounderPage.d.ts +1 -6
- package/dist/components/marketing/CofounderPage.d.ts.map +1 -1
- package/dist/components/marketing/CofounderPage.js +544 -436
- package/dist/components/marketing/ContactClient.d.ts +1 -6
- package/dist/components/marketing/ContactClient.d.ts.map +1 -1
- package/dist/components/marketing/ContactClient.js +1371 -155
- package/dist/components/marketing/ContributePage.d.ts +3 -8
- package/dist/components/marketing/ContributePage.d.ts.map +1 -1
- package/dist/components/marketing/ContributePage.js +478 -358
- package/dist/components/marketing/DesignPartnerPage.d.ts +3 -8
- package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -1
- package/dist/components/marketing/DesignPartnerPage.js +263 -211
- package/dist/components/marketing/LandingPage.d.ts +1 -6
- package/dist/components/marketing/LandingPage.d.ts.map +1 -1
- package/dist/components/marketing/LandingPage.js +623 -37
- package/dist/components/marketing/PricingClient.d.ts +1 -6
- package/dist/components/marketing/PricingClient.d.ts.map +1 -1
- package/dist/components/marketing/PricingClient.js +1962 -516
- package/dist/components/marketing/ProductClientPage.d.ts +1 -6
- package/dist/components/marketing/ProductClientPage.d.ts.map +1 -1
- package/dist/components/marketing/ProductClientPage.js +556 -458
- package/dist/components/marketing/index.d.ts +11 -11
- package/dist/components/marketing/index.d.ts.map +1 -0
- package/dist/components/marketing/index.js +4813 -12
- package/dist/components/marketing/pricing-thinking-modal.d.ts +5 -13
- package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -1
- package/dist/components/marketing/pricing-thinking-modal.js +248 -197
- package/dist/components/marketing/sections/AudienceSection.d.ts +1 -6
- package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/AudienceSection.js +80 -63
- package/dist/components/marketing/sections/CorePositioningSection.d.ts +1 -6
- package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/CorePositioningSection.js +62 -54
- package/dist/components/marketing/sections/CtaSection.d.ts +1 -6
- package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/CtaSection.js +58 -50
- package/dist/components/marketing/sections/DevelopersSection.d.ts +1 -6
- package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/DevelopersSection.js +40 -40
- package/dist/components/marketing/sections/FearsSection.d.ts +1 -6
- package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/FearsSection.js +96 -44
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts +1 -6
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/HeroMarketingSection.js +82 -71
- package/dist/components/marketing/sections/IconGridSection.d.ts +25 -39
- package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/IconGridSection.js +55 -41
- package/dist/components/marketing/sections/OutputsSection.d.ts +1 -6
- package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/OutputsSection.js +107 -55
- package/dist/components/marketing/sections/ProblemSection.d.ts +1 -6
- package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/ProblemSection.js +94 -42
- package/dist/components/marketing/sections/SolutionSection.d.ts +1 -6
- package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/SolutionSection.js +94 -42
- package/dist/components/marketing/sections/StepsSection.d.ts +1 -6
- package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/StepsSection.js +100 -48
- package/dist/components/marketing/waitlist-section.d.ts +5 -12
- package/dist/components/marketing/waitlist-section.d.ts.map +1 -1
- package/dist/components/marketing/waitlist-section.js +1089 -568
- package/dist/components/templates/TemplatesClientPage.d.ts +1 -6
- package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -1
- package/dist/components/templates/TemplatesClientPage.js +5649 -617
- package/dist/components/templates/TemplatesPage.d.ts +1 -6
- package/dist/components/templates/TemplatesPage.d.ts.map +1 -1
- package/dist/components/templates/TemplatesPage.js +163 -116
- package/dist/components/templates/TemplatesPreviewModal.d.ts +5 -12
- package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -1
- package/dist/components/templates/TemplatesPreviewModal.js +113 -131
- package/dist/components/templates/index.d.ts +4 -4
- package/dist/components/templates/index.d.ts.map +1 -0
- package/dist/components/templates/index.js +5825 -4
- package/dist/index.d.ts +9 -29
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6480 -28
- package/dist/libs/email/client.d.ts +9 -12
- package/dist/libs/email/client.d.ts.map +1 -1
- package/dist/libs/email/client.js +109 -105
- package/dist/libs/email/client.test.d.ts +2 -0
- package/dist/libs/email/client.test.d.ts.map +1 -0
- package/dist/libs/email/contact.d.ts +2 -6
- package/dist/libs/email/contact.d.ts.map +1 -1
- package/dist/libs/email/contact.js +155 -41
- package/dist/libs/email/newsletter.d.ts +2 -6
- package/dist/libs/email/newsletter.d.ts.map +1 -1
- package/dist/libs/email/newsletter.js +169 -54
- package/dist/libs/email/types.d.ts +48 -52
- package/dist/libs/email/types.d.ts.map +1 -1
- package/dist/libs/email/types.js +3 -1
- package/dist/libs/email/utils.d.ts +2 -5
- package/dist/libs/email/utils.d.ts.map +1 -1
- package/dist/libs/email/utils.js +10 -6
- package/dist/libs/email/waitlist-application.d.ts +2 -6
- package/dist/libs/email/waitlist-application.d.ts.map +1 -1
- package/dist/libs/email/waitlist-application.js +191 -71
- package/dist/libs/email/waitlist.d.ts +2 -6
- package/dist/libs/email/waitlist.d.ts.map +1 -1
- package/dist/libs/email/waitlist.js +171 -56
- package/dist/libs/pricing-examples.d.ts +13 -16
- package/dist/libs/pricing-examples.d.ts.map +1 -1
- package/dist/libs/pricing-examples.js +20 -20
- package/dist/node/components/marketing/ChangelogPage.js +87 -0
- package/dist/node/components/marketing/CofounderPage.js +576 -0
- package/dist/node/components/marketing/ContactClient.js +1374 -0
- package/dist/node/components/marketing/ContributePage.js +482 -0
- package/dist/node/components/marketing/DesignPartnerPage.js +267 -0
- package/dist/node/components/marketing/LandingPage.js +624 -0
- package/dist/node/components/marketing/PricingClient.js +1967 -0
- package/dist/node/components/marketing/ProductClientPage.js +558 -0
- package/dist/node/components/marketing/index.js +4813 -0
- package/dist/node/components/marketing/pricing-thinking-modal.js +253 -0
- package/dist/node/components/marketing/sections/AudienceSection.js +85 -0
- package/dist/node/components/marketing/sections/CorePositioningSection.js +67 -0
- package/dist/node/components/marketing/sections/CtaSection.js +62 -0
- package/dist/node/components/marketing/sections/DevelopersSection.js +45 -0
- package/dist/node/components/marketing/sections/FearsSection.js +100 -0
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +88 -0
- package/dist/node/components/marketing/sections/IconGridSection.js +58 -0
- package/dist/node/components/marketing/sections/OutputsSection.js +111 -0
- package/dist/node/components/marketing/sections/ProblemSection.js +98 -0
- package/dist/node/components/marketing/sections/SolutionSection.js +98 -0
- package/dist/node/components/marketing/sections/StepsSection.js +104 -0
- package/dist/node/components/marketing/waitlist-section.js +1099 -0
- package/dist/node/components/templates/TemplatesClientPage.js +5657 -0
- package/dist/node/components/templates/TemplatesPage.js +172 -0
- package/dist/node/components/templates/TemplatesPreviewModal.js +119 -0
- package/dist/node/components/templates/index.js +5826 -0
- package/dist/node/index.js +6480 -0
- package/dist/node/libs/email/client.js +117 -0
- package/dist/node/libs/email/contact.js +185 -0
- package/dist/node/libs/email/newsletter.js +210 -0
- package/dist/node/libs/email/types.js +2 -0
- package/dist/node/libs/email/utils.js +11 -0
- package/dist/node/libs/email/waitlist-application.js +290 -0
- package/dist/node/libs/email/waitlist.js +220 -0
- package/dist/node/libs/pricing-examples.js +21 -0
- package/dist/node/registry/engine.js +5288 -0
- package/dist/node/registry/factory.js +47 -0
- package/dist/node/registry/index.js +5353 -0
- package/dist/node/registry/registry-docs.js +338 -0
- package/dist/node/registry/registry-landing.js +4932 -0
- package/dist/node/registry/registry.js +5274 -0
- package/dist/node/registry/types.js +0 -0
- package/dist/node/registry/utils.js +5335 -0
- package/dist/registry/engine.d.ts +4 -8
- package/dist/registry/engine.d.ts.map +1 -1
- package/dist/registry/engine.js +5287 -23
- package/dist/registry/factory.d.ts +30 -34
- package/dist/registry/factory.d.ts.map +1 -1
- package/dist/registry/factory.js +42 -56
- package/dist/registry/index.d.ts +8 -8
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +5353 -8
- package/dist/registry/registry-docs.d.ts +4 -8
- package/dist/registry/registry-docs.d.ts.map +1 -1
- package/dist/registry/registry-docs.js +242 -209
- package/dist/registry/registry-landing.d.ts +5 -9
- package/dist/registry/registry-landing.d.ts.map +1 -1
- package/dist/registry/registry-landing.js +4930 -93
- package/dist/registry/registry.d.ts +7 -11
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +5262 -49
- package/dist/registry/types.d.ts +6 -10
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js +1 -0
- package/dist/registry/utils.d.ts +10 -14
- package/dist/registry/utils.d.ts.map +1 -1
- package/dist/registry/utils.js +5330 -49
- package/package.json +355 -73
- package/tsdown.config.js +1 -2
- package/.turbo/turbo-build$colon$types.log +0 -1
- package/.turbo/turbo-lint.log +0 -3
- package/dist/components/marketing/ChangelogPage.js.map +0 -1
- package/dist/components/marketing/CofounderPage.js.map +0 -1
- package/dist/components/marketing/ContactClient.js.map +0 -1
- package/dist/components/marketing/ContributePage.js.map +0 -1
- package/dist/components/marketing/DesignPartnerPage.js.map +0 -1
- package/dist/components/marketing/LandingPage.js.map +0 -1
- package/dist/components/marketing/PricingClient.js.map +0 -1
- package/dist/components/marketing/ProductClientPage.js.map +0 -1
- package/dist/components/marketing/pricing-thinking-modal.js.map +0 -1
- package/dist/components/marketing/sections/AudienceSection.js.map +0 -1
- package/dist/components/marketing/sections/CorePositioningSection.js.map +0 -1
- package/dist/components/marketing/sections/CtaSection.js.map +0 -1
- package/dist/components/marketing/sections/DevelopersSection.js.map +0 -1
- package/dist/components/marketing/sections/FearsSection.js.map +0 -1
- package/dist/components/marketing/sections/HeroMarketingSection.js.map +0 -1
- package/dist/components/marketing/sections/IconGridSection.js.map +0 -1
- package/dist/components/marketing/sections/OutputsSection.js.map +0 -1
- package/dist/components/marketing/sections/ProblemSection.js.map +0 -1
- package/dist/components/marketing/sections/SolutionSection.js.map +0 -1
- package/dist/components/marketing/sections/StepsSection.js.map +0 -1
- package/dist/components/marketing/waitlist-section.js.map +0 -1
- package/dist/components/templates/TemplatesClientPage.js.map +0 -1
- package/dist/components/templates/TemplatesPage.js.map +0 -1
- package/dist/components/templates/TemplatesPreviewModal.js.map +0 -1
- package/dist/libs/email/client.js.map +0 -1
- package/dist/libs/email/contact.js.map +0 -1
- package/dist/libs/email/newsletter.js.map +0 -1
- package/dist/libs/email/utils.js.map +0 -1
- package/dist/libs/email/waitlist-application.js.map +0 -1
- package/dist/libs/email/waitlist.js.map +0 -1
- package/dist/libs/pricing-examples.js.map +0 -1
- package/dist/registry/engine.js.map +0 -1
- package/dist/registry/factory.js.map +0 -1
- package/dist/registry/registry-docs.js.map +0 -1
- package/dist/registry/registry-landing.js.map +0 -1
- package/dist/registry/registry.js.map +0 -1
- package/dist/registry/utils.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,50 +1,170 @@
|
|
|
1
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
var __require = import.meta.require;
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
import {
|
|
4
|
+
// src/libs/email/client.ts
|
|
5
|
+
import { createClient, Temv1alpha1 } from "@scaleway/sdk";
|
|
6
|
+
import { Logger } from "@contractspec/lib.logger";
|
|
7
|
+
var DEFAULT_FROM = {
|
|
8
|
+
email: "noreply@transactional.contractspec.io",
|
|
9
|
+
name: "ContractSpec"
|
|
10
|
+
};
|
|
11
|
+
var DEFAULT_TEAM_INBOX = {
|
|
12
|
+
email: "contact@contractspec.io",
|
|
13
|
+
name: "ContractSpec Team"
|
|
14
|
+
};
|
|
15
|
+
var DEFAULT_REGION = "fr-par";
|
|
16
|
+
var cachedConfig = null;
|
|
17
|
+
var cachedClient = null;
|
|
18
|
+
var apiFactory = (client) => new Temv1alpha1.API(client);
|
|
19
|
+
var mapRegion = (value) => {
|
|
20
|
+
const normalized = value?.trim().toLowerCase();
|
|
21
|
+
if (normalized === "par" || normalized === "fr-par")
|
|
22
|
+
return "fr-par";
|
|
23
|
+
if (normalized === "ams" || normalized === "nl-ams")
|
|
24
|
+
return "nl-ams";
|
|
25
|
+
if (normalized === "waw" || normalized === "pl-waw")
|
|
26
|
+
return "pl-waw";
|
|
27
|
+
return DEFAULT_REGION;
|
|
28
|
+
};
|
|
29
|
+
var getEmailConfig = () => {
|
|
30
|
+
if (cachedConfig) {
|
|
31
|
+
return { ok: true, config: cachedConfig };
|
|
32
|
+
}
|
|
33
|
+
const accessKey = process.env.SCALEWAY_ACCESS_KEY || process.env.SCALEWAY_ACCESS_KEY_QUEUE;
|
|
34
|
+
const secretKey = process.env.SCALEWAY_SECRET_KEY || process.env.SCALEWAY_SECRET_KEY_QUEUE;
|
|
35
|
+
const projectId = process.env.SCALEWAY_PROJECT_ID;
|
|
36
|
+
if (!accessKey || !secretKey || !projectId) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
errorMessage: "Email service is not configured. Please contact us directly at contact@contractspec.io."
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const region = mapRegion(process.env.SCALEWAY_REGION);
|
|
43
|
+
cachedConfig = {
|
|
44
|
+
accessKey,
|
|
45
|
+
secretKey,
|
|
46
|
+
projectId,
|
|
47
|
+
region,
|
|
48
|
+
defaultZone: `${region}-1`,
|
|
49
|
+
from: {
|
|
50
|
+
email: process.env.SCALEWAY_EMAIL_FROM_EMAIL ?? DEFAULT_FROM.email,
|
|
51
|
+
name: process.env.SCALEWAY_EMAIL_FROM_NAME ?? DEFAULT_FROM.name
|
|
52
|
+
},
|
|
53
|
+
teamInbox: {
|
|
54
|
+
email: process.env.SCALEWAY_EMAIL_TEAM_EMAIL ?? DEFAULT_TEAM_INBOX.email,
|
|
55
|
+
name: process.env.SCALEWAY_EMAIL_TEAM_NAME ?? DEFAULT_TEAM_INBOX.name
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return { ok: true, config: cachedConfig };
|
|
59
|
+
};
|
|
60
|
+
var getTemClient = (config) => {
|
|
61
|
+
if (cachedClient) {
|
|
62
|
+
return cachedClient;
|
|
63
|
+
}
|
|
64
|
+
const client = createClient({
|
|
65
|
+
accessKey: config.accessKey,
|
|
66
|
+
secretKey: config.secretKey,
|
|
67
|
+
defaultProjectId: config.projectId,
|
|
68
|
+
defaultRegion: config.region,
|
|
69
|
+
defaultZone: config.defaultZone
|
|
70
|
+
});
|
|
71
|
+
cachedClient = apiFactory(client);
|
|
72
|
+
return cachedClient;
|
|
73
|
+
};
|
|
74
|
+
var sendEmail = async (config, request) => {
|
|
75
|
+
try {
|
|
76
|
+
const client = getTemClient(config);
|
|
77
|
+
await client.createEmail({
|
|
78
|
+
region: config.region,
|
|
79
|
+
projectId: config.projectId,
|
|
80
|
+
from: config.from,
|
|
81
|
+
to: request.to,
|
|
82
|
+
subject: request.subject,
|
|
83
|
+
text: request.text,
|
|
84
|
+
html: request.html || request.text,
|
|
85
|
+
additionalHeaders: request.replyTo ? [{ key: "Reply-To", value: request.replyTo }] : undefined
|
|
86
|
+
});
|
|
87
|
+
return { success: true };
|
|
88
|
+
} catch (error) {
|
|
89
|
+
new Logger().error("scaleway_tem_email_send_failed", {
|
|
90
|
+
context: request.context ?? "email",
|
|
91
|
+
error: error instanceof Error ? error.message : error
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error,
|
|
96
|
+
errorMessage: "Failed to send email via Scaleway."
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var __internal = {
|
|
101
|
+
resetCaches() {
|
|
102
|
+
cachedClient = null;
|
|
103
|
+
cachedConfig = null;
|
|
104
|
+
apiFactory = (client) => new Temv1alpha1.API(client);
|
|
105
|
+
},
|
|
106
|
+
setApiFactory(factory) {
|
|
107
|
+
apiFactory = factory;
|
|
108
|
+
},
|
|
109
|
+
setClient(client) {
|
|
110
|
+
cachedClient = client;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/libs/email/utils.ts
|
|
115
|
+
var escapeHtml = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
116
|
+
var formatMultilineHtml = (value) => escapeHtml(value).replaceAll(`
|
|
117
|
+
`, "<br />");
|
|
5
118
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
119
|
+
// src/libs/email/waitlist-application.ts
|
|
120
|
+
"use server";
|
|
121
|
+
var APPLICATION_MISSING_CONFIG = "Waitlist application service is not configured. Please try again later.";
|
|
122
|
+
var APPLICATION_SEND_ERROR = "Failed to submit application. Please try again later or contact us directly.";
|
|
123
|
+
var submitWaitlistApplication = async (formData) => {
|
|
124
|
+
const email = (formData.get("email") ?? "").toString().trim();
|
|
125
|
+
const name = (formData.get("name") ?? "").toString().trim();
|
|
126
|
+
const company = (formData.get("company") ?? "").toString().trim();
|
|
127
|
+
const role = (formData.get("role") ?? "").toString().trim();
|
|
128
|
+
const useCase = (formData.get("useCase") ?? "").toString().trim();
|
|
129
|
+
const currentStack = (formData.get("currentStack") ?? "").toString().trim();
|
|
130
|
+
const whatBuilding = (formData.get("whatBuilding") ?? "").toString().trim();
|
|
131
|
+
const whatSolving = (formData.get("whatSolving") ?? "").toString().trim();
|
|
132
|
+
const teamSize = (formData.get("teamSize") ?? "").toString().trim();
|
|
133
|
+
const timeline = (formData.get("timeline") ?? "").toString().trim();
|
|
134
|
+
const openToSessions = formData.get("openToSessions") === "on";
|
|
135
|
+
const okayWithCaseStudies = formData.get("okayWithCaseStudies") === "on";
|
|
136
|
+
if (!email || !email.includes("@")) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
text: "Please enter a valid email address."
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
if (!name || !whatBuilding || !whatSolving) {
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
text: "Please fill in all required fields."
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
const configResult = getEmailConfig();
|
|
149
|
+
if (!configResult.ok || !configResult.config) {
|
|
150
|
+
return {
|
|
151
|
+
success: false,
|
|
152
|
+
text: configResult.errorMessage ?? APPLICATION_MISSING_CONFIG
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
const applicantText = `
|
|
36
156
|
You're on the list.
|
|
37
157
|
|
|
38
158
|
Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.
|
|
39
159
|
|
|
40
160
|
What happens next:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
161
|
+
\u2022 We review applications weekly
|
|
162
|
+
\u2022 If selected, we'll reach out via email to schedule an intro call
|
|
163
|
+
\u2022 During early access, you'll get hands-on support and influence over the roadmap
|
|
44
164
|
|
|
45
165
|
In the meantime:
|
|
46
|
-
|
|
47
|
-
|
|
166
|
+
\u2022 Check out our docs: https://contractspec.io/docs
|
|
167
|
+
\u2022 Book a demo call: https://contractspec.io/contact
|
|
48
168
|
|
|
49
169
|
We're excited about the possibility of working together!
|
|
50
170
|
|
|
@@ -52,11 +172,7 @@ We're excited about the possibility of working together!
|
|
|
52
172
|
ContractSpec Team
|
|
53
173
|
https://contractspec.io
|
|
54
174
|
`.trim();
|
|
55
|
-
|
|
56
|
-
to: [{ email }],
|
|
57
|
-
subject: "You're on the ContractSpec design partner waitlist!",
|
|
58
|
-
text: applicantText,
|
|
59
|
-
html: `
|
|
175
|
+
const applicantHtml = `
|
|
60
176
|
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
61
177
|
<h1 style="color: #8b5cf6;">You're on the list.</h1>
|
|
62
178
|
<p>Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.</p>
|
|
@@ -78,17 +194,22 @@ https://contractspec.io
|
|
|
78
194
|
<a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
|
|
79
195
|
</p>
|
|
80
196
|
</div>
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
197
|
+
`;
|
|
198
|
+
const applicantSend = await sendEmail(configResult.config, {
|
|
199
|
+
to: [{ email }],
|
|
200
|
+
subject: "You're on the ContractSpec design partner waitlist!",
|
|
201
|
+
text: applicantText,
|
|
202
|
+
html: applicantHtml,
|
|
203
|
+
context: "waitlist-application-welcome"
|
|
204
|
+
});
|
|
205
|
+
if (!applicantSend.success) {
|
|
206
|
+
return { success: false, text: APPLICATION_SEND_ERROR };
|
|
207
|
+
}
|
|
208
|
+
const preferencesText = `
|
|
88
209
|
Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
|
|
89
210
|
Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
|
|
90
211
|
`.trim();
|
|
91
|
-
|
|
212
|
+
const teamEmailText = `
|
|
92
213
|
New Design Partner Waitlist Application
|
|
93
214
|
|
|
94
215
|
Contact Information:
|
|
@@ -116,7 +237,7 @@ Preferences:
|
|
|
116
237
|
---
|
|
117
238
|
Submitted via ContractSpec waitlist application form
|
|
118
239
|
`.trim();
|
|
119
|
-
|
|
240
|
+
const teamEmailHtml = `
|
|
120
241
|
<div style="font-family: sans-serif; max-width: 720px; margin: 0 auto;">
|
|
121
242
|
<h1 style="color: #8b5cf6;">New Design Partner Waitlist Application</h1>
|
|
122
243
|
<h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
|
|
@@ -148,23 +269,22 @@ Submitted via ContractSpec waitlist application form
|
|
|
148
269
|
<p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec waitlist application form</p>
|
|
149
270
|
</div>
|
|
150
271
|
`;
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
272
|
+
const teamSend = await sendEmail(configResult.config, {
|
|
273
|
+
to: [configResult.config.teamInbox],
|
|
274
|
+
subject: `New Design Partner Application: ${name} (${email})`,
|
|
275
|
+
text: teamEmailText,
|
|
276
|
+
html: teamEmailHtml,
|
|
277
|
+
replyTo: email,
|
|
278
|
+
context: "waitlist-application-team-notification"
|
|
279
|
+
});
|
|
280
|
+
if (!teamSend.success) {
|
|
281
|
+
return { success: false, text: APPLICATION_SEND_ERROR };
|
|
282
|
+
}
|
|
283
|
+
return {
|
|
284
|
+
success: true,
|
|
285
|
+
text: "Application submitted successfully!"
|
|
286
|
+
};
|
|
287
|
+
};
|
|
288
|
+
export {
|
|
289
|
+
submitWaitlistApplication
|
|
166
290
|
};
|
|
167
|
-
|
|
168
|
-
//#endregion
|
|
169
|
-
export { submitWaitlistApplication };
|
|
170
|
-
//# sourceMappingURL=waitlist-application.js.map
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import { SubmitWaitlistResult } from
|
|
2
|
-
|
|
3
|
-
//#region src/libs/email/waitlist.d.ts
|
|
4
|
-
declare const joinWaitlist: (formData: FormData) => Promise<SubmitWaitlistResult>;
|
|
5
|
-
//#endregion
|
|
6
|
-
export { joinWaitlist };
|
|
1
|
+
import type { SubmitWaitlistResult } from './types';
|
|
2
|
+
export declare const joinWaitlist: (formData: FormData) => Promise<SubmitWaitlistResult>;
|
|
7
3
|
//# sourceMappingURL=waitlist.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"waitlist.d.ts","
|
|
1
|
+
{"version":3,"file":"waitlist.d.ts","sourceRoot":"","sources":["../../../src/libs/email/waitlist.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAOpD,eAAO,MAAM,YAAY,GACvB,UAAU,QAAQ,KACjB,OAAO,CAAC,oBAAoB,CAwG9B,CAAC"}
|
|
@@ -1,37 +1,155 @@
|
|
|
1
|
-
|
|
1
|
+
// @bun
|
|
2
|
+
var __require = import.meta.require;
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
import {
|
|
4
|
+
// src/libs/email/client.ts
|
|
5
|
+
import { createClient, Temv1alpha1 } from "@scaleway/sdk";
|
|
6
|
+
import { Logger } from "@contractspec/lib.logger";
|
|
7
|
+
var DEFAULT_FROM = {
|
|
8
|
+
email: "noreply@transactional.contractspec.io",
|
|
9
|
+
name: "ContractSpec"
|
|
10
|
+
};
|
|
11
|
+
var DEFAULT_TEAM_INBOX = {
|
|
12
|
+
email: "contact@contractspec.io",
|
|
13
|
+
name: "ContractSpec Team"
|
|
14
|
+
};
|
|
15
|
+
var DEFAULT_REGION = "fr-par";
|
|
16
|
+
var cachedConfig = null;
|
|
17
|
+
var cachedClient = null;
|
|
18
|
+
var apiFactory = (client) => new Temv1alpha1.API(client);
|
|
19
|
+
var mapRegion = (value) => {
|
|
20
|
+
const normalized = value?.trim().toLowerCase();
|
|
21
|
+
if (normalized === "par" || normalized === "fr-par")
|
|
22
|
+
return "fr-par";
|
|
23
|
+
if (normalized === "ams" || normalized === "nl-ams")
|
|
24
|
+
return "nl-ams";
|
|
25
|
+
if (normalized === "waw" || normalized === "pl-waw")
|
|
26
|
+
return "pl-waw";
|
|
27
|
+
return DEFAULT_REGION;
|
|
28
|
+
};
|
|
29
|
+
var getEmailConfig = () => {
|
|
30
|
+
if (cachedConfig) {
|
|
31
|
+
return { ok: true, config: cachedConfig };
|
|
32
|
+
}
|
|
33
|
+
const accessKey = process.env.SCALEWAY_ACCESS_KEY || process.env.SCALEWAY_ACCESS_KEY_QUEUE;
|
|
34
|
+
const secretKey = process.env.SCALEWAY_SECRET_KEY || process.env.SCALEWAY_SECRET_KEY_QUEUE;
|
|
35
|
+
const projectId = process.env.SCALEWAY_PROJECT_ID;
|
|
36
|
+
if (!accessKey || !secretKey || !projectId) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
errorMessage: "Email service is not configured. Please contact us directly at contact@contractspec.io."
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const region = mapRegion(process.env.SCALEWAY_REGION);
|
|
43
|
+
cachedConfig = {
|
|
44
|
+
accessKey,
|
|
45
|
+
secretKey,
|
|
46
|
+
projectId,
|
|
47
|
+
region,
|
|
48
|
+
defaultZone: `${region}-1`,
|
|
49
|
+
from: {
|
|
50
|
+
email: process.env.SCALEWAY_EMAIL_FROM_EMAIL ?? DEFAULT_FROM.email,
|
|
51
|
+
name: process.env.SCALEWAY_EMAIL_FROM_NAME ?? DEFAULT_FROM.name
|
|
52
|
+
},
|
|
53
|
+
teamInbox: {
|
|
54
|
+
email: process.env.SCALEWAY_EMAIL_TEAM_EMAIL ?? DEFAULT_TEAM_INBOX.email,
|
|
55
|
+
name: process.env.SCALEWAY_EMAIL_TEAM_NAME ?? DEFAULT_TEAM_INBOX.name
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
return { ok: true, config: cachedConfig };
|
|
59
|
+
};
|
|
60
|
+
var getTemClient = (config) => {
|
|
61
|
+
if (cachedClient) {
|
|
62
|
+
return cachedClient;
|
|
63
|
+
}
|
|
64
|
+
const client = createClient({
|
|
65
|
+
accessKey: config.accessKey,
|
|
66
|
+
secretKey: config.secretKey,
|
|
67
|
+
defaultProjectId: config.projectId,
|
|
68
|
+
defaultRegion: config.region,
|
|
69
|
+
defaultZone: config.defaultZone
|
|
70
|
+
});
|
|
71
|
+
cachedClient = apiFactory(client);
|
|
72
|
+
return cachedClient;
|
|
73
|
+
};
|
|
74
|
+
var sendEmail = async (config, request) => {
|
|
75
|
+
try {
|
|
76
|
+
const client = getTemClient(config);
|
|
77
|
+
await client.createEmail({
|
|
78
|
+
region: config.region,
|
|
79
|
+
projectId: config.projectId,
|
|
80
|
+
from: config.from,
|
|
81
|
+
to: request.to,
|
|
82
|
+
subject: request.subject,
|
|
83
|
+
text: request.text,
|
|
84
|
+
html: request.html || request.text,
|
|
85
|
+
additionalHeaders: request.replyTo ? [{ key: "Reply-To", value: request.replyTo }] : undefined
|
|
86
|
+
});
|
|
87
|
+
return { success: true };
|
|
88
|
+
} catch (error) {
|
|
89
|
+
new Logger().error("scaleway_tem_email_send_failed", {
|
|
90
|
+
context: request.context ?? "email",
|
|
91
|
+
error: error instanceof Error ? error.message : error
|
|
92
|
+
});
|
|
93
|
+
return {
|
|
94
|
+
success: false,
|
|
95
|
+
error,
|
|
96
|
+
errorMessage: "Failed to send email via Scaleway."
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
var __internal = {
|
|
101
|
+
resetCaches() {
|
|
102
|
+
cachedClient = null;
|
|
103
|
+
cachedConfig = null;
|
|
104
|
+
apiFactory = (client) => new Temv1alpha1.API(client);
|
|
105
|
+
},
|
|
106
|
+
setApiFactory(factory) {
|
|
107
|
+
apiFactory = factory;
|
|
108
|
+
},
|
|
109
|
+
setClient(client) {
|
|
110
|
+
cachedClient = client;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// src/libs/email/utils.ts
|
|
115
|
+
var escapeHtml = (value) => value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
116
|
+
var formatMultilineHtml = (value) => escapeHtml(value).replaceAll(`
|
|
117
|
+
`, "<br />");
|
|
5
118
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
119
|
+
// src/libs/email/waitlist.ts
|
|
120
|
+
"use server";
|
|
121
|
+
var WAITLIST_MISSING_CONFIG = "Waitlist service is not configured. Please try again later.";
|
|
122
|
+
var WAITLIST_SEND_ERROR = "Failed to join waitlist. Please try again later or contact us directly.";
|
|
123
|
+
var joinWaitlist = async (formData) => {
|
|
124
|
+
const email = (formData.get("email") ?? "").toString().trim();
|
|
125
|
+
if (!email || !email.includes("@")) {
|
|
126
|
+
return {
|
|
127
|
+
success: false,
|
|
128
|
+
text: "Please enter a valid email address."
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const configResult = getEmailConfig();
|
|
132
|
+
if (!configResult.ok || !configResult.config) {
|
|
133
|
+
return {
|
|
134
|
+
success: false,
|
|
135
|
+
text: configResult.errorMessage ?? WAITLIST_MISSING_CONFIG
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
const waitlistText = `
|
|
21
139
|
You're on the waitlist!
|
|
22
140
|
|
|
23
141
|
Thanks for joining the ContractSpec waitlist. You're now in line for early access to:
|
|
24
142
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
143
|
+
\u2022 Stabilize your AI-generated code with ContractSpec
|
|
144
|
+
\u2022 Multi-surface consistency (API, DB, UI, events)
|
|
145
|
+
\u2022 Safe regeneration without breaking changes
|
|
146
|
+
\u2022 AI governance and contract enforcement
|
|
29
147
|
|
|
30
148
|
We'll notify you as soon as early access is available. In the meantime, you can:
|
|
31
149
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
150
|
+
\u2022 Check out our docs: https://contractspec.io/docs
|
|
151
|
+
\u2022 Follow our progress on GitHub
|
|
152
|
+
\u2022 Book a demo call to see ContractSpec in action
|
|
35
153
|
|
|
36
154
|
We're excited to have you on board!
|
|
37
155
|
|
|
@@ -41,11 +159,7 @@ https://contractspec.io
|
|
|
41
159
|
|
|
42
160
|
To remove yourself from the waitlist, reply to this email with "remove"
|
|
43
161
|
`.trim();
|
|
44
|
-
|
|
45
|
-
to: [{ email }],
|
|
46
|
-
subject: "You're on the ContractSpec waitlist!",
|
|
47
|
-
text: waitlistText,
|
|
48
|
-
html: `
|
|
162
|
+
const waitlistHtml = `
|
|
49
163
|
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
50
164
|
<h1 style="color: #8b5cf6;">You're on the waitlist!</h1>
|
|
51
165
|
<p>Thanks for joining the ContractSpec waitlist. You're now in line for early access to:</p>
|
|
@@ -71,35 +185,36 @@ To remove yourself from the waitlist, reply to this email with "remove"
|
|
|
71
185
|
To remove yourself from the waitlist, reply to this email with "remove"
|
|
72
186
|
</p>
|
|
73
187
|
</div>
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
188
|
+
`;
|
|
189
|
+
const userSend = await sendEmail(configResult.config, {
|
|
190
|
+
to: [{ email }],
|
|
191
|
+
subject: "You're on the ContractSpec waitlist!",
|
|
192
|
+
text: waitlistText,
|
|
193
|
+
html: waitlistHtml,
|
|
194
|
+
context: "waitlist-welcome"
|
|
195
|
+
});
|
|
196
|
+
if (!userSend.success) {
|
|
197
|
+
return { success: false, text: WAITLIST_SEND_ERROR };
|
|
198
|
+
}
|
|
199
|
+
const teamNotificationText = `New waitlist signup from: ${email}`;
|
|
200
|
+
const teamNotificationHtml = `
|
|
82
201
|
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
83
202
|
<p style="margin: 0 0 8px;">New waitlist signup</p>
|
|
84
203
|
<p style="margin: 0;"><strong>Email:</strong> ${formatMultilineHtml(email)}</p>
|
|
85
204
|
</div>
|
|
86
205
|
`;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
206
|
+
const teamSend = await sendEmail(configResult.config, {
|
|
207
|
+
to: [configResult.config.teamInbox],
|
|
208
|
+
subject: `New Waitlist Signup: ${email}`,
|
|
209
|
+
text: teamNotificationText,
|
|
210
|
+
html: teamNotificationHtml,
|
|
211
|
+
context: "waitlist-team-notification"
|
|
212
|
+
});
|
|
213
|
+
if (!teamSend.success) {
|
|
214
|
+
return { success: false, text: WAITLIST_SEND_ERROR };
|
|
215
|
+
}
|
|
216
|
+
return { success: true, text: "Successfully joined waitlist!" };
|
|
217
|
+
};
|
|
218
|
+
export {
|
|
219
|
+
joinWaitlist
|
|
101
220
|
};
|
|
102
|
-
|
|
103
|
-
//#endregion
|
|
104
|
-
export { joinWaitlist };
|
|
105
|
-
//# sourceMappingURL=waitlist.js.map
|
|
@@ -1,22 +1,19 @@
|
|
|
1
|
-
//#region src/libs/pricing-examples.d.ts
|
|
2
1
|
/**
|
|
3
2
|
* Tentative pricing example values for UI display.
|
|
4
3
|
* These are examples only and subject to change based on learnings from design partners.
|
|
5
4
|
*/
|
|
6
|
-
declare const PRICING_EXAMPLES: {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
5
|
+
export declare const PRICING_EXAMPLES: {
|
|
6
|
+
readonly free: {
|
|
7
|
+
readonly regenerationsPerMonth: 200;
|
|
8
|
+
readonly aiActionsPerMonth: 100;
|
|
9
|
+
readonly projects: 1;
|
|
10
|
+
};
|
|
11
|
+
readonly builder: {
|
|
12
|
+
readonly regenerationsPerMonthHint: "1,000–2,000+";
|
|
13
|
+
readonly aiActionsPerMonthHint: "1,000+";
|
|
14
|
+
};
|
|
15
|
+
readonly team: {
|
|
16
|
+
readonly description: "Higher limits + cheaper per-regen at scale";
|
|
17
|
+
};
|
|
19
18
|
};
|
|
20
|
-
//#endregion
|
|
21
|
-
export { PRICING_EXAMPLES };
|
|
22
19
|
//# sourceMappingURL=pricing-examples.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing-examples.d.ts","
|
|
1
|
+
{"version":3,"file":"pricing-examples.d.ts","sourceRoot":"","sources":["../../src/libs/pricing-examples.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAanB,CAAC"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* Tentative pricing example values for UI display.
|
|
4
|
-
* These are examples only and subject to change based on learnings from design partners.
|
|
5
|
-
*/
|
|
6
|
-
const PRICING_EXAMPLES = {
|
|
7
|
-
free: {
|
|
8
|
-
regenerationsPerMonth: 200,
|
|
9
|
-
aiActionsPerMonth: 100,
|
|
10
|
-
projects: 1
|
|
11
|
-
},
|
|
12
|
-
builder: {
|
|
13
|
-
regenerationsPerMonthHint: "1,000–2,000+",
|
|
14
|
-
aiActionsPerMonthHint: "1,000+"
|
|
15
|
-
},
|
|
16
|
-
team: { description: "Higher limits + cheaper per-regen at scale" }
|
|
17
|
-
};
|
|
1
|
+
// @bun
|
|
2
|
+
var __require = import.meta.require;
|
|
18
3
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
4
|
+
// src/libs/pricing-examples.ts
|
|
5
|
+
var PRICING_EXAMPLES = {
|
|
6
|
+
free: {
|
|
7
|
+
regenerationsPerMonth: 200,
|
|
8
|
+
aiActionsPerMonth: 100,
|
|
9
|
+
projects: 1
|
|
10
|
+
},
|
|
11
|
+
builder: {
|
|
12
|
+
regenerationsPerMonthHint: "1,000\u20132,000+",
|
|
13
|
+
aiActionsPerMonthHint: "1,000+"
|
|
14
|
+
},
|
|
15
|
+
team: {
|
|
16
|
+
description: "Higher limits + cheaper per-regen at scale"
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
PRICING_EXAMPLES
|
|
21
|
+
};
|