@warpgogol/werkstatt-shared 0.2.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 (403) hide show
  1. package/package.json +352 -0
  2. package/src/checks/index.ts +24 -0
  3. package/src/checks/lib/astro-site-url.ts +30 -0
  4. package/src/checks/lib/i18n.ts +30 -0
  5. package/src/checks/result-helpers.ts +102 -0
  6. package/src/checks/suppressions-config.ts +195 -0
  7. package/src/index.ts +14 -0
  8. package/src/integration/README.md +38 -0
  9. package/src/integration/adapters.ts +143 -0
  10. package/src/integration/crm-buffer.ts +491 -0
  11. package/src/integration/dispatch.ts +106 -0
  12. package/src/integration/funnel.ts +379 -0
  13. package/src/integration/index.ts +56 -0
  14. package/src/integration/lifecycle.ts +155 -0
  15. package/src/integration/orchestration.ts +439 -0
  16. package/src/integration/port-barrel.ts +124 -0
  17. package/src/integration/port.ts +143 -0
  18. package/src/integration/qstash.ts +134 -0
  19. package/src/integration/sharding.ts +133 -0
  20. package/src/integration/tests/deliver-event.test.ts +52 -0
  21. package/src/integration/tests/dispatch.test.ts +88 -0
  22. package/src/integration/tests/funnel-bridge.test.ts +46 -0
  23. package/src/integration/tests/hub-runtime.test.ts +128 -0
  24. package/src/integration/tests/lifecycle.test.ts +69 -0
  25. package/src/integration/tests/qstash.test.ts +83 -0
  26. package/src/integration/tests/sharding.test.ts +64 -0
  27. package/src/integration/vitest.config.ts +8 -0
  28. package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
  29. package/src/integration-adapter-supabase-crm/client.ts +605 -0
  30. package/src/integration-adapter-supabase-crm/index.ts +28 -0
  31. package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
  32. package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
  33. package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
  34. package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
  35. package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
  36. package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
  37. package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
  38. package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
  39. package/src/integration-adapter-supabase-crm/worker.ts +223 -0
  40. package/src/observability/conventions.ts +93 -0
  41. package/src/observability/env-resolver.ts +57 -0
  42. package/src/observability/index.ts +57 -0
  43. package/src/observability/metric-registry.ts +184 -0
  44. package/src/observability/otlp-converter.ts +125 -0
  45. package/src/observability/otlp-json.ts +135 -0
  46. package/src/observability/otlp-transport.ts +68 -0
  47. package/src/observability/pusher.ts +142 -0
  48. package/src/observability/redact.ts +27 -0
  49. package/src/observability/tests/conventions.test.ts +100 -0
  50. package/src/observability/tests/metric-registry.test.ts +117 -0
  51. package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
  52. package/src/observability/tests/otlp-converter.test.ts +157 -0
  53. package/src/observability/tests/otlp-json.test.ts +120 -0
  54. package/src/observability/tests/pusher.test.ts +75 -0
  55. package/src/observability/tests/redact.pbt.test.ts +71 -0
  56. package/src/observability/tests/redact.test.ts +37 -0
  57. package/src/observability/typed-refs.ts +137 -0
  58. package/src/observability/vitest.config.ts +8 -0
  59. package/src/ontology/analytics/matomo-binding.yaml +172 -0
  60. package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
  61. package/src/ontology/analytics/messkanon.yaml +151 -0
  62. package/src/ontology/archetype-registry.ts +61 -0
  63. package/src/ontology/archetypes/components/brand-label.yaml +19 -0
  64. package/src/ontology/archetypes/components/copyright.yaml +19 -0
  65. package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
  66. package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
  67. package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
  68. package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
  69. package/src/ontology/archetypes/components/layout.yaml +19 -0
  70. package/src/ontology/archetypes/components/live-photo.yaml +20 -0
  71. package/src/ontology/archetypes/components/material-credit.yaml +20 -0
  72. package/src/ontology/archetypes/components/media.yaml +21 -0
  73. package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
  74. package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
  75. package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
  76. package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
  77. package/src/ontology/archetypes/components/not-found.yaml +22 -0
  78. package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
  79. package/src/ontology/archetypes/components/passport-header.yaml +19 -0
  80. package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
  81. package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
  82. package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
  83. package/src/ontology/archetypes/components/person-profile.yaml +20 -0
  84. package/src/ontology/archetypes/components/pulsar.yaml +20 -0
  85. package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
  86. package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
  87. package/src/ontology/archetypes/components/social-meta.yaml +20 -0
  88. package/src/ontology/archetypes/components/structured-data.yaml +19 -0
  89. package/src/ontology/archetypes/index.json +1003 -0
  90. package/src/ontology/archetypes/index.yaml +821 -0
  91. package/src/ontology/archetypes/sections/approach.yaml +23 -0
  92. package/src/ontology/archetypes/sections/article-list.yaml +30 -0
  93. package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
  94. package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
  95. package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
  96. package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
  97. package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
  98. package/src/ontology/archetypes/sections/credits.yaml +29 -0
  99. package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
  100. package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
  101. package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
  102. package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
  103. package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
  104. package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
  105. package/src/ontology/archetypes/sections/hero.yaml +50 -0
  106. package/src/ontology/archetypes/sections/impact.yaml +23 -0
  107. package/src/ontology/archetypes/sections/markdown.yaml +43 -0
  108. package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
  109. package/src/ontology/archetypes/sections/navigation.yaml +20 -0
  110. package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
  111. package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
  112. package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
  113. package/src/ontology/archetypes/sections/people.yaml +48 -0
  114. package/src/ontology/archetypes/sections/price-card.yaml +50 -0
  115. package/src/ontology/archetypes/sections/problem.yaml +23 -0
  116. package/src/ontology/archetypes/sections/send-message.yaml +63 -0
  117. package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
  118. package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
  119. package/src/ontology/archetypes/sections/transparency.yaml +32 -0
  120. package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
  121. package/src/ontology/archetypes/sections/video-section.yaml +27 -0
  122. package/src/ontology/archetypes/sections/women.yaml +29 -0
  123. package/src/ontology/biome-token-projection.ts +229 -0
  124. package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
  125. package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
  126. package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
  127. package/src/ontology/blueprints/offer.yaml +39 -0
  128. package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
  129. package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
  130. package/src/ontology/blueprints/ratgeber.yaml +62 -0
  131. package/src/ontology/blueprints/website-local.yaml +309 -0
  132. package/src/ontology/blueprints/website-service.yaml +84 -0
  133. package/src/ontology/capabilities/lead.submit.yaml +44 -0
  134. package/src/ontology/cosmic/index.ts +48 -0
  135. package/src/ontology/cosmic/moon-catalog.ts +173 -0
  136. package/src/ontology/cosmic/planet-catalog.ts +82 -0
  137. package/src/ontology/cosmic/star-catalog.ts +337 -0
  138. package/src/ontology/enums.ts +159 -0
  139. package/src/ontology/external-surfaces/index.ts +158 -0
  140. package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
  141. package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
  142. package/src/ontology/external-surfaces/url-schema.yaml +95 -0
  143. package/src/ontology/growth/events/contact-email-click.yaml +21 -0
  144. package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
  145. package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
  146. package/src/ontology/growth/events/contact-route-click.yaml +21 -0
  147. package/src/ontology/growth/events/contact-submit.yaml +28 -0
  148. package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
  149. package/src/ontology/growth/events/cta-click.yaml +30 -0
  150. package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
  151. package/src/ontology/growth/events/donation-form-start.yaml +21 -0
  152. package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
  153. package/src/ontology/growth/events/donation-intent.yaml +29 -0
  154. package/src/ontology/growth/events/form-error.yaml +27 -0
  155. package/src/ontology/growth/events/form-start.yaml +21 -0
  156. package/src/ontology/growth/events/form-submit.yaml +21 -0
  157. package/src/ontology/growth/events/outbound-click.yaml +25 -0
  158. package/src/ontology/growth/events/page-view.yaml +24 -0
  159. package/src/ontology/growth/events/passport-view.yaml +28 -0
  160. package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
  161. package/src/ontology/index.ts +165 -0
  162. package/src/ontology/manifest.ts +344 -0
  163. package/src/ontology/operations/index.ts +1 -0
  164. package/src/ontology/schemas/biome.ts +303 -0
  165. package/src/ontology/schemas/capability.ts +104 -0
  166. package/src/ontology/schemas/constellation.ts +114 -0
  167. package/src/ontology/schemas/dns-records.ts +53 -0
  168. package/src/ontology/schemas/index.ts +95 -0
  169. package/src/ontology/schemas/manifest-resolver.ts +123 -0
  170. package/src/ontology/schemas/page-entry.ts +213 -0
  171. package/src/ontology/schemas/section-archetype.ts +109 -0
  172. package/src/ontology/schemas/site-family.ts +98 -0
  173. package/src/ontology/schemas/system/growth.ts +80 -0
  174. package/src/ontology/schemas/system/integrations.ts +143 -0
  175. package/src/ontology/schemas/system/manifest.ts +492 -0
  176. package/src/ontology/schemas/system/page-output.ts +99 -0
  177. package/src/ontology/schemas/system/release.ts +58 -0
  178. package/src/ontology/schemas/system/text.ts +58 -0
  179. package/src/ontology/schemas/system.ts +53 -0
  180. package/src/ontology/shared-section-props/body-fragments.ts +182 -0
  181. package/src/ontology/shared-section-props/catalog.ts +195 -0
  182. package/src/ontology/shared-section-props/common.ts +178 -0
  183. package/src/ontology/shared-section-props/index.ts +34 -0
  184. package/src/ontology/shared-section-props/visual-header.ts +163 -0
  185. package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
  186. package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
  187. package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
  188. package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
  189. package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
  190. package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
  191. package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
  192. package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
  193. package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
  194. package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
  195. package/src/ontology/tests/enums.test.ts +203 -0
  196. package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
  197. package/src/ontology/vitest.config.ts +8 -0
  198. package/src/passport/dht-sign.test.ts +99 -0
  199. package/src/passport/dht-sign.ts +73 -0
  200. package/src/passport/identity-sign.test.ts +134 -0
  201. package/src/passport/identity-sign.ts +85 -0
  202. package/src/passport/index.ts +53 -0
  203. package/src/passport/key-rotate.ts +133 -0
  204. package/src/passport/schema.ts +198 -0
  205. package/src/passport/sign.ts +225 -0
  206. package/src/passport/tests/schema.pbt.test.ts +93 -0
  207. package/src/passport/tests/schema.test.ts +222 -0
  208. package/src/passport/vitest.config.ts +8 -0
  209. package/src/share/agent/api-catalog.ts +77 -0
  210. package/src/share/agent/capability.ts +68 -0
  211. package/src/share/agent/dns-aid.test.ts +74 -0
  212. package/src/share/agent/dns-aid.ts +53 -0
  213. package/src/share/agent/fleet-catalog.ts +149 -0
  214. package/src/share/agent/index.ts +29 -0
  215. package/src/share/agent/knowledge.ts +96 -0
  216. package/src/share/agent/manifest.ts +126 -0
  217. package/src/share/agent/mcp-card.ts +63 -0
  218. package/src/share/agent/omit-empty.ts +77 -0
  219. package/src/share/agent/openapi.ts +157 -0
  220. package/src/share/agent/proof.ts +61 -0
  221. package/src/share/attribution-display.ts +86 -0
  222. package/src/share/check-hints.ts +38 -0
  223. package/src/share/content/entity-id.ts +65 -0
  224. package/src/share/content/index.ts +16 -0
  225. package/src/share/content/merge.ts +86 -0
  226. package/src/share/content/resolve-field-path.ts +39 -0
  227. package/src/share/content/substitute-deep.ts +47 -0
  228. package/src/share/content-discipline/index.ts +14 -0
  229. package/src/share/content-discipline/parsers.ts +66 -0
  230. package/src/share/content-discipline/types.ts +118 -0
  231. package/src/share/content-reference.ts +333 -0
  232. package/src/share/counter-utils.ts +75 -0
  233. package/src/share/css-value-normalize.ts +48 -0
  234. package/src/share/dev-props-validator.ts +131 -0
  235. package/src/share/entitlement.ts +172 -0
  236. package/src/share/env.d.ts +73 -0
  237. package/src/share/feature-policy.ts +367 -0
  238. package/src/share/formula-eval.ts +364 -0
  239. package/src/share/fs/index.ts +96 -0
  240. package/src/share/i18n/localization.ts +57 -0
  241. package/src/share/image-provider.ts +314 -0
  242. package/src/share/index.ts +86 -0
  243. package/src/share/knowledge/claim.ts +129 -0
  244. package/src/share/knowledge/derivation.ts +55 -0
  245. package/src/share/knowledge/freshness.ts +127 -0
  246. package/src/share/knowledge/index.ts +23 -0
  247. package/src/share/knowledge/ledger.ts +222 -0
  248. package/src/share/knowledge/plan.ts +122 -0
  249. package/src/share/knowledge/source.ts +170 -0
  250. package/src/share/legal/translation-policy.ts +133 -0
  251. package/src/share/material-credits.ts +181 -0
  252. package/src/share/middleware/language-redirect.ts +49 -0
  253. package/src/share/offer-capacity.ts +149 -0
  254. package/src/share/onboarding-yaml/index.ts +162 -0
  255. package/src/share/page.ts +351 -0
  256. package/src/share/redirects.test.ts +62 -0
  257. package/src/share/redirects.ts +54 -0
  258. package/src/share/rfc0042-utils.ts +95 -0
  259. package/src/share/runtime-context.ts +70 -0
  260. package/src/share/schemas/claim-records.ts +69 -0
  261. package/src/share/schemas/claims.ts +150 -0
  262. package/src/share/schemas/effects.ts +212 -0
  263. package/src/share/schemas/features.ts +147 -0
  264. package/src/share/schemas/horizontal-align.ts +22 -0
  265. package/src/share/schemas/icon-color.ts +27 -0
  266. package/src/share/schemas/index.ts +43 -0
  267. package/src/share/schemas/live-photo.ts +53 -0
  268. package/src/share/schemas/material-credit.ts +292 -0
  269. package/src/share/schemas/media.ts +220 -0
  270. package/src/share/schemas/navigation.ts +74 -0
  271. package/src/share/schemas/page-base.ts +33 -0
  272. package/src/share/schemas/participant.ts +247 -0
  273. package/src/share/schemas/person.ts +24 -0
  274. package/src/share/schemas/print.ts +93 -0
  275. package/src/share/schemas/section-background.ts +106 -0
  276. package/src/share/schemas/section-body.ts +138 -0
  277. package/src/share/schemas/section-cards.ts +37 -0
  278. package/src/share/schemas/section-cta.ts +74 -0
  279. package/src/share/schemas/section-header.ts +77 -0
  280. package/src/share/schemas/section-image.ts +77 -0
  281. package/src/share/schemas/section-motion.ts +52 -0
  282. package/src/share/schemas/section-shell.ts +63 -0
  283. package/src/share/schemas/section-stats.ts +37 -0
  284. package/src/share/schemas/site-background.ts +78 -0
  285. package/src/share/schemas/standard-list-item.ts +38 -0
  286. package/src/share/scripts/external-links.ts +45 -0
  287. package/src/share/scripts/gsap-counter.ts +168 -0
  288. package/src/share/scripts/gsap-mountain-journey.ts +236 -0
  289. package/src/share/scripts/gsap-parallax.ts +50 -0
  290. package/src/share/scripts/gsap-reveal.ts +65 -0
  291. package/src/share/scripts/gsap-stagger.ts +54 -0
  292. package/src/share/scripts/index.ts +25 -0
  293. package/src/share/scripts/inline-number-animation.ts +120 -0
  294. package/src/share/scripts/lenis.ts +109 -0
  295. package/src/share/scripts/live-photos.ts +250 -0
  296. package/src/share/scripts/lordicon.ts +94 -0
  297. package/src/share/scripts/orchestrator.ts +138 -0
  298. package/src/share/scripts/scheduler.ts +53 -0
  299. package/src/share/scripts/video-player.ts +116 -0
  300. package/src/share/semantic/ai.ts +140 -0
  301. package/src/share/semantic/block-extraction.ts +52 -0
  302. package/src/share/semantic/block-extractors/index.ts +502 -0
  303. package/src/share/semantic/breadcrumbs.ts +120 -0
  304. package/src/share/semantic/build-page.ts +309 -0
  305. package/src/share/semantic/business-projection.ts +278 -0
  306. package/src/share/semantic/derived-prices-loader.ts +36 -0
  307. package/src/share/semantic/extract.ts +118 -0
  308. package/src/share/semantic/feed.ts +124 -0
  309. package/src/share/semantic/ids.ts +76 -0
  310. package/src/share/semantic/image-sitemap.ts +153 -0
  311. package/src/share/semantic/index.ts +36 -0
  312. package/src/share/semantic/jsonld/article.ts +47 -0
  313. package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
  314. package/src/share/semantic/jsonld/collection-list.ts +30 -0
  315. package/src/share/semantic/jsonld/context.ts +46 -0
  316. package/src/share/semantic/jsonld/faq.ts +49 -0
  317. package/src/share/semantic/jsonld/initiative.ts +53 -0
  318. package/src/share/semantic/jsonld/organization.ts +101 -0
  319. package/src/share/semantic/jsonld/person.ts +71 -0
  320. package/src/share/semantic/jsonld/service.ts +80 -0
  321. package/src/share/semantic/jsonld/shared.ts +31 -0
  322. package/src/share/semantic/jsonld/types.ts +18 -0
  323. package/src/share/semantic/jsonld/webpage.ts +98 -0
  324. package/src/share/semantic/jsonld/website.ts +27 -0
  325. package/src/share/semantic/jsonld.ts +75 -0
  326. package/src/share/semantic/llms-policy.ts +74 -0
  327. package/src/share/semantic/llms.ts +394 -0
  328. package/src/share/semantic/markdown-hygiene.ts +68 -0
  329. package/src/share/semantic/markdown-twin-provenance.ts +242 -0
  330. package/src/share/semantic/models.ts +402 -0
  331. package/src/share/semantic/organization-profile.ts +160 -0
  332. package/src/share/semantic/output-projection.ts +131 -0
  333. package/src/share/semantic/page-builders/markdown-page.ts +84 -0
  334. package/src/share/semantic/page-markdown.ts +234 -0
  335. package/src/share/semantic/page-utils.ts +125 -0
  336. package/src/share/semantic/price-marker-resolver.ts +92 -0
  337. package/src/share/semantic/robots.ts +127 -0
  338. package/src/share/semantic/update-stamp.ts +136 -0
  339. package/src/share/shared-context.ts +177 -0
  340. package/src/share/string-utils.ts +19 -0
  341. package/src/share/tests/api-catalog.test.ts +97 -0
  342. package/src/share/tests/breadcrumbs.test.ts +126 -0
  343. package/src/share/tests/build-page-price-markers.test.ts +160 -0
  344. package/src/share/tests/capability.test.ts +107 -0
  345. package/src/share/tests/claim.test.ts +90 -0
  346. package/src/share/tests/content-ref-index.test.ts +328 -0
  347. package/src/share/tests/create-dev-props-validator.test.ts +38 -0
  348. package/src/share/tests/derivation.test.ts +39 -0
  349. package/src/share/tests/dev-props-validator.test.ts +88 -0
  350. package/src/share/tests/fleet-catalog.test.ts +134 -0
  351. package/src/share/tests/formula-eval.test.ts +619 -0
  352. package/src/share/tests/freshness.test.ts +60 -0
  353. package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
  354. package/src/share/tests/image-sitemap.test.ts +101 -0
  355. package/src/share/tests/jsonld-service.test.ts +282 -0
  356. package/src/share/tests/knowledge.test.ts +86 -0
  357. package/src/share/tests/ledger.test.ts +125 -0
  358. package/src/share/tests/llms-0789.test.ts +63 -0
  359. package/src/share/tests/manifest.test.ts +100 -0
  360. package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
  361. package/src/share/tests/mcp-card.test.ts +57 -0
  362. package/src/share/tests/onboarding-yaml.test.ts +111 -0
  363. package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
  364. package/src/share/tests/openapi.test.ts +116 -0
  365. package/src/share/tests/organization-jsonld.test.ts +74 -0
  366. package/src/share/tests/output-projection.test.ts +61 -0
  367. package/src/share/tests/plan.test.ts +97 -0
  368. package/src/share/tests/price-marker-resolver.test.ts +141 -0
  369. package/src/share/tests/proof.test.ts +72 -0
  370. package/src/share/tests/resolve-field-path.test.ts +52 -0
  371. package/src/share/tests/source.test.ts +81 -0
  372. package/src/share/tests/substitute-deep.test.ts +65 -0
  373. package/src/share/tests/text-normalize.pbt.test.ts +143 -0
  374. package/src/share/tests/text-normalize.test.ts +285 -0
  375. package/src/share/tests/twin-path.test.ts +43 -0
  376. package/src/share/text-normalize.ts +548 -0
  377. package/src/share/text-position.ts +19 -0
  378. package/src/share/types/hls-js-light.d.ts +16 -0
  379. package/src/share/visibility.ts +167 -0
  380. package/src/share/vitest.config.ts +8 -0
  381. package/src/share/wrap-inline-numbers.ts +139 -0
  382. package/src/surface/blueprint-schema.ts +314 -0
  383. package/src/surface/blueprint-types.ts +256 -0
  384. package/src/surface/blueprint.ts +300 -0
  385. package/src/surface/breaker.ts +57 -0
  386. package/src/surface/decision-composer.ts +156 -0
  387. package/src/surface/eligibility.ts +372 -0
  388. package/src/surface/evidence-records.ts +97 -0
  389. package/src/surface/fleet.ts +60 -0
  390. package/src/surface/geo.ts +170 -0
  391. package/src/surface/governance.ts +146 -0
  392. package/src/surface/index.ts +216 -0
  393. package/src/surface/io/index.ts +18 -0
  394. package/src/surface/io/surface-module-context-io.ts +60 -0
  395. package/src/surface/io/visibility-outcomes-io.ts +46 -0
  396. package/src/surface/module-context.ts +120 -0
  397. package/src/surface/substance.ts +161 -0
  398. package/src/surface/tests/eligibility.pbt.test.ts +137 -0
  399. package/src/surface/tests/eligibility.test.ts +302 -0
  400. package/src/surface/types.ts +289 -0
  401. package/src/surface/visibility.ts +57 -0
  402. package/src/surface/vitest.config.ts +8 -0
  403. package/tsconfig.json +17 -0
@@ -0,0 +1,229 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Single source of truth for the biome-YAML-field to --ds-* CSS custom property
5
+ projection (RFC-0071). Consumed by biome.css.generate (codegen), biome.contract.validate
6
+ (contract check), and biome.tokens.validate (drift detection). Replaces three
7
+ divergent copies of the same mapping.
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Do not validate token names against @warpgogol/werkstatt-site/tokens — that is the checks package's job.</item>
11
+ <item>Do not format CSS for emission — callers handle formatting.</item>
12
+ </non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY>
15
+ <item>Initial: consolidated BIOME_TO_TOKEN_MAP, BIOME_TO_CSS_VAR, and buildExpectedBiomeCss into one projection.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ // ---------------------------------------------------------------------------
20
+ // Primary mapping: biome dotted field path to CSS custom property name
21
+ // ---------------------------------------------------------------------------
22
+
23
+ export const BIOME_TO_TOKEN_MAP = {
24
+ // Palette — semantic color slots (RFC-0071)
25
+ "palette.brand": "--ds-color-primary",
26
+ "palette.brandHover": "--ds-color-secondary",
27
+ "palette.brandContrast": "--ds-color-text-inverse",
28
+ "palette.accent": "--ds-color-accent",
29
+ "palette.surface": "--ds-color-bg",
30
+ "palette.surfaceMuted": "--ds-color-surface",
31
+ "palette.ink": "--ds-color-text",
32
+ "palette.inkSoft": "--ds-color-text-muted",
33
+ "palette.inkMuted": "--ds-color-text-quiet",
34
+ "palette.divider": "--ds-color-border",
35
+ "palette.success": "--ds-color-success",
36
+ "palette.warning": "--ds-color-warning-strong",
37
+ "palette.danger": "--ds-color-danger",
38
+ "palette.info": "--ds-color-info",
39
+ // Components
40
+ "components.heroOverlay": "--ds-color-hero-overlay",
41
+ "components.heroText": "--ds-color-hero-text",
42
+ "components.surfaceGlass": "--ds-color-surface-glass",
43
+ "components.sectionAltBase": "--ds-color-section-alt-base",
44
+ "components.sectionAltText": "--ds-color-section-alt-text",
45
+ "components.sectionAltTextSoft": "--ds-color-section-alt-text-soft",
46
+ "components.sectionAltLink": "--ds-color-section-alt-link",
47
+ "components.sectionAltLinkVisited": "--ds-color-section-alt-link-visited",
48
+ "components.sectionAltLinkHover": "--ds-color-section-alt-link-hover",
49
+ "components.sectionAltAccent": "--ds-color-section-alt-accent",
50
+ "components.statsBg": "--ds-color-stats-bg",
51
+ "components.footerBg": "--ds-color-footer-bg",
52
+ "components.footerText": "--ds-color-footer-text",
53
+ "components.footerTextMuted": "--ds-color-footer-text-muted",
54
+ "components.cardBg": "--ds-color-card-bg",
55
+ "components.cardBorder": "--ds-color-card-border",
56
+ "components.cta": "--ds-color-cta",
57
+ "components.ctaHover": "--ds-color-cta-hover",
58
+ "components.ctaText": "--ds-color-cta-text",
59
+ "components.surfaceAlt": "--ds-color-surface-alt",
60
+ "components.textSoftOnDark": "--ds-color-text-soft-on-dark",
61
+ "components.textInverse84": "--ds-color-text-inverse-84",
62
+ "components.surfaceHover": "--ds-color-surface-hover",
63
+ "components.surfaceRaised": "--ds-color-surface-raised",
64
+ "components.accentContrast": "--ds-color-accent-contrast",
65
+ "components.accentHover": "--ds-color-accent-hover",
66
+ "components.bodyBg": "--ds-color-bg",
67
+ // Typography — full family + scale (RFC-0071 expansion)
68
+ "typography.headingFamily": "--ds-font-heading",
69
+ "typography.bodyFamily": "--ds-font-body",
70
+ "typography.monoFamily": "--ds-font-mono",
71
+ "typography.baseSize": "--ds-text-base",
72
+ "typography.lineHeightBody": "--ds-line-height-body",
73
+ "typography.lineHeightHeading": "--ds-line-height-heading",
74
+ "typography.lineHeightRelaxed": "--ds-line-height-relaxed",
75
+ "typography.measureBody": "--ds-size-container-measure-body",
76
+ "typography.measureHeading": "--ds-size-container-measure-heading",
77
+ // Spacing — base + layout (RFC-0071)
78
+ "spacing.base": "--ds-space-4",
79
+ "spacing.sectionPaddingY": "--ds-size-section-padding-y",
80
+ "spacing.containerMaxWidth": "--ds-size-container-max",
81
+ "spacing.containerNarrow": "--ds-size-container-narrow",
82
+ "spacing.gutter": "--ds-size-section-padding-x",
83
+ // Motion — duration set + easing (RFC-0071 expansion)
84
+ "motion.durationFast": "--ds-duration-fast",
85
+ "motion.durationMedium": "--ds-duration-medium",
86
+ "motion.durationSlow": "--ds-duration-slow",
87
+ "motion.easing": "--ds-ease-biome",
88
+ // Axes that surface as live tokens
89
+ "axes.cornerRadius": "--ds-radius-xs",
90
+ "axes.cornerRadiusFull": "--ds-radius-full",
91
+ "axes.borderWeight": "--ds-border-1",
92
+ // Font weights
93
+ "fontWeights.bold": "--ds-font-weight-bold",
94
+ // Geometry — diagram styling (RFC-0071)
95
+ "geometry.diagramLineWeight": "--ds-border-diagram-line",
96
+ "geometry.diagramAccentColor": "--ds-color-accent",
97
+ // RFC-0098: biome-scoped shadows (override studio defaults from tokens.css)
98
+ "shadows.sm": "--ds-shadow-sm",
99
+ "shadows.md": "--ds-shadow-md",
100
+ "shadows.lg": "--ds-shadow-lg",
101
+ "shadows.xl": "--ds-shadow-xl",
102
+ "shadows.glass": "--ds-shadow-glass",
103
+ "shadows.glow": "--ds-shadow-glow",
104
+ "shadows.header": "--ds-shadow-header",
105
+ "shadows.appeal": "--ds-shadow-appeal",
106
+ // RFC-0098: biome-scoped gradients (brand-derived; studio fallback is uncolored)
107
+ "gradients.accent": "--ds-gradient-accent",
108
+ "gradients.primary": "--ds-gradient-primary",
109
+ "gradients.vignetteDark": "--ds-gradient-vignette-dark",
110
+ } as const satisfies Record<string, string>;
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Alias entries: one biome field produces an additional CSS var beyond the primary
114
+ // ---------------------------------------------------------------------------
115
+
116
+ export interface BiomeTokenAlias {
117
+ field: string;
118
+ token: string;
119
+ }
120
+
121
+ export const BIOME_TOKEN_ALIASES: readonly BiomeTokenAlias[] = [
122
+ { field: "palette.ink", token: "--ds-color-text-primary" },
123
+ { field: "palette.inkSoft", token: "--ds-color-text-secondary" },
124
+ { field: "typography.lineHeightBody", token: "--ds-line-height-normal" },
125
+ { field: "spacing.base", token: "--ds-size-1" },
126
+ { field: "axes.cornerRadius", token: "--ds-radius-md" },
127
+ ];
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // Derived entries: computed from multiple biome fields
131
+ // ---------------------------------------------------------------------------
132
+
133
+ export interface BiomeTokenDerived {
134
+ token: string;
135
+ compute: (biome: Record<string, unknown>) => string | undefined;
136
+ }
137
+
138
+ export const BIOME_TOKEN_DERIVED: readonly BiomeTokenDerived[] = [
139
+ {
140
+ token: "--ds-text-sm",
141
+ compute: (biome) => {
142
+ const t = biome.typography as Record<string, string | number> | undefined;
143
+ if (!t?.baseSize || !t?.scaleRatio) return undefined;
144
+ const base = parseFloat(String(t.baseSize));
145
+ const ratio = parseFloat(String(t.scaleRatio));
146
+ if (isNaN(base) || isNaN(ratio)) return undefined;
147
+ return `${(base / ratio).toFixed(2)}px`;
148
+ },
149
+ },
150
+ {
151
+ token: "--ds-text-lg",
152
+ compute: (biome) => {
153
+ const t = biome.typography as Record<string, string | number> | undefined;
154
+ if (!t?.baseSize || !t?.scaleRatio) return undefined;
155
+ const base = parseFloat(String(t.baseSize));
156
+ const ratio = parseFloat(String(t.scaleRatio));
157
+ if (isNaN(base) || isNaN(ratio)) return undefined;
158
+ return `${(base * ratio).toFixed(2)}px`;
159
+ },
160
+ },
161
+ {
162
+ token: "--ds-text-xl",
163
+ compute: (biome) => {
164
+ const t = biome.typography as Record<string, string | number> | undefined;
165
+ if (!t?.baseSize || !t?.scaleRatio) return undefined;
166
+ const base = parseFloat(String(t.baseSize));
167
+ const ratio = parseFloat(String(t.scaleRatio));
168
+ if (isNaN(base) || isNaN(ratio)) return undefined;
169
+ return `${(base * ratio * ratio).toFixed(2)}px`;
170
+ },
171
+ },
172
+ ];
173
+
174
+ // ---------------------------------------------------------------------------
175
+ // Helpers
176
+ // ---------------------------------------------------------------------------
177
+
178
+ /** Get a value from a nested biome object using a dotted path like "palette.brand". */
179
+ export function getBiomeField(biome: Record<string, unknown>, field: string): unknown {
180
+ return field.split(".").reduce<unknown>((obj, key) => {
181
+ return obj && typeof obj === "object" ? (obj as Record<string, unknown>)[key] : undefined;
182
+ }, biome);
183
+ }
184
+
185
+ /**
186
+ * Project a parsed biome object into a Map of token name to value.
187
+ *
188
+ * Iterates the primary mapping, then aliases, then derived entries.
189
+ * Only includes tokens whose source field is present in the biome.
190
+ */
191
+ export function projectBiomeToTokens(biome: Record<string, unknown>): Map<string, string> {
192
+ const result = new Map<string, string>();
193
+
194
+ for (const [field, token] of Object.entries(BIOME_TO_TOKEN_MAP)) {
195
+ const value = getBiomeField(biome, field);
196
+ if (value !== undefined && value !== null) {
197
+ result.set(token, String(value));
198
+ }
199
+ }
200
+
201
+ for (const { field, token } of BIOME_TOKEN_ALIASES) {
202
+ const value = getBiomeField(biome, field);
203
+ if (value !== undefined && value !== null) {
204
+ result.set(token, String(value));
205
+ }
206
+ }
207
+
208
+ for (const { token, compute } of BIOME_TOKEN_DERIVED) {
209
+ const value = compute(biome);
210
+ if (value !== undefined) {
211
+ result.set(token, value);
212
+ }
213
+ }
214
+
215
+ return result;
216
+ }
217
+
218
+ /**
219
+ * All token names produced by the projection (primary + aliases + derived).
220
+ * Used by biome.contract.validate to check that every mapped token exists in
221
+ * the @warpgogol/werkstatt-site/tokens TOKEN_NAME_SET.
222
+ */
223
+ export function getAllProjectedTokenNames(): readonly string[] {
224
+ const names = new Set<string>();
225
+ for (const token of Object.values(BIOME_TO_TOKEN_MAP)) names.add(token);
226
+ for (const { token } of BIOME_TOKEN_ALIASES) names.add(token);
227
+ for (const { token } of BIOME_TOKEN_DERIVED) names.add(token);
228
+ return [...names];
229
+ }
@@ -0,0 +1,118 @@
1
+ id: check-concrete-blueprint
2
+ version: 1.0.0
3
+ displayName: Check · Concrete Blueprint
4
+ family: check-quality-operator
5
+ axes:
6
+ warmth: warm
7
+ contrast: high
8
+ density: airy
9
+ typographySharpness: sharp
10
+ diagramPresence: central
11
+ photoStance: founder-only
12
+ motionStance: restrained
13
+ textContrast: aa
14
+ cornerRadius: 2px
15
+ borderWeight: 1px
16
+ palette:
17
+ brand: "#C0780A"
18
+ brandHover: "#A06008"
19
+ brandContrast: "#17191D"
20
+ accent: "#C0780A"
21
+ surface: "#F4F2EE"
22
+ surfaceMuted: "#E4E2DE"
23
+ ink: "#1B1D22"
24
+ inkSoft: "#373A40"
25
+ inkMuted: "#6C747B"
26
+ divider: "#C9C9C4"
27
+ success: "#3E7456"
28
+ warning: "#D9951B"
29
+ danger: "#A13F35"
30
+ info: "#516A84"
31
+ components:
32
+ heroOverlay: linear-gradient(90deg, rgb(244 242 238 / 0.96) 0%, rgb(244 242 238
33
+ / 0.82) 45%, rgb(244 242 238 / 0) 60%, rgb(244 242 238 / 0) 100%)
34
+ heroText: "#1B1D22"
35
+ surfaceGlass: rgba(244, 242, 238, 0.96)
36
+ sectionAltBase: "#E4E2DE"
37
+ sectionAltText: "#1B1D22"
38
+ sectionAltTextSoft: "#373A40"
39
+ sectionAltLink: "#7A4D12"
40
+ sectionAltLinkHover: "#5E3909"
41
+ sectionAltLinkVisited: "#6A4E5E"
42
+ sectionAltAccent: "#C0780A"
43
+ cardBg: "#F8F7F4"
44
+ cardBorder: "#C9C9C4"
45
+ cta: "#C0780A"
46
+ ctaHover: "#C87D14"
47
+ ctaText: "#17191D"
48
+ surfaceAlt: "#EFEDE8"
49
+ textSoftOnDark: rgb(55 58 64 / 0.94)
50
+ textInverse84: rgb(27 29 34 / 0.84)
51
+ typography:
52
+ headingFamily: "'Inter', system-ui, sans-serif"
53
+ bodyFamily: "'Inter', system-ui, sans-serif"
54
+ monoFamily: "'JetBrains Mono', ui-monospace, monospace"
55
+ scaleRatio: 1.22
56
+ baseSize: 17px
57
+ lineHeightBody: 1.55
58
+ lineHeightHeading: 1.08
59
+ measureBody: 66ch
60
+ measureHeading: 26ch
61
+ numericFeatures: tnum, lnum
62
+ spacing:
63
+ base: 8px
64
+ sectionPaddingY: clamp(56px, 7vw, 104px)
65
+ containerMaxWidth: 960px
66
+ gutter: clamp(18px, 3vw, 36px)
67
+ motion:
68
+ durationFast: 120ms
69
+ durationMedium: 200ms
70
+ durationSlow: 360ms
71
+ easing: cubic-bezier(0.2, 0.0, 0.0, 1.0)
72
+ reduceMotionRespect: true
73
+ geometry:
74
+ diagramLineWeight: 1px
75
+ diagramAccentColor: "#C0780A"
76
+ decorativeAllowed: false
77
+ shadows:
78
+ sm: 0 1px 3px rgb(27 29 34 / 0.08)
79
+ md: 0 10px 24px rgb(27 29 34 / 0.12)
80
+ lg: 0 18px 44px rgb(27 29 34 / 0.16)
81
+ xl: 0 34px 72px rgb(27 29 34 / 0.24)
82
+ glass: 0 14px 34px rgb(27 29 34 / 0.14)
83
+ glow: 0 0 30px rgb(227 154 36 / 0.26)
84
+ header: 0 8px 28px rgb(27 29 34 / 0.12)
85
+ appeal: 0 18px 42px rgb(27 29 34 / 0.16)
86
+ gradients:
87
+ accent: "linear-gradient(135deg, #D89018 0%, #B07008 100%)"
88
+ primary: "linear-gradient(135deg, #C0780A 0%, #A06008 100%)"
89
+ vignetteDark: radial-gradient(circle at center, transparent 0%, rgb(27 29 34 / 0.34) 100%)
90
+ siteBackground:
91
+ layers:
92
+ - kind: color
93
+ color: var(--ds-color-bg)
94
+ - kind: gradient
95
+ direction: radial
96
+ stops:
97
+ - at: 0
98
+ color: var(--ds-color-bg)
99
+ opacity: 0
100
+ - at: 1
101
+ color: rgb(27 29 34 / 0.18)
102
+ opacity: 1
103
+ fonts:
104
+ - family: Inter
105
+ package: "@fontsource/inter"
106
+ weights: [400, 500, 600]
107
+ constraints:
108
+ forbidStockPhotoTags:
109
+ - hard-hats
110
+ - generic-handshake
111
+ - high-five
112
+ forbidPhrases:
113
+ - günstig
114
+ - von 1 €/Tag
115
+ - Ergebnis garantiert
116
+ enforceTabularNumeralsIn:
117
+ - price
118
+ - stats
@@ -0,0 +1,135 @@
1
+ id: handwerk-material-warm
2
+ version: 1.0.0
3
+ displayName: Handwerk · Concrete Blueprint
4
+ family: handwerk-trust-engineering
5
+ provenance:
6
+ client: warpgogol-handwerk
7
+ selectedConcept: concept-2
8
+ selectedDirection: 2
9
+ sourceFiles:
10
+ - 19-visual-dna.md
11
+ - 21-directions.md
12
+ - 24-concepts-concept-2.visual.json
13
+ - 26-localized-concept.webp
14
+ - 28-tone-of-voice.md
15
+ axes:
16
+ warmth: warm
17
+ contrast: high
18
+ density: airy
19
+ typographySharpness: sharp
20
+ diagramPresence: central
21
+ photoStance: founder-only
22
+ motionStance: restrained
23
+ textContrast: aa
24
+ cornerRadius: 2px
25
+ borderWeight: 1px
26
+ palette:
27
+ brand: "#8B5406"
28
+ brandHover: "#6B4205"
29
+ brandContrast: "#FFFFFF"
30
+ accent: "#8B5406"
31
+ surface: "#F4F2EE"
32
+ surfaceMuted: "#E4E2DE"
33
+ ink: "#1B1D22"
34
+ inkSoft: "#373A40"
35
+ inkMuted: "#5C646B"
36
+ divider: "#C9C9C4"
37
+ success: "#3E7456"
38
+ warning: "#D9951B"
39
+ danger: "#A13F35"
40
+ info: "#516A84"
41
+ components:
42
+ heroOverlay: linear-gradient(90deg, rgb(244 242 238 / 0.96) 0%, rgb(244 242 238
43
+ / 0.82) 45%, rgb(244 242 238 / 0) 60%, rgb(244 242 238 / 0) 100%)
44
+ heroText: "#1B1D22"
45
+ surfaceGlass: rgba(244, 242, 238, 0.96)
46
+ sectionAltBase: "#E4E2DE"
47
+ sectionAltText: "#1B1D22"
48
+ sectionAltTextSoft: "#373A40"
49
+ sectionAltLink: "#7A4D12"
50
+ sectionAltLinkHover: "#5E3909"
51
+ sectionAltLinkVisited: "#6A4E5E"
52
+ sectionAltAccent: "#8B5406"
53
+ cardBg: "#F8F7F4"
54
+ cardBorder: "#C9C9C4"
55
+ cta: "#8B5406"
56
+ ctaHover: "#9D6208"
57
+ ctaText: "#FFFFFF"
58
+ surfaceAlt: "#EFEDE8"
59
+ textSoftOnDark: rgb(55 58 64 / 0.94)
60
+ textInverse84: rgb(27 29 34 / 0.84)
61
+ typography:
62
+ headingFamily: "'Playfair Display', Georgia, serif"
63
+ bodyFamily: "'Inter', system-ui, sans-serif"
64
+ monoFamily: "'DM Mono', ui-monospace, monospace"
65
+ scaleRatio: 1.22
66
+ baseSize: 17px
67
+ lineHeightBody: 1.55
68
+ lineHeightHeading: 1.08
69
+ measureBody: 66ch
70
+ measureHeading: 26ch
71
+ numericFeatures: tnum, lnum
72
+ spacing:
73
+ base: 8px
74
+ sectionPaddingY: clamp(56px, 7vw, 104px)
75
+ containerMaxWidth: 960px
76
+ gutter: clamp(18px, 3vw, 36px)
77
+ motion:
78
+ durationFast: 120ms
79
+ durationMedium: 200ms
80
+ durationSlow: 360ms
81
+ easing: cubic-bezier(0.2, 0.0, 0.0, 1.0)
82
+ reduceMotionRespect: true
83
+ geometry:
84
+ diagramLineWeight: 1px
85
+ diagramAccentColor: "#8B5406"
86
+ decorativeAllowed: false
87
+ shadows:
88
+ sm: 0 1px 3px rgb(27 29 34 / 0.08)
89
+ md: 0 10px 24px rgb(27 29 34 / 0.12)
90
+ lg: 0 18px 44px rgb(27 29 34 / 0.16)
91
+ xl: 0 34px 72px rgb(27 29 34 / 0.24)
92
+ glass: 0 14px 34px rgb(27 29 34 / 0.14)
93
+ glow: 0 0 30px rgb(227 154 36 / 0.26)
94
+ header: 0 8px 28px rgb(27 29 34 / 0.12)
95
+ appeal: 0 18px 42px rgb(27 29 34 / 0.16)
96
+ gradients:
97
+ accent: "linear-gradient(135deg, #A0620E 0%, #6B4205 100%)"
98
+ primary: "linear-gradient(135deg, #8B5406 0%, #6B4205 100%)"
99
+ vignetteDark: radial-gradient(circle at center, transparent 0%, rgb(27 29 34 / 0.34) 100%)
100
+ siteBackground:
101
+ layers:
102
+ - kind: color
103
+ color: var(--ds-color-bg)
104
+ - kind: gradient
105
+ direction: radial
106
+ stops:
107
+ - at: 0
108
+ color: var(--ds-color-bg)
109
+ opacity: 0
110
+ - at: 1
111
+ color: rgb(27 29 34 / 0.18)
112
+ opacity: 1
113
+ fonts:
114
+ - family: Inter
115
+ package: "@fontsource/inter"
116
+ weights: [400, 500, 600]
117
+ - family: Playfair Display
118
+ package: "@fontsource/playfair-display"
119
+ weights: [400, 700]
120
+ italicWeights: [400]
121
+ - family: DM Mono
122
+ package: "@fontsource/dm-mono"
123
+ weights: [300, 400, 500]
124
+ constraints:
125
+ forbidStockPhotoTags:
126
+ - hard-hats
127
+ - generic-handshake
128
+ - high-five
129
+ forbidPhrases:
130
+ - günstig
131
+ - von 1 €/Tag
132
+ - Ergebnis garantiert
133
+ enforceTabularNumeralsIn:
134
+ - price
135
+ - stats
@@ -0,0 +1,123 @@
1
+ id: nonprofit-trust
2
+ version: 1.0.0
3
+ displayName: Nonprofit Trust
4
+ family: charity-donation-trust
5
+ axes:
6
+ warmth: warm
7
+ contrast: medium
8
+ density: comfortable
9
+ typographySharpness: soft
10
+ diagramPresence: supportive
11
+ photoStance: documentary
12
+ motionStance: restrained
13
+ textContrast: aa
14
+ cornerRadius: 6px
15
+ borderWeight: 1px
16
+ palette:
17
+ brand: "#2D5016"
18
+ brandHover: "#244112"
19
+ brandContrast: "#FFFFFF"
20
+ accent: "#3D7A1A"
21
+ surface: "#F5F0E8"
22
+ surfaceMuted: "#ECE4D8"
23
+ ink: "#2C2C2C"
24
+ inkSoft: "#4A463F"
25
+ inkMuted: "#5A5A52"
26
+ divider: "#D9CFBF"
27
+ success: "#38A169"
28
+ warning: "#D97706"
29
+ danger: "#E53E3E"
30
+ info: "#2B6CB0"
31
+ components:
32
+ heroOverlay: rgba(45, 80, 22, 0.6)
33
+ heroText: "#f7fafc"
34
+ surfaceGlass: rgba(245, 240, 232, 0.72)
35
+ sectionAltBase: "#2d5016"
36
+ sectionAltText: "#f5f0e8"
37
+ sectionAltTextSoft: "#d4e4c8"
38
+ sectionAltLink: "#fbb6ce"
39
+ sectionAltLinkVisited: "#ed64a6"
40
+ sectionAltLinkHover: "#ffffff"
41
+ sectionAltAccent: "#4a8c2a"
42
+ statsBg: "#3a6b1e"
43
+ footerBg: "#3a3a2a"
44
+ footerText: "#e8e4dc"
45
+ footerTextMuted: "#a8a498"
46
+ cardBg: "#ffffff"
47
+ cardBorder: rgba(45, 80, 22, 0.1)
48
+ cta: var(--ds-color-primary)
49
+ ctaHover: color-mix(in srgb, var(--ds-color-primary), black 30%)
50
+ ctaText: "#ffffff"
51
+ surfaceAlt: "#f0ebe3"
52
+ textSoftOnDark: "rgba(247, 250, 252, 0.84)"
53
+ textInverse84: "rgba(247, 250, 252, 0.84)"
54
+ typography:
55
+ headingFamily: "'Lora', Georgia, serif"
56
+ bodyFamily: "'Inter', system-ui, sans-serif"
57
+ monoFamily: "'JetBrains Mono', 'Courier New', monospace"
58
+ scaleRatio: 1.2
59
+ baseSize: 17px
60
+ lineHeightBody: 1.6
61
+ lineHeightHeading: 1.15
62
+ measureBody: 68ch
63
+ measureHeading: 24ch
64
+ numericFeatures: tnum, lnum
65
+ spacing:
66
+ base: 8px
67
+ sectionPaddingY: clamp(32px, 7vw, 64px)
68
+ containerMaxWidth: 1180px
69
+ containerNarrow: 720px
70
+ gutter: clamp(16px, 2vw, 32px)
71
+ motion:
72
+ durationFast: 150ms
73
+ durationMedium: 240ms
74
+ durationSlow: 360ms
75
+ easing: cubic-bezier(0.16, 1, 0.3, 1)
76
+ reduceMotionRespect: true
77
+ geometry:
78
+ diagramLineWeight: 1px
79
+ diagramAccentColor: "#3D7A1A"
80
+ decorativeAllowed: false
81
+ shadows:
82
+ sm: 0 2px 8px rgb(26 32 44 / 0.08)
83
+ md: 0 4px 20px rgb(26 32 44 / 0.12)
84
+ lg: 0 8px 40px rgb(26 32 44 / 0.16)
85
+ xl: 0 24px 60px rgb(0 0 0 / 0.35)
86
+ glass: 0 4px 12px rgb(0 0 0 / 0.06)
87
+ glow: 0 0 28px rgb(28 69 50 / 0.12)
88
+ header: 0 6px 24px rgb(0 0 0 / 0.25)
89
+ appeal: 0 18px 40px rgb(15 23 42 / 0.08)
90
+ gradients:
91
+ accent: linear-gradient(135deg, rgb(181 76 31) 0%, rgb(212 101 46) 100%)
92
+ primary: linear-gradient(135deg, rgb(26 67 50) 0%, rgb(45 90 69) 100%)
93
+ vignetteDark: radial-gradient(circle at center, transparent 0%, rgb(0 0 0 / 0.45) 100%)
94
+ siteBackground:
95
+ layers:
96
+ - kind: color
97
+ color: var(--ds-color-bg)
98
+ - kind: gradient
99
+ direction: vertical
100
+ stops:
101
+ - at: 0
102
+ color: var(--ds-color-surface)
103
+ opacity: 1
104
+ - at: 1
105
+ color: var(--ds-color-bg)
106
+ opacity: 1
107
+ fonts:
108
+ - family: Inter
109
+ package: "@fontsource/inter"
110
+ weights: [400, 500, 600]
111
+ - family: Lora
112
+ package: "@fontsource/lora"
113
+ weights: [400, 500, 600, 700]
114
+ constraints:
115
+ forbidStockPhotoTags:
116
+ - crying-child-cliche
117
+ - generic-volunteer-circle
118
+ forbidPhrases:
119
+ - 100% guaranteed impact
120
+ - donate now or it is too late
121
+ enforceTabularNumeralsIn:
122
+ - stats
123
+ - donation
@@ -0,0 +1,39 @@
1
+ # Blueprint: offer (RFC-0239)
2
+ # The owning business's own services at /leistungen/ (de) and /uk/posluhy/ (uk).
3
+ # Mode-polymorphic: Bodenstation = Service/studio; Sternsystem = LocalBusiness/client.
4
+ # Gated by the offer entitlement (RFC-0240).
5
+ id: offer
6
+ entitlement: offer
7
+
8
+ dataset:
9
+ collection: offers
10
+ status: active
11
+
12
+ axes:
13
+ - id: offer
14
+ universe: { collection: offers, field: slug }
15
+ match: { recordField: slug }
16
+
17
+ levels:
18
+ - depth: 0
19
+ slug: { de: leistungen/uebersicht, uk: posluhy/oglyad }
20
+ redirectToPageId: services
21
+ constellation: offer-root
22
+ geo: full
23
+ titleTemplate: { de: Leistungen, uk: Послуги }
24
+ - depth: 1
25
+ slug: { de: "leistungen/{offer}", uk: "posluhy/{offer}" }
26
+ constellation: offer-detail
27
+ geo: full
28
+ titleTemplate: { de: "{offer.name}", uk: "{offer.name}" }
29
+
30
+ policy:
31
+ minRecordsPerDepth: { 0: 0, 1: 1 }
32
+ redirectPolicy: nearest-ancestor
33
+ trailingSlash: true
34
+ substanceMin: 24
35
+ maxThinShare: 0.6
36
+
37
+ linking:
38
+ children: { limit: 12 }
39
+ siblings: { limit: 8 }
@@ -0,0 +1,13 @@
1
+ # Prompt: local-market-signal (RFC-0197)
2
+
3
+ Reviewed prompt template for the `localMarket` enriched field on the `website-local` Blueprint. Generates one short, location- and industry-specific paragraph of real local-market observation (an "Industry Intelligence / Local Market Signal" block) that raises page substance.
4
+
5
+ ## System
6
+
7
+ Du schreibst eine kurze, sachliche lokale Marktbeobachtung (2–3 Sätze, max. 160 Tokens) für eine Website-Landingpage. Keine Werbefloskeln, keine erfundenen Zahlen. Beziehe dich konkret auf die Branche und die Stadt. Deutsch.
8
+
9
+ ## User template
10
+
11
+ Branche: {industry.name} Stadt: {city.name} Lokaler Kontext: {city.localNote}
12
+
13
+ Schreibe eine lokale Marktbeobachtung für {industry.name}-Betriebe in {city.name}.
@@ -0,0 +1,24 @@
1
+ # Prompt: website-local-narrative (RFC-0207)
2
+
3
+ Reviewed prompt template for the `narrative` enriched field on the `website-local` Blueprint. Generates one bespoke, grammatically complete page narrative per (industry × city) tuple — the page H1, hero lead, hero tagline, and one short connective "bridge" section. The output replaces the template-glued title and removes the hero/intro duplication. Transcreated natively per language (the system prompt language is the target language — never a word-for-word translation of German).
4
+
5
+ The output is frozen, stored with provenance + `approved: false`, and renders only after human review. The deterministic build never calls this prompt.
6
+
7
+ ## Output shape
8
+
9
+ Frontmatter fields on the enriched entry: `h1`, `lead`, `tagline`, and `bridges` (a list of `{ heading, body }`). `h1` and `lead` are required; the baker drops an entry missing either.
10
+
11
+ ## System
12
+
13
+ Du bist eine erfahrene Marketing-Texterin für lokale Handwerks- und Dienstleistungsbetriebe. Schreibe in der Zielsprache der Seite, grammatikalisch einwandfrei, konkret und ohne Werbefloskeln. Keine erfundenen Zahlen, keine Superlative ohne Beleg. Beziehe dich konkret auf die Branche und die Stadt. Liefere:
14
+
15
+ - `h1`: eine vollständige, starke Überschrift (kein zusammengesetztes Schlagwort),
16
+ - `lead`: einen Absatz (2–3 Sätze) als Hero-Lead,
17
+ - `tagline`: einen kurzen, eigenständigen Claim (nicht identisch mit dem Lead),
18
+ - `bridges`: einen verbindenden Abschnitt `{ heading, body }`, der Branche und Stadt verknüpft.
19
+
20
+ ## User template
21
+
22
+ Branche: {industry.name} Stadt: {city.name} Branchen-Kontext: {industry.heroIntro} Lokaler Kontext: {city.localNote} Zielsprache: {lang}
23
+
24
+ Schreibe das Seiten-Narrativ für {industry.name} in {city.name} in der Zielsprache {lang}.