@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.
- package/.turbo/turbo-build$colon$types.log +1 -0
- package/.turbo/turbo-build.log +175 -0
- package/.turbo/turbo-lint.log +3 -0
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +416 -0
- package/README.md +57 -0
- package/dist/components/marketing/ChangelogPage.d.ts +21 -0
- package/dist/components/marketing/ChangelogPage.d.ts.map +1 -0
- package/dist/components/marketing/ChangelogPage.js +65 -0
- package/dist/components/marketing/ChangelogPage.js.map +1 -0
- package/dist/components/marketing/CofounderPage.d.ts +7 -0
- package/dist/components/marketing/CofounderPage.d.ts.map +1 -0
- package/dist/components/marketing/CofounderPage.js +468 -0
- package/dist/components/marketing/CofounderPage.js.map +1 -0
- package/dist/components/marketing/ContactClient.d.ts +7 -0
- package/dist/components/marketing/ContactClient.d.ts.map +1 -0
- package/dist/components/marketing/ContactClient.js +158 -0
- package/dist/components/marketing/ContactClient.js.map +1 -0
- package/dist/components/marketing/ContributePage.d.ts +9 -0
- package/dist/components/marketing/ContributePage.d.ts.map +1 -0
- package/dist/components/marketing/ContributePage.js +362 -0
- package/dist/components/marketing/ContributePage.js.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts +9 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.js +215 -0
- package/dist/components/marketing/DesignPartnerPage.js.map +1 -0
- package/dist/components/marketing/LandingPage.d.ts +7 -0
- package/dist/components/marketing/LandingPage.d.ts.map +1 -0
- package/dist/components/marketing/LandingPage.js +38 -0
- package/dist/components/marketing/LandingPage.js.map +1 -0
- package/dist/components/marketing/PricingClient.d.ts +7 -0
- package/dist/components/marketing/PricingClient.d.ts.map +1 -0
- package/dist/components/marketing/PricingClient.js +521 -0
- package/dist/components/marketing/PricingClient.js.map +1 -0
- package/dist/components/marketing/ProductClientPage.d.ts +7 -0
- package/dist/components/marketing/ProductClientPage.d.ts.map +1 -0
- package/dist/components/marketing/ProductClientPage.js +460 -0
- package/dist/components/marketing/ProductClientPage.js.map +1 -0
- package/dist/components/marketing/index.d.ts +11 -0
- package/dist/components/marketing/index.js +12 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts +16 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -0
- package/dist/components/marketing/pricing-thinking-modal.js +202 -0
- package/dist/components/marketing/pricing-thinking-modal.js.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts +7 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.js +68 -0
- package/dist/components/marketing/sections/AudienceSection.js.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts +7 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.js +59 -0
- package/dist/components/marketing/sections/CorePositioningSection.js.map +1 -0
- package/dist/components/marketing/sections/CtaSection.d.ts +7 -0
- package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CtaSection.js +54 -0
- package/dist/components/marketing/sections/CtaSection.js.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts +7 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.js +45 -0
- package/dist/components/marketing/sections/DevelopersSection.js.map +1 -0
- package/dist/components/marketing/sections/FearsSection.d.ts +7 -0
- package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/FearsSection.js +48 -0
- package/dist/components/marketing/sections/FearsSection.js.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts +7 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js +77 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts +45 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.js +44 -0
- package/dist/components/marketing/sections/IconGridSection.js.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts +7 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.js +59 -0
- package/dist/components/marketing/sections/OutputsSection.js.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts +7 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.js +46 -0
- package/dist/components/marketing/sections/ProblemSection.js.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts +7 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.js +46 -0
- package/dist/components/marketing/sections/SolutionSection.js.map +1 -0
- package/dist/components/marketing/sections/StepsSection.d.ts +7 -0
- package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/StepsSection.js +52 -0
- package/dist/components/marketing/sections/StepsSection.js.map +1 -0
- package/dist/components/marketing/waitlist-section.d.ts +15 -0
- package/dist/components/marketing/waitlist-section.d.ts.map +1 -0
- package/dist/components/marketing/waitlist-section.js +578 -0
- package/dist/components/marketing/waitlist-section.js.map +1 -0
- package/dist/components/templates/TemplatesClientPage.d.ts +7 -0
- package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesClientPage.js +625 -0
- package/dist/components/templates/TemplatesClientPage.js.map +1 -0
- package/dist/components/templates/TemplatesPage.d.ts +7 -0
- package/dist/components/templates/TemplatesPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPage.js +125 -0
- package/dist/components/templates/TemplatesPage.js.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts +15 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.js +137 -0
- package/dist/components/templates/TemplatesPreviewModal.js.map +1 -0
- package/dist/components/templates/index.d.ts +4 -0
- package/dist/components/templates/index.js +5 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +28 -0
- package/dist/libs/email/client.d.ts +15 -0
- package/dist/libs/email/client.d.ts.map +1 -0
- package/dist/libs/email/client.js +113 -0
- package/dist/libs/email/client.js.map +1 -0
- package/dist/libs/email/contact.d.ts +7 -0
- package/dist/libs/email/contact.d.ts.map +1 -0
- package/dist/libs/email/contact.js +71 -0
- package/dist/libs/email/contact.js.map +1 -0
- package/dist/libs/email/newsletter.d.ts +7 -0
- package/dist/libs/email/newsletter.d.ts.map +1 -0
- package/dist/libs/email/newsletter.js +95 -0
- package/dist/libs/email/newsletter.js.map +1 -0
- package/dist/libs/email/types.d.ts +53 -0
- package/dist/libs/email/types.d.ts.map +1 -0
- package/dist/libs/email/types.js +1 -0
- package/dist/libs/email/utils.d.ts +6 -0
- package/dist/libs/email/utils.d.ts.map +1 -0
- package/dist/libs/email/utils.js +7 -0
- package/dist/libs/email/utils.js.map +1 -0
- package/dist/libs/email/waitlist-application.d.ts +7 -0
- package/dist/libs/email/waitlist-application.d.ts.map +1 -0
- package/dist/libs/email/waitlist-application.js +170 -0
- package/dist/libs/email/waitlist-application.js.map +1 -0
- package/dist/libs/email/waitlist.d.ts +7 -0
- package/dist/libs/email/waitlist.d.ts.map +1 -0
- package/dist/libs/email/waitlist.js +105 -0
- package/dist/libs/email/waitlist.js.map +1 -0
- package/dist/libs/pricing-examples.d.ts +22 -0
- package/dist/libs/pricing-examples.d.ts.map +1 -0
- package/dist/libs/pricing-examples.js +21 -0
- package/dist/libs/pricing-examples.js.map +1 -0
- package/dist/registry/engine.d.ts +17 -0
- package/dist/registry/engine.d.ts.map +1 -0
- package/dist/registry/engine.js +24 -0
- package/dist/registry/engine.js.map +1 -0
- package/dist/registry/factory.d.ts +64 -0
- package/dist/registry/factory.d.ts.map +1 -0
- package/dist/registry/factory.js +61 -0
- package/dist/registry/factory.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry-docs.d.ts +15 -0
- package/dist/registry/registry-docs.d.ts.map +1 -0
- package/dist/registry/registry-docs.js +305 -0
- package/dist/registry/registry-docs.js.map +1 -0
- package/dist/registry/registry-landing.d.ts +19 -0
- package/dist/registry/registry-landing.d.ts.map +1 -0
- package/dist/registry/registry-landing.js +95 -0
- package/dist/registry/registry-landing.js.map +1 -0
- package/dist/registry/registry.d.ts +30 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +61 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/types.d.ts +19 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +0 -0
- package/dist/registry/utils.d.ts +31 -0
- package/dist/registry/utils.d.ts.map +1 -0
- package/dist/registry/utils.js +54 -0
- package/dist/registry/utils.js.map +1 -0
- package/package.json +151 -0
- package/src/components/marketing/ChangelogPage.tsx +110 -0
- package/src/components/marketing/CofounderPage.tsx +409 -0
- package/src/components/marketing/ContactClient.tsx +174 -0
- package/src/components/marketing/ContributePage.tsx +319 -0
- package/src/components/marketing/DesignPartnerPage.tsx +181 -0
- package/src/components/marketing/LandingPage.tsx +30 -0
- package/src/components/marketing/PricingClient.tsx +446 -0
- package/src/components/marketing/ProductClientPage.tsx +391 -0
- package/src/components/marketing/index.ts +10 -0
- package/src/components/marketing/pricing-thinking-modal.tsx +224 -0
- package/src/components/marketing/sections/AudienceSection.tsx +66 -0
- package/src/components/marketing/sections/CorePositioningSection.tsx +44 -0
- package/src/components/marketing/sections/CtaSection.tsx +57 -0
- package/src/components/marketing/sections/DevelopersSection.tsx +38 -0
- package/src/components/marketing/sections/FearsSection.tsx +45 -0
- package/src/components/marketing/sections/HeroMarketingSection.tsx +73 -0
- package/src/components/marketing/sections/IconGridSection.tsx +91 -0
- package/src/components/marketing/sections/OutputsSection.tsx +59 -0
- package/src/components/marketing/sections/ProblemSection.tsx +47 -0
- package/src/components/marketing/sections/SolutionSection.tsx +47 -0
- package/src/components/marketing/sections/StepsSection.tsx +55 -0
- package/src/components/marketing/waitlist-section.tsx +606 -0
- package/src/components/templates/TemplatesClientPage.tsx +711 -0
- package/src/components/templates/TemplatesPage.tsx +129 -0
- package/src/components/templates/TemplatesPreviewModal.tsx +260 -0
- package/src/components/templates/index.ts +3 -0
- package/src/index.ts +15 -0
- package/src/libs/email/client.test.ts +107 -0
- package/src/libs/email/client.ts +146 -0
- package/src/libs/email/contact.ts +80 -0
- package/src/libs/email/newsletter.ts +108 -0
- package/src/libs/email/types.ts +59 -0
- package/src/libs/email/utils.ts +8 -0
- package/src/libs/email/waitlist-application.ts +192 -0
- package/src/libs/email/waitlist.ts +118 -0
- package/src/libs/pricing-examples.ts +19 -0
- package/src/registry/engine.ts +38 -0
- package/src/registry/factory.ts +110 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/registry-docs.ts +843 -0
- package/src/registry/registry-landing.ts +118 -0
- package/src/registry/registry.ts +85 -0
- package/src/registry/types.ts +17 -0
- package/src/registry/utils.ts +99 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- 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
|
+
}
|