diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 0d0b561..f703437 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,6 +18,17 @@ jobs:
- name: Derive version
id: version
run: echo "value=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT"
+ # The homepage draws the panel footer, version string included, and it
+ # sat on 1.8.0 through two releases because nothing checked. Fail here
+ # rather than publish a site that misreports what is current.
+ - name: Homepage states this version
+ run: |
+ want="${GITHUB_REF_NAME#v}"
+ if ! grep -q "Perch $want — up to date" docs/index.html; then
+ echo "docs/index.html does not mention $want:" >&2
+ grep -o 'Perch [0-9][^<]*— up to date' docs/index.html | sort -u >&2
+ exit 1
+ fi
# Imported before the build so Scripts/build-app.sh finds the identity
# in the keychain and signs with it instead of falling back to ad-hoc.
# A stable identity is what stops macOS dropping the Accessibility grant
diff --git a/docs/index.html b/docs/index.html
index 0052d74..1490057 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -4,7 +4,7 @@
Perch — a dozen Mac utilities in one place
-
+
@@ -230,7 +230,7 @@
.live-tabs { display: flex; gap: 2px; padding: 9px 9px 4px; }
.live-tab {
flex: 1; text-align: center; padding: 5px 0; border-radius: 7px;
- font-size: 10.5px; font-weight: 600; color: var(--muted);
+ font-size: 9.5px; font-weight: 600; color: var(--muted);
transition: background .3s ease, color .3s ease;
}
.live-tab.on { background: var(--mtint); color: #fff; }
@@ -278,6 +278,27 @@
font-size: 10.5px; color: var(--muted); width: 54px;
text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap;
}
+ /* Value rows (GPU, disk), interface columns (network) and the audible list
+ (sound). Only CPU and memory rank things with bars, so only they get one. */
+ .live-row .val {
+ font-size: 10.5px; color: var(--muted); margin-left: auto;
+ font-variant-numeric: tabular-nums; white-space: nowrap;
+ }
+ .live-row .val.good { color: var(--free-fg); }
+ .live-row .col {
+ font-size: 9.5px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
+ color: var(--muted); width: 54px; text-align: right;
+ font-variant-numeric: tabular-nums; flex: none;
+ }
+ .live-row .col.up { color: var(--faint); }
+ .live-row .dot { color: var(--mtint); font-size: 9px; flex: none; }
+ .live-colhead { justify-content: flex-end; font-size: 8.5px; color: var(--faint); }
+ .live-colhead span { width: 54px; text-align: right; }
+ /* Volume is a setting, not a measurement, so the Sound tab has no trace —
+ the same reason the app leaves the graph off that tab. */
+ .live.no-spark .live-spark { display: none; }
+ .live.no-spark .live-gauge { padding-bottom: 11px; }
+ .live-tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
@media (max-width: 900px) { .live { width: 100%; max-width: 320px; } }
@@ -364,6 +385,38 @@
position: absolute; top: 50%; width: 11px; height: 11px; border-radius: 50%;
background: #fff; box-shadow: 0 1px 3px rgba(0,0,0,.35); transform: translate(-50%,-50%);
}
+ /* The brightness slider is the one control on the page that acts on the page.
+ Widened hit area: a 3px track is honest to the app but hopeless to grab. */
+ #brightSlider { cursor: grab; touch-action: none; }
+ #brightSlider::before { content: ''; position: absolute; inset: -9px 0; }
+ #brightSlider.drag { cursor: grabbing; }
+ #brightSlider:focus-visible { outline: 2px solid var(--accent); outline-offset: 6px; border-radius: 2px; }
+
+ /* Perch dims a non-built-in display with a black overlay window pinned above
+ everything, click-through, never past 0.85 so the slider stays findable
+ (Brightness.swift). This is the same trick, scoped to the page. */
+ #dimmer {
+ position: fixed; inset: 0; z-index: 9999; pointer-events: none;
+ background: #000; opacity: 0;
+ }
+ /* Night Mode shifts the gamma ramps warm. Multiply against an amber pane is
+ the closest a web page gets: it pulls the blues down instead of laying a
+ haze over everything, which is what a plain translucent overlay does. */
+ #warmer, #warmLift {
+ position: fixed; inset: 0; pointer-events: none; opacity: 0;
+ transition: opacity .45s ease;
+ }
+ /* Multiply pulls the blues out of everything light. On its own that is all a
+ warm overlay can do — against a near-black background it multiplies to
+ near-black, so a dark page would not shift at all. */
+ #warmer { z-index: 9998; background: #ff9526; mix-blend-mode: multiply; }
+ /* So the shadows get the other half of a gamma shift: screen lifts red and
+ green where there is nothing to take blue away from. Together the two read
+ as one warm ramp in either theme. */
+ #warmLift { z-index: 9997; background: #2b1600; mix-blend-mode: screen; }
+ @media (prefers-reduced-motion: reduce) {
+ #warmer, #warmLift { transition: none; }
+ }
/* ---------- layout tiles ----------
The app draws a 26pt tile glyph for each window action, then a divider and
@@ -567,6 +620,10 @@
+
+
+
+