@contractspec/bundle.library 3.9.6 → 3.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +154 -150
- package/CHANGELOG.md +44 -0
- package/dist/components/docs/DocsIndexPage.js +2 -2
- package/dist/components/docs/docsManifest.js +1 -1
- package/dist/components/docs/guides/GuideContractDrivenFormsPage.content.d.ts +3 -0
- package/dist/components/docs/guides/GuideContractDrivenFormsPage.content.js +95 -0
- package/dist/components/docs/guides/GuideContractDrivenFormsPage.d.ts +1 -0
- package/dist/components/docs/guides/GuideContractDrivenFormsPage.js +95 -0
- package/dist/components/docs/guides/GuideSpecValidationTypingPage.js +1 -1
- package/dist/components/docs/guides/GuidesIndexPage.js +2 -2
- package/dist/components/docs/guides/guides.docblocks.js +3 -1
- package/dist/components/docs/guides/index.d.ts +1 -0
- package/dist/components/docs/guides/index.js +139 -44
- package/dist/components/docs/index.js +352 -257
- package/dist/index.js +363 -268
- package/dist/libs/posthog/client.js +1 -1
- package/dist/node/components/docs/DocsIndexPage.js +2 -2
- package/dist/node/components/docs/docsManifest.js +1 -1
- package/dist/node/components/docs/guides/GuideContractDrivenFormsPage.content.js +94 -0
- package/dist/node/components/docs/guides/GuideContractDrivenFormsPage.js +94 -0
- package/dist/node/components/docs/guides/GuideSpecValidationTypingPage.js +1 -1
- package/dist/node/components/docs/guides/GuidesIndexPage.js +2 -2
- package/dist/node/components/docs/guides/guides.docblocks.js +3 -1
- package/dist/node/components/docs/guides/index.js +139 -44
- package/dist/node/components/docs/index.js +352 -257
- package/dist/node/index.js +363 -268
- package/dist/node/libs/posthog/client.js +1 -1
- package/package.json +47 -23
- package/src/components/docs/docsManifest.ts +12 -0
- package/src/components/docs/generated/docs-index._common.json +2008 -1699
- package/src/components/docs/generated/docs-index.agent-console.json +377 -377
- package/src/components/docs/generated/docs-index.ai-chat-assistant.json +17 -17
- package/src/components/docs/generated/docs-index.ai-chat.json +105 -105
- package/src/components/docs/generated/docs-index.ai-support-bot.json +9 -9
- package/src/components/docs/generated/docs-index.analytics-dashboard.json +169 -169
- package/src/components/docs/generated/docs-index.app-config.json +137 -137
- package/src/components/docs/generated/docs-index.artisan-knowledge-product.json +17 -17
- package/src/components/docs/generated/docs-index.artisan-payments-stripe.json +33 -33
- package/src/components/docs/generated/docs-index.audit-trail.json +49 -49
- package/src/components/docs/generated/docs-index.calendar-google.json +9 -9
- package/src/components/docs/generated/docs-index.content-generation.json +9 -9
- package/src/components/docs/generated/docs-index.control-plane.json +17 -17
- package/src/components/docs/generated/docs-index.crm-pipeline.json +161 -161
- package/src/components/docs/generated/docs-index.data-grid-showcase.json +25 -25
- package/src/components/docs/generated/docs-index.defineExample.json +9 -9
- package/src/components/docs/generated/docs-index.email-gmail.json +9 -9
- package/src/components/docs/generated/docs-index.feature-flags.json +217 -217
- package/src/components/docs/generated/docs-index.files.json +177 -177
- package/src/components/docs/generated/docs-index.generated.ts +20 -20
- package/src/components/docs/generated/docs-index.harness-lab.json +9 -9
- package/src/components/docs/generated/docs-index.health.json +97 -97
- package/src/components/docs/generated/docs-index.identity-rbac.json +313 -313
- package/src/components/docs/generated/docs-index.in-app-docs.json +9 -9
- package/src/components/docs/generated/docs-index.integration-hub.json +265 -265
- package/src/components/docs/generated/docs-index.integration-posthog.json +9 -9
- package/src/components/docs/generated/docs-index.integration-stripe.json +9 -9
- package/src/components/docs/generated/docs-index.integration-supabase.json +9 -9
- package/src/components/docs/generated/docs-index.jobs.json +137 -137
- package/src/components/docs/generated/docs-index.kb-update-pipeline.json +129 -129
- package/src/components/docs/generated/docs-index.knowledge-canon.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-ambient-coach.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-crm-onboarding.json +49 -49
- package/src/components/docs/generated/docs-index.learning-journey-duo-drills.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-platform-tour.json +49 -49
- package/src/components/docs/generated/docs-index.learning-journey-quest-challenges.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-registry.json +33 -33
- package/src/components/docs/generated/docs-index.learning-journey-studio-onboarding.json +49 -49
- package/src/components/docs/generated/docs-index.learning-journey-ui-coaching.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-ui-gamified.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-ui-onboarding.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey-ui-shared.json +9 -9
- package/src/components/docs/generated/docs-index.learning-journey.json +241 -241
- package/src/components/docs/generated/docs-index.learning-patterns.json +9 -9
- package/src/components/docs/generated/docs-index.lifecycle-cli.json +9 -9
- package/src/components/docs/generated/docs-index.lifecycle-dashboard.json +9 -9
- package/src/components/docs/generated/docs-index.locale-jurisdiction-gate.json +65 -65
- package/src/components/docs/generated/docs-index.marketplace.json +337 -337
- package/src/components/docs/generated/docs-index.meeting-recorder-providers.json +9 -9
- package/src/components/docs/generated/docs-index.meeting-recorder.json +49 -49
- package/src/components/docs/generated/docs-index.messaging-agent-actions.json +17 -17
- package/src/components/docs/generated/docs-index.metrics.json +201 -201
- package/src/components/docs/generated/docs-index.minimal.json +17 -17
- package/src/components/docs/generated/docs-index.mobile-demo-landing.json +41 -41
- package/src/components/docs/generated/docs-index.notifications.json +65 -65
- package/src/components/docs/generated/docs-index.openbanking-powens.json +9 -9
- package/src/components/docs/generated/docs-index.openbanking.json +65 -65
- package/src/components/docs/generated/docs-index.opencode-cli.json +17 -17
- package/src/components/docs/generated/docs-index.personalization.json +9 -9
- package/src/components/docs/generated/docs-index.platform-acp.json +137 -137
- package/src/components/docs/generated/docs-index.platform-agent.json +201 -201
- package/src/components/docs/generated/docs-index.platform-context.json +121 -121
- package/src/components/docs/generated/docs-index.platform-control-plane.json +321 -321
- package/src/components/docs/generated/docs-index.platform-database.json +89 -89
- package/src/components/docs/generated/docs-index.platform-docs.json +161 -161
- package/src/components/docs/generated/docs-index.platform-harness.json +177 -177
- package/src/components/docs/generated/docs-index.platform-integrations.json +329 -329
- package/src/components/docs/generated/docs-index.platform-knowledge.json +57 -57
- package/src/components/docs/generated/docs-index.platform-provider-ranking.json +217 -217
- package/src/components/docs/generated/docs-index.pocket-family-office.json +129 -129
- package/src/components/docs/generated/docs-index.policy-safe-knowledge-assistant.json +9 -9
- package/src/components/docs/generated/docs-index.product-intent.json +9 -9
- package/src/components/docs/generated/docs-index.project-management-sync.json +9 -9
- package/src/components/docs/generated/docs-index.saas-boilerplate.json +209 -209
- package/src/components/docs/generated/docs-index.service-business-os.json +193 -193
- package/src/components/docs/generated/docs-index.team-hub.json +185 -185
- package/src/components/docs/generated/docs-index.unknown.json +521 -521
- package/src/components/docs/generated/docs-index.versioned-knowledge-base.json +81 -81
- package/src/components/docs/generated/docs-index.video-api-showcase.json +33 -33
- package/src/components/docs/generated/docs-index.video-docs-terminal.json +9 -9
- package/src/components/docs/generated/docs-index.video-marketing-clip.json +9 -9
- package/src/components/docs/generated/docs-index.visualization-showcase.json +17 -17
- package/src/components/docs/generated/docs-index.voice-providers.json +9 -9
- package/src/components/docs/generated/docs-index.wealth-snapshot.json +153 -153
- package/src/components/docs/generated/docs-index.workflow-system.json +433 -433
- package/src/components/docs/generated/docs-index.workspace-cli.json +9 -9
- package/src/components/docs/guides/GuideContractDrivenFormsPage.content.ts +98 -0
- package/src/components/docs/guides/GuideContractDrivenFormsPage.tsx +143 -0
- package/src/components/docs/guides/GuideSpecValidationTypingPage.tsx +2 -2
- package/src/components/docs/guides/GuidesIndexPage.tsx +7 -0
- package/src/components/docs/guides/guides.docblocks.ts +12 -0
- package/src/components/docs/guides/index.ts +1 -0
- package/src/libs/posthog/client.ts +11 -9
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
[
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
]
|
|
2
|
+
{
|
|
3
|
+
"id": "workspace-cli/workspace-cli",
|
|
4
|
+
"title": "workspace-cli",
|
|
5
|
+
"summary": "Core CLI operations for managing ContractSpec workspaces\n- **Type**: feature\n- **Version**: 1.0.0\n- **Stability**: stable\n- **Owners**: @lssm/core\n- **Tags**: cli, core\n- **File**: `packages/bundles/workspace/src/contracts/features/cli.feature.ts`",
|
|
6
|
+
"route": "/docs/reference/workspace-cli/workspace-cli",
|
|
7
|
+
"source": "generated",
|
|
8
|
+
"contentPath": "workspace-cli/workspace-cli.md"
|
|
9
|
+
}
|
|
10
|
+
]
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export const leadCaptureFormCode = `import {
|
|
2
|
+
defineFormSpec,
|
|
3
|
+
FormRegistry,
|
|
4
|
+
responsiveFormColumns,
|
|
5
|
+
} from "@contractspec/lib.contracts-spec/forms";
|
|
6
|
+
import { fromZod } from "@contractspec/lib.schema";
|
|
7
|
+
import { z } from "zod";
|
|
8
|
+
|
|
9
|
+
const LeadCaptureModel = fromZod(
|
|
10
|
+
z.object({
|
|
11
|
+
fullName: z.string().min(1),
|
|
12
|
+
email: z.string().email(),
|
|
13
|
+
company: z.string().min(1),
|
|
14
|
+
intent: z.enum(["demo", "pricing", "pilot"]),
|
|
15
|
+
notes: z.string().max(1000).optional(),
|
|
16
|
+
newsletter: z.boolean().optional(),
|
|
17
|
+
}),
|
|
18
|
+
{ name: "LeadCaptureModel" },
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
export const LeadCaptureForm = defineFormSpec({
|
|
22
|
+
meta: {
|
|
23
|
+
key: "marketing.lead.form",
|
|
24
|
+
version: "1.0.0",
|
|
25
|
+
title: "Lead capture form",
|
|
26
|
+
description: "Collect qualified OSS and Studio leads.",
|
|
27
|
+
domain: "marketing",
|
|
28
|
+
owners: ["@growth"],
|
|
29
|
+
tags: ["forms", "leads"],
|
|
30
|
+
stability: "experimental",
|
|
31
|
+
},
|
|
32
|
+
model: LeadCaptureModel,
|
|
33
|
+
layout: {
|
|
34
|
+
columns: responsiveFormColumns(2),
|
|
35
|
+
gap: "md",
|
|
36
|
+
flow: {
|
|
37
|
+
kind: "sections",
|
|
38
|
+
sections: [
|
|
39
|
+
{ key: "identity", titleI18n: "Who you are", fieldNames: ["fullName", "email", "company"] },
|
|
40
|
+
{ key: "request", titleI18n: "What you need", fieldNames: ["intent", "notes", "newsletter"] },
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
fields: [
|
|
45
|
+
{ kind: "text", name: "fullName", labelI18n: "Full name", required: true, autoComplete: "name" },
|
|
46
|
+
{ kind: "email", name: "email", labelI18n: "Work email", required: true, autoComplete: "email" },
|
|
47
|
+
{ kind: "text", name: "company", labelI18n: "Company", required: true, autoComplete: "organization" },
|
|
48
|
+
{
|
|
49
|
+
kind: "select",
|
|
50
|
+
name: "intent",
|
|
51
|
+
labelI18n: "Primary goal",
|
|
52
|
+
required: true,
|
|
53
|
+
options: [
|
|
54
|
+
{ labelI18n: "Book a demo", value: "demo" },
|
|
55
|
+
{ labelI18n: "Understand pricing", value: "pricing" },
|
|
56
|
+
{ labelI18n: "Plan a pilot", value: "pilot" },
|
|
57
|
+
],
|
|
58
|
+
},
|
|
59
|
+
{ kind: "textarea", name: "notes", labelI18n: "Context", rows: 4, layout: { colSpan: "full" } },
|
|
60
|
+
{ kind: "checkbox", name: "newsletter", labelI18n: "Send product updates" },
|
|
61
|
+
],
|
|
62
|
+
actions: [{ key: "submit", labelI18n: "Send request", op: { name: "lead.create", version: "1.0.0" } }],
|
|
63
|
+
policy: { flags: ["lead-capture"], pii: ["fullName", "email", "company", "notes"] },
|
|
64
|
+
renderHints: { ui: "shadcn", form: "react-hook-form" },
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
export const formRegistry = new FormRegistry().register(LeadCaptureForm);`;
|
|
68
|
+
|
|
69
|
+
export const leadCapturePanelCode = `"use client";
|
|
70
|
+
|
|
71
|
+
import { formRenderer } from "@contractspec/lib.design-system/renderers/form-contract";
|
|
72
|
+
import { LeadCaptureForm } from "../contracts/forms/lead-capture.form";
|
|
73
|
+
|
|
74
|
+
export function LeadCapturePanel() {
|
|
75
|
+
return formRenderer.render(LeadCaptureForm, {
|
|
76
|
+
defaultValues: { newsletter: true },
|
|
77
|
+
overrides: {
|
|
78
|
+
onSubmitOverride: async (values, actionKey) => {
|
|
79
|
+
await fetch("/api/leads", {
|
|
80
|
+
method: "POST",
|
|
81
|
+
headers: { "content-type": "application/json" },
|
|
82
|
+
body: JSON.stringify({ actionKey, values }),
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}`;
|
|
88
|
+
|
|
89
|
+
export const formShowcaseTemplateCode = `bun add @contractspec/example.form-showcase
|
|
90
|
+
|
|
91
|
+
# Full form-only example docs
|
|
92
|
+
open https://www.contractspec.io/docs/examples/form-showcase
|
|
93
|
+
|
|
94
|
+
# Template catalog filtered to forms
|
|
95
|
+
open https://www.contractspec.io/templates?tag=forms
|
|
96
|
+
|
|
97
|
+
# Sandbox spec preview
|
|
98
|
+
open https://www.contractspec.io/sandbox?template=form-showcase`;
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { CodeBlock } from '@contractspec/lib.design-system';
|
|
2
|
+
import { HStack, VStack } from '@contractspec/lib.design-system/layout';
|
|
3
|
+
import { List, ListItem } from '@contractspec/lib.design-system/list';
|
|
4
|
+
import {
|
|
5
|
+
Code,
|
|
6
|
+
H1,
|
|
7
|
+
H2,
|
|
8
|
+
H3,
|
|
9
|
+
P,
|
|
10
|
+
Text,
|
|
11
|
+
} from '@contractspec/lib.design-system/typography';
|
|
12
|
+
import Link from '@contractspec/lib.ui-link';
|
|
13
|
+
import { ChevronRight } from 'lucide-react';
|
|
14
|
+
import { StudioPrompt } from '../shared/StudioPrompt';
|
|
15
|
+
import {
|
|
16
|
+
formShowcaseTemplateCode,
|
|
17
|
+
leadCaptureFormCode,
|
|
18
|
+
leadCapturePanelCode,
|
|
19
|
+
} from './GuideContractDrivenFormsPage.content';
|
|
20
|
+
|
|
21
|
+
export function GuideContractDrivenFormsPage() {
|
|
22
|
+
return (
|
|
23
|
+
<VStack className="space-y-8">
|
|
24
|
+
<VStack className="space-y-3">
|
|
25
|
+
<H1 className="font-bold text-4xl">Build a contract-driven form</H1>
|
|
26
|
+
<P className="text-lg text-muted-foreground">
|
|
27
|
+
Define form data, fields, layout, policy, and submit behavior once,
|
|
28
|
+
then let your app render from the same ContractSpec surface.
|
|
29
|
+
</P>
|
|
30
|
+
</VStack>
|
|
31
|
+
|
|
32
|
+
<VStack className="card-subtle space-y-4 p-6">
|
|
33
|
+
<H2 className="font-bold text-2xl">What you'll build</H2>
|
|
34
|
+
<List className="space-y-2 text-muted-foreground text-sm">
|
|
35
|
+
<ListItem>
|
|
36
|
+
<Text>A schema-backed FormSpec for a lead capture form.</Text>
|
|
37
|
+
</ListItem>
|
|
38
|
+
<ListItem>
|
|
39
|
+
<Text>
|
|
40
|
+
A FormRegistry that exposes the latest version by stable key.
|
|
41
|
+
</Text>
|
|
42
|
+
</ListItem>
|
|
43
|
+
<ListItem>
|
|
44
|
+
<Text>
|
|
45
|
+
A React renderer that keeps UI, validation, and policy aligned.
|
|
46
|
+
</Text>
|
|
47
|
+
</ListItem>
|
|
48
|
+
</List>
|
|
49
|
+
</VStack>
|
|
50
|
+
|
|
51
|
+
<VStack className="space-y-6">
|
|
52
|
+
<VStack className="space-y-3">
|
|
53
|
+
<H2 className="font-bold text-2xl">1) Define the form spec</H2>
|
|
54
|
+
<P className="text-muted-foreground text-sm">
|
|
55
|
+
Create <Code>src/contracts/forms/lead-capture.form.ts</Code>:
|
|
56
|
+
</P>
|
|
57
|
+
<CodeBlock
|
|
58
|
+
language="typescript"
|
|
59
|
+
filename="src/contracts/forms/lead-capture.form.ts"
|
|
60
|
+
code={leadCaptureFormCode}
|
|
61
|
+
/>
|
|
62
|
+
</VStack>
|
|
63
|
+
|
|
64
|
+
<VStack className="card-subtle space-y-3 p-6">
|
|
65
|
+
<H3 className="font-semibold text-lg">Need every form field?</H3>
|
|
66
|
+
<P className="text-muted-foreground text-sm">
|
|
67
|
+
Start from the{' '}
|
|
68
|
+
<Link href="/docs/examples/form-showcase">
|
|
69
|
+
Form Showcase example
|
|
70
|
+
</Link>{' '}
|
|
71
|
+
or the{' '}
|
|
72
|
+
<Link href="/templates?tag=forms">form template catalog</Link>. It
|
|
73
|
+
is focused only on forms and covers field kinds, section layouts,
|
|
74
|
+
step layouts, arrays, groups, conditionals, and validation hints.
|
|
75
|
+
</P>
|
|
76
|
+
<CodeBlock
|
|
77
|
+
language="bash"
|
|
78
|
+
filename="form-showcase-template"
|
|
79
|
+
code={formShowcaseTemplateCode}
|
|
80
|
+
/>
|
|
81
|
+
</VStack>
|
|
82
|
+
|
|
83
|
+
<VStack className="space-y-3">
|
|
84
|
+
<H2 className="font-bold text-2xl">2) Render from the contract</H2>
|
|
85
|
+
<P className="text-muted-foreground text-sm">
|
|
86
|
+
Use the shared renderer, or provide your own driver if your app uses
|
|
87
|
+
a different component library.
|
|
88
|
+
</P>
|
|
89
|
+
<CodeBlock
|
|
90
|
+
language="tsx"
|
|
91
|
+
filename="src/components/LeadCapturePanel.tsx"
|
|
92
|
+
code={leadCapturePanelCode}
|
|
93
|
+
/>
|
|
94
|
+
</VStack>
|
|
95
|
+
|
|
96
|
+
<VStack className="space-y-3">
|
|
97
|
+
<H2 className="font-bold text-2xl">3) Validate and evolve</H2>
|
|
98
|
+
<CodeBlock
|
|
99
|
+
language="bash"
|
|
100
|
+
filename="validate-form"
|
|
101
|
+
code={`contractspec validate src/contracts/forms/lead-capture.form.ts`}
|
|
102
|
+
/>
|
|
103
|
+
<P className="text-muted-foreground text-sm">
|
|
104
|
+
Expected output: <Code>Validation passed</Code>. When the form
|
|
105
|
+
becomes public contract surface, version changes deliberately
|
|
106
|
+
instead of editing field meaning in place.
|
|
107
|
+
</P>
|
|
108
|
+
</VStack>
|
|
109
|
+
|
|
110
|
+
<VStack className="card-subtle space-y-3 p-6">
|
|
111
|
+
<H3 className="font-semibold text-lg">Repo tutorial</H3>
|
|
112
|
+
<P className="text-muted-foreground text-sm">
|
|
113
|
+
The repository guide adds the longer implementation checklist,
|
|
114
|
+
custom renderer notes, and rollout rules.
|
|
115
|
+
</P>
|
|
116
|
+
<CodeBlock
|
|
117
|
+
language="bash"
|
|
118
|
+
filename="repo-guide"
|
|
119
|
+
code={`open docs/tutorials/contract-driven-forms.md`}
|
|
120
|
+
/>
|
|
121
|
+
</VStack>
|
|
122
|
+
|
|
123
|
+
<StudioPrompt
|
|
124
|
+
title="Need governed form changes?"
|
|
125
|
+
body="Studio can connect form edits to customer evidence, approval packets, and rollout checks before teams regenerate public surfaces."
|
|
126
|
+
/>
|
|
127
|
+
</VStack>
|
|
128
|
+
|
|
129
|
+
<HStack className="flex items-center gap-4 pt-4">
|
|
130
|
+
<Link
|
|
131
|
+
href="/docs/guides/generate-docs-clients-schemas"
|
|
132
|
+
className="btn-primary"
|
|
133
|
+
>
|
|
134
|
+
<Text>Next: Generate docs + clients</Text>
|
|
135
|
+
<ChevronRight size={16} />
|
|
136
|
+
</Link>
|
|
137
|
+
<Link href="/docs/guides" className="btn-ghost">
|
|
138
|
+
<Text>Back to guides</Text>
|
|
139
|
+
</Link>
|
|
140
|
+
</HStack>
|
|
141
|
+
</VStack>
|
|
142
|
+
);
|
|
143
|
+
}
|
|
@@ -144,10 +144,10 @@ bun run validate`}
|
|
|
144
144
|
|
|
145
145
|
<div className="flex items-center gap-4 pt-4">
|
|
146
146
|
<Link
|
|
147
|
-
href="/docs/guides/
|
|
147
|
+
href="/docs/guides/contract-driven-forms"
|
|
148
148
|
className="btn-primary"
|
|
149
149
|
>
|
|
150
|
-
Next:
|
|
150
|
+
Next: Contract-driven forms <ChevronRight size={16} />
|
|
151
151
|
</Link>
|
|
152
152
|
<Link href="/docs/guides" className="btn-ghost">
|
|
153
153
|
Back to guides
|
|
@@ -24,6 +24,13 @@ const guides = [
|
|
|
24
24
|
href: '/docs/guides/spec-validation-and-typing',
|
|
25
25
|
time: '20 min',
|
|
26
26
|
},
|
|
27
|
+
{
|
|
28
|
+
title: 'Build a contract-driven form',
|
|
29
|
+
description:
|
|
30
|
+
'Use FormSpec to keep data shape, fields, layout, policy, and submit behavior aligned.',
|
|
31
|
+
href: '/docs/guides/contract-driven-forms',
|
|
32
|
+
time: '25 min',
|
|
33
|
+
},
|
|
27
34
|
{
|
|
28
35
|
title: 'Generate docs and clients',
|
|
29
36
|
description:
|
|
@@ -37,6 +37,18 @@ Create a single OperationSpec, register it, and expose it through a Next.js App
|
|
|
37
37
|
body: `# Spec-driven validation and typing
|
|
38
38
|
|
|
39
39
|
Define command/query specs that enforce validation and generate types without rewriting your app.`,
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: 'docs.guides.contract-driven-forms',
|
|
43
|
+
title: 'Contract-driven forms',
|
|
44
|
+
summary: 'Define schema-backed FormSpec surfaces and render them safely.',
|
|
45
|
+
kind: 'usage',
|
|
46
|
+
visibility: 'public',
|
|
47
|
+
route: '/docs/guides/contract-driven-forms',
|
|
48
|
+
tags: ['guides', 'forms', 'ui'],
|
|
49
|
+
body: `# Build a contract-driven form
|
|
50
|
+
|
|
51
|
+
Define a FormSpec with model, fields, layout, policy, and actions, then render it through a shared or app-specific renderer.`,
|
|
40
52
|
},
|
|
41
53
|
{
|
|
42
54
|
id: 'docs.guides.docs-clients-schemas',
|
|
@@ -2,6 +2,7 @@ import './guides.docblocks';
|
|
|
2
2
|
|
|
3
3
|
export { GuideCIDiffGatingPage } from './GuideCIDiffGatingPage';
|
|
4
4
|
export { GuideConnectInRepoPage } from './GuideConnectInRepoPage';
|
|
5
|
+
export { GuideContractDrivenFormsPage } from './GuideContractDrivenFormsPage';
|
|
5
6
|
export { GuideContractTypesPage } from './GuideContractTypesPage';
|
|
6
7
|
export { GuideDocsPipelinePage } from './GuideDocsPipelinePage';
|
|
7
8
|
export { GuideFirstModuleBundlePage } from './GuideFirstModuleBundlePage';
|
|
@@ -29,25 +29,26 @@ const shouldCaptureAnalytics = () => {
|
|
|
29
29
|
return dnt !== '1' && dnt !== 'yes';
|
|
30
30
|
};
|
|
31
31
|
|
|
32
|
+
const isDevelopment = () => process.env.NODE_ENV === 'development';
|
|
33
|
+
|
|
32
34
|
export function initPosthog() {
|
|
33
35
|
if (typeof window === 'undefined') return;
|
|
36
|
+
if (isDevelopment()) return;
|
|
34
37
|
if (!posthogKey) {
|
|
35
38
|
console.warn('[PostHog] NEXT_PUBLIC_CONTRACTSPEC_POSTHOG_KEY is missing');
|
|
36
39
|
return;
|
|
37
40
|
}
|
|
38
41
|
if (!shouldCaptureAnalytics()) return;
|
|
39
42
|
|
|
40
|
-
const isDev = process.env.NODE_ENV === 'development';
|
|
41
|
-
|
|
42
43
|
posthog.init(posthogKey, {
|
|
43
44
|
api_host: posthogHost,
|
|
44
|
-
autocapture:
|
|
45
|
-
capture_dead_clicks:
|
|
46
|
-
capture_performance:
|
|
47
|
-
capture_pageview:
|
|
48
|
-
capture_heatmaps:
|
|
49
|
-
capture_exceptions:
|
|
50
|
-
debug:
|
|
45
|
+
autocapture: true,
|
|
46
|
+
capture_dead_clicks: true,
|
|
47
|
+
capture_performance: true,
|
|
48
|
+
capture_pageview: true,
|
|
49
|
+
capture_heatmaps: true,
|
|
50
|
+
capture_exceptions: true,
|
|
51
|
+
debug: false,
|
|
51
52
|
});
|
|
52
53
|
}
|
|
53
54
|
|
|
@@ -56,6 +57,7 @@ export function captureAnalyticsEvent(
|
|
|
56
57
|
properties?: Record<string, unknown>
|
|
57
58
|
) {
|
|
58
59
|
if (!posthogKey) return;
|
|
60
|
+
if (isDevelopment()) return;
|
|
59
61
|
if (!shouldCaptureAnalytics()) return;
|
|
60
62
|
try {
|
|
61
63
|
const globalPosthog = (globalThis as { posthog?: PostHogInstance }).posthog;
|