0.68.0: an act can say it copies a value
`c3e145e0`. Seven of MNW's 67 `window.<name>` globals are a clipboard copy,
across 14 sites: copyElementText (4), copyEmbedBtn (4), copyText (2 files),
copyFeedUrl, copyItemLink, copyKeyCode, onCopyItemId.
The brief said "every quasi Action addresses a route. This one addresses
nothing", and `Destination::Local` has existed for that since 2026-08-19. That
premise was wrong and the answer survived it: `Local`'s own rule is what forces
the shape. What happens locally is named by the member carrying the action,
never by the variant, so a bare act with a local destination says only "the
renderer's own affordance happens". Without a member saying what, a described
copy button is `data-action="copyThing"` in a new hat, which is the thing
`Local` was written to refuse.
`Act::copies: Option<String>`, and `Act::copying(value)` sets the destination
local in the same call: a copy asking no route is one sentence, not two facts a
caller can get out of step.
The value and not its source. All 14 sites copy something the server already
rendered and six of the seven scrape it back off the DOM at press time, so
naming a source element would make two elements point at each other by id for a
string the description already holds. `Field::suggests` declined that. The cost,
stated in the member's docs: a value the reader has since edited cannot be
copied this way, and no measured site is one.
The acknowledgement is not here. All seven relabel themselves and revert, six at
1500ms and copyFeedUrl at 2000ms; that is a temporary label, mnw-server
`033c722f`'s class, waiting on makeover-timing. Separable on purpose: a host
with no notion of a reverting label still needs to be told the act copies
something.
quasi-immediate does it inline, because egui owns a clipboard. quasi-tui hands
back `Step::Copy`, which is `Step::Open`'s shape and reason: that crate turns
keys into requests and owns no I/O, so OSC 52 is the host's exactly as opening a
URL is, and both press paths reach it. quasi-webview emits `data-copies` and
ships COPY_JS, delegated on the document like FILL_JS and for its rule, since
the value is app text and no program is built out of one.
COPY_JS prefers navigator.clipboard and falls back to the off-screen textarea:
the async API is unavailable on an insecure origin and can be refused by
permissions policy, neither worth surfacing to someone who pressed a button.
Its absence is worse than the other scripts'. Every other one degrades to less
behaviour and this one degrades to none, because no browser copies without a
script. Said in `Shell::copy_src` and in COPY_JS' docs rather than left to be
found.
Consumers forward-fixed in the same pass: MNW server, goingson and audiofiles
move to `^0.68` and each compiles.
- Co-Authored-By
- Claude Opus 5 (1M context) <noreply@anthropic.com>
23 files changed,
+415 insertions,
-52 deletions
| 3425 |
3425 |
|
|
| 3426 |
3426 |
|
[[package]]
|
| 3427 |
3427 |
|
name = "quasi"
|
| 3428 |
|
- |
version = "0.67.0"
|
|
3428 |
+ |
version = "0.68.0"
|
| 3429 |
3429 |
|
|
| 3430 |
3430 |
|
[[package]]
|
| 3431 |
3431 |
|
name = "quasi-axum"
|
| 3432 |
|
- |
version = "0.67.0"
|
|
3432 |
+ |
version = "0.68.0"
|
| 3433 |
3433 |
|
dependencies = [
|
| 3434 |
3434 |
|
"axum",
|
| 3435 |
3435 |
|
"http",
|
| 3443 |
3443 |
|
|
| 3444 |
3444 |
|
[[package]]
|
| 3445 |
3445 |
|
name = "quasi-basics"
|
| 3446 |
|
- |
version = "0.67.0"
|
|
3446 |
+ |
version = "0.68.0"
|
| 3447 |
3447 |
|
dependencies = [
|
| 3448 |
3448 |
|
"makeover-layout",
|
| 3449 |
3449 |
|
"quasi-http",
|
| 3453 |
3453 |
|
|
| 3454 |
3454 |
|
[[package]]
|
| 3455 |
3455 |
|
name = "quasi-bench"
|
| 3456 |
|
- |
version = "0.67.0"
|
|
3456 |
+ |
version = "0.68.0"
|
| 3457 |
3457 |
|
dependencies = [
|
| 3458 |
3458 |
|
"dhat",
|
| 3459 |
3459 |
|
"makeover",
|
| 3468 |
3468 |
|
|
| 3469 |
3469 |
|
[[package]]
|
| 3470 |
3470 |
|
name = "quasi-http"
|
| 3471 |
|
- |
version = "0.67.0"
|
|
3471 |
+ |
version = "0.68.0"
|
| 3472 |
3472 |
|
dependencies = [
|
| 3473 |
3473 |
|
"form_urlencoded",
|
| 3474 |
3474 |
|
"http",
|
| 3477 |
3477 |
|
|
| 3478 |
3478 |
|
[[package]]
|
| 3479 |
3479 |
|
name = "quasi-immediate"
|
| 3480 |
|
- |
version = "0.67.0"
|
|
3480 |
+ |
version = "0.68.0"
|
| 3481 |
3481 |
|
dependencies = [
|
| 3482 |
3482 |
|
"docengine",
|
| 3483 |
3483 |
|
"egui",
|
| 3488 |
3488 |
|
|
| 3489 |
3489 |
|
[[package]]
|
| 3490 |
3490 |
|
name = "quasi-notifs"
|
| 3491 |
|
- |
version = "0.67.0"
|
|
3491 |
+ |
version = "0.68.0"
|
| 3492 |
3492 |
|
dependencies = [
|
| 3493 |
3493 |
|
"quasi-router",
|
| 3494 |
3494 |
|
"synckit-config",
|
| 3496 |
3496 |
|
|
| 3497 |
3497 |
|
[[package]]
|
| 3498 |
3498 |
|
name = "quasi-router"
|
| 3499 |
|
- |
version = "0.67.0"
|
|
3499 |
+ |
version = "0.68.0"
|
| 3500 |
3500 |
|
dependencies = [
|
| 3501 |
3501 |
|
"makeover-layout",
|
| 3502 |
3502 |
|
]
|
| 3513 |
3513 |
|
|
| 3514 |
3514 |
|
[[package]]
|
| 3515 |
3515 |
|
name = "quasi-tauri"
|
| 3516 |
|
- |
version = "0.67.0"
|
|
3516 |
+ |
version = "0.68.0"
|
| 3517 |
3517 |
|
dependencies = [
|
| 3518 |
3518 |
|
"http",
|
| 3519 |
3519 |
|
"quasi-http",
|
| 3526 |
3526 |
|
|
| 3527 |
3527 |
|
[[package]]
|
| 3528 |
3528 |
|
name = "quasi-tui"
|
| 3529 |
|
- |
version = "0.67.0"
|
|
3529 |
+ |
version = "0.68.0"
|
| 3530 |
3530 |
|
dependencies = [
|
| 3531 |
3531 |
|
"docengine",
|
| 3532 |
3532 |
|
"makeover",
|
| 3539 |
3539 |
|
|
| 3540 |
3540 |
|
[[package]]
|
| 3541 |
3541 |
|
name = "quasi-webview"
|
| 3542 |
|
- |
version = "0.67.0"
|
|
3542 |
+ |
version = "0.68.0"
|
| 3543 |
3543 |
|
dependencies = [
|
| 3544 |
3544 |
|
"docengine",
|
| 3545 |
3545 |
|
"makeover-layout",
|
| 6211 |
6211 |
|
"winnow 1.0.4",
|
| 6212 |
6212 |
|
]
|
| 6213 |
6213 |
|
|
| 6214 |
|
- |
[[patch.unused]]
|
| 6215 |
|
- |
name = "quasi-type"
|
| 6216 |
|
- |
version = "0.1.0"
|
| 6217 |
|
- |
|
| 6218 |
|
- |
[[patch.unused]]
|
| 6219 |
|
- |
name = "synckit-client"
|
| 6220 |
|
- |
version = "0.9.1"
|
| 6221 |
|
- |
|
| 6222 |
6214 |
|
[[patch.unused]]
|
| 6223 |
6215 |
|
name = "kberg"
|
| 6224 |
6216 |
|
version = "0.1.0"
|
| 6234 |
6226 |
|
[[patch.unused]]
|
| 6235 |
6227 |
|
name = "tagtree"
|
| 6236 |
6228 |
|
version = "0.4.1"
|
|
6229 |
+ |
|
|
6230 |
+ |
[[patch.unused]]
|
|
6231 |
+ |
name = "quasi-type"
|
|
6232 |
+ |
version = "0.1.0"
|
|
6233 |
+ |
|
|
6234 |
+ |
[[patch.unused]]
|
|
6235 |
+ |
name = "synckit-client"
|
|
6236 |
+ |
version = "0.9.1"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-axum"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
description = "The axum host adapter for quasi-router: an HTTP request in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0" }
|
| 17 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.67.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0" }
|
|
17 |
+ |
quasi-http = { path = "../quasi-http", version = "0.68.0" }
|
| 18 |
18 |
|
axum = "0.8.8"
|
| 19 |
19 |
|
http = "1.3.1"
|
| 20 |
20 |
|
tokio = { version = "1.50.0", features = ["rt"] }
|
| 21 |
21 |
|
|
| 22 |
22 |
|
[dev-dependencies]
|
| 23 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.67.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.68.0" }
|
| 24 |
24 |
|
tokio = { version = "1.50.0", features = ["macros", "rt-multi-thread"] }
|
| 25 |
25 |
|
tower = { version = "0.5.3", features = ["util"] }
|
| 26 |
26 |
|
http-body-util = "0.1.3"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-basics"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
description = "The first-party widget set: named assemblies of primitives, shared across our apps"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0" }
|
| 17 |
17 |
|
makeover-layout = "0.35.0"
|
| 18 |
18 |
|
|
| 19 |
19 |
|
[dev-dependencies]
|
| 20 |
20 |
|
# A widget's guarantees are claims about what a renderer draws, so they are
|
| 21 |
21 |
|
# tested against a real one rather than by walking the tree the assembly just
|
| 22 |
22 |
|
# built. The webview is the renderer that recognises names today.
|
| 23 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.67.0" }
|
| 24 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.67.0" }
|
|
23 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.68.0" }
|
|
24 |
+ |
quasi-http = { path = "../quasi-http", version = "0.68.0" }
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-bench"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
description = "What a described screen costs to render, in time and in allocations"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 22 |
22 |
|
count = ["dep:dhat"]
|
| 23 |
23 |
|
|
| 24 |
24 |
|
[dependencies]
|
| 25 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0" }
|
| 26 |
|
- |
quasi-webview = { path = "../quasi-webview", version = "0.67.0" }
|
| 27 |
|
- |
quasi-tui = { path = "../quasi-tui", version = "0.67.0" }
|
|
25 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0" }
|
|
26 |
+ |
quasi-webview = { path = "../quasi-webview", version = "0.68.0" }
|
|
27 |
+ |
quasi-tui = { path = "../quasi-tui", version = "0.68.0" }
|
| 28 |
28 |
|
# `Serves` is the trait carrying `screen` and `fragment`, which is what the
|
| 29 |
29 |
|
# webview is measured through. Taken directly rather than through quasi-webview
|
| 30 |
30 |
|
# because a bench calling a trait method should name the trait it calls.
|
| 31 |
|
- |
quasi-http = { path = "../quasi-http", version = "0.67.0" }
|
|
31 |
+ |
quasi-http = { path = "../quasi-http", version = "0.68.0" }
|
| 32 |
32 |
|
makeover-layout = "0.35.0"
|
| 33 |
33 |
|
makeover-tui = { version = "0.35.0", features = ["theme"] }
|
| 34 |
34 |
|
# Only to load a bundled theme file. `makeover_tui::Theme` is `#[non_exhaustive]`,
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-http"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
description = "The http-shaped seam quasi's webview host adapters share: decoding in, a rendered description out"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 13 |
13 |
|
workspace = true
|
| 14 |
14 |
|
|
| 15 |
15 |
|
[dependencies]
|
| 16 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0" }
|
|
16 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0" }
|
| 17 |
17 |
|
http = "1.3.1"
|
| 18 |
18 |
|
form_urlencoded = "1.2.2"
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-immediate"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
edition = "2024"
|
| 5 |
5 |
|
description = "The immediate-mode renderer for quasi-router: a described screen in, an egui frame out. Immediate mode is the constraint that matters, not the library."
|
| 6 |
6 |
|
license = "MIT"
|
| 12 |
12 |
|
categories = ["gui"]
|
| 13 |
13 |
|
|
| 14 |
14 |
|
[dependencies]
|
| 15 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0" }
|
|
15 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0" }
|
| 16 |
16 |
|
# The node drawing, which is the makeover layer's and not this crate's. Every
|
| 17 |
17 |
|
# widget here that is not a container comes from it: a screen walk that painted
|
| 18 |
18 |
|
# its own meter would be the divergence the suite exists to end, one copy per
|
| 1 |
1 |
|
[package]
|
| 2 |
2 |
|
name = "quasi-notifs"
|
| 3 |
|
- |
version = "0.67.0"
|
|
3 |
+ |
version = "0.68.0"
|
| 4 |
4 |
|
description = "Declared notification kinds and the registry that holds them: what a notification says and what it is for, apart from how it reaches a person"
|
| 5 |
5 |
|
edition.workspace = true
|
| 6 |
6 |
|
rust-version.workspace = true
|
| 24 |
24 |
|
describe = ["dep:quasi-router"]
|
| 25 |
25 |
|
|
| 26 |
26 |
|
[dependencies]
|
| 27 |
|
- |
quasi-router = { path = "../quasi-router", version = "0.67.0", optional = true }
|
|
27 |
+ |
quasi-router = { path = "../quasi-router", version = "0.68.0", optional = true }
|
| 28 |
28 |
|
synckit-config = { git = "https://makenot.work/git/max/synckit.git", version = "0.2", optional = true }
|