Lake demo: page path in copyright updates across navigation morphs
The ~sx-header island now shows the current page path (faded, after the copyright) inside the copyright lake. Navigate between pages: the path text updates via server-driven lake morph while the reactive colour-cycling signal persists. Subtle visible proof of L2-3. Also fixes Island &key param serialization in component-source helper. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -15,7 +15,7 @@
|
|||||||
;; The server can update these during navigation morphs without disturbing
|
;; The server can update these during navigation morphs without disturbing
|
||||||
;; the reactive colour-cycling state. This is Level 2-3: the water (server
|
;; the reactive colour-cycling state. This is Level 2-3: the water (server
|
||||||
;; content) flows through the island, around the rocks (reactive signals).
|
;; content) flows through the island, around the rocks (reactive signals).
|
||||||
(defisland ~sx-header ()
|
(defisland ~sx-header (&key path)
|
||||||
(let ((families (list "violet" "rose" "blue" "emerald" "amber" "cyan" "red" "teal" "pink" "indigo"))
|
(let ((families (list "violet" "rose" "blue" "emerald" "amber" "cyan" "red" "teal" "pink" "indigo"))
|
||||||
(idx (signal 0))
|
(idx (signal 0))
|
||||||
(shade (signal 500))
|
(shade (signal 500))
|
||||||
@@ -45,10 +45,16 @@
|
|||||||
(reset! shade (+ 400 (* (mod (* (deref idx) 137) 5) 50))))))
|
(reset! shade (+ 400 (* (mod (* (deref idx) 137) 5) 50))))))
|
||||||
"reactive")
|
"reactive")
|
||||||
" hypermedia")
|
" hypermedia")
|
||||||
;; Lake: server can update the copyright
|
;; Lake: server morphs this on every navigation — the path updates
|
||||||
|
;; while the reactive colour above persists. Visible proof that
|
||||||
|
;; server content flows through the island without disturbing signals.
|
||||||
(lake :id "copyright"
|
(lake :id "copyright"
|
||||||
(p :style (cssx (:text (colour "stone" 400) (size "xs")))
|
(p :style (cssx (:text (colour "stone" 400) (size "xs")))
|
||||||
"© Giles Bradshaw 2026")))))
|
"© Giles Bradshaw 2026"
|
||||||
|
(when path
|
||||||
|
(span :style (str (cssx (:text (colour "stone" 300) (size "xs")))
|
||||||
|
"margin-left:0.5em;")
|
||||||
|
(str "· " path))))))))
|
||||||
|
|
||||||
;; @css grid grid-cols-3
|
;; @css grid grid-cols-3
|
||||||
|
|
||||||
@@ -115,7 +121,7 @@
|
|||||||
(trail-len (len trail)))
|
(trail-len (len trail)))
|
||||||
(<>
|
(<>
|
||||||
(div :id "sx-nav" :class "mb-6"
|
(div :id "sx-nav" :class "mb-6"
|
||||||
(~sx-header)
|
(~sx-header :path (or path "/"))
|
||||||
;; Sibling arrows for EVERY level in the trail
|
;; Sibling arrows for EVERY level in the trail
|
||||||
;; Last row (leaf) gets is-leaf for larger current page title
|
;; Last row (leaf) gets is-leaf for larger current page title
|
||||||
(map-indexed (fn (i crumb)
|
(map-indexed (fn (i crumb)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ def _component_source(name: str) -> str:
|
|||||||
|
|
||||||
comp = get_component_env().get(name)
|
comp = get_component_env().get(name)
|
||||||
if isinstance(comp, Island):
|
if isinstance(comp, Island):
|
||||||
param_strs = list(comp.params)
|
param_strs = (["&key"] + list(comp.params)) if comp.params else []
|
||||||
if comp.has_children:
|
if comp.has_children:
|
||||||
param_strs.extend(["&rest", "children"])
|
param_strs.extend(["&rest", "children"])
|
||||||
params_sx = "(" + " ".join(param_strs) + ")"
|
params_sx = "(" + " ".join(param_strs) + ")"
|
||||||
|
|||||||
Reference in New Issue
Block a user