Skip to main content

max / goingson

Take quasi 0.65, where a toast lives 3000ms Forward fix for quasi `e97b09a`, under Max's ruling on `eea7ba88`. The webview renderer reads `--timing-dismiss` off `timing.css` rather than carrying four seconds of its own, so a toast here goes from 4000ms to the 3000ms `makeover_timing::Intent::Dismiss` names. This app writes its copy of CLOCK_JS into the frontend tree, so the script moves with the commit.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-27 02:05 UTC
Signed with PGP, not checked
Commit: fad9d4ebf21d0a48dda0ec7d3edf9dc567a8669a
Parent: eff3b09
3 files changed, +75 insertions, -44 deletions
M Cargo.lock +33 -32
@@ -1387,7 +1387,7 @@
1387 1387 "libc",
1388 1388 "option-ext",
1389 1389 "redox_users",
1390 - "windows-sys 0.61.2",
1390 + "windows-sys 0.60.2",
1391 1391 ]
1392 1392
1393 1393 [[package]]
@@ -1628,7 +1628,7 @@
1628 1628 checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
1629 1629 dependencies = [
1630 1630 "libc",
1631 - "windows-sys 0.61.2",
1631 + "windows-sys 0.60.2",
1632 1632 ]
1633 1633
1634 1634 [[package]]
@@ -3444,9 +3444,9 @@
3444 3444
3445 3445 [[package]]
3446 3446 name = "makeover-build"
3447 - version = "0.53.0"
3447 + version = "0.54.0"
3448 3448 source = "registry+https://github.com/rust-lang/crates.io-index"
3449 - checksum = "82a170c530883774fc44d41e8e785260ee1b44cc26d9bfaa4d77154176af794c"
3449 + checksum = "020c6b00d4d0defcdbc1d5a3f879a02c3960566f259ae0801b0cbb807de40441"
3450 3450 dependencies = [
3451 3451 "makeover",
3452 3452 "makeover-geometry",
@@ -3477,9 +3477,9 @@
3477 3477
3478 3478 [[package]]
3479 3479 name = "makeover-touch"
3480 - version = "0.24.0"
3480 + version = "0.25.0"
3481 3481 source = "registry+https://github.com/rust-lang/crates.io-index"
3482 - checksum = "75c49f37baa4360fc06e87834a39978b8adc70c256430864a8b234fcf2abfa45"
3482 + checksum = "c479d37b37002c0f5d3bb8ec7ac1c99bf85eaa6ff2eae06590ab53182893114c"
3483 3483 dependencies = [
3484 3484 "makeover-geometry",
3485 3485 "makeover-layout",
@@ -3487,20 +3487,21 @@
3487 3487
3488 3488 [[package]]
3489 3489 name = "makeover-tui"
3490 - version = "0.33.0"
3490 + version = "0.35.0"
3491 3491 source = "registry+https://github.com/rust-lang/crates.io-index"
3492 - checksum = "5196506074bbf9f2b9955ff9e94892e2eca85d9dac5af49ed93da30d50d6c622"
3492 + checksum = "5414d705d290c20740119b634d246ee88012860fcc8a2cf20c5db584a92a7932"
3493 3493 dependencies = [
3494 3494 "makeover",
3495 3495 "makeover-layout",
3496 + "makeover-timing",
3496 3497 "ratatui",
3497 3498 ]
3498 3499
3499 3500 [[package]]
3500 3501 name = "makeover-webview"
3501 - version = "0.60.0"
3502 + version = "0.61.0"
3502 3503 source = "registry+https://github.com/rust-lang/crates.io-index"
3503 - checksum = "203b3a259e249ed32ffd9d48d75a6c12e4aa173095607cc2c852f2c1f3fe9c0e"
3504 + checksum = "6399dc739e0d326e3577bc80643c1a9ab2afcc005ec240a7c9765e060f359f34"
3504 3505 dependencies = [
3505 3506 "makeover-geometry",
3506 3507 "makeover-layout",
@@ -3649,7 +3650,7 @@
3649 3650 "png 0.18.1",
3650 3651 "serde",
3651 3652 "thiserror 2.0.20",
3652 - "windows-sys 0.61.2",
3653 + "windows-sys 0.60.2",
3653 3654 ]
3654 3655
3655 3656 [[package]]
@@ -3782,7 +3783,7 @@
3782 3783 source = "registry+https://github.com/rust-lang/crates.io-index"
3783 3784 checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
3784 3785 dependencies = [
3785 - "windows-sys 0.61.2",
3786 + "windows-sys 0.60.2",
3786 3787 ]
3787 3788
3788 3789 [[package]]
@@ -4716,7 +4717,7 @@
4716 4717
4717 4718 [[package]]
4718 4719 name = "quasi-http"
4719 - version = "0.64.0"
4720 + version = "0.65.0"
4720 4721 dependencies = [
4721 4722 "form_urlencoded",
4722 4723 "http",
@@ -4725,7 +4726,7 @@
4725 4726
4726 4727 [[package]]
4727 4728 name = "quasi-notifs"
4728 - version = "0.64.0"
4729 + version = "0.65.0"
4729 4730 dependencies = [
4730 4731 "quasi-router",
4731 4732 "synckit-config",
@@ -4733,14 +4734,14 @@
4733 4734
4734 4735 [[package]]
4735 4736 name = "quasi-router"
4736 - version = "0.64.0"
4737 + version = "0.65.0"
4737 4738 dependencies = [
4738 4739 "makeover-layout",
4739 4740 ]
4740 4741
4741 4742 [[package]]
4742 4743 name = "quasi-tauri"
4743 - version = "0.64.0"
4744 + version = "0.65.0"
4744 4745 dependencies = [
4745 4746 "http",
4746 4747 "quasi-http",
@@ -4766,7 +4767,7 @@
4766 4767
4767 4768 [[package]]
4768 4769 name = "quasi-webview"
4769 - version = "0.64.0"
4770 + version = "0.65.0"
4770 4771 dependencies = [
4771 4772 "docengine",
4772 4773 "makeover-layout",
@@ -5205,7 +5206,7 @@
5205 5206 "errno",
5206 5207 "libc",
5207 5208 "linux-raw-sys",
5208 - "windows-sys 0.61.2",
5209 + "windows-sys 0.60.2",
5209 5210 ]
5210 5211
5211 5212 [[package]]
@@ -5262,7 +5263,7 @@
5262 5263 "security-framework",
5263 5264 "security-framework-sys",
5264 5265 "webpki-root-certs",
5265 - "windows-sys 0.61.2",
5266 + "windows-sys 0.60.2",
5266 5267 ]
5267 5268
5268 5269 [[package]]
@@ -5802,7 +5803,7 @@
5802 5803 checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4"
5803 5804 dependencies = [
5804 5805 "libc",
5805 - "windows-sys 0.61.2",
5806 + "windows-sys 0.60.2",
5806 5807 ]
5807 5808
5808 5809 [[package]]
@@ -6577,7 +6578,7 @@
6577 6578 "getrandom 0.4.3",
6578 6579 "once_cell",
6579 6580 "rustix",
6580 - "windows-sys 0.61.2",
6581 + "windows-sys 0.60.2",
6581 6582 ]
6582 6583
6583 6584 [[package]]
@@ -6599,7 +6600,7 @@
6599 6600 "parking_lot",
6600 6601 "rustix",
6601 6602 "signal-hook",
6602 - "windows-sys 0.61.2",
6603 + "windows-sys 0.60.2",
6603 6604 ]
6604 6605
6605 6606 [[package]]
@@ -7081,7 +7082,7 @@
7081 7082 "png 0.18.1",
7082 7083 "serde",
7083 7084 "thiserror 2.0.20",
7084 - "windows-sys 0.61.2",
7085 + "windows-sys 0.60.2",
7085 7086 ]
7086 7087
7087 7088 [[package]]
@@ -7116,7 +7117,7 @@
7116 7117 dependencies = [
7117 7118 "memoffset",
7118 7119 "tempfile",
7119 - "windows-sys 0.61.2",
7120 + "windows-sys 0.60.2",
7120 7121 ]
7121 7122
7122 7123 [[package]]
@@ -7646,7 +7647,7 @@
7646 7647 source = "registry+https://github.com/rust-lang/crates.io-index"
7647 7648 checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
7648 7649 dependencies = [
7649 - "windows-sys 0.61.2",
7650 + "windows-sys 0.60.2",
7650 7651 ]
7651 7652
7652 7653 [[package]]
@@ -8503,22 +8504,22 @@
8503 8504 "winnow 1.0.4",
8504 8505 ]
8505 8506
8506 - [[patch.unused]]
8507 - name = "ops-status"
8508 - version = "0.1.0"
8509 -
8510 8507 [[patch.unused]]
8511 8508 name = "quasi-axum"
8512 - version = "0.64.0"
8509 + version = "0.65.0"
8513 8510
8514 8511 [[patch.unused]]
8515 8512 name = "quasi-basics"
8516 - version = "0.64.0"
8513 + version = "0.65.0"
8517 8514
8518 8515 [[patch.unused]]
8519 8516 name = "quasi-immediate"
8520 - version = "0.64.0"
8517 + version = "0.65.0"
8521 8518
8522 8519 [[patch.unused]]
8523 8520 name = "quasi-store"
8524 8521 version = "0.1.0"
8522 +
8523 + [[patch.unused]]
8524 + name = "ops-status"
8525 + version = "0.1.0"
@@ -36,7 +36,7 @@
36 36 makeover-geometry = "0.7"
37 37 # Only to write its selection and clock scripts into the frontend. Those two are
38 38 # the whole of `frontend/js/` since the swap.
39 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
39 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.65" }
40 40
41 41 [dependencies]
42 42 goingson-core = { workspace = true }
@@ -54,10 +54,10 @@
54 54 # dependency's source even with the feature off -- so a public clone could not
55 55 # build at all against a URL it could not reach. quasi went public that day and
56 56 # the URL moved here with it.
57 - quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
58 - quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
59 - quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
60 - quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.64" }
57 + quasi-router = { git = "https://makenot.work/git/max/quasi.git", version = "0.65" }
58 + quasi-http = { git = "https://makenot.work/git/max/quasi.git", version = "0.65" }
59 + quasi-webview = { git = "https://makenot.work/git/max/quasi.git", version = "0.65" }
60 + quasi-tauri = { git = "https://makenot.work/git/max/quasi.git", version = "0.65" }
61 61
62 62 # The notification declaration, and it is NOT behind the `quasi` feature: the
63 63 # watcher is desktop app behaviour rather than a described screen, and the
@@ -74,7 +74,7 @@
74 74 # before it has ported its screens cannot take it. `notifications::Notifier` is
75 75 # the eight lines meanwhile, and it goes when the flip makes quasi-router
76 76 # unconditional here.
77 - quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.64", features = ["synckit", "describe"] }
77 + quasi-notifs = { git = "https://makenot.work/git/max/quasi.git", version = "0.65", features = ["synckit", "describe"] }
78 78
79 79 # Tauri
80 80 tauri = { workspace = true, features = ["image-png", "devtools"] }
@@ -39,11 +39,38 @@
39 39 // rewritten twice.
40 40 const RATES = { since: 1000, until: 1000, age: 30000 };
41 41
42 - // How long a toast stays before it is taken off the page. The terminal and
43 - // egui renderers hold the same number as `LINGER`, and a screen described
44 - // once and drawn three times should not keep its messages for three
45 - // different lengths of time.
46 - const LINGER = 4000;
42 + // How long a toast stays before it is taken off the page.
43 + //
44 + // `eea7ba88`. Read rather than written: `makeover-timing` names the
45 + // duration `Intent::Dismiss`, and `makeover-build` writes it into every
46 + // consumer's `timing.css` as `--timing-dismiss`. The terminal and egui
47 + // renderers take the same number out of the same crate, so a screen
48 + // described once and drawn three times keeps its messages for one length of
49 + // time and moving that length is moving one constant.
50 + //
51 + // The fallback is for a page that ships this script without that
52 + // stylesheet. It is the crate's own value and a Rust test pins it there, the
53 + // same arrangement the two format implementations above already run on: a
54 + // number in two languages is fine so long as something fails when they part.
55 + const LINGER_FALLBACK = 3000;
56 +
57 + // A CSS time as a number of milliseconds. `3000ms` and `3s` are both legal
58 + // spellings of the same duration and a stylesheet may carry either, so the
59 + // unit is read rather than assumed. An absent or unparseable value is a page
60 + // with no timing sheet, not a page asking for zero.
61 + const milliseconds = (token, fallback) => {
62 + const raw = getComputedStyle(document.documentElement)
63 + .getPropertyValue(token)
64 + .trim();
65 + const parsed = Number.parseFloat(raw);
66 + if (!Number.isFinite(parsed)) return fallback;
67 + return raw.endsWith("ms") ? parsed : parsed * 1000;
68 + };
69 +
70 + // Read once, on the first settle rather than at parse time: this script may
71 + // run before the stylesheet it is asking about has been applied, and a
72 + // custom property that is not there yet reads as the empty string.
73 + let lingerMs = null;
47 74
48 75 /** A span in seconds as a stopwatch: `h:mm:ss`, hours unbounded. */
49 76 const face = (seconds) => {
@@ -103,10 +130,13 @@
103 130 // The mark is what keeps a settle from starting a second timer on a toast
104 131 // that is already counting.
105 132 const linger = () => {
133 + if (lingerMs === null) {
134 + lingerMs = milliseconds("--timing-dismiss", LINGER_FALLBACK);
135 + }
106 136 const fresh = '[data-notice="toast"]:not([data-lingering])';
107 137 for (const toast of document.querySelectorAll(fresh)) {
108 138 toast.setAttribute("data-lingering", "");
109 - setTimeout(() => toast.remove(), LINGER);
139 + setTimeout(() => toast.remove(), lingerMs);
110 140 }
111 141 };
112 142