@variance-authority/tribunal 0.1.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 (271) hide show
  1. package/CHANGELOG.md +100 -0
  2. package/LICENSE +21 -0
  3. package/README.md +506 -0
  4. package/dist/__fixtures__/review.d.ts +47 -0
  5. package/dist/__fixtures__/review.js +145 -0
  6. package/dist/__fixtures__/review.js.map +1 -0
  7. package/dist/bindings.d.ts +134 -0
  8. package/dist/bindings.js +88 -0
  9. package/dist/bindings.js.map +1 -0
  10. package/dist/changelog.d.ts +132 -0
  11. package/dist/changelog.js +129 -0
  12. package/dist/changelog.js.map +1 -0
  13. package/dist/history-queries.d.ts +82 -0
  14. package/dist/history-queries.js +200 -0
  15. package/dist/history-queries.js.map +1 -0
  16. package/dist/history-rows.d.ts +42 -0
  17. package/dist/history-rows.js +148 -0
  18. package/dist/history-rows.js.map +1 -0
  19. package/dist/history.d.ts +40 -0
  20. package/dist/history.js +186 -0
  21. package/dist/history.js.map +1 -0
  22. package/dist/index.d.ts +13 -0
  23. package/dist/index.js +12 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/migration-steps.d.ts +32 -0
  26. package/dist/migration-steps.js +303 -0
  27. package/dist/migration-steps.js.map +1 -0
  28. package/dist/migrations.d.ts +58 -0
  29. package/dist/migrations.js +283 -0
  30. package/dist/migrations.js.map +1 -0
  31. package/dist/next.d.ts +94 -0
  32. package/dist/next.js +44 -0
  33. package/dist/next.js.map +1 -0
  34. package/dist/node/bin.d.ts +120 -0
  35. package/dist/node/bin.js +337 -0
  36. package/dist/node/bin.js.map +1 -0
  37. package/dist/node/bucket.d.ts +58 -0
  38. package/dist/node/bucket.js +142 -0
  39. package/dist/node/bucket.js.map +1 -0
  40. package/dist/node/database.d.ts +33 -0
  41. package/dist/node/database.js +157 -0
  42. package/dist/node/database.js.map +1 -0
  43. package/dist/node/index.d.ts +43 -0
  44. package/dist/node/index.js +43 -0
  45. package/dist/node/index.js.map +1 -0
  46. package/dist/node/serve.d.ts +81 -0
  47. package/dist/node/serve.js +193 -0
  48. package/dist/node/serve.js.map +1 -0
  49. package/dist/node/ui-assets.d.ts +47 -0
  50. package/dist/node/ui-assets.js +60 -0
  51. package/dist/node/ui-assets.js.map +1 -0
  52. package/dist/review-ingest.d.ts +24 -0
  53. package/dist/review-ingest.js +184 -0
  54. package/dist/review-ingest.js.map +1 -0
  55. package/dist/review-read.d.ts +87 -0
  56. package/dist/review-read.js +361 -0
  57. package/dist/review-read.js.map +1 -0
  58. package/dist/review-rows.d.ts +30 -0
  59. package/dist/review-rows.js +67 -0
  60. package/dist/review-rows.js.map +1 -0
  61. package/dist/review-types.d.ts +414 -0
  62. package/dist/review-types.js +2 -0
  63. package/dist/review-types.js.map +1 -0
  64. package/dist/review-write.d.ts +35 -0
  65. package/dist/review-write.js +86 -0
  66. package/dist/review-write.js.map +1 -0
  67. package/dist/review.d.ts +53 -0
  68. package/dist/review.fixtures.d.ts +47 -0
  69. package/dist/review.fixtures.js +145 -0
  70. package/dist/review.fixtures.js.map +1 -0
  71. package/dist/review.js +245 -0
  72. package/dist/review.js.map +1 -0
  73. package/dist/schema.d.ts +36 -0
  74. package/dist/schema.js +39 -0
  75. package/dist/schema.js.map +1 -0
  76. package/dist/store.d.ts +58 -0
  77. package/dist/store.js +278 -0
  78. package/dist/store.js.map +1 -0
  79. package/dist/testing.d.ts +38 -0
  80. package/dist/testing.js +92 -0
  81. package/dist/testing.js.map +1 -0
  82. package/dist/ui/__probe.d.ts +3 -0
  83. package/dist/ui/__probe.js +5 -0
  84. package/dist/ui/__probe.js.map +1 -0
  85. package/dist/ui/attribution.d.ts +46 -0
  86. package/dist/ui/attribution.js +79 -0
  87. package/dist/ui/attribution.js.map +1 -0
  88. package/dist/ui/because.d.ts +51 -0
  89. package/dist/ui/because.js +52 -0
  90. package/dist/ui/because.js.map +1 -0
  91. package/dist/ui/browser-entry.d.ts +2 -0
  92. package/dist/ui/browser-entry.js +34 -0
  93. package/dist/ui/browser-entry.js.map +1 -0
  94. package/dist/ui/builds.d.ts +43 -0
  95. package/dist/ui/builds.js +79 -0
  96. package/dist/ui/builds.js.map +1 -0
  97. package/dist/ui/carried.d.ts +73 -0
  98. package/dist/ui/carried.js +63 -0
  99. package/dist/ui/carried.js.map +1 -0
  100. package/dist/ui/cause.d.ts +73 -0
  101. package/dist/ui/cause.js +133 -0
  102. package/dist/ui/cause.js.map +1 -0
  103. package/dist/ui/change-story.d.ts +153 -0
  104. package/dist/ui/change-story.js +253 -0
  105. package/dist/ui/change-story.js.map +1 -0
  106. package/dist/ui/change.d.ts +51 -0
  107. package/dist/ui/change.js +125 -0
  108. package/dist/ui/change.js.map +1 -0
  109. package/dist/ui/client.d.ts +74 -0
  110. package/dist/ui/client.js +88 -0
  111. package/dist/ui/client.js.map +1 -0
  112. package/dist/ui/consumers.d.ts +80 -0
  113. package/dist/ui/consumers.js +125 -0
  114. package/dist/ui/consumers.js.map +1 -0
  115. package/dist/ui/control.d.ts +63 -0
  116. package/dist/ui/control.js +39 -0
  117. package/dist/ui/control.js.map +1 -0
  118. package/dist/ui/crossing.d.ts +55 -0
  119. package/dist/ui/crossing.js +74 -0
  120. package/dist/ui/crossing.js.map +1 -0
  121. package/dist/ui/declarations.d.ts +36 -0
  122. package/dist/ui/declarations.js +73 -0
  123. package/dist/ui/declarations.js.map +1 -0
  124. package/dist/ui/distance.d.ts +154 -0
  125. package/dist/ui/distance.js +180 -0
  126. package/dist/ui/distance.js.map +1 -0
  127. package/dist/ui/divergence.d.ts +40 -0
  128. package/dist/ui/divergence.js +176 -0
  129. package/dist/ui/divergence.js.map +1 -0
  130. package/dist/ui/docket.d.ts +39 -0
  131. package/dist/ui/docket.js +172 -0
  132. package/dist/ui/docket.js.map +1 -0
  133. package/dist/ui/findings.d.ts +42 -0
  134. package/dist/ui/findings.js +110 -0
  135. package/dist/ui/findings.js.map +1 -0
  136. package/dist/ui/foreseen.d.ts +55 -0
  137. package/dist/ui/foreseen.js +91 -0
  138. package/dist/ui/foreseen.js.map +1 -0
  139. package/dist/ui/glance.d.ts +101 -0
  140. package/dist/ui/glance.js +101 -0
  141. package/dist/ui/glance.js.map +1 -0
  142. package/dist/ui/grouping.d.ts +158 -0
  143. package/dist/ui/grouping.js +187 -0
  144. package/dist/ui/grouping.js.map +1 -0
  145. package/dist/ui/handed.d.ts +60 -0
  146. package/dist/ui/handed.js +122 -0
  147. package/dist/ui/handed.js.map +1 -0
  148. package/dist/ui/history.d.ts +88 -0
  149. package/dist/ui/history.js +170 -0
  150. package/dist/ui/history.js.map +1 -0
  151. package/dist/ui/holding.d.ts +84 -0
  152. package/dist/ui/holding.js +90 -0
  153. package/dist/ui/holding.js.map +1 -0
  154. package/dist/ui/impact.d.ts +31 -0
  155. package/dist/ui/impact.js +132 -0
  156. package/dist/ui/impact.js.map +1 -0
  157. package/dist/ui/index.d.ts +21 -0
  158. package/dist/ui/index.js +21 -0
  159. package/dist/ui/index.js.map +1 -0
  160. package/dist/ui/lead.d.ts +35 -0
  161. package/dist/ui/lead.js +34 -0
  162. package/dist/ui/lead.js.map +1 -0
  163. package/dist/ui/look.d.ts +109 -0
  164. package/dist/ui/look.js +248 -0
  165. package/dist/ui/look.js.map +1 -0
  166. package/dist/ui/mark.d.ts +11 -0
  167. package/dist/ui/mark.js +13 -0
  168. package/dist/ui/mark.js.map +1 -0
  169. package/dist/ui/moved.d.ts +121 -0
  170. package/dist/ui/moved.js +143 -0
  171. package/dist/ui/moved.js.map +1 -0
  172. package/dist/ui/navigation.d.ts +26 -0
  173. package/dist/ui/navigation.js +53 -0
  174. package/dist/ui/navigation.js.map +1 -0
  175. package/dist/ui/order.d.ts +113 -0
  176. package/dist/ui/order.js +226 -0
  177. package/dist/ui/order.js.map +1 -0
  178. package/dist/ui/origins.d.ts +42 -0
  179. package/dist/ui/origins.js +149 -0
  180. package/dist/ui/origins.js.map +1 -0
  181. package/dist/ui/outcome.d.ts +93 -0
  182. package/dist/ui/outcome.js +162 -0
  183. package/dist/ui/outcome.js.map +1 -0
  184. package/dist/ui/parted.d.ts +68 -0
  185. package/dist/ui/parted.js +101 -0
  186. package/dist/ui/parted.js.map +1 -0
  187. package/dist/ui/rail.d.ts +31 -0
  188. package/dist/ui/rail.js +21 -0
  189. package/dist/ui/rail.js.map +1 -0
  190. package/dist/ui/reach.d.ts +66 -0
  191. package/dist/ui/reach.js +185 -0
  192. package/dist/ui/reach.js.map +1 -0
  193. package/dist/ui/regions.d.ts +82 -0
  194. package/dist/ui/regions.js +67 -0
  195. package/dist/ui/regions.js.map +1 -0
  196. package/dist/ui/review.bundle.js +69 -0
  197. package/dist/ui/review.d.ts +97 -0
  198. package/dist/ui/review.js +39 -0
  199. package/dist/ui/review.js.map +1 -0
  200. package/dist/ui/root.d.ts +72 -0
  201. package/dist/ui/root.js +102 -0
  202. package/dist/ui/root.js.map +1 -0
  203. package/dist/ui/route.d.ts +95 -0
  204. package/dist/ui/route.js +114 -0
  205. package/dist/ui/route.js.map +1 -0
  206. package/dist/ui/run.d.ts +26 -0
  207. package/dist/ui/run.js +12 -0
  208. package/dist/ui/run.js.map +1 -0
  209. package/dist/ui/sense.d.ts +187 -0
  210. package/dist/ui/sense.js +222 -0
  211. package/dist/ui/sense.js.map +1 -0
  212. package/dist/ui/settled.d.ts +43 -0
  213. package/dist/ui/settled.js +59 -0
  214. package/dist/ui/settled.js.map +1 -0
  215. package/dist/ui/shell.d.ts +76 -0
  216. package/dist/ui/shell.js +65 -0
  217. package/dist/ui/shell.js.map +1 -0
  218. package/dist/ui/shift.d.ts +52 -0
  219. package/dist/ui/shift.js +98 -0
  220. package/dist/ui/shift.js.map +1 -0
  221. package/dist/ui/styles-docket.d.ts +18 -0
  222. package/dist/ui/styles-docket.js +281 -0
  223. package/dist/ui/styles-docket.js.map +1 -0
  224. package/dist/ui/styles-stage.d.ts +18 -0
  225. package/dist/ui/styles-stage.js +92 -0
  226. package/dist/ui/styles-stage.js.map +1 -0
  227. package/dist/ui/styles.d.ts +12 -0
  228. package/dist/ui/styles.js +482 -0
  229. package/dist/ui/styles.js.map +1 -0
  230. package/dist/ui/subject.d.ts +36 -0
  231. package/dist/ui/subject.js +138 -0
  232. package/dist/ui/subject.js.map +1 -0
  233. package/dist/ui/text.d.ts +129 -0
  234. package/dist/ui/text.js +164 -0
  235. package/dist/ui/text.js.map +1 -0
  236. package/dist/ui/variations.d.ts +37 -0
  237. package/dist/ui/variations.js +60 -0
  238. package/dist/ui/variations.js.map +1 -0
  239. package/dist/ui/viewer.d.ts +67 -0
  240. package/dist/ui/viewer.js +246 -0
  241. package/dist/ui/viewer.js.map +1 -0
  242. package/dist/worker-auth.d.ts +48 -0
  243. package/dist/worker-auth.js +74 -0
  244. package/dist/worker-auth.js.map +1 -0
  245. package/dist/worker-entry.d.ts +58 -0
  246. package/dist/worker-entry.js +36 -0
  247. package/dist/worker-entry.js.map +1 -0
  248. package/dist/worker-http.d.ts +39 -0
  249. package/dist/worker-http.js +111 -0
  250. package/dist/worker-http.js.map +1 -0
  251. package/dist/worker-input.d.ts +81 -0
  252. package/dist/worker-input.js +296 -0
  253. package/dist/worker-input.js.map +1 -0
  254. package/dist/worker.d.ts +91 -0
  255. package/dist/worker.js +287 -0
  256. package/dist/worker.js.map +1 -0
  257. package/mark.svg +30 -0
  258. package/migrations/0001_initial.sql +193 -0
  259. package/migrations/0002_changelog.sql +30 -0
  260. package/migrations/0003_accessibility.sql +8 -0
  261. package/migrations/0004_variations.sql +19 -0
  262. package/migrations/0005_reach.sql +26 -0
  263. package/migrations/0006_baseline-size.sql +7 -0
  264. package/migrations/0007_declarations.sql +7 -0
  265. package/migrations/0008_green-because.sql +7 -0
  266. package/migrations/0009_moved-bands.sql +6 -0
  267. package/migrations/0010_composition.sql +15 -0
  268. package/migrations/0011_movements.sql +21 -0
  269. package/migrations/0012_control-size.sql +6 -0
  270. package/package.json +110 -0
  271. package/wrangler.jsonc +45 -0
@@ -0,0 +1,281 @@
1
+ /**
2
+ * The two panes a build is worked in: the docket rail, and the change beside it.
3
+ *
4
+ * Its own module for the same reason [`styles-stage.ts`](./styles-stage.ts) is:
5
+ * the sheet is one string handed to an operator, and the number of rules a person
6
+ * has to hold at once to change one of them is a real cost. What is decided here
7
+ * is *where a reviewer's eye goes first*, which is a layout question with a
8
+ * correct answer — the band headings and the row a change occupies, above the
9
+ * fold, in a column that does not grow with the build.
10
+ *
11
+ * The rule that matters most is the least visible one: nothing in this block
12
+ * scrolls the document. The rail scrolls through the changes, the stage scrolls
13
+ * through the one that is open, and the page itself is fixed to the viewport. A
14
+ * surface where the document scrolls is a report; a surface where the panes
15
+ * scroll is a place a reviewer navigates.
16
+ */
17
+ export const DOCKET_STYLES = `
18
+ /* The trail, which is the whole navigation. Five of the seven pages are *about*
19
+ the page above them, and a trail says that where a menu would assert they are
20
+ peers. */
21
+ .va-crumbs { align-items: center; display: flex; gap: 0.3rem; min-width: 0; }
22
+ .va-crumb { color: var(--va-ink-3); font-size: 0.8rem; text-decoration: none; white-space: nowrap; }
23
+ .va-crumb:hover { color: var(--va-accent); }
24
+ .va-crumb-sep { color: var(--va-line-firm); font-size: 0.8rem; }
25
+
26
+ /* Changes or subjects: the two ways to work a build, as two addresses rather
27
+ than as a piece of component state. */
28
+ .va-switch { background: var(--va-sunken); border-radius: 9px; display: flex; flex: none; gap: 0.15rem; margin-bottom: 0.5rem; padding: 0.2rem; }
29
+ .va-switch .va-mode { flex: 1; text-align: center; text-decoration: none; }
30
+ .va-switch .va-mode.va-on { background: var(--va-accent-soft); color: var(--va-accent); font-weight: 650; }
31
+ .va-switch .va-mode.va-off { color: var(--va-ink-3); cursor: not-allowed; }
32
+
33
+ .va-rail-head { align-items: center; display: flex; flex: none; flex-wrap: wrap; gap: 0.4rem; padding: 0 0.15rem 0.5rem; }
34
+ .va-rail-tally { color: var(--va-ink-3); font-size: 0.76rem; margin-right: auto; }
35
+ .va-rail-empty { padding: 0.6rem 0.15rem; }
36
+ /* The scrolling half. \`min-height: 0\` is what keeps it scrolling rather than
37
+ pushing the rail past the bottom of the window — a flex child's default
38
+ minimum is its content, and a build of forty changes would take the viewport
39
+ with it. */
40
+ .va-rail-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
41
+
42
+ /* The orders. Small, and deliberately not a select: four addresses a reader can
43
+ middle-click, which a select cannot be. */
44
+ .va-sorting { display: inline-flex; gap: 0.1rem; }
45
+ .va-sort { border-radius: 6px; color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.66rem; letter-spacing: 0.06em; padding: 0.15rem 0.4rem; text-decoration: none; text-transform: uppercase; }
46
+ .va-sort:hover { background: var(--va-sunken); color: var(--va-ink); }
47
+ .va-sort.va-on { background: var(--va-accent-soft); color: var(--va-accent); }
48
+
49
+ /* A band, and the sentence that says why its rows are together. The left edge
50
+ carries the band's meaning: an alarm is red, a decision is green, and the
51
+ ordinary work you asked for is the accent. */
52
+ .va-band { border-left: 2px solid var(--va-line-firm); margin: 0 0 0.9rem 0.15rem; padding-left: 0.7rem; }
53
+ .va-band h3 { align-items: center; display: flex; font-size: 0.76rem; font-weight: 700; gap: 0.4rem; letter-spacing: 0.05em; margin-bottom: 0.15rem; text-transform: uppercase; }
54
+ .va-band h3 .va-num { background: var(--va-sunken); border-radius: 999px; color: var(--va-ink-2); font-size: 0.7rem; letter-spacing: 0; padding: 0 0.4rem; }
55
+ .va-band > .va-note { font-size: 0.74rem; margin-bottom: 0.35rem; }
56
+ .va-band-stranded { border-left-color: var(--va-bad); }
57
+ .va-band-stranded h3 { color: var(--va-bad-ink); }
58
+ .va-band-reached { border-left-color: var(--va-accent); }
59
+ .va-band-contradicted { border-left-color: var(--va-warn); }
60
+ .va-band-contradicted h3 { color: var(--va-warn-ink); }
61
+ .va-band-unexplained { border-left-color: var(--va-warn); }
62
+ .va-band-unexplained h3 { color: var(--va-warn-ink); }
63
+ .va-band-upstream { border-left-color: var(--va-collateral); }
64
+ .va-band-token { border-left-color: var(--va-collateral); }
65
+ .va-band-unnamed { border-left-color: var(--va-line-firm); }
66
+ .va-band-unread { border-left-color: var(--va-warn); }
67
+ .va-band-decided { border-left-color: var(--va-good); }
68
+ .va-band-orphan { border-left-color: var(--va-warn); }
69
+
70
+ /* A heading that is a path or a property, not a claim, so it overrides the
71
+ band's uppercase: a name a reviewer uppercases is a name they cannot grep. */
72
+ .va-band h3.va-root, .va-root { flex-wrap: wrap; font-family: var(--va-mono); font-size: 0.78rem; font-weight: 600; gap: 0.15rem; letter-spacing: 0; text-transform: none; }
73
+ .va-root .va-root-in { color: var(--va-ink-3); font-weight: 400; }
74
+ .va-root .va-root-name { color: var(--va-ink); }
75
+ .va-root-component .va-root-name { font-family: var(--va-sans); font-weight: 700; }
76
+
77
+ /* The same cause on the change page: one line under the name, and the other
78
+ changes it made. */
79
+ .va-from { align-items: baseline; display: flex; flex-wrap: wrap; font-size: 0.8rem; gap: 0.3rem; margin-top: 0.2rem; }
80
+ .va-from-mark { color: var(--va-ink-3); font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; }
81
+ .va-from .va-root { font-size: 0.8rem; }
82
+ .va-from-go { color: var(--va-accent); text-decoration: none; }
83
+ .va-from-go:hover { text-decoration: underline; }
84
+
85
+ /* The prediction under a root, and the same claim about the whole build. It sits
86
+ between a heading and the rows it explains, so it is quieter than both. */
87
+ .va-foreseen { color: var(--va-ink-3); font-size: 0.72rem; line-height: 1.5; margin: 0.1rem 0 0.4rem; }
88
+ .va-foreseen .va-num { color: var(--va-ink-2); font-family: var(--va-mono); }
89
+ .va-foreseen .va-from-go { color: var(--va-ink-2); font-family: var(--va-mono); text-decoration: none; }
90
+ .va-foreseen .va-from-go:hover { color: var(--va-accent); text-decoration: underline; }
91
+ .va-foreseen-off { color: var(--va-warn-ink); }
92
+ .va-rail-head + .va-foreseen { margin: -0.2rem 0 0.5rem; }
93
+
94
+ /* One change, in a row a reviewer scans a column of. The name is the only thing
95
+ at full contrast; everything else on the row is there to be skipped. */
96
+ .va-row { margin-bottom: 0.1rem; }
97
+ .va-row-link { align-items: baseline; border: 1px solid transparent; border-radius: 8px; column-gap: 0.5rem; display: grid; grid-template-columns: minmax(0, 1fr) auto; padding: 0.35rem 0.5rem; row-gap: 0.05rem; text-decoration: none; }
98
+ .va-row-link:hover { background: var(--va-sunken); }
99
+ .va-row.va-here .va-row-link { background: var(--va-accent-soft); border-color: var(--va-accent); }
100
+ .va-row-name { font-size: 0.88rem; font-weight: 550; grid-area: 1 / 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
101
+ .va-row-spread { font-size: 0.74rem; grid-area: 2 / 1; }
102
+ .va-row-size { color: var(--va-ink-3); font-size: 0.74rem; grid-area: 2 / 2; text-align: right; }
103
+ .va-row .va-mark { font-size: 0.68rem; grid-area: 1 / 2; justify-self: end; }
104
+ .va-row-from { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.7rem; grid-area: 3 / 1 / 4 / 3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
105
+
106
+ /* The page with nothing open: four sentences and two links, and no encyclopedia.
107
+ Everything a reader could want past this has an address of its own. */
108
+ .va-opening { max-width: 44rem; }
109
+ .va-opening h1 { margin-bottom: 0.3rem; }
110
+ .va-opening-links { align-items: baseline; display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 1.4rem; }
111
+
112
+ /* The change itself. The two buttons are in the head, level with the component
113
+ name: every line below them is a reason to press one or to refuse, and a
114
+ reviewer who has read them should not scroll back past the reasons to act. */
115
+ .va-decide { max-width: 62rem; }
116
+ .va-decide-head { align-items: flex-start; border-bottom: 1px solid var(--va-line); display: flex; flex-wrap: wrap; gap: 0.8rem; justify-content: space-between; padding-bottom: 0.8rem; }
117
+ .va-decide-head h1 { margin: 0; }
118
+ .va-decide-lead { font-size: 1rem; margin-top: 0.8rem; }
119
+ .va-decide-act { align-items: center; display: flex; flex-wrap: wrap; gap: 0.55rem; }
120
+ .va-decide-act button { font-weight: 600; }
121
+ .va-decide-act .va-approve { background: var(--va-good); border-color: var(--va-good); color: #ffffff; }
122
+ .va-decide-act .va-approve:disabled { background: var(--va-sunken); border-color: var(--va-line-firm); color: var(--va-ink-3); }
123
+ .va-decide h2 { font-size: 0.78rem; letter-spacing: 0.08em; margin-top: 1.6rem; text-transform: uppercase; }
124
+
125
+ /* Whether the commit arrives, in the three colours the three answers deserve.
126
+ The alarm is spent on one of them and must stay that way: a page that shouted
127
+ over every component out of a dependency trained the alarm out of its readers
128
+ inside a build. */
129
+ .va-reaches { border-radius: 7px; font-size: 0.9rem; margin-top: 0.9rem; padding: 0.5rem 0.7rem; }
130
+ .va-reaches.va-reached { background: var(--va-info-bg); color: var(--va-info-ink); }
131
+ .va-reaches.va-alarm { background: var(--va-bad-bg); color: var(--va-bad-ink); }
132
+ .va-reaches.va-unnamed { background: var(--va-info-bg); color: var(--va-info-ink); }
133
+
134
+ /* The run's own conclusion, above the file graph's. Left-marked rather than
135
+ filled: it sits directly over the reach block, and two filled panels in a row
136
+ read as one panel with a seam in it. The colour is the rung — the two that
137
+ say *the run found nothing* borrow the alarm, and the three that explain
138
+ something do not, because an explanation is not a finding. */
139
+ .va-attributed { border-left: 3px solid var(--va-line-firm); font-size: 0.92rem; margin-top: 0.9rem; padding-left: 0.7rem; }
140
+ .va-attributed code { font-size: 0.86em; }
141
+ .va-attributed-edited { border-left-color: var(--va-accent); }
142
+ .va-attributed-upstream { border-left-color: var(--va-collateral); }
143
+ .va-attributed-token { border-left-color: var(--va-collateral); }
144
+ .va-attributed-contradicted { border-left-color: var(--va-bad); }
145
+ .va-attributed-unexplained { border-left-color: var(--va-bad); }
146
+ .va-attributed-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }
147
+
148
+ /* A band this change did not move on its own. Directly under the lead and
149
+ marked in the collateral colour, which is what it is: the sense moved here,
150
+ the decision is one file up, and the two belong on one screen without the
151
+ second looking like a second change. */
152
+ .va-handed { color: var(--va-ink-2); font-size: 0.95rem; margin-top: 0.35rem; }
153
+ .va-handed em { color: var(--va-ink); font-style: normal; font-weight: 600; }
154
+ .va-handed-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }
155
+
156
+ /* The three counts, side by side rather than in a sentence. A sentence has to
157
+ pick an order and an emphasis; these are three answers of equal standing to
158
+ three questions a reviewer asks in the same breath. */
159
+ .va-tally { align-items: baseline; color: var(--va-ink-2); display: flex; flex-wrap: wrap; font-size: 0.9rem; gap: 0.15rem 1.1rem; margin: 0.2rem 0 0.9rem; }
160
+ .va-tally strong { color: var(--va-ink); font-size: 1rem; }
161
+ .va-tally > .va-note { margin-left: auto; }
162
+
163
+ /* What happened to the things that draw this one — the question an author of a
164
+ leaf actually has. The list is ordered worst first, so the row that needs a
165
+ look is the one under the summary. */
166
+ .va-consumers { margin: 1.1rem 0; }
167
+ .va-consumers-tally { color: var(--va-ink-2); font-size: 0.92rem; margin: 0 0 0.5rem; }
168
+ .va-consumers-own { color: var(--va-bad-ink); font-weight: 600; }
169
+ .va-consumers-list { display: grid; gap: 0.3rem; list-style: none; margin: 0; padding: 0; }
170
+ .va-consumers-list li { align-items: baseline; border-left: 3px solid var(--va-collateral); display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.15rem 0 0.15rem 0.6rem; }
171
+ .va-consumer-name { color: var(--va-ink); font-weight: 600; }
172
+ .va-consumer-moved { border-left-color: var(--va-bad); }
173
+ .va-consumers-rest { color: var(--va-ink-3); font-size: 0.85rem; margin: 0.5rem 0 0; }
174
+ .va-consumers-rest span[title] { color: var(--va-ink-2); }
175
+ .va-alarm-text { color: var(--va-bad-ink); }
176
+
177
+ /* What a press of Approve settles that is not the change it is under. Directly
178
+ under the counts, because it is a correction to one of them: the seven renders
179
+ to accept are seven whole pictures, and four of them hold somebody else's
180
+ undecided difference. */
181
+ .va-carries { background: var(--va-bad-bg); border-radius: 6px; color: var(--va-ink-2); font-size: 0.88rem; margin: 0 0 0.9rem; padding: 0.4rem 0.6rem; }
182
+ .va-carries-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }
183
+ .va-carries-mark { background: var(--va-bad-bg); border-radius: 999px; color: var(--va-bad-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }
184
+
185
+ /* What a band claim is made of. At the foot, because it is the same sentence for
186
+ all of them and a reviewer needs it once — and not behind a disclosure,
187
+ because the complaint that produced it was a page hiding its sources. */
188
+ .va-held { border-left: 2px solid var(--va-good); color: var(--va-ink-2); font-size: 0.86rem; margin: 0.6rem 0 0; padding-left: 0.7rem; }
189
+ .va-held-mark { color: var(--va-good); font-weight: 600; }
190
+ .va-held-none { border-left-color: var(--va-ink-3); }
191
+ .va-held-none .va-held-mark { color: var(--va-ink-2); }
192
+ .va-held-go { color: inherit; text-decoration: underline; text-decoration-style: dotted; }
193
+ .va-evidence { border-top: 1px solid var(--va-line); color: var(--va-ink-3); font-size: 0.8rem; margin-top: 1.6rem; padding-top: 0.6rem; }
194
+ .va-evidence em { color: var(--va-ink-2); font-style: normal; }
195
+
196
+ /* What the last run said, beside the change rather than nine thousand pixels
197
+ below it. Warm rather than red: *you have seen this* is not an alarm, it is
198
+ the sentence a reviewer skips work on. */
199
+ .va-since { border-radius: 7px; font-size: 0.9rem; margin-top: 0.7rem; padding: 0.5rem 0.7rem; }
200
+ .va-since.va-known { background: var(--va-warn-bg); color: var(--va-warn-ink); }
201
+ .va-collateral-note { margin-top: 1.6rem; }
202
+
203
+ /* Where the renders stopped agreeing. Directly above the list they divide, so a
204
+ reviewer reads the groups and then finds them in order — and the sizes are the
205
+ left column in both, which is what makes the two readable as one list. */
206
+ .va-parted { margin: 1.4rem 0 0.6rem; }
207
+ .va-parted h2 { margin-bottom: 0.4rem; }
208
+ .va-parted ul { display: grid; gap: 0.5rem; list-style: none; margin: 0; padding: 0; }
209
+ .va-parted li { border-left: 3px solid var(--va-line); padding: 0.1rem 0 0.1rem 0.7rem; }
210
+ .va-parted li:first-child { border-left-color: var(--va-collateral); }
211
+ .va-parted-head { align-items: baseline; display: flex; flex-wrap: wrap; gap: 0.6rem; margin: 0; }
212
+ .va-parted-head .va-num { color: var(--va-ink); font-family: var(--va-mono); font-size: 0.95rem; }
213
+ .va-parted-only { color: var(--va-ink-2); font-size: 0.85rem; font-weight: 600; }
214
+ .va-parted-take { background: var(--va-sunken); border-radius: 5px; color: var(--va-ink-3); font-size: 0.74rem; margin-left: auto; padding: 0.1rem 0.4rem; }
215
+ .va-parted-in { font-size: 0.8rem; margin: 0.15rem 0 0; overflow-wrap: anywhere; }
216
+
217
+ /* Where it showed up: one row per render, each decidable on its own, because a
218
+ batch that could only be taken whole would be a batch nobody could refuse
219
+ part of. */
220
+ .va-where { display: grid; gap: 0.15rem; margin-top: 0.5rem; }
221
+ .va-where-row { align-items: baseline; border-radius: 8px; column-gap: 0.6rem; display: grid; grid-template-columns: minmax(6rem, 15rem) auto auto minmax(0, 1fr) auto; padding: 0.35rem 0.5rem; }
222
+ .va-where-row:hover { background: var(--va-sunken); }
223
+ .va-where-subject { font-size: 0.88rem; font-weight: 550; grid-column: 1; overflow: hidden; text-overflow: ellipsis; text-decoration: none; white-space: nowrap; }
224
+ .va-where-size { grid-column: 2; text-align: right; }
225
+ .va-where-row .va-mark { grid-column: 3; }
226
+ .va-where-with { grid-column: 4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
227
+ .va-where-row .va-note { font-size: 0.76rem; }
228
+ .va-where-act { display: flex; gap: 0.25rem; grid-column: 5; justify-self: end; }
229
+ .va-where-row > .va-mark:last-child { grid-column: 5; justify-self: end; }
230
+ .va-where-act button { border-radius: 6px; font-size: 0.8rem; line-height: 1; padding: 0.2rem 0.5rem; }
231
+ .va-where-act .va-approve:not(:disabled) { border-color: var(--va-good); color: var(--va-good-ink); }
232
+ .va-mark.va-known { background: var(--va-warn-bg); border-radius: 999px; color: var(--va-warn-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }
233
+ .va-mark.va-alarm { background: var(--va-bad-bg); border-radius: 999px; color: var(--va-bad-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }
234
+
235
+ /* What moved, in the sense the hashes recorded. The lead sentence is emphasis
236
+ inside the existing lead paragraph and gets no box of its own — it is the
237
+ subject of the page, not a note beside it. What follows is detail, and the
238
+ only part that raises its voice is a component the picture lost: the hashes
239
+ name it and no region does, which is the one state a reviewer cannot see. */
240
+ .va-decide-lead em { font-style: normal; font-weight: 600; }
241
+ .va-moved-lost { background: var(--va-bad-bg); border-radius: 7px; color: var(--va-bad-ink); font-size: 0.9rem; margin-top: 0.7rem; padding: 0.5rem 0.7rem; }
242
+ .va-moved h3 { font-size: 0.72rem; letter-spacing: 0.06em; margin-top: 1rem; text-transform: uppercase; }
243
+ .va-moved-with { display: grid; gap: 0.15rem; margin-top: 0.35rem; }
244
+ .va-moved-with li { align-items: baseline; column-gap: 0.5rem; display: flex; flex-wrap: wrap; font-size: 0.88rem; }
245
+ .va-moved-list { display: grid; gap: 0.3rem; }
246
+ .va-moved-row { align-items: baseline; column-gap: 0.5rem; display: flex; flex-wrap: wrap; font-size: 0.85rem; }
247
+ /* Pushed rather than edited, and dimmed to say so. The list is ordered by name
248
+ and not by consequence, so without this a passenger reads level with a cause. */
249
+ .va-moved-passenger .va-moved-name { color: var(--va-ink-3); font-weight: 400; }
250
+ .va-moved-name { font-weight: 600; }
251
+ /* How far a passenger is from the change, in the import graph. A chip and not a
252
+ sentence, and only on the rows the records place: a column that says the same
253
+ thing on every row is read once and skipped after. */
254
+ .va-moved-far { background: var(--va-sunken); border-radius: 5px; color: var(--va-ink-3); font-size: 0.74rem; padding: 0.05rem 0.35rem; }
255
+
256
+ /* The commit, its files, and how far out it landed — the build page's own
257
+ section, above the docket rather than beside it, because it is true of every
258
+ change on the page and nothing on it is decided. */
259
+ .va-impact { border-top: 1px solid var(--va-line); display: grid; gap: 1rem; margin-top: 1.4rem; padding-top: 1.1rem; }
260
+ .va-impact-commit { align-items: baseline; display: flex; flex-wrap: wrap; font-size: 0.9rem; }
261
+ .va-impact-files ul { display: grid; gap: 0.1rem; margin-top: 0.35rem; }
262
+ .va-impact-files li { font-size: 0.82rem; }
263
+ .va-impact-depth h2 { font-size: 0.72rem; letter-spacing: 0.06em; text-transform: uppercase; }
264
+ .va-rungs { display: grid; gap: 0.3rem; margin-top: 0.5rem; max-width: 34rem; }
265
+ .va-rung { align-items: center; display: grid; gap: 0.6rem; grid-template-columns: 7.5rem 1fr auto; }
266
+ .va-rung-at { font-size: 0.8rem; text-align: right; }
267
+ /* The bar is the reached count and the fill is the moved count inside it, so the
268
+ two are read as a share rather than as two lengths a reader has to divide. */
269
+ .va-rung-bar { background: var(--va-collateral); border-radius: 3px; display: block; height: 0.6rem; min-width: 2px; }
270
+ .va-rung-moved { background: var(--va-cause); border-radius: 3px; display: block; height: 100%; }
271
+ .va-rung-num { font-size: 0.78rem; }
272
+ /* The movement the bars cannot hold, which is the one part of the spread they
273
+ are silent about. A list and not a sentence, because each row carries its own
274
+ reason and a paragraph of them is a paragraph nobody finishes. */
275
+ .va-unheld { background: var(--va-bad-bg); border-radius: 7px; color: var(--va-bad-ink); font-size: 0.85rem; margin-top: 0.7rem; max-width: 34rem; padding: 0.5rem 0.7rem; }
276
+ .va-unheld ul { display: grid; gap: 0.25rem; margin-top: 0.4rem; }
277
+ .va-unheld li { align-items: baseline; column-gap: 0.45rem; display: flex; flex-wrap: wrap; }
278
+ .va-unheld-name { font-weight: 600; }
279
+ .va-unheld-why { opacity: 0.78; }
280
+ `;
281
+ //# sourceMappingURL=styles-docket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-docket.js","sourceRoot":"","sources":["../../src/ui/styles-docket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuQ5B,CAAC","sourcesContent":["/**\n * The two panes a build is worked in: the docket rail, and the change beside it.\n *\n * Its own module for the same reason [`styles-stage.ts`](./styles-stage.ts) is:\n * the sheet is one string handed to an operator, and the number of rules a person\n * has to hold at once to change one of them is a real cost. What is decided here\n * is *where a reviewer's eye goes first*, which is a layout question with a\n * correct answer — the band headings and the row a change occupies, above the\n * fold, in a column that does not grow with the build.\n *\n * The rule that matters most is the least visible one: nothing in this block\n * scrolls the document. The rail scrolls through the changes, the stage scrolls\n * through the one that is open, and the page itself is fixed to the viewport. A\n * surface where the document scrolls is a report; a surface where the panes\n * scroll is a place a reviewer navigates.\n */\nexport const DOCKET_STYLES = `\n/* The trail, which is the whole navigation. Five of the seven pages are *about*\n the page above them, and a trail says that where a menu would assert they are\n peers. */\n.va-crumbs { align-items: center; display: flex; gap: 0.3rem; min-width: 0; }\n.va-crumb { color: var(--va-ink-3); font-size: 0.8rem; text-decoration: none; white-space: nowrap; }\n.va-crumb:hover { color: var(--va-accent); }\n.va-crumb-sep { color: var(--va-line-firm); font-size: 0.8rem; }\n\n/* Changes or subjects: the two ways to work a build, as two addresses rather\n than as a piece of component state. */\n.va-switch { background: var(--va-sunken); border-radius: 9px; display: flex; flex: none; gap: 0.15rem; margin-bottom: 0.5rem; padding: 0.2rem; }\n.va-switch .va-mode { flex: 1; text-align: center; text-decoration: none; }\n.va-switch .va-mode.va-on { background: var(--va-accent-soft); color: var(--va-accent); font-weight: 650; }\n.va-switch .va-mode.va-off { color: var(--va-ink-3); cursor: not-allowed; }\n\n.va-rail-head { align-items: center; display: flex; flex: none; flex-wrap: wrap; gap: 0.4rem; padding: 0 0.15rem 0.5rem; }\n.va-rail-tally { color: var(--va-ink-3); font-size: 0.76rem; margin-right: auto; }\n.va-rail-empty { padding: 0.6rem 0.15rem; }\n/* The scrolling half. \\`min-height: 0\\` is what keeps it scrolling rather than\n pushing the rail past the bottom of the window — a flex child's default\n minimum is its content, and a build of forty changes would take the viewport\n with it. */\n.va-rail-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; }\n\n/* The orders. Small, and deliberately not a select: four addresses a reader can\n middle-click, which a select cannot be. */\n.va-sorting { display: inline-flex; gap: 0.1rem; }\n.va-sort { border-radius: 6px; color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.66rem; letter-spacing: 0.06em; padding: 0.15rem 0.4rem; text-decoration: none; text-transform: uppercase; }\n.va-sort:hover { background: var(--va-sunken); color: var(--va-ink); }\n.va-sort.va-on { background: var(--va-accent-soft); color: var(--va-accent); }\n\n/* A band, and the sentence that says why its rows are together. The left edge\n carries the band's meaning: an alarm is red, a decision is green, and the\n ordinary work you asked for is the accent. */\n.va-band { border-left: 2px solid var(--va-line-firm); margin: 0 0 0.9rem 0.15rem; padding-left: 0.7rem; }\n.va-band h3 { align-items: center; display: flex; font-size: 0.76rem; font-weight: 700; gap: 0.4rem; letter-spacing: 0.05em; margin-bottom: 0.15rem; text-transform: uppercase; }\n.va-band h3 .va-num { background: var(--va-sunken); border-radius: 999px; color: var(--va-ink-2); font-size: 0.7rem; letter-spacing: 0; padding: 0 0.4rem; }\n.va-band > .va-note { font-size: 0.74rem; margin-bottom: 0.35rem; }\n.va-band-stranded { border-left-color: var(--va-bad); }\n.va-band-stranded h3 { color: var(--va-bad-ink); }\n.va-band-reached { border-left-color: var(--va-accent); }\n.va-band-contradicted { border-left-color: var(--va-warn); }\n.va-band-contradicted h3 { color: var(--va-warn-ink); }\n.va-band-unexplained { border-left-color: var(--va-warn); }\n.va-band-unexplained h3 { color: var(--va-warn-ink); }\n.va-band-upstream { border-left-color: var(--va-collateral); }\n.va-band-token { border-left-color: var(--va-collateral); }\n.va-band-unnamed { border-left-color: var(--va-line-firm); }\n.va-band-unread { border-left-color: var(--va-warn); }\n.va-band-decided { border-left-color: var(--va-good); }\n.va-band-orphan { border-left-color: var(--va-warn); }\n\n/* A heading that is a path or a property, not a claim, so it overrides the\n band's uppercase: a name a reviewer uppercases is a name they cannot grep. */\n.va-band h3.va-root, .va-root { flex-wrap: wrap; font-family: var(--va-mono); font-size: 0.78rem; font-weight: 600; gap: 0.15rem; letter-spacing: 0; text-transform: none; }\n.va-root .va-root-in { color: var(--va-ink-3); font-weight: 400; }\n.va-root .va-root-name { color: var(--va-ink); }\n.va-root-component .va-root-name { font-family: var(--va-sans); font-weight: 700; }\n\n/* The same cause on the change page: one line under the name, and the other\n changes it made. */\n.va-from { align-items: baseline; display: flex; flex-wrap: wrap; font-size: 0.8rem; gap: 0.3rem; margin-top: 0.2rem; }\n.va-from-mark { color: var(--va-ink-3); font-size: 0.72rem; letter-spacing: 0.05em; text-transform: uppercase; }\n.va-from .va-root { font-size: 0.8rem; }\n.va-from-go { color: var(--va-accent); text-decoration: none; }\n.va-from-go:hover { text-decoration: underline; }\n\n/* The prediction under a root, and the same claim about the whole build. It sits\n between a heading and the rows it explains, so it is quieter than both. */\n.va-foreseen { color: var(--va-ink-3); font-size: 0.72rem; line-height: 1.5; margin: 0.1rem 0 0.4rem; }\n.va-foreseen .va-num { color: var(--va-ink-2); font-family: var(--va-mono); }\n.va-foreseen .va-from-go { color: var(--va-ink-2); font-family: var(--va-mono); text-decoration: none; }\n.va-foreseen .va-from-go:hover { color: var(--va-accent); text-decoration: underline; }\n.va-foreseen-off { color: var(--va-warn-ink); }\n.va-rail-head + .va-foreseen { margin: -0.2rem 0 0.5rem; }\n\n/* One change, in a row a reviewer scans a column of. The name is the only thing\n at full contrast; everything else on the row is there to be skipped. */\n.va-row { margin-bottom: 0.1rem; }\n.va-row-link { align-items: baseline; border: 1px solid transparent; border-radius: 8px; column-gap: 0.5rem; display: grid; grid-template-columns: minmax(0, 1fr) auto; padding: 0.35rem 0.5rem; row-gap: 0.05rem; text-decoration: none; }\n.va-row-link:hover { background: var(--va-sunken); }\n.va-row.va-here .va-row-link { background: var(--va-accent-soft); border-color: var(--va-accent); }\n.va-row-name { font-size: 0.88rem; font-weight: 550; grid-area: 1 / 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.va-row-spread { font-size: 0.74rem; grid-area: 2 / 1; }\n.va-row-size { color: var(--va-ink-3); font-size: 0.74rem; grid-area: 2 / 2; text-align: right; }\n.va-row .va-mark { font-size: 0.68rem; grid-area: 1 / 2; justify-self: end; }\n.va-row-from { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.7rem; grid-area: 3 / 1 / 4 / 3; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n\n/* The page with nothing open: four sentences and two links, and no encyclopedia.\n Everything a reader could want past this has an address of its own. */\n.va-opening { max-width: 44rem; }\n.va-opening h1 { margin-bottom: 0.3rem; }\n.va-opening-links { align-items: baseline; display: flex; flex-wrap: wrap; gap: 0.6rem; margin-top: 1.4rem; }\n\n/* The change itself. The two buttons are in the head, level with the component\n name: every line below them is a reason to press one or to refuse, and a\n reviewer who has read them should not scroll back past the reasons to act. */\n.va-decide { max-width: 62rem; }\n.va-decide-head { align-items: flex-start; border-bottom: 1px solid var(--va-line); display: flex; flex-wrap: wrap; gap: 0.8rem; justify-content: space-between; padding-bottom: 0.8rem; }\n.va-decide-head h1 { margin: 0; }\n.va-decide-lead { font-size: 1rem; margin-top: 0.8rem; }\n.va-decide-act { align-items: center; display: flex; flex-wrap: wrap; gap: 0.55rem; }\n.va-decide-act button { font-weight: 600; }\n.va-decide-act .va-approve { background: var(--va-good); border-color: var(--va-good); color: #ffffff; }\n.va-decide-act .va-approve:disabled { background: var(--va-sunken); border-color: var(--va-line-firm); color: var(--va-ink-3); }\n.va-decide h2 { font-size: 0.78rem; letter-spacing: 0.08em; margin-top: 1.6rem; text-transform: uppercase; }\n\n/* Whether the commit arrives, in the three colours the three answers deserve.\n The alarm is spent on one of them and must stay that way: a page that shouted\n over every component out of a dependency trained the alarm out of its readers\n inside a build. */\n.va-reaches { border-radius: 7px; font-size: 0.9rem; margin-top: 0.9rem; padding: 0.5rem 0.7rem; }\n.va-reaches.va-reached { background: var(--va-info-bg); color: var(--va-info-ink); }\n.va-reaches.va-alarm { background: var(--va-bad-bg); color: var(--va-bad-ink); }\n.va-reaches.va-unnamed { background: var(--va-info-bg); color: var(--va-info-ink); }\n\n/* The run's own conclusion, above the file graph's. Left-marked rather than\n filled: it sits directly over the reach block, and two filled panels in a row\n read as one panel with a seam in it. The colour is the rung — the two that\n say *the run found nothing* borrow the alarm, and the three that explain\n something do not, because an explanation is not a finding. */\n.va-attributed { border-left: 3px solid var(--va-line-firm); font-size: 0.92rem; margin-top: 0.9rem; padding-left: 0.7rem; }\n.va-attributed code { font-size: 0.86em; }\n.va-attributed-edited { border-left-color: var(--va-accent); }\n.va-attributed-upstream { border-left-color: var(--va-collateral); }\n.va-attributed-token { border-left-color: var(--va-collateral); }\n.va-attributed-contradicted { border-left-color: var(--va-bad); }\n.va-attributed-unexplained { border-left-color: var(--va-bad); }\n.va-attributed-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }\n\n/* A band this change did not move on its own. Directly under the lead and\n marked in the collateral colour, which is what it is: the sense moved here,\n the decision is one file up, and the two belong on one screen without the\n second looking like a second change. */\n.va-handed { color: var(--va-ink-2); font-size: 0.95rem; margin-top: 0.35rem; }\n.va-handed em { color: var(--va-ink); font-style: normal; font-weight: 600; }\n.va-handed-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }\n\n/* The three counts, side by side rather than in a sentence. A sentence has to\n pick an order and an emphasis; these are three answers of equal standing to\n three questions a reviewer asks in the same breath. */\n.va-tally { align-items: baseline; color: var(--va-ink-2); display: flex; flex-wrap: wrap; font-size: 0.9rem; gap: 0.15rem 1.1rem; margin: 0.2rem 0 0.9rem; }\n.va-tally strong { color: var(--va-ink); font-size: 1rem; }\n.va-tally > .va-note { margin-left: auto; }\n\n/* What happened to the things that draw this one — the question an author of a\n leaf actually has. The list is ordered worst first, so the row that needs a\n look is the one under the summary. */\n.va-consumers { margin: 1.1rem 0; }\n.va-consumers-tally { color: var(--va-ink-2); font-size: 0.92rem; margin: 0 0 0.5rem; }\n.va-consumers-own { color: var(--va-bad-ink); font-weight: 600; }\n.va-consumers-list { display: grid; gap: 0.3rem; list-style: none; margin: 0; padding: 0; }\n.va-consumers-list li { align-items: baseline; border-left: 3px solid var(--va-collateral); display: flex; flex-wrap: wrap; gap: 0.5rem; padding: 0.15rem 0 0.15rem 0.6rem; }\n.va-consumer-name { color: var(--va-ink); font-weight: 600; }\n.va-consumer-moved { border-left-color: var(--va-bad); }\n.va-consumers-rest { color: var(--va-ink-3); font-size: 0.85rem; margin: 0.5rem 0 0; }\n.va-consumers-rest span[title] { color: var(--va-ink-2); }\n.va-alarm-text { color: var(--va-bad-ink); }\n\n/* What a press of Approve settles that is not the change it is under. Directly\n under the counts, because it is a correction to one of them: the seven renders\n to accept are seven whole pictures, and four of them hold somebody else's\n undecided difference. */\n.va-carries { background: var(--va-bad-bg); border-radius: 6px; color: var(--va-ink-2); font-size: 0.88rem; margin: 0 0 0.9rem; padding: 0.4rem 0.6rem; }\n.va-carries-go { color: var(--va-accent); font-weight: 600; white-space: nowrap; }\n.va-carries-mark { background: var(--va-bad-bg); border-radius: 999px; color: var(--va-bad-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }\n\n/* What a band claim is made of. At the foot, because it is the same sentence for\n all of them and a reviewer needs it once — and not behind a disclosure,\n because the complaint that produced it was a page hiding its sources. */\n.va-held { border-left: 2px solid var(--va-good); color: var(--va-ink-2); font-size: 0.86rem; margin: 0.6rem 0 0; padding-left: 0.7rem; }\n.va-held-mark { color: var(--va-good); font-weight: 600; }\n.va-held-none { border-left-color: var(--va-ink-3); }\n.va-held-none .va-held-mark { color: var(--va-ink-2); }\n.va-held-go { color: inherit; text-decoration: underline; text-decoration-style: dotted; }\n.va-evidence { border-top: 1px solid var(--va-line); color: var(--va-ink-3); font-size: 0.8rem; margin-top: 1.6rem; padding-top: 0.6rem; }\n.va-evidence em { color: var(--va-ink-2); font-style: normal; }\n\n/* What the last run said, beside the change rather than nine thousand pixels\n below it. Warm rather than red: *you have seen this* is not an alarm, it is\n the sentence a reviewer skips work on. */\n.va-since { border-radius: 7px; font-size: 0.9rem; margin-top: 0.7rem; padding: 0.5rem 0.7rem; }\n.va-since.va-known { background: var(--va-warn-bg); color: var(--va-warn-ink); }\n.va-collateral-note { margin-top: 1.6rem; }\n\n/* Where the renders stopped agreeing. Directly above the list they divide, so a\n reviewer reads the groups and then finds them in order — and the sizes are the\n left column in both, which is what makes the two readable as one list. */\n.va-parted { margin: 1.4rem 0 0.6rem; }\n.va-parted h2 { margin-bottom: 0.4rem; }\n.va-parted ul { display: grid; gap: 0.5rem; list-style: none; margin: 0; padding: 0; }\n.va-parted li { border-left: 3px solid var(--va-line); padding: 0.1rem 0 0.1rem 0.7rem; }\n.va-parted li:first-child { border-left-color: var(--va-collateral); }\n.va-parted-head { align-items: baseline; display: flex; flex-wrap: wrap; gap: 0.6rem; margin: 0; }\n.va-parted-head .va-num { color: var(--va-ink); font-family: var(--va-mono); font-size: 0.95rem; }\n.va-parted-only { color: var(--va-ink-2); font-size: 0.85rem; font-weight: 600; }\n.va-parted-take { background: var(--va-sunken); border-radius: 5px; color: var(--va-ink-3); font-size: 0.74rem; margin-left: auto; padding: 0.1rem 0.4rem; }\n.va-parted-in { font-size: 0.8rem; margin: 0.15rem 0 0; overflow-wrap: anywhere; }\n\n/* Where it showed up: one row per render, each decidable on its own, because a\n batch that could only be taken whole would be a batch nobody could refuse\n part of. */\n.va-where { display: grid; gap: 0.15rem; margin-top: 0.5rem; }\n.va-where-row { align-items: baseline; border-radius: 8px; column-gap: 0.6rem; display: grid; grid-template-columns: minmax(6rem, 15rem) auto auto minmax(0, 1fr) auto; padding: 0.35rem 0.5rem; }\n.va-where-row:hover { background: var(--va-sunken); }\n.va-where-subject { font-size: 0.88rem; font-weight: 550; grid-column: 1; overflow: hidden; text-overflow: ellipsis; text-decoration: none; white-space: nowrap; }\n.va-where-size { grid-column: 2; text-align: right; }\n.va-where-row .va-mark { grid-column: 3; }\n.va-where-with { grid-column: 4; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.va-where-row .va-note { font-size: 0.76rem; }\n.va-where-act { display: flex; gap: 0.25rem; grid-column: 5; justify-self: end; }\n.va-where-row > .va-mark:last-child { grid-column: 5; justify-self: end; }\n.va-where-act button { border-radius: 6px; font-size: 0.8rem; line-height: 1; padding: 0.2rem 0.5rem; }\n.va-where-act .va-approve:not(:disabled) { border-color: var(--va-good); color: var(--va-good-ink); }\n.va-mark.va-known { background: var(--va-warn-bg); border-radius: 999px; color: var(--va-warn-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }\n.va-mark.va-alarm { background: var(--va-bad-bg); border-radius: 999px; color: var(--va-bad-ink); font-size: 0.68rem; padding: 0.05rem 0.4rem; }\n\n/* What moved, in the sense the hashes recorded. The lead sentence is emphasis\n inside the existing lead paragraph and gets no box of its own — it is the\n subject of the page, not a note beside it. What follows is detail, and the\n only part that raises its voice is a component the picture lost: the hashes\n name it and no region does, which is the one state a reviewer cannot see. */\n.va-decide-lead em { font-style: normal; font-weight: 600; }\n.va-moved-lost { background: var(--va-bad-bg); border-radius: 7px; color: var(--va-bad-ink); font-size: 0.9rem; margin-top: 0.7rem; padding: 0.5rem 0.7rem; }\n.va-moved h3 { font-size: 0.72rem; letter-spacing: 0.06em; margin-top: 1rem; text-transform: uppercase; }\n.va-moved-with { display: grid; gap: 0.15rem; margin-top: 0.35rem; }\n.va-moved-with li { align-items: baseline; column-gap: 0.5rem; display: flex; flex-wrap: wrap; font-size: 0.88rem; }\n.va-moved-list { display: grid; gap: 0.3rem; }\n.va-moved-row { align-items: baseline; column-gap: 0.5rem; display: flex; flex-wrap: wrap; font-size: 0.85rem; }\n/* Pushed rather than edited, and dimmed to say so. The list is ordered by name\n and not by consequence, so without this a passenger reads level with a cause. */\n.va-moved-passenger .va-moved-name { color: var(--va-ink-3); font-weight: 400; }\n.va-moved-name { font-weight: 600; }\n/* How far a passenger is from the change, in the import graph. A chip and not a\n sentence, and only on the rows the records place: a column that says the same\n thing on every row is read once and skipped after. */\n.va-moved-far { background: var(--va-sunken); border-radius: 5px; color: var(--va-ink-3); font-size: 0.74rem; padding: 0.05rem 0.35rem; }\n\n/* The commit, its files, and how far out it landed — the build page's own\n section, above the docket rather than beside it, because it is true of every\n change on the page and nothing on it is decided. */\n.va-impact { border-top: 1px solid var(--va-line); display: grid; gap: 1rem; margin-top: 1.4rem; padding-top: 1.1rem; }\n.va-impact-commit { align-items: baseline; display: flex; flex-wrap: wrap; font-size: 0.9rem; }\n.va-impact-files ul { display: grid; gap: 0.1rem; margin-top: 0.35rem; }\n.va-impact-files li { font-size: 0.82rem; }\n.va-impact-depth h2 { font-size: 0.72rem; letter-spacing: 0.06em; text-transform: uppercase; }\n.va-rungs { display: grid; gap: 0.3rem; margin-top: 0.5rem; max-width: 34rem; }\n.va-rung { align-items: center; display: grid; gap: 0.6rem; grid-template-columns: 7.5rem 1fr auto; }\n.va-rung-at { font-size: 0.8rem; text-align: right; }\n/* The bar is the reached count and the fill is the moved count inside it, so the\n two are read as a share rather than as two lengths a reader has to divide. */\n.va-rung-bar { background: var(--va-collateral); border-radius: 3px; display: block; height: 0.6rem; min-width: 2px; }\n.va-rung-moved { background: var(--va-cause); border-radius: 3px; display: block; height: 100%; }\n.va-rung-num { font-size: 0.78rem; }\n/* The movement the bars cannot hold, which is the one part of the spread they\n are silent about. A list and not a sentence, because each row carries its own\n reason and a paragraph of them is a paragraph nobody finishes. */\n.va-unheld { background: var(--va-bad-bg); border-radius: 7px; color: var(--va-bad-ink); font-size: 0.85rem; margin-top: 0.7rem; max-width: 34rem; padding: 0.5rem 0.7rem; }\n.va-unheld ul { display: grid; gap: 0.25rem; margin-top: 0.4rem; }\n.va-unheld li { align-items: baseline; column-gap: 0.45rem; display: flex; flex-wrap: wrap; }\n.va-unheld-name { font-weight: 600; }\n.va-unheld-why { opacity: 0.78; }\n`;\n"]}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * The comparison itself: the bar over it, the plate under it, and the seam.
3
+ *
4
+ * Its own module because it is the half of the sheet that is *about the
5
+ * evidence* rather than about the room the evidence is read in. Every other rule
6
+ * in {@link REVIEW_STYLES} decides where a sentence sits; these decide whether a
7
+ * two-pixel shift is a two-pixel shift when a reviewer looks at it — the plate
8
+ * does not smooth, the layers do not stretch to each other's dimensions, and the
9
+ * region boxes sit at the coordinates the run measured rather than at
10
+ * coordinates a layout arrived at. A rule in this block that is wrong makes the
11
+ * page lie about a picture, which is not true of anything outside it.
12
+ *
13
+ * Concatenated into that sheet rather than shipped separately: the operator is
14
+ * handed one string, and a consumer who had to remember to inject a second one
15
+ * would have a page whose captions are styled and whose evidence is not.
16
+ */
17
+ export declare const STAGE_STYLES = "\n/* The bar over the stage: what is being compared, how large it is drawn, and\n which finding is being looked at. Three groups rather than one row of\n everything, because they are asked in that order and answered independently. */\n.va-viewer-bar { display: grid; gap: 0.45rem; margin: 0.85rem 0 0.6rem; }\n.va-viewer-controls, .va-viewer-readout { align-items: center; display: flex; flex-wrap: wrap; gap: 0.5rem; min-width: 0; }\n.va-modes, .va-zooms { background: var(--va-sunken); border-radius: 9px; display: inline-flex; flex-wrap: wrap; gap: 0.15rem; padding: 0.2rem; }\n.va-mode { background: none; border: 1px solid transparent; border-radius: 7px; font-family: var(--va-mono); font-size: 0.72rem; letter-spacing: 0.08em; padding: 0.25rem 0.6rem; text-transform: uppercase; white-space: nowrap; }\n.va-mode.va-current { background: var(--va-accent-soft); border-color: var(--va-accent); color: var(--va-accent); font-weight: 650; }\n.va-steps { align-items: center; display: inline-flex; gap: 0.4rem; margin-left: auto; }\n.va-steps button { font-size: 0.9rem; line-height: 1; padding: 0.25rem 0.55rem; }\n.va-steps span { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.75rem; }\n\n/* The stage is the pane; the plate is the capture inside it, at whatever\n magnification was asked for. Two boxes rather than one, because a zoom that\n grew the pane would push the decision buttons off the screen \u2014 the thing a\n reviewer came here to press. */\n.va-loupe { background: var(--va-sunken); border: 1px solid var(--va-line); border-radius: 10px; max-height: 70vh; max-width: 100%; overflow: auto; overscroll-behavior: contain; position: relative; }\n.va-plate { background: var(--va-surface); margin: 0 auto; position: relative; width: 100%; }\n/* Every layer fills the plate, so the baseline and the candidate are always at\n one magnification. A wipe between two scales is not a comparison \u2014 it reads as\n a change everywhere the seam happens to fall. height: auto, because a deferred\n raster carries its own dimensions as attributes and a width alone would keep\n the declared height, squashing every candidate to the aspect ratio of nothing. */\n.va-plate img { display: block; height: auto; image-rendering: pixelated; width: 100%; }\n/* The baseline sits under the candidate at the corner rather than inset: 0 \u2014\n stretched between top and bottom it would be drawn at the candidate's height\n whenever the two differ, which is often the change itself. */\n.va-plate .va-under { left: 0; position: absolute; top: 0; }\n/* Both layers leave the flow the moment the two captures are different shapes:\n the plate's height then comes from the union it declares, not from whichever\n image happens to be in flow \u2014 which would crop the taller one. */\n.va-plate.va-boxed img { left: 0; position: absolute; top: 0; }\n.va-measure { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }\n.va-measure .va-resized { color: var(--va-accent); }\n.va-showing { color: var(--va-ink-2); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }\n\n/* The seam is the control, not a slider parked somewhere else on the page: it\n spans the plate, so the thumb sits over the boundary it moves, and it is a\n real range input, so it answers to the arrow keys as well as to a drag. */\n.va-seam { -webkit-appearance: none; appearance: none; background: none; border: 0; border-radius: 0; display: block; height: 22px; margin-bottom: -22px; padding: 0; position: sticky; top: 0; width: 100%; z-index: 3; }\n.va-seam::-webkit-slider-thumb { -webkit-appearance: none; background: var(--va-accent); border-radius: 2px; height: 22px; width: 4px; }\n.va-seam::-moz-range-thumb { background: var(--va-accent); border: 0; border-radius: 2px; height: 22px; width: 4px; }\n.va-seam-line { background: var(--va-accent); bottom: 0; pointer-events: none; position: absolute; top: 0; width: 1px; }\n.va-blend { accent-color: var(--va-accent); display: block; margin-top: 0.6rem; width: 100%; }\n\n.va-side-by-side { display: flex; gap: 1rem; }\n.va-side-by-side figure { margin: 0; min-width: 0; }\n.va-side-by-side figcaption { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.68rem; letter-spacing: 0.09em; margin-bottom: 0.3rem; text-transform: uppercase; }\n.va-side-by-side img { border: 1px solid var(--va-line); border-radius: 10px; height: auto; image-rendering: pixelated; max-width: 100%; }\n.va-pixels { color: var(--va-ink-3); font-size: 0.82rem; margin-top: 0.5rem; }\n\n.va-regions { inset: 0; pointer-events: none; position: absolute; }\n.va-region { pointer-events: auto; position: absolute; }\n.va-region.va-cause { outline: 2px solid var(--va-cause); }\n.va-region.va-collateral { outline: 1px dashed var(--va-collateral); }\n/* Lit from either side: the rectangle and its row are the same finding, and a\n reviewer joining them by counting down a table is doing the work twice. */\n.va-region.va-lit { background: var(--va-accent-soft); outline-width: 3px; }\n.va-region-label { background: var(--va-cause); border-radius: 3px; color: var(--va-accent-ink); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; left: 0; padding: 0 0.25rem; position: absolute; top: -1.15rem; white-space: nowrap; }\n.va-region.va-collateral .va-region-label { background: var(--va-collateral); color: var(--va-bg); }\n\n/* The column a rectangle cannot draw. A box says *here*; only the table says\n which file to open, which is what lets a reviewer hand the change on rather\n than decide it themselves. */\n.va-region-table { border-collapse: collapse; font-size: 0.82rem; margin-top: 0.75rem; width: 100%; }\n.va-region-table th { border-bottom: 1px solid var(--va-line-firm); color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; letter-spacing: 0.09em; padding: 0.3rem 0.5rem; text-align: left; text-transform: uppercase; }\n.va-region-table td { border-bottom: 1px solid var(--va-line); padding: 0.3rem 0.5rem; vertical-align: top; }\n.va-region-table tr.va-lit td { background: var(--va-accent-soft); }\n.va-region-table .va-num-col { text-align: right; }\n.va-region-jump { align-items: baseline; background: none; border: 0; border-radius: 0; display: flex; gap: 0.4rem; padding: 0; text-align: left; }\n.va-region-where { color: var(--va-ink-3); font-size: 0.75rem; }\n.va-dot.va-cause { background: var(--va-cause); }\n.va-dot.va-collateral { background: var(--va-collateral); }\n";
18
+ //# sourceMappingURL=styles-stage.d.ts.map
@@ -0,0 +1,92 @@
1
+ /**
2
+ * The comparison itself: the bar over it, the plate under it, and the seam.
3
+ *
4
+ * Its own module because it is the half of the sheet that is *about the
5
+ * evidence* rather than about the room the evidence is read in. Every other rule
6
+ * in {@link REVIEW_STYLES} decides where a sentence sits; these decide whether a
7
+ * two-pixel shift is a two-pixel shift when a reviewer looks at it — the plate
8
+ * does not smooth, the layers do not stretch to each other's dimensions, and the
9
+ * region boxes sit at the coordinates the run measured rather than at
10
+ * coordinates a layout arrived at. A rule in this block that is wrong makes the
11
+ * page lie about a picture, which is not true of anything outside it.
12
+ *
13
+ * Concatenated into that sheet rather than shipped separately: the operator is
14
+ * handed one string, and a consumer who had to remember to inject a second one
15
+ * would have a page whose captions are styled and whose evidence is not.
16
+ */
17
+ export const STAGE_STYLES = `
18
+ /* The bar over the stage: what is being compared, how large it is drawn, and
19
+ which finding is being looked at. Three groups rather than one row of
20
+ everything, because they are asked in that order and answered independently. */
21
+ .va-viewer-bar { display: grid; gap: 0.45rem; margin: 0.85rem 0 0.6rem; }
22
+ .va-viewer-controls, .va-viewer-readout { align-items: center; display: flex; flex-wrap: wrap; gap: 0.5rem; min-width: 0; }
23
+ .va-modes, .va-zooms { background: var(--va-sunken); border-radius: 9px; display: inline-flex; flex-wrap: wrap; gap: 0.15rem; padding: 0.2rem; }
24
+ .va-mode { background: none; border: 1px solid transparent; border-radius: 7px; font-family: var(--va-mono); font-size: 0.72rem; letter-spacing: 0.08em; padding: 0.25rem 0.6rem; text-transform: uppercase; white-space: nowrap; }
25
+ .va-mode.va-current { background: var(--va-accent-soft); border-color: var(--va-accent); color: var(--va-accent); font-weight: 650; }
26
+ .va-steps { align-items: center; display: inline-flex; gap: 0.4rem; margin-left: auto; }
27
+ .va-steps button { font-size: 0.9rem; line-height: 1; padding: 0.25rem 0.55rem; }
28
+ .va-steps span { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.75rem; }
29
+
30
+ /* The stage is the pane; the plate is the capture inside it, at whatever
31
+ magnification was asked for. Two boxes rather than one, because a zoom that
32
+ grew the pane would push the decision buttons off the screen — the thing a
33
+ reviewer came here to press. */
34
+ .va-loupe { background: var(--va-sunken); border: 1px solid var(--va-line); border-radius: 10px; max-height: 70vh; max-width: 100%; overflow: auto; overscroll-behavior: contain; position: relative; }
35
+ .va-plate { background: var(--va-surface); margin: 0 auto; position: relative; width: 100%; }
36
+ /* Every layer fills the plate, so the baseline and the candidate are always at
37
+ one magnification. A wipe between two scales is not a comparison — it reads as
38
+ a change everywhere the seam happens to fall. height: auto, because a deferred
39
+ raster carries its own dimensions as attributes and a width alone would keep
40
+ the declared height, squashing every candidate to the aspect ratio of nothing. */
41
+ .va-plate img { display: block; height: auto; image-rendering: pixelated; width: 100%; }
42
+ /* The baseline sits under the candidate at the corner rather than inset: 0 —
43
+ stretched between top and bottom it would be drawn at the candidate's height
44
+ whenever the two differ, which is often the change itself. */
45
+ .va-plate .va-under { left: 0; position: absolute; top: 0; }
46
+ /* Both layers leave the flow the moment the two captures are different shapes:
47
+ the plate's height then comes from the union it declares, not from whichever
48
+ image happens to be in flow — which would crop the taller one. */
49
+ .va-plate.va-boxed img { left: 0; position: absolute; top: 0; }
50
+ .va-measure { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }
51
+ .va-measure .va-resized { color: var(--va-accent); }
52
+ .va-showing { color: var(--va-ink-2); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }
53
+
54
+ /* The seam is the control, not a slider parked somewhere else on the page: it
55
+ spans the plate, so the thumb sits over the boundary it moves, and it is a
56
+ real range input, so it answers to the arrow keys as well as to a drag. */
57
+ .va-seam { -webkit-appearance: none; appearance: none; background: none; border: 0; border-radius: 0; display: block; height: 22px; margin-bottom: -22px; padding: 0; position: sticky; top: 0; width: 100%; z-index: 3; }
58
+ .va-seam::-webkit-slider-thumb { -webkit-appearance: none; background: var(--va-accent); border-radius: 2px; height: 22px; width: 4px; }
59
+ .va-seam::-moz-range-thumb { background: var(--va-accent); border: 0; border-radius: 2px; height: 22px; width: 4px; }
60
+ .va-seam-line { background: var(--va-accent); bottom: 0; pointer-events: none; position: absolute; top: 0; width: 1px; }
61
+ .va-blend { accent-color: var(--va-accent); display: block; margin-top: 0.6rem; width: 100%; }
62
+
63
+ .va-side-by-side { display: flex; gap: 1rem; }
64
+ .va-side-by-side figure { margin: 0; min-width: 0; }
65
+ .va-side-by-side figcaption { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.68rem; letter-spacing: 0.09em; margin-bottom: 0.3rem; text-transform: uppercase; }
66
+ .va-side-by-side img { border: 1px solid var(--va-line); border-radius: 10px; height: auto; image-rendering: pixelated; max-width: 100%; }
67
+ .va-pixels { color: var(--va-ink-3); font-size: 0.82rem; margin-top: 0.5rem; }
68
+
69
+ .va-regions { inset: 0; pointer-events: none; position: absolute; }
70
+ .va-region { pointer-events: auto; position: absolute; }
71
+ .va-region.va-cause { outline: 2px solid var(--va-cause); }
72
+ .va-region.va-collateral { outline: 1px dashed var(--va-collateral); }
73
+ /* Lit from either side: the rectangle and its row are the same finding, and a
74
+ reviewer joining them by counting down a table is doing the work twice. */
75
+ .va-region.va-lit { background: var(--va-accent-soft); outline-width: 3px; }
76
+ .va-region-label { background: var(--va-cause); border-radius: 3px; color: var(--va-accent-ink); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; left: 0; padding: 0 0.25rem; position: absolute; top: -1.15rem; white-space: nowrap; }
77
+ .va-region.va-collateral .va-region-label { background: var(--va-collateral); color: var(--va-bg); }
78
+
79
+ /* The column a rectangle cannot draw. A box says *here*; only the table says
80
+ which file to open, which is what lets a reviewer hand the change on rather
81
+ than decide it themselves. */
82
+ .va-region-table { border-collapse: collapse; font-size: 0.82rem; margin-top: 0.75rem; width: 100%; }
83
+ .va-region-table th { border-bottom: 1px solid var(--va-line-firm); color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; letter-spacing: 0.09em; padding: 0.3rem 0.5rem; text-align: left; text-transform: uppercase; }
84
+ .va-region-table td { border-bottom: 1px solid var(--va-line); padding: 0.3rem 0.5rem; vertical-align: top; }
85
+ .va-region-table tr.va-lit td { background: var(--va-accent-soft); }
86
+ .va-region-table .va-num-col { text-align: right; }
87
+ .va-region-jump { align-items: baseline; background: none; border: 0; border-radius: 0; display: flex; gap: 0.4rem; padding: 0; text-align: left; }
88
+ .va-region-where { color: var(--va-ink-3); font-size: 0.75rem; }
89
+ .va-dot.va-cause { background: var(--va-cause); }
90
+ .va-dot.va-collateral { background: var(--va-collateral); }
91
+ `;
92
+ //# sourceMappingURL=styles-stage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles-stage.js","sourceRoot":"","sources":["../../src/ui/styles-stage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0E3B,CAAC","sourcesContent":["/**\n * The comparison itself: the bar over it, the plate under it, and the seam.\n *\n * Its own module because it is the half of the sheet that is *about the\n * evidence* rather than about the room the evidence is read in. Every other rule\n * in {@link REVIEW_STYLES} decides where a sentence sits; these decide whether a\n * two-pixel shift is a two-pixel shift when a reviewer looks at it — the plate\n * does not smooth, the layers do not stretch to each other's dimensions, and the\n * region boxes sit at the coordinates the run measured rather than at\n * coordinates a layout arrived at. A rule in this block that is wrong makes the\n * page lie about a picture, which is not true of anything outside it.\n *\n * Concatenated into that sheet rather than shipped separately: the operator is\n * handed one string, and a consumer who had to remember to inject a second one\n * would have a page whose captions are styled and whose evidence is not.\n */\nexport const STAGE_STYLES = `\n/* The bar over the stage: what is being compared, how large it is drawn, and\n which finding is being looked at. Three groups rather than one row of\n everything, because they are asked in that order and answered independently. */\n.va-viewer-bar { display: grid; gap: 0.45rem; margin: 0.85rem 0 0.6rem; }\n.va-viewer-controls, .va-viewer-readout { align-items: center; display: flex; flex-wrap: wrap; gap: 0.5rem; min-width: 0; }\n.va-modes, .va-zooms { background: var(--va-sunken); border-radius: 9px; display: inline-flex; flex-wrap: wrap; gap: 0.15rem; padding: 0.2rem; }\n.va-mode { background: none; border: 1px solid transparent; border-radius: 7px; font-family: var(--va-mono); font-size: 0.72rem; letter-spacing: 0.08em; padding: 0.25rem 0.6rem; text-transform: uppercase; white-space: nowrap; }\n.va-mode.va-current { background: var(--va-accent-soft); border-color: var(--va-accent); color: var(--va-accent); font-weight: 650; }\n.va-steps { align-items: center; display: inline-flex; gap: 0.4rem; margin-left: auto; }\n.va-steps button { font-size: 0.9rem; line-height: 1; padding: 0.25rem 0.55rem; }\n.va-steps span { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.75rem; }\n\n/* The stage is the pane; the plate is the capture inside it, at whatever\n magnification was asked for. Two boxes rather than one, because a zoom that\n grew the pane would push the decision buttons off the screen — the thing a\n reviewer came here to press. */\n.va-loupe { background: var(--va-sunken); border: 1px solid var(--va-line); border-radius: 10px; max-height: 70vh; max-width: 100%; overflow: auto; overscroll-behavior: contain; position: relative; }\n.va-plate { background: var(--va-surface); margin: 0 auto; position: relative; width: 100%; }\n/* Every layer fills the plate, so the baseline and the candidate are always at\n one magnification. A wipe between two scales is not a comparison — it reads as\n a change everywhere the seam happens to fall. height: auto, because a deferred\n raster carries its own dimensions as attributes and a width alone would keep\n the declared height, squashing every candidate to the aspect ratio of nothing. */\n.va-plate img { display: block; height: auto; image-rendering: pixelated; width: 100%; }\n/* The baseline sits under the candidate at the corner rather than inset: 0 —\n stretched between top and bottom it would be drawn at the candidate's height\n whenever the two differ, which is often the change itself. */\n.va-plate .va-under { left: 0; position: absolute; top: 0; }\n/* Both layers leave the flow the moment the two captures are different shapes:\n the plate's height then comes from the union it declares, not from whichever\n image happens to be in flow — which would crop the taller one. */\n.va-plate.va-boxed img { left: 0; position: absolute; top: 0; }\n.va-measure { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }\n.va-measure .va-resized { color: var(--va-accent); }\n.va-showing { color: var(--va-ink-2); font-family: var(--va-mono); font-size: 0.72rem; margin: 0; }\n\n/* The seam is the control, not a slider parked somewhere else on the page: it\n spans the plate, so the thumb sits over the boundary it moves, and it is a\n real range input, so it answers to the arrow keys as well as to a drag. */\n.va-seam { -webkit-appearance: none; appearance: none; background: none; border: 0; border-radius: 0; display: block; height: 22px; margin-bottom: -22px; padding: 0; position: sticky; top: 0; width: 100%; z-index: 3; }\n.va-seam::-webkit-slider-thumb { -webkit-appearance: none; background: var(--va-accent); border-radius: 2px; height: 22px; width: 4px; }\n.va-seam::-moz-range-thumb { background: var(--va-accent); border: 0; border-radius: 2px; height: 22px; width: 4px; }\n.va-seam-line { background: var(--va-accent); bottom: 0; pointer-events: none; position: absolute; top: 0; width: 1px; }\n.va-blend { accent-color: var(--va-accent); display: block; margin-top: 0.6rem; width: 100%; }\n\n.va-side-by-side { display: flex; gap: 1rem; }\n.va-side-by-side figure { margin: 0; min-width: 0; }\n.va-side-by-side figcaption { color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.68rem; letter-spacing: 0.09em; margin-bottom: 0.3rem; text-transform: uppercase; }\n.va-side-by-side img { border: 1px solid var(--va-line); border-radius: 10px; height: auto; image-rendering: pixelated; max-width: 100%; }\n.va-pixels { color: var(--va-ink-3); font-size: 0.82rem; margin-top: 0.5rem; }\n\n.va-regions { inset: 0; pointer-events: none; position: absolute; }\n.va-region { pointer-events: auto; position: absolute; }\n.va-region.va-cause { outline: 2px solid var(--va-cause); }\n.va-region.va-collateral { outline: 1px dashed var(--va-collateral); }\n/* Lit from either side: the rectangle and its row are the same finding, and a\n reviewer joining them by counting down a table is doing the work twice. */\n.va-region.va-lit { background: var(--va-accent-soft); outline-width: 3px; }\n.va-region-label { background: var(--va-cause); border-radius: 3px; color: var(--va-accent-ink); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; left: 0; padding: 0 0.25rem; position: absolute; top: -1.15rem; white-space: nowrap; }\n.va-region.va-collateral .va-region-label { background: var(--va-collateral); color: var(--va-bg); }\n\n/* The column a rectangle cannot draw. A box says *here*; only the table says\n which file to open, which is what lets a reviewer hand the change on rather\n than decide it themselves. */\n.va-region-table { border-collapse: collapse; font-size: 0.82rem; margin-top: 0.75rem; width: 100%; }\n.va-region-table th { border-bottom: 1px solid var(--va-line-firm); color: var(--va-ink-3); font-family: var(--va-mono); font-size: 0.65rem; font-weight: 600; letter-spacing: 0.09em; padding: 0.3rem 0.5rem; text-align: left; text-transform: uppercase; }\n.va-region-table td { border-bottom: 1px solid var(--va-line); padding: 0.3rem 0.5rem; vertical-align: top; }\n.va-region-table tr.va-lit td { background: var(--va-accent-soft); }\n.va-region-table .va-num-col { text-align: right; }\n.va-region-jump { align-items: baseline; background: none; border: 0; border-radius: 0; display: flex; gap: 0.4rem; padding: 0; text-align: left; }\n.va-region-where { color: var(--va-ink-3); font-size: 0.75rem; }\n.va-dot.va-cause { background: var(--va-cause); }\n.va-dot.va-collateral { background: var(--va-collateral); }\n`;\n"]}