@hippo-digital/hippocampus 1.0.0-rc.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 (116) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/LICENSE +21 -0
  3. package/README.md +153 -0
  4. package/assets/dist/hippocampus.css +1 -0
  5. package/assets/hippocampus.scss +896 -0
  6. package/assets/javascript/blueprint.js +123 -0
  7. package/bin/hippocampus.js +106 -0
  8. package/docs/agent-roadmap.md +217 -0
  9. package/docs/agent-workflow.md +56 -0
  10. package/docs/agentic-patterns-to-port.md +273 -0
  11. package/docs/colour-pairings.md +41 -0
  12. package/docs/components.md +52 -0
  13. package/docs/copilot-ncrs-research-curator-agent.md +298 -0
  14. package/docs/custom-agents-usage.md +95 -0
  15. package/docs/design-actions-and-decisions.md +95 -0
  16. package/docs/gp-connect-real-data-to-production.md +66 -0
  17. package/docs/hippocampus-for-designers-and-researchers.md +261 -0
  18. package/docs/hippocampus-technical.md +373 -0
  19. package/docs/prompt-architecture-guardrails.md +39 -0
  20. package/docs/repeatable-research-round-ingestion.md +239 -0
  21. package/docs/research-knowledge-graph.md +552 -0
  22. package/docs/research-source-file-conventions.md +121 -0
  23. package/docs/source-model.md +252 -0
  24. package/index.js +47 -0
  25. package/lib/config.js +46 -0
  26. package/lib/context.js +59 -0
  27. package/lib/create-router.js +187 -0
  28. package/lib/discover-projects.js +45 -0
  29. package/lib/docs.js +72 -0
  30. package/lib/host-edit.js +151 -0
  31. package/lib/lint-knowledge.js +133 -0
  32. package/lib/load-knowledge.js +629 -0
  33. package/lib/package-paths.js +32 -0
  34. package/lib/paths.js +33 -0
  35. package/lib/resolve-root.js +84 -0
  36. package/lib/schema-version.js +96 -0
  37. package/lib/schema.js +346 -0
  38. package/package.json +70 -0
  39. package/scripts/audit-provenance.js +147 -0
  40. package/scripts/doctor.js +114 -0
  41. package/scripts/eject.js +51 -0
  42. package/scripts/import-blueprint-spreadsheet.js +242 -0
  43. package/scripts/import-design-actions.js +230 -0
  44. package/scripts/import-project-context.js +427 -0
  45. package/scripts/import-research-batch.js +160 -0
  46. package/scripts/import-research-deck.js +448 -0
  47. package/scripts/index-source-artefacts.js +261 -0
  48. package/scripts/init.js +232 -0
  49. package/scripts/install-skills.js +160 -0
  50. package/scripts/lib/artefact-text.js +347 -0
  51. package/scripts/lib/xlsx-grid.js +114 -0
  52. package/scripts/link-insights-to-needs.js +209 -0
  53. package/scripts/migrate-knowledge.js +73 -0
  54. package/scripts/promote-project-context-draft.js +125 -0
  55. package/scripts/promote-research-draft.js +236 -0
  56. package/scripts/smoke-routes.js +157 -0
  57. package/scripts/sync-project-context.js +236 -0
  58. package/scripts/sync-research-artefacts.js +294 -0
  59. package/scripts/triage-research-corpus.js +274 -0
  60. package/scripts/validate-knowledge.js +49 -0
  61. package/scripts/validate-skills.js +247 -0
  62. package/skills/COVERAGE-MATRIX.md +39 -0
  63. package/skills/README.md +77 -0
  64. package/skills/SKILL-FORMAT.md +100 -0
  65. package/skills/add-prototype-screen.skill.md +54 -0
  66. package/skills/add-scenario.skill.md +47 -0
  67. package/skills/add-user-needs.skill.md +51 -0
  68. package/skills/audit-knowledge-source.skill.md +47 -0
  69. package/skills/capture-route-review-pack.skill.md +52 -0
  70. package/skills/create-journey-from-scenario.skill.md +50 -0
  71. package/skills/deliver-service-slice.skill.md +65 -0
  72. package/skills/examples/README.md +15 -0
  73. package/skills/examples/non-copilot-research-ingestion.md +68 -0
  74. package/skills/examples/non-copilot-service-slice.md +64 -0
  75. package/skills/generate-service-slice.skill.md +57 -0
  76. package/skills/ingest-project-context.skill.md +58 -0
  77. package/skills/ingest-research-round.skill.md +60 -0
  78. package/skills/map-research-to-graph.skill.md +58 -0
  79. package/skills/record-accessibility-review.skill.md +52 -0
  80. package/skills/record-design-decision.skill.md +53 -0
  81. package/skills/review-research-import-draft.skill.md +45 -0
  82. package/skills/skills.json +464 -0
  83. package/skills/skills.schema.json +111 -0
  84. package/skills/structure-project-context-draft.skill.md +51 -0
  85. package/skills/structure-research-draft.skill.md +51 -0
  86. package/skills/triage-research-corpus.skill.md +51 -0
  87. package/skills/write-delivery-summary.skill.md +51 -0
  88. package/skills/write-route-review-summary.skill.md +55 -0
  89. package/views/hippocampus/_layout.html +45 -0
  90. package/views/hippocampus/blueprint-classic.html +39 -0
  91. package/views/hippocampus/blueprint.html +52 -0
  92. package/views/hippocampus/components/_blueprint-cell.njk +42 -0
  93. package/views/hippocampus/components/_blueprint-controls.njk +20 -0
  94. package/views/hippocampus/components/_blueprint-minimap.njk +14 -0
  95. package/views/hippocampus/components/_empty-state.njk +12 -0
  96. package/views/hippocampus/components/_journey-step.njk +21 -0
  97. package/views/hippocampus/components/_list.njk +23 -0
  98. package/views/hippocampus/components/_summary-card.njk +15 -0
  99. package/views/hippocampus/doc.html +11 -0
  100. package/views/hippocampus/docs.html +19 -0
  101. package/views/hippocampus/evidence-impact.html +53 -0
  102. package/views/hippocampus/graph.html +48 -0
  103. package/views/hippocampus/handover-empty.html +12 -0
  104. package/views/hippocampus/handover.html +56 -0
  105. package/views/hippocampus/index.html +46 -0
  106. package/views/hippocampus/journey-flow.html +31 -0
  107. package/views/hippocampus/journey.html +23 -0
  108. package/views/hippocampus/not-found.html +10 -0
  109. package/views/hippocampus/project.html +102 -0
  110. package/views/hippocampus/research.html +68 -0
  111. package/views/hippocampus/route-review.html +83 -0
  112. package/views/hippocampus/scenarios.html +56 -0
  113. package/views/hippocampus/trace.html +113 -0
  114. package/views/hippocampus/user-needs.html +32 -0
  115. package/views/hippocampus/user.html +157 -0
  116. package/views/hippocampus/users.html +32 -0
@@ -0,0 +1,896 @@
1
+ // Visual identity for the Hippocampus knowledge-base pages, deliberately
2
+ // distinct from the citizen-facing NHS.UK look (see docs/colour-pairings.md
3
+ // for the accent colour source). Scoped to .knowledge-admin-theme, a body
4
+ // class set only by create-router.js's middleware - /patient and /policy
5
+ // prototype screens don't get this class, so they keep the standard look.
6
+ .knowledge-admin-theme {
7
+ background: #f6f5f2;
8
+ font-family: -apple-system, "Segoe UI", Roboto, Arial, sans-serif;
9
+ }
10
+
11
+ .knowledge-admin-theme .nhsuk-header {
12
+ background: #1c1c1a;
13
+ }
14
+
15
+ .knowledge-admin-theme h1,
16
+ .knowledge-admin-theme h2,
17
+ .knowledge-admin-theme h3,
18
+ .knowledge-admin-theme h4 {
19
+ font-weight: 600;
20
+ letter-spacing: -0.01em;
21
+ }
22
+
23
+ .knowledge-admin-theme .nhsuk-caption-l {
24
+ color: #706f68;
25
+ font-size: 14px;
26
+ font-weight: 700;
27
+ letter-spacing: 0.04em;
28
+ text-transform: uppercase;
29
+ }
30
+
31
+ .knowledge-admin-theme a {
32
+ color: #00726b;
33
+ }
34
+
35
+ .knowledge-admin-theme .nhsuk-back-link,
36
+ .knowledge-admin-theme .nhsuk-back-link__icon {
37
+ color: #00726b;
38
+ }
39
+
40
+ .knowledge-admin-theme .knowledge-card,
41
+ .knowledge-admin-theme .knowledge-section,
42
+ .knowledge-admin-theme .knowledge-blueprint-step,
43
+ .knowledge-admin-theme .knowledge-linked-block {
44
+ background: #ffffff;
45
+ border-color: #e3e1d9;
46
+ border-radius: 3px;
47
+ box-shadow: none;
48
+ }
49
+
50
+ .knowledge-admin-theme .knowledge-card__meta,
51
+ .knowledge-admin-theme .knowledge-muted {
52
+ color: #8c8a80;
53
+ font-family: ui-monospace, "SF Mono", Consolas, monospace;
54
+ font-size: 12px;
55
+ letter-spacing: 0.03em;
56
+ text-transform: uppercase;
57
+ }
58
+
59
+ .knowledge-admin-theme .nhsuk-button {
60
+ background: #1c1c1a;
61
+ border-radius: 2px;
62
+ }
63
+
64
+ .knowledge-admin-theme .nhsuk-button--secondary {
65
+ background: transparent;
66
+ border-color: #1c1c1a;
67
+ color: #1c1c1a;
68
+ }
69
+
70
+ .knowledge-admin-theme .nhsuk-tag {
71
+ border-radius: 2px;
72
+ }
73
+
74
+ .knowledge-admin-theme code {
75
+ background: #e6f6f5;
76
+ font-family: ui-monospace, "SF Mono", Consolas, monospace;
77
+ }
78
+
79
+ .knowledge-grid {
80
+ display: grid;
81
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
82
+ gap: 16px;
83
+ margin-top: 32px;
84
+ }
85
+
86
+ .knowledge-list {
87
+ display: grid;
88
+ gap: 16px;
89
+ }
90
+
91
+ .knowledge-card,
92
+ .knowledge-section,
93
+ .knowledge-blueprint-step {
94
+ border: 1px solid #d8dde0;
95
+ padding: 24px;
96
+ margin-bottom: 24px;
97
+ background: #ffffff;
98
+ }
99
+
100
+ // Cards, linked blocks, timeline items and the page lede are all prose, not
101
+ // tables or grids - they stay readable inside the fluid-width container by
102
+ // capping at a comfortable measure, same as the blueprint and trace fixes.
103
+ .knowledge-card,
104
+ .knowledge-linked-block,
105
+ .knowledge-timeline__item,
106
+ .knowledge-admin-theme .nhsuk-lede-text {
107
+ max-width: 70ch;
108
+ }
109
+
110
+ // Several pages (users, scenarios, research, project) put paragraphs and
111
+ // bulleted/numbered prose lists directly inside a section rather than a
112
+ // card - cap those too. `.nhsuk-list--bullet`/`--number` are shared NHS.UK
113
+ // classes that a host prototype also uses, so they are scoped to the
114
+ // knowledge-admin-theme body class rather than applied everywhere.
115
+ .knowledge-section > p,
116
+ .knowledge-admin-theme .nhsuk-list--bullet,
117
+ .knowledge-admin-theme .nhsuk-list--number {
118
+ max-width: 70ch;
119
+ }
120
+
121
+ .knowledge-card__meta {
122
+ color: #4c6272;
123
+ font-size: 16px;
124
+ margin-bottom: 8px;
125
+ }
126
+
127
+ .knowledge-timeline {
128
+ list-style: none;
129
+ padding-left: 0;
130
+ }
131
+
132
+ .knowledge-timeline__item {
133
+ border-left: 4px solid #005eb8;
134
+ padding-left: 24px;
135
+ margin-bottom: 32px;
136
+ }
137
+
138
+ .knowledge-admin-theme .knowledge-timeline__item {
139
+ border-left-color: #00726b;
140
+ }
141
+
142
+ .knowledge-blueprint-step__header {
143
+ align-items: flex-start;
144
+ display: flex;
145
+ justify-content: space-between;
146
+ gap: 16px;
147
+ }
148
+
149
+ .knowledge-lane {
150
+ border-top: 1px solid #d8dde0;
151
+ display: grid;
152
+ grid-template-columns: 220px minmax(0, 1fr);
153
+ gap: 24px;
154
+ padding: 16px 0;
155
+ }
156
+
157
+ // An author stylesheet's `display` always wins over the browser's default
158
+ // `[hidden] { display: none }` UA rule, regardless of selector specificity -
159
+ // so setting `display: grid` above silently breaks the `hidden` attribute
160
+ // unless it's overridden again explicitly here.
161
+ .knowledge-lane[hidden] {
162
+ display: none;
163
+ }
164
+
165
+ .knowledge-lane__label h3 {
166
+ font-size: 16px;
167
+ margin: 0;
168
+ }
169
+
170
+ .knowledge-lane__content {
171
+ // Keep prose readable even inside the fluid-width container - a wide
172
+ // table benefits from the extra space, but a paragraph stretched across
173
+ // 100+ characters per line doesn't.
174
+ max-width: 70ch;
175
+ }
176
+
177
+ .knowledge-lane__content > :last-child {
178
+ margin-bottom: 0;
179
+ }
180
+
181
+ .knowledge-boundary {
182
+ border-top: 2px dashed #005eb8;
183
+ color: #005eb8;
184
+ font-size: 14px;
185
+ font-weight: 700;
186
+ letter-spacing: 0.04em;
187
+ padding-top: 8px;
188
+ text-transform: uppercase;
189
+ }
190
+
191
+ .knowledge-admin-theme .knowledge-boundary {
192
+ border-top-color: #00726b;
193
+ color: #00726b;
194
+ }
195
+
196
+ .knowledge-tagged-item {
197
+ border-left: 4px solid #768692;
198
+ margin-bottom: 8px;
199
+ padding: 8px 12px;
200
+ background: #f0f4f5;
201
+ }
202
+
203
+ .knowledge-tagged-item strong {
204
+ display: block;
205
+ font-size: 14px;
206
+ }
207
+
208
+ .knowledge-tagged-item--high {
209
+ border-left-color: #d5281b;
210
+ background: #fbeae5;
211
+ }
212
+
213
+ .knowledge-tagged-item--medium {
214
+ border-left-color: #ffb81c;
215
+ background: #fff9e6;
216
+ }
217
+
218
+ // Orange, dark / Orange pairings from docs/colour-pairings.md - a clear
219
+ // dark-to-light severity progression that doesn't reuse Warm yellow, which
220
+ // already means Journey/Screen/Decision in the graph and trace views.
221
+ .knowledge-admin-theme .knowledge-tagged-item--high {
222
+ border-left-color: #8e5300;
223
+ background: #fdf3e6;
224
+ }
225
+
226
+ .knowledge-admin-theme .knowledge-tagged-item--medium {
227
+ border-left-color: #ed8b00;
228
+ background: #fdf3e6;
229
+ }
230
+
231
+ .knowledge-linked-block {
232
+ border-top: 1px solid #d8dde0;
233
+ padding-top: 24px;
234
+ margin-top: 24px;
235
+ }
236
+
237
+ .knowledge-linked-block:first-of-type {
238
+ border-top: 0;
239
+ padding-top: 0;
240
+ margin-top: 0;
241
+ }
242
+
243
+ .knowledge-linked-block__detail {
244
+ background: #f0f4f5;
245
+ margin: 24px 0;
246
+ padding: 16px;
247
+ }
248
+
249
+ .knowledge-graph-summary {
250
+ display: grid;
251
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
252
+ gap: 12px;
253
+ margin: 24px 0;
254
+ }
255
+
256
+ .knowledge-graph-summary div {
257
+ background: #f0f4f5;
258
+ border-left: 4px solid #005eb8;
259
+ padding: 12px;
260
+ }
261
+
262
+ // Aqua green, dark post-it + tint pairing from docs/colour-pairings.md,
263
+ // used together the way the reference sheet intends (accent + matching
264
+ // light fill), rather than just swapping the accent colour alone.
265
+ .knowledge-admin-theme .knowledge-graph-summary div {
266
+ background: #e6f6f5;
267
+ border-left-color: #00726b;
268
+ }
269
+
270
+ .knowledge-graph-summary strong,
271
+ .knowledge-graph-summary span {
272
+ display: block;
273
+ }
274
+
275
+ .knowledge-graph-summary strong {
276
+ font-size: 28px;
277
+ line-height: 1;
278
+ }
279
+
280
+ .knowledge-graph-summary span {
281
+ color: #4c6272;
282
+ font-size: 14px;
283
+ margin-top: 4px;
284
+ }
285
+
286
+ .knowledge-graph {
287
+ display: grid;
288
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
289
+ gap: 12px;
290
+ margin-top: 24px;
291
+ }
292
+
293
+ .knowledge-graph__node {
294
+ border: 1px solid #d8dde0;
295
+ border-top: 4px solid #768692;
296
+ padding: 12px;
297
+ }
298
+
299
+ .knowledge-graph__node strong,
300
+ .knowledge-graph__node span {
301
+ display: block;
302
+ }
303
+
304
+ .knowledge-graph__node strong {
305
+ color: #4c6272;
306
+ font-size: 14px;
307
+ margin-bottom: 4px;
308
+ }
309
+
310
+ .knowledge-graph__node span {
311
+ font-size: 16px;
312
+ }
313
+
314
+ .knowledge-graph__node--user {
315
+ border-top-color: #005eb8;
316
+ }
317
+
318
+ .knowledge-graph__node--scenario {
319
+ border-top-color: #d5281b;
320
+ }
321
+
322
+ .knowledge-graph__node--need {
323
+ border-top-color: #007f3b;
324
+ }
325
+
326
+ .knowledge-graph__node--evidence {
327
+ border-top-color: #7c2855;
328
+ }
329
+
330
+ // User, Evidence, and Journey/Screen/Decision already match NHS blue, Dark
331
+ // pink and Warm yellow from docs/colour-pairings.md, so only Scenario (not
332
+ // in the palette at all) and Need (close but not exact) need adjusting.
333
+ .knowledge-admin-theme .knowledge-graph__node--scenario {
334
+ border-top-color: #330072;
335
+ }
336
+
337
+ .knowledge-admin-theme .knowledge-graph__node--need {
338
+ border-top-color: #006747;
339
+ }
340
+
341
+ .knowledge-graph__node--journey,
342
+ .knowledge-graph__node--screen,
343
+ .knowledge-graph__node--decision {
344
+ border-top-color: #ffb81c;
345
+ }
346
+
347
+ .knowledge-edge-list {
348
+ display: grid;
349
+ gap: 8px;
350
+ }
351
+
352
+ .knowledge-edge-list li {
353
+ background: #f0f4f5;
354
+ display: grid;
355
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
356
+ gap: 12px;
357
+ padding: 12px;
358
+ }
359
+
360
+ .knowledge-edge-list span {
361
+ color: #4c6272;
362
+ font-size: 14px;
363
+ font-weight: 700;
364
+ text-transform: uppercase;
365
+ }
366
+
367
+ .knowledge-trace-controls {
368
+ display: flex;
369
+ flex-wrap: wrap;
370
+ align-items: flex-end;
371
+ gap: 16px 24px;
372
+ margin-bottom: 0;
373
+ }
374
+
375
+ .knowledge-trace-controls__field {
376
+ display: flex;
377
+ flex-direction: column;
378
+ width: 100%;
379
+ max-width: 320px;
380
+ }
381
+
382
+ .knowledge-trace-controls__field .nhsuk-label {
383
+ margin-bottom: 4px;
384
+ }
385
+
386
+ .knowledge-trace-controls__submit {
387
+ margin: 0;
388
+ }
389
+
390
+ .knowledge-trace-timeline,
391
+ .knowledge-trace-children {
392
+ list-style: none;
393
+ margin: 0;
394
+ padding-left: 0;
395
+ }
396
+
397
+ .knowledge-trace-timeline {
398
+ position: relative;
399
+ }
400
+
401
+ .knowledge-trace-timeline::before {
402
+ background: #005eb8;
403
+ bottom: 0;
404
+ content: "";
405
+ left: 13px;
406
+ position: absolute;
407
+ top: 8px;
408
+ width: 4px;
409
+ }
410
+
411
+ .knowledge-trace-group,
412
+ .knowledge-trace-item {
413
+ position: relative;
414
+ }
415
+
416
+ .knowledge-trace-group {
417
+ padding-left: 48px;
418
+ }
419
+
420
+ .knowledge-trace-group__content {
421
+ margin-bottom: 24px;
422
+ }
423
+
424
+ .knowledge-trace-group__content h3 {
425
+ margin-bottom: 16px;
426
+ }
427
+
428
+ .knowledge-trace-children {
429
+ display: grid;
430
+ gap: 16px;
431
+ }
432
+
433
+ .knowledge-trace-children .knowledge-trace-children {
434
+ border-left: 2px solid #d8dde0;
435
+ margin-top: 16px;
436
+ padding-left: 24px;
437
+ }
438
+
439
+ .knowledge-trace-item {
440
+ padding-left: 48px;
441
+ }
442
+
443
+ .knowledge-trace-item__marker {
444
+ background: #ffffff;
445
+ border: 4px solid #005eb8;
446
+ border-radius: 50%;
447
+ height: 20px;
448
+ left: 3px;
449
+ position: absolute;
450
+ top: 4px;
451
+ width: 20px;
452
+ }
453
+
454
+ .knowledge-trace-children .knowledge-trace-item__marker {
455
+ border-color: #768692;
456
+ }
457
+
458
+ .knowledge-trace-item__content {
459
+ max-width: 70ch;
460
+ border-top: 1px solid #d8dde0;
461
+ padding: 16px 0 8px;
462
+ }
463
+
464
+ .knowledge-trace-item--selected .knowledge-trace-item__content {
465
+ background: #f0f4f5;
466
+ border-left: 4px solid #005eb8;
467
+ border-top: 0;
468
+ margin: 8px 0 32px;
469
+ padding: 16px;
470
+ }
471
+
472
+ .knowledge-trace-item--selected .knowledge-trace-item__marker {
473
+ background: #005eb8;
474
+ }
475
+
476
+ .knowledge-admin-theme .knowledge-trace-timeline::before {
477
+ background: #00726b;
478
+ }
479
+
480
+ .knowledge-admin-theme .knowledge-trace-item__marker {
481
+ border-color: #00726b;
482
+ }
483
+
484
+ // Higher specificity than the rule above, so nested/child markers stay
485
+ // grey (their existing, deliberate "seen before" treatment) rather than
486
+ // picking up the teal accent meant for top-level trace items.
487
+ .knowledge-admin-theme .knowledge-trace-children .knowledge-trace-item__marker {
488
+ border-color: #768692;
489
+ }
490
+
491
+ .knowledge-admin-theme .knowledge-trace-item--selected .knowledge-trace-item__content {
492
+ border-left-color: #00726b;
493
+ }
494
+
495
+ .knowledge-admin-theme .knowledge-trace-item--selected .knowledge-trace-item__marker {
496
+ background: #00726b;
497
+ }
498
+
499
+ .knowledge-trace-item__date {
500
+ color: #4c6272;
501
+ font-size: 16px;
502
+ font-weight: 700;
503
+ margin-bottom: 4px;
504
+ }
505
+
506
+ .knowledge-trace-item__heading {
507
+ font-size: 22px;
508
+ margin: 0 0 8px;
509
+ }
510
+
511
+ .knowledge-trace-item__type {
512
+ display: inline-block;
513
+ padding: 2px 10px;
514
+ margin-bottom: 8px;
515
+ font-size: 14px;
516
+ font-weight: 700;
517
+ color: #fff;
518
+ background: #768692;
519
+ border-radius: 12px;
520
+ }
521
+
522
+ .knowledge-trace-item__type--user {
523
+ background: #005eb8;
524
+ }
525
+
526
+ .knowledge-trace-item__type--scenario {
527
+ background: #d5281b;
528
+ }
529
+
530
+ .knowledge-trace-item__type--need {
531
+ background: #007f3b;
532
+ }
533
+
534
+ .knowledge-admin-theme .knowledge-trace-item__type--scenario {
535
+ background: #330072;
536
+ }
537
+
538
+ .knowledge-admin-theme .knowledge-trace-item__type--need {
539
+ background: #006747;
540
+ }
541
+
542
+ .knowledge-trace-item__type--evidence {
543
+ background: #7c2855;
544
+ }
545
+
546
+ .knowledge-trace-item__type--journey,
547
+ .knowledge-trace-item__type--screen,
548
+ .knowledge-trace-item__type--decision {
549
+ color: #212b32;
550
+ background: #ffb81c;
551
+ }
552
+
553
+ .knowledge-trace-item__relationship {
554
+ color: #4c6272;
555
+ font-size: 16px;
556
+ margin-bottom: 4px;
557
+ }
558
+
559
+ .knowledge-trace-item__relationship strong {
560
+ color: #212b32;
561
+ }
562
+
563
+ .knowledge-muted {
564
+ color: #4c6272;
565
+ }
566
+
567
+ // Confidence is its own high/medium/low scale, not a severity - a
568
+ // deliberately different colour family (blue/teal, not orange) from
569
+ // .knowledge-tagged-item so the two ratings don't read as the same thing
570
+ // when they appear near each other. See docs/colour-pairings.md.
571
+ .knowledge-confidence-tag {
572
+ display: inline-block;
573
+ padding: 2px 8px;
574
+ font-size: 13px;
575
+ font-weight: 700;
576
+ border-radius: 10px;
577
+ }
578
+
579
+ .knowledge-confidence-tag--high {
580
+ color: #00726b;
581
+ background: #e6f6f5;
582
+ }
583
+
584
+ .knowledge-confidence-tag--medium {
585
+ color: #00758f;
586
+ background: #e6f6fa;
587
+ }
588
+
589
+ .knowledge-confidence-tag--low {
590
+ color: #4c6272;
591
+ background: #f0f4f5;
592
+ }
593
+
594
+ .knowledge-matrix-wrap {
595
+ overflow-x: auto;
596
+ }
597
+
598
+ .knowledge-matrix {
599
+ border-collapse: collapse;
600
+ min-width: 1200px;
601
+ width: 100%;
602
+ }
603
+
604
+ .knowledge-matrix th,
605
+ .knowledge-matrix td {
606
+ border: 1px solid #d8dde0;
607
+ padding: 12px;
608
+ text-align: left;
609
+ vertical-align: top;
610
+ }
611
+
612
+ .knowledge-matrix thead th,
613
+ .knowledge-matrix tbody th {
614
+ background: #f0f4f5;
615
+ }
616
+
617
+ .knowledge-matrix__boundary td {
618
+ border-top: 2px dashed #005eb8;
619
+ color: #005eb8;
620
+ font-weight: 700;
621
+ text-transform: uppercase;
622
+ }
623
+
624
+ .knowledge-admin-theme .knowledge-matrix__boundary td {
625
+ border-top-color: #00726b;
626
+ color: #00726b;
627
+ }
628
+
629
+ .knowledge-blueprint-controls {
630
+ position: sticky;
631
+ top: 0;
632
+ z-index: 2;
633
+ display: flex;
634
+ flex-wrap: wrap;
635
+ gap: 16px 24px;
636
+ align-items: flex-start;
637
+ padding: 12px 0;
638
+ margin-bottom: 24px;
639
+ background: #fff;
640
+ border-bottom: 1px solid #d8dde0;
641
+ }
642
+
643
+ .knowledge-blueprint-controls__lenses {
644
+ display: flex;
645
+ flex-wrap: wrap;
646
+ gap: 8px;
647
+ }
648
+
649
+ .knowledge-lens-btn {
650
+ padding: 6px 14px;
651
+ font: inherit;
652
+ color: #005eb8;
653
+ background: #fff;
654
+ border: 2px solid #005eb8;
655
+ border-radius: 20px;
656
+ cursor: pointer;
657
+ }
658
+
659
+ .knowledge-lens-btn[aria-pressed="true"] {
660
+ color: #fff;
661
+ background: #005eb8;
662
+ }
663
+
664
+ .knowledge-admin-theme .knowledge-lens-btn {
665
+ color: #00726b;
666
+ border-color: #00726b;
667
+ }
668
+
669
+ .knowledge-admin-theme .knowledge-lens-btn[aria-pressed="true"] {
670
+ background: #00726b;
671
+ }
672
+
673
+ .knowledge-blueprint-controls__lanes {
674
+ display: flex;
675
+ flex-wrap: wrap;
676
+ gap: 8px 16px;
677
+ padding: 0;
678
+ margin: 0;
679
+ border: 0;
680
+ }
681
+
682
+ .knowledge-blueprint-controls__lanes legend {
683
+ width: 100%;
684
+ font-size: 14px;
685
+ font-weight: 700;
686
+ }
687
+
688
+ .knowledge-lane-toggle {
689
+ display: inline-flex;
690
+ align-items: center;
691
+ gap: 4px;
692
+ font-size: 14px;
693
+ }
694
+
695
+ .knowledge-blueprint-layout {
696
+ display: grid;
697
+ grid-template-columns: 72px 1fr;
698
+ gap: 24px;
699
+ }
700
+
701
+ .knowledge-blueprint-minimap {
702
+ position: sticky;
703
+ top: 64px;
704
+ align-self: start;
705
+ }
706
+
707
+ .knowledge-blueprint-minimap ul {
708
+ position: relative;
709
+ padding: 0;
710
+ margin: 0;
711
+ list-style: none;
712
+ }
713
+
714
+ .knowledge-blueprint-minimap ul::before {
715
+ position: absolute;
716
+ top: 16px;
717
+ bottom: 16px;
718
+ left: 15px;
719
+ width: 2px;
720
+ content: "";
721
+ background: #d8dde0;
722
+ }
723
+
724
+ .knowledge-blueprint-minimap li {
725
+ position: relative;
726
+ margin-bottom: 16px;
727
+ }
728
+
729
+ .knowledge-blueprint-minimap a {
730
+ position: relative;
731
+ display: block;
732
+ }
733
+
734
+ .knowledge-blueprint-minimap__marker {
735
+ display: flex;
736
+ align-items: center;
737
+ justify-content: center;
738
+ width: 32px;
739
+ height: 32px;
740
+ font-weight: 700;
741
+ color: #005eb8;
742
+ background: #fff;
743
+ border: 2px solid #005eb8;
744
+ border-radius: 50%;
745
+ }
746
+
747
+ .knowledge-blueprint-minimap a.is-active .knowledge-blueprint-minimap__marker {
748
+ color: #fff;
749
+ background: #005eb8;
750
+ }
751
+
752
+ .knowledge-admin-theme .knowledge-blueprint-minimap__marker {
753
+ color: #00726b;
754
+ border-color: #00726b;
755
+ }
756
+
757
+ .knowledge-admin-theme .knowledge-blueprint-minimap a.is-active .knowledge-blueprint-minimap__marker {
758
+ background: #00726b;
759
+ }
760
+
761
+ .knowledge-blueprint-step {
762
+ scroll-margin-top: 88px;
763
+ }
764
+
765
+ .knowledge-flow-diagram {
766
+ overflow-x: auto;
767
+ padding: 24px;
768
+ margin-bottom: 24px;
769
+ background: #ffffff;
770
+ border: 1px solid #d8dde0;
771
+ }
772
+
773
+ .knowledge-flow-source {
774
+ overflow-x: auto;
775
+ white-space: pre;
776
+ }
777
+
778
+ .knowledge-admin-theme .knowledge-flow-diagram {
779
+ border-color: #e3e1d9;
780
+ border-radius: 3px;
781
+ }
782
+
783
+ @media (max-width: 48.0525em) {
784
+ .knowledge-blueprint-layout {
785
+ display: block;
786
+ }
787
+
788
+ .knowledge-blueprint-minimap {
789
+ position: static;
790
+ margin-bottom: 16px;
791
+ }
792
+
793
+ .knowledge-blueprint-minimap ul {
794
+ display: flex;
795
+ flex-wrap: wrap;
796
+ gap: 8px;
797
+ }
798
+
799
+ .knowledge-blueprint-minimap ul::before {
800
+ display: none;
801
+ }
802
+
803
+ .knowledge-blueprint-minimap li {
804
+ margin-bottom: 0;
805
+ }
806
+
807
+ .knowledge-lane {
808
+ grid-template-columns: 1fr;
809
+ gap: 8px;
810
+ }
811
+
812
+ .knowledge-edge-list li {
813
+ grid-template-columns: 1fr;
814
+ }
815
+
816
+ .knowledge-trace-controls {
817
+ grid-template-columns: 1fr;
818
+ gap: 0;
819
+ }
820
+
821
+ .knowledge-trace-timeline::before {
822
+ left: 9px;
823
+ }
824
+
825
+ .knowledge-trace-group,
826
+ .knowledge-trace-item {
827
+ padding-left: 36px;
828
+ }
829
+
830
+ .knowledge-trace-item__marker {
831
+ height: 16px;
832
+ left: 1px;
833
+ width: 16px;
834
+ }
835
+ }
836
+
837
+ // Empty state - shown on any page of a knowledge base that has not been filled
838
+ // in yet. Quiet rather than alarming: nothing is wrong, there is just nothing
839
+ // here yet.
840
+ .knowledge-admin-theme .knowledge-empty-state {
841
+ max-width: 70ch;
842
+ padding: 24px;
843
+ margin-bottom: 24px;
844
+ background: #ffffff;
845
+ border-left: 4px solid #aeb7bd;
846
+ }
847
+
848
+ .knowledge-admin-theme .knowledge-empty-state h2 {
849
+ margin-top: 0;
850
+ }
851
+
852
+ .knowledge-admin-theme .knowledge-empty-state p:last-child {
853
+ margin-bottom: 0;
854
+ }
855
+
856
+ // Rendered package documentation. Prose, so it gets a readable measure and the
857
+ // same restrained styling as the rest of the admin theme.
858
+ .knowledge-admin-theme .knowledge-doc {
859
+ max-width: 76ch;
860
+ padding: 24px 32px;
861
+ background: #ffffff;
862
+ }
863
+
864
+ .knowledge-admin-theme .knowledge-doc h1 {
865
+ margin-top: 0;
866
+ }
867
+
868
+ .knowledge-admin-theme .knowledge-doc h2,
869
+ .knowledge-admin-theme .knowledge-doc h3 {
870
+ margin-top: 32px;
871
+ }
872
+
873
+ .knowledge-admin-theme .knowledge-doc pre {
874
+ padding: 16px;
875
+ overflow-x: auto;
876
+ background: #f6f5f2;
877
+ border-left: 4px solid #aeb7bd;
878
+ }
879
+
880
+ .knowledge-admin-theme .knowledge-doc code {
881
+ font-size: 15px;
882
+ }
883
+
884
+ .knowledge-admin-theme .knowledge-doc table {
885
+ width: 100%;
886
+ margin-bottom: 24px;
887
+ border-collapse: collapse;
888
+ }
889
+
890
+ .knowledge-admin-theme .knowledge-doc th,
891
+ .knowledge-admin-theme .knowledge-doc td {
892
+ padding: 8px 12px;
893
+ text-align: left;
894
+ vertical-align: top;
895
+ border-bottom: 1px solid #d8dde0;
896
+ }