Commit Graph

665 Commits

Author SHA1 Message Date
192d48d0e3 Add self-hosting bootstrapper plan: py.sx design document
Plan for py.sx — an SX-to-Python translator written in SX that
replaces bootstrap_py.py. Covers translation rules, statement vs
expression modes, mutation/cell variables, five implementation
phases, fixed-point verification, and implications for multi-host
bootstrapping.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:45:07 +00:00
c0ced8a40f Fix production blank page: SxExpr page_sx was being parsed as AST
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 7m33s
_build_component_ast parsed SxExpr values back into AST, which
_arender then evaluated as HTML instead of passing through as raw
content for the script tag. Dev mode was unaffected because the
pretty-printer converted page_sx to a plain str first.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 00:17:01 +00:00
ff41fa2238 Declare prove-data page helper in boundary.sx
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 9m58s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:20:11 +00:00
00e7ba4650 Add theorem prover docs page with Phase 2 constraint solving
Some checks failed
Build and Deploy / build-and-deploy (push) Has been cancelled
- prove.sx Phase 2: bounded model checking with 34 algebraic properties
  (commutativity, associativity, distributivity, inverses, bounds, transitivity)
- prove.sx generates SMT-LIB for unbounded Z3 verification via z3-expr
- New docs page /plans/theorem-prover with live results (91/91 sat, 34/34 verified)
- Page helper runs both proof phases and returns structured data
- Parser: re-add ' quote syntax (removed by prior edit)
- Load prove.sx alongside z3.sx at startup

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 23:17:09 +00:00
7b8ae473a5 Merge macros: z3.sx, prove.sx, parser unicode, auto reader macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 9m50s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 22:48:10 +00:00
3ca89ef765 Self-hosted z3.sx translator, prove.sx prover, parser unicode, auto reader macros
- z3.sx: SX-to-SMT-LIB translator written in SX (359 lines), replaces Python translation logic
- prove.sx: SMT-LIB satisfiability checker in SX — proves all 91 primitives sat by construction
- Parser: support unicode characters (em-dash, accented letters) in symbols
- Auto-resolve reader macros: #name finds name-translate in component env, no Python registration
- Platform primitives: type-of, symbol-name, keyword-name, sx-parse registered in primitives.py
- Cond heuristic: predicates ending in ? recognized as Clojure-style tests
- Library loading: z3.sx loaded at startup with reload callbacks for hot-reload ordering
- reader_z3.py: rewritten as thin shell delegating to z3.sx
- Split monolithic .sx files: essays (22), plans (13), reactive-islands (6) into separate files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 22:47:53 +00:00
8b1333de96 Fix unterminated list in plans.sx causing sx_docs crash
Added 9 missing closing parens — sections/subsections weren't closing
before siblings opened, accumulating unclosed depth through the file.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 21:34:09 +00:00
f9939a660c Fix unterminated list in plans.sx causing sx_docs crash
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 3m3s
Added 9 missing closing parens — sections/subsections weren't closing
before siblings opened, accumulating unclosed depth through the file.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:59:03 +00:00
8be8926155 Fix z3 demo code blocks: use (highlight ... "lisp") not :lang
Some checks failed
Build and Deploy / build-and-deploy (push) Failing after 16m21s
~doc-code only accepts :code — the :lang param was silently ignored.
All code blocks now use (highlight "..." "lang") like the rest of the site.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:39:41 +00:00
03ba8e58e5 Implement reader macros (#;, #|...|, #', #name) and #z3 demo
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 11m13s
Reader macros in parser.sx spec, Python parser.py, and hand-written sx.js:
- #; datum comment: read and discard next expression
- #|...|  raw string: no escape processing
- #' quote shorthand: (quote expr)
- #name extensible dispatch: registered handler transforms next expression

#z3 reader macro demo (reader_z3.py): translates define-primitive
declarations from primitives.sx into SMT-LIB verification conditions.
Same source, two interpretations — bootstrappers compile to executable
code, #z3 extracts proof obligations.

48 parser tests (SX spec + Python), all passing. Rebootstrapped JS+Python.
Demo page at /plans/reader-macro-demo with side-by-side examples.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:21:40 +00:00
56589a81b2 Fix lambda multi-body, reactive island demos, and add React is Hypermedia essay
Some checks failed
Build and Deploy / build-and-deploy (push) Has been cancelled
Lambda multi-body fix: sf-lambda used (nth args 1), dropping all but the first
body expression. Fixed to collect all body expressions and wrap in (begin ...).
This was foundational — every multi-expression lambda in every island silently
dropped expressions after the first.

Reactive islands: fix dom-parent marker timing (first effect run before marker
is in DOM), fix :key eager evaluation, fix error boundary scope isolation,
fix resource/suspense reactive cond tracking, fix inc not available as JS var.

New essay: "React is Hypermedia" — argues that reactive islands are hypermedia
controls whose behavior is specified in SX, not a departure from hypermedia.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 20:00:44 +00:00
06adbdcd59 Remove redundant features: ref sugar, suspense, transitions
- ref/ref-get/ref-set! functions removed (just dict wrappers — use dict
  primitives directly). The :ref attribute stays in adapter-dom.sx.
- Suspense form removed (if/when + deref on resource signals covers it)
- Transition function removed (fine-grained signals already avoid jank)
- Kept: error-boundary, resource, portal, :ref attribute

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:54:40 +00:00
7efd1b401b Add suspense, resource, and transitions — Phase 2 complete
- suspense render-dom form: shows fallback while resource loads, swaps
  to body content when resource signal resolves
- resource async signal: wraps promise into signal with loading/data/error
  dict, auto-transitions on resolve/reject via promise-then
- transition: defers signal writes to requestIdleCallback, sets pending
  signal for UI feedback during expensive operations
- Added schedule-idle, promise-then platform functions
- All Phase 2 features now marked Done in status tables

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:40:13 +00:00
a496ee6ae6 Remove reactive class/style (CSSX covers it), add error boundaries + resource
Reactive class/style (:class-map, :style-map) removed — CSSX components
already handle dynamic class/style via defcomp with full SX logic.

Added:
- error-boundary render-dom form: try/catch around children, renders
  fallback fn with (err retry) on failure, disposes partial effects
- resource async signal: wraps promise into signal with loading/data/error
  states, transitions automatically on resolve/reject
- try-catch, error-message, promise-then platform functions
- Updated Phase 2 status tables and demo page numbering

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:35:19 +00:00
6bda2bafa2 Add Phase 2 P1 features: reactive class/style, refs, portals
- :class-map dict toggles classes reactively via classList.add/remove
- :style-map dict sets inline styles reactively via el.style[prop]
- ref/ref-get/ref-set! mutable boxes (non-reactive, like useRef)
- :ref attribute sets ref.current to DOM element after rendering
- portal render-dom form renders children into remote target element
- Portal content auto-removed on island disposal via register-in-scope
- Added #portal-root div to page shell template
- Added stop-propagation and dom-focus platform functions
- Demo islands for all three features on the demo page
- Updated status tables: all P0/P1 features marked Done

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:27:55 +00:00
3103d7ff9d Add keyed list reconciliation to reactive-list
Items with :key attributes are matched by key across renders — existing
DOM nodes are reused, stale nodes removed, new nodes inserted in order.
Falls back to clear-and-rerender without keys.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:15:15 +00:00
8683cf24c3 Island disposal, reactive lists, input binding, and Phase 2 plan
- Effect and computed auto-register disposers with island scope via
  register-in-scope; dispose-islands-in called before every swap point
  (orchestration.sx) to clean up intervals/subscriptions on navigation.
- Map + deref inside islands auto-upgrades to reactive-list for signal-
  bound list rendering. Demo island with add/remove items.
- New :bind attribute for two-way signal-input binding (text, checkbox,
  radio, textarea, select). bind-input in adapter-dom.sx handles both
  signal→element (effect) and element→signal (event listener).
- Phase 2 plan page at /reactive-islands/phase2 covering input binding,
  keyed reconciliation, reactive class/style, refs, portals, error
  boundaries, suspense, and transitions.
- Updated status tables in overview and plan pages.
- Fixed stopwatch reset (fn body needs do wrapper for multiple exprs).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 16:10:52 +00:00
efc7e340da Merge branch 'worktree-philosophy' into macros 2026-03-08 15:19:14 +00:00
09164e32ad Add Philosophy section with Wittgenstein, Dennett, and S-Existentialism essays
New top-level Philosophy section in sx-docs. Moved SX Manifesto and Strange
Loops from Essays, added three new essays: SX and Wittgenstein (language games,
limits of language, fly-bottles), SX and Dennett (real patterns, multiple drafts,
intentional stance), and S-Existentialism (existence precedes essence, bad faith,
the absurd). Updated all cross-references and navigation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:19:03 +00:00
189a0258d9 Fix reactive islands client-side navigation and hydration
Three bugs prevented islands from working during SX wire navigation:

1. components_for_request() only bundled Component and Macro defs, not
   Island defs — client never received defisland definitions during
   navigation (components_for_page for initial HTML shell was correct).

2. hydrate-island used morph-children which can't transfer addEventListener
   event handlers from freshly rendered DOM to existing nodes. Changed to
   clear+append so reactive DOM with live signal subscriptions is inserted
   directly.

3. asyncRenderToDom (client-side async page eval) checked _component but
   not _island on ~-prefixed names — islands fell through to generic eval
   which failed. Now delegates to renderDomIsland.

4. setInterval_/setTimeout_ passed SX Lambda objects directly to native
   timers. JS coerced them to "[object Object]" and tried to eval as code,
   causing "missing ] after element list". Added _wrapSxFn to convert SX
   lambdas to JS functions before passing to timers.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 15:18:45 +00:00
9a0173419a Wire reactive islands end-to-end: live interactive demos on the demo page
- Rebuild sx-browser.js with signals spec module (was missing entirely)
- Register signal functions (signal, deref, effect, computed, etc.) as
  PRIMITIVES so runtime-evaluated SX code in island bodies can call them
- Add reactive deref detection in adapter-dom.sx: (deref sig) in island
  scope creates reactive-text node instead of static text
- Add Island SSR support in html.py (_render_island with data-sx-island)
- Add Island bundling in jinja_bridge.py (defisland defs sent to client)
- Update deps.py to track Island dependencies alongside Component
- Add defisland to _ASER_FORMS in async_eval.py
- Add clear-interval platform primitive (was missing)
- Create four live demo islands: counter, temperature, imperative, stopwatch

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:57:58 +00:00
50a184faf2 Update reactive islands plan status — nearly all items done
All major plan items are now spec'd and bootstrapped:
- Signal runtime, named stores, event bridge (signals.sx)
- Event bindings :on-click (adapter-dom.sx)
- data-sx-emit processing (orchestration.sx)
- Client hydration + disposal (boot.sx)
- Full JS + Python bootstrapping

Only remaining: keyed list reconciliation (optimization)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:18:09 +00:00
4709c6bf49 Wire island hydration into post-swap lifecycle
- orchestration.sx: post-swap calls sx-hydrate-islands for new islands
  in swapped content, plus process-emit-elements for data-sx-emit
- Regenerate sx-ref.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:17:22 +00:00
e15b5c9dbc Add event bindings and data-sx-emit processing
- adapter-dom.sx: detect :on-click/:on-submit etc. in render-dom-element
  — if attr starts with "on-" and value is callable, wire via dom-listen
- orchestration.sx: add process-emit-elements for data-sx-emit attrs
  — auto-dispatch custom events on click with optional JSON detail
- bootstrap_js.py: add processEmitElements RENAME
- Regenerate sx-ref.js with all changes
- Update reactive-islands status table

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:15:20 +00:00
c55f0956bc Bootstrap stores + event bridge, add island hydration to boot.sx
- signals.sx: fix has? → has-key?, add def-store/use-store/clear-stores
  (L3 named stores), emit-event/on-event/bridge-event (event bridge)
- boot.sx: add sx-hydrate-islands, hydrate-island, dispose-island
  for client-side island hydration from SSR output
- bootstrap_js.py: add RENAMES, platform fns (domListen, eventDetail,
  domGetData, jsonParse), public API exports for all new functions
- bootstrap_py.py: add RENAMES, server-side no-op stubs for DOM events
- Regenerate sx-ref.js (with boot adapter) and sx_ref.py
- Update reactive-islands status: hydration, stores, bridge all spec'd

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 11:13:18 +00:00
5b70cd5cfc Spec event bridge and named stores, move plan to reactive islands section
- signals.sx: add def-store/use-store/clear-stores (L3 named stores)
  and emit-event/on-event/bridge-event (lake→island DOM events)
- reactive-islands.sx: add event bridge, named stores, and plan pages
- Remove ~plan-reactive-islands-content from plans.sx
- Update nav-data.sx and docs.sx routing accordingly

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:59:58 +00:00
0da5dc41e1 Add Reactive Islands as top-level section in sx-docs
- New nav entry in ~sx-main-nav (layouts.sx)
- Nav items: Overview, Demo, Plan link (nav-data.sx)
- Overview page: architecture quadrant, four levels, signal primitives,
  island lifecycle, implementation status table with done/todo
- Demo page: annotated code examples for signal+computed+effect, batch,
  cleanup, computed chains, defisland, test suite
- defpage routes: /reactive-islands/ and /reactive-islands/<slug>

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:37:39 +00:00
57ff7705c7 Merge branch 'worktree-react' into macros 2026-03-08 10:22:08 +00:00
c344b0d7b0 Regenerate sx_ref.py with deps + signals spec modules
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:22:04 +00:00
baa9d66a59 Auto-include deps and signals spec modules with HTML adapter
The Python bootstrapper now auto-includes deps (component analysis)
and signals (reactive islands) when the HTML adapter is present,
matching production requirements where sx_ref.py must export
compute_all_deps, transitive_deps, page_render_plan, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:21:52 +00:00
cf2e386cda Merge branch 'worktree-react' into macros
# Conflicts:
#	shared/sx/tests/run.py
2026-03-08 10:17:40 +00:00
fe289287ec Transpile signals.sx to JS and Python via bootstrappers
Both bootstrappers now handle the full signal runtime:
- &rest lambda params → JS arguments.slice / Python *args
- Signal/Island/TrackingContext platform functions in both hosts
- RENAMES for all signal, island, tracking, and reactive DOM identifiers
- signals auto-included with DOM adapter (JS) and HTML adapter (Python)
- Signal API exports on Sx object (signal, deref, reset, swap, computed, effect, batch)
- New DOM primitives: createComment, domRemove, domChildNodes, domRemoveChildrenAfter, domSetData
- jsonSerialize/isEmptyDict for island state serialization
- Demo HTML page exercising all signal primitives

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 10:17:16 +00:00
26320abd64 Add signal test suite (17/17) and Island type to evaluator
test-signals.sx: 17 tests covering signal basics (create, deref, reset!,
swap!), computed (derive, update, chain), effects (run, re-run, dispose,
cleanup), batch (deferred deduped notifications), and defisland (create,
call, children).

types.py: Island dataclass mirroring Component but for reactive boundaries.
evaluator.py: sf_defisland special form, Island in call dispatch.
run.py: Signal platform primitives (make-signal, tracking context, etc)
  and native effect/computed/batch implementations that bridge Lambda
  calls across the Python↔SX boundary.
signals.sx: Updated batch to deduplicate subscribers across signals.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 09:44:18 +00:00
a97f4c0e39 Add reactive islands spec: signals.sx + defisland across all adapters
New spec file signals.sx defines the signal runtime: signal, computed,
effect, deref, reset!, swap!, batch, dispose, and island scope tracking.

eval.sx: defisland special form + island? type predicate in eval-call.
boundary.sx: signal primitive declarations (Tier 3).
render.sx: defisland in definition-form?.
adapter-dom.sx: render-dom-island with reactive context, reactive-text,
  reactive-attr, reactive-fragment, reactive-list helpers.
adapter-html.sx: render-html-island for SSR with data-sx-island/state.
adapter-sx.sx: island? handling in wire format serialization.
special-forms.sx: defisland declaration with docs and example.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 09:34:47 +00:00
391a0c675b Merge branch 'worktree-zero-tooling-essay' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 17m16s
2026-03-08 02:04:47 +00:00
145028ccc0 Declare Phase 7c+7d page helpers in boundary.sx and register orchestration tests in app runner
Adds optimistic-demo-data, action:add-demo-item, offline-demo-data
to boundary spec. Adds orchestration test spec to in-app test runner
with mocked platform functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 02:04:42 +00:00
c7c824c488 Merge branch 'worktree-zero-tooling-essay' into macros 2026-03-08 01:53:32 +00:00
7f665d874c Add orchestration test suite: 17 tests for Phase 7c+7d
Tests cover page data cache, optimistic cache update/revert/confirm,
offline connectivity tracking, offline queue mutation, and offline-aware
routing. Registered in test runner with mocked platform functions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:53:27 +00:00
599964c39c Merge branch 'worktree-react' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 13m13s
2026-03-08 01:45:12 +00:00
b2aaa3786d Add Reactive Islands plan to sx-docs
Design plan for client-side state via signals and islands — a second
sliding bar (reactivity) orthogonal to the existing isomorphism bar.
Covers signal primitives, defisland, shared state, reactive DOM
rendering, SSR hydration, and spec architecture.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:44:58 +00:00
2d38a76f0b Merge worktree-zero-tooling-essay into macros
Resolves conflicts by keeping both:
- HEAD: cache invalidation, service worker, sw-post-message
- Worktree: optimistic mutations, offline queue, action endpoint
Plans.sx unified with combined 7c/7d documentation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:33:49 +00:00
5f20a16aa0 Phase 7c + 7d: optimistic data updates and offline mutation queue
7c — Optimistic Data Updates:
- orchestration.sx: optimistic-cache-update/revert/confirm + submit-mutation
- pages.py: mount_action_endpoint at /sx/action/<name> for client mutations
- optimistic-demo.sx: live demo with todo list, pending/confirmed/reverted states
- helpers.py: demo data + add-demo-item action handler

7d — Offline Data Layer:
- orchestration.sx: connectivity tracking, offline-queue-mutation, offline-sync,
  offline-aware-mutation (routes online→submit, offline→queue)
- offline-demo.sx: live demo with notes, connectivity indicator, sync timeline
- helpers.py: offline demo data

Also updates plans.sx: marks Phase 7 fully complete (all 6 sub-phases 7a-7f).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:30:12 +00:00
dba5bf05fa Merge branch 'worktree-zero-tooling-essay' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 7m17s
2026-03-08 01:14:13 +00:00
4c1853bc7b Rename essay titles and add broken keyboard anecdote
- "Zero-Tooling" → "Tools for Fools"
- "Separation of Concerns" → "Separate your Own Concerns"
- Bold "...and yet." after Carson Gross reference
- Add broken keyboard origin story
- Fix language list (never Lisp)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 01:14:10 +00:00
3cbdfd8f7f Merge branch 'worktree-zero-tooling-essay' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 9m58s
2026-03-08 00:50:16 +00:00
7f1dad6bfd Add zero-tooling web development essay
New essay arguing SX eliminates the entire conventional web toolchain
(bundlers, transpilers, package managers, CSS tools, dev servers, linters,
type checkers, framework CLIs) and that agentic AI replaces the code editor
itself. Links Carson Gross's "Yes, and..." essay with a Zen Buddhism framing
of the write→read→describe progression.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:50:09 +00:00
0ce3f95d6c Phase 7c+7d: cache invalidation + offline data layer
7c: Client data cache management via element attributes
(sx-cache-invalidate) and response headers (SX-Cache-Invalidate,
SX-Cache-Update). Programmatic API: invalidate-page-cache,
invalidate-all-page-cache, update-page-cache.

7d: Service Worker (sx-sw.js) with IndexedDB for offline-capable
data caching. Network-first for /sx/data/ and /sx/io/, stale-while-
revalidate for /static/. Cache invalidation propagates from
in-memory cache to SW via postMessage.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:45:33 +00:00
9a707dbe56 Merge branch 'worktree-cssx-components' into macros
All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 14m0s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:25:22 +00:00
069d7e7090 Consolidate CSSX docs: add delivery page, remove old CSS docs and plan
Moved on-demand CSS delivery protocol from docs/css into /cssx/delivery,
framed as one strategy among several. Removed the CSSX Components plan
(now redundant with the top-level /cssx/ section).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:24:24 +00:00
09947262a5 Add CSSX as top-level docs section with patterns, async, and live examples
New top-level section in sx-docs: /cssx/ with 6 pages:
- Overview: the idea, what changed, advantages
- Patterns: class mapping, data-driven, style functions, responsive, emitting CSS
- Async CSS: components that fetch/cache CSS before rendering via ~suspense
- Live Styles: SSE/WS examples for real-time style updates (noted as future)
- Comparisons: vs styled-components, CSS Modules, Tailwind, Vanilla Extract
- Philosophy: proof by deletion, the right abstraction level

Also:
- Remove CSSX from specs nav (spec file deleted)
- Fix renderer spec prose (no longer mentions StyleValue)
- Update On-Demand CSS essay summary
- Mark CSSX Components plan as done

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-08 00:15:39 +00:00