create-cogenta 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/dist/blueprint-defaults.js +1 -1
  2. package/dist/blueprint-defaults.js.map +1 -1
  3. package/dist/blueprints/registry.d.ts +13 -1
  4. package/dist/blueprints/registry.d.ts.map +1 -1
  5. package/dist/blueprints/registry.js +23 -5
  6. package/dist/blueprints/registry.js.map +1 -1
  7. package/dist/index.d.ts +3 -3
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +2 -2
  10. package/dist/index.js.map +1 -1
  11. package/dist/playground-reset.js +2 -2
  12. package/dist/playground-reset.js.map +1 -1
  13. package/dist/recap.js +1 -1
  14. package/dist/recap.js.map +1 -1
  15. package/dist/scaffold.d.ts +5 -3
  16. package/dist/scaffold.d.ts.map +1 -1
  17. package/dist/scaffold.js +20 -13
  18. package/dist/scaffold.js.map +1 -1
  19. package/dist/types.d.ts.map +1 -1
  20. package/dist/types.js +2 -1
  21. package/dist/types.js.map +1 -1
  22. package/dist/wizard.js +1 -1
  23. package/dist/wizard.js.map +1 -1
  24. package/package.json +14 -13
  25. package/dist/blueprints/assets/photos/association/community-cleanup.jpg +0 -0
  26. package/dist/blueprints/assets/photos/association/fundraising-dinner.jpg +0 -0
  27. package/dist/blueprints/assets/photos/association/garden-planting.jpg +0 -0
  28. package/dist/blueprints/assets/photos/association/harvest-food-drive.jpg +0 -0
  29. package/dist/blueprints/assets/photos/association/hero.jpg +0 -0
  30. package/dist/blueprints/assets/photos/association/volunteer-orientation.jpg +0 -0
  31. package/dist/blueprints/assets/photos/association/winter-coat-collection.jpg +0 -0
  32. package/dist/blueprints/assets/photos/blog/blog-runs-itself.jpg +0 -0
  33. package/dist/blueprints/assets/photos/blog/desk-setup.jpg +0 -0
  34. package/dist/blueprints/assets/photos/blog/editing.jpg +0 -0
  35. package/dist/blueprints/assets/photos/blog/hero.jpg +0 -0
  36. package/dist/blueprints/assets/photos/blog/notebooks.jpg +0 -0
  37. package/dist/blueprints/assets/photos/blog/plain-text-editor.jpg +0 -0
  38. package/dist/blueprints/assets/photos/blog/reading-nonfiction.jpg +0 -0
  39. package/dist/blueprints/assets/photos/blog/small-tool.jpg +0 -0
  40. package/dist/blueprints/assets/photos/blog/writing-schedule.jpg +0 -0
  41. package/dist/blueprints/assets/photos/magazine/business-2.jpg +0 -0
  42. package/dist/blueprints/assets/photos/magazine/business-3.jpg +0 -0
  43. package/dist/blueprints/assets/photos/magazine/business.jpg +0 -0
  44. package/dist/blueprints/assets/photos/magazine/culture-2.jpg +0 -0
  45. package/dist/blueprints/assets/photos/magazine/culture-3.jpg +0 -0
  46. package/dist/blueprints/assets/photos/magazine/culture.jpg +0 -0
  47. package/dist/blueprints/assets/photos/magazine/news-2.jpg +0 -0
  48. package/dist/blueprints/assets/photos/magazine/news-3.jpg +0 -0
  49. package/dist/blueprints/assets/photos/magazine/news.jpg +0 -0
  50. package/dist/blueprints/assets/photos/magazine/opinion-2.jpg +0 -0
  51. package/dist/blueprints/assets/photos/magazine/opinion-3.jpg +0 -0
  52. package/dist/blueprints/assets/photos/magazine/opinion.jpg +0 -0
  53. package/dist/blueprints/assets/photos/portfolio/adatum-publishing.jpg +0 -0
  54. package/dist/blueprints/assets/photos/portfolio/contoso-mobile-app.jpg +0 -0
  55. package/dist/blueprints/assets/photos/portfolio/fabrikam-annual-report.jpg +0 -0
  56. package/dist/blueprints/assets/photos/portfolio/hero.jpg +0 -0
  57. package/dist/blueprints/assets/photos/portfolio/litware-signage.jpg +0 -0
  58. package/dist/blueprints/assets/photos/portfolio/northwind-rebrand.jpg +0 -0
  59. package/dist/blueprints/assets/photos/portfolio/proseware-launch.jpg +0 -0
  60. package/dist/blueprints/assets/photos/portfolio/tailspin-streaming.jpg +0 -0
  61. package/dist/blueprints/assets/photos/portfolio/wingtip-wayfinding.jpg +0 -0
  62. package/dist/blueprints/assets/photos/restaurant/charred-octopus.jpg +0 -0
  63. package/dist/blueprints/assets/photos/restaurant/chocolate-tart.jpg +0 -0
  64. package/dist/blueprints/assets/photos/restaurant/creme-brulee.jpg +0 -0
  65. package/dist/blueprints/assets/photos/restaurant/hero.jpg +0 -0
  66. package/dist/blueprints/assets/photos/restaurant/house-red.jpg +0 -0
  67. package/dist/blueprints/assets/photos/restaurant/house-white.jpg +0 -0
  68. package/dist/blueprints/assets/photos/restaurant/pan-seared-trout.jpg +0 -0
  69. package/dist/blueprints/assets/photos/restaurant/poached-pear.jpg +0 -0
  70. package/dist/blueprints/assets/photos/restaurant/roasted-beet-salad.jpg +0 -0
  71. package/dist/blueprints/assets/photos/restaurant/slow-roast-duck-leg.jpg +0 -0
  72. package/dist/blueprints/assets/photos/restaurant/soup-of-the-day.jpg +0 -0
  73. package/dist/blueprints/assets/photos/restaurant/sparkling-water.jpg +0 -0
  74. package/dist/blueprints/assets/photos/restaurant/wild-mushroom-risotto.jpg +0 -0
  75. package/dist/blueprints/assets/photos/saas/avatar-1.jpg +0 -0
  76. package/dist/blueprints/assets/photos/saas/hero.jpg +0 -0
  77. package/dist/blueprints/assets/photos/store/camp-blanket.jpg +0 -0
  78. package/dist/blueprints/assets/photos/store/canvas-tote.jpg +0 -0
  79. package/dist/blueprints/assets/photos/store/cast-iron-skillet.jpg +0 -0
  80. package/dist/blueprints/assets/photos/store/ceramic-pour-over-set.jpg +0 -0
  81. package/dist/blueprints/assets/photos/store/enamel-mug.jpg +0 -0
  82. package/dist/blueprints/assets/photos/store/everyday-tee.jpg +0 -0
  83. package/dist/blueprints/assets/photos/store/field-jacket.jpg +0 -0
  84. package/dist/blueprints/assets/photos/store/hero.jpg +0 -0
  85. package/dist/blueprints/assets/photos/store/leather-card-holder.jpg +0 -0
  86. package/dist/blueprints/assets/photos/store/linen-table-runner.jpg +0 -0
  87. package/dist/blueprints/assets/photos/store/trail-tote.jpg +0 -0
  88. package/dist/blueprints/assets/photos/store/wool-beanie.jpg +0 -0
  89. package/dist/blueprints/assets/photos/store/wool-overshirt.jpg +0 -0
  90. package/dist/blueprints/assets/photos/vitrine/avatar-1.jpg +0 -0
  91. package/dist/blueprints/assets/photos/vitrine/avatar-2.jpg +0 -0
  92. package/dist/blueprints/assets/photos/vitrine/avatar-3.jpg +0 -0
  93. package/dist/blueprints/assets/photos/vitrine/dashboard.jpg +0 -0
  94. package/dist/blueprints/assets/photos/vitrine/hero.jpg +0 -0
  95. package/dist/blueprints/association.d.ts +0 -151
  96. package/dist/blueprints/association.d.ts.map +0 -1
  97. package/dist/blueprints/association.js +0 -732
  98. package/dist/blueprints/association.js.map +0 -1
  99. package/dist/blueprints/blog.d.ts +0 -198
  100. package/dist/blueprints/blog.d.ts.map +0 -1
  101. package/dist/blueprints/blog.js +0 -665
  102. package/dist/blueprints/blog.js.map +0 -1
  103. package/dist/blueprints/content-pack.d.ts +0 -143
  104. package/dist/blueprints/content-pack.d.ts.map +0 -1
  105. package/dist/blueprints/content-pack.js +0 -111
  106. package/dist/blueprints/content-pack.js.map +0 -1
  107. package/dist/blueprints/content-packs.d.ts +0 -11
  108. package/dist/blueprints/content-packs.d.ts.map +0 -1
  109. package/dist/blueprints/content-packs.js +0 -29
  110. package/dist/blueprints/content-packs.js.map +0 -1
  111. package/dist/blueprints/demo-media.d.ts +0 -39
  112. package/dist/blueprints/demo-media.d.ts.map +0 -1
  113. package/dist/blueprints/demo-media.js +0 -30
  114. package/dist/blueprints/demo-media.js.map +0 -1
  115. package/dist/blueprints/documentation.d.ts +0 -134
  116. package/dist/blueprints/documentation.d.ts.map +0 -1
  117. package/dist/blueprints/documentation.js +0 -678
  118. package/dist/blueprints/documentation.js.map +0 -1
  119. package/dist/blueprints/magazine.d.ts +0 -145
  120. package/dist/blueprints/magazine.d.ts.map +0 -1
  121. package/dist/blueprints/magazine.js +0 -543
  122. package/dist/blueprints/magazine.js.map +0 -1
  123. package/dist/blueprints/menus.d.ts +0 -25
  124. package/dist/blueprints/menus.d.ts.map +0 -1
  125. package/dist/blueprints/menus.js +0 -33
  126. package/dist/blueprints/menus.js.map +0 -1
  127. package/dist/blueprints/photo-assets.d.ts +0 -3
  128. package/dist/blueprints/photo-assets.d.ts.map +0 -1
  129. package/dist/blueprints/photo-assets.js +0 -33
  130. package/dist/blueprints/photo-assets.js.map +0 -1
  131. package/dist/blueprints/portfolio.d.ts +0 -141
  132. package/dist/blueprints/portfolio.d.ts.map +0 -1
  133. package/dist/blueprints/portfolio.js +0 -700
  134. package/dist/blueprints/portfolio.js.map +0 -1
  135. package/dist/blueprints/restaurant.d.ts +0 -124
  136. package/dist/blueprints/restaurant.d.ts.map +0 -1
  137. package/dist/blueprints/restaurant.js +0 -457
  138. package/dist/blueprints/restaurant.js.map +0 -1
  139. package/dist/blueprints/saas.d.ts +0 -133
  140. package/dist/blueprints/saas.d.ts.map +0 -1
  141. package/dist/blueprints/saas.js +0 -551
  142. package/dist/blueprints/saas.js.map +0 -1
  143. package/dist/blueprints/site-settings-seed.d.ts +0 -17
  144. package/dist/blueprints/site-settings-seed.d.ts.map +0 -1
  145. package/dist/blueprints/site-settings-seed.js +0 -45
  146. package/dist/blueprints/site-settings-seed.js.map +0 -1
  147. package/dist/blueprints/starting-skins.d.ts +0 -19
  148. package/dist/blueprints/starting-skins.d.ts.map +0 -1
  149. package/dist/blueprints/starting-skins.js +0 -301
  150. package/dist/blueprints/starting-skins.js.map +0 -1
  151. package/dist/blueprints/store.d.ts +0 -173
  152. package/dist/blueprints/store.d.ts.map +0 -1
  153. package/dist/blueprints/store.js +0 -643
  154. package/dist/blueprints/store.js.map +0 -1
  155. package/dist/blueprints/vitrine.d.ts +0 -178
  156. package/dist/blueprints/vitrine.d.ts.map +0 -1
  157. package/dist/blueprints/vitrine.js +0 -529
  158. package/dist/blueprints/vitrine.js.map +0 -1
  159. package/dist/demo-art/compositions.d.ts +0 -48
  160. package/dist/demo-art/compositions.d.ts.map +0 -1
  161. package/dist/demo-art/compositions.js +0 -690
  162. package/dist/demo-art/compositions.js.map +0 -1
  163. package/dist/demo-art/index.d.ts +0 -8
  164. package/dist/demo-art/index.d.ts.map +0 -1
  165. package/dist/demo-art/index.js +0 -5
  166. package/dist/demo-art/index.js.map +0 -1
  167. package/dist/demo-art/oklch.d.ts +0 -39
  168. package/dist/demo-art/oklch.d.ts.map +0 -1
  169. package/dist/demo-art/oklch.js +0 -79
  170. package/dist/demo-art/oklch.js.map +0 -1
  171. package/dist/demo-art/png.d.ts +0 -24
  172. package/dist/demo-art/png.d.ts.map +0 -1
  173. package/dist/demo-art/png.js +0 -110
  174. package/dist/demo-art/png.js.map +0 -1
  175. package/dist/demo-art/render.d.ts +0 -228
  176. package/dist/demo-art/render.d.ts.map +0 -1
  177. package/dist/demo-art/render.js +0 -478
  178. package/dist/demo-art/render.js.map +0 -1
@@ -1,551 +0,0 @@
1
- import { CogentaError } from '@cogenta/core';
2
- import { createContentStore, defineCollection, f, validateCollectionSet, } from '@cogenta/schema';
3
- import { avatarArt, coverArt, heroArt, logoArt } from '../demo-art/compositions.js';
4
- import { definePageCollection, richTextParagraph, SEO_FIELDS, toBlockZoneEntry, } from './content-pack.js';
5
- import { STARTING_SKINS } from './starting-skins.js';
6
- /**
7
- * The `saas` blueprint's content model (L25, "templates pro"): a marketing
8
- * site for a software product — a `feature` collection routed so it can be
9
- * listed live and linked to from the home page, exactly like `vitrine`'s
10
- * `service`. Deliberately no `pricingPlan` collection or billing model:
11
- * pricing tiers on a real SaaS site are usually a handful of numbers with no
12
- * independent lifecycle (no author, no publish date, no individual page), so
13
- * they are page-authored content on the `pricing` page below rather than a
14
- * second collection invented to hold three rows.
15
- *
16
- * `icon` (a symbol name `@cogenta/theme-kit`'s `renderIcon` recognises) and
17
- * `coverImage` (contract D `theme@1.4`'s `entryImage`) are what let
18
- * `theme-saas`'s `collectionList` show a feature the same way its
19
- * `featureGrid` does — an icon chip first, a photo only as the fallback.
20
- */
21
- export const feature = defineCollection({
22
- name: 'feature',
23
- labels: { singular: 'Feature', plural: 'Features' },
24
- routing: { pattern: '/features/:slug' },
25
- fields: {
26
- name: f.text({ required: true, max: 120 }),
27
- slug: f.slug({ from: 'name', unique: true }),
28
- description: f.text({ max: 300, multiline: true }),
29
- icon: f.text({
30
- max: 64,
31
- admin: {
32
- label: 'Icon',
33
- help: 'One of the symbol names @cogenta/theme-kit recognises (e.g. "bolt", "shield", "chart", "users", "globe", "sparkles"). Left blank, the feature falls back to its cover image.',
34
- },
35
- }),
36
- coverImage: f.media({ accept: ['image'] }),
37
- ...SEO_FIELDS,
38
- },
39
- indexes: [['slug']],
40
- permissions: {
41
- read: ['public'],
42
- create: ['editor', 'admin'],
43
- update: ['editor', 'admin'],
44
- delete: ['admin'],
45
- },
46
- });
47
- export const page = definePageCollection('/:slug');
48
- export const SAAS_COLLECTIONS = [feature, page];
49
- validateCollectionSet(SAAS_COLLECTIONS);
50
- /**
51
- * Six real product capabilities, each with the icon `featureGrid` (home
52
- * page) and this same entry's own `icon` field both point at — a
53
- * `collectionList` of `feature` and the home page's `featureGrid` read as
54
- * one system rather than two unrelated sections.
55
- */
56
- export const SAAS_DEMO_FEATURES = [
57
- {
58
- name: 'Workflow automation',
59
- slug: 'workflow-automation',
60
- description: 'Trigger multi-step approvals, notifications and handoffs the moment a status changes — no script to maintain, no cron job to babysit. Build the flow once in a visual editor, watch every run in real time, and route exceptions to a human without losing your place in the queue.',
61
- icon: 'bolt',
62
- },
63
- {
64
- name: 'Audit log',
65
- slug: 'audit-log',
66
- description: 'Every change is written once, in order, and never edited after the fact — the same ledger your own compliance review reads from. Filter by actor, resource or time window, and export the result as a signed record that satisfies an external auditor without a follow-up email.',
67
- icon: 'shield',
68
- },
69
- {
70
- name: 'Single sign-on',
71
- slug: 'single-sign-on',
72
- description: 'SAML and OIDC out of the box, provisioned through your identity provider in minutes, not a support ticket. An offboarded employee loses access everywhere in one step, not six, and group membership synced from your directory keeps roles correct without anyone updating them by hand.',
73
- icon: 'users',
74
- },
75
- {
76
- name: 'Integrations',
77
- slug: 'integrations',
78
- description: 'Two-way sync with the tools already in the stack — calendar, chat, storage and the usual project trackers — plus outbound webhooks and a documented API for anything bespoke. Nothing here is a walled garden: what comes in stays in sync, and what goes out is never trapped behind a paywall tier.',
79
- icon: 'globe',
80
- },
81
- {
82
- name: 'Analytics',
83
- slug: 'analytics',
84
- description: 'Real usage numbers, not vanity counters: active seats this week, the features nobody opens, and the reports someone actually downloads. Every chart is a saved, shareable view, so the number quoted in a leadership meeting is the same one the team is already looking at.',
85
- icon: 'chart',
86
- },
87
- {
88
- name: 'API',
89
- slug: 'api',
90
- description: 'A typed, versioned REST API with a sandbox key on day one and rate limits generous enough for a real integration, not just a demo. Everything the product does in the browser, a script can do too — through the same permission model and the same audit trail behind it.',
91
- icon: 'sparkles',
92
- },
93
- ];
94
- const BLOCK_VERSION = '1.0.0';
95
- /**
96
- * One `prose` block, whose `body` (contract B rich text) can hold more than
97
- * one paragraph — `text` may be a single string (one paragraph, the
98
- * original shape every call site but `about` still uses) or an array of
99
- * strings (one `richTextParagraph` block per entry, concatenated). Real
100
- * "about" copy reads as more than one paragraph; forcing it into one would
101
- * have meant either a wall of run-on sentences or losing the paragraph
102
- * break entirely.
103
- */
104
- function proseParagraph(key, text) {
105
- const paragraphs = typeof text === 'string' ? [text] : text;
106
- return {
107
- _key: key,
108
- _type: 'prose',
109
- _version: BLOCK_VERSION,
110
- body: paragraphs.flatMap((paragraph, index) => richTextParagraph(`${key}-body-${index}`, paragraph)),
111
- };
112
- }
113
- /**
114
- * `home` (ten blocks, the Linear/Stripe/Vercel composition the L25 brief
115
- * asks for: hero → trust strip → features → product shot → numbers →
116
- * social proof → pricing → questions → final call to action), `pricing`
117
- * (its own hero, the same pricing table, and a billing-specific FAQ), and
118
- * `about` (a short mission statement plus a second, distinct voice of
119
- * social proof).
120
- *
121
- * A function of `media`/`featureIds` (`SeedContext.media`, and the ids
122
- * `seedSaasDemoContent` assigns its own features before this runs), not a
123
- * static const: the hero's `media`, the product shot, the trust strip's
124
- * logos and both testimonials' avatars all need ids only the scaffold
125
- * knows at seed time, and the feature grid links to each feature's own
126
- * real page.
127
- */
128
- export function buildSaasDemoPages(media, featureIdBySlug) {
129
- const featureLink = (slug) => {
130
- const id = featureIdBySlug.get(slug);
131
- return id === undefined ? undefined : { collection: 'feature', id };
132
- };
133
- // `logoStrip` (blocks@2.0) requires at least one logo — a media map with
134
- // no `logo-*` entries (a scaffold with no demo-art seeded, or this
135
- // function called directly, as the blueprint test does) must therefore
136
- // omit the whole block rather than emit an empty, contract-invalid one.
137
- const logoItems = [0, 1, 2, 3, 4, 5]
138
- .map((index) => media[`logo-${index}`])
139
- .filter((id) => id !== undefined)
140
- .map((id, index) => ({ _key: `demo-logo-${index}`, media: id }));
141
- return [
142
- {
143
- title: 'Home',
144
- slug: 'home',
145
- blocks: [
146
- {
147
- _key: 'demo-home-hero',
148
- _type: 'hero',
149
- _version: BLOCK_VERSION,
150
- eyebrow: 'Now in public beta',
151
- title: 'Ship faster, with less friction',
152
- subtitle: 'One workspace for the whole team to plan, automate and ship, without the pile of spreadsheets and shared inboxes it usually takes to get there. This page and the six features below it were scaffolded by create-cogenta from the "saas" blueprint — real demo content, ready to edit from the first run.',
153
- ...(media.hero === undefined ? {} : { media: media.hero }),
154
- actions: [
155
- { label: 'Start free', target: { href: '/pricing' }, emphasis: 'primary' },
156
- { label: 'Book a demo', target: { href: '/about' } },
157
- ],
158
- },
159
- ...(logoItems.length === 0
160
- ? []
161
- : [
162
- {
163
- _key: 'demo-home-logos',
164
- _type: 'logoStrip',
165
- _version: BLOCK_VERSION,
166
- logos: logoItems,
167
- caption: 'Trusted by teams at',
168
- },
169
- ]),
170
- {
171
- _key: 'demo-home-features',
172
- _type: 'featureGrid',
173
- _version: BLOCK_VERSION,
174
- title: 'Everything the team needs to ship',
175
- items: SAAS_DEMO_FEATURES.map((demo, index) => {
176
- const link = featureLink(demo.slug);
177
- return {
178
- _key: `demo-feature-${index}`,
179
- icon: demo.icon,
180
- title: demo.name,
181
- text: demo.description,
182
- ...(link === undefined ? {} : { link }),
183
- };
184
- }),
185
- },
186
- // `mediaFigure.media` (blocks@2.0) is required — with no `product`
187
- // media seeded, the block is omitted rather than emitted invalid
188
- // (same reasoning as `logoStrip` above).
189
- ...(media.product === undefined
190
- ? []
191
- : [
192
- {
193
- _key: 'demo-home-shot',
194
- _type: 'mediaFigure',
195
- _version: BLOCK_VERSION,
196
- media: media.product,
197
- caption: 'The board view, live for the whole team.',
198
- ratio: '16:9',
199
- align: 'wide',
200
- },
201
- ]),
202
- {
203
- _key: 'demo-home-stats',
204
- _type: 'statCounter',
205
- _version: BLOCK_VERSION,
206
- title: 'Trusted at scale',
207
- stats: [
208
- { _key: 'demo-stat-1', value: '99.98', label: 'Uptime, trailing 12 months' },
209
- { _key: 'demo-stat-2', value: '4.8', label: 'Average review score' },
210
- { _key: 'demo-stat-3', value: '2,400+', label: 'Teams onboarded' },
211
- { _key: 'demo-stat-4', value: '<200ms', label: 'Median API response' },
212
- ],
213
- },
214
- {
215
- _key: 'demo-home-testimonial',
216
- _type: 'testimonial',
217
- _version: BLOCK_VERSION,
218
- quote: richTextParagraph('demo-testimonial-quote', 'We replaced four spreadsheets and a shared inbox with one workspace. Approvals that used to take a week now close the same afternoon, and for the first time our finance team can see exactly where a request is stuck without pinging three people to ask.'),
219
- attribution: {
220
- name: 'Priya Nandakumar',
221
- role: 'Head of Operations, Kelso Freight',
222
- ...(media.avatar === undefined ? {} : { avatar: media.avatar }),
223
- },
224
- },
225
- {
226
- _key: 'demo-home-quote',
227
- _type: 'quote',
228
- _version: BLOCK_VERSION,
229
- text: 'The audit log alone is why our compliance review took an afternoon instead of a month. Every question the auditor asked, we answered by filtering one screen instead of hunting through six systems for a paper trail that may or may not have existed.',
230
- author: 'Marcus Webb',
231
- role: 'IT Director, Fenwick & Rowe',
232
- },
233
- {
234
- _key: 'demo-home-pricing',
235
- _type: 'pricingTable',
236
- _version: BLOCK_VERSION,
237
- title: 'Simple, seat-based pricing',
238
- tiers: pricingTiers(),
239
- },
240
- homeFaq(),
241
- {
242
- _key: 'demo-home-cta',
243
- _type: 'cta',
244
- _version: BLOCK_VERSION,
245
- title: 'Start building today',
246
- text: 'No credit card required for the trial. Every section above is normal editable content.',
247
- actions: [
248
- { label: 'Start free', target: { href: '/pricing' }, emphasis: 'primary' },
249
- { label: 'Book a demo', target: { href: '/about' } },
250
- ],
251
- },
252
- ],
253
- },
254
- {
255
- title: 'Pricing',
256
- slug: 'pricing',
257
- blocks: [
258
- {
259
- _key: 'demo-pricing-hero',
260
- _type: 'hero',
261
- _version: BLOCK_VERSION,
262
- eyebrow: 'Pricing',
263
- title: 'One plan for every team, billed on active seats',
264
- subtitle: 'No setup fee, no annual lock-in required, and a real person to talk to before you commit to Enterprise. Every plan includes the full feature set below — Pro adds SSO and priority support, and moving between tiers takes effect immediately, prorated to the day.',
265
- actions: [{ label: 'Start free', target: { href: '#' }, emphasis: 'primary' }],
266
- },
267
- {
268
- _key: 'demo-pricing-table',
269
- _type: 'pricingTable',
270
- _version: BLOCK_VERSION,
271
- tiers: pricingTiers(),
272
- },
273
- {
274
- _key: 'demo-pricing-faq',
275
- _type: 'faq',
276
- _version: BLOCK_VERSION,
277
- title: 'Questions about billing',
278
- items: [
279
- {
280
- _key: 'demo-pricing-faq-1',
281
- question: 'What happens when the trial ends?',
282
- answer: richTextParagraph('demo-pricing-faq-1-a', 'The workspace goes read-only rather than being deleted. Everything is still there, and still exportable, whether you subscribe that week or six months later — nothing is purged on a timer.'),
283
- },
284
- {
285
- _key: 'demo-pricing-faq-2',
286
- question: 'Do you charge for people who barely log in?',
287
- answer: richTextParagraph('demo-pricing-faq-2-a', 'No. A seat counts in a month only if it was actually used that month, and the invoice itemises exactly which ones did, so finance never has to take our word for it.'),
288
- },
289
- {
290
- _key: 'demo-pricing-faq-3',
291
- question: 'Can we pay by invoice instead of card?',
292
- answer: richTextParagraph('demo-pricing-faq-3-a', 'From five seats up, billed yearly, on thirty-day terms with a PO number on the invoice if you need one. Below that the card flow costs everyone less than the paperwork would.'),
293
- },
294
- {
295
- _key: 'demo-pricing-faq-4',
296
- question: 'Can we change plans mid-cycle?',
297
- answer: richTextParagraph('demo-pricing-faq-4-a', 'Yes, immediately, with a prorated charge or credit for the days remaining, shown on the invoice before it is charged — never a silent rollover to next month.'),
298
- },
299
- ],
300
- },
301
- ],
302
- },
303
- {
304
- title: 'About',
305
- slug: 'about',
306
- blocks: [
307
- proseParagraph('demo-about-prose', [
308
- 'We started building this after watching a team lose a week to an approval that should have taken an hour — not because anyone was slow, but because the request lived in an inbox, the sign-off lived in a spreadsheet, and nobody could see both at once. So we built one workspace where the request, the approval and the record of what happened are the same object, not three.',
309
- 'This is a demo SaaS site, scaffolded by create-cogenta from the "saas" blueprint. Its features and this page were seeded by the installer so there is real content to look at from the first run — every word of it is normal, editable content, not placeholder copy waiting to be swapped out.',
310
- ]),
311
- {
312
- _key: 'demo-about-testimonial',
313
- _type: 'testimonial',
314
- _version: BLOCK_VERSION,
315
- quote: richTextParagraph('demo-about-testimonial-quote', 'Support answered inside the hour, on a Sunday, before we’d even finished writing up the incident. Three months later the same person who took that first ticket is still the one who replies — no hand-off, no repeating the whole story from scratch.'),
316
- attribution: {
317
- name: 'Dana Osei',
318
- role: 'Engineering Manager, Vaultline',
319
- ...(media['avatar-about'] === undefined ? {} : { avatar: media['avatar-about'] }),
320
- },
321
- },
322
- ],
323
- },
324
- ];
325
- }
326
- function pricingTiers() {
327
- return [
328
- {
329
- _key: 'demo-tier-starter',
330
- name: 'Starter',
331
- price: '$0',
332
- interval: '/month',
333
- features: ['Up to 5 seats', 'Core workflows', 'Community support'],
334
- action: { label: 'Start free', target: { href: '#' } },
335
- },
336
- {
337
- _key: 'demo-tier-pro',
338
- name: 'Pro',
339
- price: '$24',
340
- interval: '/seat/month',
341
- features: [
342
- 'Unlimited seats',
343
- 'Workflow automation',
344
- 'SSO (SAML & OIDC)',
345
- 'Full audit log',
346
- 'Priority support',
347
- ],
348
- action: { label: 'Start free', target: { href: '#' }, emphasis: 'primary' },
349
- highlighted: true,
350
- },
351
- {
352
- _key: 'demo-tier-enterprise',
353
- name: 'Enterprise',
354
- price: 'Custom',
355
- features: [
356
- 'Everything in Pro',
357
- 'Dedicated onboarding',
358
- 'Custom contract & invoicing',
359
- 'A named account manager',
360
- ],
361
- action: { label: 'Talk to sales', target: { href: '/about' } },
362
- },
363
- ];
364
- }
365
- function homeFaq() {
366
- const items = [
367
- [
368
- 'How long does it take to get started?',
369
- 'Most teams are running real workflows the same afternoon they sign up — there is no migration step to complete first. Import a spreadsheet, invite the team, and the first approval can go out before lunch.',
370
- ],
371
- [
372
- 'Does it work with the tools we already use?',
373
- 'Yes — two-way sync with the usual suspects, plus outbound webhooks and a documented API for anything bespoke. If it has an API, it can talk to this one; if it does not, the webhook still fires.',
374
- ],
375
- [
376
- 'Is our data ours if we leave?',
377
- 'A full export, in a format something else can actually read, is one click away at any time — there is no lock-in by file format, no support ticket required, and no waiting period.',
378
- ],
379
- [
380
- 'How is data secured in transit and at rest?',
381
- 'Everything is encrypted in transit and at rest, and every access is written to the audit log described above. Backups are tested by restoring them, not just taking them, on a schedule a security review can ask to see.',
382
- ],
383
- [
384
- 'Can we bring our own identity provider?',
385
- 'Yes, SAML and OIDC are supported on every paid plan, provisioned in minutes from the settings screen — no support ticket, no waiting on a callback from us.',
386
- ],
387
- [
388
- 'What kind of support do we get?',
389
- 'Every plan includes email support with a same-day response on business days; Pro and Enterprise add priority response times, a named contact, and a shared channel for anything urgent.',
390
- ],
391
- ];
392
- return {
393
- _key: 'demo-home-faq',
394
- _type: 'faq',
395
- _version: BLOCK_VERSION,
396
- title: 'Frequently asked questions',
397
- items: items.map(([question, answer], index) => ({
398
- _key: `demo-home-faq-${index}`,
399
- question,
400
- answer: richTextParagraph(`demo-home-faq-${index}-a`, answer),
401
- })),
402
- };
403
- }
404
- export const SAAS_RECOMMENDED_AGENTS = [
405
- {
406
- name: 'performanceAgent',
407
- package: '@cogenta/agents-builtin',
408
- reason: 'Catches regressions on the marketing pages that most directly drive sign-ups.',
409
- },
410
- {
411
- name: 'securityAgent',
412
- package: '@cogenta/agents-builtin',
413
- reason: 'Tracks dependency vulnerabilities — the kind of thing a SaaS buyer asks about first.',
414
- },
415
- ];
416
- /**
417
- * `saas`'s own starting skin (`starting-skins.js`) — asserted present with a
418
- * real check, not a `!`, since `STARTING_SKINS` is keyed by blueprint id and
419
- * TypeScript cannot see that this particular key is always populated.
420
- */
421
- function saasPalette() {
422
- const skin = STARTING_SKINS.saas;
423
- if (skin === undefined) {
424
- // Same code `resolveBlueprint` (`registry.ts`) uses for its own
425
- // "this cannot happen unless the registry itself is broken" guard — this
426
- // is a bug in starting-skins.ts, never a user-facing condition.
427
- throw new CogentaError({
428
- code: 'BLUEPRINT_REGISTRY_CORRUPT',
429
- message: 'STARTING_SKINS.saas is missing.',
430
- hint: 'The "saas" entry must stay declared in starting-skins.ts for this blueprint to render its demo art.',
431
- });
432
- }
433
- return skin.color;
434
- }
435
- /**
436
- * Procedural visuals this blueprint seeds (L25): a mesh-gradient hero
437
- * backdrop, a wide product screenshot stand-in, six neutral client logos
438
- * for the trust strip, one avatar per testimonial (L26: the "about" page's
439
- * testimonial went unillustrated before this — a second, distinct avatar
440
- * fixes that rather than reusing the home page's), and one cover photo per
441
- * demo feature — all from the same starting-skin palette
442
- * (`starting-skins.js`) this blueprint already ships.
443
- */
444
- export const SAAS_MEDIA_SPECS = [
445
- {
446
- name: 'hero',
447
- spec: heroArt(saasPalette(), 'mesh', 21),
448
- alt: 'A software team at work',
449
- photo: 'saas/hero.jpg',
450
- },
451
- {
452
- name: 'product',
453
- spec: coverArt(saasPalette(), 22),
454
- alt: 'Abstract product visual standing in for a screenshot of the workspace',
455
- },
456
- {
457
- name: 'avatar',
458
- spec: avatarArt(saasPalette(), 23),
459
- alt: 'Portrait of the testimonial’s author',
460
- photo: 'saas/avatar-1.jpg',
461
- },
462
- {
463
- name: 'avatar-about',
464
- // No second bundled photo exists for this blueprint (only
465
- // `hero.jpg`/`avatar-1.jpg`, see `assets/photos/saas/`) — reusing
466
- // `avatar-1.jpg` under a different name would put the same face on two
467
- // different people, which is worse than an honest procedural portrait.
468
- spec: avatarArt(saasPalette(), 24),
469
- alt: 'Portrait of the "about" page testimonial’s author',
470
- },
471
- ...[0, 1, 2, 3, 4, 5].map((index) => ({
472
- name: `logo-${index}`,
473
- spec: logoArt(30 + index),
474
- alt: `Client logo ${index + 1}`,
475
- })),
476
- ...SAAS_DEMO_FEATURES.map((demo, index) => ({
477
- name: `feature-${demo.slug}`,
478
- spec: coverArt(saasPalette(), 40 + index),
479
- alt: `${demo.name} cover art`,
480
- })),
481
- ];
482
- /** Header/footer navigation and the header call-to-action button (L25, D4). */
483
- export const SAAS_MENUS = {
484
- header: [
485
- { label: 'Product', url: '#' },
486
- { label: 'Pricing', url: '/pricing' },
487
- { label: 'Docs', url: '#' },
488
- { label: 'Blog', url: '#' },
489
- { label: 'Company', url: '/about' },
490
- ],
491
- footer: [
492
- { label: 'Product', url: '#' },
493
- { label: 'Company', url: '/about' },
494
- { label: 'Legal', url: '#' },
495
- ],
496
- headerAction: { label: 'Start free', url: '/pricing' },
497
- };
498
- export const SAAS_SITE_SETTINGS = {
499
- 'general.tagline': 'Ship faster, with less friction.',
500
- 'general.socialLinks': [
501
- { label: 'X', url: 'https://x.com/example' },
502
- { label: 'GitHub', url: 'https://github.com/example' },
503
- { label: 'LinkedIn', url: 'https://linkedin.com/company/example' },
504
- ],
505
- 'general.footerNote': 'A demo SaaS site, scaffolded by create-cogenta.',
506
- };
507
- /**
508
- * Inserts the `saas` blueprint's demo content through the real
509
- * `ContentStore` — never mocked (house rule). Features are created first so
510
- * their real ids exist for the home page's `featureGrid` links and, via
511
- * `media`, for their own `coverImage`.
512
- */
513
- async function seedSaasDemoContent(ctx) {
514
- const { db, defaultLocale, adminId, media } = ctx;
515
- const featureStore = createContentStore({ db, collection: feature, defaultLocale });
516
- const pageStore = createContentStore({ db, collection: page, defaultLocale });
517
- const featureIdBySlug = new Map();
518
- for (const demo of SAAS_DEMO_FEATURES) {
519
- const cover = media[`feature-${demo.slug}`];
520
- const created = await featureStore.create({
521
- status: 'published',
522
- createdBy: adminId,
523
- values: {
524
- name: demo.name,
525
- slug: demo.slug,
526
- description: demo.description,
527
- icon: demo.icon,
528
- ...(cover === undefined ? {} : { coverImage: cover }),
529
- },
530
- });
531
- featureIdBySlug.set(demo.slug, created.id);
532
- }
533
- for (const demo of buildSaasDemoPages(media, featureIdBySlug)) {
534
- await pageStore.create({
535
- status: 'published',
536
- createdBy: adminId,
537
- values: { title: demo.title, slug: demo.slug },
538
- blocks: { blocks: demo.blocks.map(toBlockZoneEntry) },
539
- });
540
- }
541
- }
542
- export const saasContentPack = {
543
- collections: SAAS_COLLECTIONS,
544
- recommendedAgents: SAAS_RECOMMENDED_AGENTS,
545
- seedDemoContent: seedSaasDemoContent,
546
- defaultTheme: '@cogenta/theme-saas',
547
- menus: SAAS_MENUS,
548
- siteSettings: SAAS_SITE_SETTINGS,
549
- mediaSpecs: SAAS_MEDIA_SPECS,
550
- };
551
- //# sourceMappingURL=saas.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"saas.js","sourceRoot":"","sources":["../../src/blueprints/saas.ts"],"names":[],"mappings":"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"}
@@ -1,17 +0,0 @@
1
- import { type DatabaseHandle, type Logger } from '@cogenta/core';
2
- /**
3
- * Seeds a blueprint's `siteSettings` (L25 task A0b, D4) through the real
4
- * `SiteSettingsStore` (`@cogenta/schema`) — `general.tagline`,
5
- * `general.socialLinks`, `general.footerNote`, etc.
6
- *
7
- * Tolerant of a key the registry does not (yet) declare: another agent is
8
- * extending `SITE_SETTINGS_REGISTRY` with `general.socialLinks`/
9
- * `general.footerNote` in parallel with this task (Phase 0 — A0a), so a
10
- * blueprint naming one of those keys before that lands must not fail the
11
- * whole scaffold — it logs a warning and moves on. Any other failure (a
12
- * value that fails the key's own schema, which is a real bug in the
13
- * blueprint) still throws.
14
- */
15
- /** Returns how many of `values` were actually written — the rest were unknown keys, logged and skipped. */
16
- export declare function seedSiteSettings(db: DatabaseHandle, defaultLocale: string, values: Readonly<Record<string, unknown>>, adminId: string | null, logger: Logger): Promise<number>;
17
- //# sourceMappingURL=site-settings-seed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"site-settings-seed.d.ts","sourceRoot":"","sources":["../../src/blueprints/site-settings-seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAA;AAQ9E;;;;;;;;;;;;GAYG;AACH,2GAA2G;AAC3G,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,cAAc,EAClB,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CA4BjB"}
@@ -1,45 +0,0 @@
1
- import { CogentaError } from '@cogenta/core';
2
- import { createSiteSettingsStore, ensureSiteSettingsTables, SITE_SETTINGS_SITE_SCOPE, siteSettingByKey, } from '@cogenta/schema';
3
- /**
4
- * Seeds a blueprint's `siteSettings` (L25 task A0b, D4) through the real
5
- * `SiteSettingsStore` (`@cogenta/schema`) — `general.tagline`,
6
- * `general.socialLinks`, `general.footerNote`, etc.
7
- *
8
- * Tolerant of a key the registry does not (yet) declare: another agent is
9
- * extending `SITE_SETTINGS_REGISTRY` with `general.socialLinks`/
10
- * `general.footerNote` in parallel with this task (Phase 0 — A0a), so a
11
- * blueprint naming one of those keys before that lands must not fail the
12
- * whole scaffold — it logs a warning and moves on. Any other failure (a
13
- * value that fails the key's own schema, which is a real bug in the
14
- * blueprint) still throws.
15
- */
16
- /** Returns how many of `values` were actually written — the rest were unknown keys, logged and skipped. */
17
- export async function seedSiteSettings(db, defaultLocale, values, adminId, logger) {
18
- const entries = Object.entries(values);
19
- if (entries.length === 0)
20
- return 0;
21
- await ensureSiteSettingsTables(db);
22
- const store = createSiteSettingsStore({ db });
23
- let written = 0;
24
- for (const [key, value] of entries) {
25
- const definition = siteSettingByKey(key);
26
- if (definition === undefined) {
27
- logger.warn('skipping a blueprint site setting the registry does not declare', { key });
28
- continue;
29
- }
30
- const locale = definition.scope === 'site' ? SITE_SETTINGS_SITE_SCOPE : defaultLocale;
31
- try {
32
- await store.set(key, locale, value, adminId);
33
- written++;
34
- }
35
- catch (error) {
36
- if (error instanceof CogentaError && error.code === 'SITE_SETTING_UNKNOWN') {
37
- logger.warn('skipping a blueprint site setting the registry does not declare', { key });
38
- continue;
39
- }
40
- throw error;
41
- }
42
- }
43
- return written;
44
- }
45
- //# sourceMappingURL=site-settings-seed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"site-settings-seed.js","sourceRoot":"","sources":["../../src/blueprints/site-settings-seed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAoC,MAAM,eAAe,CAAA;AAC9E,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AAExB;;;;;;;;;;;;GAYG;AACH,2GAA2G;AAC3G,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAkB,EAClB,aAAqB,EACrB,MAAyC,EACzC,OAAsB,EACtB,MAAc;IAEd,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAA;IAElC,MAAM,wBAAwB,CAAC,EAAE,CAAC,CAAA;IAClC,MAAM,KAAK,GAAG,uBAAuB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7C,IAAI,OAAO,GAAG,CAAC,CAAA;IAEf,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;QACxC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;YACvF,SAAQ;QACV,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,aAAa,CAAA;QACrF,IAAI,CAAC;YACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAO,EAAE,CAAA;QACX,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,sBAAsB,EAAE,CAAC;gBAC3E,MAAM,CAAC,IAAI,CAAC,iEAAiE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAA;gBACvF,SAAQ;YACV,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC"}