rcf-lite 0.28.4 → 0.29.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 (168) hide show
  1. package/CHANGELOG.md +107 -1
  2. package/bin/rcf.js +4 -0
  3. package/fixtures/canary-manifest.json +9 -9
  4. package/guidance/define-draft-shapes.md +89 -0
  5. package/guidance/define-intake.md +97 -0
  6. package/guidance/define-intent.md +107 -0
  7. package/guidance/discover-prototype.md +67 -0
  8. package/guidance/discovery-prototypes.md +69 -0
  9. package/guidance/harness-template.md +34 -0
  10. package/guidance/managed/agent-instructions-block.hash +1 -1
  11. package/guidance/managed/agent-instructions-block.md +34 -0
  12. package/guidance/manifest.json +9 -2
  13. package/package.json +1 -1
  14. package/rcf/adrs/adr-4124-define-freeze-verb.json +30 -0
  15. package/rcf/adrs/adr-4126-persona-tagged-blockers-two-levels.json +40 -0
  16. package/rcf/adrs/adr-4127-readiness-tab-order-and-register.json +40 -0
  17. package/rcf/adrs/adr-4129-questions-harness-driven-loop.json +25 -0
  18. package/rcf/adrs/adr-4130-intake-harness-split-tool-scanned.json +20 -0
  19. package/rcf/adrs/adr-4132-prototypes-in-discovery-as-evidence.json +20 -0
  20. package/rcf/adrs/adr-4133-dag-dependency-depth-layout.json +40 -0
  21. package/rcf/adrs/adr-4134-index-json-route.json +35 -0
  22. package/rcf/adrs/adr-4135-readiness-po-register-and-adapter.json +35 -0
  23. package/rcf/adrs/adr-4136-embedding-host-fixture.json +35 -0
  24. package/rcf/code-nodes/cn-725.json +18 -2
  25. package/rcf/code-nodes/cn-726.json +10 -2
  26. package/rcf/code-nodes/cn-727.json +13 -4
  27. package/rcf/code-nodes/cn-728.json +18 -2
  28. package/rcf/code-nodes/cn-729.json +10 -2
  29. package/rcf/code-nodes/cn-730.json +13 -3
  30. package/rcf/code-nodes/cn-731.json +20 -0
  31. package/rcf/code-nodes/cn-732.json +14 -0
  32. package/rcf/code-nodes/cn-733.json +14 -0
  33. package/rcf/code-nodes/cn-734.json +14 -0
  34. package/rcf/code-nodes/cn-735.json +20 -0
  35. package/rcf/code-nodes/cn-736.json +14 -0
  36. package/rcf/code-nodes/cn-737.json +14 -0
  37. package/rcf/code-nodes/cn-738.json +14 -0
  38. package/rcf/code-nodes/cn-739.json +18 -0
  39. package/rcf/code-nodes/cn-740.json +19 -0
  40. package/rcf/code-nodes/cn-741.json +16 -0
  41. package/rcf/code-nodes/cn-742.json +16 -0
  42. package/rcf/code-nodes/cn-743.json +15 -0
  43. package/rcf/code-nodes/cn-744.json +22 -0
  44. package/rcf/code-nodes/cn-745.json +16 -0
  45. package/rcf/code-nodes/cn-746.json +14 -0
  46. package/rcf/code-nodes/cn-747.json +18 -0
  47. package/rcf/code-nodes/cn-748.json +16 -0
  48. package/rcf/code-nodes/cn-749.json +16 -0
  49. package/rcf/code-nodes/cn-750.json +15 -0
  50. package/rcf/code-nodes/cn-751.json +18 -0
  51. package/rcf/code-nodes/cn-752.json +14 -0
  52. package/rcf/fbs/fbs-196.json +13 -5
  53. package/rcf/fbs/fbs-198.json +42 -0
  54. package/rcf/fbs/fbs-199.json +59 -0
  55. package/rcf/fbs/fbs-200.json +46 -0
  56. package/rcf/fbs/fbs-201.json +49 -0
  57. package/rcf/fbs/fbs-202.json +110 -0
  58. package/rcf/fbs/fbs-203.json +100 -0
  59. package/rcf/requirements/req-002.json +2 -2
  60. package/rcf/requirements/req-173.json +2 -2
  61. package/rcf/requirements/req-174.json +10 -4
  62. package/rcf/requirements/req-175.json +10 -4
  63. package/rcf/requirements/req-176.json +25 -0
  64. package/rcf/requirements/req-180.json +31 -0
  65. package/rcf/requirements/req-181.json +31 -0
  66. package/rcf/requirements/req-182.json +25 -0
  67. package/rcf/requirements/req-186.json +25 -0
  68. package/rcf/requirements/req-187.json +31 -0
  69. package/rcf/requirements/req-188.json +25 -0
  70. package/rcf/tacs/tac-4121-define-ledgers.json +15 -3
  71. package/rcf/tacs/tac-4122-define-gates.json +40 -4
  72. package/rcf/tacs/tac-4123-define-readiness.json +39 -3
  73. package/rcf/tacs/tac-4124-define-freeze.json +28 -0
  74. package/rcf/tacs/tac-4127-readiness-view.json +49 -0
  75. package/rcf/tacs/tac-4128-define-guidance.json +53 -0
  76. package/rcf/tacs/tac-4129-define-questions.json +45 -0
  77. package/rcf/tacs/tac-4130-define-intake-brief.json +35 -0
  78. package/rcf/tacs/tac-4131-build-dag-view.json +39 -0
  79. package/rcf/tacs/tac-4132-id-lookup.json +42 -0
  80. package/rcf/tacs/tac-4133-readiness-po-layer.json +37 -0
  81. package/rcf/tacs/tac-4134-wespa-host-fixture.json +54 -0
  82. package/rcf/test-suites/ts-016.json +3 -3
  83. package/rcf/test-suites/ts-215.json +148 -4
  84. package/rcf/test-suites/ts-216.json +19 -3
  85. package/rcf/test-suites/ts-218.json +78 -0
  86. package/rcf/test-suites/ts-219.json +70 -0
  87. package/rcf/test-suites/ts-220.json +78 -0
  88. package/rcf/test-suites/ts-221.json +78 -0
  89. package/rcf/test-suites/ts-222.json +100 -0
  90. package/rcf/test-suites/ts-223.json +94 -0
  91. package/rcf/test-suites/ts-224.json +70 -0
  92. package/rcf/test-suites/ts-225.json +78 -0
  93. package/rcf/test-suites/ts-226.json +158 -0
  94. package/rcf/test-suites/ts-227.json +38 -0
  95. package/rcf/test-suites/ts-228.json +86 -0
  96. package/rcf/test-suites/ts-229.json +83 -0
  97. package/rcf/user-stories/us-17302.json +50 -0
  98. package/rcf/user-stories/us-17401.json +14 -2
  99. package/rcf/user-stories/us-17402.json +55 -0
  100. package/rcf/user-stories/us-17403.json +60 -0
  101. package/rcf/user-stories/us-17502.json +60 -0
  102. package/rcf/user-stories/us-17503.json +65 -0
  103. package/rcf/user-stories/us-17601.json +58 -0
  104. package/rcf/user-stories/us-18001.json +55 -0
  105. package/rcf/user-stories/us-18002.json +35 -0
  106. package/rcf/user-stories/us-18101.json +35 -0
  107. package/rcf/user-stories/us-18202.json +40 -0
  108. package/rcf/user-stories/us-18601.json +55 -0
  109. package/rcf/user-stories/us-18602.json +50 -0
  110. package/rcf/user-stories/us-18603.json +45 -0
  111. package/rcf/user-stories/us-18701.json +50 -0
  112. package/rcf/user-stories/us-18702.json +50 -0
  113. package/rcf/user-stories/us-18801.json +45 -0
  114. package/rcf/user-stories/us-204.json +59 -0
  115. package/rcf/user-stories/us-205.json +64 -0
  116. package/rcf/user-stories/us-206.json +54 -0
  117. package/releases/releases.yaml +11 -1
  118. package/src/cli/freeze.js +730 -0
  119. package/src/cli/help.js +12 -0
  120. package/src/cli/ledger.js +228 -12
  121. package/src/cli/questions.js +288 -0
  122. package/src/cli/readiness.js +267 -49
  123. package/src/cli/view.js +29 -0
  124. package/src/define/freeze-record.js +30 -15
  125. package/src/define/ledgers.js +210 -11
  126. package/src/intake/index.js +1 -1
  127. package/src/intake/orchestrator.js +117 -0
  128. package/src/mcp/tools.js +354 -0
  129. package/src/query/delta.js +6 -0
  130. package/src/query/gates.js +314 -39
  131. package/src/query/index.js +16 -2
  132. package/src/query/questions.js +438 -0
  133. package/src/query/readiness.js +248 -7
  134. package/src/server/index.js +24 -2
  135. package/src/server/routes.js +68 -1
  136. package/src/setup/identity-seed.js +17 -0
  137. package/src/view/build-dag.js +563 -0
  138. package/src/view/components/badge.js +41 -0
  139. package/src/view/components/diff.js +72 -0
  140. package/src/view/components/doc-row.js +62 -0
  141. package/src/view/components/empty-state.js +35 -0
  142. package/src/view/components/entity-selector.js +137 -0
  143. package/src/view/components/filter-bar.js +97 -0
  144. package/src/view/components/findings-list.js +49 -0
  145. package/src/view/components/index.js +12 -0
  146. package/src/view/components/pill.js +46 -0
  147. package/src/view/components/sub-tab-strip.js +43 -0
  148. package/src/view/components/toast.js +25 -0
  149. package/src/view/components-fixture.js +265 -0
  150. package/src/view/doc-renderers/architecture.js +304 -0
  151. package/src/view/doc-renderers/build.js +160 -0
  152. package/src/view/doc-renderers/index.js +2 -0
  153. package/src/view/doc-renderers/prd.js +35 -6
  154. package/src/view/html-page.js +700 -602
  155. package/src/view/index.js +96 -3
  156. package/src/view/live-client.js +39 -6
  157. package/src/view/needs-work.js +79 -0
  158. package/src/view/page-init.js +2193 -0
  159. package/src/view/readiness/phrasebook.js +115 -0
  160. package/src/view/readiness/po-layer.js +288 -0
  161. package/src/view/readiness/question-adapter.js +329 -0
  162. package/src/view/readiness/stage-legend.js +71 -0
  163. package/src/view/readiness.js +505 -0
  164. package/src/view/style.css +2017 -382
  165. package/src/view/test-host/embed-client.js +121 -0
  166. package/src/view/test-host/fixture.js +183 -0
  167. package/src/view/test-host/lints.js +220 -0
  168. package/src/view/view-index.js +323 -0
@@ -1,37 +1,52 @@
1
1
  /*
2
- * RCF view stylesheet. Vanilla CSS, no preprocessor, no framework.
3
- * Document-type colour tokens match the Mermaid classDef palette in
4
- * mermaid-diagram.js so the diagram and the page agree visually.
2
+ * RCF view stylesheet.
5
3
  *
6
- * Phase 3.3 polish: warmer surface palette, subtle card shadows + hover,
7
- * sticky tab bar with backdrop-blur, indigo accent, wider spacing rhythm,
8
- * refined typography stack. Same information density; nicer to look at.
4
+ * Viewer UI refresh PR 1 (w-2026-10-02-dave-010, Dex / wespa relay
5
+ * f0384046 on 2026-10-02): replaces the earlier single-theme indigo
6
+ * palette with the Stravica brand kit tokens (--sv-* cobalt / ink /
7
+ * paper) in a light + dark pair. theme=light|dark on the root page
8
+ * wins; theme=auto (and absent) falls through to prefers-color-scheme,
9
+ * with absent defaulting to light per Dex's wespa requirements.
10
+ *
11
+ * The viewer fills the viewport height and owns its scrolling (the
12
+ * host is a fixed box in wespa, 56px header plus a sidebar); nothing
13
+ * scrolls horizontally at narrow widths; the tab nav stays sticky
14
+ * while content scrolls. embed=1 stamps data-embed on <html>, which
15
+ * hides the brand block and the footer but keeps the tabstrip.
16
+ *
17
+ * Legacy --colour-* names are kept as aliases that map to the new
18
+ * tokens, so every doc-renderer / mermaid / product-map rule written
19
+ * against the old palette still works and gets dark theme for free.
9
20
  */
10
21
 
11
- :root {
22
+ :root,
23
+ :root[data-theme="light"] {
12
24
  color-scheme: light;
13
25
 
14
- /* Neutrals - slightly warmer than pure greys */
15
- --colour-text: #0f172a;
16
- --colour-heading: #0b1220;
17
- --colour-muted: #6b7280;
18
- --colour-subtle: #94a3b8;
19
- --colour-bg: #fdfdfd;
20
- --colour-surface: #f7f8fa;
21
- --colour-surface-2: #eef1f6;
22
- --colour-border: #e4e7ec;
23
- --colour-border-strong: #cbd5e1;
24
-
25
- /* Accent - indigo. Distinctive but professional. */
26
- --colour-accent: #4f46e5;
27
- --colour-accent-hover: #4338ca;
28
- --colour-accent-subtle: #eef2ff;
29
- --colour-link: var(--colour-accent);
30
-
31
- /* Error / broken states */
32
- --colour-broken-bg: #fee2e2;
33
- --colour-broken-text: #7f1d1d;
34
- --colour-broken-border: #dc2626;
26
+ /* Stravica brand kit, light. */
27
+ --sv-canvas: #F6F8FC;
28
+ --sv-surface: #FFFFFF;
29
+ --sv-raised: #EEF2F8;
30
+ --sv-ink: #111927;
31
+ --sv-muted: #536176;
32
+ --sv-border: #D8DFEA;
33
+ --sv-control: #738198;
34
+ --sv-link: #2447EB;
35
+ --sv-hover: #1737C7;
36
+ --sv-active: #E9EEFF;
37
+ --sv-button: #2447EB;
38
+ --sv-onbutton: #FFFFFF;
39
+ --sv-code: #EEF2F8;
40
+ --sv-success: #116B4D;
41
+ --sv-successbg: #E7F4ED;
42
+ --sv-warning: #895000;
43
+ --sv-warningbg: #FFF3DC;
44
+ --sv-danger: #B4233B;
45
+ --sv-dangerbg: #FDECF0;
46
+ --sv-focus: #2447EB;
47
+
48
+ --sv-font: Arial, Helvetica, sans-serif;
49
+ --sv-mono: ui-monospace, SFMono-Regular, Consolas, "Liberation Mono", monospace;
35
50
 
36
51
  /* Doc-type palette - kept in sync with mermaid classDef */
37
52
  --colour-prd: #fde68a;
@@ -46,152 +61,262 @@
46
61
  --colour-ts: #99f6e4;
47
62
  --colour-tc: #d9f99d;
48
63
 
49
- /* Elevation */
50
64
  --shadow-sm: 0 1px 2px rgba(15, 23, 42, 0.04), 0 1px 3px rgba(15, 23, 42, 0.03);
51
65
  --shadow-md: 0 4px 10px rgba(15, 23, 42, 0.05), 0 2px 4px rgba(15, 23, 42, 0.04);
52
66
  --shadow-lg: 0 12px 28px rgba(15, 23, 42, 0.08), 0 4px 8px rgba(15, 23, 42, 0.04);
53
67
 
54
- /* Radii */
55
68
  --radius-sm: 6px;
56
69
  --radius-md: 10px;
57
70
  --radius-lg: 14px;
58
71
 
59
- /* Transitions */
60
72
  --t-fast: 120ms ease;
61
73
  --t-med: 180ms ease;
74
+
75
+ /* Legacy --colour-* aliases over --sv-* so pre-existing rules keep
76
+ their meaning and inherit dark theme automatically. */
77
+ --colour-text: var(--sv-ink);
78
+ --colour-heading: var(--sv-ink);
79
+ --colour-muted: var(--sv-muted);
80
+ --colour-subtle: var(--sv-control);
81
+ --colour-bg: var(--sv-surface);
82
+ --colour-surface: var(--sv-raised);
83
+ --colour-surface-2: var(--sv-raised);
84
+ --colour-border: var(--sv-border);
85
+ --colour-border-strong: var(--sv-control);
86
+ --colour-accent: var(--sv-link);
87
+ --colour-accent-hover: var(--sv-hover);
88
+ --colour-accent-subtle: var(--sv-active);
89
+ --colour-link: var(--sv-link);
90
+ --colour-broken-bg: var(--sv-dangerbg);
91
+ --colour-broken-text: var(--sv-danger);
92
+ --colour-broken-border: var(--sv-danger);
93
+ }
94
+
95
+ :root[data-theme="dark"] {
96
+ color-scheme: dark;
97
+
98
+ --sv-canvas: #0B111B;
99
+ --sv-surface: #101925;
100
+ --sv-raised: #182334;
101
+ --sv-ink: #EDF2FA;
102
+ --sv-muted: #AAB7CA;
103
+ --sv-border: #2C3A4F;
104
+ --sv-control: #75859D;
105
+ --sv-link: #A3B5FF;
106
+ --sv-hover: #C0CDFF;
107
+ --sv-active: #1D2C50;
108
+ --sv-button: #A3B5FF;
109
+ --sv-onbutton: #0B111B;
110
+ --sv-code: #0D1521;
111
+ --sv-success: #80D9B1;
112
+ --sv-successbg: #102D24;
113
+ --sv-warning: #F1CA7A;
114
+ --sv-warningbg: #322712;
115
+ --sv-danger: #FFA3B3;
116
+ --sv-dangerbg: #361C28;
117
+ --sv-focus: #A3B5FF;
118
+
119
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 1px 3px rgba(0, 0, 0, 0.3);
120
+ --shadow-md: 0 4px 10px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.35);
121
+ --shadow-lg: 0 12px 28px rgba(0, 0, 0, 0.55), 0 4px 8px rgba(0, 0, 0, 0.4);
122
+ }
123
+
124
+ @media (prefers-color-scheme: dark) {
125
+ :root:not([data-theme="light"]):not([data-theme="dark"]) {
126
+ color-scheme: dark;
127
+
128
+ --sv-canvas: #0B111B;
129
+ --sv-surface: #101925;
130
+ --sv-raised: #182334;
131
+ --sv-ink: #EDF2FA;
132
+ --sv-muted: #AAB7CA;
133
+ --sv-border: #2C3A4F;
134
+ --sv-control: #75859D;
135
+ --sv-link: #A3B5FF;
136
+ --sv-hover: #C0CDFF;
137
+ --sv-active: #1D2C50;
138
+ --sv-button: #A3B5FF;
139
+ --sv-onbutton: #0B111B;
140
+ --sv-code: #0D1521;
141
+ --sv-success: #80D9B1;
142
+ --sv-successbg: #102D24;
143
+ --sv-warning: #F1CA7A;
144
+ --sv-warningbg: #322712;
145
+ --sv-danger: #FFA3B3;
146
+ --sv-dangerbg: #361C28;
147
+ --sv-focus: #A3B5FF;
148
+
149
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.4), 0 1px 3px rgba(0, 0, 0, 0.3);
150
+ --shadow-md: 0 4px 10px rgba(0, 0, 0, 0.45), 0 2px 4px rgba(0, 0, 0, 0.35);
151
+ --shadow-lg: 0 12px 28px rgba(0, 0, 0, 0.55), 0 4px 8px rgba(0, 0, 0, 0.4);
152
+ }
62
153
  }
63
154
 
64
155
  * { box-sizing: border-box; }
65
156
 
66
157
  html { font-size: 16px; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; }
67
158
 
159
+ /* Viewport-height scroll box: the viewer owns scrolling inside the
160
+ host iframe. The host sizes the frame; we fill it, reflow on resize,
161
+ and never produce a horizontal page scroll (lists wrap, the DAG and
162
+ mermaid svgs scroll inside their own panels). */
163
+ html, body {
164
+ height: 100%;
165
+ margin: 0;
166
+ }
167
+
68
168
  body {
69
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI Variable', 'Segoe UI', Roboto, 'Helvetica Neue', system-ui, sans-serif;
169
+ font-family: var(--sv-font);
70
170
  line-height: 1.55;
71
- color: var(--colour-text);
72
- background: var(--colour-bg);
73
- max-width: 80rem;
74
- margin: 0 auto;
75
- padding: 0 2rem 3rem;
171
+ color: var(--sv-ink);
172
+ background: var(--sv-canvas);
173
+ min-height: 100vh;
174
+ display: flex;
175
+ flex-direction: column;
176
+ overflow-x: hidden;
76
177
  font-feature-settings: 'cv02', 'cv03', 'cv04', 'cv11';
77
178
  }
78
179
 
79
180
  /* --------------------------------------------------------------------
80
- * Header
181
+ * App shell: compact header with brand, sticky tabstrip, tools well.
81
182
  * -------------------------------------------------------------------- */
82
183
 
83
- header {
84
- padding: 2rem 0 1rem;
85
- margin-bottom: 0.75rem;
184
+ header.app-header {
185
+ position: sticky;
186
+ top: 0;
187
+ z-index: 20;
188
+ background: var(--sv-surface);
189
+ border-bottom: 1px solid var(--sv-border);
190
+ }
191
+
192
+ header.app-header .bar {
193
+ max-width: 1280px;
194
+ margin: 0 auto;
195
+ padding: 0.5rem 1rem 0;
86
196
  display: flex;
87
- flex-direction: column;
88
- gap: 0.35rem;
197
+ align-items: center;
198
+ gap: 1rem;
89
199
  }
90
200
 
91
- header h1 {
92
- margin: 0;
93
- font-size: 2rem;
94
- font-weight: 700;
95
- letter-spacing: -0.02em;
96
- color: var(--colour-heading);
201
+ /* D17: icon mark only; the tool name is NOT shown as text. The stack
202
+ under review (project name) is the prominent text in .product, with
203
+ a muted "review surface" sub-label; no technology chip. */
204
+ .brand {
97
205
  display: flex;
98
206
  align-items: center;
99
- gap: 0.75rem;
207
+ gap: 0.4rem;
208
+ color: var(--sv-muted);
209
+ white-space: nowrap;
100
210
  }
101
211
 
102
- /* Stravica kit mark alongside the project name, shared identity with
103
- * the marketing site (stravica.ai). SVG is inlined as a data URL so no
104
- * separate asset has to ship. */
105
- header h1::before {
106
- content: '';
212
+ .brand .mark {
213
+ /* Inline SVG of the Stravica kit mark from
214
+ stravica.ai/public/brand/assets/icons/favicon.svg (same paths and
215
+ colours as the favicon above). The SVG carries its own ink tile
216
+ and radius so no background styling is needed here. */
217
+ width: 18px;
218
+ height: 18px;
107
219
  display: inline-block;
108
- width: 2rem;
109
- height: 2rem;
110
220
  flex-shrink: 0;
111
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 136 180' width='136' height='180' role='img'%3E%3Ctitle%3EStravica ribbon symbol%3C/title%3E%3Cdesc%3E%3C/desc%3E%3Cdefs%3E%3ClinearGradient id='ma' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%23174CFF'/%3E%3Cstop offset='1' stop-color='%23263BFF'/%3E%3C/linearGradient%3E%3ClinearGradient id='mb' x1='0' y1='0' x2='1' y2='1'%3E%3Cstop stop-color='%231674FF'/%3E%3Cstop offset='1' stop-color='%232854FF'/%3E%3C/linearGradient%3E%3C/defs%3E%3Cg transform='translate(0 0) scale(1.0)'%3E%3Cpath fill='url(%23ma)' d='M86 4 L10 48 Q4 51 4 58 L4 81 Q4 87 10 84 L80 45 Q86 42 86 35 Z'/%3E%3Cpath fill='url(%23ma)' d='M88 108 L129 125 L47 172 Q41 176 41 170 L41 142 Q41 136 47 133 Z'/%3E%3Cpath fill='url(%23mb)' d='M41 84 L74 65 Q78 63 83 66 L124 88 Q130 91 130 98 L130 121 Q130 126 124 123 Z'/%3E%3C/g%3E%3C/svg%3E");
112
- background-repeat: no-repeat;
113
- background-position: center;
114
- background-size: contain;
115
- border-radius: var(--radius-sm);
116
- box-shadow: var(--shadow-sm);
117
221
  }
118
222
 
119
- .subtitle {
120
- color: var(--colour-muted);
121
- margin: 0;
122
- font-size: 0.95rem;
223
+ .product {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 0.5rem;
227
+ white-space: nowrap;
228
+ min-width: 0;
229
+ padding-left: 0.75rem;
230
+ border-left: 1px solid var(--sv-border);
123
231
  }
124
232
 
125
- /* --------------------------------------------------------------------
126
- * Tab bar (sticky, blurred backdrop)
127
- * -------------------------------------------------------------------- */
233
+ .product .name {
234
+ font-weight: 700;
235
+ font-size: 1.05rem;
236
+ color: var(--sv-ink);
237
+ overflow: hidden;
238
+ text-overflow: ellipsis;
239
+ }
240
+
241
+ .product .sub {
242
+ font-size: 0.72rem;
243
+ font-weight: 500;
244
+ color: var(--sv-muted);
245
+ }
128
246
 
129
247
  nav.tabs {
130
248
  display: flex;
131
- flex-wrap: wrap;
132
249
  gap: 0.25rem;
133
- padding: 0.5rem 0.5rem 0;
134
- position: sticky;
135
- top: 0;
136
- z-index: 10;
137
- background: rgba(253, 253, 253, 0.85);
138
- backdrop-filter: saturate(180%) blur(12px);
139
- -webkit-backdrop-filter: saturate(180%) blur(12px);
140
- border-bottom: 1px solid var(--colour-border);
141
- margin: 0 -0.5rem;
250
+ margin-left: 1rem;
251
+ flex: 1 1 auto;
252
+ min-width: 0;
253
+ overflow-x: auto;
254
+ -webkit-overflow-scrolling: touch;
142
255
  }
143
256
 
144
257
  nav.tabs button {
145
258
  appearance: none;
146
- border: 1px solid transparent;
147
- border-radius: var(--radius-md) var(--radius-md) 0 0;
259
+ border: none;
148
260
  background: transparent;
149
- color: var(--colour-muted);
150
- padding: 0.6rem 1.1rem;
261
+ color: var(--sv-muted);
262
+ display: inline-flex;
263
+ align-items: center;
264
+ min-height: 2.5rem;
265
+ padding: 0 0.85rem;
266
+ text-decoration: none;
267
+ border-bottom: 3px solid transparent;
268
+ white-space: nowrap;
269
+ font-family: inherit;
151
270
  font-size: 0.95rem;
152
271
  font-weight: 500;
153
272
  cursor: pointer;
154
- font-family: inherit;
155
273
  transition: background var(--t-fast), color var(--t-fast), border-color var(--t-fast);
156
- margin-bottom: -1px;
157
- position: relative;
158
274
  }
159
275
 
160
276
  nav.tabs button:hover {
161
- background: var(--colour-accent-subtle);
162
- color: var(--colour-accent-hover);
277
+ color: var(--sv-ink);
278
+ background: var(--sv-raised);
163
279
  }
164
280
 
165
281
  nav.tabs button[aria-selected="true"] {
166
- background: var(--colour-bg);
167
- color: var(--colour-heading);
168
- font-weight: 600;
169
- border-color: var(--colour-border);
170
- border-bottom-color: var(--colour-bg);
282
+ color: var(--sv-ink);
283
+ font-weight: 700;
284
+ border-bottom-color: var(--sv-link);
171
285
  }
172
286
 
173
- nav.tabs button[aria-selected="true"]::after {
174
- content: '';
175
- position: absolute;
176
- left: 0.9rem;
177
- right: 0.9rem;
178
- bottom: -1px;
179
- height: 2px;
180
- background: var(--colour-accent);
181
- border-radius: 2px;
287
+ nav.tabs button:focus-visible {
288
+ outline: 3px solid var(--sv-focus);
289
+ outline-offset: -3px;
182
290
  }
183
291
 
184
- nav.tabs button:focus-visible {
185
- outline: 2px solid var(--colour-accent);
186
- outline-offset: 2px;
292
+ .tools {
293
+ display: flex;
294
+ align-items: center;
295
+ gap: 0.5rem;
296
+ flex-shrink: 0;
187
297
  }
188
298
 
299
+ /* Embed contract (D10): data-embed="1" suppresses the footer and
300
+ left-aligns the tab nav; the icon mark and project name stay (D17
301
+ keeps the stack under review named even under embed). */
302
+ html[data-embed="1"] .app-footer { display: none; }
303
+ html[data-embed="1"] nav.tabs { margin-left: 0; }
304
+
189
305
  /* --------------------------------------------------------------------
190
- * Panels + section headings
306
+ * Main content area
191
307
  * -------------------------------------------------------------------- */
192
308
 
309
+ main {
310
+ flex: 1 1 auto;
311
+ max-width: 1280px;
312
+ width: 100%;
313
+ margin: 0 auto;
314
+ padding: 1.25rem 1rem 3rem;
315
+ overflow-x: hidden;
316
+ }
317
+
193
318
  section[role="tabpanel"] {
194
- padding-top: 2rem;
319
+ padding-top: 1rem;
195
320
  }
196
321
 
197
322
  section[role="tabpanel"][hidden] {
@@ -202,50 +327,33 @@ h2.tab-heading {
202
327
  font-size: 1.5rem;
203
328
  font-weight: 700;
204
329
  letter-spacing: -0.015em;
205
- color: var(--colour-heading);
330
+ color: var(--sv-ink);
206
331
  margin: 0 0 1.25rem;
207
332
  padding-bottom: 0.5rem;
208
- border-bottom: 1px solid var(--colour-border);
209
- position: relative;
210
- }
211
-
212
- h2.tab-heading::before {
213
- content: '';
214
- position: absolute;
215
- left: 0;
216
- bottom: -1px;
217
- width: 3rem;
218
- height: 2px;
219
- background: var(--colour-accent);
220
- border-radius: 2px;
333
+ border-bottom: 1px solid var(--sv-border);
221
334
  }
222
335
 
223
336
  .group-heading {
224
- font-size: 1.1rem;
337
+ font-size: 0.8rem;
225
338
  font-weight: 600;
226
339
  margin-top: 2.25rem;
227
340
  margin-bottom: 1rem;
228
- color: var(--colour-heading);
341
+ color: var(--sv-ink);
229
342
  text-transform: uppercase;
230
343
  letter-spacing: 0.06em;
231
- font-size: 0.8rem;
232
344
  }
233
345
 
234
- /* --------------------------------------------------------------------
235
- * Overview diagram
236
- * -------------------------------------------------------------------- */
237
-
238
346
  /* --------------------------------------------------------------------
239
347
  * Doc article - the rendered doc body inside a card
240
348
  * -------------------------------------------------------------------- */
241
349
 
242
350
  article.doc {
243
- border: 1px solid var(--colour-border);
351
+ border: 1px solid var(--sv-border);
244
352
  border-left-width: 5px;
245
353
  padding: 1.25rem 1.5rem;
246
354
  border-radius: var(--radius-md);
247
355
  margin-bottom: 1.5rem;
248
- background: var(--colour-bg);
356
+ background: var(--sv-surface);
249
357
  box-shadow: var(--shadow-sm);
250
358
  transition: box-shadow var(--t-med), transform var(--t-med);
251
359
  }
@@ -254,15 +362,10 @@ article.doc h3 {
254
362
  margin: 0 0 0.85rem;
255
363
  font-size: 1.2rem;
256
364
  font-weight: 600;
257
- color: var(--colour-heading);
365
+ color: var(--sv-ink);
258
366
  letter-spacing: -0.01em;
259
367
  }
260
368
 
261
- /* When the article is embedded inside a doc-details wrapper, the parent
262
- * details already carries the border + shadow + radius + background +
263
- * coloured left accent. Strip the article's own card treatment so we
264
- * don't render a card inside a card. Also hide the article's own h3 -
265
- * the summary line already carries the title. */
266
369
  details.doc-details > article.doc {
267
370
  border: none;
268
371
  border-radius: 0;
@@ -286,18 +389,17 @@ article.doc-fbs { border-left-color: var(--colour-fbs); }
286
389
  article.doc-ts { border-left-color: var(--colour-ts); }
287
390
 
288
391
  article.doc p { margin: 0.45rem 0; }
289
- article.doc h4 { margin: 1.1rem 0 0.45rem; font-size: 1rem; font-weight: 600; color: var(--colour-heading); }
290
- article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600; color: var(--colour-heading); }
392
+ article.doc h4 { margin: 1.1rem 0 0.45rem; font-size: 1rem; font-weight: 600; color: var(--sv-ink); }
393
+ article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600; color: var(--sv-ink); }
291
394
 
292
395
  .field-list { margin: 0.85rem 0; }
293
396
  .field-list ul { margin: 0.3rem 0; padding-left: 1.5rem; }
294
397
  .field-list ul li { margin: 0.2rem 0; }
295
- .field-list dl dt { font-weight: 600; margin-top: 0.5rem; color: var(--colour-heading); }
398
+ .field-list dl dt { font-weight: 600; margin-top: 0.5rem; color: var(--sv-ink); }
296
399
  .field-list dl dd { margin-left: 0; margin-bottom: 0.35rem; }
297
- /* 0.28.2 (issue #235): structured TAD fields render as a table. */
298
400
  .field-list table.field-table { border-collapse: collapse; width: 100%; margin: 0.35rem 0 0.85rem; font-size: 0.95em; }
299
- .field-list table.field-table th, .field-list table.field-table td { text-align: left; padding: 0.35rem 0.55rem; border-bottom: 1px solid var(--colour-rule, rgba(0,0,0,0.12)); vertical-align: top; }
300
- .field-list table.field-table th { font-weight: 600; color: var(--colour-heading); background: var(--colour-tint, rgba(0,0,0,0.03)); }
401
+ .field-list table.field-table th, .field-list table.field-table td { text-align: left; padding: 0.35rem 0.55rem; border-bottom: 1px solid var(--sv-border); vertical-align: top; }
402
+ .field-list table.field-table th { font-weight: 600; color: var(--sv-ink); background: var(--sv-raised); }
301
403
  .field-list table.field-table tr:last-child td { border-bottom: 0; }
302
404
 
303
405
  /* --------------------------------------------------------------------
@@ -316,15 +418,11 @@ article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600;
316
418
  box-shadow: none;
317
419
  }
318
420
 
319
- .ac-list .ac-item:last-child {
320
- margin-bottom: 0;
321
- }
322
-
421
+ .ac-list .ac-item:last-child { margin-bottom: 0; }
323
422
  .ac-list .ac-item p { margin: 0.3rem 0; }
324
423
  .ac-list .ac-gwt p { margin: 0.2rem 0; }
325
- .ac-meta { color: var(--colour-muted); font-size: 0.875rem; }
424
+ .ac-meta { color: var(--sv-muted); font-size: 0.875rem; }
326
425
 
327
- /* AC pills (used in FBS -> AC nav on the Build tab) */
328
426
  .ac-pills {
329
427
  display: flex;
330
428
  flex-wrap: wrap;
@@ -337,16 +435,16 @@ article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600;
337
435
  padding: 0.22rem 0.7rem;
338
436
  border-radius: 999px;
339
437
  background: var(--colour-ac);
340
- color: #3730a3;
438
+ color: var(--sv-link);
341
439
  text-decoration: none;
342
440
  font-size: 0.85rem;
343
441
  font-weight: 500;
344
- border: 1px solid #c7d2fe;
442
+ border: 1px solid var(--sv-border);
345
443
  transition: background var(--t-fast), transform var(--t-fast), box-shadow var(--t-fast);
346
444
  }
347
445
 
348
446
  .ac-pills .ac-pill:hover {
349
- background: #c7d2fe;
447
+ background: var(--sv-active);
350
448
  box-shadow: var(--shadow-sm);
351
449
  transform: translateY(-1px);
352
450
  }
@@ -361,8 +459,8 @@ article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600;
361
459
  }
362
460
 
363
461
  .ac-resolved.broken {
364
- border-left-color: var(--colour-broken-border);
365
- background: var(--colour-broken-bg);
462
+ border-left-color: var(--sv-danger);
463
+ background: var(--sv-dangerbg);
366
464
  }
367
465
 
368
466
  .tc {
@@ -381,9 +479,10 @@ article.doc h5 { margin: 0.6rem 0 0.3rem; font-size: 0.925rem; font-weight: 600;
381
479
  .subdiagram {
382
480
  margin: 1.25rem 0;
383
481
  padding: 0.85rem;
384
- background: var(--colour-surface);
385
- border: 1px solid var(--colour-border);
482
+ background: var(--sv-raised);
483
+ border: 1px solid var(--sv-border);
386
484
  border-radius: var(--radius-md);
485
+ overflow-x: auto;
387
486
  }
388
487
 
389
488
  pre.mermaid {
@@ -401,28 +500,26 @@ pre.mermaid {
401
500
  * -------------------------------------------------------------------- */
402
501
 
403
502
  details.doc-details {
404
- border: 1px solid var(--colour-border);
503
+ border: 1px solid var(--sv-border);
405
504
  border-radius: var(--radius-md);
406
505
  margin-bottom: 0.85rem;
407
- background: var(--colour-bg);
506
+ background: var(--sv-surface);
408
507
  box-shadow: var(--shadow-sm);
409
508
  transition: box-shadow var(--t-med), border-color var(--t-med);
410
509
  }
411
510
 
412
511
  details.doc-details:hover {
413
512
  box-shadow: var(--shadow-md);
414
- border-color: var(--colour-border-strong);
513
+ border-color: var(--sv-control);
415
514
  }
416
515
 
417
- details.doc-details[open] {
418
- box-shadow: var(--shadow-md);
419
- }
516
+ details.doc-details[open] { box-shadow: var(--shadow-md); }
420
517
 
421
518
  details.doc-details > summary {
422
519
  cursor: pointer;
423
520
  padding: 0.75rem 1rem;
424
521
  font-weight: 500;
425
- color: var(--colour-heading);
522
+ color: var(--sv-ink);
426
523
  list-style: none;
427
524
  display: flex;
428
525
  align-items: center;
@@ -444,33 +541,28 @@ details.doc-details > summary > .status {
444
541
  margin-left: auto;
445
542
  }
446
543
 
447
- details.doc-details > summary:hover {
448
- background: var(--colour-surface);
449
- }
544
+ details.doc-details > summary:hover { background: var(--sv-raised); }
450
545
 
451
546
  details.doc-details > summary::-webkit-details-marker { display: none; }
452
547
 
453
- /* Custom chevron */
454
548
  details.doc-details > summary::before {
455
549
  content: '';
456
550
  display: inline-block;
457
551
  width: 0.6rem;
458
552
  height: 0.6rem;
459
- border-right: 2px solid var(--colour-muted);
460
- border-bottom: 2px solid var(--colour-muted);
553
+ border-right: 2px solid var(--sv-control);
554
+ border-bottom: 2px solid var(--sv-control);
461
555
  transform: rotate(-45deg);
462
556
  transition: transform var(--t-fast);
463
557
  flex-shrink: 0;
464
558
  margin-right: 0.15rem;
465
559
  }
466
560
 
467
- details.doc-details[open] > summary::before {
468
- transform: rotate(45deg);
469
- }
561
+ details.doc-details[open] > summary::before { transform: rotate(45deg); }
470
562
 
471
563
  details.doc-details[open] > summary {
472
564
  border-radius: var(--radius-md) var(--radius-md) 0 0;
473
- border-bottom: 1px solid var(--colour-border);
565
+ border-bottom: 1px solid var(--sv-border);
474
566
  }
475
567
 
476
568
  details.doc-details > article,
@@ -487,25 +579,21 @@ details.doc-details.doc-adr-wrap { border-left: 4px solid var(--colour-adr); }
487
579
  details.doc-details.doc-fbs-wrap { border-left: 4px solid var(--colour-fbs); }
488
580
  details.doc-details.doc-ts-wrap { border-left: 4px solid var(--colour-ts); }
489
581
 
490
- .nested-details {
491
- margin: 0 1rem 1rem;
492
- }
582
+ .nested-details { margin: 0 1rem 1rem; }
493
583
 
494
584
  .nested-details > h4 {
495
585
  margin: 0.75rem 0 0.6rem;
496
- color: var(--colour-muted);
586
+ color: var(--sv-muted);
497
587
  font-size: 0.85rem;
498
588
  font-weight: 600;
499
589
  text-transform: uppercase;
500
590
  letter-spacing: 0.04em;
501
591
  }
502
592
 
503
- /* --------------------------------------------------------------------
504
- * Nested details: strip the outer-card treatment so a REQ card
505
- * expanded to show its US children doesn't render "card inside card
506
- * inside card". Keep the coloured left accent so hierarchy is still
507
- * visible, drop border/radius/shadow/background on the other sides.
508
- * -------------------------------------------------------------------- */
593
+ /* Nested details: strip the outer-card treatment so a REQ card
594
+ expanded to show its US children doesn't render "card inside card
595
+ inside card". Keep the coloured left accent so hierarchy is still
596
+ visible, drop border/radius/shadow/background on the other sides. */
509
597
 
510
598
  details.doc-details details.doc-details {
511
599
  border-top-color: transparent;
@@ -518,9 +606,7 @@ details.doc-details details.doc-details {
518
606
  }
519
607
 
520
608
  details.doc-details details.doc-details:hover,
521
- details.doc-details details.doc-details[open] {
522
- box-shadow: none;
523
- }
609
+ details.doc-details details.doc-details[open] { box-shadow: none; }
524
610
 
525
611
  details.doc-details details.doc-details:hover {
526
612
  border-top-color: transparent;
@@ -533,12 +619,10 @@ details.doc-details details.doc-details > summary {
533
619
  border-radius: 0;
534
620
  }
535
621
 
536
- details.doc-details details.doc-details > summary:hover {
537
- background: var(--colour-surface);
538
- }
622
+ details.doc-details details.doc-details > summary:hover { background: var(--sv-raised); }
539
623
 
540
624
  details.doc-details details.doc-details[open] > summary {
541
- border-bottom: 1px dashed var(--colour-border);
625
+ border-bottom: 1px dashed var(--sv-border);
542
626
  border-radius: 0;
543
627
  }
544
628
 
@@ -552,26 +636,26 @@ details.doc-details details.doc-details > .us-body {
552
636
  /* Raw-JSON disclosure (dev-facing, quiet) */
553
637
  details.raw-json {
554
638
  margin-top: 1rem;
555
- border-top: 1px dashed var(--colour-border);
639
+ border-top: 1px dashed var(--sv-border);
556
640
  padding-top: 0.75rem;
557
641
  }
558
642
 
559
643
  details.raw-json summary {
560
644
  cursor: pointer;
561
- color: var(--colour-muted);
645
+ color: var(--sv-muted);
562
646
  font-size: 0.8125rem;
563
647
  padding: 0.15rem 0;
564
648
  }
565
649
 
566
- details.raw-json summary:hover { color: var(--colour-accent); }
650
+ details.raw-json summary:hover { color: var(--sv-link); }
567
651
 
568
652
  details.raw-json pre {
569
- background: var(--colour-surface-2);
653
+ background: var(--sv-raised);
570
654
  padding: 0.85rem 1rem;
571
655
  border-radius: var(--radius-sm);
572
656
  overflow-x: auto;
573
657
  font-size: 0.8rem;
574
- border: 1px solid var(--colour-border);
658
+ border: 1px solid var(--sv-border);
575
659
  margin-top: 0.5rem;
576
660
  }
577
661
 
@@ -580,27 +664,31 @@ details.raw-json pre {
580
664
  * -------------------------------------------------------------------- */
581
665
 
582
666
  a {
583
- color: var(--colour-link);
667
+ color: var(--sv-link);
584
668
  text-decoration: none;
585
669
  transition: color var(--t-fast);
586
670
  }
587
671
 
588
672
  a:hover {
589
- color: var(--colour-accent-hover);
673
+ color: var(--sv-hover);
590
674
  text-decoration: underline;
591
675
  text-underline-offset: 3px;
592
676
  }
593
677
 
678
+ :where(a, button, input, select, summary, [tabindex]):focus-visible {
679
+ outline: 3px solid var(--sv-focus);
680
+ outline-offset: 2px;
681
+ }
682
+
594
683
  code {
595
- background: var(--colour-surface-2);
684
+ background: var(--sv-code);
596
685
  padding: 0.12rem 0.35rem;
597
686
  border-radius: 4px;
598
687
  font-size: 0.875em;
599
- font-family: 'JetBrains Mono', 'SF Mono', ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
600
- color: #3730a3;
688
+ font-family: var(--sv-mono);
689
+ color: var(--sv-link);
601
690
  }
602
691
 
603
- /* Status pill (compact, coloured by status) */
604
692
  .status {
605
693
  display: inline-block;
606
694
  padding: 0.15rem 0.6rem;
@@ -613,33 +701,33 @@ code {
613
701
  }
614
702
 
615
703
  .status.notStarted {
616
- color: var(--colour-muted);
617
- background: var(--colour-surface-2);
618
- border-color: var(--colour-border);
704
+ color: var(--sv-muted);
705
+ background: var(--sv-raised);
706
+ border-color: var(--sv-border);
619
707
  }
620
708
 
621
709
  .status.inProgress {
622
- color: #0c4a6e;
623
- background: #e0f2fe;
624
- border-color: #bae6fd;
710
+ color: var(--sv-link);
711
+ background: var(--sv-active);
712
+ border-color: var(--sv-link);
625
713
  }
626
714
 
627
715
  .status.complete {
628
- color: #065f46;
629
- background: #d1fae5;
630
- border-color: #a7f3d0;
716
+ color: var(--sv-success);
717
+ background: var(--sv-successbg);
718
+ border-color: var(--sv-success);
631
719
  }
632
720
 
633
721
  .status.verified {
634
- color: #14532d;
635
- background: #bbf7d0;
636
- border-color: #86efac;
722
+ color: var(--sv-success);
723
+ background: var(--sv-successbg);
724
+ border-color: var(--sv-success);
637
725
  }
638
726
 
639
727
  .status.blocked {
640
- color: var(--colour-broken-text);
641
- background: var(--colour-broken-bg);
642
- border-color: var(--colour-broken-border);
728
+ color: var(--sv-danger);
729
+ background: var(--sv-dangerbg);
730
+ border-color: var(--sv-danger);
643
731
  }
644
732
 
645
733
  .status.draft,
@@ -650,38 +738,33 @@ code {
650
738
  .status.deprecated,
651
739
  .status.proposed,
652
740
  .status.accepted {
653
- color: var(--colour-muted);
654
- background: var(--colour-surface-2);
655
- border-color: var(--colour-border);
741
+ color: var(--sv-muted);
742
+ background: var(--sv-raised);
743
+ border-color: var(--sv-border);
656
744
  }
657
745
 
658
746
  .status.approved,
659
- .status.accepted { color: #065f46; background: #d1fae5; border-color: #a7f3d0; }
747
+ .status.accepted { color: var(--sv-success); background: var(--sv-successbg); border-color: var(--sv-success); }
660
748
  .status.deprecated,
661
- .status.superseded { color: var(--colour-muted); background: var(--colour-surface); border-color: var(--colour-border); }
749
+ .status.superseded { color: var(--sv-muted); background: var(--sv-raised); border-color: var(--sv-border); }
662
750
 
663
- /* Broken doc / tree error banner */
664
751
  .broken {
665
- background: var(--colour-broken-bg);
666
- border: 1px solid var(--colour-broken-border);
667
- color: var(--colour-broken-text);
752
+ background: var(--sv-dangerbg);
753
+ border: 1px solid var(--sv-danger);
754
+ color: var(--sv-danger);
668
755
  padding: 0.65rem 0.9rem;
669
756
  border-radius: var(--radius-sm);
670
757
  margin-bottom: 0.85rem;
671
758
  }
672
759
 
673
- .broken ul {
674
- margin: 0.3rem 0 0 1.35rem;
675
- }
760
+ .broken ul { margin: 0.3rem 0 0 1.35rem; }
676
761
 
677
- .broken-doc {
678
- border-left-color: var(--colour-broken-border);
679
- }
762
+ .broken-doc { border-left-color: var(--sv-danger); }
680
763
 
681
764
  .tree-errors {
682
- background: var(--colour-broken-bg);
683
- border: 1px solid var(--colour-broken-border);
684
- color: var(--colour-broken-text);
765
+ background: var(--sv-dangerbg);
766
+ border: 1px solid var(--sv-danger);
767
+ color: var(--sv-danger);
685
768
  padding: 1.1rem 1.35rem;
686
769
  border-radius: var(--radius-md);
687
770
  margin-bottom: 2rem;
@@ -692,7 +775,7 @@ code {
692
775
  margin: 0 0 0.5rem;
693
776
  font-size: 1.15rem;
694
777
  font-weight: 700;
695
- color: var(--colour-broken-text);
778
+ color: var(--sv-danger);
696
779
  border: none;
697
780
  padding: 0;
698
781
  }
@@ -701,27 +784,72 @@ code {
701
784
  * Footer
702
785
  * -------------------------------------------------------------------- */
703
786
 
704
- footer {
705
- border-top: 1px solid var(--colour-border);
706
- padding-top: 1.25rem;
707
- margin-top: 3rem;
708
- color: var(--colour-muted);
709
- font-size: 0.85rem;
787
+ /* Shell footer: one compact muted line - version, GitHub, docs
788
+ links (new tab, rel="noopener", never target="_top") and the
789
+ live-update pill as the current viewer's connection dot. Hidden
790
+ under data-embed="1" per the Dex / wespa contract. */
791
+ footer.app-footer {
792
+ max-width: 1280px;
793
+ width: 100%;
794
+ margin: 0 auto;
795
+ padding: 0.55rem 1rem;
796
+ border-top: 1px solid var(--sv-border);
797
+ color: var(--sv-muted);
798
+ font-size: 0.78rem;
799
+ flex-shrink: 0;
800
+ display: flex;
801
+ align-items: center;
802
+ flex-wrap: wrap;
803
+ gap: 0.6rem;
804
+ }
805
+
806
+ footer.app-footer a {
807
+ color: var(--sv-link);
808
+ text-decoration: none;
809
+ }
810
+
811
+ footer.app-footer a:hover { text-decoration: underline; }
812
+
813
+ footer.app-footer .sep { color: var(--sv-control); }
814
+
815
+ footer.app-footer .live {
816
+ margin-left: auto;
817
+ display: inline-flex;
818
+ align-items: center;
819
+ gap: 0.4rem;
820
+ padding: 0.2rem 0.55rem;
821
+ border: 1px solid var(--sv-control);
822
+ border-radius: 999px;
823
+ background: var(--sv-raised);
824
+ white-space: nowrap;
825
+ color: var(--sv-muted);
826
+ }
827
+
828
+ footer.app-footer .live .dot {
829
+ width: 8px;
830
+ height: 8px;
831
+ border-radius: 50%;
832
+ background: #4c9a2a;
833
+ display: inline-block;
710
834
  }
711
835
 
836
+ footer.app-footer .live.reconnecting .dot { background: #d68f00; }
837
+ footer.app-footer .live.disconnected .dot { background: #b03a2e; }
838
+
712
839
  /* --------------------------------------------------------------------
713
840
  * Print
714
841
  * -------------------------------------------------------------------- */
715
842
 
716
843
  @media print {
717
- body { max-width: none; padding: 0; }
844
+ html, body { height: auto; }
845
+ body { max-width: none; padding: 0; display: block; }
846
+ header.app-header { position: static; border: none; }
718
847
  nav.tabs { display: none; }
719
848
  section[role="tabpanel"][hidden] { display: block !important; }
720
849
  pre.mermaid { page-break-inside: avoid; }
721
850
  article.doc { page-break-inside: avoid; box-shadow: none; }
722
851
  details.doc-details { break-inside: avoid; box-shadow: none; }
723
852
  details.doc-details[open] > summary { border: none; }
724
- header h1::before { display: none; }
725
853
  }
726
854
 
727
855
  /* --------------------------------------------------------------------
@@ -729,9 +857,13 @@ footer {
729
857
  * -------------------------------------------------------------------- */
730
858
 
731
859
  @media (max-width: 720px) {
732
- body { padding: 0 1rem 2rem; }
733
- header h1 { font-size: 1.55rem; }
734
- nav.tabs button { padding: 0.5rem 0.8rem; font-size: 0.9rem; }
860
+ header.app-header .bar { flex-wrap: wrap; gap: 0.75rem; padding: 0.5rem 0.75rem 0; }
861
+ .product { flex: 1; }
862
+ .product .sub { display: none; }
863
+ /* Narrow: tabs wrap beneath the bar as their own full-width row. */
864
+ nav.tabs { order: 3; flex: 1 1 100%; margin-left: 0; }
865
+ nav.tabs button { padding: 0 0.65rem; font-size: 0.9rem; }
866
+ main { padding: 1rem 0.75rem 2rem; }
735
867
  article.doc { padding: 1rem 1.15rem; }
736
868
  details.doc-details > article,
737
869
  details.doc-details > section,
@@ -741,19 +873,6 @@ footer {
741
873
 
742
874
  /* --------------------------------------------------------------------
743
875
  * Deep-link scope overlay (w-2026-08-30-dave-020)
744
- *
745
- * When body.rcf-scoped is present the client has applied a URL-driven
746
- * scope (blueprint / node). Everything inside #rcf-live-content is
747
- * dimmed except:
748
- * - .rcf-in-scope a doc that IS in the scope set
749
- * - .rcf-scope-ancestor an ancestor of an in-scope doc (kept full
750
- * strength so the drill-down chain is legible)
751
- * - .rcf-customised an in-scope doc whose bytes differ from
752
- * the shipping blueprint source (a project
753
- * customisation over the applied contribution)
754
- *
755
- * Left visible-but-dimmed rather than hidden so the reader can see
756
- * where in the tree the scoped set sits.
757
876
  * -------------------------------------------------------------------- */
758
877
 
759
878
  body.rcf-scoped #rcf-live-content [data-doc-id]:not(.rcf-in-scope):not(.rcf-scope-ancestor) {
@@ -762,38 +881,32 @@ body.rcf-scoped #rcf-live-content [data-doc-id]:not(.rcf-in-scope):not(.rcf-scop
762
881
  }
763
882
  body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope {
764
883
  opacity: 1;
765
- outline: 2px solid #4c9a2a;
884
+ outline: 2px solid var(--sv-success);
766
885
  outline-offset: 2px;
767
886
  }
768
887
  body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
769
- outline-color: #d68f00;
770
- box-shadow: 0 0 0 3px rgba(214, 143, 0, 0.18);
888
+ outline-color: var(--sv-warning);
889
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--sv-warning) 20%, transparent);
771
890
  }
772
891
 
773
892
  #rcf-scope-banner {
774
893
  margin: 0 0 1rem;
775
894
  padding: 0.5rem 0.8rem;
776
- border: 1px solid #d68f00;
777
- background: #fff7e6;
778
- color: #6b4300;
895
+ border: 1px solid var(--sv-warning);
896
+ background: var(--sv-warningbg);
897
+ color: var(--sv-warning);
779
898
  font-size: 0.9rem;
780
899
  border-radius: 4px;
781
900
  }
782
- #rcf-scope-banner a { color: #b03a2e; text-decoration: underline; }
901
+ #rcf-scope-banner a { color: var(--sv-danger); text-decoration: underline; }
783
902
 
784
903
  /* --------------------------------------------------------------------
785
904
  * Product Map tab (REQ-170, US-17001..17007)
786
- *
787
- * Controls, jump nav, bucket cards, status mini pills, empty rollup.
788
- * Language is the viewer's existing indigo + rounded + soft-shadow
789
- * tokens; no new palette entries, so light and dark stay coherent. The
790
- * layout is single-column at the max page width the viewer uses
791
- * elsewhere (80rem); mobile is not the target (never breaks at 1024px).
792
905
  * -------------------------------------------------------------------- */
793
906
 
794
907
  .pm-controls {
795
908
  position: sticky;
796
- top: 3.25rem; /* below the sticky nav.tabs */
909
+ top: 3rem;
797
910
  z-index: 5;
798
911
  display: flex;
799
912
  flex-wrap: wrap;
@@ -801,20 +914,20 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
801
914
  gap: 0.75rem 1rem;
802
915
  padding: 0.6rem 0.9rem;
803
916
  margin: 0 0 1.1rem;
804
- background: rgba(253, 253, 253, 0.9);
805
- backdrop-filter: saturate(180%) blur(8px);
806
- -webkit-backdrop-filter: saturate(180%) blur(8px);
807
- border: 1px solid var(--colour-border);
917
+ background: var(--sv-surface);
918
+ border: 1px solid var(--sv-border);
808
919
  border-radius: var(--radius-md);
809
920
  box-shadow: var(--shadow-sm);
810
921
  }
811
922
 
923
+ html[data-embed="1"] .pm-controls { top: 3rem; }
924
+
812
925
  .pm-group-tabs {
813
926
  display: inline-flex;
814
927
  gap: 0.15rem;
815
928
  padding: 0.2rem;
816
- background: var(--colour-surface);
817
- border: 1px solid var(--colour-border);
929
+ background: var(--sv-raised);
930
+ border: 1px solid var(--sv-border);
818
931
  border-radius: var(--radius-md);
819
932
  }
820
933
 
@@ -822,7 +935,7 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
822
935
  appearance: none;
823
936
  border: 1px solid transparent;
824
937
  background: transparent;
825
- color: var(--colour-muted);
938
+ color: var(--sv-muted);
826
939
  font-family: inherit;
827
940
  font-size: 0.9rem;
828
941
  font-weight: 500;
@@ -833,52 +946,42 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
833
946
  }
834
947
 
835
948
  .pm-group-btn:hover {
836
- color: var(--colour-heading);
837
- background: var(--colour-bg);
949
+ color: var(--sv-ink);
950
+ background: var(--sv-surface);
838
951
  }
839
952
 
840
953
  .pm-group-btn[aria-selected="true"] {
841
- background: var(--colour-bg);
842
- color: var(--colour-heading);
954
+ background: var(--sv-surface);
955
+ color: var(--sv-ink);
843
956
  font-weight: 600;
844
957
  box-shadow: var(--shadow-sm);
845
- border-color: var(--colour-border);
846
- }
847
-
848
- .pm-group-btn:focus-visible {
849
- outline: 2px solid var(--colour-accent);
850
- outline-offset: 2px;
958
+ border-color: var(--sv-border);
851
959
  }
852
960
 
853
961
  .pm-status-filter {
854
962
  display: inline-flex;
855
963
  align-items: center;
856
964
  gap: 0.5rem;
857
- color: var(--colour-muted);
965
+ color: var(--sv-muted);
858
966
  font-size: 0.85rem;
859
967
  }
860
968
 
861
969
  .pm-status-select {
862
970
  appearance: none;
863
971
  -webkit-appearance: none;
864
- border: 1px solid var(--colour-border);
972
+ border: 1px solid var(--sv-control);
865
973
  border-radius: var(--radius-sm);
866
- background: var(--colour-bg);
974
+ background: var(--sv-surface);
867
975
  padding: 0.35rem 2rem 0.35rem 0.75rem;
868
976
  font-family: inherit;
869
977
  font-size: 0.9rem;
870
- color: var(--colour-heading);
978
+ color: var(--sv-ink);
871
979
  cursor: pointer;
872
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12'%3E%3Cpath fill='%236b7280' d='M2 4l4 4 4-4z'/%3E%3C/svg%3E");
980
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12'%3E%3Cpath fill='%23738198' d='M2 4l4 4 4-4z'/%3E%3C/svg%3E");
873
981
  background-repeat: no-repeat;
874
982
  background-position: right 0.55rem center;
875
983
  }
876
984
 
877
- .pm-status-select:focus-visible {
878
- outline: 2px solid var(--colour-accent);
879
- outline-offset: 2px;
880
- }
881
-
882
985
  .pm-bulk {
883
986
  display: inline-flex;
884
987
  gap: 0.4rem;
@@ -887,9 +990,9 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
887
990
 
888
991
  .pm-bulk-btn {
889
992
  appearance: none;
890
- border: 1px solid var(--colour-border);
891
- background: var(--colour-bg);
892
- color: var(--colour-muted);
993
+ border: 1px solid var(--sv-border);
994
+ background: var(--sv-surface);
995
+ color: var(--sv-muted);
893
996
  font-family: inherit;
894
997
  font-size: 0.8rem;
895
998
  font-weight: 500;
@@ -900,18 +1003,17 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
900
1003
  }
901
1004
 
902
1005
  .pm-bulk-btn:hover {
903
- color: var(--colour-heading);
904
- background: var(--colour-accent-subtle);
905
- border-color: var(--colour-accent-subtle);
1006
+ color: var(--sv-ink);
1007
+ background: var(--sv-active);
1008
+ border-color: var(--sv-link);
906
1009
  }
907
1010
 
908
- /* Grouping heading and jump nav */
909
1011
  .pm-group-heading {
910
1012
  font-size: 0.8rem;
911
1013
  font-weight: 600;
912
1014
  text-transform: uppercase;
913
1015
  letter-spacing: 0.06em;
914
- color: var(--colour-muted);
1016
+ color: var(--sv-muted);
915
1017
  margin: 0.5rem 0 0.75rem;
916
1018
  }
917
1019
 
@@ -921,16 +1023,16 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
921
1023
  gap: 0.35rem;
922
1024
  padding: 0.55rem 0.7rem;
923
1025
  margin-bottom: 1rem;
924
- background: var(--colour-surface);
925
- border: 1px solid var(--colour-border);
1026
+ background: var(--sv-raised);
1027
+ border: 1px solid var(--sv-border);
926
1028
  border-radius: var(--radius-md);
927
1029
  }
928
1030
 
929
1031
  .pm-jump-chip {
930
1032
  appearance: none;
931
- border: 1px solid var(--colour-border);
932
- background: var(--colour-bg);
933
- color: var(--colour-heading);
1033
+ border: 1px solid var(--sv-border);
1034
+ background: var(--sv-surface);
1035
+ color: var(--sv-ink);
934
1036
  padding: 0.25rem 0.65rem;
935
1037
  border-radius: 999px;
936
1038
  font-family: inherit;
@@ -945,9 +1047,9 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
945
1047
  }
946
1048
 
947
1049
  .pm-jump-chip:hover {
948
- background: var(--colour-accent-subtle);
949
- border-color: #c7d2fe;
950
- color: var(--colour-accent-hover);
1050
+ background: var(--sv-active);
1051
+ border-color: var(--sv-link);
1052
+ color: var(--sv-hover);
951
1053
  }
952
1054
 
953
1055
  .pm-jump-chip .pm-jump-label {
@@ -957,27 +1059,21 @@ body.rcf-scoped #rcf-live-content [data-doc-id].rcf-in-scope.rcf-customised {
957
1059
  }
958
1060
 
959
1061
  .pm-jump-chip .pm-jump-count {
960
- color: var(--colour-muted);
1062
+ color: var(--sv-muted);
961
1063
  font-variant-numeric: tabular-nums;
962
1064
  font-size: 0.75rem;
963
1065
  }
964
1066
 
965
- .pm-jump-chip:focus-visible {
966
- outline: 2px solid var(--colour-accent);
967
- outline-offset: 2px;
968
- }
969
-
970
- /* Buckets: <details class="pm-bucket"> */
971
1067
  details.pm-bucket {
972
- border: 1px solid var(--colour-border);
1068
+ border: 1px solid var(--sv-border);
973
1069
  border-radius: var(--radius-md);
974
- background: var(--colour-bg);
1070
+ background: var(--sv-surface);
975
1071
  box-shadow: var(--shadow-sm);
976
1072
  margin-bottom: 0.6rem;
977
1073
  transition: box-shadow var(--t-med), border-color var(--t-med);
978
1074
  }
979
1075
 
980
- details.pm-bucket:hover { border-color: var(--colour-border-strong); }
1076
+ details.pm-bucket:hover { border-color: var(--sv-control); }
981
1077
  details.pm-bucket[open] { box-shadow: var(--shadow-md); }
982
1078
 
983
1079
  details.pm-bucket > summary.pm-bucket-heading {
@@ -988,33 +1084,30 @@ details.pm-bucket > summary.pm-bucket-heading {
988
1084
  align-items: center;
989
1085
  gap: 0.65rem;
990
1086
  border-radius: var(--radius-md);
991
- color: var(--colour-heading);
1087
+ color: var(--sv-ink);
992
1088
  font-weight: 600;
993
1089
  font-size: 0.95rem;
994
1090
  }
995
1091
 
996
1092
  details.pm-bucket > summary.pm-bucket-heading::-webkit-details-marker { display: none; }
997
1093
 
998
- /* Custom chevron matching the doc-details drilldowns */
999
1094
  details.pm-bucket > summary.pm-bucket-heading::before {
1000
1095
  content: '';
1001
1096
  display: inline-block;
1002
1097
  width: 0.6rem;
1003
1098
  height: 0.6rem;
1004
- border-right: 2px solid var(--colour-muted);
1005
- border-bottom: 2px solid var(--colour-muted);
1099
+ border-right: 2px solid var(--sv-control);
1100
+ border-bottom: 2px solid var(--sv-control);
1006
1101
  transform: rotate(-45deg);
1007
1102
  transition: transform var(--t-fast);
1008
1103
  flex-shrink: 0;
1009
1104
  }
1010
1105
 
1011
- details.pm-bucket[open] > summary.pm-bucket-heading::before {
1012
- transform: rotate(45deg);
1013
- }
1106
+ details.pm-bucket[open] > summary.pm-bucket-heading::before { transform: rotate(45deg); }
1014
1107
 
1015
1108
  details.pm-bucket[open] > summary.pm-bucket-heading {
1016
1109
  border-radius: var(--radius-md) var(--radius-md) 0 0;
1017
- border-bottom: 1px solid var(--colour-border);
1110
+ border-bottom: 1px solid var(--sv-border);
1018
1111
  }
1019
1112
 
1020
1113
  .pm-bucket-label {
@@ -1026,14 +1119,12 @@ details.pm-bucket[open] > summary.pm-bucket-heading {
1026
1119
  }
1027
1120
 
1028
1121
  .pm-bucket-count {
1029
- color: var(--colour-muted);
1122
+ color: var(--sv-muted);
1030
1123
  font-weight: 500;
1031
1124
  font-variant-numeric: tabular-nums;
1032
1125
  }
1033
1126
 
1034
- .pm-bucket-anchor {
1035
- display: none;
1036
- }
1127
+ .pm-bucket-anchor { display: none; }
1037
1128
 
1038
1129
  .pm-mini-row {
1039
1130
  display: inline-flex;
@@ -1050,38 +1141,32 @@ details.pm-bucket[open] > summary.pm-bucket-heading {
1050
1141
  font-size: 0.72rem;
1051
1142
  font-weight: 600;
1052
1143
  text-align: center;
1053
- color: var(--colour-muted);
1054
- background: var(--colour-surface-2);
1055
- border: 1px solid var(--colour-border);
1144
+ color: var(--sv-muted);
1145
+ background: var(--sv-raised);
1146
+ border: 1px solid var(--sv-border);
1056
1147
  font-variant-numeric: tabular-nums;
1057
1148
  }
1058
1149
 
1059
- .pm-mini-approved { color: #065f46; background: #d1fae5; border-color: #a7f3d0; }
1060
- .pm-mini-review { color: #0c4a6e; background: #e0f2fe; border-color: #bae6fd; }
1061
- .pm-mini-draft { color: var(--colour-muted); background: var(--colour-surface); border-color: var(--colour-border); }
1062
- .pm-mini-needsRevision { color: var(--colour-broken-text); background: var(--colour-broken-bg); border-color: var(--colour-broken-border); }
1063
- .pm-mini-superseded { color: var(--colour-subtle); background: var(--colour-surface); border-color: var(--colour-border); }
1064
-
1065
- .pm-bucket-body {
1066
- padding: 0.75rem 1rem 1rem;
1067
- }
1150
+ .pm-mini-approved { color: var(--sv-success); background: var(--sv-successbg); border-color: var(--sv-success); }
1151
+ .pm-mini-review { color: var(--sv-link); background: var(--sv-active); border-color: var(--sv-link); }
1152
+ .pm-mini-draft { color: var(--sv-muted); background: var(--sv-raised); border-color: var(--sv-border); }
1153
+ .pm-mini-needsRevision { color: var(--sv-danger); background: var(--sv-dangerbg); border-color: var(--sv-danger); }
1154
+ .pm-mini-superseded { color: var(--sv-control); background: var(--sv-raised); border-color: var(--sv-border); }
1068
1155
 
1156
+ .pm-bucket-body { padding: 0.75rem 1rem 1rem; }
1069
1157
  .pm-bucket-body .pm-tad-root { margin-bottom: 0.65rem; }
1070
1158
 
1071
1159
  .pm-bucket-empty {
1072
- color: var(--colour-muted);
1160
+ color: var(--sv-muted);
1073
1161
  font-size: 0.85rem;
1074
1162
  }
1075
1163
 
1076
- /* Empty-under-filter rollup */
1077
- .pm-empty-roll {
1078
- margin-bottom: 0.75rem;
1079
- }
1164
+ .pm-empty-roll { margin-bottom: 0.75rem; }
1080
1165
  .pm-empty-toggle {
1081
1166
  appearance: none;
1082
- border: 1px dashed var(--colour-border-strong);
1083
- background: var(--colour-surface);
1084
- color: var(--colour-muted);
1167
+ border: 1px dashed var(--sv-control);
1168
+ background: var(--sv-raised);
1169
+ color: var(--sv-muted);
1085
1170
  padding: 0.4rem 0.8rem;
1086
1171
  border-radius: var(--radius-sm);
1087
1172
  font-family: inherit;
@@ -1090,28 +1175,22 @@ details.pm-bucket[open] > summary.pm-bucket-heading {
1090
1175
  cursor: pointer;
1091
1176
  }
1092
1177
  .pm-empty-toggle:hover {
1093
- color: var(--colour-heading);
1094
- background: var(--colour-accent-subtle);
1178
+ color: var(--sv-ink);
1179
+ background: var(--sv-active);
1095
1180
  }
1096
1181
 
1097
- /* When active grouping is in hide-empty mode, hide empty buckets */
1098
- .pm-group.pm-hide-empty details.pm-bucket[data-pm-empty-under-filter="true"] {
1099
- display: none;
1100
- }
1182
+ .pm-group.pm-hide-empty details.pm-bucket[data-pm-empty-under-filter="true"] { display: none; }
1101
1183
 
1102
- /* Loading state */
1103
1184
  .pm-group[data-pm-loading="true"] .pm-jump-nav::after {
1104
1185
  content: 'Loading grouping...';
1105
- color: var(--colour-muted);
1186
+ color: var(--sv-muted);
1106
1187
  font-size: 0.8rem;
1107
1188
  margin-left: 0.5rem;
1108
1189
  }
1109
1190
 
1110
- /* Compact spacing for nested pm-req cards inside a bucket body */
1111
1191
  .pm-bucket-body details.doc-req-wrap.pm-req { margin-bottom: 0.5rem; }
1112
1192
  .pm-bucket-body .pm-comp-story details.doc-us-wrap.pm-us { margin-bottom: 0.5rem; }
1113
1193
 
1114
- /* Print: reveal every bucket */
1115
1194
  @media print {
1116
1195
  details.pm-bucket { break-inside: avoid; box-shadow: none; }
1117
1196
  details.pm-bucket[open] > summary.pm-bucket-heading { border-bottom: none; }
@@ -1119,10 +1198,6 @@ details.pm-bucket[open] > summary.pm-bucket-heading {
1119
1198
  .pm-jump-nav { display: none; }
1120
1199
  }
1121
1200
 
1122
- /* Blueprint badge (AC-17008-1). Rendered inside every pm-req summary
1123
- whose REQ came from an applied blueprint, and inside pm-req-parent
1124
- lines. Compact, low-contrast pill so it reads as attribution rather
1125
- than status. */
1126
1201
  .pm-blueprint-badge {
1127
1202
  display: inline-block;
1128
1203
  margin-left: 0.4rem;
@@ -1130,31 +1205,1591 @@ details.pm-bucket[open] > summary.pm-bucket-heading {
1130
1205
  border-radius: 999px;
1131
1206
  font-size: 0.68rem;
1132
1207
  font-weight: 600;
1133
- color: var(--colour-muted);
1134
- background: var(--colour-surface-2);
1135
- border: 1px solid var(--colour-border);
1208
+ color: var(--sv-muted);
1209
+ background: var(--sv-raised);
1210
+ border: 1px solid var(--sv-border);
1136
1211
  font-variant-numeric: tabular-nums;
1137
1212
  letter-spacing: 0.01em;
1138
1213
  vertical-align: baseline;
1139
1214
  text-transform: none;
1140
1215
  }
1141
1216
 
1142
- .pm-blueprint-cap {
1143
- margin: 0.85rem 0 0.25rem;
1144
- }
1217
+ .pm-blueprint-cap { margin: 0.85rem 0 0.25rem; }
1145
1218
  .pm-blueprint-cap-heading {
1146
1219
  margin: 0 0 0.35rem;
1147
1220
  font-size: 0.85rem;
1148
1221
  font-weight: 600;
1149
- color: var(--colour-muted);
1222
+ color: var(--sv-muted);
1150
1223
  text-transform: uppercase;
1151
1224
  letter-spacing: 0.03em;
1152
1225
  }
1153
1226
  .pm-blueprint-cap-count {
1154
1227
  font-weight: 500;
1155
- color: var(--colour-subtle);
1228
+ color: var(--sv-control);
1156
1229
  margin-left: 0.25rem;
1157
1230
  }
1158
- .pm-blueprint-cap-body {
1159
- display: block;
1231
+ .pm-blueprint-cap-body { display: block; }
1232
+
1233
+ /* --------------------------------------------------------------------
1234
+ * Viewer UI refresh PR 2 (w-2026-10-02-dave-010): shared component
1235
+ * stylesheet. Mounted alongside the pre-existing selectors so each
1236
+ * component (DocRow, FilterBar, Badge, EmptyState, Toast, SubTabStrip)
1237
+ * can be mounted by later tabs without touching the base rules.
1238
+ * Compact density is a requirement, not a default - the paddings here
1239
+ * are deliberately tighter than the pre-PR-1 shell (decision 13).
1240
+ * -------------------------------------------------------------------- */
1241
+
1242
+ /* DocRow (replaces details.doc-details under the new component model;
1243
+ old and new coexist until each tab is cut over, PRs 3-6). */
1244
+ details.rcf-row {
1245
+ background: var(--sv-surface);
1246
+ border: 1px solid var(--sv-border);
1247
+ border-radius: var(--radius-md);
1248
+ margin-bottom: 0.4rem;
1249
+ box-shadow: var(--shadow-sm);
1250
+ transition: box-shadow var(--t-med), border-color var(--t-med);
1251
+ }
1252
+
1253
+ details.rcf-row:hover { border-color: var(--sv-control); }
1254
+ details.rcf-row[open] { box-shadow: var(--shadow-md); }
1255
+ details.rcf-row[hidden] { display: none; }
1256
+
1257
+ details.rcf-row > summary {
1258
+ list-style: none;
1259
+ cursor: pointer;
1260
+ padding: 0.55rem 0.75rem;
1261
+ display: flex;
1262
+ align-items: center;
1263
+ gap: 0.6rem;
1264
+ border-radius: var(--radius-md);
1265
+ color: var(--sv-ink);
1266
+ font-weight: 500;
1267
+ transition: background var(--t-fast);
1268
+ }
1269
+
1270
+ details.rcf-row > summary::-webkit-details-marker { display: none; }
1271
+
1272
+ details.rcf-row > summary::before {
1273
+ content: '';
1274
+ display: inline-block;
1275
+ width: 0.45rem;
1276
+ height: 0.45rem;
1277
+ border-right: 2px solid var(--sv-control);
1278
+ border-bottom: 2px solid var(--sv-control);
1279
+ transform: rotate(-45deg);
1280
+ transition: transform var(--t-fast);
1281
+ flex-shrink: 0;
1282
+ }
1283
+
1284
+ details.rcf-row[open] > summary::before { transform: rotate(45deg); }
1285
+
1286
+ details.rcf-row > summary:hover { background: var(--sv-raised); }
1287
+
1288
+ details.rcf-row > summary .id {
1289
+ font-family: var(--sv-mono);
1290
+ font-size: 0.85rem;
1291
+ color: var(--sv-link);
1292
+ flex-shrink: 0;
1293
+ }
1294
+
1295
+ details.rcf-row > summary .title {
1296
+ flex: 1 1 auto;
1297
+ min-width: 0;
1298
+ overflow: hidden;
1299
+ text-overflow: ellipsis;
1300
+ white-space: nowrap;
1301
+ }
1302
+
1303
+ details.rcf-row > summary .meta {
1304
+ display: flex;
1305
+ flex-wrap: wrap;
1306
+ gap: 0.3rem;
1307
+ align-items: center;
1308
+ flex-shrink: 0;
1309
+ margin-left: auto;
1310
+ }
1311
+
1312
+ details.rcf-row[open] > summary {
1313
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
1314
+ border-bottom: 1px solid var(--sv-border);
1315
+ }
1316
+
1317
+ details.rcf-row > .rcf-row-body {
1318
+ padding: 0.65rem 0.9rem 0.85rem 1.95rem;
1319
+ }
1320
+
1321
+ details.rcf-row > .rcf-row-body > p:first-child { margin-top: 0; }
1322
+ details.rcf-row > .rcf-row-body > p:last-child { margin-bottom: 0; }
1323
+
1324
+ /* Badge: count / facet / accent variants. */
1325
+ .rcf-badge {
1326
+ display: inline-flex;
1327
+ align-items: baseline;
1328
+ gap: 0.3rem;
1329
+ padding: 0 0.5rem;
1330
+ min-height: 1.1rem;
1331
+ border-radius: 0.3rem;
1332
+ font-size: 0.72rem;
1333
+ font-weight: 700;
1334
+ border: 1px solid var(--sv-border);
1335
+ background: var(--sv-raised);
1336
+ color: var(--sv-muted);
1337
+ white-space: nowrap;
1338
+ font-variant-numeric: tabular-nums;
1339
+ line-height: 1.4;
1340
+ }
1341
+
1342
+ .rcf-badge .rcf-badge-label {
1343
+ color: var(--sv-muted);
1344
+ font-weight: 500;
1345
+ text-transform: uppercase;
1346
+ letter-spacing: 0.04em;
1347
+ font-size: 0.65rem;
1348
+ }
1349
+
1350
+ .rcf-badge .rcf-badge-value {
1351
+ color: var(--sv-ink);
1352
+ }
1353
+
1354
+ .rcf-badge--facet {
1355
+ background: var(--sv-raised);
1356
+ color: var(--sv-ink);
1357
+ border-color: var(--sv-border);
1358
+ }
1359
+
1360
+ .rcf-badge--facet .rcf-badge-value {
1361
+ color: var(--sv-ink);
1362
+ font-weight: 600;
1363
+ }
1364
+
1365
+ .rcf-badge--accent {
1366
+ background: var(--sv-active);
1367
+ border-color: var(--sv-link);
1368
+ color: var(--sv-link);
1369
+ }
1370
+
1371
+ .rcf-badge--accent .rcf-badge-label { color: var(--sv-link); }
1372
+ .rcf-badge--accent .rcf-badge-value { color: var(--sv-link); }
1373
+
1374
+ /* FilterBar: sticky under the tabstrip, inline controls with a right-
1375
+ hand live count and an Expand all affordance. */
1376
+ .rcf-filterbar {
1377
+ display: flex;
1378
+ flex-wrap: wrap;
1379
+ gap: 0.5rem 0.75rem;
1380
+ align-items: center;
1381
+ padding: 0.55rem 0.75rem;
1382
+ margin: 0 0 0.75rem;
1383
+ background: var(--sv-surface);
1384
+ border: 1px solid var(--sv-border);
1385
+ border-radius: var(--radius-md);
1386
+ position: sticky;
1387
+ top: 3rem;
1388
+ z-index: 10;
1389
+ box-shadow: var(--shadow-sm);
1390
+ }
1391
+
1392
+ .rcf-filterbar .rcf-filter-text {
1393
+ flex: 1 1 16rem;
1394
+ min-width: 10rem;
1395
+ min-height: 2.1rem;
1396
+ padding: 0 0.55rem;
1397
+ border: 1px solid var(--sv-control);
1398
+ border-radius: var(--radius-sm);
1399
+ background: var(--sv-surface);
1400
+ color: var(--sv-ink);
1401
+ font: inherit;
1402
+ }
1403
+
1404
+ .rcf-filterbar .rcf-filter-label {
1405
+ display: inline-flex;
1406
+ gap: 0.4rem;
1407
+ align-items: center;
1408
+ color: var(--sv-muted);
1409
+ font-size: 0.85rem;
1410
+ white-space: nowrap;
1411
+ }
1412
+
1413
+ .rcf-filterbar .rcf-filter-select {
1414
+ min-height: 2.1rem;
1415
+ padding: 0 0.5rem;
1416
+ border: 1px solid var(--sv-control);
1417
+ border-radius: var(--radius-sm);
1418
+ background: var(--sv-surface);
1419
+ color: var(--sv-ink);
1420
+ font: inherit;
1421
+ }
1422
+
1423
+ .rcf-filterbar .rcf-filter-toggle {
1424
+ display: inline-flex;
1425
+ align-items: center;
1426
+ gap: 0.35rem;
1427
+ color: var(--sv-muted);
1428
+ font-size: 0.85rem;
1429
+ white-space: nowrap;
1430
+ }
1431
+
1432
+ .rcf-filterbar .rcf-filter-toggle input {
1433
+ margin: 0;
1434
+ accent-color: var(--sv-link);
1435
+ }
1436
+
1437
+ .rcf-filterbar .rcf-filter-count {
1438
+ margin-left: auto;
1439
+ color: var(--sv-muted);
1440
+ font-size: 0.85rem;
1441
+ font-variant-numeric: tabular-nums;
1442
+ white-space: nowrap;
1443
+ }
1444
+
1445
+ .rcf-filterbar .rcf-filter-expand {
1446
+ appearance: none;
1447
+ background: none;
1448
+ border: 0;
1449
+ padding: 0;
1450
+ color: var(--sv-link);
1451
+ cursor: pointer;
1452
+ font: inherit;
1453
+ font-size: 0.85rem;
1454
+ text-decoration: underline;
1455
+ text-underline-offset: 2px;
1456
+ }
1457
+
1458
+ .rcf-filterbar .rcf-filter-expand:hover { color: var(--sv-hover); }
1459
+
1460
+ html[data-embed="1"] .rcf-filterbar { top: 2.75rem; }
1461
+
1462
+ /* EmptyState: dashed outline, centred muted text. */
1463
+ .rcf-empty-state {
1464
+ padding: 1rem;
1465
+ border: 1px dashed var(--sv-control);
1466
+ border-radius: var(--radius-md);
1467
+ color: var(--sv-muted);
1468
+ text-align: center;
1469
+ background: var(--sv-raised);
1470
+ }
1471
+
1472
+ .rcf-empty-state .rcf-empty-state-title {
1473
+ margin: 0;
1474
+ font-weight: 600;
1475
+ color: var(--sv-ink);
1476
+ }
1477
+
1478
+ .rcf-empty-state .rcf-empty-state-hint {
1479
+ margin: 0.3rem 0 0;
1480
+ font-size: 0.9rem;
1481
+ }
1482
+
1483
+ .rcf-empty-state .rcf-empty-state-action {
1484
+ margin: 0.5rem 0 0;
1485
+ font-size: 0.85rem;
1486
+ color: var(--sv-ink);
1487
+ }
1488
+
1489
+ .rcf-empty-state .rcf-empty-state-action code {
1490
+ background: var(--sv-surface);
1491
+ }
1492
+
1493
+ /* Toast: shell-mounted container, bottom-centre, opacity-fades. */
1494
+ .rcf-toast {
1495
+ position: fixed;
1496
+ left: 50%;
1497
+ bottom: 1.5rem;
1498
+ transform: translateX(-50%);
1499
+ background: var(--sv-ink);
1500
+ color: var(--sv-canvas);
1501
+ padding: 0.55rem 1rem;
1502
+ border-radius: var(--radius-sm);
1503
+ font-size: 0.85rem;
1504
+ box-shadow: var(--shadow-md);
1505
+ opacity: 0;
1506
+ transition: opacity 0.15s ease;
1507
+ pointer-events: none;
1508
+ max-width: 90vw;
1509
+ z-index: 50;
1510
+ }
1511
+
1512
+ .rcf-toast.show { opacity: 1; }
1513
+
1514
+ /* SubTabStrip: chip-like row under a tab heading. */
1515
+ .rcf-subtabs {
1516
+ display: flex;
1517
+ gap: 0.25rem;
1518
+ border-bottom: 1px solid var(--sv-border);
1519
+ margin: 0 0 1rem;
1520
+ }
1521
+
1522
+ .rcf-subtabs button {
1523
+ appearance: none;
1524
+ background: transparent;
1525
+ border: 0;
1526
+ padding: 0.45rem 0.9rem;
1527
+ color: var(--sv-muted);
1528
+ font: inherit;
1529
+ font-size: 0.95rem;
1530
+ font-weight: 500;
1531
+ cursor: pointer;
1532
+ border-bottom: 2px solid transparent;
1533
+ margin-bottom: -1px;
1534
+ transition: color var(--t-fast), border-color var(--t-fast), background var(--t-fast);
1535
+ }
1536
+
1537
+ .rcf-subtabs button:hover {
1538
+ color: var(--sv-ink);
1539
+ background: var(--sv-raised);
1540
+ }
1541
+
1542
+ .rcf-subtabs button[aria-selected="true"] {
1543
+ color: var(--sv-ink);
1544
+ font-weight: 700;
1545
+ border-bottom-color: var(--sv-link);
1546
+ }
1547
+
1548
+ .rcf-subtabs button:focus-visible {
1549
+ outline: 3px solid var(--sv-focus);
1550
+ outline-offset: -3px;
1551
+ }
1552
+
1553
+ /* Decision 17: when the tree carries no project name, the .product
1554
+ block collapses to nothing and the brand icon is on its own. */
1555
+ .product:empty { display: none; }
1556
+
1557
+ /* -----------------------------------------------------------------
1558
+ Viewer UI refresh PR 3: Requirements tab and PRD EntitySelector
1559
+ ----------------------------------------------------------------- */
1560
+
1561
+ /* The Requirements list column: tighter spacing than the generic
1562
+ doc-details so a long list stays scannable. */
1563
+ .rcf-requirements-list { display: block; }
1564
+ .rcf-requirements-list > details.rcf-row { margin-bottom: 0.4rem; }
1565
+
1566
+ /* "Needs work" marker on a REQ row: accent border on the left so it
1567
+ stands out in the long list without screaming. */
1568
+ details.rcf-row.needs-work { border-left: 3px solid var(--sv-warning); }
1569
+ details.rcf-row.needs-work > summary .rcf-badge--accent { color: var(--sv-warning); border-color: var(--sv-warning); }
1570
+
1571
+ .rcf-req-description { margin-top: 0.4rem; }
1572
+ .rcf-req-rationale { font-size: 0.9rem; }
1573
+ .rcf-req-tags { display: flex; flex-wrap: wrap; gap: 0.25rem; margin: 0.5rem 0; }
1574
+ .rcf-req-needswork {
1575
+ padding: 0.4rem 0.6rem;
1576
+ border-left: 3px solid var(--sv-warning);
1577
+ background: var(--sv-warningbg);
1578
+ color: var(--sv-warning);
1579
+ border-radius: var(--radius-sm);
1580
+ margin: 0.4rem 0 0.6rem;
1581
+ font-size: 0.9rem;
1582
+ }
1583
+
1584
+ .rcf-req-stories { margin-top: 0.9rem; }
1585
+ .rcf-req-stories > h4 {
1586
+ margin: 0 0 0.4rem;
1587
+ color: var(--sv-muted);
1588
+ font-size: 0.8rem;
1589
+ text-transform: uppercase;
1590
+ letter-spacing: 0.05em;
1591
+ }
1592
+
1593
+ /* Inner rows (user stories nested under a REQ): slightly recessed. */
1594
+ details.rcf-row.rcf-row--inner {
1595
+ background: var(--sv-canvas);
1596
+ border-color: var(--sv-border);
1597
+ margin-bottom: 0.3rem;
1598
+ }
1599
+ details.rcf-row.rcf-row--inner > summary { padding: 0.4rem 0.6rem; }
1600
+
1601
+ /* Collapsed slice diagram and raw JSON disclosures on a REQ row. */
1602
+ .rcf-req-slice, .rcf-req-raw {
1603
+ margin: 0.6rem 0 0;
1604
+ border: 1px solid var(--sv-border);
1605
+ border-radius: var(--radius-sm);
1606
+ background: var(--sv-canvas);
1607
+ }
1608
+ .rcf-req-slice > summary, .rcf-req-raw > summary {
1609
+ padding: 0.4rem 0.6rem;
1610
+ cursor: pointer;
1611
+ color: var(--sv-muted);
1612
+ font-size: 0.85rem;
1613
+ }
1614
+ .rcf-req-slice-body { padding: 0.5rem 0.75rem 0.75rem; }
1615
+ .rcf-req-raw > pre { padding: 0.6rem 0.75rem; margin: 0; overflow: auto; }
1616
+
1617
+ /* PRD tab (viewer UI refresh PR 3): the five lists collapsed, each
1618
+ with a count badge; EntitySelector sits below the article. */
1619
+ .rcf-prd-list {
1620
+ margin: 0.4rem 0;
1621
+ padding: 0;
1622
+ background: var(--sv-canvas);
1623
+ border: 1px solid var(--sv-border);
1624
+ border-radius: var(--radius-sm);
1625
+ }
1626
+ .rcf-prd-list > summary {
1627
+ list-style: none;
1628
+ display: flex;
1629
+ align-items: center;
1630
+ gap: 0.5rem;
1631
+ padding: 0.5rem 0.75rem;
1632
+ cursor: pointer;
1633
+ }
1634
+ .rcf-prd-list > summary::-webkit-details-marker { display: none; }
1635
+ .rcf-prd-list > summary::before {
1636
+ content: "";
1637
+ width: 0.4rem;
1638
+ height: 0.4rem;
1639
+ border-right: 2px solid var(--sv-control);
1640
+ border-bottom: 2px solid var(--sv-control);
1641
+ transform: rotate(-45deg);
1642
+ transition: transform 0.12s;
1643
+ flex: none;
1644
+ }
1645
+ .rcf-prd-list[open] > summary::before { transform: rotate(45deg); }
1646
+ .rcf-prd-list > summary:hover { background: var(--sv-raised); }
1647
+ .rcf-prd-list-body { padding: 0.25rem 1.25rem 0.75rem; }
1648
+ .rcf-prd-list-body ul { margin: 0.3rem 0; padding-left: 1.1rem; }
1649
+
1650
+ .rcf-prd-requirements {
1651
+ margin-top: 1rem;
1652
+ padding: 0.75rem;
1653
+ background: var(--sv-surface);
1654
+ border: 1px solid var(--sv-border);
1655
+ border-radius: var(--radius-md);
1656
+ }
1657
+ .rcf-prd-requirements-head {
1658
+ display: flex;
1659
+ align-items: baseline;
1660
+ gap: 0.75rem;
1661
+ flex-wrap: wrap;
1662
+ margin-bottom: 0.5rem;
1663
+ }
1664
+ .rcf-prd-requirements-head h3 { margin: 0; }
1665
+ .rcf-prd-requirements-open {
1666
+ margin-left: auto;
1667
+ color: var(--sv-link);
1668
+ text-decoration: none;
1669
+ font-size: 0.9rem;
1670
+ }
1671
+ .rcf-prd-requirements-open:hover { text-decoration: underline; }
1672
+
1673
+ /* EntitySelector itself: total line, type-ahead input + results pane,
1674
+ chip row of area facets. */
1675
+ .rcf-entity-selector {
1676
+ display: block;
1677
+ margin-top: 0.25rem;
1678
+ }
1679
+ .rcf-entity-selector-head {
1680
+ display: flex;
1681
+ align-items: baseline;
1682
+ gap: 0.5rem;
1683
+ margin-bottom: 0.4rem;
1684
+ color: var(--sv-muted);
1685
+ font-size: 0.9rem;
1686
+ }
1687
+ .rcf-entity-selector-total { color: var(--sv-ink); font-weight: 600; }
1688
+ .rcf-entity-selector-jump {
1689
+ position: relative;
1690
+ margin-bottom: 0.5rem;
1691
+ }
1692
+ .rcf-entity-selector-input {
1693
+ width: 100%;
1694
+ min-height: 2.3rem;
1695
+ padding: 0 0.6rem;
1696
+ border: 1px solid var(--sv-control);
1697
+ border-radius: var(--radius-sm);
1698
+ background: var(--sv-surface);
1699
+ color: var(--sv-ink);
1700
+ font: inherit;
1701
+ }
1702
+ .rcf-entity-selector-results {
1703
+ position: absolute;
1704
+ left: 0;
1705
+ right: 0;
1706
+ top: 100%;
1707
+ z-index: 5;
1708
+ margin-top: 0.25rem;
1709
+ padding: 0.25rem;
1710
+ max-height: 20rem;
1711
+ overflow: auto;
1712
+ background: var(--sv-surface);
1713
+ border: 1px solid var(--sv-border);
1714
+ border-radius: var(--radius-sm);
1715
+ box-shadow: var(--shadow-md);
1716
+ }
1717
+ .rcf-entity-selector-result {
1718
+ display: flex;
1719
+ gap: 0.6rem;
1720
+ padding: 0.4rem 0.5rem;
1721
+ text-decoration: none;
1722
+ color: var(--sv-ink);
1723
+ border-radius: var(--radius-sm);
1724
+ }
1725
+ .rcf-entity-selector-result:hover { background: var(--sv-raised); }
1726
+ .rcf-entity-selector-result-id {
1727
+ color: var(--sv-link);
1728
+ font-family: var(--sv-mono, ui-monospace, monospace);
1729
+ font-size: 0.85rem;
1730
+ flex: none;
1731
+ }
1732
+ .rcf-entity-selector-result-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1733
+ .rcf-entity-selector-result-facet {
1734
+ color: var(--sv-muted);
1735
+ font-size: 0.8rem;
1736
+ }
1737
+ .rcf-entity-selector-empty { padding: 0.5rem 0.75rem; }
1738
+ .rcf-entity-selector-facets-lead { margin-bottom: 0.35rem; }
1739
+ .rcf-entity-selector-facets {
1740
+ display: flex;
1741
+ flex-wrap: wrap;
1742
+ gap: 0.35rem;
1743
+ }
1744
+ .rcf-entity-selector-chip {
1745
+ display: inline-flex;
1746
+ align-items: center;
1747
+ gap: 0.3rem;
1748
+ padding: 0.15rem 0.6rem;
1749
+ border-radius: 999px;
1750
+ border: 1px solid var(--sv-control);
1751
+ background: var(--sv-surface);
1752
+ color: var(--sv-ink);
1753
+ text-decoration: none;
1754
+ font-size: 0.8rem;
1755
+ }
1756
+ .rcf-entity-selector-chip:hover {
1757
+ background: var(--sv-active);
1758
+ border-color: var(--sv-link);
1759
+ color: var(--sv-link);
1760
+ }
1761
+ .rcf-entity-selector-chip .rcf-badge { background: transparent; }
1762
+ .rcf-entity-selector-chip:hover .rcf-badge-value { color: var(--sv-link); }
1763
+
1764
+ /* ---- Architecture tab (viewer UI refresh PR 4) --------------------- */
1765
+
1766
+ .rcf-architecture-head {
1767
+ display: flex;
1768
+ align-items: center;
1769
+ gap: 0.6rem;
1770
+ margin: 0 0 0.75rem 0;
1771
+ padding: 0.3rem 0;
1772
+ flex-wrap: wrap;
1773
+ }
1774
+ .rcf-architecture-head-id {
1775
+ font-weight: 600;
1776
+ color: var(--sv-ink);
1777
+ }
1778
+ .rcf-architecture-head-title {
1779
+ margin: 0;
1780
+ font-size: 1.1rem;
1781
+ }
1782
+
1783
+ .rcf-tad-group-heading,
1784
+ .rcf-architecture-components > .group-heading,
1785
+ .rcf-architecture-decisions > .group-heading {
1786
+ margin: 1.1rem 0 0.5rem 0;
1787
+ }
1788
+
1789
+ .rcf-tad-sections {
1790
+ display: flex;
1791
+ flex-direction: column;
1792
+ gap: 0.4rem;
1793
+ margin-bottom: 0.5rem;
1794
+ }
1795
+ .rcf-tad-section > summary {
1796
+ display: flex;
1797
+ align-items: baseline;
1798
+ gap: 0.5rem;
1799
+ }
1800
+ .rcf-tad-section > summary::before {
1801
+ flex: 0 0 auto;
1802
+ }
1803
+ .rcf-tad-section-title {
1804
+ display: inline-flex;
1805
+ flex-wrap: wrap;
1806
+ align-items: baseline;
1807
+ gap: 0.4rem;
1808
+ min-width: 0;
1809
+ flex: 1 1 auto;
1810
+ }
1811
+ .rcf-tad-section-title > strong {
1812
+ color: var(--sv-ink);
1813
+ }
1814
+ .rcf-tad-preview {
1815
+ color: var(--sv-muted);
1816
+ font-weight: 400;
1817
+ overflow: hidden;
1818
+ text-overflow: ellipsis;
1819
+ white-space: nowrap;
1820
+ max-width: min(60ch, 70vw);
1821
+ }
1822
+ .rcf-tad-section--empty .rcf-tad-preview {
1823
+ font-style: italic;
1824
+ }
1825
+ .rcf-tad-empty {
1826
+ color: var(--sv-muted);
1827
+ margin: 0;
1828
+ }
1829
+ .rcf-tad-empty-command {
1830
+ background: var(--sv-code);
1831
+ padding: 0.1rem 0.35rem;
1832
+ border-radius: var(--r);
1833
+ font-family: var(--sv-mono);
1834
+ font-size: 0.85em;
1835
+ word-break: break-all;
1836
+ }
1837
+ .rcf-tad-raw {
1838
+ margin: 0.6rem 0 1rem 0;
1839
+ }
1840
+ .rcf-tad-raw > summary {
1841
+ cursor: pointer;
1842
+ color: var(--sv-muted);
1843
+ }
1844
+ .rcf-tad-raw > pre {
1845
+ background: var(--sv-code);
1846
+ padding: 0.5rem;
1847
+ overflow: auto;
1848
+ max-height: 24rem;
1849
+ border-radius: var(--r);
1850
+ }
1851
+ .rcf-tad-anchor {
1852
+ display: inline-block;
1853
+ width: 0;
1854
+ height: 0;
1855
+ }
1856
+
1857
+ .rcf-arch-row > summary .id {
1858
+ font-family: var(--sv-mono);
1859
+ font-size: 0.85em;
1860
+ color: var(--sv-muted);
1861
+ max-width: 14ch;
1862
+ overflow: hidden;
1863
+ text-overflow: ellipsis;
1864
+ white-space: nowrap;
1865
+ }
1866
+ .rcf-tac-list,
1867
+ .rcf-adr-list {
1868
+ display: flex;
1869
+ flex-direction: column;
1870
+ gap: 0.35rem;
1871
+ }
1872
+ .rcf-architecture-components,
1873
+ .rcf-architecture-decisions {
1874
+ margin-top: 0.5rem;
1875
+ }
1876
+
1877
+ /* ---- Build tab (viewer UI refresh PR 5) --------------------------- */
1878
+
1879
+ .rcf-build-head {
1880
+ display: flex;
1881
+ align-items: baseline;
1882
+ flex-wrap: wrap;
1883
+ gap: 0.5rem;
1884
+ margin: 0 0 0.75rem 0;
1885
+ }
1886
+ .rcf-build-head-id {
1887
+ font-weight: 600;
1888
+ color: var(--sv-ink);
1889
+ }
1890
+
1891
+ .rcf-build-stats {
1892
+ margin: 0 0 1rem 0;
1893
+ }
1894
+ .rcf-build-stats-row {
1895
+ display: flex;
1896
+ flex-wrap: wrap;
1897
+ gap: 1.5rem;
1898
+ }
1899
+ .rcf-build-stat {
1900
+ display: flex;
1901
+ flex-direction: column;
1902
+ gap: 0.1rem;
1903
+ }
1904
+ .rcf-build-stat-n {
1905
+ font-size: 1.5rem;
1906
+ font-weight: 700;
1907
+ line-height: 1.1;
1908
+ color: var(--sv-ink);
1909
+ }
1910
+ .rcf-build-stat-l {
1911
+ color: var(--sv-muted);
1912
+ font-size: 0.8rem;
1913
+ }
1914
+ .rcf-build-progress {
1915
+ margin-top: 0.6rem;
1916
+ height: 0.5rem;
1917
+ background: var(--sv-raised);
1918
+ border-radius: 999px;
1919
+ overflow: hidden;
1920
+ display: flex;
1921
+ }
1922
+ .rcf-build-progress-seg {
1923
+ display: block;
1924
+ height: 100%;
1925
+ }
1926
+ .rcf-build-progress-seg--verified { background: var(--sv-success); }
1927
+ .rcf-build-progress-seg--complete { background: var(--sv-success); opacity: 0.6; }
1928
+ .rcf-build-progress-seg--inprogress { background: var(--sv-warning); }
1929
+
1930
+ .rcf-build-anchor {
1931
+ display: inline-block;
1932
+ width: 0;
1933
+ height: 0;
1934
+ }
1935
+
1936
+ .rcf-build-subpanel {
1937
+ margin-top: 0.2rem;
1938
+ }
1939
+ .rcf-build-subpanel[hidden] {
1940
+ display: none;
1941
+ }
1942
+
1943
+ .rcf-build-specs-list {
1944
+ display: flex;
1945
+ flex-direction: column;
1946
+ gap: 0.35rem;
1947
+ }
1948
+
1949
+ .rcf-build-row > summary .id {
1950
+ display: inline-flex;
1951
+ align-items: baseline;
1952
+ gap: 0.4rem;
1953
+ flex: none;
1954
+ }
1955
+ .rcf-spec-order {
1956
+ min-width: 1.6rem;
1957
+ text-align: right;
1958
+ color: var(--sv-muted);
1959
+ }
1960
+ .rcf-spec-id {
1961
+ color: var(--sv-link);
1962
+ }
1963
+
1964
+ .rcf-pill--build-queue {
1965
+ background: var(--sv-active);
1966
+ color: var(--sv-link);
1967
+ border-color: transparent;
1968
+ }
1969
+
1970
+ .rcf-spec-summary { margin: 0.4rem 0 0.6rem; }
1971
+ .rcf-spec-block { margin: 0.6rem 0 0; }
1972
+ .rcf-spec-block > h4 {
1973
+ margin: 0 0 0.3rem;
1974
+ color: var(--sv-muted);
1975
+ font-size: 0.8rem;
1976
+ text-transform: uppercase;
1977
+ letter-spacing: 0.05em;
1978
+ }
1979
+ .rcf-spec-block > p,
1980
+ .rcf-spec-block > ul { margin: 0.2rem 0; }
1981
+ .rcf-spec-link-row {
1982
+ font-size: 0.9rem;
1983
+ }
1984
+ .rcf-spec-deliverables,
1985
+ .rcf-spec-deps {
1986
+ margin: 0.3rem 0 0.3rem 1.2rem;
1987
+ padding: 0;
1988
+ font-size: 0.9rem;
1989
+ }
1990
+ .rcf-spec-deliverables > li,
1991
+ .rcf-spec-deps > li {
1992
+ margin: 0.1rem 0;
1993
+ }
1994
+ .rcf-spec-dag {
1995
+ margin: 0.8rem 0 0.2rem;
1996
+ font-size: 0.9rem;
1997
+ }
1998
+
1999
+ /* ---- Build / DAG (viewer UI refresh PR 6, TAC-4131, ADR-4133) -------- */
2000
+
2001
+ .rcf-dag {
2002
+ display: flex;
2003
+ flex-direction: column;
2004
+ gap: 0.75rem;
2005
+ }
2006
+
2007
+ .rcf-dag-toolbar {
2008
+ background: var(--sv-surface);
2009
+ border: 1px solid var(--sv-border);
2010
+ border-radius: 10px;
2011
+ padding: 0.6rem 0.75rem;
2012
+ display: flex;
2013
+ flex-direction: column;
2014
+ gap: 0.5rem;
2015
+ }
2016
+ .rcf-dag-toolbar-row {
2017
+ display: flex;
2018
+ flex-wrap: wrap;
2019
+ gap: 0.5rem;
2020
+ align-items: center;
2021
+ }
2022
+ .rcf-dag-toolbar-findings {
2023
+ border-top: 1px dashed var(--sv-border);
2024
+ padding-top: 0.5rem;
2025
+ }
2026
+
2027
+ .rcf-dag-label {
2028
+ display: inline-flex;
2029
+ gap: 0.35rem;
2030
+ align-items: center;
2031
+ }
2032
+ .rcf-dag-select {
2033
+ min-height: 2.1rem;
2034
+ padding: 0 0.5rem;
2035
+ border: 1px solid var(--sv-control);
2036
+ border-radius: 6px;
2037
+ background: var(--sv-surface);
2038
+ color: var(--sv-ink);
2039
+ }
2040
+
2041
+ .rcf-dag-chip {
2042
+ display: inline-flex;
2043
+ align-items: center;
2044
+ gap: 0.3rem;
2045
+ padding: 0.15rem 0.6rem;
2046
+ border-radius: 999px;
2047
+ border: 1px solid var(--sv-control);
2048
+ background: var(--sv-surface);
2049
+ color: var(--sv-ink);
2050
+ font-size: 0.8rem;
2051
+ cursor: pointer;
2052
+ min-height: 1.9rem;
2053
+ }
2054
+ .rcf-dag-chip:hover { background: var(--sv-raised); }
2055
+ .rcf-dag-chip[aria-pressed="true"] {
2056
+ background: var(--sv-active);
2057
+ border-color: var(--sv-link);
2058
+ color: var(--sv-link);
2059
+ font-weight: 700;
2060
+ }
2061
+
2062
+ .rcf-dag-grid {
2063
+ display: grid;
2064
+ grid-template-columns: minmax(0, 1fr) 20rem;
2065
+ gap: 0.75rem;
2066
+ align-items: start;
2067
+ }
2068
+ @media (max-width: 900px) {
2069
+ .rcf-dag-grid { grid-template-columns: minmax(0, 1fr); }
2070
+ }
2071
+
2072
+ .rcf-dag-canvas-wrap {
2073
+ padding: 0.5rem;
2074
+ overflow: auto;
2075
+ max-height: 70vh;
2076
+ min-height: 24rem;
2077
+ }
2078
+
2079
+ .rcf-dag-canvas {
2080
+ position: relative;
2081
+ color: var(--sv-ink);
2082
+ }
2083
+
2084
+ .rcf-dag-edges {
2085
+ position: absolute;
2086
+ left: 0;
2087
+ top: 0;
2088
+ pointer-events: none;
2089
+ }
2090
+ .rcf-dag-edge {
2091
+ fill: none;
2092
+ stroke: var(--sv-border);
2093
+ stroke-width: 1.2;
2094
+ opacity: 1;
2095
+ transition: opacity 120ms ease, stroke 120ms ease, stroke-width 120ms ease;
2096
+ }
2097
+ .rcf-dag-canvas[data-rcf-dag-sel] .rcf-dag-edge { opacity: 0.22; }
2098
+ .rcf-dag-edge[data-rcf-dag-edge-role="up"] {
2099
+ stroke: var(--sv-link);
2100
+ stroke-width: 2.2;
2101
+ opacity: 1;
2102
+ marker-end: url(#rcf-dag-arrow-up);
2103
+ }
2104
+ .rcf-dag-edge[data-rcf-dag-edge-role="down"] {
2105
+ stroke: var(--sv-warning);
2106
+ stroke-width: 2.2;
2107
+ opacity: 1;
2108
+ marker-end: url(#rcf-dag-arrow-down);
2109
+ }
2110
+ .rcf-dag-edge[data-rcf-dag-hidden="1"] { opacity: 0.08; }
2111
+
2112
+ .rcf-dag-colhead {
2113
+ position: absolute;
2114
+ font-size: 0.7rem;
2115
+ color: var(--sv-muted);
2116
+ font-weight: 700;
2117
+ letter-spacing: 0.05em;
2118
+ text-transform: uppercase;
2119
+ pointer-events: none;
2120
+ }
2121
+
2122
+ .rcf-dag-lane-head {
2123
+ position: absolute;
2124
+ border-top: 1px dashed var(--sv-control);
2125
+ padding-top: 0.4rem;
2126
+ font-size: 0.7rem;
2127
+ color: var(--sv-muted);
2128
+ font-weight: 700;
2129
+ letter-spacing: 0.05em;
2130
+ text-transform: uppercase;
2131
+ pointer-events: none;
2132
+ }
2133
+ .rcf-dag-canvas:not([data-has-unconnected="1"]) .rcf-dag-lane-head { display: none; }
2134
+ .rcf-dag-canvas[data-rcf-dag-unconnected-hidden="1"] .rcf-dag-lane-head,
2135
+ .rcf-dag-canvas[data-rcf-dag-unconnected-hidden="1"] .rcf-dag-node[data-unconnected="1"] {
2136
+ display: none;
2137
+ }
2138
+
2139
+ .rcf-dag-node {
2140
+ position: absolute;
2141
+ display: flex;
2142
+ align-items: center;
2143
+ gap: 0.4rem;
2144
+ padding: 0 0.5rem;
2145
+ border: 1px solid var(--sv-border);
2146
+ border-radius: 6px;
2147
+ background: var(--sv-surface);
2148
+ color: var(--sv-ink);
2149
+ cursor: pointer;
2150
+ text-align: left;
2151
+ font-size: 0.78rem;
2152
+ transition: opacity 120ms ease, border-color 120ms ease, border-width 120ms ease, box-shadow 120ms ease;
2153
+ overflow: hidden;
2154
+ }
2155
+ .rcf-dag-node:hover { background: var(--sv-raised); }
2156
+ .rcf-dag-node:focus-visible { outline: 2px solid var(--sv-focus); outline-offset: 2px; }
2157
+ .rcf-dag-canvas[data-rcf-dag-sel] .rcf-dag-node { opacity: 0.3; }
2158
+ .rcf-dag-node[data-rcf-dag-role="sel"] {
2159
+ opacity: 1;
2160
+ border: 2px solid var(--sv-ink);
2161
+ }
2162
+ .rcf-dag-node[data-rcf-dag-role="up"] {
2163
+ opacity: 1;
2164
+ border: 2px solid var(--sv-link);
2165
+ }
2166
+ .rcf-dag-node[data-rcf-dag-role="down"] {
2167
+ opacity: 1;
2168
+ border: 2px solid var(--sv-warning);
2169
+ }
2170
+ .rcf-dag-node[data-rcf-dag-hidden="1"] { opacity: 0.15; pointer-events: none; }
2171
+ .rcf-dag-node[data-rcf-dag-critical="on"] {
2172
+ box-shadow: 0 0 0 3px var(--sv-warningbg);
2173
+ }
2174
+ .rcf-dag-node-id {
2175
+ color: var(--sv-link);
2176
+ flex: none;
2177
+ }
2178
+ .rcf-dag-node-title {
2179
+ flex: 1;
2180
+ min-width: 0;
2181
+ overflow: hidden;
2182
+ text-overflow: ellipsis;
2183
+ white-space: nowrap;
2184
+ }
2185
+ .rcf-dag-node-dot {
2186
+ width: 0.55rem;
2187
+ height: 0.55rem;
2188
+ border-radius: 50%;
2189
+ background: var(--sv-control);
2190
+ flex: none;
2191
+ }
2192
+ .rcf-dag-node-dot--ok { background: var(--sv-success); }
2193
+ .rcf-dag-node-dot--warn { background: var(--sv-warning); }
2194
+ .rcf-dag-node-dot--none { background: var(--sv-control); }
2195
+ .rcf-dag-node-tag {
2196
+ font-size: 0.6rem;
2197
+ font-weight: 700;
2198
+ text-transform: uppercase;
2199
+ letter-spacing: 0.03em;
2200
+ padding: 0 0.3rem;
2201
+ border-radius: 999px;
2202
+ background: var(--sv-active);
2203
+ color: var(--sv-link);
2204
+ border: 1px solid transparent;
2205
+ flex: none;
2206
+ }
2207
+
2208
+ .rcf-dag-inspector {
2209
+ padding: 0.75rem;
2210
+ position: sticky;
2211
+ top: 3.6rem;
2212
+ max-height: 70vh;
2213
+ overflow: auto;
2214
+ }
2215
+ .rcf-dag-inspector-body h3 {
2216
+ margin: 0.2rem 0 0.5rem;
2217
+ font-size: 1rem;
2218
+ }
2219
+ .rcf-dag-inspector-body h4 {
2220
+ margin: 0.7rem 0 0.2rem;
2221
+ color: var(--sv-muted);
2222
+ font-size: 0.75rem;
2223
+ text-transform: uppercase;
2224
+ letter-spacing: 0.05em;
2225
+ }
2226
+ .rcf-dag-inspector-body ul.rcf-dag-inspector-list {
2227
+ list-style: none;
2228
+ padding: 0;
2229
+ margin: 0;
2230
+ font-size: 0.85rem;
2231
+ }
2232
+ .rcf-dag-inspector-body ul.rcf-dag-inspector-list li {
2233
+ display: flex;
2234
+ gap: 0.3rem;
2235
+ align-items: baseline;
2236
+ margin: 0.15rem 0;
2237
+ }
2238
+ .rcf-dag-inspector-body .rcf-dag-inspector-meta {
2239
+ display: flex;
2240
+ gap: 0.3rem;
2241
+ flex-wrap: wrap;
2242
+ margin-bottom: 0.6rem;
2243
+ }
2244
+
2245
+ .rcf-dag-legend {
2246
+ margin: 0;
2247
+ }
2248
+
2249
+ /* --------------------------------------------------------------------
2250
+ * ID lookup (viewer UI refresh PR 7, TAC-4132)
2251
+ *
2252
+ * SearchButton sits inside `.tools` right of the tabstrip; the
2253
+ * LookupModal is portalled into the shell outside #rcf-live-content
2254
+ * so the SSE innerHTML swap never blows it away. Tokens reuse the
2255
+ * Stravica brand palette so both themes work with no dark-only edge.
2256
+ * -------------------------------------------------------------------- */
2257
+
2258
+ .rcf-search-btn {
2259
+ display: inline-flex;
2260
+ align-items: center;
2261
+ gap: 0.35rem;
2262
+ padding: 0.3rem 0.6rem;
2263
+ background: var(--sv-surface, #ffffff);
2264
+ color: var(--sv-text, inherit);
2265
+ border: 1px solid var(--sv-border, #d6dbe3);
2266
+ border-radius: 999px;
2267
+ font: inherit;
2268
+ font-size: 0.85rem;
2269
+ line-height: 1;
2270
+ cursor: pointer;
2271
+ transition: background-color 0.1s ease-out, border-color 0.1s ease-out;
2272
+ }
2273
+ .rcf-search-btn:hover { background: var(--sv-surface-hover, #f0f3f8); }
2274
+ .rcf-search-btn:focus-visible { outline: 3px solid var(--sv-focus); outline-offset: 2px; }
2275
+ .rcf-search-btn .rcf-search-icon { flex-shrink: 0; opacity: 0.75; }
2276
+ .rcf-search-btn .rcf-search-kbd {
2277
+ display: inline-flex;
2278
+ gap: 0.1rem;
2279
+ margin-left: 0.1rem;
2280
+ color: var(--sv-muted);
2281
+ font-size: 0.7rem;
2282
+ }
2283
+ .rcf-search-btn .rcf-search-kbd kbd {
2284
+ padding: 0 0.25rem;
2285
+ border: 1px solid var(--sv-border, #d6dbe3);
2286
+ border-radius: 3px;
2287
+ background: var(--sv-surface, #ffffff);
2288
+ font-family: inherit;
2289
+ }
2290
+
2291
+ @media (max-width: 640px) {
2292
+ .rcf-search-btn .rcf-search-kbd { display: none; }
2293
+ }
2294
+
2295
+ .rcf-lookup[hidden] { display: none !important; }
2296
+ .rcf-lookup {
2297
+ position: fixed;
2298
+ inset: 0;
2299
+ z-index: 1000;
2300
+ display: flex;
2301
+ align-items: flex-start;
2302
+ justify-content: center;
2303
+ padding: 4rem 1rem 1rem;
2304
+ pointer-events: none;
2305
+ }
2306
+ .rcf-lookup-backdrop {
2307
+ position: absolute;
2308
+ inset: 0;
2309
+ background: rgba(8, 15, 25, 0.4);
2310
+ pointer-events: auto;
2311
+ }
2312
+ .rcf-lookup-panel {
2313
+ position: relative;
2314
+ width: min(42rem, 100%);
2315
+ max-height: calc(100vh - 6rem);
2316
+ display: flex;
2317
+ flex-direction: column;
2318
+ gap: 0.75rem;
2319
+ padding: 1rem 1rem 0.75rem;
2320
+ background: var(--sv-surface, #ffffff);
2321
+ color: var(--sv-text, inherit);
2322
+ border: 1px solid var(--sv-border, #d6dbe3);
2323
+ border-radius: 10px;
2324
+ box-shadow: 0 20px 50px -20px rgba(8, 15, 25, 0.4);
2325
+ pointer-events: auto;
2326
+ overflow: hidden;
2327
+ }
2328
+ .rcf-lookup-head {
2329
+ display: flex;
2330
+ align-items: center;
2331
+ justify-content: space-between;
2332
+ gap: 1rem;
2333
+ }
2334
+ .rcf-lookup-heading {
2335
+ margin: 0;
2336
+ font-size: 1rem;
2337
+ color: var(--sv-text);
2338
+ }
2339
+ .rcf-lookup-close {
2340
+ background: transparent;
2341
+ border: 1px solid transparent;
2342
+ color: var(--sv-muted);
2343
+ font: inherit;
2344
+ font-size: 0.8rem;
2345
+ padding: 0.25rem 0.5rem;
2346
+ border-radius: 4px;
2347
+ cursor: pointer;
2348
+ }
2349
+ .rcf-lookup-close:hover { color: var(--sv-text); border-color: var(--sv-border); }
2350
+ .rcf-lookup-close:focus-visible { outline: 3px solid var(--sv-focus); outline-offset: 1px; }
2351
+
2352
+ .rcf-lookup-field { display: flex; flex-direction: column; gap: 0.25rem; }
2353
+ .rcf-lookup-label {
2354
+ font-size: 0.75rem;
2355
+ color: var(--sv-muted);
2356
+ text-transform: uppercase;
2357
+ letter-spacing: 0.05em;
2358
+ }
2359
+ .rcf-lookup-input {
2360
+ padding: 0.55rem 0.75rem;
2361
+ font: inherit;
2362
+ font-size: 0.95rem;
2363
+ border: 1px solid var(--sv-border, #d6dbe3);
2364
+ border-radius: 6px;
2365
+ background: var(--sv-surface-sub, #fbfcfe);
2366
+ color: var(--sv-text);
2367
+ }
2368
+ .rcf-lookup-input:focus-visible { outline: 3px solid var(--sv-focus); outline-offset: 1px; border-color: var(--sv-link, #3a5bb5); }
2369
+
2370
+ .rcf-lookup-status { margin: 0; font-size: 0.75rem; color: var(--sv-muted); min-height: 1rem; }
2371
+
2372
+ .rcf-lookup-results {
2373
+ list-style: none;
2374
+ padding: 0;
2375
+ margin: 0;
2376
+ overflow-y: auto;
2377
+ flex: 1 1 auto;
2378
+ display: flex;
2379
+ flex-direction: column;
2380
+ gap: 0.1rem;
2381
+ }
2382
+ .rcf-lookup-row {
2383
+ display: grid;
2384
+ grid-template-columns: auto auto 1fr auto;
2385
+ align-items: baseline;
2386
+ gap: 0.5rem;
2387
+ padding: 0.4rem 0.5rem;
2388
+ border-radius: 6px;
2389
+ cursor: pointer;
2390
+ border: 1px solid transparent;
2391
+ }
2392
+ .rcf-lookup-row:hover { background: var(--sv-surface-hover, #f0f3f8); }
2393
+ .rcf-lookup-row.is-active {
2394
+ background: var(--sv-surface-hover, #f0f3f8);
2395
+ border-color: var(--sv-link, #3a5bb5);
2396
+ }
2397
+ .rcf-lookup-row mark {
2398
+ background: var(--sv-highlight, rgba(114, 149, 255, 0.35));
2399
+ color: inherit;
2400
+ padding: 0 1px;
2401
+ border-radius: 2px;
2402
+ }
2403
+ .rcf-lookup-kind {
2404
+ grid-column: 1;
2405
+ display: inline-flex;
2406
+ align-items: center;
2407
+ padding: 0 0.4rem;
2408
+ font-size: 0.7rem;
2409
+ font-weight: 600;
2410
+ text-transform: uppercase;
2411
+ letter-spacing: 0.05em;
2412
+ background: var(--sv-pill-bg, #e4e9f4);
2413
+ color: var(--sv-pill-text, #2a3550);
2414
+ border-radius: 999px;
2415
+ line-height: 1.6;
2416
+ }
2417
+ .rcf-lookup-kind-ac { background: #ede1ff; color: #4a2a7a; }
2418
+ .rcf-lookup-kind-us { background: #d8e8ff; color: #1f3f78; }
2419
+ .rcf-lookup-kind-req { background: #d5efe0; color: #1f5733; }
2420
+ .rcf-lookup-kind-tac { background: #ffe6cc; color: #704000; }
2421
+ .rcf-lookup-kind-adr { background: #ffd9d9; color: #7a2222; }
2422
+ .rcf-lookup-kind-fbs { background: #e2e7f2; color: #2a3550; }
2423
+ .rcf-lookup-kind-ts { background: #f3dbff; color: #5a2070; }
2424
+ .rcf-lookup-kind-prd { background: #fff2b8; color: #705300; }
2425
+ .rcf-lookup-kind-tad { background: #cfe9ff; color: #0f3f6a; }
2426
+ .rcf-lookup-kind-bs { background: #e4e4e4; color: #333333; }
2427
+
2428
+ .rcf-lookup-id {
2429
+ grid-column: 2;
2430
+ font-family: var(--sv-mono, ui-monospace, SFMono-Regular, Menlo, Consolas, monospace);
2431
+ font-weight: 600;
2432
+ color: var(--sv-text);
2433
+ font-size: 0.85rem;
2434
+ }
2435
+ .rcf-lookup-title {
2436
+ grid-column: 3;
2437
+ font-size: 0.9rem;
2438
+ color: var(--sv-text);
2439
+ }
2440
+ .rcf-lookup-parent {
2441
+ grid-column: 4;
2442
+ font-size: 0.75rem;
2443
+ color: var(--sv-muted);
2444
+ }
2445
+ .rcf-lookup-snippet {
2446
+ grid-column: 1 / -1;
2447
+ margin: 0.1rem 0 0 0;
2448
+ font-size: 0.78rem;
2449
+ color: var(--sv-muted);
2450
+ line-height: 1.35;
2451
+ }
2452
+
2453
+ .rcf-lookup-empty {
2454
+ padding: 1rem 0.5rem 0.75rem;
2455
+ text-align: center;
2456
+ color: var(--sv-muted);
2457
+ font-size: 0.85rem;
2458
+ }
2459
+ .rcf-lookup-empty-msg { margin: 0 0 0.5rem; }
2460
+ .rcf-lookup-reload {
2461
+ padding: 0.35rem 0.75rem;
2462
+ background: var(--sv-surface, #ffffff);
2463
+ color: var(--sv-text);
2464
+ border: 1px solid var(--sv-border, #d6dbe3);
2465
+ border-radius: 6px;
2466
+ cursor: pointer;
2467
+ font: inherit;
2468
+ font-size: 0.85rem;
2469
+ }
2470
+ .rcf-lookup-reload:hover { background: var(--sv-surface-hover, #f0f3f8); }
2471
+ .rcf-lookup-reload:focus-visible { outline: 3px solid var(--sv-focus); outline-offset: 1px; }
2472
+
2473
+ html[data-theme="dark"] .rcf-lookup-backdrop { background: rgba(0, 0, 0, 0.55); }
2474
+ html[data-theme="dark"] .rcf-lookup-kind { background: rgba(255, 255, 255, 0.08); color: var(--sv-text); }
2475
+ html[data-theme="dark"] .rcf-lookup-kind-ac { background: rgba(140, 90, 220, 0.3); color: #e2c9ff; }
2476
+ html[data-theme="dark"] .rcf-lookup-kind-us { background: rgba(80, 130, 220, 0.3); color: #c4dcff; }
2477
+ html[data-theme="dark"] .rcf-lookup-kind-req { background: rgba(80, 170, 110, 0.3); color: #c3eacc; }
2478
+ html[data-theme="dark"] .rcf-lookup-kind-tac { background: rgba(200, 130, 60, 0.3); color: #ffd4a8; }
2479
+ html[data-theme="dark"] .rcf-lookup-kind-adr { background: rgba(220, 100, 100, 0.3); color: #ffc9c9; }
2480
+ html[data-theme="dark"] .rcf-lookup-kind-ts { background: rgba(180, 110, 220, 0.3); color: #e8c9ff; }
2481
+ html[data-theme="dark"] .rcf-lookup-kind-fbs { background: rgba(140, 150, 170, 0.3); color: #d4dbea; }
2482
+ html[data-theme="dark"] .rcf-lookup-kind-prd { background: rgba(200, 170, 60, 0.3); color: #ffe88b; }
2483
+ html[data-theme="dark"] .rcf-lookup-kind-tad { background: rgba(80, 160, 220, 0.3); color: #c7e6ff; }
2484
+ html[data-theme="dark"] .rcf-lookup-kind-bs { background: rgba(160, 160, 160, 0.3); color: #d9d9d9; }
2485
+
2486
+ html[data-rcf-lookup-open] { overflow: hidden; }
2487
+
2488
+ /* ID lookup landing highlight (design section 6: "scrolls and flashes
2489
+ the target"). A short brand-cobalt wash fades out so the picked
2490
+ entity reads unambiguously in a long tree. */
2491
+ @keyframes rcfLookupFlash {
2492
+ 0% { background-color: var(--sv-cobalt, #1e40af); color: #ffffff; }
2493
+ 40% { background-color: var(--sv-cobalt, #1e40af); color: #ffffff; }
2494
+ 100% { background-color: transparent; color: inherit; }
2495
+ }
2496
+ .is-rcf-lookup-flash {
2497
+ animation: rcfLookupFlash 1200ms ease-out 1;
2498
+ border-radius: 2px;
2499
+ }
2500
+
2501
+ /* ---- Shared pill colour variants (used by Readiness PO layer PR 8) ---- */
2502
+
2503
+ .rcf-pill {
2504
+ display: inline-flex;
2505
+ align-items: center;
2506
+ gap: 0.3rem;
2507
+ padding: 0.05rem 0.6rem;
2508
+ border-radius: 999px;
2509
+ font-size: 0.78rem;
2510
+ font-weight: 700;
2511
+ border: 1px solid var(--sv-border);
2512
+ background: var(--sv-raised);
2513
+ color: var(--sv-ink);
2514
+ white-space: nowrap;
2515
+ }
2516
+ .rcf-pill--ok {
2517
+ background: var(--sv-successbg);
2518
+ color: var(--sv-success);
2519
+ border-color: transparent;
2520
+ }
2521
+ .rcf-pill--warn {
2522
+ background: var(--sv-warningbg);
2523
+ color: var(--sv-warning);
2524
+ border-color: transparent;
2525
+ }
2526
+ .rcf-pill--fail {
2527
+ background: var(--sv-dangerbg);
2528
+ color: var(--sv-danger);
2529
+ border-color: transparent;
2530
+ }
2531
+ .rcf-pill--info {
2532
+ background: var(--sv-active);
2533
+ color: var(--sv-link);
2534
+ border-color: transparent;
2535
+ }
2536
+
2537
+ /* ---- Readiness PO layer (viewer UI refresh PR 8, TAC-4133, ADR-4135) --- */
2538
+
2539
+ .rcf-po-verdicts {
2540
+ display: grid;
2541
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
2542
+ gap: 0.75rem;
2543
+ align-items: stretch;
2544
+ margin: 0.5rem 0 1rem;
2545
+ }
2546
+ .rcf-po-verdict {
2547
+ background: var(--sv-surface);
2548
+ border: 1px solid var(--sv-border);
2549
+ border-radius: 10px;
2550
+ padding: 1rem;
2551
+ display: flex;
2552
+ flex-direction: column;
2553
+ gap: 0.3rem;
2554
+ height: 100%;
2555
+ }
2556
+ .rcf-po-verdict--build { opacity: 0.95; }
2557
+ .rcf-po-verdict__eyebrow {
2558
+ font-size: 0.78rem;
2559
+ text-transform: uppercase;
2560
+ letter-spacing: 0.05em;
2561
+ margin: 0;
2562
+ }
2563
+ .rcf-po-verdict__heading {
2564
+ font-size: 1.2rem;
2565
+ margin: 0.1rem 0 0.3rem;
2566
+ display: flex;
2567
+ align-items: center;
2568
+ gap: 0.4rem;
2569
+ flex-wrap: wrap;
2570
+ }
2571
+ .rcf-po-verdict__count {
2572
+ margin: 0.1rem 0;
2573
+ }
2574
+ .rcf-po-verdict__verdict {
2575
+ margin-top: auto;
2576
+ padding-top: 0.4rem;
2577
+ font-size: 0.78rem;
2578
+ }
2579
+ .rcf-po-verdict__verdict code {
2580
+ background: var(--sv-code);
2581
+ padding: 0.1rem 0.3rem;
2582
+ border-radius: 0.25rem;
2583
+ word-break: break-word;
2584
+ display: inline-block;
2585
+ max-width: 100%;
2586
+ }
2587
+ .rcf-chain-term {
2588
+ font-family: var(--sv-mono);
2589
+ font-size: 0.72rem;
2590
+ font-weight: 400;
2591
+ color: var(--sv-muted);
2592
+ margin-left: 0.25rem;
2593
+ vertical-align: middle;
2594
+ }
2595
+
2596
+ .rcf-po-questions,
2597
+ .rcf-po-next,
2598
+ .rcf-po-reqwork,
2599
+ .rcf-po-engineer-section {
2600
+ margin-top: 1.25rem;
2601
+ }
2602
+ .rcf-po-questions__head,
2603
+ .rcf-po-reqwork > h2 {
2604
+ display: flex;
2605
+ align-items: baseline;
2606
+ gap: 0.5rem;
2607
+ }
2608
+ .rcf-po-questions__head h2 { margin: 0; font-size: 1.2rem; }
2609
+ .rcf-po-reqwork > h2 { font-size: 1.2rem; margin: 0 0 0.3rem; }
2610
+ .rcf-po-next > h2 { font-size: 1.2rem; margin: 0 0 0.4rem; }
2611
+
2612
+ .rcf-po-question-group {
2613
+ background: var(--sv-surface);
2614
+ border: 1px solid var(--sv-border);
2615
+ border-radius: 10px;
2616
+ padding: 0.75rem 1rem;
2617
+ margin: 0.75rem 0 0;
2618
+ }
2619
+ .rcf-po-question-group--optional {
2620
+ border-style: dashed;
2621
+ }
2622
+ .rcf-po-question-group__head { margin-bottom: 0.3rem; }
2623
+ .rcf-po-question-group__head h3 {
2624
+ margin: 0;
2625
+ color: var(--sv-muted);
2626
+ font-size: 0.85rem;
2627
+ text-transform: uppercase;
2628
+ letter-spacing: 0.05em;
2629
+ }
2630
+ .rcf-po-question {
2631
+ padding: 0.55rem 0;
2632
+ border-top: 1px solid var(--sv-border);
2633
+ }
2634
+ .rcf-po-question:first-of-type { border-top: 0; }
2635
+ .rcf-po-question__head {
2636
+ display: flex;
2637
+ align-items: baseline;
2638
+ gap: 0.5rem;
2639
+ }
2640
+ .rcf-po-question__heading {
2641
+ margin: 0;
2642
+ font-size: 1rem;
2643
+ }
2644
+ .rcf-po-question__ask {
2645
+ margin: 0.35rem 0 0.2rem;
2646
+ }
2647
+ .rcf-po-question__hint { margin: 0; }
2648
+ .rcf-po-question__detail {
2649
+ margin-top: 0.4rem;
2650
+ }
2651
+ .rcf-po-question__detail summary { cursor: pointer; }
2652
+
2653
+ .rcf-badge--q {
2654
+ display: inline-block;
2655
+ padding: 0 0.5rem;
2656
+ border-radius: 0.3rem;
2657
+ font-size: 0.72rem;
2658
+ font-weight: 700;
2659
+ background: var(--sv-raised);
2660
+ color: var(--sv-muted);
2661
+ border: 1px solid var(--sv-border);
2662
+ white-space: nowrap;
2663
+ }
2664
+ .rcf-badge--count {
2665
+ display: inline-block;
2666
+ padding: 0 0.5rem;
2667
+ border-radius: 0.3rem;
2668
+ font-size: 0.78rem;
2669
+ font-weight: 700;
2670
+ background: var(--sv-raised);
2671
+ color: var(--sv-muted);
2672
+ border: 1px solid var(--sv-border);
2673
+ white-space: nowrap;
2674
+ }
2675
+
2676
+ .rcf-po-next__card {
2677
+ background: var(--sv-surface);
2678
+ border: 1px solid var(--sv-border);
2679
+ border-radius: 10px;
2680
+ padding: 0.75rem 1rem;
2681
+ }
2682
+ .rcf-po-next__card p { margin: 0.35rem 0; }
2683
+
2684
+ .rcf-po-reqwork__table {
2685
+ width: 100%;
2686
+ border-collapse: collapse;
2687
+ font-size: 0.9rem;
2688
+ margin-top: 0.3rem;
2689
+ }
2690
+ .rcf-po-reqwork__table th,
2691
+ .rcf-po-reqwork__table td {
2692
+ text-align: left;
2693
+ padding: 0.45rem 0.5rem;
2694
+ border-bottom: 1px solid var(--sv-border);
2695
+ vertical-align: top;
2696
+ }
2697
+ .rcf-po-reqwork__table th {
2698
+ color: var(--sv-muted);
2699
+ font-weight: 700;
2700
+ font-size: 0.75rem;
2701
+ text-transform: uppercase;
2702
+ letter-spacing: 0.05em;
2703
+ }
2704
+ .rcf-po-reqwork__id {
2705
+ color: var(--sv-link);
2706
+ font-family: var(--sv-mono);
2707
+ }
2708
+ .rcf-po-reqwork__empty {
2709
+ padding: 1rem;
2710
+ border: 1px dashed var(--sv-control);
2711
+ border-radius: 0.5rem;
2712
+ color: var(--sv-muted);
2713
+ text-align: center;
2714
+ margin: 0.3rem 0 0;
2715
+ }
2716
+
2717
+ .rcf-po-engineer-section .rcf-row.doc-row {
2718
+ border: 1px solid var(--sv-border);
2719
+ border-radius: 10px;
2720
+ background: var(--sv-surface);
2721
+ }
2722
+ .rcf-po-engineer-section .rcf-row.doc-row > summary {
2723
+ padding: 0.6rem 0.9rem;
2724
+ }
2725
+ .rcf-po-engineer-section .rcf-row.doc-row > summary .id {
2726
+ font-family: var(--sv-font);
2727
+ color: var(--sv-ink);
2728
+ font-weight: 700;
2729
+ }
2730
+
2731
+ .rcf-stage-legend {
2732
+ border: 1px solid var(--sv-border);
2733
+ border-radius: 10px;
2734
+ background: var(--sv-surface);
2735
+ color: var(--sv-ink);
2736
+ padding: 1rem 1.25rem;
2737
+ max-width: 48rem;
2738
+ width: calc(100vw - 2rem);
2739
+ }
2740
+ .rcf-stage-legend::backdrop { background: rgba(17, 25, 39, 0.45); }
2741
+ .rcf-stage-legend__head {
2742
+ display: flex;
2743
+ align-items: baseline;
2744
+ gap: 0.75rem;
2745
+ margin-bottom: 0.4rem;
2746
+ }
2747
+ .rcf-stage-legend__head h2 {
2748
+ flex: 1;
2749
+ font-size: 1.1rem;
2750
+ margin: 0;
2751
+ }
2752
+ .rcf-stage-legend__intro {
2753
+ margin: 0.1rem 0 0.6rem;
2754
+ font-size: 0.85rem;
2755
+ }
2756
+ .rcf-stage-legend__table {
2757
+ width: 100%;
2758
+ border-collapse: collapse;
2759
+ font-size: 0.9rem;
2760
+ }
2761
+ .rcf-stage-legend__table th,
2762
+ .rcf-stage-legend__table td {
2763
+ text-align: left;
2764
+ padding: 0.4rem 0.5rem;
2765
+ border-bottom: 1px solid var(--sv-border);
2766
+ vertical-align: top;
2767
+ }
2768
+ .rcf-stage-legend__table th {
2769
+ color: var(--sv-muted);
2770
+ font-size: 0.75rem;
2771
+ text-transform: uppercase;
2772
+ letter-spacing: 0.05em;
2773
+ }
2774
+ .rcf-stage-legend__table tr.rcf-stage-legend__highlighted td {
2775
+ background: var(--sv-active);
2776
+ }
2777
+ .rcf-stage-legend__table .rcf-stage-legend__code code {
2778
+ color: var(--sv-link);
2779
+ }
2780
+ .rcf-stage-legend__close {
2781
+ min-height: 2rem;
2782
+ padding: 0 0.75rem;
2783
+ border-radius: 0.375rem;
2784
+ border: 1px solid var(--sv-control);
2785
+ background: var(--sv-surface);
2786
+ color: var(--sv-ink);
2787
+ cursor: pointer;
2788
+ }
2789
+ .rcf-stage-legend__close:hover { background: var(--sv-raised); }
2790
+
2791
+ [data-rcf-stage-ref] { cursor: pointer; }
2792
+ [data-rcf-stage-ref]:focus-visible {
2793
+ outline: 2px solid var(--sv-focus);
2794
+ outline-offset: 1px;
1160
2795
  }