@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,625 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { WaitlistSection } from "../marketing/waitlist-section.js";
|
|
4
|
+
import "../marketing/index.js";
|
|
5
|
+
import { TemplatePreviewModal } from "./TemplatesPreviewModal.js";
|
|
6
|
+
import { analyticsEventNames, captureAnalyticsEvent } from "@contractspec/bundle.library/libs/posthog/client";
|
|
7
|
+
import { Search } from "lucide-react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { useState } from "react";
|
|
10
|
+
import Link from "next/link";
|
|
11
|
+
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@contractspec/lib.ui-kit-web/ui/dialog";
|
|
12
|
+
import { cn } from "@contractspec/lib.ui-kit-core/utils";
|
|
13
|
+
import { useRegistryTemplates } from "@contractspec/lib.example-shared-ui";
|
|
14
|
+
import { getTemplate } from "@contractspec/module.examples";
|
|
15
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@contractspec/lib.ui-kit-web/ui/tooltip";
|
|
16
|
+
|
|
17
|
+
//#region src/components/templates/TemplatesClientPage.tsx
|
|
18
|
+
const templates = [
|
|
19
|
+
{
|
|
20
|
+
id: "minimal-example",
|
|
21
|
+
templateId: "todos-app",
|
|
22
|
+
title: "Minimal Example",
|
|
23
|
+
description: "A minimal template to get you running in minutes. Perfect for exploring the engine.",
|
|
24
|
+
tags: ["Getting Started"],
|
|
25
|
+
capabilities: "Basic Forms, Auth",
|
|
26
|
+
isStarter: true,
|
|
27
|
+
previewUrl: "/sandbox?template=minimal-example",
|
|
28
|
+
docsUrl: "/docs/getting-started/hello-world"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
id: "saas-boilerplate",
|
|
32
|
+
templateId: "saas-boilerplate",
|
|
33
|
+
title: "SaaS Boilerplate",
|
|
34
|
+
description: "Complete SaaS foundation with multi-tenant orgs, projects, settings, and billing usage.",
|
|
35
|
+
tags: [
|
|
36
|
+
"Getting Started",
|
|
37
|
+
"SaaS",
|
|
38
|
+
"Business"
|
|
39
|
+
],
|
|
40
|
+
capabilities: "Multi-tenancy, RBAC, Projects, Billing",
|
|
41
|
+
isNew: true,
|
|
42
|
+
previewUrl: "/sandbox?template=saas-boilerplate",
|
|
43
|
+
docsUrl: "/docs/templates/saas-boilerplate"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "crm-pipeline",
|
|
47
|
+
templateId: "crm-pipeline",
|
|
48
|
+
title: "CRM Pipeline",
|
|
49
|
+
description: "Sales CRM with contacts, companies, deals, pipeline stages, and task management.",
|
|
50
|
+
tags: ["CRM", "Business"],
|
|
51
|
+
capabilities: "Contacts, Deals, Pipelines, Tasks",
|
|
52
|
+
isNew: true,
|
|
53
|
+
previewUrl: "/sandbox?template=crm-pipeline",
|
|
54
|
+
docsUrl: "/docs/templates/crm-pipeline"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: "agent-console",
|
|
58
|
+
templateId: "agent-console",
|
|
59
|
+
title: "AI Agent Console",
|
|
60
|
+
description: "AI agent orchestration platform with tools, agents, runs, and execution logs.",
|
|
61
|
+
tags: ["AI", "Ops"],
|
|
62
|
+
capabilities: "Tools, Agents, Runs, Metrics",
|
|
63
|
+
isNew: true,
|
|
64
|
+
previewUrl: "/sandbox?template=agent-console",
|
|
65
|
+
docsUrl: "/docs/templates/agent-console"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "workflow-system",
|
|
69
|
+
templateId: "workflow-system",
|
|
70
|
+
title: "Workflow / Approval System",
|
|
71
|
+
description: "Multi-step workflows with role-based approvals and state transitions.",
|
|
72
|
+
tags: ["Business", "Ops"],
|
|
73
|
+
capabilities: "Workflows, Approvals, State Machine",
|
|
74
|
+
isNew: true,
|
|
75
|
+
previewUrl: "/sandbox?template=workflow-system",
|
|
76
|
+
docsUrl: "/docs/templates/workflow-system"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
id: "marketplace",
|
|
80
|
+
templateId: "marketplace",
|
|
81
|
+
title: "Marketplace",
|
|
82
|
+
description: "Two-sided marketplace with stores, products, orders, and payouts.",
|
|
83
|
+
tags: ["Business", "Payments"],
|
|
84
|
+
capabilities: "Stores, Products, Orders, Payouts",
|
|
85
|
+
isNew: true,
|
|
86
|
+
previewUrl: "/sandbox?template=marketplace",
|
|
87
|
+
docsUrl: "/docs/templates/marketplace"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "integration-hub",
|
|
91
|
+
templateId: "integration-hub",
|
|
92
|
+
title: "Integration Hub",
|
|
93
|
+
description: "Third-party integrations with connections, sync configs, and field mapping.",
|
|
94
|
+
tags: ["Ops", "AI"],
|
|
95
|
+
capabilities: "Integrations, Connections, Sync",
|
|
96
|
+
isNew: true,
|
|
97
|
+
previewUrl: "/sandbox?template=integration-hub",
|
|
98
|
+
docsUrl: "/docs/templates/integration-hub"
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "learning-journey-studio-onboarding",
|
|
102
|
+
templateId: "learning-journey-studio-onboarding",
|
|
103
|
+
title: "Learning Journey — Studio Getting Started",
|
|
104
|
+
description: "First 30 minutes in Studio: choose template, edit spec, regenerate, playground, evolution.",
|
|
105
|
+
tags: ["Learning", "Onboarding"],
|
|
106
|
+
capabilities: "Spec-first onboarding, XP/streak, progress widget",
|
|
107
|
+
isNew: true,
|
|
108
|
+
previewUrl: "/sandbox?template=learning-journey-studio-onboarding",
|
|
109
|
+
docsUrl: "/docs/templates/learning-journey-studio-onboarding"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "learning-journey-platform-tour",
|
|
113
|
+
templateId: "learning-journey-platform-tour",
|
|
114
|
+
title: "Learning Journey — Platform Primitives Tour",
|
|
115
|
+
description: "Touch identity, audit, notifications, jobs, flags, files, metering once with guided steps.",
|
|
116
|
+
tags: ["Learning", "Platform"],
|
|
117
|
+
capabilities: "Cross-module tour with event-driven completion",
|
|
118
|
+
isNew: true,
|
|
119
|
+
previewUrl: "/sandbox?template=learning-journey-platform-tour",
|
|
120
|
+
docsUrl: "/docs/templates/learning-journey-platform-tour"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
id: "learning-journey-crm-onboarding",
|
|
124
|
+
templateId: "learning-journey-crm-onboarding",
|
|
125
|
+
title: "Learning Journey — CRM First Win",
|
|
126
|
+
description: "Get to first closed-won deal: pipeline, contact/company, deal, stages, follow-up.",
|
|
127
|
+
tags: ["Learning", "CRM"],
|
|
128
|
+
capabilities: "CRM onboarding with XP/streak/badge",
|
|
129
|
+
isNew: true,
|
|
130
|
+
previewUrl: "/sandbox?template=learning-journey-crm-onboarding",
|
|
131
|
+
docsUrl: "/docs/templates/learning-journey-crm-onboarding"
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
id: "analytics-dashboard",
|
|
135
|
+
templateId: "analytics-dashboard",
|
|
136
|
+
title: "Analytics Dashboard",
|
|
137
|
+
description: "Custom dashboards with widgets, saved queries, and real-time visualization.",
|
|
138
|
+
tags: ["Business", "Ops"],
|
|
139
|
+
capabilities: "Dashboards, Widgets, Queries",
|
|
140
|
+
isNew: true,
|
|
141
|
+
previewUrl: "/sandbox?template=analytics-dashboard",
|
|
142
|
+
docsUrl: "/docs/templates/analytics-dashboard"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
id: "plumber-ops",
|
|
146
|
+
templateId: "messaging-app",
|
|
147
|
+
title: "Plumber Ops",
|
|
148
|
+
description: "Complete workflow: Quotes → Deposit → Job → Invoice → Payment. Policy-enforced approvals.",
|
|
149
|
+
tags: ["Trades", "Payments"],
|
|
150
|
+
capabilities: "Quotes, Jobs, Invoicing, Payments",
|
|
151
|
+
previewUrl: "/sandbox?template=plumber-ops",
|
|
152
|
+
docsUrl: "/docs/specs/workflows"
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
id: "coliving-management",
|
|
156
|
+
templateId: "recipe-app-i18n",
|
|
157
|
+
title: "Coliving Management",
|
|
158
|
+
description: "Coliving management: Onboarding, chores, shared wallet. Multi-party approvals built-in.",
|
|
159
|
+
tags: ["Coliving", "Finance"],
|
|
160
|
+
capabilities: "Tasks, Approvals, Payments",
|
|
161
|
+
previewUrl: "/sandbox?template=coliving-management",
|
|
162
|
+
docsUrl: "/docs/specs/workflows"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "chores-allowance",
|
|
166
|
+
templateId: "todos-app",
|
|
167
|
+
title: "Chores & Allowance",
|
|
168
|
+
description: "Family task management with approval workflows. Teach financial accountability safely.",
|
|
169
|
+
tags: ["Family", "Ops"],
|
|
170
|
+
capabilities: "Tasks, Approvals, Notifications",
|
|
171
|
+
previewUrl: "/sandbox?template=chores-allowance",
|
|
172
|
+
docsUrl: "/docs/specs/workflows"
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: "service-dispatch",
|
|
176
|
+
templateId: "messaging-app",
|
|
177
|
+
title: "Service Dispatch",
|
|
178
|
+
description: "Field service scheduling, routing, and invoicing. Real-time coordination with policy gates.",
|
|
179
|
+
tags: ["Ops", "Trades"],
|
|
180
|
+
capabilities: "Scheduling, Maps, Invoicing",
|
|
181
|
+
previewUrl: "/sandbox?template=service-dispatch",
|
|
182
|
+
docsUrl: "/docs/specs/workflows"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
id: "content-review",
|
|
186
|
+
templateId: "todos-app",
|
|
187
|
+
title: "Content Review",
|
|
188
|
+
description: "Multi-stage approval workflow for content. Audit trail for every decision.",
|
|
189
|
+
tags: ["Ops"],
|
|
190
|
+
capabilities: "Workflows, Approvals, Comments",
|
|
191
|
+
previewUrl: "/sandbox?template=content-review",
|
|
192
|
+
docsUrl: "/docs/specs/workflows"
|
|
193
|
+
}
|
|
194
|
+
];
|
|
195
|
+
const allTags = [
|
|
196
|
+
"Getting Started",
|
|
197
|
+
"SaaS",
|
|
198
|
+
"Business",
|
|
199
|
+
"CRM",
|
|
200
|
+
"AI",
|
|
201
|
+
"Trades",
|
|
202
|
+
"Coliving",
|
|
203
|
+
"Family",
|
|
204
|
+
"Ops",
|
|
205
|
+
"Payments",
|
|
206
|
+
"Learning",
|
|
207
|
+
"Platform"
|
|
208
|
+
];
|
|
209
|
+
const TemplatesPage = () => {
|
|
210
|
+
const [selectedTag, setSelectedTag] = useState(null);
|
|
211
|
+
const [search, setSearch] = useState("");
|
|
212
|
+
const [preview, setPreview] = useState(null);
|
|
213
|
+
const [waitlistModalOpen, setWaitlistModalOpen] = useState(false);
|
|
214
|
+
const [source, setSource] = useState("local");
|
|
215
|
+
const [selectedTemplateForCommand, setSelectedTemplateForCommand] = useState(null);
|
|
216
|
+
const { data: registryTemplates = [], isLoading: registryLoading } = useRegistryTemplates();
|
|
217
|
+
const filtered = templates.filter((t) => {
|
|
218
|
+
const matchTag = !selectedTag || t.tags.includes(selectedTag);
|
|
219
|
+
const matchSearch = !search || t.title.toLowerCase().includes(search.toLowerCase()) || t.description.toLowerCase().includes(search.toLowerCase());
|
|
220
|
+
return matchTag && matchSearch;
|
|
221
|
+
});
|
|
222
|
+
const commandId = selectedTemplateForCommand ? "templateId" in selectedTemplateForCommand ? selectedTemplateForCommand.templateId : selectedTemplateForCommand.id : "";
|
|
223
|
+
return /* @__PURE__ */ jsxs(TooltipProvider, { children: [
|
|
224
|
+
/* @__PURE__ */ jsxs("main", {
|
|
225
|
+
className: "",
|
|
226
|
+
children: [
|
|
227
|
+
/* @__PURE__ */ jsx("section", {
|
|
228
|
+
className: "section-padding hero-gradient border-border relative border-b",
|
|
229
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
230
|
+
className: "mx-auto max-w-4xl space-y-6 text-center",
|
|
231
|
+
children: [/* @__PURE__ */ jsx("h1", {
|
|
232
|
+
className: "text-5xl leading-tight font-bold md:text-6xl",
|
|
233
|
+
children: "Recipe templates"
|
|
234
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
235
|
+
className: "text-muted-foreground text-lg",
|
|
236
|
+
children: "Ready-to-use, customizable recipes. Policies built in. One-click deploy."
|
|
237
|
+
})]
|
|
238
|
+
})
|
|
239
|
+
}),
|
|
240
|
+
/* @__PURE__ */ jsx("section", {
|
|
241
|
+
className: "section-padding border-border border-b",
|
|
242
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
243
|
+
className: "mx-auto max-w-6xl space-y-6",
|
|
244
|
+
children: [
|
|
245
|
+
/* @__PURE__ */ jsxs("div", {
|
|
246
|
+
className: "flex items-center justify-between gap-3",
|
|
247
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
248
|
+
className: "text-muted-foreground text-sm",
|
|
249
|
+
children: "Source:"
|
|
250
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
251
|
+
className: "flex gap-2",
|
|
252
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
253
|
+
onClick: () => setSource("local"),
|
|
254
|
+
className: cn("rounded-full px-4 py-2 text-sm font-medium transition-colors", {
|
|
255
|
+
"bg-violet-500 text-white": source === "local",
|
|
256
|
+
"bg-card border-border hover:bg-card/80 border": source !== "local"
|
|
257
|
+
}),
|
|
258
|
+
"aria-pressed": source === "local",
|
|
259
|
+
children: "Local"
|
|
260
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
261
|
+
onClick: () => setSource("registry"),
|
|
262
|
+
className: cn("rounded-full px-4 py-2 text-sm font-medium transition-colors", {
|
|
263
|
+
"bg-violet-500 text-white": source === "registry",
|
|
264
|
+
"bg-card border-border hover:bg-card/80 border": source !== "registry"
|
|
265
|
+
}),
|
|
266
|
+
"aria-pressed": source === "registry",
|
|
267
|
+
children: "Community"
|
|
268
|
+
})]
|
|
269
|
+
})]
|
|
270
|
+
}),
|
|
271
|
+
/* @__PURE__ */ jsxs("div", {
|
|
272
|
+
className: "relative",
|
|
273
|
+
children: [/* @__PURE__ */ jsx(Search, {
|
|
274
|
+
className: "text-muted-foreground absolute top-3 left-3",
|
|
275
|
+
size: 20
|
|
276
|
+
}), /* @__PURE__ */ jsx("input", {
|
|
277
|
+
type: "text",
|
|
278
|
+
placeholder: "Search templates...",
|
|
279
|
+
value: search,
|
|
280
|
+
onChange: (e) => setSearch(e.target.value),
|
|
281
|
+
className: "bg-card border-border w-full rounded-lg border py-3 pr-4 pl-10 focus:ring-2 focus:ring-violet-500 focus:outline-none",
|
|
282
|
+
"aria-label": "Search templates"
|
|
283
|
+
})]
|
|
284
|
+
}),
|
|
285
|
+
/* @__PURE__ */ jsxs("div", {
|
|
286
|
+
className: "flex flex-wrap gap-2",
|
|
287
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
288
|
+
onClick: () => setSelectedTag(null),
|
|
289
|
+
className: `rounded-full px-4 py-2 text-sm font-medium transition-colors ${selectedTag === null ? "bg-violet-500 text-white" : "bg-card border-border hover:bg-card/80 border"}`,
|
|
290
|
+
"aria-pressed": selectedTag === null,
|
|
291
|
+
children: "All"
|
|
292
|
+
}), allTags.map((tag) => /* @__PURE__ */ jsx("button", {
|
|
293
|
+
onClick: () => setSelectedTag(tag),
|
|
294
|
+
className: cn(`rounded-full px-4 py-2 text-sm font-medium transition-colors`, {
|
|
295
|
+
"bg-violet-500 text-white": selectedTag === tag,
|
|
296
|
+
"bg-card border-border hover:bg-card/80 border": selectedTag !== tag
|
|
297
|
+
}),
|
|
298
|
+
"aria-pressed": selectedTag === tag,
|
|
299
|
+
children: tag
|
|
300
|
+
}, tag))]
|
|
301
|
+
})
|
|
302
|
+
]
|
|
303
|
+
})
|
|
304
|
+
}),
|
|
305
|
+
/* @__PURE__ */ jsx("section", {
|
|
306
|
+
className: "section-padding",
|
|
307
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
308
|
+
className: "mx-auto max-w-6xl",
|
|
309
|
+
children: source === "registry" ? registryLoading ? /* @__PURE__ */ jsx("div", {
|
|
310
|
+
className: "py-12 text-center",
|
|
311
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
312
|
+
className: "text-muted-foreground",
|
|
313
|
+
children: "Loading community templates…"
|
|
314
|
+
})
|
|
315
|
+
}) : registryTemplates.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
316
|
+
className: "py-12 text-center",
|
|
317
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
318
|
+
className: "text-muted-foreground",
|
|
319
|
+
children: "No community templates found (configure `NEXT_PUBLIC_CONTRACTSPEC_REGISTRY_URL`)."
|
|
320
|
+
})
|
|
321
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
322
|
+
className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3",
|
|
323
|
+
children: registryTemplates.map((t) => /* @__PURE__ */ jsxs("div", {
|
|
324
|
+
className: "card-subtle relative flex flex-col space-y-4 p-6 transition-colors hover:border-violet-500/50",
|
|
325
|
+
children: [
|
|
326
|
+
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
327
|
+
className: "text-lg font-bold",
|
|
328
|
+
children: t.name
|
|
329
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
330
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
331
|
+
children: t.description
|
|
332
|
+
})] }),
|
|
333
|
+
/* @__PURE__ */ jsx("div", {
|
|
334
|
+
className: "flex-1 space-y-2",
|
|
335
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
336
|
+
className: "flex flex-wrap gap-1",
|
|
337
|
+
children: t.tags.map((tag) => /* @__PURE__ */ jsx("span", {
|
|
338
|
+
className: "rounded border border-violet-500/20 bg-violet-500/10 px-2 py-1 text-xs text-violet-300",
|
|
339
|
+
children: tag
|
|
340
|
+
}, tag))
|
|
341
|
+
})
|
|
342
|
+
}),
|
|
343
|
+
/* @__PURE__ */ jsxs("div", {
|
|
344
|
+
className: "flex gap-2 pt-4",
|
|
345
|
+
children: [/* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
346
|
+
asChild: true,
|
|
347
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
348
|
+
className: "btn-ghost flex-1 text-center text-xs",
|
|
349
|
+
onClick: () => {
|
|
350
|
+
if (!getTemplate(t.id)) {
|
|
351
|
+
setSelectedTemplateForCommand(t);
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
setPreview(t.id);
|
|
355
|
+
},
|
|
356
|
+
children: "Preview"
|
|
357
|
+
})
|
|
358
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: "Preview this template (if available locally)" }) })] }), /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
359
|
+
asChild: true,
|
|
360
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
361
|
+
className: "btn-primary flex-1 text-center text-xs",
|
|
362
|
+
onClick: () => {
|
|
363
|
+
captureAnalyticsEvent(analyticsEventNames.EXAMPLE_REPO_OPEN, {
|
|
364
|
+
surface: "templates",
|
|
365
|
+
templateId: t.id,
|
|
366
|
+
source: "registry"
|
|
367
|
+
});
|
|
368
|
+
setSelectedTemplateForCommand(t);
|
|
369
|
+
},
|
|
370
|
+
children: "Use Template"
|
|
371
|
+
})
|
|
372
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: "Get CLI command" }) })] })]
|
|
373
|
+
})
|
|
374
|
+
]
|
|
375
|
+
}, t.id))
|
|
376
|
+
}) : filtered.length === 0 ? /* @__PURE__ */ jsx("div", {
|
|
377
|
+
className: "py-12 text-center",
|
|
378
|
+
children: /* @__PURE__ */ jsx("p", {
|
|
379
|
+
className: "text-muted-foreground",
|
|
380
|
+
children: "No templates match your filters. Try a different search."
|
|
381
|
+
})
|
|
382
|
+
}) : /* @__PURE__ */ jsx("div", {
|
|
383
|
+
className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3",
|
|
384
|
+
children: filtered.map((template, i) => /* @__PURE__ */ jsxs("div", {
|
|
385
|
+
className: "card-subtle relative flex flex-col space-y-4 p-6 transition-colors hover:border-violet-500/50",
|
|
386
|
+
children: [
|
|
387
|
+
"isNew" in template && template.isNew && /* @__PURE__ */ jsx("span", {
|
|
388
|
+
className: "absolute top-3 right-3 rounded-full bg-green-500 px-2 py-0.5 text-xs font-semibold text-white",
|
|
389
|
+
children: "New"
|
|
390
|
+
}),
|
|
391
|
+
/* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("h3", {
|
|
392
|
+
className: "text-lg font-bold",
|
|
393
|
+
children: template.title
|
|
394
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
395
|
+
className: "text-muted-foreground mt-1 text-sm",
|
|
396
|
+
children: template.description
|
|
397
|
+
})] }),
|
|
398
|
+
/* @__PURE__ */ jsxs("div", {
|
|
399
|
+
className: "flex-1 space-y-2",
|
|
400
|
+
children: [/* @__PURE__ */ jsxs("p", {
|
|
401
|
+
className: "text-muted-foreground text-xs",
|
|
402
|
+
children: [
|
|
403
|
+
/* @__PURE__ */ jsx("span", {
|
|
404
|
+
className: "text-foreground font-medium",
|
|
405
|
+
children: "Capabilities:"
|
|
406
|
+
}),
|
|
407
|
+
" ",
|
|
408
|
+
template.capabilities
|
|
409
|
+
]
|
|
410
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
411
|
+
className: "flex flex-wrap gap-1",
|
|
412
|
+
children: template.tags.map((tag) => /* @__PURE__ */ jsx("span", {
|
|
413
|
+
className: "rounded border border-violet-500/20 bg-violet-500/10 px-2 py-1 text-xs text-violet-300",
|
|
414
|
+
children: tag
|
|
415
|
+
}, tag))
|
|
416
|
+
})]
|
|
417
|
+
}),
|
|
418
|
+
/* @__PURE__ */ jsxs("div", {
|
|
419
|
+
className: "flex gap-2 pt-4",
|
|
420
|
+
children: [/* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
421
|
+
asChild: true,
|
|
422
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
423
|
+
className: "btn-ghost flex-1 text-center text-xs",
|
|
424
|
+
onClick: () => setPreview(template.templateId),
|
|
425
|
+
children: "Preview"
|
|
426
|
+
})
|
|
427
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: "Preview this template in a modal" }) })] }), /* @__PURE__ */ jsxs(Tooltip, { children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
428
|
+
asChild: true,
|
|
429
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
430
|
+
className: "btn-primary flex-1 text-center text-xs",
|
|
431
|
+
onClick: () => {
|
|
432
|
+
captureAnalyticsEvent(analyticsEventNames.EXAMPLE_REPO_OPEN, {
|
|
433
|
+
surface: "templates",
|
|
434
|
+
templateId: template.templateId,
|
|
435
|
+
source: "local"
|
|
436
|
+
});
|
|
437
|
+
setSelectedTemplateForCommand(template);
|
|
438
|
+
},
|
|
439
|
+
children: "Use Template"
|
|
440
|
+
})
|
|
441
|
+
}), /* @__PURE__ */ jsx(TooltipContent, { children: /* @__PURE__ */ jsx("p", { children: "Get CLI command" }) })] })]
|
|
442
|
+
})
|
|
443
|
+
]
|
|
444
|
+
}, i))
|
|
445
|
+
})
|
|
446
|
+
})
|
|
447
|
+
}),
|
|
448
|
+
/* @__PURE__ */ jsx("section", {
|
|
449
|
+
className: "section-padding border-border bg-striped border-t",
|
|
450
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
451
|
+
className: "mx-auto max-w-6xl space-y-8",
|
|
452
|
+
children: [
|
|
453
|
+
/* @__PURE__ */ jsxs("div", {
|
|
454
|
+
className: "space-y-4 text-center",
|
|
455
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
456
|
+
className: "text-3xl font-bold md:text-4xl",
|
|
457
|
+
children: "Extend templates with integrations & knowledge"
|
|
458
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
459
|
+
className: "text-muted-foreground mx-auto max-w-2xl",
|
|
460
|
+
children: "Every template can be enhanced with built-in integrations and knowledge spaces. Add payments, email, AI, and structured knowledge without writing integration code."
|
|
461
|
+
})]
|
|
462
|
+
}),
|
|
463
|
+
/* @__PURE__ */ jsxs("div", {
|
|
464
|
+
className: "grid gap-6 md:grid-cols-3",
|
|
465
|
+
children: [
|
|
466
|
+
/* @__PURE__ */ jsxs("div", {
|
|
467
|
+
className: "card-subtle space-y-4 p-6",
|
|
468
|
+
children: [
|
|
469
|
+
/* @__PURE__ */ jsx("div", {
|
|
470
|
+
className: "text-3xl",
|
|
471
|
+
children: "💳"
|
|
472
|
+
}),
|
|
473
|
+
/* @__PURE__ */ jsx("h3", {
|
|
474
|
+
className: "font-bold",
|
|
475
|
+
children: "Add Payments"
|
|
476
|
+
}),
|
|
477
|
+
/* @__PURE__ */ jsx("p", {
|
|
478
|
+
className: "text-muted-foreground text-sm",
|
|
479
|
+
children: "Connect Stripe to any template for payment processing, subscriptions, and invoicing. Type-safe and policy-enforced."
|
|
480
|
+
}),
|
|
481
|
+
/* @__PURE__ */ jsx(Link, {
|
|
482
|
+
href: "/docs/integrations/stripe",
|
|
483
|
+
className: "inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300",
|
|
484
|
+
children: "Learn more →"
|
|
485
|
+
})
|
|
486
|
+
]
|
|
487
|
+
}),
|
|
488
|
+
/* @__PURE__ */ jsxs("div", {
|
|
489
|
+
className: "card-subtle space-y-4 p-6",
|
|
490
|
+
children: [
|
|
491
|
+
/* @__PURE__ */ jsx("div", {
|
|
492
|
+
className: "text-3xl",
|
|
493
|
+
children: "📧"
|
|
494
|
+
}),
|
|
495
|
+
/* @__PURE__ */ jsx("h3", {
|
|
496
|
+
className: "font-bold",
|
|
497
|
+
children: "Add Notifications"
|
|
498
|
+
}),
|
|
499
|
+
/* @__PURE__ */ jsx("p", {
|
|
500
|
+
className: "text-muted-foreground text-sm",
|
|
501
|
+
children: "Send transactional emails via Postmark or Resend. Process inbound emails with Gmail API. SMS via Twilio."
|
|
502
|
+
}),
|
|
503
|
+
/* @__PURE__ */ jsx(Link, {
|
|
504
|
+
href: "/docs/integrations",
|
|
505
|
+
className: "inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300",
|
|
506
|
+
children: "View integrations →"
|
|
507
|
+
})
|
|
508
|
+
]
|
|
509
|
+
}),
|
|
510
|
+
/* @__PURE__ */ jsxs("div", {
|
|
511
|
+
className: "card-subtle space-y-4 p-6",
|
|
512
|
+
children: [
|
|
513
|
+
/* @__PURE__ */ jsx("div", {
|
|
514
|
+
className: "text-3xl",
|
|
515
|
+
children: "🧠"
|
|
516
|
+
}),
|
|
517
|
+
/* @__PURE__ */ jsx("h3", {
|
|
518
|
+
className: "font-bold",
|
|
519
|
+
children: "Add AI & Knowledge"
|
|
520
|
+
}),
|
|
521
|
+
/* @__PURE__ */ jsx("p", {
|
|
522
|
+
className: "text-muted-foreground text-sm",
|
|
523
|
+
children: "Power templates with OpenAI, vector search via Qdrant, and structured knowledge spaces for context-aware workflows."
|
|
524
|
+
}),
|
|
525
|
+
/* @__PURE__ */ jsx(Link, {
|
|
526
|
+
href: "/docs/knowledge",
|
|
527
|
+
className: "inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300",
|
|
528
|
+
children: "Learn about knowledge →"
|
|
529
|
+
})
|
|
530
|
+
]
|
|
531
|
+
})
|
|
532
|
+
]
|
|
533
|
+
}),
|
|
534
|
+
/* @__PURE__ */ jsxs("div", {
|
|
535
|
+
className: "pt-4 text-center",
|
|
536
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
537
|
+
className: "text-muted-foreground mb-4 text-sm",
|
|
538
|
+
children: "All integrations are configured per-tenant with automatic health checks and credential rotation."
|
|
539
|
+
}), /* @__PURE__ */ jsx(Link, {
|
|
540
|
+
href: "/docs/architecture",
|
|
541
|
+
className: "btn-primary",
|
|
542
|
+
children: "View Architecture"
|
|
543
|
+
})]
|
|
544
|
+
})
|
|
545
|
+
]
|
|
546
|
+
})
|
|
547
|
+
})
|
|
548
|
+
]
|
|
549
|
+
}),
|
|
550
|
+
/* @__PURE__ */ jsx(TemplatePreviewModal, {
|
|
551
|
+
templateId: preview,
|
|
552
|
+
onClose: () => {
|
|
553
|
+
setPreview(null);
|
|
554
|
+
}
|
|
555
|
+
}),
|
|
556
|
+
/* @__PURE__ */ jsx(Dialog, {
|
|
557
|
+
open: waitlistModalOpen,
|
|
558
|
+
onOpenChange: setWaitlistModalOpen,
|
|
559
|
+
children: /* @__PURE__ */ jsxs(DialogContent, {
|
|
560
|
+
className: "max-h-[90vh] max-w-2xl overflow-y-auto",
|
|
561
|
+
children: [/* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Early Access Required" }), /* @__PURE__ */ jsx(DialogDescription, { children: "ContractSpec Studio is in early access. Join the waitlist to deploy projects to our managed cloud." })] }), /* @__PURE__ */ jsx(WaitlistSection, { variant: "compact" })]
|
|
562
|
+
})
|
|
563
|
+
}),
|
|
564
|
+
/* @__PURE__ */ jsx(Dialog, {
|
|
565
|
+
open: !!selectedTemplateForCommand,
|
|
566
|
+
onOpenChange: () => setSelectedTemplateForCommand(null),
|
|
567
|
+
children: /* @__PURE__ */ jsxs(DialogContent, {
|
|
568
|
+
className: "max-w-md",
|
|
569
|
+
children: [/* @__PURE__ */ jsxs(DialogHeader, { children: [/* @__PURE__ */ jsx(DialogTitle, { children: "Use this template" }), /* @__PURE__ */ jsx(DialogDescription, { children: "Initialize a new project with this template using the CLI." })] }), /* @__PURE__ */ jsxs("div", {
|
|
570
|
+
className: "space-y-4 pt-4",
|
|
571
|
+
children: [
|
|
572
|
+
/* @__PURE__ */ jsxs("div", {
|
|
573
|
+
className: "rounded-md border border-zinc-800 bg-zinc-950 p-4 font-mono text-sm text-zinc-50",
|
|
574
|
+
children: ["npx contractspec init --template ", commandId]
|
|
575
|
+
}),
|
|
576
|
+
/* @__PURE__ */ jsx("div", {
|
|
577
|
+
className: "flex gap-2",
|
|
578
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
579
|
+
className: "btn-secondary w-full",
|
|
580
|
+
onClick: () => {
|
|
581
|
+
navigator.clipboard.writeText(`npx contractspec init --template ${commandId}`);
|
|
582
|
+
captureAnalyticsEvent(analyticsEventNames.COPY_COMMAND_CLICK, {
|
|
583
|
+
surface: "templates",
|
|
584
|
+
templateId: commandId,
|
|
585
|
+
filename: "templates-cli"
|
|
586
|
+
});
|
|
587
|
+
},
|
|
588
|
+
children: "Copy Command"
|
|
589
|
+
})
|
|
590
|
+
}),
|
|
591
|
+
/* @__PURE__ */ jsxs("div", {
|
|
592
|
+
className: "relative",
|
|
593
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
594
|
+
className: "absolute inset-0 flex items-center",
|
|
595
|
+
children: /* @__PURE__ */ jsx("span", { className: "border-border w-full border-t" })
|
|
596
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
597
|
+
className: "relative flex justify-center text-xs uppercase",
|
|
598
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
599
|
+
className: "bg-background text-muted-foreground px-2",
|
|
600
|
+
children: "Or"
|
|
601
|
+
})
|
|
602
|
+
})]
|
|
603
|
+
}),
|
|
604
|
+
/* @__PURE__ */ jsx("button", {
|
|
605
|
+
className: "btn-ghost w-full text-sm",
|
|
606
|
+
onClick: () => {
|
|
607
|
+
captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
608
|
+
surface: "templates",
|
|
609
|
+
templateId: commandId
|
|
610
|
+
});
|
|
611
|
+
setSelectedTemplateForCommand(null);
|
|
612
|
+
setWaitlistModalOpen(true);
|
|
613
|
+
},
|
|
614
|
+
children: "Deploy to Studio (Waitlist)"
|
|
615
|
+
})
|
|
616
|
+
]
|
|
617
|
+
})]
|
|
618
|
+
})
|
|
619
|
+
})
|
|
620
|
+
] });
|
|
621
|
+
};
|
|
622
|
+
|
|
623
|
+
//#endregion
|
|
624
|
+
export { TemplatesPage };
|
|
625
|
+
//# sourceMappingURL=TemplatesClientPage.js.map
|