Runtime API
Everything the client runtime exports from @krate/runtime.
Reactive primitives
createSignal
const [getValue, setValue] = createSignal(initialValue) getValue() // read current value setValue(next) // set value (triggers subscribers) setValue(prev => ...) // functional update createEffect
const dispose = createEffect(() => { /* re-runs when deps change */ }) dispose() // remove the effect entirely createMemo
const value = createMemo(() => expensiveCalc(input())) value() // read memoized value onCleanup
onCleanup(() => { /* runs before effect re-execution and on dispose */ }) onMount
onMount(() => { /* runs once after the initial render */ }) forwardRef
const FancyInput = forwardRef((props, ref) => { ref((el: Element) => el.focus()); return h('input', props); }); Forwards a ref callback through to the underlying DOM element.
disposeAll
disposeAll() Disposes every live effect (used internally on SPA navigation and in test harnesses).
DOM helpers
h — hyperscript
const el = h('div', { class: 'foo', onClick: () => {} }, child1, child2) // Functions as children become effects: // h('span', null, () => signal()) mount
mount(() => h(App, null), '#root') hydrate
hydrate(() => h(App, null), '#root') Hydrates SSR content, binding effects to existing DOM via data-k/data-kh attributes.
insert / clearNodes
insert(parent, value, startMarker) // replace content between two <!--k--> markers clearNodes(start, end) // clear nodes between two markers Low-level helpers used by the compiled hydration code to manage dynamic regions delimited by <!--k--> comment markers.
JSX runtime
import { jsx, jsxs, Fragment } from '@krate/runtime/jsx-runtime' Automatic JSX transform — use <div> syntax in TSX files.
SPA router
import { initRouter } from '@krate/runtime' initRouter() Call once to enable client-side navigation via data-krate-link anchors and <Link>. Handles pushState, popstate, stylesheet diffing, and tree reconciliation. On navigation the router diffs the live content root against the parsed new page via reconcileTrees — unchanged nodes (keyed by <!--k:--> comment markers, data-k attributes, and id anchors) are kept in place so their state (focus, scroll, media, CSS animations) survives. Effects are disposed before the diff and stale __krate_* handler props are stripped; the new page's hydration JS then rebinds the kept nodes. Emits a krate:navigate CustomEvent after each navigation.
reinitRouter() tears down and re-registers the router listeners — useful after a full page replacement or for HMR in dev.
Context
import { createContext } from '@krate/runtime' const ThemeCtx = createContext('light') // ThemeCtx.Provider — wraps children with a context value // ThemeCtx.useContext() — reads nearest Provider value // ThemeCtx.defaultValue — fallback when no Provider Resources
import { createResource } from '@krate/runtime' const [user, { mutate, refetch }] = createResource( () => userId(), // reactive source async (id) => fetch(\`/api/user/\${id}\`).then(r => r.json()) // fetcher ) user() // current data (or undefined) user.loading // boolean user.error // error or undefined user.state // 'unresolved' | 'loading' | 'ready' | 'error' | 'refreshing' mutate(prev => ({ ...prev, name: 'new' })) // optimistic update refetch() // trigger re-fetch Type exports
import type { Component, PropsWithChildren, ComponentProps, RefCallback, Context, ResourceReturn, ResourceActions, } from '@krate/runtime'