@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 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesClientPage.js","names":[],"sources":["../../../src/components/templates/TemplatesClientPage.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport { Search } from 'lucide-react';\nimport { cn } from '@contractspec/lib.ui-kit-core/utils';\nimport Link from 'next/link';\nimport type {\n RegistryTemplate,\n TemplateId,\n} from '@contractspec/lib.example-shared-ui';\nimport { useRegistryTemplates } from '@contractspec/lib.example-shared-ui';\nimport { getTemplate } from '@contractspec/module.examples';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@contractspec/lib.ui-kit-web/ui/tooltip';\nimport {\n analyticsEventNames,\n captureAnalyticsEvent,\n} from '@contractspec/bundle.library/libs/posthog/client';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@contractspec/lib.ui-kit-web/ui/dialog';\nimport { WaitlistSection } from '../marketing';\nimport { TemplatePreviewModal } from './TemplatesPreviewModal';\n\nconst templates = [\n {\n id: 'minimal-example',\n templateId: 'todos-app' as TemplateId,\n title: 'Minimal Example',\n description:\n 'A minimal template to get you running in minutes. Perfect for exploring the engine.',\n tags: ['Getting Started'],\n capabilities: 'Basic Forms, Auth',\n isStarter: true,\n previewUrl: '/sandbox?template=minimal-example',\n docsUrl: '/docs/getting-started/hello-world',\n },\n // ============================================\n // Phase 1 Examples (using cross-cutting modules)\n // ============================================\n {\n id: 'saas-boilerplate',\n templateId: 'saas-boilerplate' as TemplateId,\n title: 'SaaS Boilerplate',\n description:\n 'Complete SaaS foundation with multi-tenant orgs, projects, settings, and billing usage.',\n tags: ['Getting Started', 'SaaS', 'Business'],\n capabilities: 'Multi-tenancy, RBAC, Projects, Billing',\n isNew: true,\n previewUrl: '/sandbox?template=saas-boilerplate',\n docsUrl: '/docs/templates/saas-boilerplate',\n },\n {\n id: 'crm-pipeline',\n templateId: 'crm-pipeline' as TemplateId,\n title: 'CRM Pipeline',\n description:\n 'Sales CRM with contacts, companies, deals, pipeline stages, and task management.',\n tags: ['CRM', 'Business'],\n capabilities: 'Contacts, Deals, Pipelines, Tasks',\n isNew: true,\n previewUrl: '/sandbox?template=crm-pipeline',\n docsUrl: '/docs/templates/crm-pipeline',\n },\n {\n id: 'agent-console',\n templateId: 'agent-console' as TemplateId,\n title: 'AI Agent Console',\n description:\n 'AI agent orchestration platform with tools, agents, runs, and execution logs.',\n tags: ['AI', 'Ops'],\n capabilities: 'Tools, Agents, Runs, Metrics',\n isNew: true,\n previewUrl: '/sandbox?template=agent-console',\n docsUrl: '/docs/templates/agent-console',\n },\n // ============================================\n // Phase 2-4 Examples\n // ============================================\n {\n id: 'workflow-system',\n templateId: 'workflow-system' as TemplateId,\n title: 'Workflow / Approval System',\n description:\n 'Multi-step workflows with role-based approvals and state transitions.',\n tags: ['Business', 'Ops'],\n capabilities: 'Workflows, Approvals, State Machine',\n isNew: true,\n previewUrl: '/sandbox?template=workflow-system',\n docsUrl: '/docs/templates/workflow-system',\n },\n {\n id: 'marketplace',\n templateId: 'marketplace' as TemplateId,\n title: 'Marketplace',\n description:\n 'Two-sided marketplace with stores, products, orders, and payouts.',\n tags: ['Business', 'Payments'],\n capabilities: 'Stores, Products, Orders, Payouts',\n isNew: true,\n previewUrl: '/sandbox?template=marketplace',\n docsUrl: '/docs/templates/marketplace',\n },\n {\n id: 'integration-hub',\n templateId: 'integration-hub' as TemplateId,\n title: 'Integration Hub',\n description:\n 'Third-party integrations with connections, sync configs, and field mapping.',\n tags: ['Ops', 'AI'],\n capabilities: 'Integrations, Connections, Sync',\n isNew: true,\n previewUrl: '/sandbox?template=integration-hub',\n docsUrl: '/docs/templates/integration-hub',\n },\n // ============================================\n // Learning Journeys\n // ============================================\n {\n id: 'learning-journey-studio-onboarding',\n templateId: 'learning-journey-studio-onboarding' as TemplateId,\n title: 'Learning Journey — Studio Getting Started',\n description:\n 'First 30 minutes in Studio: choose template, edit spec, regenerate, playground, evolution.',\n tags: ['Learning', 'Onboarding'],\n capabilities: 'Spec-first onboarding, XP/streak, progress widget',\n isNew: true,\n previewUrl: '/sandbox?template=learning-journey-studio-onboarding',\n docsUrl: '/docs/templates/learning-journey-studio-onboarding',\n },\n {\n id: 'learning-journey-platform-tour',\n templateId: 'learning-journey-platform-tour' as TemplateId,\n title: 'Learning Journey — Platform Primitives Tour',\n description:\n 'Touch identity, audit, notifications, jobs, flags, files, metering once with guided steps.',\n tags: ['Learning', 'Platform'],\n capabilities: 'Cross-module tour with event-driven completion',\n isNew: true,\n previewUrl: '/sandbox?template=learning-journey-platform-tour',\n docsUrl: '/docs/templates/learning-journey-platform-tour',\n },\n {\n id: 'learning-journey-crm-onboarding',\n templateId: 'learning-journey-crm-onboarding' as TemplateId,\n title: 'Learning Journey — CRM First Win',\n description:\n 'Get to first closed-won deal: pipeline, contact/company, deal, stages, follow-up.',\n tags: ['Learning', 'CRM'],\n capabilities: 'CRM onboarding with XP/streak/badge',\n isNew: true,\n previewUrl: '/sandbox?template=learning-journey-crm-onboarding',\n docsUrl: '/docs/templates/learning-journey-crm-onboarding',\n },\n {\n id: 'analytics-dashboard',\n templateId: 'analytics-dashboard' as TemplateId,\n title: 'Analytics Dashboard',\n description:\n 'Custom dashboards with widgets, saved queries, and real-time visualization.',\n tags: ['Business', 'Ops'],\n capabilities: 'Dashboards, Widgets, Queries',\n isNew: true,\n previewUrl: '/sandbox?template=analytics-dashboard',\n docsUrl: '/docs/templates/analytics-dashboard',\n },\n // ============================================\n // Classic Templates\n // ============================================\n {\n id: 'plumber-ops',\n templateId: 'messaging-app' as TemplateId,\n title: 'Plumber Ops',\n description:\n 'Complete workflow: Quotes → Deposit → Job → Invoice → Payment. Policy-enforced approvals.',\n tags: ['Trades', 'Payments'],\n capabilities: 'Quotes, Jobs, Invoicing, Payments',\n previewUrl: '/sandbox?template=plumber-ops',\n docsUrl: '/docs/specs/workflows',\n },\n {\n id: 'coliving-management',\n templateId: 'recipe-app-i18n' as TemplateId,\n title: 'Coliving Management',\n description:\n 'Coliving management: Onboarding, chores, shared wallet. Multi-party approvals built-in.',\n tags: ['Coliving', 'Finance'],\n capabilities: 'Tasks, Approvals, Payments',\n previewUrl: '/sandbox?template=coliving-management',\n docsUrl: '/docs/specs/workflows',\n },\n {\n id: 'chores-allowance',\n templateId: 'todos-app' as TemplateId,\n title: 'Chores & Allowance',\n description:\n 'Family task management with approval workflows. Teach financial accountability safely.',\n tags: ['Family', 'Ops'],\n capabilities: 'Tasks, Approvals, Notifications',\n previewUrl: '/sandbox?template=chores-allowance',\n docsUrl: '/docs/specs/workflows',\n },\n {\n id: 'service-dispatch',\n templateId: 'messaging-app' as TemplateId,\n title: 'Service Dispatch',\n description:\n 'Field service scheduling, routing, and invoicing. Real-time coordination with policy gates.',\n tags: ['Ops', 'Trades'],\n capabilities: 'Scheduling, Maps, Invoicing',\n previewUrl: '/sandbox?template=service-dispatch',\n docsUrl: '/docs/specs/workflows',\n },\n {\n id: 'content-review',\n templateId: 'todos-app' as TemplateId,\n title: 'Content Review',\n description:\n 'Multi-stage approval workflow for content. Audit trail for every decision.',\n tags: ['Ops'],\n capabilities: 'Workflows, Approvals, Comments',\n previewUrl: '/sandbox?template=content-review',\n docsUrl: '/docs/specs/workflows',\n },\n];\ntype LocalTemplate = (typeof templates)[number];\n\nconst allTags = [\n 'Getting Started',\n 'SaaS',\n 'Business',\n 'CRM',\n 'AI',\n 'Trades',\n 'Coliving',\n 'Family',\n 'Ops',\n 'Payments',\n 'Learning',\n 'Platform',\n];\n\nexport const TemplatesPage = () => {\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n const [search, setSearch] = useState('');\n const [preview, setPreview] = useState<TemplateId | null>(null);\n const [waitlistModalOpen, setWaitlistModalOpen] = useState(false);\n const [source, setSource] = useState<'local' | 'registry'>('local');\n const [selectedTemplateForCommand, setSelectedTemplateForCommand] = useState<\n RegistryTemplate | LocalTemplate | null\n >(null);\n\n const { data: registryTemplates = [], isLoading: registryLoading } =\n useRegistryTemplates();\n\n const filtered = templates.filter((t) => {\n const matchTag = !selectedTag || t.tags.includes(selectedTag);\n const matchSearch =\n !search ||\n t.title.toLowerCase().includes(search.toLowerCase()) ||\n t.description.toLowerCase().includes(search.toLowerCase());\n return matchTag && matchSearch;\n });\n\n const commandId = selectedTemplateForCommand\n ? 'templateId' in selectedTemplateForCommand\n ? selectedTemplateForCommand.templateId\n : selectedTemplateForCommand.id\n : '';\n\n return (\n <TooltipProvider>\n <main className=\"\">\n {/* Hero */}\n <section className=\"section-padding hero-gradient border-border relative border-b\">\n <div className=\"mx-auto max-w-4xl space-y-6 text-center\">\n <h1 className=\"text-5xl leading-tight font-bold md:text-6xl\">\n Recipe templates\n </h1>\n <p className=\"text-muted-foreground text-lg\">\n Ready-to-use, customizable recipes. Policies built in. One-click\n deploy.\n </p>\n </div>\n </section>\n\n {/* Search & Filter */}\n <section className=\"section-padding border-border border-b\">\n <div className=\"mx-auto max-w-6xl space-y-6\">\n <div className=\"flex items-center justify-between gap-3\">\n <div className=\"text-muted-foreground text-sm\">Source:</div>\n <div className=\"flex gap-2\">\n <button\n onClick={() => setSource('local')}\n className={cn(\n 'rounded-full px-4 py-2 text-sm font-medium transition-colors',\n {\n 'bg-violet-500 text-white': source === 'local',\n 'bg-card border-border hover:bg-card/80 border':\n source !== 'local',\n }\n )}\n aria-pressed={source === 'local'}\n >\n Local\n </button>\n <button\n onClick={() => setSource('registry')}\n className={cn(\n 'rounded-full px-4 py-2 text-sm font-medium transition-colors',\n {\n 'bg-violet-500 text-white': source === 'registry',\n 'bg-card border-border hover:bg-card/80 border':\n source !== 'registry',\n }\n )}\n aria-pressed={source === 'registry'}\n >\n Community\n </button>\n </div>\n </div>\n <div className=\"relative\">\n <Search\n className=\"text-muted-foreground absolute top-3 left-3\"\n size={20}\n />\n <input\n type=\"text\"\n placeholder=\"Search templates...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n 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\"\n aria-label=\"Search templates\"\n />\n </div>\n <div className=\"flex flex-wrap gap-2\">\n <button\n onClick={() => setSelectedTag(null)}\n className={`rounded-full px-4 py-2 text-sm font-medium transition-colors ${\n selectedTag === null\n ? 'bg-violet-500 text-white'\n : 'bg-card border-border hover:bg-card/80 border'\n }`}\n aria-pressed={selectedTag === null}\n >\n All\n </button>\n {allTags.map((tag) => (\n <button\n key={tag}\n onClick={() => setSelectedTag(tag)}\n className={cn(\n `rounded-full px-4 py-2 text-sm font-medium transition-colors`,\n {\n 'bg-violet-500 text-white': selectedTag === tag,\n 'bg-card border-border hover:bg-card/80 border':\n selectedTag !== tag,\n }\n )}\n aria-pressed={selectedTag === tag}\n >\n {tag}\n </button>\n ))}\n </div>\n </div>\n </section>\n\n {/* Templates Grid */}\n <section className=\"section-padding\">\n <div className=\"mx-auto max-w-6xl\">\n {source === 'registry' ? (\n registryLoading ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-muted-foreground\">\n Loading community templates…\n </p>\n </div>\n ) : registryTemplates.length === 0 ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-muted-foreground\">\n No community templates found (configure\n `NEXT_PUBLIC_CONTRACTSPEC_REGISTRY_URL`).\n </p>\n </div>\n ) : (\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {registryTemplates.map((t) => (\n <div\n key={t.id}\n className=\"card-subtle relative flex flex-col space-y-4 p-6 transition-colors hover:border-violet-500/50\"\n >\n <div>\n <h3 className=\"text-lg font-bold\">{t.name}</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n {t.description}\n </p>\n </div>\n <div className=\"flex-1 space-y-2\">\n <div className=\"flex flex-wrap gap-1\">\n {t.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded border border-violet-500/20 bg-violet-500/10 px-2 py-1 text-xs text-violet-300\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n <div className=\"flex gap-2 pt-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"btn-ghost flex-1 text-center text-xs\"\n onClick={() => {\n const local = getTemplate(t.id as TemplateId);\n if (!local) {\n setSelectedTemplateForCommand(t);\n return;\n }\n setPreview(t.id as TemplateId);\n }}\n >\n Preview\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Preview this template (if available locally)</p>\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"btn-primary flex-1 text-center text-xs\"\n onClick={() => {\n captureAnalyticsEvent(\n analyticsEventNames.EXAMPLE_REPO_OPEN,\n {\n surface: 'templates',\n templateId: t.id,\n source: 'registry',\n }\n );\n setSelectedTemplateForCommand(t);\n }}\n >\n Use Template\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Get CLI command</p>\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n ))}\n </div>\n )\n ) : filtered.length === 0 ? (\n <div className=\"py-12 text-center\">\n <p className=\"text-muted-foreground\">\n No templates match your filters. Try a different search.\n </p>\n </div>\n ) : (\n <div className=\"grid gap-6 md:grid-cols-2 lg:grid-cols-3\">\n {filtered.map((template, i) => (\n <div\n key={i}\n className=\"card-subtle relative flex flex-col space-y-4 p-6 transition-colors hover:border-violet-500/50\"\n >\n {'isNew' in template && template.isNew && (\n <span className=\"absolute top-3 right-3 rounded-full bg-green-500 px-2 py-0.5 text-xs font-semibold text-white\">\n New\n </span>\n )}\n <div>\n <h3 className=\"text-lg font-bold\">{template.title}</h3>\n <p className=\"text-muted-foreground mt-1 text-sm\">\n {template.description}\n </p>\n </div>\n <div className=\"flex-1 space-y-2\">\n <p className=\"text-muted-foreground text-xs\">\n <span className=\"text-foreground font-medium\">\n Capabilities:\n </span>{' '}\n {template.capabilities}\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {template.tags.map((tag) => (\n <span\n key={tag}\n className=\"rounded border border-violet-500/20 bg-violet-500/10 px-2 py-1 text-xs text-violet-300\"\n >\n {tag}\n </span>\n ))}\n </div>\n </div>\n <div className=\"flex gap-2 pt-4\">\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"btn-ghost flex-1 text-center text-xs\"\n onClick={() => setPreview(template.templateId)}\n >\n Preview\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Preview this template in a modal</p>\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n className=\"btn-primary flex-1 text-center text-xs\"\n onClick={() => {\n captureAnalyticsEvent(\n analyticsEventNames.EXAMPLE_REPO_OPEN,\n {\n surface: 'templates',\n templateId: template.templateId,\n source: 'local',\n }\n );\n setSelectedTemplateForCommand(template);\n }}\n >\n Use Template\n </button>\n </TooltipTrigger>\n <TooltipContent>\n <p>Get CLI command</p>\n </TooltipContent>\n </Tooltip>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </section>\n\n {/* Extend with Integrations & Knowledge */}\n <section className=\"section-padding border-border bg-striped border-t\">\n <div className=\"mx-auto max-w-6xl space-y-8\">\n <div className=\"space-y-4 text-center\">\n <h2 className=\"text-3xl font-bold md:text-4xl\">\n Extend templates with integrations & knowledge\n </h2>\n <p className=\"text-muted-foreground mx-auto max-w-2xl\">\n Every template can be enhanced with built-in integrations and\n knowledge spaces. Add payments, email, AI, and structured\n knowledge without writing integration code.\n </p>\n </div>\n <div className=\"grid gap-6 md:grid-cols-3\">\n <div className=\"card-subtle space-y-4 p-6\">\n <div className=\"text-3xl\">💳</div>\n <h3 className=\"font-bold\">Add Payments</h3>\n <p className=\"text-muted-foreground text-sm\">\n Connect Stripe to any template for payment processing,\n subscriptions, and invoicing. Type-safe and policy-enforced.\n </p>\n <Link\n href=\"/docs/integrations/stripe\"\n className=\"inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300\"\n >\n Learn more →\n </Link>\n </div>\n <div className=\"card-subtle space-y-4 p-6\">\n <div className=\"text-3xl\">📧</div>\n <h3 className=\"font-bold\">Add Notifications</h3>\n <p className=\"text-muted-foreground text-sm\">\n Send transactional emails via Postmark or Resend. Process\n inbound emails with Gmail API. SMS via Twilio.\n </p>\n <Link\n href=\"/docs/integrations\"\n className=\"inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300\"\n >\n View integrations →\n </Link>\n </div>\n <div className=\"card-subtle space-y-4 p-6\">\n <div className=\"text-3xl\">🧠</div>\n <h3 className=\"font-bold\">Add AI & Knowledge</h3>\n <p className=\"text-muted-foreground text-sm\">\n Power templates with OpenAI, vector search via Qdrant, and\n structured knowledge spaces for context-aware workflows.\n </p>\n <Link\n href=\"/docs/knowledge\"\n className=\"inline-flex items-center gap-1 text-sm text-violet-400 hover:text-violet-300\"\n >\n Learn about knowledge →\n </Link>\n </div>\n </div>\n <div className=\"pt-4 text-center\">\n <p className=\"text-muted-foreground mb-4 text-sm\">\n All integrations are configured per-tenant with automatic health\n checks and credential rotation.\n </p>\n <Link href=\"/docs/architecture\" className=\"btn-primary\">\n View Architecture\n </Link>\n </div>\n </div>\n </section>\n </main>\n\n {/*{preview ? (*/}\n <TemplatePreviewModal\n templateId={preview}\n onClose={() => {\n setPreview(null);\n }}\n />\n {/*) : null}*/}\n\n <Dialog open={waitlistModalOpen} onOpenChange={setWaitlistModalOpen}>\n <DialogContent className=\"max-h-[90vh] max-w-2xl overflow-y-auto\">\n <DialogHeader>\n <DialogTitle>Early Access Required</DialogTitle>\n <DialogDescription>\n ContractSpec Studio is in early access. Join the waitlist to\n deploy projects to our managed cloud.\n </DialogDescription>\n </DialogHeader>\n <WaitlistSection variant=\"compact\" />\n </DialogContent>\n </Dialog>\n\n <Dialog\n open={!!selectedTemplateForCommand}\n onOpenChange={() => setSelectedTemplateForCommand(null)}\n >\n <DialogContent className=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>Use this template</DialogTitle>\n <DialogDescription>\n Initialize a new project with this template using the CLI.\n </DialogDescription>\n </DialogHeader>\n <div className=\"space-y-4 pt-4\">\n <div className=\"rounded-md border border-zinc-800 bg-zinc-950 p-4 font-mono text-sm text-zinc-50\">\n npx contractspec init --template {commandId}\n </div>\n <div className=\"flex gap-2\">\n <button\n className=\"btn-secondary w-full\"\n onClick={() => {\n navigator.clipboard.writeText(\n `npx contractspec init --template ${commandId}`\n );\n captureAnalyticsEvent(\n analyticsEventNames.COPY_COMMAND_CLICK,\n {\n surface: 'templates',\n templateId: commandId,\n filename: 'templates-cli',\n }\n );\n }}\n >\n Copy Command\n </button>\n </div>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <span className=\"border-border w-full border-t\" />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background text-muted-foreground px-2\">\n Or\n </span>\n </div>\n </div>\n <button\n className=\"btn-ghost w-full text-sm\"\n onClick={() => {\n captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {\n surface: 'templates',\n templateId: commandId,\n });\n setSelectedTemplateForCommand(null);\n setWaitlistModalOpen(true);\n }}\n >\n Deploy to Studio (Waitlist)\n </button>\n </div>\n </DialogContent>\n </Dialog>\n </TooltipProvider>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/templates/TemplatesPage.d.ts
|
|
4
|
+
declare function TemplatesMarketingPage(): react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { TemplatesMarketingPage };
|
|
7
|
+
//# sourceMappingURL=TemplatesPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPage.d.ts","names":[],"sources":["../../../src/components/templates/TemplatesPage.tsx"],"mappings":";;;iBA0BgB,sBAAA,CAAA,GAAsB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
4
|
+
import { Button, ButtonLink, Input, MarketingCard, MarketingCardContent, MarketingCardDescription, MarketingCardHeader, MarketingCardTitle, MarketingSection } from "@contractspec/lib.design-system";
|
|
5
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import { useMemo, useState } from "react";
|
|
7
|
+
import { listTemplates } from "@contractspec/module.examples";
|
|
8
|
+
|
|
9
|
+
//#region src/components/templates/TemplatesPage.tsx
|
|
10
|
+
function matchesQuery(t, query) {
|
|
11
|
+
const q = query.trim().toLowerCase();
|
|
12
|
+
if (!q) return true;
|
|
13
|
+
return `${t.id} ${t.name} ${t.description} ${t.tags.join(" ")}`.toLowerCase().includes(q);
|
|
14
|
+
}
|
|
15
|
+
function TemplatesMarketingPage() {
|
|
16
|
+
const [query, setQuery] = useState("");
|
|
17
|
+
const templates = useMemo(() => listTemplates(), []);
|
|
18
|
+
const filtered = useMemo(() => templates.filter((t) => matchesQuery(t, query)), [templates, query]);
|
|
19
|
+
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
20
|
+
/* @__PURE__ */ jsx(MarketingSection, {
|
|
21
|
+
tone: "default",
|
|
22
|
+
children: /* @__PURE__ */ jsxs(VStack, {
|
|
23
|
+
as: "header",
|
|
24
|
+
gap: "lg",
|
|
25
|
+
align: "center",
|
|
26
|
+
children: [/* @__PURE__ */ jsxs(VStack, {
|
|
27
|
+
gap: "sm",
|
|
28
|
+
align: "center",
|
|
29
|
+
children: [/* @__PURE__ */ jsx(ButtonLink, {
|
|
30
|
+
href: "/docs",
|
|
31
|
+
variant: "ghost",
|
|
32
|
+
children: "Docs"
|
|
33
|
+
}), /* @__PURE__ */ jsx(ButtonLink, {
|
|
34
|
+
href: "/sandbox",
|
|
35
|
+
variant: "ghost",
|
|
36
|
+
children: "Open Sandbox"
|
|
37
|
+
})]
|
|
38
|
+
}), /* @__PURE__ */ jsx(VStack, {
|
|
39
|
+
gap: "sm",
|
|
40
|
+
align: "center",
|
|
41
|
+
children: /* @__PURE__ */ jsx(ButtonLink, {
|
|
42
|
+
href: "/templates",
|
|
43
|
+
variant: "default",
|
|
44
|
+
children: "Templates"
|
|
45
|
+
})
|
|
46
|
+
})]
|
|
47
|
+
})
|
|
48
|
+
}),
|
|
49
|
+
/* @__PURE__ */ jsx(MarketingSection, {
|
|
50
|
+
tone: "muted",
|
|
51
|
+
children: /* @__PURE__ */ jsxs(VStack, {
|
|
52
|
+
gap: "lg",
|
|
53
|
+
children: [/* @__PURE__ */ jsx(VStack, {
|
|
54
|
+
gap: "sm",
|
|
55
|
+
children: /* @__PURE__ */ jsx(ButtonLink, {
|
|
56
|
+
href: "/templates",
|
|
57
|
+
variant: "ghost",
|
|
58
|
+
children: "Browse all examples"
|
|
59
|
+
})
|
|
60
|
+
}), /* @__PURE__ */ jsx(HStack, {
|
|
61
|
+
gap: "md",
|
|
62
|
+
align: "center",
|
|
63
|
+
justify: "between",
|
|
64
|
+
wrap: "wrap",
|
|
65
|
+
children: /* @__PURE__ */ jsx(Input, {
|
|
66
|
+
"aria-label": "Search templates and examples",
|
|
67
|
+
placeholder: "Search templates and examples…",
|
|
68
|
+
value: query,
|
|
69
|
+
onChange: (e) => setQuery(e.target.value)
|
|
70
|
+
})
|
|
71
|
+
})]
|
|
72
|
+
})
|
|
73
|
+
}),
|
|
74
|
+
/* @__PURE__ */ jsx(MarketingSection, {
|
|
75
|
+
tone: "default",
|
|
76
|
+
children: /* @__PURE__ */ jsx(VStack, {
|
|
77
|
+
gap: "lg",
|
|
78
|
+
children: /* @__PURE__ */ jsx(HStack, {
|
|
79
|
+
gap: "md",
|
|
80
|
+
wrap: "wrap",
|
|
81
|
+
children: filtered.map((t) => /* @__PURE__ */ jsxs(MarketingCard, {
|
|
82
|
+
className: "w-full md:w-[calc(50%-0.75rem)] lg:w-[calc(33.333%-1rem)]",
|
|
83
|
+
children: [/* @__PURE__ */ jsxs(MarketingCardHeader, { children: [/* @__PURE__ */ jsxs(MarketingCardTitle, { children: [
|
|
84
|
+
t.icon,
|
|
85
|
+
" ",
|
|
86
|
+
t.name
|
|
87
|
+
] }), /* @__PURE__ */ jsx(MarketingCardDescription, { children: t.description })] }), /* @__PURE__ */ jsx(MarketingCardContent, { children: /* @__PURE__ */ jsxs(VStack, {
|
|
88
|
+
gap: "md",
|
|
89
|
+
children: [/* @__PURE__ */ jsx(HStack, {
|
|
90
|
+
gap: "sm",
|
|
91
|
+
wrap: "wrap",
|
|
92
|
+
children: t.tags.slice(0, 6).map((tag) => /* @__PURE__ */ jsx(ButtonLink, {
|
|
93
|
+
href: `/templates?tag=${encodeURIComponent(tag)}`,
|
|
94
|
+
variant: "ghost",
|
|
95
|
+
children: tag
|
|
96
|
+
}, `${t.id}-${tag}`))
|
|
97
|
+
}), /* @__PURE__ */ jsxs(HStack, {
|
|
98
|
+
gap: "sm",
|
|
99
|
+
justify: "between",
|
|
100
|
+
wrap: "wrap",
|
|
101
|
+
children: [/* @__PURE__ */ jsx(ButtonLinkToSandbox, { templateId: t.id }), /* @__PURE__ */ jsx(Button, {
|
|
102
|
+
variant: "outline",
|
|
103
|
+
onClick: () => void 0,
|
|
104
|
+
disabled: true,
|
|
105
|
+
children: "Install to Studio (soon)"
|
|
106
|
+
})]
|
|
107
|
+
})]
|
|
108
|
+
}) })]
|
|
109
|
+
}, t.id))
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
] });
|
|
114
|
+
}
|
|
115
|
+
function ButtonLinkToSandbox({ templateId }) {
|
|
116
|
+
return /* @__PURE__ */ jsx(ButtonLink, {
|
|
117
|
+
href: `/sandbox?template=${encodeURIComponent(templateId)}`,
|
|
118
|
+
variant: "default",
|
|
119
|
+
children: "Preview"
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
//#endregion
|
|
124
|
+
export { TemplatesMarketingPage };
|
|
125
|
+
//# sourceMappingURL=TemplatesPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPage.js","names":[],"sources":["../../../src/components/templates/TemplatesPage.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo, useState } from 'react';\nimport {\n Button,\n ButtonLink,\n Input,\n MarketingCard,\n MarketingCardContent,\n MarketingCardDescription,\n MarketingCardHeader,\n MarketingCardTitle,\n MarketingSection,\n} from '@contractspec/lib.design-system';\nimport { HStack, VStack } from '@contractspec/lib.ui-kit-web/ui/stack';\nimport { listTemplates } from '@contractspec/module.examples';\nimport type { TemplateDefinition } from '@contractspec/lib.example-shared-ui';\n\nfunction matchesQuery(t: TemplateDefinition, query: string): boolean {\n const q = query.trim().toLowerCase();\n if (!q) return true;\n const hay =\n `${t.id} ${t.name} ${t.description} ${t.tags.join(' ')}`.toLowerCase();\n return hay.includes(q);\n}\n\nexport function TemplatesMarketingPage() {\n const [query, setQuery] = useState('');\n\n const templates = useMemo(() => listTemplates(), []);\n const filtered = useMemo(\n () => templates.filter((t) => matchesQuery(t, query)),\n [templates, query]\n );\n\n return (\n <>\n <MarketingSection tone=\"default\">\n <VStack as=\"header\" gap=\"lg\" align=\"center\">\n <VStack gap=\"sm\" align=\"center\">\n <ButtonLink href=\"/docs\" variant=\"ghost\">\n Docs\n </ButtonLink>\n <ButtonLink href=\"/sandbox\" variant=\"ghost\">\n Open Sandbox\n </ButtonLink>\n </VStack>\n <VStack gap=\"sm\" align=\"center\">\n <ButtonLink href=\"/templates\" variant=\"default\">\n Templates\n </ButtonLink>\n </VStack>\n </VStack>\n </MarketingSection>\n\n <MarketingSection tone=\"muted\">\n <VStack gap=\"lg\">\n <VStack gap=\"sm\">\n <ButtonLink href=\"/templates\" variant=\"ghost\">\n Browse all examples\n </ButtonLink>\n </VStack>\n <HStack gap=\"md\" align=\"center\" justify=\"between\" wrap=\"wrap\">\n <Input\n aria-label=\"Search templates and examples\"\n placeholder=\"Search templates and examples…\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n />\n </HStack>\n </VStack>\n </MarketingSection>\n\n <MarketingSection tone=\"default\">\n <VStack gap=\"lg\">\n <HStack gap=\"md\" wrap=\"wrap\">\n {filtered.map((t) => (\n <MarketingCard\n key={t.id}\n className=\"w-full md:w-[calc(50%-0.75rem)] lg:w-[calc(33.333%-1rem)]\"\n >\n <MarketingCardHeader>\n <MarketingCardTitle>\n {t.icon} {t.name}\n </MarketingCardTitle>\n <MarketingCardDescription>\n {t.description}\n </MarketingCardDescription>\n </MarketingCardHeader>\n <MarketingCardContent>\n <VStack gap=\"md\">\n <HStack gap=\"sm\" wrap=\"wrap\">\n {t.tags.slice(0, 6).map((tag: string) => (\n <ButtonLink\n key={`${t.id}-${tag}`}\n href={`/templates?tag=${encodeURIComponent(tag)}`}\n variant=\"ghost\"\n >\n {tag}\n </ButtonLink>\n ))}\n </HStack>\n <HStack gap=\"sm\" justify=\"between\" wrap=\"wrap\">\n <ButtonLinkToSandbox templateId={t.id} />\n <Button variant=\"outline\" onClick={() => void 0} disabled>\n Install to Studio (soon)\n </Button>\n </HStack>\n </VStack>\n </MarketingCardContent>\n </MarketingCard>\n ))}\n </HStack>\n </VStack>\n </MarketingSection>\n </>\n );\n}\n\nfunction ButtonLinkToSandbox({ templateId }: { templateId: string }) {\n return (\n <ButtonLink\n href={`/sandbox?template=${encodeURIComponent(templateId)}`}\n variant=\"default\"\n >\n Preview\n </ButtonLink>\n );\n}\n"],"mappings":";;;;;;;;;AAkBA,SAAS,aAAa,GAAuB,OAAwB;CACnE,MAAM,IAAI,MAAM,MAAM,CAAC,aAAa;AACpC,KAAI,CAAC,EAAG,QAAO;AAGf,QADE,GAAG,EAAE,GAAG,GAAG,EAAE,KAAK,GAAG,EAAE,YAAY,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,aAAa,CAC7D,SAAS,EAAE;;AAGxB,SAAgB,yBAAyB;CACvC,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CAEtC,MAAM,YAAY,cAAc,eAAe,EAAE,EAAE,CAAC;CACpD,MAAM,WAAW,cACT,UAAU,QAAQ,MAAM,aAAa,GAAG,MAAM,CAAC,EACrD,CAAC,WAAW,MAAM,CACnB;AAED,QACE;EACE,oBAAC;GAAiB,MAAK;aACrB,qBAAC;IAAO,IAAG;IAAS,KAAI;IAAK,OAAM;eACjC,qBAAC;KAAO,KAAI;KAAK,OAAM;gBACrB,oBAAC;MAAW,MAAK;MAAQ,SAAQ;gBAAQ;OAE5B,EACb,oBAAC;MAAW,MAAK;MAAW,SAAQ;gBAAQ;OAE/B;MACN,EACT,oBAAC;KAAO,KAAI;KAAK,OAAM;eACrB,oBAAC;MAAW,MAAK;MAAa,SAAQ;gBAAU;OAEnC;MACN;KACF;IACQ;EAEnB,oBAAC;GAAiB,MAAK;aACrB,qBAAC;IAAO,KAAI;eACV,oBAAC;KAAO,KAAI;eACV,oBAAC;MAAW,MAAK;MAAa,SAAQ;gBAAQ;OAEjC;MACN,EACT,oBAAC;KAAO,KAAI;KAAK,OAAM;KAAS,SAAQ;KAAU,MAAK;eACrD,oBAAC;MACC,cAAW;MACX,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;OACzC;MACK;KACF;IACQ;EAEnB,oBAAC;GAAiB,MAAK;aACrB,oBAAC;IAAO,KAAI;cACV,oBAAC;KAAO,KAAI;KAAK,MAAK;eACnB,SAAS,KAAK,MACb,qBAAC;MAEC,WAAU;iBAEV,qBAAC,kCACC,qBAAC;OACE,EAAE;OAAK;OAAE,EAAE;UACO,EACrB,oBAAC,sCACE,EAAE,cACsB,IACP,EACtB,oBAAC,kCACC,qBAAC;OAAO,KAAI;kBACV,oBAAC;QAAO,KAAI;QAAK,MAAK;kBACnB,EAAE,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK,QACvB,oBAAC;SAEC,MAAM,kBAAkB,mBAAmB,IAAI;SAC/C,SAAQ;mBAEP;WAJI,GAAG,EAAE,GAAG,GAAG,MAKL,CACb;SACK,EACT,qBAAC;QAAO,KAAI;QAAK,SAAQ;QAAU,MAAK;mBACtC,oBAAC,uBAAoB,YAAY,EAAE,KAAM,EACzC,oBAAC;SAAO,SAAQ;SAAU,eAAe,KAAK;SAAG;mBAAS;UAEjD;SACF;QACF,GACY;QA/BlB,EAAE,GAgCO,CAChB;MACK;KACF;IACQ;KAClB;;AAIP,SAAS,oBAAoB,EAAE,cAAsC;AACnE,QACE,oBAAC;EACC,MAAM,qBAAqB,mBAAmB,WAAW;EACzD,SAAQ;YACT;GAEY"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
import { TemplateId } from "@contractspec/lib.example-shared-ui";
|
|
3
|
+
|
|
4
|
+
//#region src/components/templates/TemplatesPreviewModal.d.ts
|
|
5
|
+
interface TemplatePreviewModalProps {
|
|
6
|
+
templateId: TemplateId | null;
|
|
7
|
+
onClose: () => void;
|
|
8
|
+
}
|
|
9
|
+
declare const TemplatePreviewModal: ({
|
|
10
|
+
templateId,
|
|
11
|
+
onClose
|
|
12
|
+
}: TemplatePreviewModalProps) => react_jsx_runtime0.JSX.Element;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { TemplatePreviewModal };
|
|
15
|
+
//# sourceMappingURL=TemplatesPreviewModal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPreviewModal.d.ts","names":[],"sources":["../../../src/components/templates/TemplatesPreviewModal.tsx"],"mappings":";;;;UAmGU,yBAAA;EACR,UAAA,EAAY,UAAA;EACZ,OAAA;AAAA;AAAA,cAmBW,oBAAA;EAAwB,UAAA;EAAA;AAAA,GAGlC,yBAAA,KAAyB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { Dialog, DialogContent } from "@contractspec/lib.ui-kit-web/ui/dialog";
|
|
6
|
+
import dynamic from "next/dynamic";
|
|
7
|
+
import { ScrollArea } from "@contractspec/lib.ui-kit-web/ui/scroll-area";
|
|
8
|
+
import { LoadingSpinner } from "@contractspec/lib.ui-kit-web/ui/atoms/LoadingSpinner";
|
|
9
|
+
|
|
10
|
+
//#region src/components/templates/TemplatesPreviewModal.tsx
|
|
11
|
+
const TemplateShell = dynamic(() => import("@contractspec/lib.example-shared-ui").then((mod) => mod.TemplateShell), {
|
|
12
|
+
ssr: false,
|
|
13
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
14
|
+
});
|
|
15
|
+
const TodosTaskList = dynamic(() => import("@contractspec/bundle.library/components/templates/todos/TaskList").then((mod) => mod.TaskList), {
|
|
16
|
+
ssr: false,
|
|
17
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
18
|
+
});
|
|
19
|
+
const MessagingWorkspace = dynamic(() => import("@contractspec/bundle.library/components/templates/messaging/MessagingWorkspace").then((mod) => mod.MessagingWorkspace), {
|
|
20
|
+
ssr: false,
|
|
21
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
22
|
+
});
|
|
23
|
+
const RecipesExperience = dynamic(() => import("@contractspec/bundle.library/components/templates/recipes/RecipeList").then((mod) => mod.RecipeList), {
|
|
24
|
+
ssr: false,
|
|
25
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
26
|
+
});
|
|
27
|
+
const SaasDashboard = dynamic(() => import("@contractspec/example.saas-boilerplate").then((mod) => mod.SaasDashboard), {
|
|
28
|
+
ssr: false,
|
|
29
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
30
|
+
});
|
|
31
|
+
const CrmDashboard = dynamic(() => import("@contractspec/example.crm-pipeline").then((mod) => mod.CrmDashboard), {
|
|
32
|
+
ssr: false,
|
|
33
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
34
|
+
});
|
|
35
|
+
const AgentDashboard = dynamic(() => import("@contractspec/example.agent-console/ui").then((mod) => mod.AgentDashboard), {
|
|
36
|
+
ssr: false,
|
|
37
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
38
|
+
});
|
|
39
|
+
const WorkflowDashboard = dynamic(() => import("@contractspec/example.workflow-system/ui").then((mod) => mod.WorkflowDashboard), {
|
|
40
|
+
ssr: false,
|
|
41
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
42
|
+
});
|
|
43
|
+
const MarketplaceDashboard = dynamic(() => import("@contractspec/example.marketplace/ui").then((mod) => mod.MarketplaceDashboard), {
|
|
44
|
+
ssr: false,
|
|
45
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
46
|
+
});
|
|
47
|
+
const IntegrationDashboard = dynamic(() => import("@contractspec/example.integration-hub/ui").then((mod) => mod.IntegrationDashboard), {
|
|
48
|
+
ssr: false,
|
|
49
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
50
|
+
});
|
|
51
|
+
const AnalyticsDashboard = dynamic(() => import("@contractspec/example.analytics-dashboard").then((mod) => mod.AnalyticsDashboard), {
|
|
52
|
+
ssr: false,
|
|
53
|
+
loading: () => /* @__PURE__ */ jsx(LoadingSpinner, {})
|
|
54
|
+
});
|
|
55
|
+
const TemplatePreviewModal = ({ templateId, onClose }) => {
|
|
56
|
+
const previewComponent = useMemo(() => {
|
|
57
|
+
switch (templateId) {
|
|
58
|
+
case "todos-app": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
59
|
+
title: "Starter tasks",
|
|
60
|
+
description: "Track work items with filters, priorities, and per-tenant data isolation.",
|
|
61
|
+
showSaveAction: false,
|
|
62
|
+
children: /* @__PURE__ */ jsx(TodosTaskList, {})
|
|
63
|
+
});
|
|
64
|
+
case "messaging-app": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
65
|
+
title: "Messaging workspace",
|
|
66
|
+
description: "Realtime-ready messaging surface with optimistic delivery.",
|
|
67
|
+
showSaveAction: false,
|
|
68
|
+
children: /* @__PURE__ */ jsx(MessagingWorkspace, {})
|
|
69
|
+
});
|
|
70
|
+
case "recipe-app-i18n": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
71
|
+
title: "Ceremony recipes",
|
|
72
|
+
description: "Switch locales and preview how rituals translate across teams.",
|
|
73
|
+
showSaveAction: false,
|
|
74
|
+
children: /* @__PURE__ */ jsx(RecipesExperience, {})
|
|
75
|
+
});
|
|
76
|
+
case "saas-boilerplate": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
77
|
+
title: "SaaS Boilerplate",
|
|
78
|
+
description: "Multi-tenant organizations, projects, settings, and billing usage tracking.",
|
|
79
|
+
showSaveAction: false,
|
|
80
|
+
children: /* @__PURE__ */ jsx(SaasDashboard, {})
|
|
81
|
+
});
|
|
82
|
+
case "crm-pipeline": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
83
|
+
title: "CRM Pipeline",
|
|
84
|
+
description: "Sales CRM with contacts, companies, deals, and pipeline stages.",
|
|
85
|
+
showSaveAction: false,
|
|
86
|
+
children: /* @__PURE__ */ jsx(CrmDashboard, {})
|
|
87
|
+
});
|
|
88
|
+
case "agent-console": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
89
|
+
title: "AI Agent Console",
|
|
90
|
+
description: "AI agent orchestration with tools, agents, runs, and execution logs.",
|
|
91
|
+
showSaveAction: false,
|
|
92
|
+
children: /* @__PURE__ */ jsx(AgentDashboard, {})
|
|
93
|
+
});
|
|
94
|
+
case "workflow-system": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
95
|
+
title: "Workflow System",
|
|
96
|
+
description: "Multi-step workflows with role-based approvals.",
|
|
97
|
+
showSaveAction: false,
|
|
98
|
+
children: /* @__PURE__ */ jsx(WorkflowDashboard, {})
|
|
99
|
+
});
|
|
100
|
+
case "marketplace": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
101
|
+
title: "Marketplace",
|
|
102
|
+
description: "Two-sided marketplace with stores, products, and orders.",
|
|
103
|
+
showSaveAction: false,
|
|
104
|
+
children: /* @__PURE__ */ jsx(MarketplaceDashboard, {})
|
|
105
|
+
});
|
|
106
|
+
case "integration-hub": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
107
|
+
title: "Integration Hub",
|
|
108
|
+
description: "Third-party integrations with sync and field mapping.",
|
|
109
|
+
showSaveAction: false,
|
|
110
|
+
children: /* @__PURE__ */ jsx(IntegrationDashboard, {})
|
|
111
|
+
});
|
|
112
|
+
case "analytics-dashboard": return /* @__PURE__ */ jsx(TemplateShell, {
|
|
113
|
+
title: "Analytics Dashboard",
|
|
114
|
+
description: "Custom dashboards with widgets and queries.",
|
|
115
|
+
showSaveAction: false,
|
|
116
|
+
children: /* @__PURE__ */ jsx(AnalyticsDashboard, {})
|
|
117
|
+
});
|
|
118
|
+
case null: return null;
|
|
119
|
+
default: return null;
|
|
120
|
+
}
|
|
121
|
+
}, [templateId]);
|
|
122
|
+
return /* @__PURE__ */ jsx(Dialog, {
|
|
123
|
+
open: !!previewComponent,
|
|
124
|
+
onOpenChange: onClose,
|
|
125
|
+
children: /* @__PURE__ */ jsx(DialogContent, {
|
|
126
|
+
className: "mb-8 flex h-[calc(100vh-2rem)] min-w-[calc(100vw-2rem)] flex-col justify-between gap-0 p-0",
|
|
127
|
+
children: /* @__PURE__ */ jsx(ScrollArea, {
|
|
128
|
+
className: "flex flex-col justify-between overflow-hidden",
|
|
129
|
+
children: previewComponent
|
|
130
|
+
})
|
|
131
|
+
})
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
//#endregion
|
|
136
|
+
export { TemplatePreviewModal };
|
|
137
|
+
//# sourceMappingURL=TemplatesPreviewModal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TemplatesPreviewModal.js","names":[],"sources":["../../../src/components/templates/TemplatesPreviewModal.tsx"],"sourcesContent":["'use client';\n\nimport { useMemo } from 'react';\n\nimport dynamic from 'next/dynamic';\nimport { Dialog, DialogContent } from '@contractspec/lib.ui-kit-web/ui/dialog';\nimport { ScrollArea } from '@contractspec/lib.ui-kit-web/ui/scroll-area';\nimport { LoadingSpinner } from '@contractspec/lib.ui-kit-web/ui/atoms/LoadingSpinner';\nimport type { TemplateId } from '@contractspec/lib.example-shared-ui';\n\n// Dynamically import template components with ssr: false\nconst TemplateShell = dynamic(\n () =>\n import('@contractspec/lib.example-shared-ui').then(\n (mod) => mod.TemplateShell\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst TodosTaskList = dynamic(\n () =>\n import('@contractspec/bundle.library/components/templates/todos/TaskList').then(\n (mod) => mod.TaskList\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst MessagingWorkspace = dynamic(\n () =>\n import('@contractspec/bundle.library/components/templates/messaging/MessagingWorkspace').then(\n (mod) => mod.MessagingWorkspace\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst RecipesExperience = dynamic(\n () =>\n import('@contractspec/bundle.library/components/templates/recipes/RecipeList').then(\n (mod) => mod.RecipeList\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst SaasDashboard = dynamic(\n () =>\n import('@contractspec/example.saas-boilerplate').then(\n (mod) => mod.SaasDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst CrmDashboard = dynamic(\n () =>\n import('@contractspec/example.crm-pipeline').then(\n (mod) => mod.CrmDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst AgentDashboard = dynamic(\n () =>\n import('@contractspec/example.agent-console/ui').then(\n (mod) => mod.AgentDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst WorkflowDashboard = dynamic(\n () =>\n import('@contractspec/example.workflow-system/ui').then(\n (mod) => mod.WorkflowDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst MarketplaceDashboard = dynamic(\n () =>\n import('@contractspec/example.marketplace/ui').then(\n (mod) => mod.MarketplaceDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst IntegrationDashboard = dynamic(\n () =>\n import('@contractspec/example.integration-hub/ui').then(\n (mod) => mod.IntegrationDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\nconst AnalyticsDashboard = dynamic(\n () =>\n import('@contractspec/example.analytics-dashboard').then(\n (mod) => mod.AnalyticsDashboard\n ),\n { ssr: false, loading: () => <LoadingSpinner /> }\n);\n\ninterface TemplatePreviewModalProps {\n templateId: TemplateId | null;\n onClose: () => void;\n}\n//\n// return (\n// <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/70 px-4 py-10\">\n// <div className=\"bg-background relative h-full max-h-[90vh] w-full max-w-5xl overflow-y-auto rounded-3xl p-6 shadow-2xl\">\n// <button\n// type=\"button\"\n// className=\"btn-ghost absolute top-4 right-4 text-sm\"\n// onClick={onClose}\n// >\n// Close\n// </button>\n// {previewComponent}\n// </div>\n// </div>\n// );\n// };\n\nexport const TemplatePreviewModal = ({\n templateId,\n onClose,\n}: TemplatePreviewModalProps) => {\n const previewComponent = useMemo(() => {\n switch (templateId) {\n case 'todos-app':\n return (\n <TemplateShell\n title=\"Starter tasks\"\n description=\"Track work items with filters, priorities, and per-tenant data isolation.\"\n showSaveAction={false}\n >\n <TodosTaskList />\n </TemplateShell>\n );\n case 'messaging-app':\n return (\n <TemplateShell\n title=\"Messaging workspace\"\n description=\"Realtime-ready messaging surface with optimistic delivery.\"\n showSaveAction={false}\n >\n <MessagingWorkspace />\n </TemplateShell>\n );\n case 'recipe-app-i18n':\n return (\n <TemplateShell\n title=\"Ceremony recipes\"\n description=\"Switch locales and preview how rituals translate across teams.\"\n showSaveAction={false}\n >\n <RecipesExperience />\n </TemplateShell>\n );\n case 'saas-boilerplate':\n return (\n <TemplateShell\n title=\"SaaS Boilerplate\"\n description=\"Multi-tenant organizations, projects, settings, and billing usage tracking.\"\n showSaveAction={false}\n >\n <SaasDashboard />\n </TemplateShell>\n );\n case 'crm-pipeline':\n return (\n <TemplateShell\n title=\"CRM Pipeline\"\n description=\"Sales CRM with contacts, companies, deals, and pipeline stages.\"\n showSaveAction={false}\n >\n <CrmDashboard />\n </TemplateShell>\n );\n case 'agent-console':\n return (\n <TemplateShell\n title=\"AI Agent Console\"\n description=\"AI agent orchestration with tools, agents, runs, and execution logs.\"\n showSaveAction={false}\n >\n <AgentDashboard />\n </TemplateShell>\n );\n case 'workflow-system':\n return (\n <TemplateShell\n title=\"Workflow System\"\n description=\"Multi-step workflows with role-based approvals.\"\n showSaveAction={false}\n >\n <WorkflowDashboard />\n </TemplateShell>\n );\n case 'marketplace':\n return (\n <TemplateShell\n title=\"Marketplace\"\n description=\"Two-sided marketplace with stores, products, and orders.\"\n showSaveAction={false}\n >\n <MarketplaceDashboard />\n </TemplateShell>\n );\n case 'integration-hub':\n return (\n <TemplateShell\n title=\"Integration Hub\"\n description=\"Third-party integrations with sync and field mapping.\"\n showSaveAction={false}\n >\n <IntegrationDashboard />\n </TemplateShell>\n );\n case 'analytics-dashboard':\n return (\n <TemplateShell\n title=\"Analytics Dashboard\"\n description=\"Custom dashboards with widgets and queries.\"\n showSaveAction={false}\n >\n <AnalyticsDashboard />\n </TemplateShell>\n );\n case null:\n return null;\n default:\n return null;\n }\n }, [templateId]);\n\n return (\n <Dialog open={!!previewComponent} onOpenChange={onClose}>\n {/*<DialogTrigger asChild>*/}\n {/* <Button variant=\"outline\">Fullscreen Dialog</Button>*/}\n {/*</DialogTrigger>*/}\n <DialogContent className=\"mb-8 flex h-[calc(100vh-2rem)] min-w-[calc(100vw-2rem)] flex-col justify-between gap-0 p-0\">\n <ScrollArea className=\"flex flex-col justify-between overflow-hidden\">\n {/*<DialogHeader className=\"contents space-y-0 text-left\">*/}\n {/* <DialogTitle className=\"px-6 pt-6\">Product Information</DialogTitle>*/}\n {/* <DialogDescription asChild>*/}\n {/* </DialogDescription>*/}\n {/*</DialogHeader>*/}\n {previewComponent}\n </ScrollArea>\n {/*<DialogFooter className=\"px-6 pb-6 sm:justify-end\">*/}\n {/* <DialogClose asChild>*/}\n {/* <Button variant=\"outline\">*/}\n {/* <ChevronLeftIcon />*/}\n {/* Back*/}\n {/* </Button>*/}\n {/* </DialogClose>*/}\n {/* <Button type=\"button\">Read More</Button>*/}\n {/*</DialogFooter>*/}\n </DialogContent>\n </Dialog>\n );\n};\n"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ChangelogPage } from "./components/marketing/ChangelogPage.js";
|
|
2
|
+
import { CofounderPage } from "./components/marketing/CofounderPage.js";
|
|
3
|
+
import { ContactClient } from "./components/marketing/ContactClient.js";
|
|
4
|
+
import { ContributePage } from "./components/marketing/ContributePage.js";
|
|
5
|
+
import { DesignPartnerPage } from "./components/marketing/DesignPartnerPage.js";
|
|
6
|
+
import { LandingPage } from "./components/marketing/LandingPage.js";
|
|
7
|
+
import { PricingClient } from "./components/marketing/PricingClient.js";
|
|
8
|
+
import { ProductClientPage } from "./components/marketing/ProductClientPage.js";
|
|
9
|
+
import { WaitlistSection } from "./components/marketing/waitlist-section.js";
|
|
10
|
+
import { PricingThinkingModal } from "./components/marketing/pricing-thinking-modal.js";
|
|
11
|
+
import "./components/marketing/index.js";
|
|
12
|
+
import { TemplatesPage } from "./components/templates/TemplatesClientPage.js";
|
|
13
|
+
import { TemplatesMarketingPage } from "./components/templates/TemplatesPage.js";
|
|
14
|
+
import { TemplatePreviewModal } from "./components/templates/TemplatesPreviewModal.js";
|
|
15
|
+
import "./components/templates/index.js";
|
|
16
|
+
import { SubmitContactFormResult, SubmitNewsletterResult, SubmitWaitlistApplicationResult, SubmitWaitlistResult } from "./libs/email/types.js";
|
|
17
|
+
import { submitContactForm } from "./libs/email/contact.js";
|
|
18
|
+
import { subscribeToNewsletter } from "./libs/email/newsletter.js";
|
|
19
|
+
import { joinWaitlist } from "./libs/email/waitlist.js";
|
|
20
|
+
import { submitWaitlistApplication } from "./libs/email/waitlist-application.js";
|
|
21
|
+
import { ComponentMap, RoutePresentation } from "./registry/types.js";
|
|
22
|
+
import { createPresentationEngine, presentationEngine } from "./registry/engine.js";
|
|
23
|
+
import { CreateComponentPresentationOptions, DOCS_CONTEXT, DOCS_GOAL, DOCS_TAGS, MARKETING_CONTEXT, MARKETING_GOAL, createComponentPresentation, tagsFromPath } from "./registry/factory.js";
|
|
24
|
+
import { componentMap, getAllPresentationRoutes, getPresentationForRoute, hasPresentation, presentationRegistry } from "./registry/registry.js";
|
|
25
|
+
import { docsComponentMap, docsPresentations } from "./registry/registry-docs.js";
|
|
26
|
+
import { landingComponentMap, landingPresentations, learningPresentations } from "./registry/registry-landing.js";
|
|
27
|
+
import { AIChatProvider, aiChatProviders, getMarkdownUrl, renderPresentationToMarkdown, renderPresentationToReact } from "./registry/utils.js";
|
|
28
|
+
import "./registry/index.js";
|
|
29
|
+
export { AIChatProvider, ChangelogPage, CofounderPage, ComponentMap, ContactClient, ContributePage, CreateComponentPresentationOptions, DOCS_CONTEXT, DOCS_GOAL, DOCS_TAGS, DesignPartnerPage, LandingPage, MARKETING_CONTEXT, MARKETING_GOAL, PricingClient, PricingThinkingModal, ProductClientPage, RoutePresentation, type SubmitContactFormResult, type SubmitNewsletterResult, type SubmitWaitlistApplicationResult, type SubmitWaitlistResult, TemplatePreviewModal, TemplatesMarketingPage, TemplatesPage, WaitlistSection, aiChatProviders, componentMap, createComponentPresentation, createPresentationEngine, docsComponentMap, docsPresentations, getAllPresentationRoutes, getMarkdownUrl, getPresentationForRoute, hasPresentation, joinWaitlist, landingComponentMap, landingPresentations, learningPresentations, presentationEngine, presentationRegistry, renderPresentationToMarkdown, renderPresentationToReact, submitContactForm, submitWaitlistApplication, subscribeToNewsletter, tagsFromPath };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { LandingPage } from "./components/marketing/LandingPage.js";
|
|
2
|
+
import { ProductClientPage } from "./components/marketing/ProductClientPage.js";
|
|
3
|
+
import { joinWaitlist } from "./libs/email/waitlist.js";
|
|
4
|
+
import { submitWaitlistApplication } from "./libs/email/waitlist-application.js";
|
|
5
|
+
import { WaitlistSection } from "./components/marketing/waitlist-section.js";
|
|
6
|
+
import { PricingThinkingModal } from "./components/marketing/pricing-thinking-modal.js";
|
|
7
|
+
import { PricingClient } from "./components/marketing/PricingClient.js";
|
|
8
|
+
import { submitContactForm } from "./libs/email/contact.js";
|
|
9
|
+
import { ContactClient } from "./components/marketing/ContactClient.js";
|
|
10
|
+
import { ChangelogPage } from "./components/marketing/ChangelogPage.js";
|
|
11
|
+
import { CofounderPage } from "./components/marketing/CofounderPage.js";
|
|
12
|
+
import { ContributePage } from "./components/marketing/ContributePage.js";
|
|
13
|
+
import { DesignPartnerPage } from "./components/marketing/DesignPartnerPage.js";
|
|
14
|
+
import "./components/marketing/index.js";
|
|
15
|
+
import { TemplatePreviewModal } from "./components/templates/TemplatesPreviewModal.js";
|
|
16
|
+
import { TemplatesPage } from "./components/templates/TemplatesClientPage.js";
|
|
17
|
+
import { TemplatesMarketingPage } from "./components/templates/TemplatesPage.js";
|
|
18
|
+
import "./components/templates/index.js";
|
|
19
|
+
import { subscribeToNewsletter } from "./libs/email/newsletter.js";
|
|
20
|
+
import { DOCS_CONTEXT, DOCS_GOAL, DOCS_TAGS, MARKETING_CONTEXT, MARKETING_GOAL, createComponentPresentation, tagsFromPath } from "./registry/factory.js";
|
|
21
|
+
import { docsComponentMap, docsPresentations } from "./registry/registry-docs.js";
|
|
22
|
+
import { landingComponentMap, landingPresentations, learningPresentations } from "./registry/registry-landing.js";
|
|
23
|
+
import { componentMap, getAllPresentationRoutes, getPresentationForRoute, hasPresentation, presentationRegistry } from "./registry/registry.js";
|
|
24
|
+
import { createPresentationEngine, presentationEngine } from "./registry/engine.js";
|
|
25
|
+
import { aiChatProviders, getMarkdownUrl, renderPresentationToMarkdown, renderPresentationToReact } from "./registry/utils.js";
|
|
26
|
+
import "./registry/index.js";
|
|
27
|
+
|
|
28
|
+
export { ChangelogPage, CofounderPage, ContactClient, ContributePage, DOCS_CONTEXT, DOCS_GOAL, DOCS_TAGS, DesignPartnerPage, LandingPage, MARKETING_CONTEXT, MARKETING_GOAL, PricingClient, PricingThinkingModal, ProductClientPage, TemplatePreviewModal, TemplatesMarketingPage, TemplatesPage, WaitlistSection, aiChatProviders, componentMap, createComponentPresentation, createPresentationEngine, docsComponentMap, docsPresentations, getAllPresentationRoutes, getMarkdownUrl, getPresentationForRoute, hasPresentation, joinWaitlist, landingComponentMap, landingPresentations, learningPresentations, presentationEngine, presentationRegistry, renderPresentationToMarkdown, renderPresentationToReact, submitContactForm, submitWaitlistApplication, subscribeToNewsletter, tagsFromPath };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EmailConfigResult, EmailSendOutcome, EmailServiceConfig, SendEmailRequest } from "./types.js";
|
|
2
|
+
import { Temv1alpha1, createClient } from "@scaleway/sdk";
|
|
3
|
+
|
|
4
|
+
//#region src/libs/email/client.d.ts
|
|
5
|
+
type EmailApi = Pick<Temv1alpha1.API, 'createEmail'>;
|
|
6
|
+
declare const getEmailConfig: () => EmailConfigResult;
|
|
7
|
+
declare const sendEmail: (config: EmailServiceConfig, request: SendEmailRequest) => Promise<EmailSendOutcome>;
|
|
8
|
+
declare const __internal: {
|
|
9
|
+
resetCaches(): void;
|
|
10
|
+
setApiFactory(factory: (client: ReturnType<typeof createClient>) => EmailApi): void;
|
|
11
|
+
setClient(client: EmailApi): void;
|
|
12
|
+
};
|
|
13
|
+
//#endregion
|
|
14
|
+
export { __internal, getEmailConfig, sendEmail };
|
|
15
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","names":[],"sources":["../../../src/libs/email/client.ts"],"mappings":";;;;KAuBK,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,GAAA;AAAA,cAgBpB,cAAA,QAAqB,iBAAA;AAAA,cAyDrB,SAAA,GACX,MAAA,EAAQ,kBAAA,EACR,OAAA,EAAS,gBAAA,KACR,OAAA,CAAQ,gBAAA;AAAA,cA+BE,UAAA;;0BAQC,MAAA,EAAQ,UAAA,QAAkB,YAAA,MAAkB,QAAA;oBAItC,QAAA;AAAA"}
|