Level 2-3: lake morphing — server content flows through reactive islands

Lake tag (lake :id "name" children...) creates server-morphable slots
within islands. During morph, the engine enters hydrated islands and
updates data-sx-lake elements by ID while preserving surrounding
reactive DOM (signals, effects, event listeners).

Specced in .sx, bootstrapped to JS and Python:
- adapter-dom.sx: render-dom-lake, reactive-attr marks data-sx-reactive-attrs
- adapter-html.sx: render-html-lake SSR output
- adapter-sx.sx: lake serialized in wire format
- engine.sx: morph-island-children (lake-by-ID matching),
  sync-attrs skips reactive attributes
- ~sx-header uses lakes for logo and copyright
- Hegelian essay updated with lake code example

Also includes: lambda nil-padding for missing args, page env ordering fix

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 14:29:54 +00:00
parent d5e416e478
commit 9b9fc6b6a5
15 changed files with 351 additions and 63 deletions

View File

@@ -2,18 +2,7 @@
(defcomp ~sx-home-content ()
(div :id "main-content" :class "max-w-3xl mx-auto px-4 py-6"
(~doc-code :code (highlight "(defcomp ~sx-header ()
(a :href \"/\"
:sx-get \"/\" :sx-target \"#main-panel\"
:sx-select \"#main-panel\"
:sx-swap \"outerHTML\" :sx-push-url \"true\"
:class \"block max-w-3xl mx-auto px-4 pt-8 pb-4 text-center no-underline\"
(span :class \"text-4xl font-bold font-mono text-violet-700 block mb-2\"
\"(<sx>)\")
(p :class \"text-lg text-stone-500 mb-1\"
\"Framework free reactive hypermedia\")
(p :class \"text-xs text-stone-400\"
\"© Giles Bradshaw 2026\")))" "lisp"))))
(~doc-code :code (highlight (component-source "~sx-header") "lisp"))))
(defcomp ~docs-introduction-content ()
(~doc-page :title "Introduction"