Build tooling: updated OCaml bootstrapper, compile-modules, bundle.sh, sx-build-all. WASM browser: rebuilt sx_browser.bc.js/wasm, sx-platform-2.js, .sxbc bytecode files. CSSX/Tailwind: reworked cssx.sx templates and tw-layout, added tw-type support. Content: refreshed essays, plans, geography, reactive islands, docs, demos, handlers. New tools: bisect_sxbc.sh, test-spa.js, render-trace.sx, morph playwright spec. Tests: added test-match.sx, test-examples.sx, updated test-tw.sx and web tests. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
105 lines
4.5 KiB
Plaintext
105 lines
4.5 KiB
Plaintext
(defcomp
|
|
~optimistic-demo/content
|
|
(&key items server-time)
|
|
(div
|
|
(~tw :tokens "space-y-8")
|
|
(div
|
|
(~tw :tokens "border-b border-stone-200 pb-6")
|
|
(h1 (~tw :tokens "text-2xl font-bold text-stone-900") "Optimistic Updates")
|
|
(p
|
|
(~tw :tokens "mt-2 text-stone-600")
|
|
"This page tests Phase 7c optimistic data mutations. Items are updated "
|
|
"instantly on the client, then confirmed or reverted when the server responds."))
|
|
(div
|
|
(~tw :tokens "rounded-lg border border-stone-200 bg-white p-6 space-y-3")
|
|
(h2 (~tw :tokens "text-lg font-semibold text-stone-800") "Current state")
|
|
(dl
|
|
(~tw :tokens "grid grid-cols-2 gap-2 text-sm")
|
|
(dt (~tw :tokens "font-medium text-stone-600") "Server time")
|
|
(dd (~tw :tokens "font-mono text-stone-900") server-time)
|
|
(dt (~tw :tokens "font-medium text-stone-600") "Item count")
|
|
(dd (~tw :tokens "text-stone-900") (str (len items)))))
|
|
(div
|
|
(~tw :tokens "space-y-3")
|
|
(h2 (~tw :tokens "text-lg font-semibold text-stone-800") "Items")
|
|
(div
|
|
:id "optimistic-items"
|
|
(~tw :tokens "space-y-2")
|
|
(map
|
|
(fn
|
|
(item)
|
|
(div
|
|
(~tw :tokens "flex items-center justify-between rounded border border-stone-100 bg-white p-3")
|
|
(div
|
|
(~tw :tokens "flex items-center gap-3")
|
|
(span
|
|
(~tw :tokens "flex-none rounded-full bg-violet-100 text-violet-700 w-6 h-6 flex items-center justify-center text-xs font-bold")
|
|
(str (get item "id")))
|
|
(span (~tw :tokens "text-stone-900") (get item "label")))
|
|
(span
|
|
(~tw :tokens "text-xs px-2 py-0.5 rounded-full")
|
|
:class (case
|
|
(get item "status")
|
|
"confirmed"
|
|
"bg-green-100 text-green-700"
|
|
"pending"
|
|
"bg-amber-100 text-amber-700"
|
|
"reverted"
|
|
"bg-red-100 text-red-700"
|
|
:else "bg-stone-100 text-stone-500")
|
|
(get item "status"))))
|
|
items))
|
|
(div
|
|
(~tw :tokens "pt-2")
|
|
(button
|
|
(~tw :tokens "px-4 py-2 bg-violet-500 text-white rounded hover:bg-violet-600 text-sm")
|
|
:sx-post "/sx/action/add-demo-item"
|
|
:sx-target "#sx-content"
|
|
:sx-vals "{\"label\": \"New item\"}"
|
|
"Add item (optimistic)")))
|
|
(div
|
|
(~tw :tokens "space-y-4")
|
|
(h2 (~tw :tokens "text-lg font-semibold text-stone-800") "How it works")
|
|
(div
|
|
(~tw :tokens "space-y-2")
|
|
(map-indexed
|
|
(fn
|
|
(i step)
|
|
(div
|
|
(~tw :tokens "flex items-start gap-3 rounded border border-stone-100 bg-white p-3")
|
|
(span
|
|
(~tw :tokens "flex-none rounded-full bg-stone-100 text-stone-700 w-6 h-6 flex items-center justify-center text-xs font-bold")
|
|
(str (+ i 1)))
|
|
(div
|
|
(div (~tw :tokens "font-medium text-stone-900") (get step "label"))
|
|
(div (~tw :tokens "text-sm text-stone-500") (get step "detail")))))
|
|
(list
|
|
(dict
|
|
:label "Predict"
|
|
:detail "Client applies mutator function to cached data immediately")
|
|
(dict
|
|
:label "Snapshot"
|
|
:detail "Pre-mutation data saved in _optimistic-snapshots for rollback")
|
|
(dict
|
|
:label "Re-render"
|
|
:detail "Page content re-evaluated and swapped with predicted data")
|
|
(dict
|
|
:label "Submit"
|
|
:detail "Mutation sent to server via POST /sx/action/<name>")
|
|
(dict
|
|
:label "Confirm or revert"
|
|
:detail "Server responds — cache updated with truth, or reverted to snapshot")))))
|
|
(div
|
|
(~tw :tokens "rounded-lg border border-amber-200 bg-amber-50 p-4 text-sm space-y-2")
|
|
(p (~tw :tokens "font-semibold text-amber-800") "How to verify")
|
|
(ol
|
|
(~tw :tokens "list-decimal list-inside text-amber-700 space-y-1")
|
|
(li "Open the browser console (F12)")
|
|
(li "Navigate to this page from another isomorphism page")
|
|
(li
|
|
"Click \"Add item\" — item appears instantly with \"pending\" status")
|
|
(li
|
|
"Watch console for "
|
|
(code (~tw :tokens "bg-amber-100 px-1 rounded") "sx:optimistic confirmed"))
|
|
(li "Item status changes to \"confirmed\" when server responds")))))
|