businesslens 0.7.1 → 0.8.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 (242) hide show
  1. package/CHANGELOG.md +307 -5
  2. package/README.md +62 -24
  3. package/dist/businesslensThemeLabVariants.d.ts +1 -22
  4. package/dist/businesslensThemeLabVariants.js +1 -63
  5. package/dist/cli.js +1320 -564
  6. package/dist/portable-CftE4zWs.js +1170 -0
  7. package/dist/{portable-D-39sG6M.d.ts → portable-D2Rj2CNS.d.ts} +608 -140
  8. package/dist/{report-digest-B5HEnjj6.js → report-digest--J16_c08.js} +1 -1
  9. package/dist/report-digest.d.ts +1 -1
  10. package/dist/report-digest.js +2 -2
  11. package/dist/report.d.ts +8 -2
  12. package/dist/report.js +2 -2
  13. package/dist/viewer/200.html +1 -1
  14. package/dist/viewer/404.html +1 -1
  15. package/dist/viewer/_nuxt/45uNmsQO.js +37 -0
  16. package/dist/viewer/_nuxt/B62M9XwM.js +34 -0
  17. package/dist/viewer/_nuxt/{CXkZ3uUu.js → BCK3bAyi.js} +1 -1
  18. package/dist/viewer/_nuxt/{0agZip0Q.js → CWdMyG9_.js} +1 -1
  19. package/dist/viewer/_nuxt/builds/latest.json +1 -1
  20. package/dist/viewer/_nuxt/builds/meta/64c42d86-c8d2-45a2-b130-53ab6b26c14b.json +1 -0
  21. package/dist/viewer/_nuxt/entry.CLPavHBc.css +1 -0
  22. package/dist/viewer/_nuxt/index.DsK0G5y5.css +1 -0
  23. package/dist/viewer/brand/icons/favicon-32.png +0 -0
  24. package/dist/viewer/brand/icons/favicon.ico +0 -0
  25. package/dist/viewer/brand/icons/favicon.svg +3 -3
  26. package/dist/viewer/favicon.ico +0 -0
  27. package/dist/viewer/index.html +1 -1
  28. package/dist/viewer/site.webmanifest +4 -4
  29. package/docs/actors.md +22 -2
  30. package/docs/business-rules.md +46 -15
  31. package/docs/capabilities.md +205 -24
  32. package/docs/ci.md +6 -4
  33. package/docs/cli-contribute.md +11 -7
  34. package/docs/cli-export.md +7 -2
  35. package/docs/cli-install.md +1 -1
  36. package/docs/cli-lint.md +19 -6
  37. package/docs/cli-open.md +8 -6
  38. package/docs/cli-pull.md +1 -1
  39. package/docs/cli-update.md +1 -1
  40. package/docs/cli-view.md +1 -1
  41. package/docs/cli.md +2 -2
  42. package/docs/domains.md +53 -17
  43. package/docs/experiences.md +29 -14
  44. package/docs/from-a-blueprint.md +11 -7
  45. package/docs/from-an-idea.md +5 -3
  46. package/docs/from-your-repo.md +9 -4
  47. package/docs/index.md +6 -5
  48. package/docs/integration.md +2 -2
  49. package/docs/interfaces.md +42 -6
  50. package/docs/journeys.md +279 -43
  51. package/docs/product-model.md +146 -39
  52. package/docs/product.md +11 -4
  53. package/docs/references.md +88 -11
  54. package/docs/screens.md +49 -30
  55. package/docs/skill-businesslens-ideate.md +8 -4
  56. package/docs/skill-businesslens-map.md +11 -4
  57. package/docs/skill-businesslens-verify.md +7 -7
  58. package/docs/skills.md +1 -1
  59. package/docs/with-plan-mode.md +1 -1
  60. package/docs/with-sdd.md +7 -5
  61. package/layers/nuxt/report-viewer/README.md +63 -44
  62. package/layers/nuxt/report-viewer/app/assets/report-structure.css +3 -1
  63. package/layers/nuxt/report-viewer/app/assets/report-viewer.css +56 -0
  64. package/layers/nuxt/report-viewer/app/components/BlrActorType.vue +74 -0
  65. package/layers/nuxt/report-viewer/app/components/BlrConnections.vue +304 -0
  66. package/layers/nuxt/report-viewer/app/components/BlrContextPlace.vue +80 -0
  67. package/layers/nuxt/report-viewer/app/components/BlrContexts.vue +58 -0
  68. package/layers/nuxt/report-viewer/app/components/BlrEntityBody.vue +725 -0
  69. package/layers/nuxt/report-viewer/app/components/BlrEntityCard.vue +166 -0
  70. package/layers/nuxt/report-viewer/app/components/BlrEntityPage.vue +141 -0
  71. package/layers/nuxt/report-viewer/app/components/BlrFlowCanvas.vue +312 -0
  72. package/layers/nuxt/report-viewer/app/components/BlrFlowGroup.vue +126 -0
  73. package/layers/nuxt/report-viewer/app/components/BlrFlowLabel.vue +47 -0
  74. package/layers/nuxt/report-viewer/app/components/BlrFlowNode.vue +217 -0
  75. package/layers/nuxt/report-viewer/app/components/BlrInterfaceType.vue +100 -0
  76. package/layers/nuxt/report-viewer/app/components/BlrKind.vue +78 -0
  77. package/layers/nuxt/report-viewer/app/components/BlrLinks.vue +56 -0
  78. package/layers/nuxt/report-viewer/app/components/BlrOverview.vue +359 -0
  79. package/layers/nuxt/report-viewer/app/components/BlrPageBlock.vue +93 -0
  80. package/layers/nuxt/report-viewer/app/components/BlrProductTopology.vue +367 -0
  81. package/layers/nuxt/report-viewer/app/components/BlrProse.vue +64 -0
  82. package/layers/nuxt/report-viewer/app/components/BlrRail.vue +131 -0
  83. package/layers/nuxt/report-viewer/app/components/BlrRefs.vue +150 -0
  84. package/layers/nuxt/report-viewer/app/components/BlrReportShell.vue +1363 -0
  85. package/layers/nuxt/report-viewer/app/components/BlrScenarios.vue +183 -0
  86. package/layers/nuxt/report-viewer/app/components/BlrSearchPalette.vue +72 -0
  87. package/layers/nuxt/report-viewer/app/components/BlrStepContext.vue +24 -0
  88. package/layers/nuxt/report-viewer/app/components/BusinessLensReportViewer.vue +48 -253
  89. package/layers/nuxt/report-viewer/app/utils/entityCards.ts +257 -0
  90. package/layers/nuxt/report-viewer/app/utils/entityDocs.ts +32 -0
  91. package/layers/nuxt/report-viewer/app/utils/entityFacets.ts +215 -0
  92. package/layers/nuxt/report-viewer/app/utils/entityFacts.ts +129 -0
  93. package/layers/nuxt/report-viewer/app/utils/flowGraph.ts +783 -0
  94. package/layers/nuxt/report-viewer/app/utils/pageSections.ts +98 -0
  95. package/layers/nuxt/report-viewer/app/utils/productTopologyFilters.ts +92 -0
  96. package/layers/nuxt/report-viewer/app/utils/productTopologyGraphs.ts +530 -0
  97. package/layers/nuxt/report-viewer/app/utils/productTopologyLayout.ts +124 -0
  98. package/layers/nuxt/report-viewer/app/utils/productTopologyViews.ts +149 -0
  99. package/layers/nuxt/report-viewer/app/utils/reportMarkdown.ts +139 -0
  100. package/layers/nuxt/report-viewer/app/utils/reportPalette.ts +79 -0
  101. package/layers/nuxt/report-viewer/app/utils/reportWorkspace.ts +1328 -0
  102. package/layers/nuxt/report-viewer/app/utils/scenarioRouteWindow.ts +55 -0
  103. package/layers/nuxt/report-viewer/nuxt.config.ts +73 -2
  104. package/layers/nuxt/theme/README.md +43 -0
  105. package/layers/nuxt/theme/app/assets/theme.css +60 -2
  106. package/layers/nuxt/theme/app/components/BusinessLensBrand.vue +62 -0
  107. package/layers/nuxt/theme/app/composables/useBusinessLensThemeHead.ts +16 -0
  108. package/layers/nuxt/theme/public/brand/icons/favicon-32.png +0 -0
  109. package/layers/nuxt/theme/public/brand/icons/favicon.ico +0 -0
  110. package/layers/nuxt/theme/public/brand/icons/favicon.svg +7 -0
  111. package/layers/nuxt/theme/public/favicon.ico +0 -0
  112. package/layers/nuxt/{theme-lab/public/brand/icons/marks/m4 → theme/public}/site.webmanifest +4 -4
  113. package/layers/nuxt/theme-lab/app/assets/theme-lab.css +20 -15
  114. package/layers/nuxt/theme-lab/app/components/BusinessLensThemeLabBar.vue +3 -4
  115. package/layers/nuxt/theme-lab/app/composables/useBusinessLensThemeLabHead.ts +1 -10
  116. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabVariants.ts +0 -63
  117. package/layers/nuxt/theme-lab/nuxt.config.ts +1 -4
  118. package/package.json +23 -7
  119. package/skills/businesslens-ideate/SKILL.md +15 -9
  120. package/skills/businesslens-ideate/references/format.md +218 -60
  121. package/skills/businesslens-ideate/references/planning-rubric.md +28 -15
  122. package/skills/businesslens-map/SKILL.md +15 -6
  123. package/skills/businesslens-map/references/format.md +218 -60
  124. package/skills/businesslens-map/references/mapping-rubric.md +30 -12
  125. package/skills/businesslens-verify/SKILL.md +12 -6
  126. package/skills/businesslens-verify/references/build-handoff.md +5 -3
  127. package/skills/businesslens-verify/references/format.md +218 -60
  128. package/skills/businesslens-verify/references/verification-rubric.md +12 -8
  129. package/dist/portable-BG1UM2eJ.js +0 -576
  130. package/dist/report-view-model.d.ts +0 -98
  131. package/dist/report-view-model.js +0 -80
  132. package/dist/viewer/_nuxt/C2YqwjgQ.js +0 -1
  133. package/dist/viewer/_nuxt/DBtS0ETw.js +0 -37
  134. package/dist/viewer/_nuxt/builds/meta/2f5bf534-4590-4c46-b28f-8b0c1caa52df.json +0 -1
  135. package/dist/viewer/_nuxt/entry.DU06319b.css +0 -1
  136. package/dist/viewer/brand/icons/marks/m10/favicon-32.png +0 -0
  137. package/dist/viewer/brand/icons/marks/m10/favicon.ico +0 -0
  138. package/dist/viewer/brand/icons/marks/m10/favicon.svg +0 -7
  139. package/dist/viewer/brand/icons/marks/m10/site.webmanifest +0 -32
  140. package/dist/viewer/brand/icons/marks/m4/apple-touch-icon.png +0 -0
  141. package/dist/viewer/brand/icons/marks/m4/favicon-32.png +0 -0
  142. package/dist/viewer/brand/icons/marks/m4/favicon.ico +0 -0
  143. package/dist/viewer/brand/icons/marks/m4/favicon.svg +0 -14
  144. package/dist/viewer/brand/icons/marks/m4/icon-192.png +0 -0
  145. package/dist/viewer/brand/icons/marks/m4/icon-512.png +0 -0
  146. package/dist/viewer/brand/icons/marks/m4/maskable-icon-512.png +0 -0
  147. package/dist/viewer/brand/icons/marks/m4/site.webmanifest +0 -32
  148. package/dist/viewer/brand/icons/marks/m7/apple-touch-icon.png +0 -0
  149. package/dist/viewer/brand/icons/marks/m7/favicon-32.png +0 -0
  150. package/dist/viewer/brand/icons/marks/m7/favicon.ico +0 -0
  151. package/dist/viewer/brand/icons/marks/m7/favicon.svg +0 -9
  152. package/dist/viewer/brand/icons/marks/m7/icon-192.png +0 -0
  153. package/dist/viewer/brand/icons/marks/m7/icon-512.png +0 -0
  154. package/dist/viewer/brand/icons/marks/m7/maskable-icon-512.png +0 -0
  155. package/dist/viewer/brand/icons/marks/m7/site.webmanifest +0 -32
  156. package/dist/viewer/brand/icons/marks/m8/apple-touch-icon.png +0 -0
  157. package/dist/viewer/brand/icons/marks/m8/favicon-32.png +0 -0
  158. package/dist/viewer/brand/icons/marks/m8/favicon.ico +0 -0
  159. package/dist/viewer/brand/icons/marks/m8/favicon.svg +0 -8
  160. package/dist/viewer/brand/icons/marks/m8/icon-192.png +0 -0
  161. package/dist/viewer/brand/icons/marks/m8/icon-512.png +0 -0
  162. package/dist/viewer/brand/icons/marks/m8/maskable-icon-512.png +0 -0
  163. package/dist/viewer/brand/icons/marks/m8/site.webmanifest +0 -32
  164. package/dist/viewer/brand/logo/variants/mark-4-dark.svg +0 -11
  165. package/dist/viewer/brand/logo/variants/mark-4.svg +0 -11
  166. package/dist/viewer/brand/logo/variants/mark-7-dark.svg +0 -6
  167. package/dist/viewer/brand/logo/variants/mark-7.svg +0 -6
  168. package/dist/viewer/brand/logo/variants/mark-8-dark.svg +0 -5
  169. package/dist/viewer/brand/logo/variants/mark-8.svg +0 -5
  170. package/dist/viewer/brand/logo/variants/wordmark-11-dark.svg +0 -173
  171. package/dist/viewer/brand/logo/variants/wordmark-11.svg +0 -173
  172. package/docs/scenarios.md +0 -86
  173. package/layers/nuxt/report-viewer/app/utils/report-view-model.ts +0 -12
  174. package/layers/nuxt/theme-lab/app/components/BusinessLensBrand.vue +0 -84
  175. package/layers/nuxt/theme-lab/app/components/BusinessLensThemeLabLogoRow.vue +0 -119
  176. package/layers/nuxt/theme-lab/app/composables/useBusinessLensLogoVariant.ts +0 -78
  177. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabMarks.d.mts +0 -11
  178. package/layers/nuxt/theme-lab/app/utils/businesslensThemeLabMarks.mjs +0 -29
  179. package/layers/nuxt/theme-lab/public/brand/icons/apple-touch-icon.png +0 -0
  180. package/layers/nuxt/theme-lab/public/brand/icons/favicon-32.png +0 -0
  181. package/layers/nuxt/theme-lab/public/brand/icons/favicon.ico +0 -0
  182. package/layers/nuxt/theme-lab/public/brand/icons/favicon.svg +0 -7
  183. package/layers/nuxt/theme-lab/public/brand/icons/icon-192.png +0 -0
  184. package/layers/nuxt/theme-lab/public/brand/icons/icon-512.png +0 -0
  185. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/apple-touch-icon.png +0 -0
  186. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon-32.png +0 -0
  187. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon.ico +0 -0
  188. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/favicon.svg +0 -7
  189. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/icon-192.png +0 -0
  190. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/icon-512.png +0 -0
  191. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/maskable-icon-512.png +0 -0
  192. package/layers/nuxt/theme-lab/public/brand/icons/marks/m10/site.webmanifest +0 -32
  193. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/apple-touch-icon.png +0 -0
  194. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon-32.png +0 -0
  195. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon.ico +0 -0
  196. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/favicon.svg +0 -14
  197. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/icon-192.png +0 -0
  198. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/icon-512.png +0 -0
  199. package/layers/nuxt/theme-lab/public/brand/icons/marks/m4/maskable-icon-512.png +0 -0
  200. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/apple-touch-icon.png +0 -0
  201. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon-32.png +0 -0
  202. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon.ico +0 -0
  203. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/favicon.svg +0 -9
  204. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/icon-192.png +0 -0
  205. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/icon-512.png +0 -0
  206. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/maskable-icon-512.png +0 -0
  207. package/layers/nuxt/theme-lab/public/brand/icons/marks/m7/site.webmanifest +0 -32
  208. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/apple-touch-icon.png +0 -0
  209. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon-32.png +0 -0
  210. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon.ico +0 -0
  211. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/favicon.svg +0 -8
  212. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/icon-192.png +0 -0
  213. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/icon-512.png +0 -0
  214. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/maskable-icon-512.png +0 -0
  215. package/layers/nuxt/theme-lab/public/brand/icons/marks/m8/site.webmanifest +0 -32
  216. package/layers/nuxt/theme-lab/public/brand/icons/maskable-icon-512.png +0 -0
  217. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-4-dark.svg +0 -11
  218. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-4.svg +0 -11
  219. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-7-dark.svg +0 -6
  220. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-7.svg +0 -6
  221. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-8-dark.svg +0 -5
  222. package/layers/nuxt/theme-lab/public/brand/logo/variants/mark-8.svg +0 -5
  223. package/layers/nuxt/theme-lab/public/brand/logo/variants/wordmark-11-dark.svg +0 -173
  224. package/layers/nuxt/theme-lab/public/brand/logo/variants/wordmark-11.svg +0 -173
  225. package/layers/nuxt/theme-lab/public/favicon.ico +0 -0
  226. package/layers/nuxt/theme-lab/public/site.webmanifest +0 -32
  227. package/plans/shared-theme-lab.md +0 -136
  228. /package/dist/viewer/brand/logo/{variants/mark-10-dark.svg → mark-dark.svg} +0 -0
  229. /package/dist/viewer/brand/logo/{variants/mark-10.svg → mark.svg} +0 -0
  230. /package/dist/viewer/brand/logo/{variants/wordmark-3-dark.svg → wordmark-dark.svg} +0 -0
  231. /package/dist/viewer/brand/logo/{variants/wordmark-3.svg → wordmark.svg} +0 -0
  232. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/apple-touch-icon.png +0 -0
  233. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/businesslens-app-icon.svg +0 -0
  234. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/businesslens-maskable-icon.svg +0 -0
  235. /package/layers/nuxt/{theme-lab → theme}/public/brand/icons/icon-1024.png +0 -0
  236. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/icon-192.png +0 -0
  237. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/icon-512.png +0 -0
  238. /package/{dist/viewer/brand/icons/marks/m10 → layers/nuxt/theme/public/brand/icons}/maskable-icon-512.png +0 -0
  239. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/mark-10-dark.svg → theme/public/brand/logo/mark-dark.svg} +0 -0
  240. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/mark-10.svg → theme/public/brand/logo/mark.svg} +0 -0
  241. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/wordmark-3-dark.svg → theme/public/brand/logo/wordmark-dark.svg} +0 -0
  242. /package/layers/nuxt/{theme-lab/public/brand/logo/variants/wordmark-3.svg → theme/public/brand/logo/wordmark.svg} +0 -0
package/CHANGELOG.md CHANGED
@@ -7,6 +7,308 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.8.0] - 2026-08-25
11
+
12
+ ### Added
13
+
14
+ - **Co-located assets.** Files beside `<type>.md` are product assets owned by
15
+ the entity; anything under the reserved `implementation/` directory
16
+ describes this realization and stays home. Class comes from the path, which is
17
+ the only rule a tool writing a capture on CI can satisfy. An optional
18
+ `assets:` list titles and scopes those files without ever setting their class,
19
+ and unlisted files stay legal.
20
+ - An optional `state:` on a reference or asset, valid only on a Screen and
21
+ validated against its `## Product states`, so several captures of one view are
22
+ placed beside the state each depicts instead of arriving as a flat list.
23
+ - A `prd` Reference kind for attaching a product requirements document as
24
+ `intent` or `context` without making that external document the Product Model
25
+ authority.
26
+ - An optional ordered `screens:` list on an Interface or Experience declaring
27
+ reading order over its own children. Reachability stays with the tree.
28
+ - `businesslens view` serves repository files from a read-only, extension-
29
+ allowlisted mount, and the report viewer renders local `visual` references and
30
+ co-located assets as thumbnails instead of inert text.
31
+ - **Every entity has a page**, at its own URL, with the authored body at full
32
+ width — steps, inline routes, decision points, screen states, rule statements,
33
+ connections, and references are no longer confined to a drawer. Every page
34
+ has Overview; Capability and Journey pages alone add Scenarios.
35
+ - **A concrete Actor's marker draws what it is.** The Actor mark carries the
36
+ authored `kind` as its silhouette — a person or a system, at the size every
37
+ other kind's mark uses — and the Product-boundary `relationship` is written as
38
+ a word where each reading has room for it. A Scenario Step names its Actor
39
+ with that mark in a chip that opens the Actor, rather than as prose.
40
+ - The open section and the open entity page live in the URL, so a report has
41
+ deep links, a working browser back button, and a refresh that lands where it
42
+ left. `BusinessLensReportViewer` exposes both as bindable models.
43
+ - Each collection states the question it answers and the derivation behind its
44
+ reading order, in the vocabulary the named topology views already use.
45
+ - Every collection opens grouped by the containment the format declares for it,
46
+ and says so when an entity relates to more than one group.
47
+ - Counterpart Screens, Experiences and Interfaces cross-link from their pages:
48
+ the same thing on another Interface is named as such rather than appearing to
49
+ be a duplicate row.
50
+ - One entity's neighbourhood is drawn on the named Topology canvas, at a width
51
+ that can render it, when the reader chooses the page's Neighbourhood action.
52
+ - The stable BusinessLens Product Report: an entity-first browse, search,
53
+ scenario, journey, and named-topology experience over one complete report
54
+ projection. It renders every authored entity on its page while ranking
55
+ collection and Overview readings for repeated human use.
56
+ - A shared Vue Flow foundation in the report-viewer layer (`@vue-flow/core` with a
57
+ `@dagrejs/dagre` layered layout, both optional peer dependencies): one
58
+ entity box and one container box for nine visual categories (with both
59
+ Scenario types distinguished in content), a fixed relation-verb
60
+ vocabulary, a measured Interface → Experience → Screen containment map, a
61
+ sitemap of the same hierarchy drawn either as a top-down tree or radially
62
+ from the Product core, plus focused entity filtering on the named Topology
63
+ surface.
64
+
65
+ ### Changed
66
+
67
+ - **Context is now the single location concept.** Folder schema 6 replaces
68
+ scalar availability boundaries and Scenario Places with one strict
69
+ `{ place: ... }` Context shape across Capability availability, Scenario
70
+ Steps, and Business Rule selectors. A Context place resolves to an Interface,
71
+ Experience, or Screen; Screens derive their place from their path and declare
72
+ no availability of their own.
73
+ - Product Report v10 mirrors the same model with `{ placeId: ... }` Contexts,
74
+ removes the former availability and Place wire records, and is the only
75
+ accepted report version. The CLI, report SDK, Product Report, bundled skills,
76
+ fixtures, and Content Feed Reader Blueprint consume schema 6 and report v10
77
+ directly.
78
+ - Product Model terminology now names the Interface → Experience → Screen
79
+ hierarchy directly. The under-defined “surface” alias, including
80
+ `surface-parent`, surface-tree IDs, and the former Delivery surfaces view, has
81
+ been replaced by concrete entity names and `screen-parent`.
82
+ - Product Report entity readings present authored Capability Context once
83
+ instead of repeating it in the fact strip and under “Available in.” Derived
84
+ Journey and Scenario Contexts stay with their concrete routes, Screen
85
+ placement stays in identity, and Rule Context selectors stay with
86
+ applicability. Journey starting places retain the exact first route Context
87
+ and appear as “Starts at”; raw entry-point routes remain report data rather
88
+ than human-facing report content.
89
+ - Collection rows, relations, search results, and topology entities open their
90
+ URL-backed pages directly. References stay in Overview, Neighbourhood opens
91
+ Topology, and the inspector and slideover are removed. The private report
92
+ experiment layer remains under the final `report-viewer-lab` name with no
93
+ active report experiments; the background audition remains independent in
94
+ `theme-lab`.
95
+ - **Capability and Journey Scenarios share one route-and-Steps model.** Every
96
+ Scenario now owns named `routes` and one ordered, typed `steps` list. An Actor
97
+ Step names its responsible Actor, a Journey Step may name its Capability, and
98
+ a contextualized Step maps every route to its exact Interface, Experience, or
99
+ Screen. Route-neutral Steps remain first-class without a Context. The
100
+ separate Journey
101
+ `flow`, `operation`, stage ids, per-Step route objects, Scenario-wide Actors
102
+ and availability, authored Screen Scenario backlinks, and Markdown `## Steps`
103
+ are removed. Folder schema 3 and Product Report v7 are no longer accepted;
104
+ this release has no compatibility reader.
105
+ - Every Interface now declares one required interaction `type` (`web`,
106
+ `mobile-app`, `desktop-app`, `cli`, `api`, `webhook`, `messaging`, `voice`,
107
+ or `device`). Reports preserve it directly and use it to distinguish
108
+ Interface contexts visually instead of guessing from ids or route names.
109
+ - A Journey Step names a durable Capability, never a Capability Scenario, while
110
+ its text states the concrete observable action or condition. Capability
111
+ Scenarios may split and merge without leaving dangling Journey composition
112
+ references.
113
+ - **Journey pages have one Scenario reading.** The peer `Flows` tab and the
114
+ duplicate Journey-local diagram are removed because they projected the same
115
+ authored Steps while silently dropping Steps without a Capability. The named
116
+ topology view is now **Journey composition**: it explicitly answers the
117
+ narrower Capability-composition question. Outside visible Domain groupings,
118
+ Capability nodes use the consistent Capability color rather than inheriting
119
+ a Domain color that could be mistaken for status.
120
+ - **Capability and Journey Scenarios share one Steps treatment.** Both render
121
+ the same Step-by-route matrix. Columns use the authored route name and stable
122
+ order; placed cells show the exact typed Interface → Experience → Screen
123
+ hierarchy. Step-kind labels explain Actor actions, Product actions, and
124
+ conditions; Capability labels appear only where they discriminate Journey
125
+ Steps. Steps without a Context and Context transitions are described in
126
+ plain language, without exposing internal route ids.
127
+ - **The report navigation rail lists kinds, flat.** Kinds do not nest —
128
+ instances do — so both Scenario kinds leave the rail and are read on the page
129
+ for the Capability or Journey that owns them. The Capability and Journey main
130
+ screens open their collections directly, without a redundant parent/Scenario
131
+ tab strip. Ten destinations instead of twelve, and no indentation claiming a
132
+ hierarchy the other eight rows have too.
133
+ - **Collection chrome scales with the collection.** The per-relation filter
134
+ dropdowns collapse into one control with a chip per *active* filter, and it is
135
+ not rendered at all below eight entities — seven dropdowns above four Journeys
136
+ was a wall, not an offer. The card-style switcher is gone; the dense row is
137
+ the only layout, and it carries the fact that distinguishes an entity from its
138
+ neighbours (a Screen's scope, a Scenario's parent) where the repeated kind
139
+ label used to be.
140
+ - Entity tables render the name of a relation the format makes single-valued
141
+ rather than the count `1`, and drop any column constant across the rows on
142
+ screen.
143
+ - The bundled skills carry a worked Capability Scenario. The reference every
144
+ skill reads described `routes`, typed `steps`, and per-route Contexts in
145
+ prose but showed no Scenario file, leaving the model's most structured
146
+ artifact to be inferred. The example is single-route, because that is the
147
+ case where the `routes` requirement is least guessable.
148
+ - The bundled skills name the Product's portable identity keys — `summary`,
149
+ `category`, `authors`, and `license`. Report hosts read all four, and a model
150
+ authored without them reaches a Blueprint incomplete.
151
+ - `npm run check` asserts that every entity kind, frontmatter key, and required
152
+ section named in `spec/format.md` also appears in the canonical skill
153
+ reference. The reference may be terser than the contract; it may not omit a
154
+ name, because an agent cannot author a key it was never told about. It found
155
+ the three missing Product keys above on its first run.
156
+ - A README for the `businesslens/nuxt/theme` layer, which shipped as a public
157
+ export with no documentation of its palette roles, type scale,
158
+ `<BusinessLensBrand>` lockup, or icon-family composable.
159
+ - **Folder schema 5 — a breaking change with no compatibility reader.** An
160
+ entity is compact as `<id>.md` until it owns an asset or typed child
161
+ collection, then expands to `<id>/<type>.md`. Both shapes derive the same id
162
+ and cannot coexist. This keeps leaf-heavy collections readable while giving
163
+ every kind—Screens most of all—a co-located namespace when needed.
164
+ `product.md` similarly expands to `product/product.md` only when it owns
165
+ `logo.svg`. Two coexisting shapes, and an expanded folder missing its
166
+ `<type>.md`, are `lint` errors — neither is a state a correct model passes
167
+ through. An expanded folder that owns nothing *yet* is a warning instead: the
168
+ rule still holds, and expansion normalizes the folder back to the compact
169
+ form, but an author reaches the expanded shape in two steps and the
170
+ intermediate step is not a defect.
171
+ - **The Interface → Experience → Screen hierarchy nests.** An Experience
172
+ belongs to exactly one Interface and
173
+ a Screen to exactly one scope, so the path is the parent relation. An
174
+ Experience no longer writes `interfaces:`, a Capability Scenario no longer
175
+ writes `capability:`, a Journey Scenario no longer writes `journey:`, and a
176
+ Screen no longer writes `availability:`. Reparenting is a `git mv` that reads
177
+ correctly in a pull request.
178
+ - **Interface, Experience, and Screen ids are qualified** by the path that
179
+ distinguishes them. Experience and Screen names repeat across Interfaces on purpose: two entities of the same
180
+ kind sharing a path suffix below their Interface are counterparts — the same
181
+ thing on two Interfaces. Behavior-tree ids stay bare and globally unique.
182
+ - **Domain is a subject axis, not a capability folder.** It now requires a
183
+ `## Boundary` section, and only Capability authors `domain:` — a Screen's,
184
+ Experience's or Journey's Domains are derived through their Capabilities
185
+ rather than restated where a second copy could disagree.
186
+ - Product Report `schemaVersion` is `10.0.0`, and the catalog media type moves
187
+ to `version=10`. There is exactly one accepted report version, as before.
188
+ - Scenario documentation moves onto its parent's page. A Scenario is not a
189
+ top-level entity — it has a mandatory single parent that decides its kind —
190
+ so Capability Scenarios are documented in `docs/capabilities.md`, Journey
191
+ Scenarios in `docs/journeys.md`, and the containment rule that separates them
192
+ in `docs/product-model.md`. The standalone `docs/scenarios.md` is removed.
193
+ - An external system is an Actor only when it **initiates** interaction with
194
+ the Product, and only then does it arrive through an Interface.
195
+ Interfaces are inbound by definition; an outbound connection the Product
196
+ opens to a third party — a polled feed, a payment processor, a mail provider,
197
+ a model API — is not an Interface and its far side is not an Actor. Model the
198
+ call inside the Capability that makes it, scope that Capability to the
199
+ Interfaces where an Actor observes the result, and make its
200
+ product-significant failure behavior a Capability Scenario. Direction, not
201
+ ownership, is the axis: the same third party calling the Product back through
202
+ a webhook is a genuine Actor with a genuine Interface. No entity type, folder
203
+ schema, parser, or linter behavior changes — `lint` cannot recover direction
204
+ from the files, so the rule lives in `spec/format.md`, the Product Model
205
+ docs, and the mapping rubric.
206
+ - The Content Feed Reader Blueprint applies that rule. It drops the
207
+ `feed-provider` Actor and the `syndicated-feed-integration` Interface;
208
+ `feed-synchronization` now lives on the Reader-facing Interfaces where its
209
+ result is seen, carries the RSS specification as a context Reference, and is
210
+ triggered by a Reader-initiated refresh on the Source list Screen — a trigger
211
+ the model previously never stated. Its catch-up failure variation no longer
212
+ contradicts itself about whether the backlog was unchanged or caught up.
213
+ - **Breaking.** `businesslens/nuxt/report-viewer` accepts the canonical
214
+ `ProductReportV10` directly and owns the complete Product Report projection
215
+ and topology engine. The lossy `businesslens/report/view-model` export and
216
+ the former whole-report audition layer are removed. The private,
217
+ unpublished `report-viewer-lab` remains as an empty boundary for future
218
+ experiments, while `theme-lab` continues to own background auditions.
219
+ - **Breaking.** Logo, lockup, and favicon selection are no longer theme-lab
220
+ experiments. The approved mark, wordmark, brand renderer, favicon, and
221
+ install-icon family now live at canonical paths in `businesslens/nuxt/theme`;
222
+ `businesslens/theme-lab/variants` exposes background choices only.
223
+ - The Product Report keeps entity identity collision-safe across collections,
224
+ preserves focus across live recompiles, separates Capability and Journey
225
+ Scenario readings, shows Screen-to-Journey derivation provenance, renders
226
+ ordered Journey path lanes, and uses fixed named views instead of a generic
227
+ cross-kind grouping builder. Mobile navigation is a dedicated drawer.
228
+ - Product Report v10 stores authored supporting H2 sections as ordered
229
+ `{ heading, content }` records instead of an opaque Markdown string. Lint
230
+ rejects Journey and Scenario lead prose, duplicate or conflicting structured
231
+ sections, malformed structured lists, and duplicate values in set-valued
232
+ relations rather than allowing authored content to disappear or inflate
233
+ derived relationships.
234
+ - The Content Feed Reader catalog Blueprint now models two actor-facing access
235
+ boundaries: Reader work and Visitor consumption. Feed collection is an
236
+ outbound Capability dependency rather than a synthetic Actor or Interface.
237
+ The model has two Actors, two Interfaces, three Experiences, three Domains,
238
+ eight Screens, ten Capabilities, twenty-four Capability Scenarios, four
239
+ Journeys, eight Journey Scenarios, and four Business Rules. Domains group
240
+ Capabilities on one axis — Sources, Reading, Collections — so no Capability
241
+ needs its Domain's definition widened to admit it.
242
+ - Both teaching models now demonstrate a Journey that is attempted and not
243
+ reached. The Blueprint carries two `not-achieved` Journey Scenarios and the
244
+ golden fixture one, so `result` is an axis with real values rather than a
245
+ constant, and `failureOnlyCapabilityIds` is exercised against authored
246
+ content instead of always deriving empty.
247
+ - The Product Report treats Capability Scenarios and Journey Scenarios as
248
+ separate entity kinds rather than one kind carrying a type flag. They remain
249
+ contained by their Capability or Journey while preserving their own search
250
+ results, pages, terminal results, and derived backlinks.
251
+
252
+ ### Fixed
253
+
254
+ - The release artifact smoke test follows the promoted stable boundaries: it
255
+ requires the approved icon under `theme`, not an old `theme-lab` audition
256
+ path, and rejects the retired lossy Report View Model export instead of
257
+ requiring it. The stale assertions stopped the first `v0.8.0` publish
258
+ attempts before npm.
259
+ - `package.json` no longer lists `plans/shared-theme-lab.md` among its packaged
260
+ files. The file was deleted while the entry stayed, and npm drops a missing
261
+ `files` entry silently, so the packed tarball simply carried no `plans/` at
262
+ all and nothing reported it.
263
+ - The docs group allowlist no longer permits `Learn from examples`, which no
264
+ page has used since the feed-reader walkthrough was removed. An allowed group
265
+ with nothing behind it is a sidebar section the navigation cannot build.
266
+ - Two routes of one Scenario that repeat the same Context place sequence are
267
+ now a finding in both `lint` and report validation. A route id names one
268
+ traversal, so a second id over the same sequence claims a lane the Product
269
+ does not have. The Content Feed Reader Blueprint carried two:
270
+ `publish-on-mobile` and `unlist-from-mobile`, which never left the web
271
+ Interface, and could not have — neither Capability declares a mobile context.
272
+ - Entity pages no longer inherit the scroll offset of the collection or entity
273
+ that opened them, so each reading begins at its own title, identity, and lead.
274
+ - The local viewer resolves the Blueprint logo at `product/logo.svg`, where
275
+ schema 5 puts it once the Product expands.
276
+ - An unexpected entry in a collection is now an explicit finding. A file nested
277
+ one level too deep, or saved with the wrong extension, previously vanished
278
+ from the model with no finding at all.
279
+ - The local viewer's Content-Security-Policy sets `manifest-src`, which was
280
+ blocking `site.webmanifest`.
281
+ - The Product Report light and dark page surfaces are part of the shared theme
282
+ again. The warm base, top glow, and paper grain moved from the optional
283
+ theme-lab audition layer into `businesslens/nuxt/theme`, where the promoted
284
+ Product Report and the bundled local viewer inherit them without depending on a
285
+ lab layer.
286
+ - Journey composition no longer implies a Screen is reached from a Step that
287
+ cannot expose it. A Screen is authored against the whole Journey Scenario, so
288
+ it now attaches to the last Capability-bearing Step whose Capability declares that
289
+ Screen and shares an availability context with it — a non-visual integration
290
+ Step no longer appears to land on a Reader Screen.
291
+ - Journey composition lays ordered Capability-bearing Steps downward with variations side by side. A
292
+ left-to-right chain was wider than the canvas for a short Journey, so it
293
+ scaled the whole graph down and left the height unused.
294
+
295
+ ## [0.7.2] - 2026-08-05
296
+
297
+ ### Added
298
+
299
+ - Add `--help` and strict option parsing to the Blueprint catalog publisher so
300
+ its maintainer-only production flow is discoverable before a credential is
301
+ configured.
302
+
303
+ ### Fixed
304
+
305
+ - Open the `BL` ligature apart in the generated tab icons, so a browser tab shows
306
+ two letters instead of one blob at 16px. Only the favicon family is respaced —
307
+ the logo artwork and the larger app icons keep the ligature as drawn.
308
+ - Restrict the Blueprint publisher credential to the exact production catalog
309
+ origin or a loopback development origin, preventing a mistaken `--catalog`
310
+ value from sending it to an arbitrary HTTPS host.
311
+
10
312
  ## [0.7.1] - 2026-08-04
11
313
 
12
314
  ### Fixed
@@ -51,10 +353,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
51
353
  - `report only` verification mode, an explicit missing-builder handoff, and an
52
354
  unchanged-gap stopping rule. Verification findings are re-derived rather than
53
355
  persisted in a receipt or ledger.
54
- - Accepted decisions covering [repository-owned files](./adr/0004-write-nothing-outside-businesslens.md),
55
- [unified References](./adr/0008-unified-references-and-portable-reports.md),
56
- [non-persisted verification](./adr/0006-verification-is-not-persisted.md),
57
- and the [three-skill boundary](./adr/0007-three-skills-and-one-verification-loop.md).
356
+ - Accepted decisions covering repository-owned files, unified References,
357
+ non-persisted verification, and the three-skill boundary.
58
358
 
59
359
  ### Changed
60
360
 
@@ -254,7 +554,9 @@ Initial public launch of the repository.
254
554
  `docs/format.md`.
255
555
  - Claude plugin manifest and marketplace entry.
256
556
 
257
- [Unreleased]: https://github.com/businesslens/pdd/compare/v0.7.1...HEAD
557
+ [Unreleased]: https://github.com/businesslens/pdd/compare/v0.8.0...HEAD
558
+ [0.8.0]: https://github.com/businesslens/pdd/compare/v0.7.2...v0.8.0
559
+ [0.7.2]: https://github.com/businesslens/pdd/compare/v0.7.1...v0.7.2
258
560
  [0.7.1]: https://github.com/businesslens/pdd/compare/v0.7.0...v0.7.1
259
561
  [0.7.0]: https://github.com/businesslens/pdd/compare/v0.6.0...v0.7.0
260
562
  [0.6.0]: https://github.com/businesslens/pdd/compare/v0.5.0...v0.6.0
package/README.md CHANGED
@@ -16,19 +16,19 @@ resolution loop.
16
16
  ```text
17
17
  .businesslens/
18
18
  ├── README.md
19
- ├── product.md
20
- ├── actors/
21
- ├── interfaces/
22
- ├── experiences/
23
- ├── screens/ # optional product views
24
- ├── domains/ # optional organization
25
- ├── capabilities/
26
- ├── business-rules/
27
- ├── journeys/<id>/journey.md
28
- │ └── scenarios/<id>.md
19
+ ├── product.md # or product/product.md beside logo.svg
20
+ ├── actors/<id>.md # or <id>/actor.md with assets
21
+ ├── interfaces/<id>.md # or <id>/interface.md with screens/ or experiences/
22
+ ├── domains/<id>.md # or <id>/domain.md with assets; optional collection
23
+ ├── capabilities/<id>.md # or <id>/capability.md with scenarios/ or assets
24
+ ├── journeys/<id>.md # or <id>/journey.md with scenarios/ or assets; optional
25
+ ├── business-rules/<id>.md # or <id>/business-rule.md with assets
29
26
  └── coverage.md
30
27
  ```
31
28
 
29
+ Leaf entities stay compact as `<id>.md`. An entity expands to
30
+ `<id>/<type>.md` only when it needs a namespace for assets or child entities.
31
+
32
32
  ## Getting started
33
33
 
34
34
  Install the skills:
@@ -97,21 +97,57 @@ Catalog contribution stays in the CLI; there is no contribution skill.
97
97
  proof or verification receipts.
98
98
  - `coverage.status` describes model breadth: `draft` while the model itself is
99
99
  under review, `partial` with known unmapped areas, and `complete` when the
100
- intended product scope is modeled.
100
+ intended product breadth is modeled.
101
101
  - A complete model may contain zero References.
102
102
  - A Product may expose several Interfaces—such as web, mobile, CLI, and a
103
103
  supported API—without being classified as one of those delivery forms.
104
- - Experiences are coherent usage contexts across Interfaces; exact
105
- Interface–Experience availability says where behavior is promised.
106
- - Domains are optional Capability groupings, and Journeys may cross them.
107
- - Screens are optional platform-neutral product views. Screenshots and other
108
- visuals remain external References, not model assets or proof.
104
+ - Experiences are optional coherent usage contexts, each belonging to exactly
105
+ one Interface. Availability is a list of strict Context objects whose
106
+ `place` is an undivided Interface or an Experience.
107
+ - Domains are optional regions of subject matter. Only a Capability authors
108
+ `domain:`; every other Domain relation is derived.
109
+ - Screens are optional platform-neutral product views, nested in the Interface
110
+ or Experience that contains them. Their path supplies their place. Product
111
+ assets sit beside the entity they describe; anything
112
+ under `implementation/` describes this realization and stays home.
109
113
  - `lint` checks format, required content, relationships, Reference grammar, and
110
114
  tracked code-reference paths. `verify` checks meaning against current code.
111
115
 
112
116
  Every model creation path writes `.businesslens/README.md`. BusinessLens never
113
117
  writes target `AGENTS.md`, `CLAUDE.md`, or root README files.
114
118
 
119
+ ## Where the Product Model is defined
120
+
121
+ Use these sources in this order:
122
+
123
+ 1. Read the [Product Model overview](./docs/product-model.md) for the mental
124
+ model and relationship overview.
125
+ 2. Use [`spec/format.md`](./spec/format.md) as the normative contract for the
126
+ authored `.businesslens/` files. It defines every entity, file shape,
127
+ relation, and semantic boundary, and changes before parser or linter
128
+ behavior changes. Its companion [`spec/report.md`](./spec/report.md) is the
129
+ contract for the serialized Product Report, its portable projection, and
130
+ expansion.
131
+ 3. Use the individual entity pages under [`docs/`](./docs/) for approachable
132
+ explanations, examples, and the relevant `lint` findings. They restate the
133
+ format contract and must not introduce a second definition.
134
+ 4. Follow [`src/core/model.ts`](./src/core/model.ts),
135
+ [`src/core/frontmatter.ts`](./src/core/frontmatter.ts),
136
+ [`src/core/markdown.ts`](./src/core/markdown.ts), and
137
+ [`src/commands/lint.ts`](./src/commands/lint.ts) to understand what the CLI
138
+ parses and enforces today.
139
+ 5. Use [`src/core/portable.ts`](./src/core/portable.ts) for the generated Product
140
+ Report JSON schema and relationship validation, and
141
+ [`src/commands/export.ts`](./src/commands/export.ts) for the authored-model to
142
+ report projection.
143
+
144
+ The installed skills carry self-contained format summaries and semantic
145
+ rubrics so agents can judge concepts that structural lint cannot prove—for
146
+ example, whether something is genuinely a durable Capability or a coherent
147
+ multi-Capability Journey. Those guides must remain consistent with
148
+ `spec/format.md`; they do not supersede it. Viewer backlinks and topology are
149
+ derived report projections, not additional authored relationships.
150
+
115
151
  ## Documentation
116
152
 
117
153
  - [Introduction](./docs/index.md) · [Installation](./docs/installation.md) ·
@@ -119,11 +155,11 @@ writes target `AGENTS.md`, `CLAUDE.md`, or root README files.
119
155
  - Start [from your repo](./docs/from-your-repo.md),
120
156
  [from a Blueprint](./docs/from-a-blueprint.md), or
121
157
  [from an idea](./docs/from-an-idea.md)
122
- - [Product Model](./docs/product-model.md) ·
123
- [References](./docs/references.md)
158
+ - [Product Model](./docs/product-model.md) · [References](./docs/references.md)
124
159
  - [Skills](./docs/skills.md) · [CLI](./docs/cli.md) ·
125
160
  [CI/CD](./docs/ci.md)
126
- - [Format contract](./spec/format.md)
161
+ - [Format contract](./spec/format.md) ·
162
+ [Report contract](./spec/report.md)
127
163
 
128
164
  ## Nuxt layers
129
165
 
@@ -131,12 +167,14 @@ The package also exposes separately composable Nuxt layers:
131
167
 
132
168
  - `businesslens/nuxt/report-viewer` renders a Product Report without owning its
133
169
  host navigation or page shell.
134
- - `businesslens/nuxt/theme` provides the stable BusinessLens palette, type, and
135
- semantic UI foundation.
170
+ - `businesslens/nuxt/theme` provides the stable BusinessLens palette, type,
171
+ semantic UI foundation, approved surfaces, logo/wordmark renderer, and
172
+ browser/install icon family.
136
173
  - `businesslens/nuxt/theme-lab` extends that stable theme with the shared,
137
- opt-in background and brand experiments used by the landing site and local
138
- report viewer. Its ownership and promotion rules are recorded in
139
- [`plans/shared-theme-lab.md`](./plans/shared-theme-lab.md).
174
+ opt-in background experiments used by the landing site and local report
175
+ viewer. A consumer that does not opt in receives the approved stable
176
+ presentation from `theme`; a background graduates by moving into `theme`,
177
+ never by a consumer depending on `theme-lab` in production.
140
178
 
141
179
  ## Safety
142
180
 
@@ -14,26 +14,5 @@ declare const BUSINESSLENS_DARK_BACKGROUNDS: BusinessLensBackgroundVariant[];
14
14
  declare const BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND = "l4";
15
15
  declare const BUSINESSLENS_DEFAULT_DARK_BACKGROUND = "d1";
16
16
  declare function findBusinessLensBackground(list: BusinessLensBackgroundVariant[], id: string | null | undefined, fallback: string): BusinessLensBackgroundVariant;
17
- type BusinessLensLogoDisplay = 'mark' | 'lockup';
18
- interface BusinessLensLogoVariant {
19
- id: string;
20
- name: string;
21
- tagline: string;
22
- /** Basename under `/brand/logo/variants`, without the `-dark` suffix. */
23
- file: string;
24
- }
25
- interface BusinessLensLockupVariant extends BusinessLensLogoVariant {
26
- direction: 'row' | 'column';
27
- wordmarkHeight: number;
28
- symbolScale: number;
29
- gapRatio: number;
30
- }
31
- declare const BUSINESSLENS_MARK_VARIANTS: BusinessLensLogoVariant[];
32
- declare const BUSINESSLENS_LOCKUP_VARIANTS: BusinessLensLockupVariant[];
33
- declare const BUSINESSLENS_DEFAULT_MARK: string;
34
- declare const BUSINESSLENS_DEFAULT_LOCKUP = "k3";
35
- declare const BUSINESSLENS_DEFAULT_LOGO_DISPLAY: BusinessLensLogoDisplay;
36
- declare function businessLensLogoSrc(variant: BusinessLensLogoVariant, dark?: boolean): string;
37
- declare function findBusinessLensLogo<T extends BusinessLensLogoVariant>(list: T[], id: string | null | undefined, fallback: string): T;
38
17
  //#endregion
39
- export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_DEFAULT_LOCKUP, BUSINESSLENS_DEFAULT_LOGO_DISPLAY, BUSINESSLENS_DEFAULT_MARK, BUSINESSLENS_LIGHT_BACKGROUNDS, BUSINESSLENS_LOCKUP_VARIANTS, BUSINESSLENS_MARK_VARIANTS, BusinessLensBackgroundVariant, BusinessLensLockupVariant, BusinessLensLogoDisplay, BusinessLensLogoVariant, businessLensLogoSrc, findBusinessLensBackground, findBusinessLensLogo };
18
+ export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_LIGHT_BACKGROUNDS, BusinessLensBackgroundVariant, findBusinessLensBackground };
@@ -1,35 +1,3 @@
1
- //#region layers/nuxt/theme-lab/app/utils/businesslensThemeLabMarks.mjs
2
- var businesslensThemeLabMarks_default = {
3
- defaultMark: "m10",
4
- marks: [
5
- {
6
- id: "m4",
7
- name: "Monogram",
8
- tagline: "BL ligature cut from an aperture hex",
9
- file: "mark-4"
10
- },
11
- {
12
- id: "m7",
13
- name: "Tile",
14
- tagline: "Ink BL on a solid brass tile",
15
- file: "mark-7"
16
- },
17
- {
18
- id: "m8",
19
- name: "Ligature",
20
- tagline: "Bare BL with a terracotta full point",
21
- file: "mark-8"
22
- },
23
- {
24
- id: "m10",
25
- name: "Bare",
26
- tagline: "Bare BL ligature, no punctuation",
27
- file: "mark-10"
28
- }
29
- ]
30
- };
31
-
32
- //#endregion
33
1
  //#region layers/nuxt/theme-lab/app/utils/businesslensThemeLabVariants.ts
34
2
  const BUSINESSLENS_LIGHT_BACKGROUNDS = [{
35
3
  id: "l2",
@@ -79,36 +47,6 @@ const BUSINESSLENS_DEFAULT_DARK_BACKGROUND = "d1";
79
47
  function findBusinessLensBackground(list, id, fallback) {
80
48
  return list.find((item) => item.id === id) ?? list.find((item) => item.id === fallback);
81
49
  }
82
- const BUSINESSLENS_MARK_VARIANTS = businesslensThemeLabMarks_default.marks;
83
- const BUSINESSLENS_STAMP_GEOMETRY = {
84
- direction: "row",
85
- wordmarkHeight: 26,
86
- symbolScale: 1.31,
87
- gapRatio: .25
88
- };
89
- const BUSINESSLENS_LOCKUP_VARIANTS = [{
90
- id: "k3",
91
- name: "Stamp",
92
- tagline: "Letterspaced caps between hairline rules",
93
- file: "wordmark-3",
94
- ...BUSINESSLENS_STAMP_GEOMETRY
95
- }, {
96
- id: "k11",
97
- name: "Brass Lens",
98
- tagline: "Neutral Business with the Lens in brass",
99
- file: "wordmark-11",
100
- ...BUSINESSLENS_STAMP_GEOMETRY
101
- }];
102
- const BUSINESSLENS_DEFAULT_MARK = businesslensThemeLabMarks_default.defaultMark;
103
- const BUSINESSLENS_DEFAULT_LOCKUP = "k3";
104
- const BUSINESSLENS_DEFAULT_LOGO_DISPLAY = "lockup";
105
- const BUSINESSLENS_LOGO_BASE = "/brand/logo/variants";
106
- function businessLensLogoSrc(variant, dark = false) {
107
- return `${BUSINESSLENS_LOGO_BASE}/${variant.file}${dark ? "-dark" : ""}.svg`;
108
- }
109
- function findBusinessLensLogo(list, id, fallback) {
110
- return list.find((item) => item.id === id) ?? list.find((item) => item.id === fallback);
111
- }
112
50
 
113
51
  //#endregion
114
- export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_DEFAULT_LOCKUP, BUSINESSLENS_DEFAULT_LOGO_DISPLAY, BUSINESSLENS_DEFAULT_MARK, BUSINESSLENS_LIGHT_BACKGROUNDS, BUSINESSLENS_LOCKUP_VARIANTS, BUSINESSLENS_MARK_VARIANTS, businessLensLogoSrc, findBusinessLensBackground, findBusinessLensLogo };
52
+ export { BUSINESSLENS_DARK_BACKGROUNDS, BUSINESSLENS_DEFAULT_DARK_BACKGROUND, BUSINESSLENS_DEFAULT_LIGHT_BACKGROUND, BUSINESSLENS_LIGHT_BACKGROUNDS, findBusinessLensBackground };