fix(build): require href on slhx navigation

Treat static data-slhx-nav anchors without href as build errors so page-swap links preserve progressive navigation when JavaScript is unavailable.

req: page_swap/001

req: diagnostics/002
This commit is contained in:
slhx agent
2026-06-01 21:18:25 +02:00
parent efd4e2f369
commit b6aaccf113
2 changed files with 8 additions and 2 deletions
+1 -1
View File
@@ -121,7 +121,7 @@ slhx competes with React by making frontend frameworks unnecessary for most apps
## page_swap
### req: page_swap/001
001 Minimal page swapping is a first-class slhx-axum happy path. Authors mark real anchors with `data-slhx-nav`; links keep valid `href` and work without JS.
001 Minimal page swapping is a first-class slhx-axum happy path. Authors mark real anchors with `data-slhx-nav`; links keep valid `href` and work without JS. Missing `href` on a static `data-slhx-nav` anchor is a build error.
### req: page_swap/002
002 A `data-slhx-nav` click fetches the target URL as a slhx partial request. The response updates the canonical content slot, optionally navigation and title, then applies a `Navigate` effect.
+7 -1
View File
@@ -1067,7 +1067,7 @@ fn reject_invalid_slhx_attr_values(path: &Path, attrs: &[SurfaceAttribute]) -> i
}
fn reject_invalid_slhx_attr_placement(path: &Path, tag: &str, attrs: &[SurfaceAttribute]) -> io::Result<()> {
if has_attr(attrs, "data-slhx-nav") && tag != "a" {
if has_attr(attrs, "data-slhx-nav") && (tag != "a" || !has_attr(attrs, "href")) {
return Err(invalid_slhx_placement(
path,
"data-slhx-nav",
@@ -1652,6 +1652,12 @@ fn main() {{
"data-slhx-nav",
"<a href=...>",
),
(
"nav-missing-href",
r#"<a data-slhx-nav="">Docs</a>"#,
"data-slhx-nav",
"<a href=...>",
),
(
"sse-child",
r#"<section data-slhx-root="feed"><div data-slhx-sse="/events"></div></section>"#,