@transitrix/diagrams 1.0.0 → 1.0.1

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 (267) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +47 -47
  3. package/dist/__tests__/edge-path.test.js +8 -0
  4. package/dist/activity-card/__tests__/example.test.js +20 -1
  5. package/dist/activity-card/__tests__/layout.test.js +102 -11
  6. package/dist/activity-card/__tests__/resolver.test.js +139 -6
  7. package/dist/activity-card/index.d.ts +1 -1
  8. package/dist/activity-card/layout.d.ts +1 -1
  9. package/dist/activity-card/layout.js +220 -103
  10. package/dist/activity-card/resolver.js +107 -26
  11. package/dist/activity-card/types.d.ts +150 -27
  12. package/dist/activity-card/validate.js +3 -0
  13. package/dist/actor/__tests__/validate.test.js +63 -31
  14. package/dist/actor/index.d.ts +1 -1
  15. package/dist/actor/index.js +1 -1
  16. package/dist/actor/types.d.ts +7 -3
  17. package/dist/actor/types.js +17 -3
  18. package/dist/actor/validate.js +55 -26
  19. package/dist/assertion/types.d.ts +3 -1
  20. package/dist/assertion/types.js +1 -1
  21. package/dist/change/__tests__/validate.test.js +40 -34
  22. package/dist/change/index.d.ts +1 -0
  23. package/dist/change/types.d.ts +1 -1
  24. package/dist/change/types.js +2 -2
  25. package/dist/change/validate.d.ts +6 -1
  26. package/dist/change/validate.js +68 -41
  27. package/dist/compliance/__tests__/classify.test.js +34 -0
  28. package/dist/compliance/__tests__/coverage-metric.test.js +146 -46
  29. package/dist/compliance/__tests__/html.test.js +2 -2
  30. package/dist/compliance/__tests__/impact.test.js +311 -6
  31. package/dist/compliance/classify.d.ts +6 -0
  32. package/dist/compliance/classify.js +9 -1
  33. package/dist/compliance/coverage-metric.d.ts +31 -11
  34. package/dist/compliance/coverage-metric.js +149 -39
  35. package/dist/compliance/html.js +77 -74
  36. package/dist/compliance/impact.d.ts +77 -16
  37. package/dist/compliance/impact.js +193 -25
  38. package/dist/compliance/index.d.ts +2 -2
  39. package/dist/compliance/index.js +1 -1
  40. package/dist/compliance/markdown.js +1 -0
  41. package/dist/compliance/types.d.ts +25 -6
  42. package/dist/edge-path.d.ts +8 -4
  43. package/dist/edge-path.js +11 -6
  44. package/dist/factor/__tests__/validate.test.js +74 -45
  45. package/dist/factor/index.d.ts +3 -2
  46. package/dist/factor/index.js +1 -1
  47. package/dist/factor/types.d.ts +4 -7
  48. package/dist/factor/types.js +10 -5
  49. package/dist/factor/validate.d.ts +6 -1
  50. package/dist/factor/validate.js +68 -50
  51. package/dist/fgca/__tests__/resolver.test.js +185 -0
  52. package/dist/fgca/index.d.ts +2 -0
  53. package/dist/fgca/index.js +1 -0
  54. package/dist/fgca/resolver.d.ts +49 -0
  55. package/dist/fgca/resolver.js +124 -0
  56. package/dist/goals/index.d.ts +1 -1
  57. package/dist/index.d.ts +5 -0
  58. package/dist/index.js +5 -0
  59. package/dist/process-blueprint/__tests__/layout.test.js +37 -0
  60. package/dist/process-blueprint/layout.js +5 -1
  61. package/dist/process-blueprint/types.d.ts +22 -1
  62. package/dist/stakeholder/__tests__/validate.test.js +49 -47
  63. package/dist/stakeholder/index.d.ts +1 -0
  64. package/dist/stakeholder/types.d.ts +3 -4
  65. package/dist/stakeholder/types.js +2 -3
  66. package/dist/stakeholder/validate.d.ts +6 -1
  67. package/dist/stakeholder/validate.js +71 -50
  68. package/dist/target-state/__tests__/validate.test.js +43 -27
  69. package/dist/target-state/index.d.ts +2 -0
  70. package/dist/target-state/index.js +1 -0
  71. package/dist/target-state/types.d.ts +6 -1
  72. package/dist/target-state/types.js +8 -7
  73. package/dist/target-state/validate.d.ts +6 -1
  74. package/dist/target-state/validate.js +69 -45
  75. package/dist/theme/themes.js +69 -69
  76. package/dist/webview/__tests__/entry.test.js +11 -11
  77. package/dist/webview/render-activities.d.ts +3 -1
  78. package/dist/webview/render-activities.js +2 -2
  79. package/dist/webview/render-activity-card.js +104 -77
  80. package/dist/webview/render-fgca.d.ts +4 -0
  81. package/dist/webview/render-fgca.js +2 -5
  82. package/dist/webview/render-goals.d.ts +1 -0
  83. package/dist/webview/render-goals.js +15 -15
  84. package/dist/webview/render-process-blueprint.js +10 -10
  85. package/package.json +40 -40
  86. package/src/__tests__/edge-path.test.ts +58 -46
  87. package/src/__tests__/scope.test.ts +27 -27
  88. package/src/__tests__/yaml-normalize.test.ts +158 -158
  89. package/src/activities/__tests__/cpm.test.ts +164 -164
  90. package/src/activities/__tests__/gantt.test.ts +245 -245
  91. package/src/activities/__tests__/layout.test.ts +112 -112
  92. package/src/activities/__tests__/validate.test.ts +409 -409
  93. package/src/activities/cpm.ts +95 -95
  94. package/src/activities/gantt.ts +276 -276
  95. package/src/activities/index.ts +28 -28
  96. package/src/activities/layout.ts +112 -112
  97. package/src/activities/types.ts +148 -148
  98. package/src/activities/validate.ts +357 -357
  99. package/src/activity-card/__tests__/example.test.ts +85 -66
  100. package/src/activity-card/__tests__/layout.test.ts +169 -63
  101. package/src/activity-card/__tests__/resolver.test.ts +307 -161
  102. package/src/activity-card/__tests__/validate.test.ts +131 -131
  103. package/src/activity-card/index.ts +38 -32
  104. package/src/activity-card/layout.ts +324 -194
  105. package/src/activity-card/resolver.ts +415 -337
  106. package/src/activity-card/types.ts +376 -237
  107. package/src/activity-card/validate.ts +162 -158
  108. package/src/actor/__tests__/validate.test.ts +70 -31
  109. package/src/actor/index.ts +1 -1
  110. package/src/actor/types.ts +21 -7
  111. package/src/actor/validate.ts +59 -27
  112. package/src/applications/__tests__/validate.test.ts +256 -256
  113. package/src/applications/index.ts +11 -11
  114. package/src/applications/types.ts +43 -43
  115. package/src/applications/validate.ts +131 -131
  116. package/src/assertion/__tests__/example.test.ts +37 -37
  117. package/src/assertion/__tests__/validate.test.ts +142 -142
  118. package/src/assertion/index.ts +12 -12
  119. package/src/assertion/types.ts +60 -58
  120. package/src/assertion/validate.ts +145 -145
  121. package/src/blocks/__tests__/layout.test.ts +169 -169
  122. package/src/blocks/__tests__/validate.test.ts +260 -260
  123. package/src/blocks/index.ts +17 -17
  124. package/src/blocks/layout.ts +186 -186
  125. package/src/blocks/types.ts +62 -62
  126. package/src/blocks/validate.ts +206 -206
  127. package/src/capability-map/__tests__/validate.test.ts +238 -238
  128. package/src/capability-map/index.ts +8 -8
  129. package/src/capability-map/types.ts +29 -29
  130. package/src/capability-map/validate.ts +127 -127
  131. package/src/change/__tests__/validate.test.ts +43 -34
  132. package/src/change/index.ts +1 -0
  133. package/src/change/types.ts +5 -3
  134. package/src/change/validate.ts +75 -43
  135. package/src/compliance/__tests__/classify.test.ts +64 -27
  136. package/src/compliance/__tests__/confidence.test.ts +98 -98
  137. package/src/compliance/__tests__/coverage-metric.test.ts +300 -188
  138. package/src/compliance/__tests__/demo-scenario.test.ts +273 -273
  139. package/src/compliance/__tests__/example.test.ts +57 -57
  140. package/src/compliance/__tests__/gap-report.test.ts +128 -128
  141. package/src/compliance/__tests__/html.test.ts +141 -141
  142. package/src/compliance/__tests__/impact.test.ts +840 -481
  143. package/src/compliance/__tests__/markdown.test.ts +94 -94
  144. package/src/compliance/__tests__/views.test.ts +64 -64
  145. package/src/compliance/classify.ts +100 -84
  146. package/src/compliance/confidence.ts +69 -69
  147. package/src/compliance/coverage-metric.ts +404 -263
  148. package/src/compliance/gap-report.ts +94 -94
  149. package/src/compliance/html.ts +298 -295
  150. package/src/compliance/impact.ts +861 -677
  151. package/src/compliance/index.ts +57 -56
  152. package/src/compliance/markdown.ts +136 -135
  153. package/src/compliance/reverse-index.ts +33 -33
  154. package/src/compliance/types.ts +136 -120
  155. package/src/compliance/views.ts +46 -46
  156. package/src/compliance-matrix/__tests__/build.test.ts +200 -200
  157. package/src/compliance-matrix/__tests__/example.test.ts +57 -57
  158. package/src/compliance-matrix/index.ts +11 -11
  159. package/src/compliance-matrix/types.ts +102 -102
  160. package/src/edge-path.ts +50 -44
  161. package/src/factor/__tests__/validate.test.ts +80 -45
  162. package/src/factor/index.ts +3 -7
  163. package/src/factor/types.ts +14 -18
  164. package/src/factor/validate.ts +77 -51
  165. package/src/fgca/__tests__/chain-table.test.ts +172 -172
  166. package/src/fgca/__tests__/layout.test.ts +179 -179
  167. package/src/fgca/__tests__/parse-canonical.test.ts +248 -248
  168. package/src/fgca/__tests__/preview-layout.test.ts +124 -124
  169. package/src/fgca/__tests__/resolver.test.ts +209 -0
  170. package/src/fgca/__tests__/validate.test.ts +142 -142
  171. package/src/fgca/chain-table.ts +225 -225
  172. package/src/fgca/index.ts +47 -45
  173. package/src/fgca/layout.ts +204 -204
  174. package/src/fgca/nodeTypes.ts +11 -11
  175. package/src/fgca/nodes/FGCAActivityNode.tsx +65 -65
  176. package/src/fgca/nodes/FGCAChangeNode.tsx +64 -64
  177. package/src/fgca/nodes/FGCAFactorNode.tsx +64 -64
  178. package/src/fgca/nodes/FGCAGoalNode.tsx +72 -72
  179. package/src/fgca/parse-canonical.ts +400 -400
  180. package/src/fgca/preview-layout.ts +217 -217
  181. package/src/fgca/resolver.ts +157 -0
  182. package/src/fgca/types.ts +50 -50
  183. package/src/fgca/validate.ts +126 -126
  184. package/src/geometry.ts +9 -9
  185. package/src/goals/__tests__/layout.test.ts +175 -175
  186. package/src/goals/__tests__/mutations.test.ts +111 -111
  187. package/src/goals/__tests__/parse-canonical.test.ts +145 -145
  188. package/src/goals/__tests__/validate.test.ts +202 -202
  189. package/src/goals/index.ts +20 -21
  190. package/src/goals/layout.ts +172 -172
  191. package/src/goals/mutations.ts +123 -123
  192. package/src/goals/parse-canonical.ts +286 -286
  193. package/src/goals/types.ts +85 -85
  194. package/src/goals/validate.ts +136 -136
  195. package/src/index.ts +28 -23
  196. package/src/process-blueprint/__tests__/compliance-lane.test.ts +320 -320
  197. package/src/process-blueprint/__tests__/layout.test.ts +240 -195
  198. package/src/process-blueprint/__tests__/validate.test.ts +310 -310
  199. package/src/process-blueprint/index.ts +31 -31
  200. package/src/process-blueprint/layout.ts +535 -531
  201. package/src/process-blueprint/types.ts +263 -242
  202. package/src/process-blueprint/validate.ts +181 -181
  203. package/src/process-map/__tests__/validate.test.ts +223 -223
  204. package/src/process-map/index.ts +10 -10
  205. package/src/process-map/types.ts +36 -36
  206. package/src/process-map/validate.ts +135 -135
  207. package/src/products/__tests__/validate.test.ts +239 -239
  208. package/src/products/index.ts +9 -9
  209. package/src/products/types.ts +31 -31
  210. package/src/products/validate.ts +112 -112
  211. package/src/repo-validate/__tests__/validate-repo.test.ts +149 -149
  212. package/src/repo-validate/index.ts +2 -2
  213. package/src/repo-validate/types.ts +50 -50
  214. package/src/repo-validate/validate-repo.ts +196 -196
  215. package/src/requirement/__tests__/example.test.ts +24 -24
  216. package/src/requirement/__tests__/validate.test.ts +96 -96
  217. package/src/requirement/index.ts +4 -4
  218. package/src/requirement/types.ts +35 -35
  219. package/src/requirement/validate.ts +92 -92
  220. package/src/scenarios/__tests__/validate.test.ts +209 -209
  221. package/src/scenarios/index.ts +15 -15
  222. package/src/scenarios/types.ts +37 -37
  223. package/src/scenarios/validate.ts +122 -122
  224. package/src/schema-version.ts +16 -16
  225. package/src/scope.ts +46 -46
  226. package/src/stakeholder/__tests__/validate.test.ts +51 -47
  227. package/src/stakeholder/index.ts +1 -0
  228. package/src/stakeholder/types.ts +7 -7
  229. package/src/stakeholder/validate.ts +79 -52
  230. package/src/target-state/__tests__/validate.test.ts +48 -27
  231. package/src/target-state/index.ts +2 -0
  232. package/src/target-state/types.ts +11 -7
  233. package/src/target-state/validate.ts +76 -46
  234. package/src/theme/index.ts +4 -4
  235. package/src/theme/themes.ts +237 -237
  236. package/src/theme/tokens.ts +133 -133
  237. package/src/typed-id.ts +56 -56
  238. package/src/validation-types.ts +36 -36
  239. package/src/webview/__tests__/entry-notations.test.ts +77 -77
  240. package/src/webview/__tests__/entry.test.ts +64 -64
  241. package/src/webview/__tests__/render-goals.test.ts +72 -72
  242. package/src/webview/entry.ts +292 -292
  243. package/src/webview/render-activities.ts +5 -3
  244. package/src/webview/render-activity-card.ts +266 -234
  245. package/src/webview/render-fgca.ts +6 -5
  246. package/src/webview/render-goals.ts +111 -110
  247. package/src/webview/render-process-blueprint.ts +207 -207
  248. package/src/webview/styles.css +322 -323
  249. package/src/yaml-normalize.ts +56 -56
  250. package/dist/element-envelope.d.ts +0 -15
  251. package/dist/element-envelope.js +0 -55
  252. package/dist/issues/__tests__/layout.test.js +0 -62
  253. package/dist/issues/__tests__/validate.test.d.ts +0 -1
  254. package/dist/issues/__tests__/validate.test.js +0 -82
  255. package/dist/issues/index.d.ts +0 -4
  256. package/dist/issues/index.js +0 -2
  257. package/dist/issues/layout.d.ts +0 -10
  258. package/dist/issues/layout.js +0 -82
  259. package/dist/issues/types.d.ts +0 -61
  260. package/dist/issues/types.js +0 -6
  261. package/dist/issues/validate.d.ts +0 -3
  262. package/dist/issues/validate.js +0 -143
  263. package/dist/webview/transitrix-render.css +0 -323
  264. package/dist/webview/transitrix-render.js +0 -6452
  265. package/dist/webview/transitrix-render.js.map +0 -7
  266. package/src/element-envelope.ts +0 -76
  267. /package/dist/{issues/__tests__/layout.test.d.ts → fgca/__tests__/resolver.test.d.ts} +0 -0
@@ -1,133 +1,133 @@
1
- /** Transitrix brand palette. */
2
- export const BRAND = {
3
- petrol: '#004d67',
4
- amber: '#ffaf00',
5
- orange: '#ff4d00',
6
- } as const;
7
-
8
- /** Functional status colors. */
9
- export const FUNCTIONAL = {
10
- success: '#1a7f5c',
11
- warning: '#c07030',
12
- error: '#b91c1c',
13
- info: '#1d6fa8',
14
- } as const;
15
-
16
- /** Fill colors for FGCA notation columns. */
17
- export const LAYER_COLORS = {
18
- factor: { light: '#fef3c7', dark: '#292108', hc: '#f59e0b' },
19
- goal: { light: '#e0e7ff', dark: '#1e1b4b', hc: '#818cf8' },
20
- change: { light: '#dbeafe', dark: '#0c2042', hc: '#60a5fa' },
21
- activity: { light: '#d4edda', dark: '#0a2414', hc: '#4ade80' },
22
- } as const;
23
-
24
- /** Level fill colors for Goals tree nodes — 8 slots, cycled by level index. */
25
- export const LEVEL_COLORS = {
26
- light: ['#dbeafe', '#e0e7ff', '#d4edda', '#fef3c7', '#fce7f3', '#e0f2fe', '#f3e8ff', '#fef9c3'],
27
- dark: ['#0c2042', '#1e1b4b', '#0a2414', '#292108', '#2a0c1f', '#071e2e', '#1a0c33', '#2a2107'],
28
- hc: ['#60a5fa', '#818cf8', '#4ade80', '#f59e0b', '#f472b6', '#38bdf8', '#a78bfa', '#facc15'],
29
- } as const;
30
-
31
- /** Structural diagram colors (nodes, edges, text). */
32
- export const STRUCTURAL = {
33
- nodeStroke: { light: '#94a3b8', dark: '#475569', hc: '#e2e8f0' },
34
- edgeStroke: { light: '#94a3b8', dark: '#475569', hc: '#e2e8f0' },
35
- textPrimary: { light: '#1e293b', dark: '#f1f5f9', hc: '#ffffff' },
36
- textSecondary: { light: '#64748b', dark: '#94a3b8', hc: '#cbd5e1' },
37
- headerText: { light: '#374151', dark: '#e5e7eb', hc: '#ffffff' },
38
- } as const;
39
-
40
- /**
41
- * Maturity scale fill colors — Likert 1..5, danger→success.
42
- * Used by Capability Map and any future maturity-based notation.
43
- */
44
- export const MATURITY_COLORS = {
45
- light: ['#b91c1c', '#d97706', '#ca8a04', '#65a30d', '#15803d'],
46
- dark: ['#7f1d1d', '#92400e', '#854d0e', '#3f6212', '#14532d'],
47
- hc: ['#f87171', '#fb923c', '#facc15', '#a3e635', '#4ade80'],
48
- } as const;
49
-
50
- /**
51
- * Typography hierarchy. All previews resolve text styling from these roles
52
- * — never from inline font-* attributes on individual <text> elements.
53
- *
54
- * fontFamily threads through the VS Code font setting so the preview reads
55
- * as part of the editor; size + weight encode the visual hierarchy.
56
- */
57
- export const TYPOGRAPHY = {
58
- fontFamily: 'var(--vscode-font-family, system-ui, -apple-system, sans-serif)',
59
- sizes: {
60
- header: 13, // stage/column headers, diagram captions
61
- primary: 12, // primary node/cell labels
62
- secondary: 11, // annotations, secondary lines, meta
63
- id: 10, // compact id/code chips
64
- pill: 11, // pill labels (process-blueprint aspects, badges)
65
- caption: 11, // figcaption under the canvas
66
- },
67
- weights: {
68
- header: 700,
69
- primary: 600,
70
- secondary: 400,
71
- id: 600,
72
- pill: 500,
73
- caption: 400,
74
- },
75
- } as const;
76
-
77
- /** Adaptive shell tokens (background, text, border, status). */
78
- export interface AdaptiveTokens {
79
- bg: string;
80
- bgSurface: string;
81
- bgElevated: string;
82
- text: string;
83
- textMuted: string;
84
- textInverse: string;
85
- border: string;
86
- divider: string;
87
- statusSuccessBg: string;
88
- statusSuccessFg: string;
89
- statusWarningBg: string;
90
- statusWarningFg: string;
91
- statusInfoBg: string;
92
- statusInfoFg: string;
93
- statusErrorBg: string;
94
- statusErrorFg: string;
95
- }
96
-
97
- /** CSS custom property names for --ts-* variables. */
98
- export const CSS_VAR = {
99
- bg: '--ts-bg',
100
- bgSurface: '--ts-bg-surface',
101
- bgElevated: '--ts-bg-elevated',
102
- text: '--ts-text',
103
- textMuted: '--ts-text-muted',
104
- textInverse: '--ts-text-inverse',
105
- border: '--ts-border',
106
- divider: '--ts-divider',
107
- statusSuccessBg: '--ts-status-success-bg',
108
- statusSuccessFg: '--ts-status-success-fg',
109
- statusWarningBg: '--ts-status-warning-bg',
110
- statusWarningFg: '--ts-status-warning-fg',
111
- statusInfoBg: '--ts-status-info-bg',
112
- statusInfoFg: '--ts-status-info-fg',
113
- statusErrorBg: '--ts-status-error-bg',
114
- statusErrorFg: '--ts-status-error-fg',
115
- layerFactor: '--ts-layer-factor',
116
- layerGoal: '--ts-layer-goal',
117
- layerChange: '--ts-layer-change',
118
- layerActivity: '--ts-layer-activity',
119
- nodeStroke: '--ts-node-stroke',
120
- edgeStroke: '--ts-edge-stroke',
121
- textPrimary: '--ts-text-primary',
122
- textSecondary: '--ts-text-secondary',
123
- headerText: '--ts-header-text',
124
- maturity1: '--ts-maturity-1',
125
- maturity2: '--ts-maturity-2',
126
- maturity3: '--ts-maturity-3',
127
- maturity4: '--ts-maturity-4',
128
- maturity5: '--ts-maturity-5',
129
- } as const;
130
-
131
- export function getBaseResetCss(): string {
132
- return `*,*:before,*:after{box-sizing:border-box;}html,body{margin:0;padding:0;}`;
133
- }
1
+ /** Transitrix brand palette. */
2
+ export const BRAND = {
3
+ petrol: '#004d67',
4
+ amber: '#ffaf00',
5
+ orange: '#ff4d00',
6
+ } as const;
7
+
8
+ /** Functional status colors. */
9
+ export const FUNCTIONAL = {
10
+ success: '#1a7f5c',
11
+ warning: '#c07030',
12
+ error: '#b91c1c',
13
+ info: '#1d6fa8',
14
+ } as const;
15
+
16
+ /** Fill colors for FGCA notation columns. */
17
+ export const LAYER_COLORS = {
18
+ factor: { light: '#fef3c7', dark: '#292108', hc: '#f59e0b' },
19
+ goal: { light: '#e0e7ff', dark: '#1e1b4b', hc: '#818cf8' },
20
+ change: { light: '#dbeafe', dark: '#0c2042', hc: '#60a5fa' },
21
+ activity: { light: '#d4edda', dark: '#0a2414', hc: '#4ade80' },
22
+ } as const;
23
+
24
+ /** Level fill colors for Goals tree nodes — 8 slots, cycled by level index. */
25
+ export const LEVEL_COLORS = {
26
+ light: ['#dbeafe', '#e0e7ff', '#d4edda', '#fef3c7', '#fce7f3', '#e0f2fe', '#f3e8ff', '#fef9c3'],
27
+ dark: ['#0c2042', '#1e1b4b', '#0a2414', '#292108', '#2a0c1f', '#071e2e', '#1a0c33', '#2a2107'],
28
+ hc: ['#60a5fa', '#818cf8', '#4ade80', '#f59e0b', '#f472b6', '#38bdf8', '#a78bfa', '#facc15'],
29
+ } as const;
30
+
31
+ /** Structural diagram colors (nodes, edges, text). */
32
+ export const STRUCTURAL = {
33
+ nodeStroke: { light: '#94a3b8', dark: '#475569', hc: '#e2e8f0' },
34
+ edgeStroke: { light: '#94a3b8', dark: '#475569', hc: '#e2e8f0' },
35
+ textPrimary: { light: '#1e293b', dark: '#f1f5f9', hc: '#ffffff' },
36
+ textSecondary: { light: '#64748b', dark: '#94a3b8', hc: '#cbd5e1' },
37
+ headerText: { light: '#374151', dark: '#e5e7eb', hc: '#ffffff' },
38
+ } as const;
39
+
40
+ /**
41
+ * Maturity scale fill colors — Likert 1..5, danger→success.
42
+ * Used by Capability Map and any future maturity-based notation.
43
+ */
44
+ export const MATURITY_COLORS = {
45
+ light: ['#b91c1c', '#d97706', '#ca8a04', '#65a30d', '#15803d'],
46
+ dark: ['#7f1d1d', '#92400e', '#854d0e', '#3f6212', '#14532d'],
47
+ hc: ['#f87171', '#fb923c', '#facc15', '#a3e635', '#4ade80'],
48
+ } as const;
49
+
50
+ /**
51
+ * Typography hierarchy. All previews resolve text styling from these roles
52
+ * — never from inline font-* attributes on individual <text> elements.
53
+ *
54
+ * fontFamily threads through the VS Code font setting so the preview reads
55
+ * as part of the editor; size + weight encode the visual hierarchy.
56
+ */
57
+ export const TYPOGRAPHY = {
58
+ fontFamily: 'var(--vscode-font-family, system-ui, -apple-system, sans-serif)',
59
+ sizes: {
60
+ header: 13, // stage/column headers, diagram captions
61
+ primary: 12, // primary node/cell labels
62
+ secondary: 11, // annotations, secondary lines, meta
63
+ id: 10, // compact id/code chips
64
+ pill: 11, // pill labels (process-blueprint aspects, badges)
65
+ caption: 11, // figcaption under the canvas
66
+ },
67
+ weights: {
68
+ header: 700,
69
+ primary: 600,
70
+ secondary: 400,
71
+ id: 600,
72
+ pill: 500,
73
+ caption: 400,
74
+ },
75
+ } as const;
76
+
77
+ /** Adaptive shell tokens (background, text, border, status). */
78
+ export interface AdaptiveTokens {
79
+ bg: string;
80
+ bgSurface: string;
81
+ bgElevated: string;
82
+ text: string;
83
+ textMuted: string;
84
+ textInverse: string;
85
+ border: string;
86
+ divider: string;
87
+ statusSuccessBg: string;
88
+ statusSuccessFg: string;
89
+ statusWarningBg: string;
90
+ statusWarningFg: string;
91
+ statusInfoBg: string;
92
+ statusInfoFg: string;
93
+ statusErrorBg: string;
94
+ statusErrorFg: string;
95
+ }
96
+
97
+ /** CSS custom property names for --ts-* variables. */
98
+ export const CSS_VAR = {
99
+ bg: '--ts-bg',
100
+ bgSurface: '--ts-bg-surface',
101
+ bgElevated: '--ts-bg-elevated',
102
+ text: '--ts-text',
103
+ textMuted: '--ts-text-muted',
104
+ textInverse: '--ts-text-inverse',
105
+ border: '--ts-border',
106
+ divider: '--ts-divider',
107
+ statusSuccessBg: '--ts-status-success-bg',
108
+ statusSuccessFg: '--ts-status-success-fg',
109
+ statusWarningBg: '--ts-status-warning-bg',
110
+ statusWarningFg: '--ts-status-warning-fg',
111
+ statusInfoBg: '--ts-status-info-bg',
112
+ statusInfoFg: '--ts-status-info-fg',
113
+ statusErrorBg: '--ts-status-error-bg',
114
+ statusErrorFg: '--ts-status-error-fg',
115
+ layerFactor: '--ts-layer-factor',
116
+ layerGoal: '--ts-layer-goal',
117
+ layerChange: '--ts-layer-change',
118
+ layerActivity: '--ts-layer-activity',
119
+ nodeStroke: '--ts-node-stroke',
120
+ edgeStroke: '--ts-edge-stroke',
121
+ textPrimary: '--ts-text-primary',
122
+ textSecondary: '--ts-text-secondary',
123
+ headerText: '--ts-header-text',
124
+ maturity1: '--ts-maturity-1',
125
+ maturity2: '--ts-maturity-2',
126
+ maturity3: '--ts-maturity-3',
127
+ maturity4: '--ts-maturity-4',
128
+ maturity5: '--ts-maturity-5',
129
+ } as const;
130
+
131
+ export function getBaseResetCss(): string {
132
+ return `*,*:before,*:after{box-sizing:border-box;}html,body{margin:0;padding:0;}`;
133
+ }
package/src/typed-id.ts CHANGED
@@ -1,56 +1,56 @@
1
- // Canonical typed-ID grammar + cross-reference resolution catalogue.
2
- //
3
- // Every element ID and cross-reference in the Transitrix canon follows the
4
- // grammar in methodology `notations/IDS_AND_REFERENCES.md` §1:
5
- //
6
- // <TYPE>-[<middle segment(s)>-]<INTEGER>
7
- //
8
- // - TYPE: uppercase, starts with a letter, may contain digits and `_`
9
- // (multi-word TYPEs like INTERNAL_STANDARD / PROCESS_BLUEPRINT).
10
- // - middle: optional, notation-specific segments.
11
- // - INTEGER: terminal positive integer, no leading zeros.
12
- //
13
- // CAPABILITY is the one exception (§2): its terminal is a V/H diagram address
14
- // (CAPABILITY-V1.2) rather than a plain integer. Compliance artefacts only
15
- // *resolve* capability ids (they never own one), so the catalogue handles
16
- // them; the strict integer-terminal grammar below is used only for an
17
- // artefact's own id (REQUIREMENT-… / ASSERTION-…).
18
-
19
- /** TYPE prefix of a typed id — the segment before the first hyphen. */
20
- const TYPE_PREFIX_RE = /^([A-Z][A-Z0-9_]*)-/;
21
-
22
- /** Full integer-terminal canonical id. Middle segments may be mixed-case
23
- * (real canon ids such as INTERNAL_STANDARD-coding-conventions-1 exist). */
24
- const CANONICAL_ID_RE = /^[A-Z][A-Z0-9_]*(?:-[A-Za-z0-9]+)*-[1-9][0-9]*$/;
25
-
26
- /** Extracts the TYPE prefix of a typed id, or null when `id` is not a typed
27
- * reference (`PRODUCT-MOBILE-1` → `PRODUCT`, `CAPABILITY-V2` → `CAPABILITY`). */
28
- export function typeOfId(id: unknown): string | null {
29
- if (typeof id !== 'string') return null;
30
- const m = TYPE_PREFIX_RE.exec(id);
31
- return m ? m[1] : null;
32
- }
33
-
34
- /** True when `id` is a well-formed integer-terminal canonical id. */
35
- export function isCanonicalId(id: unknown): id is string {
36
- return typeof id === 'string' && CANONICAL_ID_RE.test(id);
37
- }
38
-
39
- /** True when `id` is a well-formed canonical id whose TYPE is exactly `type`. */
40
- export function isCanonicalIdOfType(id: unknown, type: string): boolean {
41
- return isCanonicalId(id) && typeOfId(id) === type;
42
- }
43
-
44
- /**
45
- * A read-only view of an organisation's admitted canon, used to resolve typed
46
- * cross-references during validation. Phase 1 validators accept it optionally:
47
- * with no catalogue they perform shape + prefix-TYPE checks only; given one,
48
- * they additionally enforce the resolution rules (REQ-002, ASSERT-002/004/005…)
49
- * that depend on whether a referenced artefact actually exists.
50
- *
51
- * The compliance previews (Phase 2+) build a catalogue by scanning the repo.
52
- */
53
- export interface CanonCatalog {
54
- /** TYPE of an admitted artefact with this id, or undefined if not admitted. */
55
- typeOf(id: string): string | undefined;
56
- }
1
+ // Canonical typed-ID grammar + cross-reference resolution catalogue.
2
+ //
3
+ // Every element ID and cross-reference in the Transitrix canon follows the
4
+ // grammar in methodology `notations/IDS_AND_REFERENCES.md` §1:
5
+ //
6
+ // <TYPE>-[<middle segment(s)>-]<INTEGER>
7
+ //
8
+ // - TYPE: uppercase, starts with a letter, may contain digits and `_`
9
+ // (multi-word TYPEs like INTERNAL_STANDARD / PROCESS_BLUEPRINT).
10
+ // - middle: optional, notation-specific segments.
11
+ // - INTEGER: terminal positive integer, no leading zeros.
12
+ //
13
+ // CAPABILITY is the one exception (§2): its terminal is a V/H diagram address
14
+ // (CAPABILITY-V1.2) rather than a plain integer. Compliance artefacts only
15
+ // *resolve* capability ids (they never own one), so the catalogue handles
16
+ // them; the strict integer-terminal grammar below is used only for an
17
+ // artefact's own id (REQUIREMENT-… / ASSERTION-…).
18
+
19
+ /** TYPE prefix of a typed id — the segment before the first hyphen. */
20
+ const TYPE_PREFIX_RE = /^([A-Z][A-Z0-9_]*)-/;
21
+
22
+ /** Full integer-terminal canonical id. Middle segments may be mixed-case
23
+ * (real canon ids such as INTERNAL_STANDARD-coding-conventions-1 exist). */
24
+ const CANONICAL_ID_RE = /^[A-Z][A-Z0-9_]*(?:-[A-Za-z0-9]+)*-[1-9][0-9]*$/;
25
+
26
+ /** Extracts the TYPE prefix of a typed id, or null when `id` is not a typed
27
+ * reference (`PRODUCT-MOBILE-1` → `PRODUCT`, `CAPABILITY-V2` → `CAPABILITY`). */
28
+ export function typeOfId(id: unknown): string | null {
29
+ if (typeof id !== 'string') return null;
30
+ const m = TYPE_PREFIX_RE.exec(id);
31
+ return m ? m[1] : null;
32
+ }
33
+
34
+ /** True when `id` is a well-formed integer-terminal canonical id. */
35
+ export function isCanonicalId(id: unknown): id is string {
36
+ return typeof id === 'string' && CANONICAL_ID_RE.test(id);
37
+ }
38
+
39
+ /** True when `id` is a well-formed canonical id whose TYPE is exactly `type`. */
40
+ export function isCanonicalIdOfType(id: unknown, type: string): boolean {
41
+ return isCanonicalId(id) && typeOfId(id) === type;
42
+ }
43
+
44
+ /**
45
+ * A read-only view of an organisation's admitted canon, used to resolve typed
46
+ * cross-references during validation. Phase 1 validators accept it optionally:
47
+ * with no catalogue they perform shape + prefix-TYPE checks only; given one,
48
+ * they additionally enforce the resolution rules (REQ-002, ASSERT-002/004/005…)
49
+ * that depend on whether a referenced artefact actually exists.
50
+ *
51
+ * The compliance previews (Phase 2+) build a catalogue by scanning the repo.
52
+ */
53
+ export interface CanonCatalog {
54
+ /** TYPE of an admitted artefact with this id, or undefined if not admitted. */
55
+ typeOf(id: string): string | undefined;
56
+ }
@@ -1,36 +1,36 @@
1
- /**
2
- * Shared validation result shape across every notation module in this
3
- * package.
4
- *
5
- * Before this file existed, each notation declared its own
6
- * `ValidationError` / `ValidationWarning` / `ValidationResult` triple inside
7
- * its own `validate.ts`. The shapes happened to agree (or almost agree —
8
- * some had an optional `path` field, others didn't), but having N parallel
9
- * declarations made it easy to accidentally drift one of them, and made the
10
- * "what does our validator return?" answer fuzzier than it should be.
11
- *
12
- * The pre-release code review on 2026-05-21 called this out as a
13
- * `should-fix` cross-module concern; this is the canonical shape.
14
- *
15
- * Notations that historically exported PREFIXED type names — `FGCA…` and
16
- * `Activity…` — keep those names as type aliases re-exported from their own
17
- * modules, so existing consumers continue to compile.
18
- */
19
- export interface ValidationError {
20
- code: string;
21
- message: string;
22
- /** Optional JSON-path-ish locator inside the source document. */
23
- path?: string;
24
- }
25
-
26
- export interface ValidationWarning {
27
- code: string;
28
- message: string;
29
- path?: string;
30
- }
31
-
32
- export interface ValidationResult {
33
- valid: boolean;
34
- errors: ValidationError[];
35
- warnings: ValidationWarning[];
36
- }
1
+ /**
2
+ * Shared validation result shape across every notation module in this
3
+ * package.
4
+ *
5
+ * Before this file existed, each notation declared its own
6
+ * `ValidationError` / `ValidationWarning` / `ValidationResult` triple inside
7
+ * its own `validate.ts`. The shapes happened to agree (or almost agree —
8
+ * some had an optional `path` field, others didn't), but having N parallel
9
+ * declarations made it easy to accidentally drift one of them, and made the
10
+ * "what does our validator return?" answer fuzzier than it should be.
11
+ *
12
+ * The pre-release code review on 2026-05-21 called this out as a
13
+ * `should-fix` cross-module concern; this is the canonical shape.
14
+ *
15
+ * Notations that historically exported PREFIXED type names — `FGCA…` and
16
+ * `Activity…` — keep those names as type aliases re-exported from their own
17
+ * modules, so existing consumers continue to compile.
18
+ */
19
+ export interface ValidationError {
20
+ code: string;
21
+ message: string;
22
+ /** Optional JSON-path-ish locator inside the source document. */
23
+ path?: string;
24
+ }
25
+
26
+ export interface ValidationWarning {
27
+ code: string;
28
+ message: string;
29
+ path?: string;
30
+ }
31
+
32
+ export interface ValidationResult {
33
+ valid: boolean;
34
+ errors: ValidationError[];
35
+ warnings: ValidationWarning[];
36
+ }
@@ -1,77 +1,77 @@
1
- /**
2
- * Step 4 parity check: every supported notation must render through the
3
- * webview bundle's `render(kind, source)` API from the same example fixtures
4
- * the VS Code previews consume — a valid document yields `status: 'ok'` with
5
- * non-empty markup, and a malformed document degrades to the error panel
6
- * (structured errors, no thrown exception reaching the JVM host).
7
- */
8
- import { readFileSync } from 'node:fs';
9
- import path from 'node:path';
10
- import { fileURLToPath } from 'node:url';
11
-
12
- import { describe, expect, it } from 'vitest';
13
-
14
- import { api, render, type NotationKind } from '../entry.js';
15
-
16
- const EXAMPLES = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../../tests/fixtures/notation-corpus');
17
-
18
- interface Fixture {
19
- kind: NotationKind;
20
- file: string;
21
- /** The markup wrapper the renderer emits: an <svg> diagram or an HTML <section>. */
22
- markup: 'svg' | 'section';
23
- }
24
-
25
- // Mirrors the fixtures used by the VS Code previews. One representative
26
- // example per notation is enough to prove the dispatch + renderer wiring.
27
- const FIXTURES: Fixture[] = [
28
- { kind: 'goals', file: 'goals/strategy-2026.goals.transitrix.yaml', markup: 'svg' },
29
- { kind: 'fgca', file: 'fgca/strategy-2026.fgca.transitrix.yaml', markup: 'svg' },
30
- { kind: 'fga', file: 'fga/strategy-2026.fga.transitrix.yaml', markup: 'svg' },
31
- { kind: 'activities', file: 'activities/platform-launch.activities.transitrix.yaml', markup: 'svg' },
32
- { kind: 'activity-card', file: 'activity-card/eu-programme.activity-card.transitrix.yaml', markup: 'svg' },
33
- { kind: 'process-blueprint', file: 'process-blueprint/order-fulfilment.process-blueprint.transitrix.yaml', markup: 'svg' },
34
- { kind: 'blocks', file: 'blocks/architecture.blocks.transitrix.yaml', markup: 'svg' },
35
- { kind: 'applications', file: 'applications/portfolio-2026.applications.transitrix.yaml', markup: 'section' },
36
- { kind: 'products', file: 'products/portfolio-2026.products.transitrix.yaml', markup: 'section' },
37
- { kind: 'process-map', file: 'process-map/enterprise.process-map.transitrix.yaml', markup: 'section' },
38
- { kind: 'scenarios', file: 'scenarios/omnichannel-2028.scenarios.transitrix.yaml', markup: 'section' },
39
- { kind: 'capability-map', file: 'capability-map/business.capability-map.transitrix.yaml', markup: 'section' },
40
- ];
41
-
42
- describe('webview/entry — Step 4 notation coverage', () => {
43
- it('wires every supported kind (no kind left on NOTATION-NOT-WIRED)', () => {
44
- // The fixture table must cover the full supported-kinds surface, so a new
45
- // kind added to the bundle without a renderer fails this test loudly.
46
- const covered = new Set(FIXTURES.map((f) => f.kind));
47
- for (const kind of api.supportedKinds) {
48
- expect(covered.has(kind)).toBe(true);
49
- }
50
- });
51
-
52
- for (const fx of FIXTURES) {
53
- it(`renders ${fx.kind} from its example fixture`, () => {
54
- const source = readFileSync(path.join(EXAMPLES, fx.file), 'utf8');
55
- const r = render(fx.kind, source);
56
- expect(r.notation).toBe(fx.kind);
57
- expect(r.errors).toEqual([]);
58
- expect(r.status).toBe('ok');
59
- expect(r.svg.length).toBeGreaterThan(0);
60
- expect(r.svg).toContain(fx.markup === 'svg' ? '<svg ' : '<section');
61
- });
62
- }
63
-
64
- it('degrades malformed input to the error panel for a diagram notation', () => {
65
- const r = render('process-blueprint', 'process_blueprint:\n stages: "not a list"\n');
66
- expect(r.status).toBe('error');
67
- expect(r.errors.length).toBeGreaterThan(0);
68
- expect(r.svg).toBe('');
69
- });
70
-
71
- it('degrades malformed input to the error panel for a catalogue notation', () => {
72
- const r = render('applications', 'applications_catalogue:\n applications: "not a list"\n');
73
- expect(r.status).toBe('error');
74
- expect(r.errors.length).toBeGreaterThan(0);
75
- expect(r.svg).toBe('');
76
- });
77
- });
1
+ /**
2
+ * Step 4 parity check: every supported notation must render through the
3
+ * webview bundle's `render(kind, source)` API from the same example fixtures
4
+ * the VS Code previews consume — a valid document yields `status: 'ok'` with
5
+ * non-empty markup, and a malformed document degrades to the error panel
6
+ * (structured errors, no thrown exception reaching the JVM host).
7
+ */
8
+ import { readFileSync } from 'node:fs';
9
+ import path from 'node:path';
10
+ import { fileURLToPath } from 'node:url';
11
+
12
+ import { describe, expect, it } from 'vitest';
13
+
14
+ import { api, render, type NotationKind } from '../entry.js';
15
+
16
+ const EXAMPLES = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../../../../../tests/fixtures/notation-corpus');
17
+
18
+ interface Fixture {
19
+ kind: NotationKind;
20
+ file: string;
21
+ /** The markup wrapper the renderer emits: an <svg> diagram or an HTML <section>. */
22
+ markup: 'svg' | 'section';
23
+ }
24
+
25
+ // Mirrors the fixtures used by the VS Code previews. One representative
26
+ // example per notation is enough to prove the dispatch + renderer wiring.
27
+ const FIXTURES: Fixture[] = [
28
+ { kind: 'goals', file: 'goals/strategy-2026.goals.transitrix.yaml', markup: 'svg' },
29
+ { kind: 'fgca', file: 'fgca/strategy-2026.fgca.transitrix.yaml', markup: 'svg' },
30
+ { kind: 'fga', file: 'fga/strategy-2026.fga.transitrix.yaml', markup: 'svg' },
31
+ { kind: 'activities', file: 'activities/platform-launch.activities.transitrix.yaml', markup: 'svg' },
32
+ { kind: 'activity-card', file: 'activity-card/eu-programme.activity-card.transitrix.yaml', markup: 'svg' },
33
+ { kind: 'process-blueprint', file: 'process-blueprint/order-fulfilment.process-blueprint.transitrix.yaml', markup: 'svg' },
34
+ { kind: 'blocks', file: 'blocks/architecture.blocks.transitrix.yaml', markup: 'svg' },
35
+ { kind: 'applications', file: 'applications/portfolio-2026.applications.transitrix.yaml', markup: 'section' },
36
+ { kind: 'products', file: 'products/portfolio-2026.products.transitrix.yaml', markup: 'section' },
37
+ { kind: 'process-map', file: 'process-map/enterprise.process-map.transitrix.yaml', markup: 'section' },
38
+ { kind: 'scenarios', file: 'scenarios/omnichannel-2028.scenarios.transitrix.yaml', markup: 'section' },
39
+ { kind: 'capability-map', file: 'capability-map/business.capability-map.transitrix.yaml', markup: 'section' },
40
+ ];
41
+
42
+ describe('webview/entry — Step 4 notation coverage', () => {
43
+ it('wires every supported kind (no kind left on NOTATION-NOT-WIRED)', () => {
44
+ // The fixture table must cover the full supported-kinds surface, so a new
45
+ // kind added to the bundle without a renderer fails this test loudly.
46
+ const covered = new Set(FIXTURES.map((f) => f.kind));
47
+ for (const kind of api.supportedKinds) {
48
+ expect(covered.has(kind)).toBe(true);
49
+ }
50
+ });
51
+
52
+ for (const fx of FIXTURES) {
53
+ it(`renders ${fx.kind} from its example fixture`, () => {
54
+ const source = readFileSync(path.join(EXAMPLES, fx.file), 'utf8');
55
+ const r = render(fx.kind, source);
56
+ expect(r.notation).toBe(fx.kind);
57
+ expect(r.errors).toEqual([]);
58
+ expect(r.status).toBe('ok');
59
+ expect(r.svg.length).toBeGreaterThan(0);
60
+ expect(r.svg).toContain(fx.markup === 'svg' ? '<svg ' : '<section');
61
+ });
62
+ }
63
+
64
+ it('degrades malformed input to the error panel for a diagram notation', () => {
65
+ const r = render('process-blueprint', 'process_blueprint:\n stages: "not a list"\n');
66
+ expect(r.status).toBe('error');
67
+ expect(r.errors.length).toBeGreaterThan(0);
68
+ expect(r.svg).toBe('');
69
+ });
70
+
71
+ it('degrades malformed input to the error panel for a catalogue notation', () => {
72
+ const r = render('applications', 'applications_catalogue:\n applications: "not a list"\n');
73
+ expect(r.status).toBe('error');
74
+ expect(r.errors.length).toBeGreaterThan(0);
75
+ expect(r.svg).toBe('');
76
+ });
77
+ });