@contractspec/bundle.marketing 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/.turbo/turbo-build$colon$types.log +1 -0
  2. package/.turbo/turbo-build.log +175 -0
  3. package/.turbo/turbo-lint.log +3 -0
  4. package/AGENTS.md +36 -0
  5. package/CHANGELOG.md +416 -0
  6. package/README.md +57 -0
  7. package/dist/components/marketing/ChangelogPage.d.ts +21 -0
  8. package/dist/components/marketing/ChangelogPage.d.ts.map +1 -0
  9. package/dist/components/marketing/ChangelogPage.js +65 -0
  10. package/dist/components/marketing/ChangelogPage.js.map +1 -0
  11. package/dist/components/marketing/CofounderPage.d.ts +7 -0
  12. package/dist/components/marketing/CofounderPage.d.ts.map +1 -0
  13. package/dist/components/marketing/CofounderPage.js +468 -0
  14. package/dist/components/marketing/CofounderPage.js.map +1 -0
  15. package/dist/components/marketing/ContactClient.d.ts +7 -0
  16. package/dist/components/marketing/ContactClient.d.ts.map +1 -0
  17. package/dist/components/marketing/ContactClient.js +158 -0
  18. package/dist/components/marketing/ContactClient.js.map +1 -0
  19. package/dist/components/marketing/ContributePage.d.ts +9 -0
  20. package/dist/components/marketing/ContributePage.d.ts.map +1 -0
  21. package/dist/components/marketing/ContributePage.js +362 -0
  22. package/dist/components/marketing/ContributePage.js.map +1 -0
  23. package/dist/components/marketing/DesignPartnerPage.d.ts +9 -0
  24. package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -0
  25. package/dist/components/marketing/DesignPartnerPage.js +215 -0
  26. package/dist/components/marketing/DesignPartnerPage.js.map +1 -0
  27. package/dist/components/marketing/LandingPage.d.ts +7 -0
  28. package/dist/components/marketing/LandingPage.d.ts.map +1 -0
  29. package/dist/components/marketing/LandingPage.js +38 -0
  30. package/dist/components/marketing/LandingPage.js.map +1 -0
  31. package/dist/components/marketing/PricingClient.d.ts +7 -0
  32. package/dist/components/marketing/PricingClient.d.ts.map +1 -0
  33. package/dist/components/marketing/PricingClient.js +521 -0
  34. package/dist/components/marketing/PricingClient.js.map +1 -0
  35. package/dist/components/marketing/ProductClientPage.d.ts +7 -0
  36. package/dist/components/marketing/ProductClientPage.d.ts.map +1 -0
  37. package/dist/components/marketing/ProductClientPage.js +460 -0
  38. package/dist/components/marketing/ProductClientPage.js.map +1 -0
  39. package/dist/components/marketing/index.d.ts +11 -0
  40. package/dist/components/marketing/index.js +12 -0
  41. package/dist/components/marketing/pricing-thinking-modal.d.ts +16 -0
  42. package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -0
  43. package/dist/components/marketing/pricing-thinking-modal.js +202 -0
  44. package/dist/components/marketing/pricing-thinking-modal.js.map +1 -0
  45. package/dist/components/marketing/sections/AudienceSection.d.ts +7 -0
  46. package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -0
  47. package/dist/components/marketing/sections/AudienceSection.js +68 -0
  48. package/dist/components/marketing/sections/AudienceSection.js.map +1 -0
  49. package/dist/components/marketing/sections/CorePositioningSection.d.ts +7 -0
  50. package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -0
  51. package/dist/components/marketing/sections/CorePositioningSection.js +59 -0
  52. package/dist/components/marketing/sections/CorePositioningSection.js.map +1 -0
  53. package/dist/components/marketing/sections/CtaSection.d.ts +7 -0
  54. package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -0
  55. package/dist/components/marketing/sections/CtaSection.js +54 -0
  56. package/dist/components/marketing/sections/CtaSection.js.map +1 -0
  57. package/dist/components/marketing/sections/DevelopersSection.d.ts +7 -0
  58. package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -0
  59. package/dist/components/marketing/sections/DevelopersSection.js +45 -0
  60. package/dist/components/marketing/sections/DevelopersSection.js.map +1 -0
  61. package/dist/components/marketing/sections/FearsSection.d.ts +7 -0
  62. package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -0
  63. package/dist/components/marketing/sections/FearsSection.js +48 -0
  64. package/dist/components/marketing/sections/FearsSection.js.map +1 -0
  65. package/dist/components/marketing/sections/HeroMarketingSection.d.ts +7 -0
  66. package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -0
  67. package/dist/components/marketing/sections/HeroMarketingSection.js +77 -0
  68. package/dist/components/marketing/sections/HeroMarketingSection.js.map +1 -0
  69. package/dist/components/marketing/sections/IconGridSection.d.ts +45 -0
  70. package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -0
  71. package/dist/components/marketing/sections/IconGridSection.js +44 -0
  72. package/dist/components/marketing/sections/IconGridSection.js.map +1 -0
  73. package/dist/components/marketing/sections/OutputsSection.d.ts +7 -0
  74. package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -0
  75. package/dist/components/marketing/sections/OutputsSection.js +59 -0
  76. package/dist/components/marketing/sections/OutputsSection.js.map +1 -0
  77. package/dist/components/marketing/sections/ProblemSection.d.ts +7 -0
  78. package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -0
  79. package/dist/components/marketing/sections/ProblemSection.js +46 -0
  80. package/dist/components/marketing/sections/ProblemSection.js.map +1 -0
  81. package/dist/components/marketing/sections/SolutionSection.d.ts +7 -0
  82. package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -0
  83. package/dist/components/marketing/sections/SolutionSection.js +46 -0
  84. package/dist/components/marketing/sections/SolutionSection.js.map +1 -0
  85. package/dist/components/marketing/sections/StepsSection.d.ts +7 -0
  86. package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -0
  87. package/dist/components/marketing/sections/StepsSection.js +52 -0
  88. package/dist/components/marketing/sections/StepsSection.js.map +1 -0
  89. package/dist/components/marketing/waitlist-section.d.ts +15 -0
  90. package/dist/components/marketing/waitlist-section.d.ts.map +1 -0
  91. package/dist/components/marketing/waitlist-section.js +578 -0
  92. package/dist/components/marketing/waitlist-section.js.map +1 -0
  93. package/dist/components/templates/TemplatesClientPage.d.ts +7 -0
  94. package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -0
  95. package/dist/components/templates/TemplatesClientPage.js +625 -0
  96. package/dist/components/templates/TemplatesClientPage.js.map +1 -0
  97. package/dist/components/templates/TemplatesPage.d.ts +7 -0
  98. package/dist/components/templates/TemplatesPage.d.ts.map +1 -0
  99. package/dist/components/templates/TemplatesPage.js +125 -0
  100. package/dist/components/templates/TemplatesPage.js.map +1 -0
  101. package/dist/components/templates/TemplatesPreviewModal.d.ts +15 -0
  102. package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -0
  103. package/dist/components/templates/TemplatesPreviewModal.js +137 -0
  104. package/dist/components/templates/TemplatesPreviewModal.js.map +1 -0
  105. package/dist/components/templates/index.d.ts +4 -0
  106. package/dist/components/templates/index.js +5 -0
  107. package/dist/index.d.ts +29 -0
  108. package/dist/index.js +28 -0
  109. package/dist/libs/email/client.d.ts +15 -0
  110. package/dist/libs/email/client.d.ts.map +1 -0
  111. package/dist/libs/email/client.js +113 -0
  112. package/dist/libs/email/client.js.map +1 -0
  113. package/dist/libs/email/contact.d.ts +7 -0
  114. package/dist/libs/email/contact.d.ts.map +1 -0
  115. package/dist/libs/email/contact.js +71 -0
  116. package/dist/libs/email/contact.js.map +1 -0
  117. package/dist/libs/email/newsletter.d.ts +7 -0
  118. package/dist/libs/email/newsletter.d.ts.map +1 -0
  119. package/dist/libs/email/newsletter.js +95 -0
  120. package/dist/libs/email/newsletter.js.map +1 -0
  121. package/dist/libs/email/types.d.ts +53 -0
  122. package/dist/libs/email/types.d.ts.map +1 -0
  123. package/dist/libs/email/types.js +1 -0
  124. package/dist/libs/email/utils.d.ts +6 -0
  125. package/dist/libs/email/utils.d.ts.map +1 -0
  126. package/dist/libs/email/utils.js +7 -0
  127. package/dist/libs/email/utils.js.map +1 -0
  128. package/dist/libs/email/waitlist-application.d.ts +7 -0
  129. package/dist/libs/email/waitlist-application.d.ts.map +1 -0
  130. package/dist/libs/email/waitlist-application.js +170 -0
  131. package/dist/libs/email/waitlist-application.js.map +1 -0
  132. package/dist/libs/email/waitlist.d.ts +7 -0
  133. package/dist/libs/email/waitlist.d.ts.map +1 -0
  134. package/dist/libs/email/waitlist.js +105 -0
  135. package/dist/libs/email/waitlist.js.map +1 -0
  136. package/dist/libs/pricing-examples.d.ts +22 -0
  137. package/dist/libs/pricing-examples.d.ts.map +1 -0
  138. package/dist/libs/pricing-examples.js +21 -0
  139. package/dist/libs/pricing-examples.js.map +1 -0
  140. package/dist/registry/engine.d.ts +17 -0
  141. package/dist/registry/engine.d.ts.map +1 -0
  142. package/dist/registry/engine.js +24 -0
  143. package/dist/registry/engine.js.map +1 -0
  144. package/dist/registry/factory.d.ts +64 -0
  145. package/dist/registry/factory.d.ts.map +1 -0
  146. package/dist/registry/factory.js +61 -0
  147. package/dist/registry/factory.js.map +1 -0
  148. package/dist/registry/index.d.ts +8 -0
  149. package/dist/registry/index.js +8 -0
  150. package/dist/registry/registry-docs.d.ts +15 -0
  151. package/dist/registry/registry-docs.d.ts.map +1 -0
  152. package/dist/registry/registry-docs.js +305 -0
  153. package/dist/registry/registry-docs.js.map +1 -0
  154. package/dist/registry/registry-landing.d.ts +19 -0
  155. package/dist/registry/registry-landing.d.ts.map +1 -0
  156. package/dist/registry/registry-landing.js +95 -0
  157. package/dist/registry/registry-landing.js.map +1 -0
  158. package/dist/registry/registry.d.ts +30 -0
  159. package/dist/registry/registry.d.ts.map +1 -0
  160. package/dist/registry/registry.js +61 -0
  161. package/dist/registry/registry.js.map +1 -0
  162. package/dist/registry/types.d.ts +19 -0
  163. package/dist/registry/types.d.ts.map +1 -0
  164. package/dist/registry/types.js +0 -0
  165. package/dist/registry/utils.d.ts +31 -0
  166. package/dist/registry/utils.d.ts.map +1 -0
  167. package/dist/registry/utils.js +54 -0
  168. package/dist/registry/utils.js.map +1 -0
  169. package/package.json +151 -0
  170. package/src/components/marketing/ChangelogPage.tsx +110 -0
  171. package/src/components/marketing/CofounderPage.tsx +409 -0
  172. package/src/components/marketing/ContactClient.tsx +174 -0
  173. package/src/components/marketing/ContributePage.tsx +319 -0
  174. package/src/components/marketing/DesignPartnerPage.tsx +181 -0
  175. package/src/components/marketing/LandingPage.tsx +30 -0
  176. package/src/components/marketing/PricingClient.tsx +446 -0
  177. package/src/components/marketing/ProductClientPage.tsx +391 -0
  178. package/src/components/marketing/index.ts +10 -0
  179. package/src/components/marketing/pricing-thinking-modal.tsx +224 -0
  180. package/src/components/marketing/sections/AudienceSection.tsx +66 -0
  181. package/src/components/marketing/sections/CorePositioningSection.tsx +44 -0
  182. package/src/components/marketing/sections/CtaSection.tsx +57 -0
  183. package/src/components/marketing/sections/DevelopersSection.tsx +38 -0
  184. package/src/components/marketing/sections/FearsSection.tsx +45 -0
  185. package/src/components/marketing/sections/HeroMarketingSection.tsx +73 -0
  186. package/src/components/marketing/sections/IconGridSection.tsx +91 -0
  187. package/src/components/marketing/sections/OutputsSection.tsx +59 -0
  188. package/src/components/marketing/sections/ProblemSection.tsx +47 -0
  189. package/src/components/marketing/sections/SolutionSection.tsx +47 -0
  190. package/src/components/marketing/sections/StepsSection.tsx +55 -0
  191. package/src/components/marketing/waitlist-section.tsx +606 -0
  192. package/src/components/templates/TemplatesClientPage.tsx +711 -0
  193. package/src/components/templates/TemplatesPage.tsx +129 -0
  194. package/src/components/templates/TemplatesPreviewModal.tsx +260 -0
  195. package/src/components/templates/index.ts +3 -0
  196. package/src/index.ts +15 -0
  197. package/src/libs/email/client.test.ts +107 -0
  198. package/src/libs/email/client.ts +146 -0
  199. package/src/libs/email/contact.ts +80 -0
  200. package/src/libs/email/newsletter.ts +108 -0
  201. package/src/libs/email/types.ts +59 -0
  202. package/src/libs/email/utils.ts +8 -0
  203. package/src/libs/email/waitlist-application.ts +192 -0
  204. package/src/libs/email/waitlist.ts +118 -0
  205. package/src/libs/pricing-examples.ts +19 -0
  206. package/src/registry/engine.ts +38 -0
  207. package/src/registry/factory.ts +110 -0
  208. package/src/registry/index.ts +7 -0
  209. package/src/registry/registry-docs.ts +843 -0
  210. package/src/registry/registry-landing.ts +118 -0
  211. package/src/registry/registry.ts +85 -0
  212. package/src/registry/types.ts +17 -0
  213. package/src/registry/utils.ts +99 -0
  214. package/tsconfig.json +13 -0
  215. package/tsconfig.tsbuildinfo +1 -0
  216. package/tsdown.config.js +10 -0
@@ -0,0 +1,61 @@
1
+ import { docsComponentMap, docsPresentations } from "./registry-docs.js";
2
+ import { landingComponentMap, landingPresentations, learningPresentations } from "./registry-landing.js";
3
+ import { docBlocksToPresentationRoutes, listRegisteredDocBlocks, metaDocs, techContractsDocs } from "@contractspec/lib.contracts/docs";
4
+ import { opsDocBlocks } from "@contractspec/bundle.library/components/docs/ops/ops.docs";
5
+ import { productDocs } from "@contractspec/bundle.library/components/docs/product/product.docblocks";
6
+ import { techContractsDocBlocks } from "@contractspec/bundle.library/components/docs/tech/contracts/tech-docs.docblocks";
7
+
8
+ //#region src/registry/registry.ts
9
+ /**
10
+ * Merged component map for React rendering.
11
+ * Maps componentKey to actual React components.
12
+ */
13
+ const componentMap = {
14
+ ...landingComponentMap,
15
+ ...docsComponentMap
16
+ };
17
+ /**
18
+ * Presentation registry for all static pages.
19
+ * Maps route paths to PresentationSpec definitions.
20
+ */
21
+ const presentationRegistry = new Map([
22
+ ...landingPresentations,
23
+ ...learningPresentations,
24
+ ...docsPresentations
25
+ ]);
26
+ const docRoutes = docBlocksToPresentationRoutes([
27
+ ...opsDocBlocks,
28
+ ...productDocs,
29
+ ...techContractsDocBlocks,
30
+ ...techContractsDocs,
31
+ ...metaDocs,
32
+ ...listRegisteredDocBlocks()
33
+ ], {
34
+ namespace: "web-landing.docs",
35
+ routePrefix: "/docs"
36
+ });
37
+ for (const { route, descriptor } of docRoutes) presentationRegistry.set(route, descriptor);
38
+ /**
39
+ * Get presentation descriptor for a given route.
40
+ * Returns undefined if no presentation exists for the route.
41
+ */
42
+ function getPresentationForRoute(route) {
43
+ const normalizedRoute = route === "/" ? "/" : route.replace(/\/$/, "");
44
+ return presentationRegistry.get(normalizedRoute);
45
+ }
46
+ /**
47
+ * Check if a route has a presentation descriptor.
48
+ */
49
+ function hasPresentation(route) {
50
+ return getPresentationForRoute(route) !== void 0;
51
+ }
52
+ /**
53
+ * Get all registered routes with presentations.
54
+ */
55
+ function getAllPresentationRoutes() {
56
+ return Array.from(presentationRegistry.keys());
57
+ }
58
+
59
+ //#endregion
60
+ export { componentMap, getAllPresentationRoutes, getPresentationForRoute, hasPresentation, presentationRegistry };
61
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../../src/registry/registry.ts"],"sourcesContent":["import {\n docBlocksToPresentationRoutes,\n type DocPresentationRoute,\n listRegisteredDocBlocks,\n metaDocs,\n techContractsDocs,\n} from '@contractspec/lib.contracts/docs';\nimport type { PresentationSpec } from '@contractspec/lib.contracts/presentations';\nimport { opsDocBlocks } from '@contractspec/bundle.library/components/docs/ops/ops.docs';\nimport { productDocs } from '@contractspec/bundle.library/components/docs/product/product.docblocks';\nimport { techContractsDocBlocks } from '@contractspec/bundle.library/components/docs/tech/contracts/tech-docs.docblocks';\nimport type { ComponentMap } from './types';\n\n// Import sub-registries\nimport { docsComponentMap, docsPresentations } from './registry-docs';\nimport {\n landingComponentMap,\n landingPresentations,\n learningPresentations,\n} from './registry-landing';\n\n/**\n * Merged component map for React rendering.\n * Maps componentKey to actual React components.\n */\nexport const componentMap: ComponentMap = {\n ...landingComponentMap,\n ...docsComponentMap,\n};\n\n/**\n * Presentation registry for all static pages.\n * Maps route paths to PresentationSpec definitions.\n */\nexport const presentationRegistry = new Map<string, PresentationSpec>([\n ...landingPresentations,\n ...learningPresentations,\n ...docsPresentations,\n]);\n\n// Add docBlocks-based presentations\nconst docRoutes: DocPresentationRoute[] = docBlocksToPresentationRoutes(\n [\n ...opsDocBlocks,\n ...productDocs,\n ...techContractsDocBlocks,\n ...techContractsDocs,\n ...metaDocs,\n ...listRegisteredDocBlocks(),\n ],\n {\n namespace: 'web-landing.docs',\n routePrefix: '/docs',\n }\n);\n\nfor (const { route, descriptor } of docRoutes) {\n presentationRegistry.set(route, descriptor);\n}\n\n/**\n * Get presentation descriptor for a given route.\n * Returns undefined if no presentation exists for the route.\n */\nexport function getPresentationForRoute(\n route: string\n): PresentationSpec | undefined {\n // Normalize route (remove trailing slash, handle root)\n const normalizedRoute = route === '/' ? '/' : route.replace(/\\/$/, '');\n return presentationRegistry.get(normalizedRoute);\n}\n\n/**\n * Check if a route has a presentation descriptor.\n */\nexport function hasPresentation(route: string): boolean {\n return getPresentationForRoute(route) !== undefined;\n}\n\n/**\n * Get all registered routes with presentations.\n */\nexport function getAllPresentationRoutes(): string[] {\n return Array.from(presentationRegistry.keys());\n}\n"],"mappings":";;;;;;;;;;;;AAyBA,MAAa,eAA6B;CACxC,GAAG;CACH,GAAG;CACJ;;;;;AAMD,MAAa,uBAAuB,IAAI,IAA8B;CACpE,GAAG;CACH,GAAG;CACH,GAAG;CACJ,CAAC;AAGF,MAAM,YAAoC,8BACxC;CACE,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG,yBAAyB;CAC7B,EACD;CACE,WAAW;CACX,aAAa;CACd,CACF;AAED,KAAK,MAAM,EAAE,OAAO,gBAAgB,UAClC,sBAAqB,IAAI,OAAO,WAAW;;;;;AAO7C,SAAgB,wBACd,OAC8B;CAE9B,MAAM,kBAAkB,UAAU,MAAM,MAAM,MAAM,QAAQ,OAAO,GAAG;AACtE,QAAO,qBAAqB,IAAI,gBAAgB;;;;;AAMlD,SAAgB,gBAAgB,OAAwB;AACtD,QAAO,wBAAwB,MAAM,KAAK;;;;;AAM5C,SAAgB,2BAAqC;AACnD,QAAO,MAAM,KAAK,qBAAqB,MAAM,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React from "react";
2
+ import { PresentationSpec } from "@contractspec/lib.contracts/presentations";
3
+
4
+ //#region src/registry/types.d.ts
5
+ /**
6
+ * Component map for React rendering.
7
+ * Maps componentKey to actual React components.
8
+ */
9
+ type ComponentMap = Record<string, React.ComponentType<any>>;
10
+ /**
11
+ * Route-to-presentation mapping.
12
+ */
13
+ interface RoutePresentation {
14
+ route: string;
15
+ descriptor: PresentationSpec;
16
+ }
17
+ //#endregion
18
+ export { ComponentMap, RoutePresentation };
19
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","names":[],"sources":["../../src/registry/types.ts"],"mappings":";;;;;;AAQA;;KAAY,YAAA,GAAe,MAAA,SAAe,KAAA,CAAM,aAAA;;;;UAK/B,iBAAA;EACf,KAAA;EACA,UAAA,EAAY,gBAAA;AAAA"}
File without changes
@@ -0,0 +1,31 @@
1
+ import { ComponentMap } from "./types.js";
2
+ import React from "react";
3
+ import { PresentationSpec } from "@contractspec/lib.contracts/presentations";
4
+
5
+ //#region src/registry/utils.d.ts
6
+ /**
7
+ * Render a presentation descriptor to markdown.
8
+ * Returns the markdown content as a string.
9
+ */
10
+ declare function renderPresentationToMarkdown(descriptor: PresentationSpec): Promise<string>;
11
+ /**
12
+ * Render a presentation descriptor to React element.
13
+ * Returns the React element or null if component not found.
14
+ */
15
+ declare function renderPresentationToReact(descriptor: PresentationSpec, customComponentMap?: ComponentMap): Promise<React.ReactElement | null>;
16
+ /**
17
+ * Get markdown URL for a given route.
18
+ * Uses llms. subdomain and .md extension.
19
+ */
20
+ declare function getMarkdownUrl(route: string, baseUrl?: string): string;
21
+ /**
22
+ * Get AI chat URLs for various providers.
23
+ */
24
+ interface AIChatProvider {
25
+ name: string;
26
+ getUrl: (url: string) => string;
27
+ }
28
+ declare const aiChatProviders: AIChatProvider[];
29
+ //#endregion
30
+ export { AIChatProvider, aiChatProviders, getMarkdownUrl, renderPresentationToMarkdown, renderPresentationToReact };
31
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","names":[],"sources":["../../src/registry/utils.ts"],"mappings":";;;;;;;AAWA;;iBAAsB,4BAAA,CACpB,UAAA,EAAY,gBAAA,GACX,OAAA;;;;;iBAamB,yBAAA,CACpB,UAAA,EAAY,gBAAA,EACZ,kBAAA,GAAqB,YAAA,GACpB,OAAA,CAAQ,KAAA,CAAM,YAAA;;AAHjB;;;iBAyBgB,cAAA,CAAe,KAAA,UAAe,OAAA;;;;UAgB7B,cAAA;EACf,IAAA;EACA,MAAA,GAAS,GAAA;AAAA;AAAA,cAGE,eAAA,EAAiB,cAAA"}
@@ -0,0 +1,54 @@
1
+ import { componentMap } from "./registry.js";
2
+ import { presentationEngine } from "./engine.js";
3
+ import { renderFeaturePresentation } from "@contractspec/lib.contracts/client/react/feature-render";
4
+
5
+ //#region src/registry/utils.ts
6
+ /**
7
+ * Render a presentation descriptor to markdown.
8
+ * Returns the markdown content as a string.
9
+ */
10
+ async function renderPresentationToMarkdown(descriptor) {
11
+ return (await presentationEngine.render("markdown", descriptor)).body;
12
+ }
13
+ /**
14
+ * Render a presentation descriptor to React element.
15
+ * Returns the React element or null if component not found.
16
+ */
17
+ async function renderPresentationToReact(descriptor, customComponentMap) {
18
+ const element = await renderFeaturePresentation(presentationEngine, "react", descriptor, { componentMap: customComponentMap ?? componentMap });
19
+ if (element && typeof element === "object" && "type" in element) return element;
20
+ return null;
21
+ }
22
+ /**
23
+ * Get markdown URL for a given route.
24
+ * Uses llms. subdomain and .md extension.
25
+ */
26
+ function getMarkdownUrl(route, baseUrl) {
27
+ return `${(baseUrl ?? "https://contractspec.io/mdx").replace("contractspec.io", "llms.contractspec.io")}${route === "/" ? "/" : route.replace(/\/$/, "")}`;
28
+ }
29
+ const aiChatProviders = [
30
+ {
31
+ name: "ChatGPT",
32
+ getUrl: (url) => `https://chatgpt.com/?q=${encodeURIComponent(url)}`
33
+ },
34
+ {
35
+ name: "Claude",
36
+ getUrl: (url) => `https://claude.ai/new?url=${encodeURIComponent(url)}`
37
+ },
38
+ {
39
+ name: "Grok",
40
+ getUrl: (url) => `https://x.com/i/grok?url=${encodeURIComponent(url)}`
41
+ },
42
+ {
43
+ name: "Mistral",
44
+ getUrl: (url) => `https://mistral.ai/chat?url=${encodeURIComponent(url)}`
45
+ },
46
+ {
47
+ name: "Perplexity",
48
+ getUrl: (url) => `https://www.perplexity.ai/?q=${encodeURIComponent(url)}`
49
+ }
50
+ ];
51
+
52
+ //#endregion
53
+ export { aiChatProviders, getMarkdownUrl, renderPresentationToMarkdown, renderPresentationToReact };
54
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","names":[],"sources":["../../src/registry/utils.ts"],"sourcesContent":["import { renderFeaturePresentation } from '@contractspec/lib.contracts/client/react/feature-render';\nimport type { PresentationSpec } from '@contractspec/lib.contracts/presentations';\nimport type React from 'react';\nimport { presentationEngine } from './engine';\nimport { componentMap } from './registry';\nimport type { ComponentMap } from './types';\n\n/**\n * Render a presentation descriptor to markdown.\n * Returns the markdown content as a string.\n */\nexport async function renderPresentationToMarkdown(\n descriptor: PresentationSpec\n): Promise<string> {\n const result = await presentationEngine.render<{\n mimeType: string;\n body: string;\n }>('markdown', descriptor);\n\n return result.body;\n}\n\n/**\n * Render a presentation descriptor to React element.\n * Returns the React element or null if component not found.\n */\nexport async function renderPresentationToReact(\n descriptor: PresentationSpec,\n customComponentMap?: ComponentMap\n): Promise<React.ReactElement | null> {\n const map = customComponentMap ?? componentMap;\n const element = await renderFeaturePresentation(\n presentationEngine,\n 'react',\n descriptor,\n {\n componentMap: map,\n }\n );\n\n if (element && typeof element === 'object' && 'type' in element) {\n return element as React.ReactElement;\n }\n\n return null;\n}\n\n/**\n * Get markdown URL for a given route.\n * Uses llms. subdomain and .md extension.\n */\nexport function getMarkdownUrl(route: string, baseUrl?: string): string {\n const base = baseUrl ?? 'https://contractspec.io/mdx';\n const llmsBase = base.replace('contractspec.io', 'llms.contractspec.io');\n\n // Normalize route\n const normalizedRoute = route === '/' ? '/' : route.replace(/\\/$/, '');\n return `${llmsBase}${normalizedRoute}`;\n\n // Add .md extension if not root\n // const path = normalizedRoute === '/' ? '/index.md' : `${normalizedRoute}.md`;\n // return `${llmsBase}${path}`;\n}\n\n/**\n * Get AI chat URLs for various providers.\n */\nexport interface AIChatProvider {\n name: string;\n getUrl: (url: string) => string;\n}\n\nexport const aiChatProviders: AIChatProvider[] = [\n {\n name: 'ChatGPT',\n getUrl: (url: string) =>\n `https://chatgpt.com/?q=${encodeURIComponent(url)}`,\n },\n {\n name: 'Claude',\n getUrl: (url: string) =>\n `https://claude.ai/new?url=${encodeURIComponent(url)}`,\n },\n {\n name: 'Grok',\n getUrl: (url: string) =>\n `https://x.com/i/grok?url=${encodeURIComponent(url)}`,\n },\n {\n name: 'Mistral',\n getUrl: (url: string) =>\n `https://mistral.ai/chat?url=${encodeURIComponent(url)}`,\n },\n {\n name: 'Perplexity',\n getUrl: (url: string) =>\n `https://www.perplexity.ai/?q=${encodeURIComponent(url)}`,\n },\n];\n"],"mappings":";;;;;;;;;AAWA,eAAsB,6BACpB,YACiB;AAMjB,SALe,MAAM,mBAAmB,OAGrC,YAAY,WAAW,EAEZ;;;;;;AAOhB,eAAsB,0BACpB,YACA,oBACoC;CAEpC,MAAM,UAAU,MAAM,0BACpB,oBACA,SACA,YACA,EACE,cANQ,sBAAsB,cAO/B,CACF;AAED,KAAI,WAAW,OAAO,YAAY,YAAY,UAAU,QACtD,QAAO;AAGT,QAAO;;;;;;AAOT,SAAgB,eAAe,OAAe,SAA0B;AAMtE,QAAO,IALM,WAAW,+BACF,QAAQ,mBAAmB,uBAAuB,GAGhD,UAAU,MAAM,MAAM,MAAM,QAAQ,OAAO,GAAG;;AAgBxE,MAAa,kBAAoC;CAC/C;EACE,MAAM;EACN,SAAS,QACP,0BAA0B,mBAAmB,IAAI;EACpD;CACD;EACE,MAAM;EACN,SAAS,QACP,6BAA6B,mBAAmB,IAAI;EACvD;CACD;EACE,MAAM;EACN,SAAS,QACP,4BAA4B,mBAAmB,IAAI;EACtD;CACD;EACE,MAAM;EACN,SAAS,QACP,+BAA+B,mBAAmB,IAAI;EACzD;CACD;EACE,MAAM;EACN,SAAS,QACP,gCAAgC,mBAAmB,IAAI;EAC1D;CACF"}
package/package.json ADDED
@@ -0,0 +1,151 @@
1
+ {
2
+ "name": "@contractspec/bundle.marketing",
3
+ "version": "1.12.0",
4
+ "type": "module",
5
+ "scripts": {
6
+ "clean": "rm -rf dist",
7
+ "lint": "bun run lint:fix",
8
+ "lint:fix": "eslint src --fix",
9
+ "lint:check": "eslint src",
10
+ "build": "bun build:types && bun build:bundle",
11
+ "build:bundle": "tsdown",
12
+ "build:types": "tsc --noEmit",
13
+ "publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
14
+ "publish:pkg:canary": "bun publish:pkg --tag canary"
15
+ },
16
+ "exports": {
17
+ ".": "./src/index.ts",
18
+ "./components/marketing": "./src/components/marketing/index.ts",
19
+ "./components/marketing/ChangelogPage": "./src/components/marketing/ChangelogPage.tsx",
20
+ "./components/marketing/CofounderPage": "./src/components/marketing/CofounderPage.tsx",
21
+ "./components/marketing/ContactClient": "./src/components/marketing/ContactClient.tsx",
22
+ "./components/marketing/ContributePage": "./src/components/marketing/ContributePage.tsx",
23
+ "./components/marketing/DesignPartnerPage": "./src/components/marketing/DesignPartnerPage.tsx",
24
+ "./components/marketing/LandingPage": "./src/components/marketing/LandingPage.tsx",
25
+ "./components/marketing/pricing-thinking-modal": "./src/components/marketing/pricing-thinking-modal.tsx",
26
+ "./components/marketing/PricingClient": "./src/components/marketing/PricingClient.tsx",
27
+ "./components/marketing/ProductClientPage": "./src/components/marketing/ProductClientPage.tsx",
28
+ "./components/marketing/sections/AudienceSection": "./src/components/marketing/sections/AudienceSection.tsx",
29
+ "./components/marketing/sections/CorePositioningSection": "./src/components/marketing/sections/CorePositioningSection.tsx",
30
+ "./components/marketing/sections/CtaSection": "./src/components/marketing/sections/CtaSection.tsx",
31
+ "./components/marketing/sections/DevelopersSection": "./src/components/marketing/sections/DevelopersSection.tsx",
32
+ "./components/marketing/sections/FearsSection": "./src/components/marketing/sections/FearsSection.tsx",
33
+ "./components/marketing/sections/HeroMarketingSection": "./src/components/marketing/sections/HeroMarketingSection.tsx",
34
+ "./components/marketing/sections/IconGridSection": "./src/components/marketing/sections/IconGridSection.tsx",
35
+ "./components/marketing/sections/OutputsSection": "./src/components/marketing/sections/OutputsSection.tsx",
36
+ "./components/marketing/sections/ProblemSection": "./src/components/marketing/sections/ProblemSection.tsx",
37
+ "./components/marketing/sections/SolutionSection": "./src/components/marketing/sections/SolutionSection.tsx",
38
+ "./components/marketing/sections/StepsSection": "./src/components/marketing/sections/StepsSection.tsx",
39
+ "./components/marketing/waitlist-section": "./src/components/marketing/waitlist-section.tsx",
40
+ "./components/templates": "./src/components/templates/index.ts",
41
+ "./components/templates/TemplatesClientPage": "./src/components/templates/TemplatesClientPage.tsx",
42
+ "./components/templates/TemplatesPage": "./src/components/templates/TemplatesPage.tsx",
43
+ "./components/templates/TemplatesPreviewModal": "./src/components/templates/TemplatesPreviewModal.tsx",
44
+ "./libs/email/client": "./src/libs/email/client.ts",
45
+ "./libs/email/contact": "./src/libs/email/contact.ts",
46
+ "./libs/email/newsletter": "./src/libs/email/newsletter.ts",
47
+ "./libs/email/types": "./src/libs/email/types.ts",
48
+ "./libs/email/utils": "./src/libs/email/utils.ts",
49
+ "./libs/email/waitlist": "./src/libs/email/waitlist.ts",
50
+ "./libs/email/waitlist-application": "./src/libs/email/waitlist-application.ts",
51
+ "./libs/pricing-examples": "./src/libs/pricing-examples.ts",
52
+ "./registry": "./src/registry/index.ts",
53
+ "./registry/engine": "./src/registry/engine.ts",
54
+ "./registry/factory": "./src/registry/factory.ts",
55
+ "./registry/registry": "./src/registry/registry.ts",
56
+ "./registry/registry-docs": "./src/registry/registry-docs.ts",
57
+ "./registry/registry-landing": "./src/registry/registry-landing.ts",
58
+ "./registry/types": "./src/registry/types.ts",
59
+ "./registry/utils": "./src/registry/utils.ts",
60
+ "./*": "./*"
61
+ },
62
+ "types": "./dist/index.d.ts",
63
+ "dependencies": {
64
+ "@contractspec/bundle.library": "1.12.0",
65
+ "@contractspec/example.agent-console": "1.57.0",
66
+ "@contractspec/example.analytics-dashboard": "1.57.0",
67
+ "@contractspec/example.crm-pipeline": "1.57.0",
68
+ "@contractspec/example.integration-hub": "1.57.0",
69
+ "@contractspec/example.marketplace": "1.57.0",
70
+ "@contractspec/example.saas-boilerplate": "1.57.0",
71
+ "@contractspec/example.workflow-system": "1.57.0",
72
+ "@contractspec/lib.contracts": "1.57.0",
73
+ "@contractspec/lib.design-system": "1.57.0",
74
+ "@contractspec/lib.email": "1.11.0",
75
+ "@contractspec/lib.example-shared-ui": "1.11.0",
76
+ "@contractspec/lib.logger": "1.57.0",
77
+ "@contractspec/lib.runtime-sandbox": "0.12.0",
78
+ "@contractspec/lib.ui-kit-core": "1.57.0",
79
+ "@contractspec/lib.ui-kit-web": "1.57.0",
80
+ "@contractspec/lib.ui-link": "1.57.0",
81
+ "@contractspec/module.examples": "1.57.0",
82
+ "@electric-sql/pglite": "^0.3.14",
83
+ "@hookform/resolvers": "^5.2.2",
84
+ "@scaleway/sdk": "^3.1.5",
85
+ "@scaleway/sdk-client": "^2.1.0",
86
+ "class-variance-authority": "^0.7.1",
87
+ "framer-motion": "^12.33.0",
88
+ "lucide-react": "^0.563.0",
89
+ "next": "16.1.6",
90
+ "react": "19.2.4",
91
+ "react-hook-form": "^7.70.0",
92
+ "zod": "^4.3.5"
93
+ },
94
+ "devDependencies": {
95
+ "@types/react": "~19.2.13",
96
+ "@contractspec/tool.tsdown": "1.57.0",
97
+ "@contractspec/tool.typescript": "1.57.0",
98
+ "tsdown": "^0.20.3",
99
+ "typescript": "^5.9.3"
100
+ },
101
+ "publishConfig": {
102
+ "access": "public",
103
+ "registry": "https://registry.npmjs.org/",
104
+ "exports": {
105
+ ".": "./dist/index.js",
106
+ "./components/marketing": "./dist/components/marketing/index.js",
107
+ "./components/marketing/ChangelogPage": "./dist/components/marketing/ChangelogPage.js",
108
+ "./components/marketing/CofounderPage": "./dist/components/marketing/CofounderPage.js",
109
+ "./components/marketing/ContactClient": "./dist/components/marketing/ContactClient.js",
110
+ "./components/marketing/ContributePage": "./dist/components/marketing/ContributePage.js",
111
+ "./components/marketing/DesignPartnerPage": "./dist/components/marketing/DesignPartnerPage.js",
112
+ "./components/marketing/LandingPage": "./dist/components/marketing/LandingPage.js",
113
+ "./components/marketing/pricing-thinking-modal": "./dist/components/marketing/pricing-thinking-modal.js",
114
+ "./components/marketing/PricingClient": "./dist/components/marketing/PricingClient.js",
115
+ "./components/marketing/ProductClientPage": "./dist/components/marketing/ProductClientPage.js",
116
+ "./components/marketing/sections/AudienceSection": "./dist/components/marketing/sections/AudienceSection.js",
117
+ "./components/marketing/sections/CorePositioningSection": "./dist/components/marketing/sections/CorePositioningSection.js",
118
+ "./components/marketing/sections/CtaSection": "./dist/components/marketing/sections/CtaSection.js",
119
+ "./components/marketing/sections/DevelopersSection": "./dist/components/marketing/sections/DevelopersSection.js",
120
+ "./components/marketing/sections/FearsSection": "./dist/components/marketing/sections/FearsSection.js",
121
+ "./components/marketing/sections/HeroMarketingSection": "./dist/components/marketing/sections/HeroMarketingSection.js",
122
+ "./components/marketing/sections/IconGridSection": "./dist/components/marketing/sections/IconGridSection.js",
123
+ "./components/marketing/sections/OutputsSection": "./dist/components/marketing/sections/OutputsSection.js",
124
+ "./components/marketing/sections/ProblemSection": "./dist/components/marketing/sections/ProblemSection.js",
125
+ "./components/marketing/sections/SolutionSection": "./dist/components/marketing/sections/SolutionSection.js",
126
+ "./components/marketing/sections/StepsSection": "./dist/components/marketing/sections/StepsSection.js",
127
+ "./components/marketing/waitlist-section": "./dist/components/marketing/waitlist-section.js",
128
+ "./components/templates": "./dist/components/templates/index.js",
129
+ "./components/templates/TemplatesClientPage": "./dist/components/templates/TemplatesClientPage.js",
130
+ "./components/templates/TemplatesPage": "./dist/components/templates/TemplatesPage.js",
131
+ "./components/templates/TemplatesPreviewModal": "./dist/components/templates/TemplatesPreviewModal.js",
132
+ "./libs/email/client": "./dist/libs/email/client.js",
133
+ "./libs/email/contact": "./dist/libs/email/contact.js",
134
+ "./libs/email/newsletter": "./dist/libs/email/newsletter.js",
135
+ "./libs/email/types": "./dist/libs/email/types.js",
136
+ "./libs/email/utils": "./dist/libs/email/utils.js",
137
+ "./libs/email/waitlist": "./dist/libs/email/waitlist.js",
138
+ "./libs/email/waitlist-application": "./dist/libs/email/waitlist-application.js",
139
+ "./libs/pricing-examples": "./dist/libs/pricing-examples.js",
140
+ "./registry": "./dist/registry/index.js",
141
+ "./registry/engine": "./dist/registry/engine.js",
142
+ "./registry/factory": "./dist/registry/factory.js",
143
+ "./registry/registry": "./dist/registry/registry.js",
144
+ "./registry/registry-docs": "./dist/registry/registry-docs.js",
145
+ "./registry/registry-landing": "./dist/registry/registry-landing.js",
146
+ "./registry/types": "./dist/registry/types.js",
147
+ "./registry/utils": "./dist/registry/utils.js",
148
+ "./*": "./*"
149
+ }
150
+ }
151
+ }
@@ -0,0 +1,110 @@
1
+ // export const metadata: Metadata = {
2
+ // title: 'Changelog: ContractSpec',
3
+ // description:
4
+ // 'Updates and releases for ContractSpec. New features, improvements, and breaking changes for the spec-first compiler.',
5
+ // keywords: [
6
+ // 'changelog',
7
+ // 'updates',
8
+ // 'releases',
9
+ // 'features',
10
+ // 'spec-first compiler',
11
+ // 'AI code stabilization',
12
+ // ],
13
+ // openGraph: {
14
+ // title: 'Changelog: ContractSpec',
15
+ // description: 'Latest releases and improvements to ContractSpec.',
16
+ // url: 'https://contractspec.io/changelog',
17
+ // type: 'website',
18
+ // },
19
+ // alternates: {
20
+ // canonical: 'https://contractspec.io/changelog',
21
+ // },
22
+ // };
23
+
24
+ // export const metadata: Metadata = {
25
+ // title: 'Changelog: ContractSpec',
26
+ // ...
27
+ // };
28
+
29
+ export interface ChangelogEntry {
30
+ version: string;
31
+ date: string;
32
+ isBreaking: boolean;
33
+ packages: {
34
+ name: string;
35
+ changes: string[];
36
+ }[];
37
+ }
38
+
39
+ interface ChangelogPageProps {
40
+ entries: ChangelogEntry[];
41
+ }
42
+
43
+ export function ChangelogPage({ entries }: ChangelogPageProps) {
44
+ return (
45
+ <main>
46
+ {/* Hero */}
47
+ <section className="section-padding hero-gradient border-border relative border-b">
48
+ <div className="mx-auto max-w-4xl space-y-6 text-center">
49
+ <h1 className="text-5xl leading-tight font-bold md:text-6xl">
50
+ Changelog
51
+ </h1>
52
+ <p className="text-muted-foreground text-lg">
53
+ Latest releases and improvements to ContractSpec.
54
+ </p>
55
+ </div>
56
+ </section>
57
+
58
+ {/* Timeline */}
59
+ <section className="section-padding">
60
+ <div className="mx-auto max-w-3xl space-y-8">
61
+ {entries.map((entry, i) => (
62
+ <div
63
+ key={i}
64
+ className="card-subtle flex flex-col gap-6 p-8 md:flex-row md:items-start"
65
+ >
66
+ {/* Left: Version & Date */}
67
+ <div className="md:w-48 md:flex-shrink-0">
68
+ <div className="sticky top-24">
69
+ <h3 className="text-2xl font-bold tracking-tight">
70
+ {entry.version}
71
+ </h3>
72
+ <time className="text-muted-foreground mt-1 block text-sm font-medium">
73
+ {entry.date}
74
+ </time>
75
+ {entry.isBreaking && (
76
+ <span className="mt-2 inline-flex items-center rounded-full border border-red-500/50 bg-red-500/10 px-2.5 py-0.5 text-xs font-semibold text-red-500">
77
+ Breaking Change
78
+ </span>
79
+ )}
80
+ </div>
81
+ </div>
82
+
83
+ {/* Right: Changes per package */}
84
+ <div className="flex-1 space-y-6">
85
+ {entry.packages.map((pkg, j) => (
86
+ <div key={j} className="space-y-3">
87
+ <h4 className="font-mono text-sm font-semibold text-violet-400">
88
+ {pkg.name}
89
+ </h4>
90
+ <ul className="space-y-2">
91
+ {pkg.changes.map((change, k) => (
92
+ <li
93
+ key={k}
94
+ className="text-muted-foreground flex items-start gap-3 text-base leading-relaxed"
95
+ >
96
+ <span className="mt-1.5 h-1.5 w-1.5 flex-shrink-0 rounded-full bg-violet-500/50" />
97
+ <span>{change}</span>
98
+ </li>
99
+ ))}
100
+ </ul>
101
+ </div>
102
+ ))}
103
+ </div>
104
+ </div>
105
+ ))}
106
+ </div>
107
+ </section>
108
+ </main>
109
+ );
110
+ }