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>
275 lines
7.8 KiB
Plaintext
275 lines
7.8 KiB
Plaintext
(defcomp
|
|
~docs/placeholder
|
|
(&key (id :as string))
|
|
(div
|
|
:id id
|
|
(div
|
|
(~tw :tokens "bg-stone-100 rounded p-4 mt-3")
|
|
(p
|
|
(~tw :tokens "text-stone-400 italic text-sm")
|
|
"Trigger the demo to see the actual content."))))
|
|
|
|
(defcomp
|
|
~docs/oob-code
|
|
(&key (target-id :as string) (text :as string))
|
|
(div
|
|
:id target-id
|
|
:sx-swap-oob "innerHTML"
|
|
(div
|
|
(~tw :tokens "not-prose bg-stone-100 rounded p-4 mt-3")
|
|
(pre (~tw :tokens "text-sm whitespace-pre-wrap break-words") (code text)))))
|
|
|
|
(defcomp
|
|
~docs/attr-table
|
|
(&key (title :as string) rows)
|
|
(div
|
|
(~tw :tokens "space-y-3")
|
|
(h3 (~tw :tokens "text-xl font-semibold text-stone-700") title)
|
|
(div
|
|
(~tw :tokens "overflow-x-auto rounded border border-stone-200")
|
|
(table
|
|
(~tw :tokens "w-full text-left text-sm")
|
|
(thead
|
|
(tr
|
|
(~tw :tokens "border-b border-stone-200 bg-stone-100")
|
|
(th (~tw :tokens "px-3 py-2 font-medium text-stone-600") "Attribute")
|
|
(th (~tw :tokens "px-3 py-2 font-medium text-stone-600") "Description")
|
|
(th
|
|
(~tw :tokens "px-3 py-2 font-medium text-stone-600 text-center w-20")
|
|
"In sx?")))
|
|
(tbody rows)))))
|
|
|
|
(defcomp
|
|
~docs/headers-table
|
|
(&key (title :as string) rows)
|
|
(div
|
|
(~tw :tokens "space-y-3")
|
|
(h3 (~tw :tokens "text-xl font-semibold text-stone-700") title)
|
|
(div
|
|
(~tw :tokens "overflow-x-auto rounded border border-stone-200")
|
|
(table
|
|
(~tw :tokens "w-full text-left text-sm")
|
|
(thead
|
|
(tr
|
|
(~tw :tokens "border-b border-stone-200 bg-stone-100")
|
|
(th (~tw :tokens "px-3 py-2 font-medium text-stone-600") "Header")
|
|
(th (~tw :tokens "px-3 py-2 font-medium text-stone-600") "Value")
|
|
(th (~tw :tokens "px-3 py-2 font-medium text-stone-600") "Description")))
|
|
(tbody rows)))))
|
|
|
|
(defcomp
|
|
~docs/headers-row
|
|
(&key
|
|
(name :as string)
|
|
(value :as string)
|
|
(description :as string)
|
|
(href :as string?))
|
|
(tr
|
|
(~tw :tokens "border-b border-stone-100")
|
|
(td
|
|
(~tw :tokens "px-3 py-2 font-mono text-sm whitespace-nowrap")
|
|
(if
|
|
href
|
|
(a
|
|
:href href
|
|
:sx-get href
|
|
:sx-target "#sx-content"
|
|
:sx-select "#sx-content"
|
|
:sx-swap "outerHTML"
|
|
:sx-push-url "true"
|
|
(~tw :tokens "text-violet-700 hover:text-violet-900 underline")
|
|
name)
|
|
(span (~tw :tokens "text-violet-700") name)))
|
|
(td (~tw :tokens "px-3 py-2 font-mono text-sm text-stone-500") value)
|
|
(td (~tw :tokens "px-3 py-2 text-stone-700 text-sm") description)))
|
|
|
|
(defcomp
|
|
~docs/two-col-row
|
|
(&key (name :as string) (description :as string) (href :as string?))
|
|
(tr
|
|
(~tw :tokens "border-b border-stone-100")
|
|
(td
|
|
(~tw :tokens "px-3 py-2 font-mono text-sm whitespace-nowrap")
|
|
(if
|
|
href
|
|
(a
|
|
:href href
|
|
:sx-get href
|
|
:sx-target "#sx-content"
|
|
:sx-select "#sx-content"
|
|
:sx-swap "outerHTML"
|
|
:sx-push-url "true"
|
|
(~tw :tokens "text-violet-700 hover:text-violet-900 underline")
|
|
name)
|
|
(span (~tw :tokens "text-violet-700") name)))
|
|
(td (~tw :tokens "px-3 py-2 text-stone-700 text-sm") description)))
|
|
|
|
(defcomp
|
|
~docs/two-col-table
|
|
(&key
|
|
(title :as string?)
|
|
(intro :as string?)
|
|
(col1 :as string?)
|
|
(col2 :as string?)
|
|
rows)
|
|
(div
|
|
(~tw :tokens "space-y-3")
|
|
(when title (h3 (~tw :tokens "text-xl font-semibold text-stone-700") title))
|
|
(when intro (p (~tw :tokens "text-stone-600 mb-6") intro))
|
|
(div
|
|
(~tw :tokens "overflow-x-auto rounded border border-stone-200")
|
|
(table
|
|
(~tw :tokens "w-full text-left text-sm")
|
|
(thead
|
|
(tr
|
|
(~tw :tokens "border-b border-stone-200 bg-stone-100")
|
|
(th
|
|
(~tw :tokens "px-3 py-2 font-medium text-stone-600")
|
|
(or col1 "Name"))
|
|
(th
|
|
(~tw :tokens "px-3 py-2 font-medium text-stone-600")
|
|
(or col2 "Description"))))
|
|
(tbody rows)))))
|
|
|
|
(defcomp ~docs/label () (span (~tw :tokens "font-mono") "(<sx>)"))
|
|
|
|
(defcomp
|
|
~docs/clear-cache-btn
|
|
()
|
|
(button
|
|
:onclick "localStorage.removeItem('sx-components-hash');localStorage.removeItem('sx-components-src');var e=Sx.getEnv();Object.keys(e).forEach(function(k){if(k.charAt(0)==='~')delete e[k]});var b=this;b.textContent='Cleared!';setTimeout(function(){b.textContent='Clear component cache'},2000)"
|
|
(~tw :tokens "text-xs text-stone-400 hover:text-stone-600 border border-stone-200 rounded px-2 py-1 transition-colors")
|
|
"Clear component cache"))
|
|
|
|
(defcomp
|
|
~docs/attr-table-from-data
|
|
(&key (title :as string) (attrs :as list))
|
|
(~docs/attr-table
|
|
:title title
|
|
:rows (<>
|
|
(map
|
|
(fn
|
|
(a)
|
|
(~docs/attr-row
|
|
:attr (get a "name")
|
|
:description (get a "desc")
|
|
:exists (get a "exists")
|
|
:href (get a "href")))
|
|
attrs))))
|
|
|
|
(defcomp
|
|
~docs/headers-table-from-data
|
|
(&key (title :as string) (headers :as list))
|
|
(~docs/headers-table
|
|
:title title
|
|
:rows (<>
|
|
(map
|
|
(fn
|
|
(h)
|
|
(~docs/headers-row
|
|
:name (get h "name")
|
|
:value (get h "value")
|
|
:description (get h "desc")
|
|
:href (get h "href")))
|
|
headers))))
|
|
|
|
(defcomp
|
|
~docs/two-col-table-from-data
|
|
(&key
|
|
(title :as string?)
|
|
(intro :as string?)
|
|
(col1 :as string?)
|
|
(col2 :as string?)
|
|
(items :as list))
|
|
(~docs/two-col-table
|
|
:title title
|
|
:intro intro
|
|
:col1 col1
|
|
:col2 col2
|
|
:rows (<>
|
|
(map
|
|
(fn
|
|
(item)
|
|
(~docs/two-col-row
|
|
:name (get item "name")
|
|
:description (get item "desc")
|
|
:href (get item "href")))
|
|
items))))
|
|
|
|
(defcomp
|
|
~docs/primitives-tables
|
|
(&key (primitives :as dict))
|
|
(<>
|
|
(map
|
|
(fn
|
|
(cat)
|
|
(~docs/primitives-table
|
|
:category cat
|
|
:primitives (get primitives cat)))
|
|
(keys primitives))))
|
|
|
|
(defcomp
|
|
~docs/special-forms-tables
|
|
(&key (forms :as dict))
|
|
(<>
|
|
(map
|
|
(fn
|
|
(cat)
|
|
(~docs/special-forms-category :category cat :forms (get forms cat)))
|
|
(keys forms))))
|
|
|
|
(defcomp
|
|
~docs/special-forms-category
|
|
(&key (category :as string) (forms :as list))
|
|
(div
|
|
(~tw :tokens "space-y-4")
|
|
(h3
|
|
(~tw :tokens "text-xl font-semibold text-stone-800 border-b border-stone-200 pb-2")
|
|
category)
|
|
(div
|
|
(~tw :tokens "space-y-4")
|
|
(map
|
|
(fn
|
|
(f)
|
|
(~docs/special-form-card
|
|
:name (get f "name")
|
|
:syntax (get f "syntax")
|
|
:doc (get f "doc")
|
|
:tail-position (get f "tail-position")
|
|
:example (get f "example")))
|
|
forms))))
|
|
|
|
(defcomp
|
|
~docs/special-form-card
|
|
(&key
|
|
(name :as string)
|
|
(syntax :as string)
|
|
(doc :as string)
|
|
(tail-position :as string)
|
|
(example :as string))
|
|
(div
|
|
(~tw :tokens "not-prose border border-stone-200 rounded-lg p-4 space-y-3")
|
|
(div
|
|
(~tw :tokens "flex items-baseline gap-3")
|
|
(code (~tw :tokens "text-lg font-bold text-violet-700") name)
|
|
(when
|
|
(not (= tail-position "none"))
|
|
(span
|
|
(~tw :tokens "text-xs px-2 py-0.5 rounded-full bg-green-100 text-green-700")
|
|
"TCO")))
|
|
(when
|
|
(not (= syntax ""))
|
|
(pre
|
|
(~tw :tokens "bg-stone-100 rounded px-3 py-2 text-sm font-mono text-stone-700 overflow-x-auto")
|
|
syntax))
|
|
(p (~tw :tokens "text-stone-600 text-sm whitespace-pre-line") doc)
|
|
(when
|
|
(not (= tail-position ""))
|
|
(p
|
|
(~tw :tokens "text-xs text-stone-500")
|
|
(span (~tw :tokens "font-semibold") "Tail position: ")
|
|
tail-position))
|
|
(when
|
|
(not (= example ""))
|
|
(~docs/code :src (highlight example "lisp")))))
|