@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.
- package/CHANGELOG.md +100 -0
- package/LICENSE +21 -0
- package/README.md +506 -0
- package/dist/__fixtures__/review.d.ts +47 -0
- package/dist/__fixtures__/review.js +145 -0
- package/dist/__fixtures__/review.js.map +1 -0
- package/dist/bindings.d.ts +134 -0
- package/dist/bindings.js +88 -0
- package/dist/bindings.js.map +1 -0
- package/dist/changelog.d.ts +132 -0
- package/dist/changelog.js +129 -0
- package/dist/changelog.js.map +1 -0
- package/dist/history-queries.d.ts +82 -0
- package/dist/history-queries.js +200 -0
- package/dist/history-queries.js.map +1 -0
- package/dist/history-rows.d.ts +42 -0
- package/dist/history-rows.js +148 -0
- package/dist/history-rows.js.map +1 -0
- package/dist/history.d.ts +40 -0
- package/dist/history.js +186 -0
- package/dist/history.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/migration-steps.d.ts +32 -0
- package/dist/migration-steps.js +303 -0
- package/dist/migration-steps.js.map +1 -0
- package/dist/migrations.d.ts +58 -0
- package/dist/migrations.js +283 -0
- package/dist/migrations.js.map +1 -0
- package/dist/next.d.ts +94 -0
- package/dist/next.js +44 -0
- package/dist/next.js.map +1 -0
- package/dist/node/bin.d.ts +120 -0
- package/dist/node/bin.js +337 -0
- package/dist/node/bin.js.map +1 -0
- package/dist/node/bucket.d.ts +58 -0
- package/dist/node/bucket.js +142 -0
- package/dist/node/bucket.js.map +1 -0
- package/dist/node/database.d.ts +33 -0
- package/dist/node/database.js +157 -0
- package/dist/node/database.js.map +1 -0
- package/dist/node/index.d.ts +43 -0
- package/dist/node/index.js +43 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/serve.d.ts +81 -0
- package/dist/node/serve.js +193 -0
- package/dist/node/serve.js.map +1 -0
- package/dist/node/ui-assets.d.ts +47 -0
- package/dist/node/ui-assets.js +60 -0
- package/dist/node/ui-assets.js.map +1 -0
- package/dist/review-ingest.d.ts +24 -0
- package/dist/review-ingest.js +184 -0
- package/dist/review-ingest.js.map +1 -0
- package/dist/review-read.d.ts +87 -0
- package/dist/review-read.js +361 -0
- package/dist/review-read.js.map +1 -0
- package/dist/review-rows.d.ts +30 -0
- package/dist/review-rows.js +67 -0
- package/dist/review-rows.js.map +1 -0
- package/dist/review-types.d.ts +414 -0
- package/dist/review-types.js +2 -0
- package/dist/review-types.js.map +1 -0
- package/dist/review-write.d.ts +35 -0
- package/dist/review-write.js +86 -0
- package/dist/review-write.js.map +1 -0
- package/dist/review.d.ts +53 -0
- package/dist/review.fixtures.d.ts +47 -0
- package/dist/review.fixtures.js +145 -0
- package/dist/review.fixtures.js.map +1 -0
- package/dist/review.js +245 -0
- package/dist/review.js.map +1 -0
- package/dist/schema.d.ts +36 -0
- package/dist/schema.js +39 -0
- package/dist/schema.js.map +1 -0
- package/dist/store.d.ts +58 -0
- package/dist/store.js +278 -0
- package/dist/store.js.map +1 -0
- package/dist/testing.d.ts +38 -0
- package/dist/testing.js +92 -0
- package/dist/testing.js.map +1 -0
- package/dist/ui/__probe.d.ts +3 -0
- package/dist/ui/__probe.js +5 -0
- package/dist/ui/__probe.js.map +1 -0
- package/dist/ui/attribution.d.ts +46 -0
- package/dist/ui/attribution.js +79 -0
- package/dist/ui/attribution.js.map +1 -0
- package/dist/ui/because.d.ts +51 -0
- package/dist/ui/because.js +52 -0
- package/dist/ui/because.js.map +1 -0
- package/dist/ui/browser-entry.d.ts +2 -0
- package/dist/ui/browser-entry.js +34 -0
- package/dist/ui/browser-entry.js.map +1 -0
- package/dist/ui/builds.d.ts +43 -0
- package/dist/ui/builds.js +79 -0
- package/dist/ui/builds.js.map +1 -0
- package/dist/ui/carried.d.ts +73 -0
- package/dist/ui/carried.js +63 -0
- package/dist/ui/carried.js.map +1 -0
- package/dist/ui/cause.d.ts +73 -0
- package/dist/ui/cause.js +133 -0
- package/dist/ui/cause.js.map +1 -0
- package/dist/ui/change-story.d.ts +153 -0
- package/dist/ui/change-story.js +253 -0
- package/dist/ui/change-story.js.map +1 -0
- package/dist/ui/change.d.ts +51 -0
- package/dist/ui/change.js +125 -0
- package/dist/ui/change.js.map +1 -0
- package/dist/ui/client.d.ts +74 -0
- package/dist/ui/client.js +88 -0
- package/dist/ui/client.js.map +1 -0
- package/dist/ui/consumers.d.ts +80 -0
- package/dist/ui/consumers.js +125 -0
- package/dist/ui/consumers.js.map +1 -0
- package/dist/ui/control.d.ts +63 -0
- package/dist/ui/control.js +39 -0
- package/dist/ui/control.js.map +1 -0
- package/dist/ui/crossing.d.ts +55 -0
- package/dist/ui/crossing.js +74 -0
- package/dist/ui/crossing.js.map +1 -0
- package/dist/ui/declarations.d.ts +36 -0
- package/dist/ui/declarations.js +73 -0
- package/dist/ui/declarations.js.map +1 -0
- package/dist/ui/distance.d.ts +154 -0
- package/dist/ui/distance.js +180 -0
- package/dist/ui/distance.js.map +1 -0
- package/dist/ui/divergence.d.ts +40 -0
- package/dist/ui/divergence.js +176 -0
- package/dist/ui/divergence.js.map +1 -0
- package/dist/ui/docket.d.ts +39 -0
- package/dist/ui/docket.js +172 -0
- package/dist/ui/docket.js.map +1 -0
- package/dist/ui/findings.d.ts +42 -0
- package/dist/ui/findings.js +110 -0
- package/dist/ui/findings.js.map +1 -0
- package/dist/ui/foreseen.d.ts +55 -0
- package/dist/ui/foreseen.js +91 -0
- package/dist/ui/foreseen.js.map +1 -0
- package/dist/ui/glance.d.ts +101 -0
- package/dist/ui/glance.js +101 -0
- package/dist/ui/glance.js.map +1 -0
- package/dist/ui/grouping.d.ts +158 -0
- package/dist/ui/grouping.js +187 -0
- package/dist/ui/grouping.js.map +1 -0
- package/dist/ui/handed.d.ts +60 -0
- package/dist/ui/handed.js +122 -0
- package/dist/ui/handed.js.map +1 -0
- package/dist/ui/history.d.ts +88 -0
- package/dist/ui/history.js +170 -0
- package/dist/ui/history.js.map +1 -0
- package/dist/ui/holding.d.ts +84 -0
- package/dist/ui/holding.js +90 -0
- package/dist/ui/holding.js.map +1 -0
- package/dist/ui/impact.d.ts +31 -0
- package/dist/ui/impact.js +132 -0
- package/dist/ui/impact.js.map +1 -0
- package/dist/ui/index.d.ts +21 -0
- package/dist/ui/index.js +21 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/lead.d.ts +35 -0
- package/dist/ui/lead.js +34 -0
- package/dist/ui/lead.js.map +1 -0
- package/dist/ui/look.d.ts +109 -0
- package/dist/ui/look.js +248 -0
- package/dist/ui/look.js.map +1 -0
- package/dist/ui/mark.d.ts +11 -0
- package/dist/ui/mark.js +13 -0
- package/dist/ui/mark.js.map +1 -0
- package/dist/ui/moved.d.ts +121 -0
- package/dist/ui/moved.js +143 -0
- package/dist/ui/moved.js.map +1 -0
- package/dist/ui/navigation.d.ts +26 -0
- package/dist/ui/navigation.js +53 -0
- package/dist/ui/navigation.js.map +1 -0
- package/dist/ui/order.d.ts +113 -0
- package/dist/ui/order.js +226 -0
- package/dist/ui/order.js.map +1 -0
- package/dist/ui/origins.d.ts +42 -0
- package/dist/ui/origins.js +149 -0
- package/dist/ui/origins.js.map +1 -0
- package/dist/ui/outcome.d.ts +93 -0
- package/dist/ui/outcome.js +162 -0
- package/dist/ui/outcome.js.map +1 -0
- package/dist/ui/parted.d.ts +68 -0
- package/dist/ui/parted.js +101 -0
- package/dist/ui/parted.js.map +1 -0
- package/dist/ui/rail.d.ts +31 -0
- package/dist/ui/rail.js +21 -0
- package/dist/ui/rail.js.map +1 -0
- package/dist/ui/reach.d.ts +66 -0
- package/dist/ui/reach.js +185 -0
- package/dist/ui/reach.js.map +1 -0
- package/dist/ui/regions.d.ts +82 -0
- package/dist/ui/regions.js +67 -0
- package/dist/ui/regions.js.map +1 -0
- package/dist/ui/review.bundle.js +69 -0
- package/dist/ui/review.d.ts +97 -0
- package/dist/ui/review.js +39 -0
- package/dist/ui/review.js.map +1 -0
- package/dist/ui/root.d.ts +72 -0
- package/dist/ui/root.js +102 -0
- package/dist/ui/root.js.map +1 -0
- package/dist/ui/route.d.ts +95 -0
- package/dist/ui/route.js +114 -0
- package/dist/ui/route.js.map +1 -0
- package/dist/ui/run.d.ts +26 -0
- package/dist/ui/run.js +12 -0
- package/dist/ui/run.js.map +1 -0
- package/dist/ui/sense.d.ts +187 -0
- package/dist/ui/sense.js +222 -0
- package/dist/ui/sense.js.map +1 -0
- package/dist/ui/settled.d.ts +43 -0
- package/dist/ui/settled.js +59 -0
- package/dist/ui/settled.js.map +1 -0
- package/dist/ui/shell.d.ts +76 -0
- package/dist/ui/shell.js +65 -0
- package/dist/ui/shell.js.map +1 -0
- package/dist/ui/shift.d.ts +52 -0
- package/dist/ui/shift.js +98 -0
- package/dist/ui/shift.js.map +1 -0
- package/dist/ui/styles-docket.d.ts +18 -0
- package/dist/ui/styles-docket.js +281 -0
- package/dist/ui/styles-docket.js.map +1 -0
- package/dist/ui/styles-stage.d.ts +18 -0
- package/dist/ui/styles-stage.js +92 -0
- package/dist/ui/styles-stage.js.map +1 -0
- package/dist/ui/styles.d.ts +12 -0
- package/dist/ui/styles.js +482 -0
- package/dist/ui/styles.js.map +1 -0
- package/dist/ui/subject.d.ts +36 -0
- package/dist/ui/subject.js +138 -0
- package/dist/ui/subject.js.map +1 -0
- package/dist/ui/text.d.ts +129 -0
- package/dist/ui/text.js +164 -0
- package/dist/ui/text.js.map +1 -0
- package/dist/ui/variations.d.ts +37 -0
- package/dist/ui/variations.js +60 -0
- package/dist/ui/variations.js.map +1 -0
- package/dist/ui/viewer.d.ts +67 -0
- package/dist/ui/viewer.js +246 -0
- package/dist/ui/viewer.js.map +1 -0
- package/dist/worker-auth.d.ts +48 -0
- package/dist/worker-auth.js +74 -0
- package/dist/worker-auth.js.map +1 -0
- package/dist/worker-entry.d.ts +58 -0
- package/dist/worker-entry.js +36 -0
- package/dist/worker-entry.js.map +1 -0
- package/dist/worker-http.d.ts +39 -0
- package/dist/worker-http.js +111 -0
- package/dist/worker-http.js.map +1 -0
- package/dist/worker-input.d.ts +81 -0
- package/dist/worker-input.js +296 -0
- package/dist/worker-input.js.map +1 -0
- package/dist/worker.d.ts +91 -0
- package/dist/worker.js +287 -0
- package/dist/worker.js.map +1 -0
- package/mark.svg +30 -0
- package/migrations/0001_initial.sql +193 -0
- package/migrations/0002_changelog.sql +30 -0
- package/migrations/0003_accessibility.sql +8 -0
- package/migrations/0004_variations.sql +19 -0
- package/migrations/0005_reach.sql +26 -0
- package/migrations/0006_baseline-size.sql +7 -0
- package/migrations/0007_declarations.sql +7 -0
- package/migrations/0008_green-because.sql +7 -0
- package/migrations/0009_moved-bands.sql +6 -0
- package/migrations/0010_composition.sql +15 -0
- package/migrations/0011_movements.sql +21 -0
- package/migrations/0012_control-size.sql +6 -0
- package/package.json +110 -0
- 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"]}
|