create-cogenta 0.5.2 → 0.6.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/dist/blueprint-defaults.js +1 -1
  2. package/dist/blueprint-defaults.js.map +1 -1
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/playground-reset.js +1 -1
  8. package/dist/playground-reset.js.map +1 -1
  9. package/dist/recap.js +1 -1
  10. package/dist/recap.js.map +1 -1
  11. package/dist/scaffold.d.ts +4 -2
  12. package/dist/scaffold.d.ts.map +1 -1
  13. package/dist/scaffold.js +10 -6
  14. package/dist/scaffold.js.map +1 -1
  15. package/dist/wizard.js +1 -1
  16. package/dist/wizard.js.map +1 -1
  17. package/package.json +14 -13
  18. package/dist/blueprints/assets/photos/association/community-cleanup.jpg +0 -0
  19. package/dist/blueprints/assets/photos/association/fundraising-dinner.jpg +0 -0
  20. package/dist/blueprints/assets/photos/association/garden-planting.jpg +0 -0
  21. package/dist/blueprints/assets/photos/association/harvest-food-drive.jpg +0 -0
  22. package/dist/blueprints/assets/photos/association/hero.jpg +0 -0
  23. package/dist/blueprints/assets/photos/association/volunteer-orientation.jpg +0 -0
  24. package/dist/blueprints/assets/photos/association/winter-coat-collection.jpg +0 -0
  25. package/dist/blueprints/assets/photos/blog/blog-runs-itself.jpg +0 -0
  26. package/dist/blueprints/assets/photos/blog/desk-setup.jpg +0 -0
  27. package/dist/blueprints/assets/photos/blog/editing.jpg +0 -0
  28. package/dist/blueprints/assets/photos/blog/hero.jpg +0 -0
  29. package/dist/blueprints/assets/photos/blog/notebooks.jpg +0 -0
  30. package/dist/blueprints/assets/photos/blog/plain-text-editor.jpg +0 -0
  31. package/dist/blueprints/assets/photos/blog/reading-nonfiction.jpg +0 -0
  32. package/dist/blueprints/assets/photos/blog/small-tool.jpg +0 -0
  33. package/dist/blueprints/assets/photos/blog/writing-schedule.jpg +0 -0
  34. package/dist/blueprints/assets/photos/magazine/business-2.jpg +0 -0
  35. package/dist/blueprints/assets/photos/magazine/business-3.jpg +0 -0
  36. package/dist/blueprints/assets/photos/magazine/business.jpg +0 -0
  37. package/dist/blueprints/assets/photos/magazine/culture-2.jpg +0 -0
  38. package/dist/blueprints/assets/photos/magazine/culture-3.jpg +0 -0
  39. package/dist/blueprints/assets/photos/magazine/culture.jpg +0 -0
  40. package/dist/blueprints/assets/photos/magazine/news-2.jpg +0 -0
  41. package/dist/blueprints/assets/photos/magazine/news-3.jpg +0 -0
  42. package/dist/blueprints/assets/photos/magazine/news.jpg +0 -0
  43. package/dist/blueprints/assets/photos/magazine/opinion-2.jpg +0 -0
  44. package/dist/blueprints/assets/photos/magazine/opinion-3.jpg +0 -0
  45. package/dist/blueprints/assets/photos/magazine/opinion.jpg +0 -0
  46. package/dist/blueprints/assets/photos/portfolio/adatum-publishing.jpg +0 -0
  47. package/dist/blueprints/assets/photos/portfolio/contoso-mobile-app.jpg +0 -0
  48. package/dist/blueprints/assets/photos/portfolio/fabrikam-annual-report.jpg +0 -0
  49. package/dist/blueprints/assets/photos/portfolio/hero.jpg +0 -0
  50. package/dist/blueprints/assets/photos/portfolio/litware-signage.jpg +0 -0
  51. package/dist/blueprints/assets/photos/portfolio/northwind-rebrand.jpg +0 -0
  52. package/dist/blueprints/assets/photos/portfolio/proseware-launch.jpg +0 -0
  53. package/dist/blueprints/assets/photos/portfolio/tailspin-streaming.jpg +0 -0
  54. package/dist/blueprints/assets/photos/portfolio/wingtip-wayfinding.jpg +0 -0
  55. package/dist/blueprints/assets/photos/restaurant/charred-octopus.jpg +0 -0
  56. package/dist/blueprints/assets/photos/restaurant/chocolate-tart.jpg +0 -0
  57. package/dist/blueprints/assets/photos/restaurant/creme-brulee.jpg +0 -0
  58. package/dist/blueprints/assets/photos/restaurant/hero.jpg +0 -0
  59. package/dist/blueprints/assets/photos/restaurant/house-red.jpg +0 -0
  60. package/dist/blueprints/assets/photos/restaurant/house-white.jpg +0 -0
  61. package/dist/blueprints/assets/photos/restaurant/pan-seared-trout.jpg +0 -0
  62. package/dist/blueprints/assets/photos/restaurant/poached-pear.jpg +0 -0
  63. package/dist/blueprints/assets/photos/restaurant/roasted-beet-salad.jpg +0 -0
  64. package/dist/blueprints/assets/photos/restaurant/slow-roast-duck-leg.jpg +0 -0
  65. package/dist/blueprints/assets/photos/restaurant/soup-of-the-day.jpg +0 -0
  66. package/dist/blueprints/assets/photos/restaurant/sparkling-water.jpg +0 -0
  67. package/dist/blueprints/assets/photos/restaurant/wild-mushroom-risotto.jpg +0 -0
  68. package/dist/blueprints/assets/photos/saas/avatar-1.jpg +0 -0
  69. package/dist/blueprints/assets/photos/saas/hero.jpg +0 -0
  70. package/dist/blueprints/assets/photos/store/camp-blanket.jpg +0 -0
  71. package/dist/blueprints/assets/photos/store/canvas-tote.jpg +0 -0
  72. package/dist/blueprints/assets/photos/store/cast-iron-skillet.jpg +0 -0
  73. package/dist/blueprints/assets/photos/store/ceramic-pour-over-set.jpg +0 -0
  74. package/dist/blueprints/assets/photos/store/enamel-mug.jpg +0 -0
  75. package/dist/blueprints/assets/photos/store/everyday-tee.jpg +0 -0
  76. package/dist/blueprints/assets/photos/store/field-jacket.jpg +0 -0
  77. package/dist/blueprints/assets/photos/store/hero.jpg +0 -0
  78. package/dist/blueprints/assets/photos/store/leather-card-holder.jpg +0 -0
  79. package/dist/blueprints/assets/photos/store/linen-table-runner.jpg +0 -0
  80. package/dist/blueprints/assets/photos/store/trail-tote.jpg +0 -0
  81. package/dist/blueprints/assets/photos/store/wool-beanie.jpg +0 -0
  82. package/dist/blueprints/assets/photos/store/wool-overshirt.jpg +0 -0
  83. package/dist/blueprints/assets/photos/vitrine/avatar-1.jpg +0 -0
  84. package/dist/blueprints/assets/photos/vitrine/avatar-2.jpg +0 -0
  85. package/dist/blueprints/assets/photos/vitrine/avatar-3.jpg +0 -0
  86. package/dist/blueprints/assets/photos/vitrine/dashboard.jpg +0 -0
  87. package/dist/blueprints/assets/photos/vitrine/hero.jpg +0 -0
  88. package/dist/blueprints/association.d.ts +0 -151
  89. package/dist/blueprints/association.d.ts.map +0 -1
  90. package/dist/blueprints/association.js +0 -732
  91. package/dist/blueprints/association.js.map +0 -1
  92. package/dist/blueprints/blog.d.ts +0 -198
  93. package/dist/blueprints/blog.d.ts.map +0 -1
  94. package/dist/blueprints/blog.js +0 -665
  95. package/dist/blueprints/blog.js.map +0 -1
  96. package/dist/blueprints/content-pack.d.ts +0 -143
  97. package/dist/blueprints/content-pack.d.ts.map +0 -1
  98. package/dist/blueprints/content-pack.js +0 -111
  99. package/dist/blueprints/content-pack.js.map +0 -1
  100. package/dist/blueprints/content-packs.d.ts +0 -11
  101. package/dist/blueprints/content-packs.d.ts.map +0 -1
  102. package/dist/blueprints/content-packs.js +0 -29
  103. package/dist/blueprints/content-packs.js.map +0 -1
  104. package/dist/blueprints/demo-media.d.ts +0 -39
  105. package/dist/blueprints/demo-media.d.ts.map +0 -1
  106. package/dist/blueprints/demo-media.js +0 -30
  107. package/dist/blueprints/demo-media.js.map +0 -1
  108. package/dist/blueprints/documentation.d.ts +0 -134
  109. package/dist/blueprints/documentation.d.ts.map +0 -1
  110. package/dist/blueprints/documentation.js +0 -678
  111. package/dist/blueprints/documentation.js.map +0 -1
  112. package/dist/blueprints/magazine.d.ts +0 -145
  113. package/dist/blueprints/magazine.d.ts.map +0 -1
  114. package/dist/blueprints/magazine.js +0 -543
  115. package/dist/blueprints/magazine.js.map +0 -1
  116. package/dist/blueprints/menus.d.ts +0 -25
  117. package/dist/blueprints/menus.d.ts.map +0 -1
  118. package/dist/blueprints/menus.js +0 -33
  119. package/dist/blueprints/menus.js.map +0 -1
  120. package/dist/blueprints/photo-assets.d.ts +0 -3
  121. package/dist/blueprints/photo-assets.d.ts.map +0 -1
  122. package/dist/blueprints/photo-assets.js +0 -33
  123. package/dist/blueprints/photo-assets.js.map +0 -1
  124. package/dist/blueprints/portfolio.d.ts +0 -141
  125. package/dist/blueprints/portfolio.d.ts.map +0 -1
  126. package/dist/blueprints/portfolio.js +0 -700
  127. package/dist/blueprints/portfolio.js.map +0 -1
  128. package/dist/blueprints/restaurant.d.ts +0 -124
  129. package/dist/blueprints/restaurant.d.ts.map +0 -1
  130. package/dist/blueprints/restaurant.js +0 -457
  131. package/dist/blueprints/restaurant.js.map +0 -1
  132. package/dist/blueprints/saas.d.ts +0 -133
  133. package/dist/blueprints/saas.d.ts.map +0 -1
  134. package/dist/blueprints/saas.js +0 -551
  135. package/dist/blueprints/saas.js.map +0 -1
  136. package/dist/blueprints/site-settings-seed.d.ts +0 -17
  137. package/dist/blueprints/site-settings-seed.d.ts.map +0 -1
  138. package/dist/blueprints/site-settings-seed.js +0 -45
  139. package/dist/blueprints/site-settings-seed.js.map +0 -1
  140. package/dist/blueprints/starting-skins.d.ts +0 -19
  141. package/dist/blueprints/starting-skins.d.ts.map +0 -1
  142. package/dist/blueprints/starting-skins.js +0 -301
  143. package/dist/blueprints/starting-skins.js.map +0 -1
  144. package/dist/blueprints/store.d.ts +0 -173
  145. package/dist/blueprints/store.d.ts.map +0 -1
  146. package/dist/blueprints/store.js +0 -643
  147. package/dist/blueprints/store.js.map +0 -1
  148. package/dist/blueprints/vitrine.d.ts +0 -178
  149. package/dist/blueprints/vitrine.d.ts.map +0 -1
  150. package/dist/blueprints/vitrine.js +0 -529
  151. package/dist/blueprints/vitrine.js.map +0 -1
  152. package/dist/demo-art/compositions.d.ts +0 -48
  153. package/dist/demo-art/compositions.d.ts.map +0 -1
  154. package/dist/demo-art/compositions.js +0 -690
  155. package/dist/demo-art/compositions.js.map +0 -1
  156. package/dist/demo-art/index.d.ts +0 -8
  157. package/dist/demo-art/index.d.ts.map +0 -1
  158. package/dist/demo-art/index.js +0 -5
  159. package/dist/demo-art/index.js.map +0 -1
  160. package/dist/demo-art/oklch.d.ts +0 -39
  161. package/dist/demo-art/oklch.d.ts.map +0 -1
  162. package/dist/demo-art/oklch.js +0 -79
  163. package/dist/demo-art/oklch.js.map +0 -1
  164. package/dist/demo-art/png.d.ts +0 -24
  165. package/dist/demo-art/png.d.ts.map +0 -1
  166. package/dist/demo-art/png.js +0 -110
  167. package/dist/demo-art/png.js.map +0 -1
  168. package/dist/demo-art/render.d.ts +0 -228
  169. package/dist/demo-art/render.d.ts.map +0 -1
  170. package/dist/demo-art/render.js +0 -478
  171. package/dist/demo-art/render.js.map +0 -1
@@ -1,529 +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 `vitrine` blueprint's content model (L9 task 8, batch A; raised to a
8
- * pro template by L25): the classic one-pager showcase site for a small
9
- * business or consultancy — a list of services and a few testimonials,
10
- * both real, editable collections rather than data baked into the page
11
- * itself.
12
- *
13
- * `icon` (a symbol name `@cogenta/theme-kit`'s `renderIcon` recognises) and
14
- * `coverImage` (contract D `theme@1.4`'s `entryImage`) are what let
15
- * `theme-entreprise`'s `featureGrid` and `collectionList` show a service
16
- * the same way `theme-saas`'s own `feature` collection already does.
17
- */
18
- export const service = defineCollection({
19
- name: 'service',
20
- labels: { singular: 'Service', plural: 'Services' },
21
- // Routed, not just listed: `collectionList` (used on the home page below)
22
- // always builds a link for every entry it renders (`entryHref`,
23
- // `@cogenta/theme-kit`), so a collection it targets must have a route or
24
- // that render call throws.
25
- routing: { pattern: '/services/:slug' },
26
- fields: {
27
- name: f.text({ required: true, max: 120 }),
28
- slug: f.slug({ from: 'name', unique: true }),
29
- description: f.text({ max: 400, multiline: true }),
30
- icon: f.text({
31
- max: 64,
32
- admin: {
33
- label: 'Icon',
34
- help: 'One of the symbol names @cogenta/theme-kit recognises (e.g. "chart", "shield", "briefcase", "code", "trending-up", "tag"). Left blank, the service renders with no icon chip.',
35
- },
36
- }),
37
- coverImage: f.media({ accept: ['image'] }),
38
- ...SEO_FIELDS,
39
- },
40
- indexes: [['slug']],
41
- permissions: {
42
- read: ['public'],
43
- create: ['editor', 'admin'],
44
- update: ['editor', 'admin'],
45
- delete: ['admin'],
46
- },
47
- });
48
- export const testimonial = defineCollection({
49
- name: 'testimonial',
50
- labels: { singular: 'Testimonial', plural: 'Testimonials' },
51
- fields: {
52
- authorName: f.text({ required: true, max: 120 }),
53
- authorRole: f.text({ max: 120 }),
54
- quote: f.text({ required: true, max: 500, multiline: true }),
55
- avatar: f.media({ accept: ['image'] }),
56
- },
57
- permissions: {
58
- read: ['public'],
59
- create: ['editor', 'admin'],
60
- update: ['editor', 'admin'],
61
- delete: ['admin'],
62
- },
63
- });
64
- export const page = definePageCollection('/:slug');
65
- export const VITRINE_COLLECTIONS = [service, testimonial, page];
66
- validateCollectionSet(VITRINE_COLLECTIONS);
67
- /**
68
- * Six real B2B capabilities, each with the icon `featureGrid` (home page)
69
- * and this same entry's own `icon` field both point at — a `collectionList`
70
- * of `service` and the home page's `featureGrid` read as one system rather
71
- * than two unrelated sections.
72
- */
73
- export const VITRINE_DEMO_SERVICES = [
74
- {
75
- name: 'Brand strategy',
76
- slug: 'brand-strategy',
77
- description: 'We start every engagement here, because a redesign built on the wrong positioning just ships the confusion faster. Three weeks of interviews with your best customers and closest competitors end in a positioning document, a messaging framework, and a visual identity your team can defend in a board meeting without us in the room.',
78
- icon: 'tag',
79
- },
80
- {
81
- name: 'Web design & build',
82
- slug: 'web-design-build',
83
- description: 'Most of the sites we replace took longer to explain than to load. We design and build on Cogenta itself, so your team edits copy and swaps testimonials without filing a ticket — and the finished site still says what you do in the first five seconds, on every screen size.',
84
- icon: 'code',
85
- },
86
- {
87
- name: 'Growth marketing',
88
- slug: 'growth-marketing',
89
- description: 'We run paid, lifecycle and content programmes against one dashboard tied to closed revenue, not clicks. A channel that stops paying for itself gets cut inside a reporting cycle, not a fiscal quarter — most engagements end with a smaller media budget and a larger pipeline than they started with.',
90
- icon: 'trending-up',
91
- },
92
- {
93
- name: 'Operations consulting',
94
- slug: 'operations-consulting',
95
- description: 'Most operations problems are three broken handoffs, not thirty. We map how work actually moves through your organisation, not how the org chart says it should, and fix the handful of handoffs that are really costing you cycle time — against a metric your leadership already tracks.',
96
- icon: 'briefcase',
97
- },
98
- {
99
- name: 'Financial advisory',
100
- slug: 'financial-advisory',
101
- description: 'We build the model your finance team will still be using eighteen months from now, not a one-off deck. Every forecast ties back to the same general-ledger export your controller already trusts, so the numbers survive contact with a real board, and a real audit.',
102
- icon: 'chart',
103
- },
104
- {
105
- name: 'Security & compliance',
106
- slug: 'security-compliance',
107
- description: 'We inherited more than one compliance programme that was a binder nobody had opened since the last audit. Ours ships with a named owner and a real audit trail for every control, mapped to SOC 2 or ISO 27001 depending on what your customers actually ask for.',
108
- icon: 'shield',
109
- },
110
- ];
111
- export const VITRINE_DEMO_TESTIMONIALS = [
112
- {
113
- authorName: 'Amina Diallo',
114
- authorRole: 'Founder, Atelier Diallo',
115
- quote: 'Northfield rebuilt our positioning before they touched a single page of the site, and it showed — the new site paid for itself in the first month, because for the first time people understood what we do before they ever called. We still edit it ourselves, weekly, without asking anyone for help.',
116
- },
117
- {
118
- authorName: 'Marco Bellini',
119
- authorRole: 'Owner, Bellini Consulting',
120
- quote: 'Fast, clear, no surprises, and a fixed quote that held from the first call to the last invoice — exactly what a small business needs from a consulting engagement and almost never gets. Northfield delivered the brand and the site in five weeks and has been one email away ever since.',
121
- },
122
- {
123
- authorName: 'Priya Chandra',
124
- authorRole: 'COO, Chandra & Partners',
125
- quote: "Northfield's operations review took three weeks and changed how four teams hand off work to each other. We are still finding the recommendations landing a full quarter later, in meetings Northfield was never in the room for — that is the real test of whether a consultant fixed something.",
126
- },
127
- ];
128
- const BLOCK_VERSION = '1.0.0';
129
- function proseParagraph(key, text) {
130
- return {
131
- _key: key,
132
- _type: 'prose',
133
- _version: BLOCK_VERSION,
134
- body: richTextParagraph(`${key}-body`, text),
135
- };
136
- }
137
- /** A multi-paragraph `prose` block — same shape convention as `restaurant.ts`'s own `proseBlock`, for the About page's real founding story rather than one thin paragraph. */
138
- function proseBlock(key, paragraphs) {
139
- return {
140
- _key: key,
141
- _type: 'prose',
142
- _version: BLOCK_VERSION,
143
- body: paragraphs.map((text, index) => ({
144
- _key: `${key}-p${index}`,
145
- _type: 'block',
146
- style: 'normal',
147
- children: [{ _key: `${key}-p${index}-s`, _type: 'span', text, marks: [] }],
148
- markDefs: [],
149
- })),
150
- };
151
- }
152
- /**
153
- * `home` (eleven blocks, the "confident B2B one-pager" composition the L25
154
- * brief asks for: hero → trust strip → services → numbers → a wide product
155
- * shot → the full services grid with covers → client outcome → a second
156
- * voice → questions → call to action → a short about teaser), `about` (the
157
- * full story plus every real testimonial, mirrored as `quote` blocks so an
158
- * edit to the collection is visible without touching a page), and
159
- * `contact` (how to reach the business).
160
- *
161
- * A function of `media` (`SeedContext.media`) and the real ids
162
- * `seedVitrineDemoContent` assigns its own services (`serviceIdBySlug`),
163
- * not a static const: the hero's `media`, the trust strip's logos, the
164
- * services grid's covers and the featureGrid's links all need ids only the
165
- * scaffold knows at seed time. Both parameters default to empty so
166
- * `buildVitrineDemoPages({})` (the blueprint test's own call, and every
167
- * other blueprint's equivalent) still renders a complete, valid page —
168
- * `logoStrip`/`mediaFigure`/the hero's own media are simply omitted rather
169
- * than emitted with an empty required list.
170
- */
171
- export function buildVitrineDemoPages(media = {}, serviceIdBySlug = new Map()) {
172
- const serviceLink = (slug) => {
173
- const id = serviceIdBySlug.get(slug);
174
- return id === undefined ? undefined : { collection: 'service', id };
175
- };
176
- // `logoStrip` (blocks@2.0) requires at least one logo — a media map with
177
- // no `logo-*` entries (a scaffold with no demo-art seeded, or this
178
- // function called directly, as the blueprint test does) must therefore
179
- // omit the whole block rather than emit an empty, contract-invalid one.
180
- const logoItems = [0, 1, 2, 3, 4]
181
- .map((index) => media[`logo-${index}`])
182
- .filter((id) => id !== undefined)
183
- .map((id, index) => ({ _key: `demo-logo-${index}`, media: id }));
184
- const [testimonial1, testimonial2, testimonial3] = VITRINE_DEMO_TESTIMONIALS;
185
- return [
186
- {
187
- title: 'Home',
188
- slug: 'home',
189
- blocks: [
190
- {
191
- _key: 'demo-home-hero',
192
- _type: 'hero',
193
- _version: BLOCK_VERSION,
194
- eyebrow: 'Northfield Consulting · Est. 2011',
195
- title: 'The consultancy growing companies call before their systems fall over',
196
- subtitle: 'We handle the six functions that break first when headcount outpaces process — brand, web, growth, operations, finance and security — each led by a partner who has run it, not just advised on it.',
197
- ...(media.hero === undefined ? {} : { media: media.hero }),
198
- actions: [
199
- { label: 'See our services', target: { href: '#services' }, emphasis: 'primary' },
200
- { label: 'Get a quote', target: { href: '/contact' } },
201
- ],
202
- },
203
- ...(logoItems.length === 0
204
- ? []
205
- : [
206
- {
207
- _key: 'demo-home-logos',
208
- _type: 'logoStrip',
209
- _version: BLOCK_VERSION,
210
- logos: logoItems,
211
- caption: 'Trusted by teams at',
212
- },
213
- ]),
214
- {
215
- _key: 'demo-home-services',
216
- _type: 'featureGrid',
217
- _version: BLOCK_VERSION,
218
- title: 'What we do',
219
- items: VITRINE_DEMO_SERVICES.map((demo, index) => {
220
- const link = serviceLink(demo.slug);
221
- return {
222
- _key: `demo-service-${index}`,
223
- icon: demo.icon,
224
- title: demo.name,
225
- text: demo.description,
226
- ...(link === undefined ? {} : { link }),
227
- };
228
- }),
229
- },
230
- {
231
- _key: 'demo-home-numbers',
232
- _type: 'stats',
233
- _version: BLOCK_VERSION,
234
- items: [
235
- { _key: 'demo-home-stat-1', value: '3', unit: 'weeks', label: 'typical project' },
236
- { _key: 'demo-home-stat-2', value: '120', unit: '+', label: 'engagements delivered' },
237
- { _key: 'demo-home-stat-3', value: '100', unit: '%', label: 'content you can edit' },
238
- { _key: 'demo-home-stat-4', value: '0', label: 'lines of JavaScript shipped' },
239
- ],
240
- },
241
- // `mediaFigure.media` (blocks@2.0) is required — with no `shot`
242
- // media seeded, the block is omitted rather than emitted invalid
243
- // (same reasoning as `logoStrip` above).
244
- ...(media.shot === undefined
245
- ? []
246
- : [
247
- {
248
- _key: 'demo-home-shot',
249
- _type: 'mediaFigure',
250
- _version: BLOCK_VERSION,
251
- media: media.shot,
252
- caption: 'The engagement dashboard every Northfield team works from — the same tracker the client sees.',
253
- ratio: '16:9',
254
- align: 'wide',
255
- },
256
- ]),
257
- {
258
- _key: 'demo-home-services-grid',
259
- _type: 'collectionList',
260
- _version: BLOCK_VERSION,
261
- title: 'Every service, in detail',
262
- collection: 'service',
263
- sort: { field: 'createdAt', direction: 'asc' },
264
- limit: 10,
265
- layout: 'grid',
266
- },
267
- {
268
- _key: 'demo-home-testimonial',
269
- _type: 'testimonial',
270
- _version: BLOCK_VERSION,
271
- quote: richTextParagraph('demo-home-testimonial-quote', testimonial1.quote),
272
- attribution: {
273
- name: testimonial1.authorName,
274
- role: testimonial1.authorRole,
275
- ...(media['avatar-0'] === undefined ? {} : { avatar: media['avatar-0'] }),
276
- },
277
- },
278
- {
279
- _key: 'demo-home-quote',
280
- _type: 'quote',
281
- _version: BLOCK_VERSION,
282
- text: testimonial2.quote,
283
- author: testimonial2.authorName,
284
- role: testimonial2.authorRole,
285
- },
286
- homeFaq(),
287
- {
288
- _key: 'demo-home-cta',
289
- _type: 'cta',
290
- _version: BLOCK_VERSION,
291
- title: 'Ready to get started?',
292
- text: 'Book a thirty-minute call and leave with a scoped, fixed-price plan — not a follow-up email promising one.',
293
- actions: [{ label: 'Get a quote', target: { href: '/contact' }, emphasis: 'primary' }],
294
- },
295
- proseParagraph('demo-home-about-teaser', `${testimonial3.authorName}'s operations review is one of well over a hundred engagements like it since Northfield opened in 2011. Read the founding story, and the rest of our client list, on the About page.`),
296
- ],
297
- },
298
- {
299
- title: 'About',
300
- slug: 'about',
301
- blocks: [
302
- proseBlock('demo-about-prose', [
303
- 'Northfield Consulting opened in 2011 with a simple complaint: growing companies were buying six different kinds of help from six different vendors, none of whom talked to each other, and paying for the seams as much as the work.',
304
- 'We built one practice instead — brand, web, growth, operations, finance and security — staffed by partners who have actually run each function inside a company, not just advised one from the outside. A single point of contact means the web team knows what the brand team decided, and the finance model reflects what operations actually changed.',
305
- 'Fifteen years and well over a hundred engagements later, the test we hold ourselves to has not changed: does the client still need us in the room a quarter after we leave? Most of the answers on this page came from clients who told us no, and meant it as a compliment.',
306
- ]),
307
- // Every testimonial from the real, editable collection, mirrored
308
- // here as `quote` blocks — unlike `service` (routed above, so a
309
- // link can point at it), a testimonial has no page of its own
310
- // worth linking to, and `quote` — text/author/role, contract B's
311
- // vocabulary block for exactly this — is the honest fit.
312
- ...VITRINE_DEMO_TESTIMONIALS.map((demo, index) => ({
313
- _key: `demo-about-quote-${index + 1}`,
314
- _type: 'quote',
315
- _version: BLOCK_VERSION,
316
- text: demo.quote,
317
- author: demo.authorName,
318
- role: demo.authorRole,
319
- })),
320
- ],
321
- },
322
- {
323
- title: 'Contact',
324
- slug: 'contact',
325
- blocks: [
326
- proseParagraph('demo-contact-prose', 'Tell us what you are trying to get done and which of the six practices it touches — brand, web, growth, operations, finance, or security. We will tell you honestly whether we can help on the first call, no discovery deck required.'),
327
- {
328
- _key: 'demo-contact-cta',
329
- _type: 'cta',
330
- _version: BLOCK_VERSION,
331
- title: 'Get a quote',
332
- text: 'Thirty minutes, no obligation. We reply the same business day.',
333
- actions: [
334
- {
335
- label: 'Email us',
336
- target: { href: 'mailto:hello@example.com' },
337
- emphasis: 'primary',
338
- },
339
- ],
340
- },
341
- ],
342
- },
343
- ];
344
- }
345
- function homeFaq() {
346
- const items = [
347
- [
348
- 'How long does a typical engagement take?',
349
- 'Most engagements run three to six weeks end to end. We scope and price the whole thing on a single call before a single hour is billed, so there is no discovery-phase invoice waiting at the end.',
350
- ],
351
- [
352
- 'Do we own everything once the project ships?',
353
- 'Yes — the site, the brand files, the models and the source are yours outright. Northfield keeps no retainer requirement and no lock-in: change a phone number, swap a testimonial, or walk away entirely, all without calling us first.',
354
- ],
355
- [
356
- 'Can we start with just one service?',
357
- 'Most clients do. Brand strategy and web design & build are the two most common starting points, and roughly half of our clients come back for a second service once the first one has paid for itself.',
358
- ],
359
- [
360
- 'How do you price a project?',
361
- 'A fixed quote after a short discovery call, scoped to the outcome you actually need — never an open-ended hourly rate with no ceiling and no way to budget against it.',
362
- ],
363
- ];
364
- return {
365
- _key: 'demo-home-faq',
366
- _type: 'faq',
367
- _version: BLOCK_VERSION,
368
- title: 'Questions we hear often',
369
- items: items.map(([question, answer], index) => ({
370
- _key: `demo-home-faq-${index}`,
371
- question,
372
- answer: richTextParagraph(`demo-home-faq-${index}-a`, answer),
373
- })),
374
- };
375
- }
376
- /** `VITRINE_DEMO_PAGES` — the fixed-shape alias every existing caller (and `blueprint-demo-blocks.test.ts`) used before L25's media-driven rewrite. Equivalent to `buildVitrineDemoPages({})`. */
377
- export const VITRINE_DEMO_PAGES = buildVitrineDemoPages({});
378
- export const VITRINE_RECOMMENDED_AGENTS = [
379
- {
380
- name: 'seoAgent',
381
- package: '@cogenta/agents-builtin',
382
- reason: 'Audits the one-pager for on-page SEO issues before it goes live.',
383
- },
384
- {
385
- name: 'performanceAgent',
386
- package: '@cogenta/agents-builtin',
387
- reason: 'Catches oversized hero media and third-party scripts that would slow the landing page down.',
388
- },
389
- ];
390
- /**
391
- * `vitrine`'s own starting skin (`starting-skins.js`) — asserted present
392
- * with a real check, not a `!`, since `STARTING_SKINS` is keyed by
393
- * blueprint id and TypeScript cannot see that this particular key is
394
- * always populated.
395
- */
396
- function vitrinePalette() {
397
- const skin = STARTING_SKINS.vitrine;
398
- if (skin === undefined) {
399
- // Same code `resolveBlueprint` (`registry.ts`) uses for its own
400
- // "this cannot happen unless the registry itself is broken" guard —
401
- // this is a bug in starting-skins.ts, never a user-facing condition.
402
- throw new CogentaError({
403
- code: 'BLUEPRINT_REGISTRY_CORRUPT',
404
- message: 'STARTING_SKINS.vitrine is missing.',
405
- hint: 'The "vitrine" entry must stay declared in starting-skins.ts for this blueprint to render its demo art.',
406
- });
407
- }
408
- return skin.color;
409
- }
410
- /**
411
- * Procedural visuals this blueprint seeds (L25): a flat geometric hero
412
- * backdrop, five neutral client logos for the trust strip, one wide cover
413
- * for the engagement-dashboard figure, one avatar per testimonial, and one
414
- * cover photo per demo service — all from the same starting-skin palette
415
- * (`starting-skins.js`) this blueprint already ships.
416
- */
417
- export const VITRINE_MEDIA_SPECS = [
418
- {
419
- name: 'hero',
420
- spec: heroArt(vitrinePalette(), 'sun', 61),
421
- alt: 'A consulting team at work',
422
- photo: 'vitrine/hero.jpg',
423
- },
424
- {
425
- name: 'shot',
426
- spec: coverArt(vitrinePalette(), 62),
427
- alt: 'The engagement dashboard',
428
- photo: 'vitrine/dashboard.jpg',
429
- },
430
- ...[0, 1, 2, 3, 4].map((index) => ({
431
- name: `logo-${index}`,
432
- spec: logoArt(70 + index),
433
- alt: `Client logo ${index + 1}`,
434
- })),
435
- ...VITRINE_DEMO_TESTIMONIALS.map((demo, index) => ({
436
- name: `avatar-${index}`,
437
- spec: avatarArt(vitrinePalette(), 80 + index),
438
- alt: `Portrait of ${demo.authorName}`,
439
- photo: `vitrine/avatar-${index + 1}.jpg`,
440
- })),
441
- ...VITRINE_DEMO_SERVICES.map((demo, index) => ({
442
- name: `service-${demo.slug}`,
443
- spec: coverArt(vitrinePalette(), 90 + index),
444
- alt: `${demo.name} cover art`,
445
- })),
446
- ];
447
- /** Header/footer navigation and the header call-to-action button (L25, D4). */
448
- export const VITRINE_MENUS = {
449
- header: [
450
- { label: 'Services', url: '/services/brand-strategy' },
451
- { label: 'About', url: '/about' },
452
- { label: 'Case studies', url: '#' },
453
- { label: 'Contact', url: '/contact' },
454
- ],
455
- footer: [
456
- { label: 'Services', url: '/services/brand-strategy' },
457
- { label: 'Company', url: '/about' },
458
- { label: 'Legal', url: '#' },
459
- ],
460
- headerAction: { label: 'Get a quote', url: '/contact' },
461
- };
462
- export const VITRINE_SITE_SETTINGS = {
463
- 'general.tagline': 'A consultancy that runs like software.',
464
- 'general.socialLinks': [
465
- { label: 'LinkedIn', url: 'https://linkedin.com/company/example' },
466
- { label: 'X', url: 'https://x.com/example' },
467
- { label: 'YouTube', url: 'https://youtube.com/@example' },
468
- ],
469
- 'general.footerNote': '1 Market Street, Suite 400, San Francisco, CA 94105',
470
- };
471
- /**
472
- * Inserts the `vitrine` blueprint's demo content through the real
473
- * `ContentStore` — never mocked (house rule). Services are created first so
474
- * their real ids exist for the home page's `featureGrid` links and, via
475
- * `media`, for their own `coverImage`.
476
- */
477
- async function seedVitrineDemoContent(ctx) {
478
- const { db, defaultLocale, adminId, media } = ctx;
479
- const serviceStore = createContentStore({ db, collection: service, defaultLocale });
480
- const testimonialStore = createContentStore({ db, collection: testimonial, defaultLocale });
481
- const pageStore = createContentStore({ db, collection: page, defaultLocale });
482
- const serviceIdBySlug = new Map();
483
- for (const demo of VITRINE_DEMO_SERVICES) {
484
- const cover = media[`service-${demo.slug}`];
485
- const created = await serviceStore.create({
486
- status: 'published',
487
- createdBy: adminId,
488
- values: {
489
- name: demo.name,
490
- slug: demo.slug,
491
- description: demo.description,
492
- icon: demo.icon,
493
- ...(cover === undefined ? {} : { coverImage: cover }),
494
- },
495
- });
496
- serviceIdBySlug.set(demo.slug, created.id);
497
- }
498
- for (const [index, demo] of VITRINE_DEMO_TESTIMONIALS.entries()) {
499
- const avatar = media[`avatar-${index}`];
500
- await testimonialStore.create({
501
- status: 'published',
502
- createdBy: adminId,
503
- values: {
504
- authorName: demo.authorName,
505
- authorRole: demo.authorRole,
506
- quote: demo.quote,
507
- ...(avatar === undefined ? {} : { avatar }),
508
- },
509
- });
510
- }
511
- for (const demo of buildVitrineDemoPages(media, serviceIdBySlug)) {
512
- await pageStore.create({
513
- status: 'published',
514
- createdBy: adminId,
515
- values: { title: demo.title, slug: demo.slug },
516
- blocks: { blocks: demo.blocks.map(toBlockZoneEntry) },
517
- });
518
- }
519
- }
520
- export const vitrineContentPack = {
521
- collections: VITRINE_COLLECTIONS,
522
- recommendedAgents: VITRINE_RECOMMENDED_AGENTS,
523
- seedDemoContent: seedVitrineDemoContent,
524
- defaultTheme: '@cogenta/theme-entreprise',
525
- menus: VITRINE_MENUS,
526
- siteSettings: VITRINE_SITE_SETTINGS,
527
- mediaSpecs: VITRINE_MEDIA_SPECS,
528
- };
529
- //# sourceMappingURL=vitrine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vitrine.js","sourceRoot":"","sources":["../../src/blueprints/vitrine.ts"],"names":[],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import type { SkinTokens } from '@cogenta/render';
2
- import { type ArtSpec } from './render.js';
3
- /**
4
- * Ready-made compositions for `demo-art` (D1/D5, `docs/lots/L25-templates-pro.md`).
5
- * Each preset takes a `palette` — the same shape as `SkinTokens.color`
6
- * (`packages/create-cogenta/src/blueprints/starting-skins.ts`), so any
7
- * blueprint's starting skin is a valid palette with no translation step —
8
- * and returns an {@link ArtSpec} `render.ts` can turn into a PNG.
9
- *
10
- * D5 (2026-09-05, binding): **zero gradients, zero glow, zero blur.** Every
11
- * composition below is built only from flat, opaque shapes — solid colour
12
- * fields, crisp geometric marks, dot/line grids, hard-edged bands, a
13
- * checkerboard, and hard-edged organic blobs — the register of Swiss/
14
- * editorial flat design (Basecamp, Notion, Stripe's docs illustrations,
15
- * Apple's marketing graphics), never a "mesh gradient" landing-page look.
16
- * `render.ts`'s `gradient`/`glow`/`vignette` layer kinds stay defined and
17
- * tested there (a capability, not a ban) — nothing in this file ever emits
18
- * one; `test/demo-art/flat-design.test.ts` holds that line.
19
- */
20
- export type Palette = SkinTokens['color'];
21
- /**
22
- * `mesh`/`geometric`/`diagonal`/`radial`/`dark`/`warm` are the names every
23
- * existing caller compiles against; `grid`/`blocks`/`bands`/`rings`/`ink`/
24
- * `sun` are the same six families under names that describe what they
25
- * actually render now that D5 removed the gradients the old names referred
26
- * to. Both spellings of a given family always render identically.
27
- */
28
- export type HeroVariant = 'mesh' | 'geometric' | 'diagonal' | 'radial' | 'dark' | 'warm' | 'grid' | 'blocks' | 'bands' | 'rings' | 'ink' | 'sun';
29
- /**
30
- * A 1600×1000 hero visual. Every theme frames the hero's media beside the
31
- * title — a picture next to the text, never a backdrop under it — so the
32
- * composition fills the whole canvas like a poster: an early version kept
33
- * the left half a single flat colour "for the title" and rendered as a
34
- * mostly blank frame on every home page. `variant` names one of the flat
35
- * poster families (the same builders `coverArt` picks from, at hero size);
36
- * the older names (`mesh`, `geometric`, `diagonal`, `radial`, `dark`, `warm`)
37
- * stay as aliases so no blueprint needs to change.
38
- */
39
- export declare function heroArt(palette: Palette, variant?: HeroVariant, seed?: number): ArtSpec;
40
- /** A family of ≥8 visibly different, flat layouts from one palette, picked deterministically by `seed` (D5: colour blocks, grid & node, stripe bands, concentric rings, editorial marks, isometric stacks, arch & sun, checker/half-tone, duotone blobs). */
41
- export declare function coverArt(palette: Palette, seed?: number): ArtSpec;
42
- /** A 600×600 abstract "person" mark: a disc (head) over a disc (shoulders, cropped by the frame edge) on a flat companion-tone field — never a real photo of a person. */
43
- export declare function avatarArt(palette: Palette, seed?: number): ArtSpec;
44
- /** A 400×160 neutral, abstract wordmark stand-in — a geometric mark plus two bars, always in flat mid-grey so it reads as a client logo in a logo strip, never a real brand. 8 distinct marks across seeds. */
45
- export declare function logoArt(seed?: number): ArtSpec;
46
- /** A 1000×1000 centred, flat stylised object — a store's demo catalogue. Hard offset shadows (a darker solid shape, never blurred), a solid or two-tone backdrop, a floor line, one flat highlight shape per object. 6 shapes across seeds. */
47
- export declare function productArt(palette: Palette, seed?: number): ArtSpec;
48
- //# sourceMappingURL=compositions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compositions.d.ts","sourceRoot":"","sources":["../../src/demo-art/compositions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,OAAO,EAAiB,KAAK,OAAO,EAAwC,MAAM,aAAa,CAAA;AAE/F;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AA+IzC;;;;;;GAMG;AACH,MAAM,MAAM,WAAW,GACnB,MAAM,GACN,WAAW,GACX,UAAU,GACV,QAAQ,GACR,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,OAAO,GACP,OAAO,GACP,KAAK,GACL,KAAK,CAAA;AAsBT;;;;;;;;;GASG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,WAAoB,EAAE,IAAI,SAAI,GAAG,OAAO,CA4B1F;AA4OD,6PAA6P;AAC7P,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,SAAI,GAAG,OAAO,CAc5D;AAMD,0KAA0K;AAC1K,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,SAAI,GAAG,OAAO,CAyB7D;AAOD,+MAA+M;AAC/M,wBAAgB,OAAO,CAAC,IAAI,SAAI,GAAG,OAAO,CAoHzC;AAMD,+OAA+O;AAC/O,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,SAAI,GAAG,OAAO,CAuM9D"}