SX docs: configurable shell, SX-native event handlers, nav fixes

- Configurable page shell (~sx-page-shell kwargs + SX_SHELL app config)
  so each app controls its own assets — sx docs loads only sx-browser.js
- SX-evaluated sx-on:* handlers (eval-expr instead of new Function)
  with DOM primitives registered in PRIMITIVES table
- data-init boot mode for pure SX initialization scripts
- Jiggle animation on links while fetching
- Nav: 3-column grid for centered alignment, is-leaf sizing,
  fix map-indexed param order (index, item), guard mod-by-zero
- Async route eval failure now falls back to server fetch
  instead of silently rendering nothing
- Remove duplicate h1 title from ~doc-page
- Re-bootstrap sx-ref.js + sx-browser.js

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-10 11:00:59 +00:00
parent 31a6e708fc
commit 8a5c115557
20 changed files with 5763 additions and 3046 deletions

View File

@@ -846,17 +846,22 @@ def compute_page_render_plans(service_name: str) -> None:
Must be called after components are loaded (compute_all_deps/io_refs done)
and pages are registered. Stores plans on PageDef.render_plan.
"""
import time
from .parser import serialize
from .deps import page_render_plan, get_all_io_names
from .jinja_bridge import _COMPONENT_ENV
t0 = time.monotonic()
io_names = get_all_io_names()
pages = get_all_pages(service_name)
count = 0
for page_def in pages.values():
if page_def.content_expr is not None:
content_src = serialize(page_def.content_expr)
page_def.render_plan = page_render_plan(content_src, _COMPONENT_ENV, io_names)
logger.info("Computed render plans for %d pages in %s", len(pages), service_name)
count += 1
elapsed = (time.monotonic() - t0) * 1000
logger.info("Computed render plans for %d pages in %s (%.1fms)", count, service_name, elapsed)
def auto_mount_pages(app: Any, service_name: str) -> None: