Unify scoped effects: scope as general primitive, provide as sugar
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 12m54s
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 12m54s
- Add `scope` special form to eval.sx: (scope name body...) or (scope name :value v body...) — general dynamic scope primitive - `provide` becomes sugar: (provide name value body...) calls scope - Rename provide-push!/provide-pop! to scope-push!/scope-pop! throughout all adapters (async, dom, html, sx) and platform implementations - Update boundary.sx: Tier 5 now "Scoped effects" with scope-push!/ scope-pop! as primary, provide-push!/provide-pop! as aliases - Add scope form handling to async adapter and aser wire format - Update sx-browser.js, sx_ref.py (bootstrapped output) - Add scopes.sx docs page, update provide/spreads/demo docs - Update nav-data, page-functions, docs page definitions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -89,8 +89,9 @@
|
||||
(p :class "text-stone-500 text-sm italic mb-8"
|
||||
"A spread is a value that, when returned as a child of an element, "
|
||||
"injects attributes onto its parent instead of rendering as content. "
|
||||
"Internally, spreads work through " (code "provide") "/" (code "emit!") " — "
|
||||
"every element creates a provider scope, and spread children emit into it.")
|
||||
"Internally, spreads work through "
|
||||
(a :href "/sx/(geography.(scopes))" :class "text-violet-600 hover:underline" "scopes")
|
||||
" — every element creates a scope, and spread children emit into it.")
|
||||
|
||||
;; =====================================================================
|
||||
;; I. How it works
|
||||
@@ -125,9 +126,9 @@
|
||||
;; =====================================================================
|
||||
|
||||
(~docs/section :title "collect! — the other upward channel" :id "collect"
|
||||
(p "Spreads use " (code "provide") "/" (code "emit!") " (scoped, no dedup). "
|
||||
(code "collect!") "/" (code "collected") " is a separate upward channel — "
|
||||
"global, with automatic deduplication. Used for CSS rule accumulation.")
|
||||
(p "Spreads use " (code "scope") "/" (code "emit!") " (scoped, no dedup). "
|
||||
(code "collect!") "/" (code "collected") " is also backed by scopes — "
|
||||
"a lazy root scope with automatic deduplication. Used for CSS rule accumulation.")
|
||||
(~docs/code :code (highlight ";; Deep inside a component tree:\n(collect! \"cssx\" \".sx-bg-red-500{background:red}\")\n\n;; At the flush point (once, in the layout):\n(let ((rules (collected \"cssx\")))\n (clear-collected! \"cssx\")\n (raw! (str \"<style>\" (join \"\" rules) \"</style>\")))" "lisp"))
|
||||
(p "Both are upward communication through the render tree, but with different "
|
||||
"semantics — " (code "emit!") " is scoped to the nearest provider, "
|
||||
|
||||
Reference in New Issue
Block a user