ExportSummarySource
Action@openelement/element · roottypepublic
Route action: handles form submissions for a page route.
Action<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:64ActionContext@openelement/element · rootinterfacepublic
Context passed to a route action function (extends loader context).
ActionContext<Env, Platform, Route>formData: FormData (required); request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:47ActionResult@openelement/element · roottypepublic
Wire shape returned to the JavaScript form-enhancement path. The no-JS path never sees this: it gets the equivalent semantics as plain HTTP (303 on success, 422 with the re-rendered form on validation failure, redirect/error as status codes). Error outcomes (CSRF 403, unknown action 404, unparseable body 400, unexpected 500) are NOT part of this union: since #863 they answer RFC 9457 Problem Details with the PROBLEM_JSON_MEDIA_TYPE content type — see ProblemDetails.
ActionResult<Success, Failure> packages/element/src/internal/protocol/data.ts:82AppShellConfig@openelement/element · roottypepublic
Application shell declaration: `false` disables the shell entirely, `'default'` uses the built-in shell, and the object form names a tag with the module path that defines it (`import`, resolved like a {@link FrameworkOptions.middleware.use } entry) plus the compiled shell properties the router injects per route.
AppShellConfig packages/element/src/internal/protocol/framework.ts:95assertValidTagName@openelement/element · rootfunctionpublic
Assert that a tag name is a valid custom element name.
(tagName: string): void packages/element/src/internal/core/tag-utils.ts:55collectPublicProps@openelement/element · rootfunctionpublic
Collect all public (non-internal) own properties from a host object. Keys starting with `__openElement` are framework-internal and excluded. Uses Reflect.get for safe access (respects getters); a getter that throws is skipped with a warning so one bad prop cannot take the tree down.
(host: object): Record<string, unknown> packages/element/src/internal/core/props-utils.ts:41CompatibilityClassification@openelement/element · rootinterfacepublic
The per-tag verdict the compatibility scanner records: the tier a discovered tag was classified as, the human-readable `reason`, where the tag was found (`source`), and the SSR/DSD/hydration facts the verdict was derived from.
CompatibilityClassificationtagName: string (required); tier: CompatibilityTier (required); reason: string (required); source: "local" | "package" | "nested" (required); modulePath?: string (optional); ssr?: boolean (optional); dsd?: boolean (optional); hydrate?: string (optional)
packages/element/src/internal/protocol/framework.ts:320CompatibilityTier@openelement/element · roottypepublic
How far a discovered tag may participate in the build: 'ssr-capable' renders and hydrates, 'client-only' ships to the browser without server output, 'experimental-dom' is admitted with a downgraded guarantee, and 'rejected' fails the build.
CompatibilityTier packages/element/src/internal/protocol/framework.ts:313ComponentLayer@openelement/element · roottypepublic
The delivery layer a component belongs to: fully static DSD markup ('dsd-static'), DSD markup with a client island ('dsd-interactive'), a client-only island with no SSR output ('pure-island'), or a light-DOM element ('light-dom'). Recorded per component in the build manifest and consumed by the hydration scheduler.
ComponentLayer packages/element/src/internal/protocol/framework.ts:23computed@openelement/element · rootfunctionpublic
Create a derived read-only signal recomputed from its dependencies.
<T>(fn: () => T): ReadonlySignal<T> packages/element/src/internal/signal/framework.ts:23consumeContext@openelement/element · rootfunctionpublic
Consumer-local reactive projection of a protocol context value.
<T>(context: Context<T>, host?: HTMLElement): WritableSignal<T>key.toString: () => string (required) — Returns a string representation of an object.; key.valueOf: () => symbol (required) — Returns the primitive value of the specified object.; key.description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; key.__@toPrimitive@386: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; key.__@toStringTag@388: string (required); defaultValue: T (required)
packages/element/src/internal/core/signal-context.ts:143Context@openelement/element · rootinterfacepublic
A typed context token: protocol identity (`key`) plus its default value.
Context<T>key.toString: () => string (required) — Returns a string representation of an object.; key.valueOf: () => symbol (required) — Returns the primitive value of the specified object.; key.description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; key.__@toPrimitive@386: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; key.__@toStringTag@388: string (required); defaultValue: T (required)
packages/element/src/internal/core/signal-context.ts:13createContext@openelement/element · rootfunctionpublic
Create a typed context token shared between provider and consumer elements.
<T>(key: symbol, defaultValue: T): Context<T>toString: () => string (required) — Returns a string representation of an object.; valueOf: () => symbol (required) — Returns the primitive value of the specified object.; description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; __@toPrimitive@386: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; __@toStringTag@388: string (required)
packages/element/src/internal/core/signal-context.ts:58createDeferredDsdExecutor@openelement/element · rootfunctionpublic
Create one request-local deferred shell from a generated route manifest. The manifest hash is checked against the exact runtime wire program before any shell can be produced.
(options: CreateDeferredDsdOptions): Promise<DeferredDsdExecutor>componentClass: CustomElementConstructor (required); props?: Record<string, unknown> (optional); manifest: DeferredDsdManifest (required); instanceId: string (required); documentToken?: string (optional)
packages/element/src/public-runtime.ts:353CreateDeferredDsdOptions@openelement/element · rootinterfacepublic
Inputs for a request-scoped deferred DSD server executor.
CreateDeferredDsdOptionscomponentClass: CustomElementConstructor (required); props?: Record<string, unknown> (optional); manifest: DeferredDsdManifest (required); instanceId: string (required); documentToken?: string (optional)
packages/element/src/public-runtime.ts:282createLogger@openelement/element · rootfunctionpublic
Create a {@link Logger} that prefixes every message with `[tag]`.
(tag: string): Logger packages/element/src/internal/core/logger.ts:18DANGEROUS_KEYS@openelement/element · rootconstpublic
Object prototype keys that must never be injected from untrusted props.
ReadonlySet<string> packages/element/src/internal/core/security.ts:24deepGetElementById@openelement/element · rootfunctionpublic
Resolve `id` (a `#hash` or bare id) against `root` and, when the id is not in that root's own tree, recurse into every nested shadow root. Returns the first match or `null`; a malformed percent-encoded id is not an error.
(id: string, root?: Document | ShadowRoot): HTMLElement | null packages/element/src/internal/core/deep-fragment.ts:20DeferredDsdExecutor@openelement/element · rootinterfacepublic
Initial shell, typed seed, and bounded updates for a deferred DSD request.
DeferredDsdExecutorshell: string (required); owner: DeferredServerOwner (required); seed: Record<string, { state: "resolved"; type: string; value: unknown; } | { state: "pending"; type: string; } | { state: "missing"; type: string; }> (required); resolvedValue: (field: string, value: unknown) => unknown (required); serializeResolved: (field: string, value: unknown) => string[] (required)
packages/element/src/public-runtime.ts:291DeferredDsdManifest@openelement/element · rootinterfacepublic
Maps route-local deferred fields to the compiled Part or Region owners they update.
DeferredDsdManifestprogram: { version: number; tag: string; sha256: string; } (required); fields: readonly { field: string; signal: string; owners: readonly { kind: "part" | "region"; index: number; }[]; }[] (required)
packages/element/src/public-runtime.ts:272documentStreamParts@openelement/element · rootfunctionpublic
The same document serialization boundary, with only body wrappers left open.
(options?: DocumentWrapOptions): { prefix: string; suffix: string; }title?: string (optional); lang?: string (optional); clientScript?: string (optional); scripts?: DocumentScriptDescriptor[] (optional); meta.description?: string (optional); meta.tags?: Record<string, string | number | boolean>[] (optional); devScripts?: string (optional); headExtras?: string (optional); dangerouslyHeadFragments?: string[] (optional); allowHeadExtrasScripts?: boolean (optional); links?: { rel: string; href: string; hreflang?: string; }[] (optional); structuredData?: readonly Record<string, unknown>[] (optional); cspNonce?: string (optional); streamBootstrap?: string (optional) — Trusted framework bootstrap emitted synchronously in the document head.
packages/element/src/internal/core/html-escape.ts:118effect@openelement/element · rootfunctionpublic
Run a side effect that re-subscribes whenever its signal dependencies change.
(fn: () => void | Unsubscribe): Unsubscribe packages/element/src/internal/signal/framework.ts:27element@openelement/element · rootfunctionpublic
Compiler-recognized element decorator; inert no-op at runtime.
(_tag: string, _options?: { root?: "light" | "shadow-open" | "shadow-closed"; delegatesFocus?: boolean; formAssociated?: boolean; }): (target: unknown, context?: unknown) => void packages/element/src/internal/core/compile-decorators.ts:20ensureDeepFragmentNavigation@openelement/element · rootfunctionpublic
Install (once per document) framework-level fragment navigation: a same-document anchor click whose target lives inside a nested shadow root scrolls to it and pushes the hash instead of being dropped by the browser. `{ enabled: false }` opts an application out.
(options?: DeepFragmentOptions): voidenabled?: boolean (optional) — Set false before installation to opt out for an application.
packages/element/src/internal/core/deep-fragment.ts:67ensurePreHydrationClickCapture@openelement/element · rootfunctionpublic
Install the bounded pre-upgrade interaction capture on an owning root (default: the document). Generated client entries call this with their declared island tags before any compiled element upgrades; after a successful claim the element replays the captured events whose targets live inside its root (compiled claim capture/replay, internal/compiled/runtime.ts). Idempotent per root (repeat calls merge tags, never reinstall listeners) and a no-op where no DOM exists (SSR). Invariant: the capture itself — one fixed listener set per owning root, installed once per page — is page-lifetime by design and is NOT the leak. The M1 leak was retained event-target records; each element releases exactly its own records at its activation decision (success or failure), while records owned by still-pending elements survive for their delayed/lazy upgrade (#1170). Boundedness: the facade capture passes the declared-island filter, so only interactions under a still-pending DECLARED island tag enter the queue — ordinary events and undeclared third-party custom elements are skipped (nested pending declared islands still capture through their own unsettled host). With no tags declared the legacy dash heuristic applies. The queue additionally carries a hard capacity cap (fail closed) and every release sweeps detached targets, so post-hydration traffic and removals never grow retention.
(root?: EventTarget, pendingTags?: readonly string[]): voidaddEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean) => void (required) — The **`addEventListener()`** method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener); dispatchEvent: (event: Event) => boolean (required) — The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. The normal event processing rules (including the capturing and optional bubbling phase) also apply to events dispatched manually with dispatchEvent(). [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent); removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean) => void (required) — The **`removeEventListener()`** method of the EventTarget interface removes an event listener previously registered with EventTarget.addEventListener() from the target. The event listener to be removed is identified using a combination of the event type, the event listener function itself, and various optional options that may affect the matching process; see Matching event listeners for removal.…
packages/element/src/internal/compiled/runtime/pre-upgrade-events.ts:509ERROR_PREFIX@openelement/element · rootconstpublic
Error message prefix for all openElement errors.
"[openElement]" packages/element/src/internal/protocol/errors.ts:53ErrorBoundary@openelement/element · rootclasspublic
Base class for elements that catch descendant render/hydration errors and apply a retry policy.
class ErrorBoundary extends OpenElement packages/element/src/error-boundary.ts:27ErrorTelemetryHook@openelement/element · roottypepublic
Callback receiving every reported {@linkcode OpenElementError} for telemetry.
ErrorTelemetryHook packages/element/src/internal/protocol/errors.ts:110escapeAttr@openelement/element · rootfunctionpublic
Escape an HTML attribute value. Delegates to `escapeHtml` so both share the single `ESCAPE_MAP` and the same single-pass replacement (consolidated in #633). Empty-value conventions remain intentionally distinct by design: - `escapeHtml` returns '' for non-string input. - `escapeAttrValue` (below) coerces via `String()` and is the boundary meant for unknown/variable attribute values.
(value: string): string packages/element/src/internal/core/html-escape.ts:53escapeHtml@openelement/element · rootfunctionpublic
Escape the five HTML-significant characters in text content.
(str: string): string packages/element/src/internal/core/html-escape.ts:37FrameworkOptions@openelement/element · rootinterfacepublic
The adapter-facing framework options: where routes, islands and components live, which renderer serializes pages, the application shell and layout declarations, the document `<html>`/head injection channels, and the request-time middleware switches. Every field is optional; the adapter applies its documented default. This is the type an application config file's default export is checked against, so the rendered option table and the actual config surface cannot drift.
FrameworkOptionsrenderer?: "native" | "lit" (optional) — Page renderer selection (Beta.2.2, #1339). EXPLICIT, never inferred: 'native' (default) renders pages through the compiled Part Program serializer (renderDsd); 'lit' renders LitElement pages through; routesDir?: string (optional) — Directory the route scanner walks, relative to the Vite root. Defaults to `app/routes`.; islandsDir?: string (optional) — Directory island modules are discovered in. Defaults to `app/islands`.; componentsDir?: string (optional) — Directory non-route components live in. Defaults to `app/components`.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits, e.g. `['@openelement/ui']`.; appShell?: AppShellConfig (optional) — Application shell declaration; `false` disables the shell, `'default'` uses the built-in one.; layouts?: LayoutsConfig (optional) — Per-layout shell declarations keyed by layout name.; mode?: "ssg" (optional) — Build mode. 'ssg' (default) generates static HTML.; headExtras?: string (optional) — @dangerous injected as-is, only use with controlled content; html.lang?: string (optional); html.title?: string (optional); inject.stylesheets?: (string | { href: string; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<string, string | number | boolean>; })[] (optional) — Stylesheets linked into the document head; each entry is an href or a link record with integrity/crossorigin/attrs.; inject.scripts?: (string | { src: string; type?: string; async?: boolean; defer?: boolean; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<str… (optional) — Scripts emitted into the document; each entry is a src or a script record with type/async/defer/integrity/crossorigin/attrs.; inject.headFragments?: string[] (optional) — @dangerous fragments injected as-is. Trust boundary (same level as `trustedHtml`): never concatenate user-controlled content into these fragments; sanitize untrusted data at your own system boundary first. The framework only enforces no-`<script>` and no-executable-`<style>`.; ssr.noExternal?: (string | RegExp)[] (optional); island.upgradeStrategy?: "load" | "idle" | "visible" | "only" (optional); build.outDir?: string (optional) — Output directory for the build artifacts. Defaults to `dist`.; build.manifestBudget?: { islandKB?: number; totalJsKB?: number; pageKB?: number; } (optional) — Advisory only: exceeded budgets print build-manifest warnings and never fail the build; enforce them in your own build-output test.; viewTransition?: boolean (optional) — Enable the View Transitions API for client navigations. Defaults to true.; speculation?: boolean | { prerender?: string[]; prefetch?: string[]; exclude?: string[]; eagerness?: "immediate" | "moderate" | "conservative"; } (optional) — Speculation Rules emission: `true` uses framework defaults, or pass prerender/prefetch URL lists, exclusions and an eagerness.; middleware.cors?: boolean (optional) — Enable the built-in CORS middleware.; middleware.corsOrigin?: string | string[] (optional) — Static CORS allowlist data, serialized into the generated entry as JSON. Mutually exclusive with {@link FrameworkOptions.middleware.corsOriginModule }.; middleware.corsOriginModule?: string (optional) — Path to a module that default-exports `(origin: string) => string | undefined`. The generated entry imports the module — the callback is never serialized — so it may close over module scope and import dependencies. Resolved with the same idiom as `appShell.import` (e.g. './app/cors-origin.ts'). Mutually exclusive with `corsOrigin`.; middleware.requestId?: boolean (optional) — Emit and honor a per-request id header.; middleware.logger?: boolean (optional) — Log each request through the built-in logger.; middleware.securityHeaders?: boolean (optional) — Attach the built-in security response headers.; middleware.csp?: { policy?: string; nonce?: boolean; reportOnly?: boolean; } (optional) — Content-Security-Policy emission: the policy string, nonce generation, and report-only mode.; middleware.use?: string[] (optional) — Fetch middleware chain (#858), composed around the framework handler in onion order (`use[0]` outermost), outside all built-in middleware above. Each entry is a MODULE PATH (same resolution idiom as `appShell.import`, e.g. './app/middleware/auth.ts') whose default export is a {@link Middleware}; the generated entry emits `import * as __mw_N from '<path>'` and composes `__mw_N.default` in configur…
packages/element/src/internal/protocol/framework.ts:166HYDRATION_STRATEGIES@openelement/element · rootconstpublic
Runtime list of supported hydration strategies; the single source of truth for the `HydrationStrategy` union. Consumed by island/registry validation and re-exported from the element root for app and build adapters.
readonly ["load", "idle", "visible", "only"] packages/element/src/internal/protocol/framework.ts:28HydrationStrategy@openelement/element · roottypepublic
Island hydration trigger: 'load' | 'idle' | 'visible' | 'only'.
"load" | "idle" | "visible" | "only" packages/element/src/internal/protocol/framework.ts:30IDLE_FALLBACK_TIMEOUT_MS@openelement/element · rootconstpublic
Idle-hydration scheduling fallback (milliseconds) when neither `requestIdleCallback` nor `requestAnimationFrame` is available.
50 packages/element/src/internal/protocol/policy.ts:70injectPropsSafe@openelement/element · rootfunctionpublic
Safely assign caller-supplied props onto a target object, skipping keys that could enable prototype pollution and tolerating read-only properties. The canonical guarded assigner for the canonical dangerous-key rule (#903, #1214): the
(target: Record<string, unknown>, props: Record<string, unknown>, tagName: string, log?: { warn(message: string): void; debug(message: string): void; }): void packages/element/src/internal/core/security.ts:116isDangerousKey@openelement/element · rootfunctionpublic
Shared dangerous-key predicate (#903, #1214). Prototype-internal keys must never be injected from untrusted props on ANY path: host prop collection (collectPublicProps / normalizePublicProps in props-utils.ts), guarded assignment (injectPropsSafe below — the SPA bootstrap page-projection write boundary in
(key: string): boolean packages/element/src/internal/core/security.ts:50IslandOptions@openelement/element · rootinterfacepublic
Per-island delivery options (hydration strategy, SSR/DSD participation).
IslandOptionshydrate?: "load" | "idle" | "visible" | "only" (optional) — Hydration strategy: - 'load': load immediately when module is imported - 'idle': defer to requestIdleCallback (default) - 'visible': use IntersectionObserver to defer until element is visible - 'only': client-only render, no DSD/SSR output Named `hydrate` to match `defineIslandConfig()` in the Router package — one option name across both packages.; dsd?: boolean (optional) — Whether to use DSD for SSR rendering of this island. Honored by the build-side island scan (via `defineIslandConfig`), not by `defineIsland()` itself: passing it in `IslandOptions` has no runtime effect.; ssr?: boolean (optional) — Whether this island may be admitted into server rendering. Like `dsd`, decided by the build-side island scan; inert when passed to `defineIsland()`.
packages/element/src/internal/protocol/island.ts:8isSafeAttributeName@openelement/element · rootfunctionpublic
Shared safe-attribute-name predicate (#1033). Attribute *names* are not escaped on any render path, so a name must be a valid HTML attribute name (blocks quote/space injection, #602) and must not be an event handler (`on*`, case-insensitive). render-ir.ts (silent skip) and Router tooling head-injection.ts (throw) enforce the same rule with different failure strategies; both delegate here so the boundary cannot diverge.
(name: string): boolean packages/element/src/internal/core/security.ts:62isValidTagName@openelement/element · rootfunctionpublic
Check if a tag name is a valid custom element name per HTML spec.
(tagName: string): boolean packages/element/src/internal/core/tag-utils.ts:43Loader@openelement/element · roottypepublic
Route loader: fetches data for a page route.
Loader<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:56LoaderContext@openelement/element · rootinterfacepublic
Context passed to a request-time ('dynamic') route loader.
LoaderContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:40LocalePath@openelement/element · rootinterfacepublic
Locale-aware resolved path contract.
LocalePathlocale: string (required); path: string (required); localizedPath: string (required); isDefaultLocalePath: boolean (required)
packages/element/src/internal/protocol/framework.ts:81Logger@openelement/element · rootinterfacepublic
logger.ts - Tagged console logger. Lightweight scoped logger. Returns plain functions so it is tree-shakable and has zero class overhead.
Loggerdebug: (msg: string, ...args: unknown[]) => void (required); info: (msg: string, ...args: unknown[]) => void (required); warn: (msg: string, ...args: unknown[]) => void (required); error: (msg: string, ...args: unknown[]) => void (required)
packages/element/src/internal/core/logger.ts:10MAX_ACTION_BODY_BYTES@openelement/element · rootconstpublic
Request-body bound (bytes) the generated entry applies to action POST routes; larger uploads belong on API routes with explicit limits.
number packages/element/src/internal/protocol/policy.ts:57MAX_COMPOSITION_DEPTH@openelement/element · rootconstpublic
Nested element expansion depth bound for `renderDsd`: cyclic component composition fails closed instead of recursing without end.
8 packages/element/src/internal/protocol/policy.ts:51Middleware@openelement/element · roottypepublic
Fetch middleware contract (#858): WinterCG shape, dialect-free — no Hono/h3 context object. Composed at the handler boundary in onion order (`use[0]` is outermost: it sees the request first and the response last), so it runs with identical semantics in the dev server, the `start` CLI, the e2e fixture server, and the Nitro production entry. A middleware may short-circuit by returning a Response without calling `next()`, or post-process the Response that `next()` returns. Module contract: a Middleware is the DEFAULT EXPORT of a module referenced from `middleware.use` by path (e.g. './app/middleware/auth.ts'). The generated server entry imports the module, so the middleware may close over module scope and import local helpers and third-party packages — it is a real module in the server module graph, never serialized source.
Middleware packages/element/src/internal/protocol/framework.ts:154OpenElement@openelement/element · rootclasspublic
Custom Element base class for the compiled Part Program architecture. Subclasses are produced by the compiler; hand-written subclasses that never pass through the compiler fail closed at connect time.
class OpenElement extends OpenElementConfiguration packages/element/src/open-element-implementation.ts:89OpenElementAttribute@openelement/element · rootinterfacepublic
One documented attribute of a custom element declaration.
OpenElementAttributename: string (required); type?: string (optional); default?: string (optional); description?: string (optional); reflects?: boolean (optional); fieldName?: string (optional)
packages/element/src/internal/protocol/manifest.ts:10OpenElementCssPart@openelement/element · rootinterfacepublic
One documented CSS part of a custom element declaration.
OpenElementCssPartname: string (required); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:33OpenElementDeclaration@openelement/element · rootinterfacepublic
One custom element declaration in a package manifest: tag, members and delivery metadata.
OpenElementDeclarationtagName: string (required); className?: string (optional); superclassName?: string (optional); attributes?: OpenElementAttribute[] (optional); events?: OpenElementEvent[] (optional); slots?: OpenElementSlot[] (optional); cssParts?: OpenElementCssPart[] (optional); openElement.ssr?: boolean (optional); openElement.dsd?: boolean (optional); openElement.layer?: ComponentLayer (optional); openElement.hydrate?: "load" | "idle" | "visible" | "only" (optional); openElement.status?: "stable" | "experimental" (optional) — Stability marker from the owning package's manifest policy.; openElement.module?: string (optional); openElement.export?: string (optional); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:50OpenElementError@openelement/element · rootclasspublic
Framework error carrying a stable code, severity, phase and recoverability contract.
class OpenElementError extends Error packages/element/src/internal/protocol/errors.ts:78OpenElementEvent@openelement/element · rootinterfacepublic
One documented custom event of a custom element declaration.
OpenElementEventname: string (required); type?: string (optional); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:20OpenElementPackageManifest@openelement/element · rootinterfacepublic
Package manifest of component declarations (not a Custom Elements Manifest).
OpenElementPackageManifestschemaVersion: string (required); packageName: string (required); version: string (required); description?: string (optional); author?: string (optional); license?: string (optional); homepage?: string (optional); repository?: string (optional); declarations: OpenElementDeclaration[] (required)
packages/element/src/internal/protocol/manifest.ts:63OpenElementRouteKind@openelement/element · roottypepublic
Host-agnostic route and asset contracts shared by app and build drivers.
OpenElementRouteKind packages/element/src/internal/protocol/app-model.ts:2OpenElementRouteNode@openelement/element · rootinterfacepublic
One node of the host-agnostic route tree: the matched URL `path` and route kind, the source and module paths the drivers resolve, the optional registered tag and param names, and the nested `children`.
OpenElementRouteNodekind: OpenElementRouteKind (required); path: string (required); filePath?: string (optional); importPath?: string (optional); tagName?: string (optional); paramNames?: string[] (optional); children?: OpenElementRouteNode[] (optional); meta?: Record<string, unknown> (optional)
packages/element/src/internal/protocol/app-model.ts:9OpenElementSlot@openelement/element · rootinterfacepublic
One documented slot of a custom element declaration.
OpenElementSlotname: string (required); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:27ProblemDetails@openelement/element · rootinterfacepublic
RFC 9457 Problem Details document (#863): the action error channel answers `application/problem+json` instead of the bespoke `{ type: 'error', error: { message } }` JSON, so HTTP tooling recognizes failures natively. With `type: 'about:blank'`, `title` is the HTTP reason phrase and `detail` carries the specific explanation. The wire shape is alpha-unfrozen; the 1.0 acceptance freezes it in this problem+json form.
ProblemDetailstype: string (required) — URI reference identifying the problem type; 'about:blank' when none applies.; title: string (required) — Short human-readable summary (the HTTP reason phrase for 'about:blank').; status.toString: (radix?: number) => string (required) — Returns a string representation of an object.; status.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; status.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; status.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; status.valueOf: () => number (required) — Returns the primitive value of the specified object.; status.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; detail?: string (optional) — Human-readable explanation specific to this occurrence.
packages/element/src/internal/protocol/data.ts:96property@openelement/element · rootfunctionpublic
Compiler-recognized property decorator; inert no-op at runtime.
(_options: { reflect: boolean; attribute?: false | string; type?: unknown; converter?: unknown; }): (target: unknown, context?: unknown) => voidreflect: boolean (required); attribute?: string | false (optional); type?: unknown (optional); converter?: unknown (optional)
packages/element/src/internal/core/compile-decorators.ts:34provideContext@openelement/element · rootfunctionpublic
Provide a plain protocol value; the provider Signal remains OE-private.
<T>(host: HTMLElement, context: Context<T>, value: T): Unsubscribe packages/element/src/internal/core/signal-context.ts:107ReadonlySignal@openelement/element · rootinterfacepublic
Read-only signal protocol used by computed values.
ReadonlySignal<T>value: T (required); subscribe: (fn: (value: T) => void) => Unsubscribe (required); __@[email protected]: () => boolean (required) — Returns the primitive value of the specified object.
packages/element/src/internal/protocol/signal.ts:26renderDsd@openelement/element · rootfunctionpublic
Server-render one compiled element through canonical Element composition.
(input: string | CustomElementConstructor, options?: RenderDsdOptions): RenderOutput packages/element/src/public-runtime.ts:698RenderDsdOptions@openelement/element · rootinterfacepublic
Options for one `renderDsd()` call: the compiled component class to serialize, the values projected onto its compiled properties, optional route/source diagnostics metadata, the nested compiled tags the build admitted, and trusted parent-owned light children keyed by slot name.
RenderDsdOptionscomponentClass?: CustomElementConstructor (optional); props?: Record<string, unknown> (optional); sourceInfo.route?: string (optional); sourceInfo.source?: string (optional); ssrRenderableTags?: readonly string[] (optional) — Build-admitted nested compiled tags. Omitted means shell-only rendering.; projectedChildren?: ReadonlyMap<string, TrustedHtml> (optional) — Trusted parent-owned light children keyed by slot name.
packages/element/src/public-runtime.ts:138RenderError@openelement/element · rootclasspublic
Recoverable render-phase error carrying the failing component path and tag.
class RenderError extends OpenElementError packages/element/src/internal/core/errors.ts:91RenderOutput@openelement/element · rootinterfacepublic
The public result of one `renderDsd()` call: the serialized DSD `html`, the render errors collected while composing it (empty on success), the render metrics for the root component, and the hydration hints the client scheduler reads to upgrade islands.
RenderOutputhtml: string (required); errors: RenderError[] (required); metrics: DsdRenderMetrics (required); hydrationHints: HydrationHint[] (required)
packages/element/src/internal/protocol/render.ts:32reportError@openelement/element · rootfunctionpublic
Report an {@linkcode OpenElementError} to the telemetry hook, or console.error when none is installed.
(error: OpenElementError): voidcode: string (required); severity: ErrorSeverity (required); phase: ErrorPhase (required); recoverable: boolean (required); statusCode.toString: (radix?: number) => string (required) — Returns a string representation of an object.; statusCode.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; statusCode.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; statusCode.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; statusCode.valueOf: () => number (required) — Returns the primitive value of the specified object.; statusCode.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; toJSON: () => Record<string, unknown> (required); name: string (required); message: string (required); stack?: string (optional); cause?: unknown (optional)
packages/element/src/internal/core/errors.ts:135RouteEntry@openelement/element · rootinterfacepublic
One route admitted by the scanner: URL `path`, source `filePath`, the route `type`, the generated variable name (`varName`) the entry binds it to, and the optional registration tag. {@link RouteEntry.definePage} and {@link RouteEntry.hasEnhancedForms} carry the two source-derived admission facts the generated entries branch on.
RouteEntrypath: string (required); filePath: string (required); type: "page" | "api" | "island" | "special" (required); varName: string (required); tagName?: string (optional); definePage?: boolean (optional) — True when the route module's default export is a definePage() definition (#960 — registration decoupling). The generated entry registers the page class under the path-derived fallback tag and IGNORES the tagName export for registration: on a definePage route the export only names a content element. Plain element routes keep tagName as their registration tag.; source?: string (optional) — Source text captured during scanning when includeSource is enabled.; hasEnhancedForms?: boolean (optional) — True when the page route source carries data-open-enhance (#569): the client entry must ship the form-enhancement layer even when the app has zero islands.; special?: SpecialFileType (optional); params?: string[] (optional)
packages/element/src/internal/protocol/framework.ts:109ServerRouteContext@openelement/element · rootinterfacepublic
Canonical request-time/SSG server route context.
ServerRouteContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:25setErrorTelemetryHook@openelement/element · rootfunctionpublic
Install the process-wide error telemetry hook (replaceable for tests, HMR, multi-app pages).
(hook: ErrorTelemetryHook): void packages/element/src/internal/core/errors.ts:123signal@openelement/element · rootfunctionpublic
Create a writable signal through the selected signal engine.
<T>(initialValue: T): WritableSignal<T> packages/element/src/internal/signal/framework.ts:19Signal@openelement/element · roottypepublic
Alias for APIs that accept either writable or read-only signals.
Signal<T> packages/element/src/internal/protocol/signal.ts:31SpecialFileType@openelement/element · roottypepublic
Special file kinds the route scanner recognizes by filename: `renderer` and `middleware`.
SpecialFileType packages/element/src/internal/protocol/framework.ts:78SsrAdmissionDecision@openelement/element · rootinterfacepublic
The build's admission verdict for one discovered tag: where the declaration lives (`modulePath`), how it was discovered (`source`), which render path it is admitted to, and the reason recorded for the manifest.
SsrAdmissionDecisiontagName: string (required); modulePath: string (required) — Module path of the island declaration. Empty for 'foreign' decisions: a foreign tag is consumed in JSX but declares no module the build owns.; source: "local" | "package" | "nested" | "foreign" (required) — 'foreign' (#979, 0.43.0-alpha.2): a third-party WC tag discovered by the foreign-tag scanner in page/island JSX — recorded for visibility only; SSR still treats it as an opaque passthrough (renderPath 'client-only').; renderPath: "ssr+client" | "client-only" | "rejected" (required); reason: string (required)
packages/element/src/internal/protocol/render.ts:53STREAM_FRAME_UNSAFE_URL@openelement/element · rootconstpublic
Schemes that make a URL attribute unsafe in a streamed frame.
RegExp packages/element/src/internal/protocol/stream-frame-policy.ts:60STREAM_FRAME_URL_ATTRIBUTES@openelement/element · rootconstpublic
URL-carrying attributes the frame check screens for script-bearing scheme obfuscation; only these attribute names are value-screened.
readonly ["href", "src", "action", "formaction", "xlink:href"] packages/element/src/internal/protocol/stream-frame-policy.ts:42STREAM_FRAME_URL_CONTROL_MAX@openelement/element · rootconstpublic
Control characters at or below this code point are stripped before the URL-scheme test, so tab/newline/control obfuscation cannot smuggle a scheme past admission.
32 packages/element/src/internal/protocol/stream-frame-policy.ts:55STREAM_MAX_FIELDS@openelement/element · rootconstpublic
Deferred fields (declared streamed properties) one stream route's manifest may carry. The build scan, the server executor, and the browser seed contract enforce the same bound.
32 packages/element/src/internal/protocol/policy.ts:24STREAM_MAX_OWNERS@openelement/element · rootconstpublic
Part/Region owners one stream route's manifest may address in total across all deferred fields.
64 packages/element/src/internal/protocol/policy.ts:30STREAM_MAX_PAYLOAD_LENGTH@openelement/element · rootconstpublic
Serialized stream payload bound, as a string length in UTF-16 code units: one seed attribute or one deferred frame's markup may not exceed it. The server checks the JSON text and the rendered range before emitting; the browser checks the attribute before parsing.
number packages/element/src/internal/protocol/policy.ts:45STREAM_MAX_SEED_PROPERTIES@openelement/element · rootconstpublic
Typed properties one streamed seed may carry: the browser seed contract rejects the WHOLE seed above this count, so an oversized component would silently fail to hydrate instead of failing loud at the server.
64 packages/element/src/internal/protocol/policy.ts:37STREAM_TIMEOUT_MS@openelement/element · rootconstpublic
Deferred-field resolution budget (milliseconds) for one streamed response: fields still pending when it expires are failed in place and the stream ends with the shell and whatever resolved.
30000 packages/element/src/internal/protocol/policy.ts:64StyleSheet@openelement/element · rootconstpublic
Cross-realm StyleSheet constructor: the native CSSStyleSheet or the internal shim.
new () => StyleSheetLike packages/element/src/internal/core/style-sheet.ts:67StyleSheetLike@openelement/element · rootinterfacepublic
Minimal stylesheet contract (replaceSync + cssRules) satisfied by native and shim sheets.
StyleSheetLikereplaceSync: (text: string) => void (required); cssRules: StyleSheetRule[] (required)
packages/element/src/internal/protocol/style-sheet.ts:14trustedHtml@openelement/element · rootfunctionpublic
Mark an HTML string as trusted for explicit `innerHTML` sinks (the trust does not serialize).
(html: string): TrustedHtml packages/element/src/internal/core/security.ts:83TrustedHtml@openelement/element · rootinterfacepublic
Opaque capability marking HTML the application has explicitly vetted as trusted.
TrustedHtmlhtml: string (required)
packages/element/src/internal/core/security.ts:78unsafeStreamFrameAttribute@openelement/element · rootfunctionpublic
Whether a static attribute (name/value as authored into the Part Program) makes a streamed frame unsafely installable: event-handler, seed-spoofing, and srcdoc names fail outright, and URL-carrying names fail when the entity-decoded, control-stripped value carries a script scheme.
(name: string, value: string): boolean packages/element/src/internal/protocol/stream-frame-policy.ts:115wrapInDocument@openelement/element · rootfunctionpublic
Wrap rendered HTML in a full HTML document. Adds DOCTYPE, head (title, meta, preload), and body. Supports CSP nonce and dev scripts (e.g. Vite client, route module registration).
(html: string, options?: DocumentWrapOptions): string packages/element/src/internal/core/html-escape.ts:109assertValidTagName@openelement/element · ./authoringfunctionpublic
Assert that a tag name is a valid custom element name.
(tagName: string): void packages/element/src/internal/core/tag-utils.ts:55DANGEROUS_KEYS@openelement/element · ./authoringconstpublic
Object prototype keys that must never be injected from untrusted props.
ReadonlySet<string> packages/element/src/internal/core/security.ts:24ERROR_PREFIX@openelement/element · ./authoringconstpublic
Error message prefix for all openElement errors.
"[openElement]" packages/element/src/internal/protocol/errors.ts:53HYDRATION_STRATEGIES@openelement/element · ./authoringconstpublic
Runtime list of supported hydration strategies; the single source of truth for the `HydrationStrategy` union. Consumed by island/registry validation and re-exported from the element root for app and build adapters.
readonly ["load", "idle", "visible", "only"] packages/element/src/internal/protocol/framework.ts:28HydrationStrategy@openelement/element · ./authoringtypepublic
Island hydration trigger: 'load' | 'idle' | 'visible' | 'only'.
"load" | "idle" | "visible" | "only" packages/element/src/internal/protocol/framework.ts:30injectPropsSafe@openelement/element · ./authoringfunctionpublic
Safely assign caller-supplied props onto a target object, skipping keys that could enable prototype pollution and tolerating read-only properties. The canonical guarded assigner for the canonical dangerous-key rule (#903, #1214): the
(target: Record<string, unknown>, props: Record<string, unknown>, tagName: string, log?: { warn(message: string): void; debug(message: string): void; }): void packages/element/src/internal/core/security.ts:116isDangerousKey@openelement/element · ./authoringfunctionpublic
Shared dangerous-key predicate (#903, #1214). Prototype-internal keys must never be injected from untrusted props on ANY path: host prop collection (collectPublicProps / normalizePublicProps in props-utils.ts), guarded assignment (injectPropsSafe below — the SPA bootstrap page-projection write boundary in
(key: string): boolean packages/element/src/internal/core/security.ts:50isSafeAttributeName@openelement/element · ./authoringfunctionpublic
Shared safe-attribute-name predicate (#1033). Attribute *names* are not escaped on any render path, so a name must be a valid HTML attribute name (blocks quote/space injection, #602) and must not be an event handler (`on*`, case-insensitive). render-ir.ts (silent skip) and Router tooling head-injection.ts (throw) enforce the same rule with different failure strategies; both delegate here so the boundary cannot diverge.
(name: string): boolean packages/element/src/internal/core/security.ts:62isValidTagName@openelement/element · ./authoringfunctionpublic
Check if a tag name is a valid custom element name per HTML spec.
(tagName: string): boolean packages/element/src/internal/core/tag-utils.ts:43MAX_ACTION_BODY_BYTES@openelement/element · ./authoringconstpublic
Request-body bound (bytes) the generated entry applies to action POST routes; larger uploads belong on API routes with explicit limits.
number packages/element/src/internal/protocol/policy.ts:57OpenElementError@openelement/element · ./authoringclasspublic
Framework error carrying a stable code, severity, phase and recoverability contract.
class OpenElementError extends Error packages/element/src/internal/protocol/errors.ts:78STREAM_FRAME_UNSAFE_URL@openelement/element · ./authoringconstpublic
Schemes that make a URL attribute unsafe in a streamed frame.
RegExp packages/element/src/internal/protocol/stream-frame-policy.ts:60STREAM_FRAME_URL_ATTRIBUTES@openelement/element · ./authoringconstpublic
URL-carrying attributes the frame check screens for script-bearing scheme obfuscation; only these attribute names are value-screened.
readonly ["href", "src", "action", "formaction", "xlink:href"] packages/element/src/internal/protocol/stream-frame-policy.ts:42STREAM_FRAME_URL_CONTROL_MAX@openelement/element · ./authoringconstpublic
Control characters at or below this code point are stripped before the URL-scheme test, so tab/newline/control obfuscation cannot smuggle a scheme past admission.
32 packages/element/src/internal/protocol/stream-frame-policy.ts:55STREAM_MAX_FIELDS@openelement/element · ./authoringconstpublic
Deferred fields (declared streamed properties) one stream route's manifest may carry. The build scan, the server executor, and the browser seed contract enforce the same bound.
32 packages/element/src/internal/protocol/policy.ts:24STREAM_MAX_OWNERS@openelement/element · ./authoringconstpublic
Part/Region owners one stream route's manifest may address in total across all deferred fields.
64 packages/element/src/internal/protocol/policy.ts:30STREAM_MAX_PAYLOAD_LENGTH@openelement/element · ./authoringconstpublic
Serialized stream payload bound, as a string length in UTF-16 code units: one seed attribute or one deferred frame's markup may not exceed it. The server checks the JSON text and the rendered range before emitting; the browser checks the attribute before parsing.
number packages/element/src/internal/protocol/policy.ts:45STREAM_MAX_SEED_PROPERTIES@openelement/element · ./authoringconstpublic
Typed properties one streamed seed may carry: the browser seed contract rejects the WHOLE seed above this count, so an oversized component would silently fail to hydrate instead of failing loud at the server.
64 packages/element/src/internal/protocol/policy.ts:37STREAM_TIMEOUT_MS@openelement/element · ./authoringconstpublic
Deferred-field resolution budget (milliseconds) for one streamed response: fields still pending when it expires are failed in place and the stream ends with the shell and whatever resolved.
30000 packages/element/src/internal/protocol/policy.ts:64composeFetchMiddleware@openelement/element · ./build-utilsfunctionpublic
Compose a fetch middleware chain (#858) around a handler, in onion order: `middleware[0]` is outermost — it sees the request first and the response last. A middleware may short-circuit by returning a Response without calling `next()`. Extra arguments (runtime context such as env/platform) thread transparently past the middleware chain to the terminal handler — the WinterCG-shaped middleware itself only ever sees `(request, next)`. Generated server entries call this once at module scope so the dev server, the `start` CLI, the e2e fixture server, and the Nitro production entry all share the same composed handler.
<Args extends unknown[]>(middleware: Middleware[], handler: (request: Request, ...args: Args) => Promise<Response>): (request: Request, ...args: Args) => Promise<Response> packages/element/src/internal/core/runtime.ts:47createRuntimeAdapter@openelement/element · ./build-utilsfunctionpublic
Normalize a runtime adapter declaration: pass the name, fetch handler and optional prerender iterator through unchanged so a host integration only implements the {@link RuntimeAdapter} contract it needs.
<Env extends Record<string, unknown> = Record<string, unknown>>(options: RuntimeAdapterOptions<Env>): RuntimeAdapter<Env>name: string (required); fetch: OpenElementRequestHandler<Env> (required); prerender?: (() => AsyncIterable<RuntimePrerenderResult> | Iterable<RuntimePrerenderResult>) (optional)
packages/element/src/internal/core/runtime.ts:23insertBeforeBodyClose@openelement/element · ./build-utilsfunctionpublic
Insert markup before a tolerant HTML body close (`</body >`, case-insensitive).
(html: string, content: string): string packages/element/src/internal/core/html-route-utils.ts:2normalizeSeparators@openelement/element · ./build-utilsfunctionpublic
Normalize path separators and collapse duplicates. - Backslashes and forward slashes are replaced with the chosen separator. - Repeated separators are collapsed to a single separator.
(path: string, sep?: "/" | "-"): string packages/element/src/internal/core/path-utils.ts:17OpenElementRequestHandler@openelement/element · ./build-utilstypepublic
The host-neutral request handler every runtime adapter and generated server entry exposes: a WinterCG `(request, context?) => Response` with no server engine dialect baked in.
OpenElementRequestHandler<Env> packages/element/src/internal/protocol/runtime.ts:27pathToTagName@openelement/element · ./build-utilsfunctionpublic
Convert a file path into a kebab-cased custom element tag name. - Removes a leading `./` or `/`. - Strips known file extensions (`ts`, `tsx`, `js`, `jsx`, `mjs`, `mdx`). - Replaces directory separators with hyphens. - Ensures the result starts with a letter and contains at least one hyphen.
(filePath: string): string packages/element/src/internal/core/path-utils.ts:32RuntimeContext@openelement/element · ./build-utilsinterfacepublic
runtime.ts - Runtime adapter protocol. Replacement boundary for Nitro, Workers, Node, Deno, or future fetch-compatible runtimes. Preserves openElement semantics while leaving concrete server engines outside this package.
RuntimeContext<Env>env?: Env (optional); platform?: unknown (optional); params?: Record<string, string> (optional)
packages/element/src/internal/protocol/runtime.ts:9SsrRenderError@openelement/element · ./build-utilsclasspublic
Thrown by the SSG build pipeline when the SSR bundle fails to load or the pipeline throws; re-exported via `@openelement/element/build-utils`. Carries the failing component path plus the original error as `cause`.
class SsrRenderError extends OpenElementError packages/element/src/internal/core/errors.ts:70Action@openelement/element · ./client-onlytypepublic
Route action: handles form submissions for a page route.
Action<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:64ActionContext@openelement/element · ./client-onlyinterfacepublic
Context passed to a route action function (extends loader context).
ActionContext<Env, Platform, Route>formData: FormData (required); request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:47ActionResult@openelement/element · ./client-onlytypepublic
Wire shape returned to the JavaScript form-enhancement path. The no-JS path never sees this: it gets the equivalent semantics as plain HTTP (303 on success, 422 with the re-rendered form on validation failure, redirect/error as status codes). Error outcomes (CSRF 403, unknown action 404, unparseable body 400, unexpected 500) are NOT part of this union: since #863 they answer RFC 9457 Problem Details with the PROBLEM_JSON_MEDIA_TYPE content type — see ProblemDetails.
ActionResult<Success, Failure> packages/element/src/internal/protocol/data.ts:82AppShellConfig@openelement/element · ./client-onlytypepublic
Application shell declaration: `false` disables the shell entirely, `'default'` uses the built-in shell, and the object form names a tag with the module path that defines it (`import`, resolved like a {@link FrameworkOptions.middleware.use } entry) plus the compiled shell properties the router injects per route.
AppShellConfig packages/element/src/internal/protocol/framework.ts:95assertValidTagName@openelement/element · ./client-onlyfunctionpublic
Assert that a tag name is a valid custom element name.
(tagName: string): void packages/element/src/internal/core/tag-utils.ts:55collectPublicProps@openelement/element · ./client-onlyfunctionpublic
Collect all public (non-internal) own properties from a host object. Keys starting with `__openElement` are framework-internal and excluded. Uses Reflect.get for safe access (respects getters); a getter that throws is skipped with a warning so one bad prop cannot take the tree down.
(host: object): Record<string, unknown> packages/element/src/internal/core/props-utils.ts:41CompatibilityClassification@openelement/element · ./client-onlyinterfacepublic
The per-tag verdict the compatibility scanner records: the tier a discovered tag was classified as, the human-readable `reason`, where the tag was found (`source`), and the SSR/DSD/hydration facts the verdict was derived from.
CompatibilityClassificationtagName: string (required); tier: CompatibilityTier (required); reason: string (required); source: "local" | "package" | "nested" (required); modulePath?: string (optional); ssr?: boolean (optional); dsd?: boolean (optional); hydrate?: string (optional)
packages/element/src/internal/protocol/framework.ts:320CompatibilityTier@openelement/element · ./client-onlytypepublic
How far a discovered tag may participate in the build: 'ssr-capable' renders and hydrates, 'client-only' ships to the browser without server output, 'experimental-dom' is admitted with a downgraded guarantee, and 'rejected' fails the build.
CompatibilityTier packages/element/src/internal/protocol/framework.ts:313ComponentLayer@openelement/element · ./client-onlytypepublic
The delivery layer a component belongs to: fully static DSD markup ('dsd-static'), DSD markup with a client island ('dsd-interactive'), a client-only island with no SSR output ('pure-island'), or a light-DOM element ('light-dom'). Recorded per component in the build manifest and consumed by the hydration scheduler.
ComponentLayer packages/element/src/internal/protocol/framework.ts:23computed@openelement/element · ./client-onlyfunctionpublic
Create a derived read-only signal recomputed from its dependencies.
<T>(fn: () => T): ReadonlySignal<T> packages/element/src/internal/signal/framework.ts:23consumeContext@openelement/element · ./client-onlyfunctionpublic
Consumer-local reactive projection of a protocol context value.
<T>(context: Context<T>, host?: HTMLElement): WritableSignal<T>key.toString: () => string (required) — Returns a string representation of an object.; key.valueOf: () => symbol (required) — Returns the primitive value of the specified object.; key.description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; key.__@toPrimitive@1741: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; key.__@toStringTag@1743: string (required); defaultValue: T (required)
packages/element/src/internal/core/signal-context.ts:143Context@openelement/element · ./client-onlyinterfacepublic
A typed context token: protocol identity (`key`) plus its default value.
Context<T>key.toString: () => string (required) — Returns a string representation of an object.; key.valueOf: () => symbol (required) — Returns the primitive value of the specified object.; key.description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; key.__@toPrimitive@1741: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; key.__@toStringTag@1743: string (required); defaultValue: T (required)
packages/element/src/internal/core/signal-context.ts:13createContext@openelement/element · ./client-onlyfunctionpublic
Create a typed context token shared between provider and consumer elements.
<T>(key: symbol, defaultValue: T): Context<T>toString: () => string (required) — Returns a string representation of an object.; valueOf: () => symbol (required) — Returns the primitive value of the specified object.; description: string (required) — Expose the [[Description]] internal slot of a symbol directly.; __@toPrimitive@1741: (hint: string) => symbol (required) — Converts a Symbol object to a symbol.; __@toStringTag@1743: string (required)
packages/element/src/internal/core/signal-context.ts:58createDeferredDsdExecutor@openelement/element · ./client-onlyfunctionpublic
Create one request-local deferred shell from a generated route manifest. The manifest hash is checked against the exact runtime wire program before any shell can be produced.
(options: CreateDeferredDsdOptions): Promise<DeferredDsdExecutor>componentClass: CustomElementConstructor (required); props?: Record<string, unknown> (optional); manifest: DeferredDsdManifest (required); instanceId: string (required); documentToken?: string (optional)
packages/element/src/public-runtime.ts:353CreateDeferredDsdOptions@openelement/element · ./client-onlyinterfacepublic
Inputs for a request-scoped deferred DSD server executor.
CreateDeferredDsdOptionscomponentClass: CustomElementConstructor (required); props?: Record<string, unknown> (optional); manifest: DeferredDsdManifest (required); instanceId: string (required); documentToken?: string (optional)
packages/element/src/public-runtime.ts:282createLogger@openelement/element · ./client-onlyfunctionpublic
Create a {@link Logger} that prefixes every message with `[tag]`.
(tag: string): Logger packages/element/src/internal/core/logger.ts:18DANGEROUS_KEYS@openelement/element · ./client-onlyconstpublic
Object prototype keys that must never be injected from untrusted props.
ReadonlySet<string> packages/element/src/internal/core/security.ts:24deepGetElementById@openelement/element · ./client-onlyfunctionpublic
Resolve `id` (a `#hash` or bare id) against `root` and, when the id is not in that root's own tree, recurse into every nested shadow root. Returns the first match or `null`; a malformed percent-encoded id is not an error.
(id: string, root?: Document | ShadowRoot): HTMLElement | null packages/element/src/internal/core/deep-fragment.ts:20DeferredDsdExecutor@openelement/element · ./client-onlyinterfacepublic
Initial shell, typed seed, and bounded updates for a deferred DSD request.
DeferredDsdExecutorshell: string (required); owner: DeferredServerOwner (required); seed: Record<string, { state: "resolved"; type: string; value: unknown; } | { state: "pending"; type: string; } | { state: "missing"; type: string; }> (required); resolvedValue: (field: string, value: unknown) => unknown (required); serializeResolved: (field: string, value: unknown) => string[] (required)
packages/element/src/public-runtime.ts:291DeferredDsdManifest@openelement/element · ./client-onlyinterfacepublic
Maps route-local deferred fields to the compiled Part or Region owners they update.
DeferredDsdManifestprogram: { version: number; tag: string; sha256: string; } (required); fields: readonly { field: string; signal: string; owners: readonly { kind: "part" | "region"; index: number; }[]; }[] (required)
packages/element/src/public-runtime.ts:272documentStreamParts@openelement/element · ./client-onlyfunctionpublic
The same document serialization boundary, with only body wrappers left open.
(options?: DocumentWrapOptions): { prefix: string; suffix: string; }title?: string (optional); lang?: string (optional); clientScript?: string (optional); scripts?: DocumentScriptDescriptor[] (optional); meta.description?: string (optional); meta.tags?: Record<string, string | number | boolean>[] (optional); devScripts?: string (optional); headExtras?: string (optional); dangerouslyHeadFragments?: string[] (optional); allowHeadExtrasScripts?: boolean (optional); links?: { rel: string; href: string; hreflang?: string; }[] (optional); structuredData?: readonly Record<string, unknown>[] (optional); cspNonce?: string (optional); streamBootstrap?: string (optional) — Trusted framework bootstrap emitted synchronously in the document head.
packages/element/src/internal/core/html-escape.ts:118effect@openelement/element · ./client-onlyfunctionpublic
Run a side effect that re-subscribes whenever its signal dependencies change.
(fn: () => void | Unsubscribe): Unsubscribe packages/element/src/internal/signal/framework.ts:27element@openelement/element · ./client-onlyfunctionpublic
Compiler-recognized element decorator; inert no-op at runtime.
(_tag: string, _options?: { root?: "light" | "shadow-open" | "shadow-closed"; delegatesFocus?: boolean; formAssociated?: boolean; }): (target: unknown, context?: unknown) => void packages/element/src/internal/core/compile-decorators.ts:20ensureDeepFragmentNavigation@openelement/element · ./client-onlyfunctionpublic
Install (once per document) framework-level fragment navigation: a same-document anchor click whose target lives inside a nested shadow root scrolls to it and pushes the hash instead of being dropped by the browser. `{ enabled: false }` opts an application out.
(options?: DeepFragmentOptions): voidenabled?: boolean (optional) — Set false before installation to opt out for an application.
packages/element/src/internal/core/deep-fragment.ts:67ensurePreHydrationClickCapture@openelement/element · ./client-onlyfunctionpublic
Install the bounded pre-upgrade interaction capture on an owning root (default: the document). Generated client entries call this with their declared island tags before any compiled element upgrades; after a successful claim the element replays the captured events whose targets live inside its root (compiled claim capture/replay, internal/compiled/runtime.ts). Idempotent per root (repeat calls merge tags, never reinstall listeners) and a no-op where no DOM exists (SSR). Invariant: the capture itself — one fixed listener set per owning root, installed once per page — is page-lifetime by design and is NOT the leak. The M1 leak was retained event-target records; each element releases exactly its own records at its activation decision (success or failure), while records owned by still-pending elements survive for their delayed/lazy upgrade (#1170). Boundedness: the facade capture passes the declared-island filter, so only interactions under a still-pending DECLARED island tag enter the queue — ordinary events and undeclared third-party custom elements are skipped (nested pending declared islands still capture through their own unsettled host). With no tags declared the legacy dash heuristic applies. The queue additionally carries a hard capacity cap (fail closed) and every release sweeps detached targets, so post-hydration traffic and removals never grow retention.
(root?: EventTarget, pendingTags?: readonly string[]): voidaddEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: AddEventListenerOptions | boolean) => void (required) — The **`addEventListener()`** method of the EventTarget interface sets up a function that will be called whenever the specified event is delivered to the target. [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/addEventListener); dispatchEvent: (event: Event) => boolean (required) — The **`dispatchEvent()`** method of the EventTarget sends an Event to the object, (synchronously) invoking the affected event listeners in the appropriate order. The normal event processing rules (including the capturing and optional bubbling phase) also apply to events dispatched manually with dispatchEvent(). [MDN Reference](https://developer.mozilla.org/docs/Web/API/EventTarget/dispatchEvent); removeEventListener: (type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean) => void (required) — The **`removeEventListener()`** method of the EventTarget interface removes an event listener previously registered with EventTarget.addEventListener() from the target. The event listener to be removed is identified using a combination of the event type, the event listener function itself, and various optional options that may affect the matching process; see Matching event listeners for removal.…
packages/element/src/internal/compiled/runtime/pre-upgrade-events.ts:509ERROR_PREFIX@openelement/element · ./client-onlyconstpublic
Error message prefix for all openElement errors.
"[openElement]" packages/element/src/internal/protocol/errors.ts:53ErrorBoundary@openelement/element · ./client-onlyclasspublic
Base class for elements that catch descendant render/hydration errors and apply a retry policy.
class ErrorBoundary extends OpenElement packages/element/src/error-boundary.ts:27ErrorTelemetryHook@openelement/element · ./client-onlytypepublic
Callback receiving every reported {@linkcode OpenElementError} for telemetry.
ErrorTelemetryHook packages/element/src/internal/protocol/errors.ts:110escapeAttr@openelement/element · ./client-onlyfunctionpublic
Escape an HTML attribute value. Delegates to `escapeHtml` so both share the single `ESCAPE_MAP` and the same single-pass replacement (consolidated in #633). Empty-value conventions remain intentionally distinct by design: - `escapeHtml` returns '' for non-string input. - `escapeAttrValue` (below) coerces via `String()` and is the boundary meant for unknown/variable attribute values.
(value: string): string packages/element/src/internal/core/html-escape.ts:53escapeHtml@openelement/element · ./client-onlyfunctionpublic
Escape the five HTML-significant characters in text content.
(str: string): string packages/element/src/internal/core/html-escape.ts:37FrameworkOptions@openelement/element · ./client-onlyinterfacepublic
The adapter-facing framework options: where routes, islands and components live, which renderer serializes pages, the application shell and layout declarations, the document `<html>`/head injection channels, and the request-time middleware switches. Every field is optional; the adapter applies its documented default. This is the type an application config file's default export is checked against, so the rendered option table and the actual config surface cannot drift.
FrameworkOptionsrenderer?: "native" | "lit" (optional) — Page renderer selection (Beta.2.2, #1339). EXPLICIT, never inferred: 'native' (default) renders pages through the compiled Part Program serializer (renderDsd); 'lit' renders LitElement pages through; routesDir?: string (optional) — Directory the route scanner walks, relative to the Vite root. Defaults to `app/routes`.; islandsDir?: string (optional) — Directory island modules are discovered in. Defaults to `app/islands`.; componentsDir?: string (optional) — Directory non-route components live in. Defaults to `app/components`.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits, e.g. `['@openelement/ui']`.; appShell?: AppShellConfig (optional) — Application shell declaration; `false` disables the shell, `'default'` uses the built-in one.; layouts?: LayoutsConfig (optional) — Per-layout shell declarations keyed by layout name.; mode?: "ssg" (optional) — Build mode. 'ssg' (default) generates static HTML.; headExtras?: string (optional) — @dangerous injected as-is, only use with controlled content; html.lang?: string (optional); html.title?: string (optional); inject.stylesheets?: (string | { href: string; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<string, string | number | boolean>; })[] (optional) — Stylesheets linked into the document head; each entry is an href or a link record with integrity/crossorigin/attrs.; inject.scripts?: (string | { src: string; type?: string; async?: boolean; defer?: boolean; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<str… (optional) — Scripts emitted into the document; each entry is a src or a script record with type/async/defer/integrity/crossorigin/attrs.; inject.headFragments?: string[] (optional) — @dangerous fragments injected as-is. Trust boundary (same level as `trustedHtml`): never concatenate user-controlled content into these fragments; sanitize untrusted data at your own system boundary first. The framework only enforces no-`<script>` and no-executable-`<style>`.; ssr.noExternal?: (string | RegExp)[] (optional); island.upgradeStrategy?: "load" | "idle" | "visible" | "only" (optional); build.outDir?: string (optional) — Output directory for the build artifacts. Defaults to `dist`.; build.manifestBudget?: { islandKB?: number; totalJsKB?: number; pageKB?: number; } (optional) — Advisory only: exceeded budgets print build-manifest warnings and never fail the build; enforce them in your own build-output test.; viewTransition?: boolean (optional) — Enable the View Transitions API for client navigations. Defaults to true.; speculation?: boolean | { prerender?: string[]; prefetch?: string[]; exclude?: string[]; eagerness?: "immediate" | "moderate" | "conservative"; } (optional) — Speculation Rules emission: `true` uses framework defaults, or pass prerender/prefetch URL lists, exclusions and an eagerness.; middleware.cors?: boolean (optional) — Enable the built-in CORS middleware.; middleware.corsOrigin?: string | string[] (optional) — Static CORS allowlist data, serialized into the generated entry as JSON. Mutually exclusive with {@link FrameworkOptions.middleware.corsOriginModule }.; middleware.corsOriginModule?: string (optional) — Path to a module that default-exports `(origin: string) => string | undefined`. The generated entry imports the module — the callback is never serialized — so it may close over module scope and import dependencies. Resolved with the same idiom as `appShell.import` (e.g. './app/cors-origin.ts'). Mutually exclusive with `corsOrigin`.; middleware.requestId?: boolean (optional) — Emit and honor a per-request id header.; middleware.logger?: boolean (optional) — Log each request through the built-in logger.; middleware.securityHeaders?: boolean (optional) — Attach the built-in security response headers.; middleware.csp?: { policy?: string; nonce?: boolean; reportOnly?: boolean; } (optional) — Content-Security-Policy emission: the policy string, nonce generation, and report-only mode.; middleware.use?: string[] (optional) — Fetch middleware chain (#858), composed around the framework handler in onion order (`use[0]` outermost), outside all built-in middleware above. Each entry is a MODULE PATH (same resolution idiom as `appShell.import`, e.g. './app/middleware/auth.ts') whose default export is a {@link Middleware}; the generated entry emits `import * as __mw_N from '<path>'` and composes `__mw_N.default` in configur…
packages/element/src/internal/protocol/framework.ts:166HYDRATION_STRATEGIES@openelement/element · ./client-onlyconstpublic
Runtime list of supported hydration strategies; the single source of truth for the `HydrationStrategy` union. Consumed by island/registry validation and re-exported from the element root for app and build adapters.
readonly ["load", "idle", "visible", "only"] packages/element/src/internal/protocol/framework.ts:28HydrationStrategy@openelement/element · ./client-onlytypepublic
Island hydration trigger: 'load' | 'idle' | 'visible' | 'only'.
"load" | "idle" | "visible" | "only" packages/element/src/internal/protocol/framework.ts:30IDLE_FALLBACK_TIMEOUT_MS@openelement/element · ./client-onlyconstpublic
Idle-hydration scheduling fallback (milliseconds) when neither `requestIdleCallback` nor `requestAnimationFrame` is available.
50 packages/element/src/internal/protocol/policy.ts:70injectPropsSafe@openelement/element · ./client-onlyfunctionpublic
Safely assign caller-supplied props onto a target object, skipping keys that could enable prototype pollution and tolerating read-only properties. The canonical guarded assigner for the canonical dangerous-key rule (#903, #1214): the
(target: Record<string, unknown>, props: Record<string, unknown>, tagName: string, log?: { warn(message: string): void; debug(message: string): void; }): void packages/element/src/internal/core/security.ts:116isDangerousKey@openelement/element · ./client-onlyfunctionpublic
Shared dangerous-key predicate (#903, #1214). Prototype-internal keys must never be injected from untrusted props on ANY path: host prop collection (collectPublicProps / normalizePublicProps in props-utils.ts), guarded assignment (injectPropsSafe below — the SPA bootstrap page-projection write boundary in
(key: string): boolean packages/element/src/internal/core/security.ts:50IslandOptions@openelement/element · ./client-onlyinterfacepublic
Per-island delivery options (hydration strategy, SSR/DSD participation).
IslandOptionshydrate?: "load" | "idle" | "visible" | "only" (optional) — Hydration strategy: - 'load': load immediately when module is imported - 'idle': defer to requestIdleCallback (default) - 'visible': use IntersectionObserver to defer until element is visible - 'only': client-only render, no DSD/SSR output Named `hydrate` to match `defineIslandConfig()` in the Router package — one option name across both packages.; dsd?: boolean (optional) — Whether to use DSD for SSR rendering of this island. Honored by the build-side island scan (via `defineIslandConfig`), not by `defineIsland()` itself: passing it in `IslandOptions` has no runtime effect.; ssr?: boolean (optional) — Whether this island may be admitted into server rendering. Like `dsd`, decided by the build-side island scan; inert when passed to `defineIsland()`.
packages/element/src/internal/protocol/island.ts:8isSafeAttributeName@openelement/element · ./client-onlyfunctionpublic
Shared safe-attribute-name predicate (#1033). Attribute *names* are not escaped on any render path, so a name must be a valid HTML attribute name (blocks quote/space injection, #602) and must not be an event handler (`on*`, case-insensitive). render-ir.ts (silent skip) and Router tooling head-injection.ts (throw) enforce the same rule with different failure strategies; both delegate here so the boundary cannot diverge.
(name: string): boolean packages/element/src/internal/core/security.ts:62isValidTagName@openelement/element · ./client-onlyfunctionpublic
Check if a tag name is a valid custom element name per HTML spec.
(tagName: string): boolean packages/element/src/internal/core/tag-utils.ts:43Loader@openelement/element · ./client-onlytypepublic
Route loader: fetches data for a page route.
Loader<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:56LoaderContext@openelement/element · ./client-onlyinterfacepublic
Context passed to a request-time ('dynamic') route loader.
LoaderContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:40LocalePath@openelement/element · ./client-onlyinterfacepublic
Locale-aware resolved path contract.
LocalePathlocale: string (required); path: string (required); localizedPath: string (required); isDefaultLocalePath: boolean (required)
packages/element/src/internal/protocol/framework.ts:81Logger@openelement/element · ./client-onlyinterfacepublic
logger.ts - Tagged console logger. Lightweight scoped logger. Returns plain functions so it is tree-shakable and has zero class overhead.
Loggerdebug: (msg: string, ...args: unknown[]) => void (required); info: (msg: string, ...args: unknown[]) => void (required); warn: (msg: string, ...args: unknown[]) => void (required); error: (msg: string, ...args: unknown[]) => void (required)
packages/element/src/internal/core/logger.ts:10MAX_ACTION_BODY_BYTES@openelement/element · ./client-onlyconstpublic
Request-body bound (bytes) the generated entry applies to action POST routes; larger uploads belong on API routes with explicit limits.
number packages/element/src/internal/protocol/policy.ts:57MAX_COMPOSITION_DEPTH@openelement/element · ./client-onlyconstpublic
Nested element expansion depth bound for `renderDsd`: cyclic component composition fails closed instead of recursing without end.
8 packages/element/src/internal/protocol/policy.ts:51Middleware@openelement/element · ./client-onlytypepublic
Fetch middleware contract (#858): WinterCG shape, dialect-free — no Hono/h3 context object. Composed at the handler boundary in onion order (`use[0]` is outermost: it sees the request first and the response last), so it runs with identical semantics in the dev server, the `start` CLI, the e2e fixture server, and the Nitro production entry. A middleware may short-circuit by returning a Response without calling `next()`, or post-process the Response that `next()` returns. Module contract: a Middleware is the DEFAULT EXPORT of a module referenced from `middleware.use` by path (e.g. './app/middleware/auth.ts'). The generated server entry imports the module, so the middleware may close over module scope and import local helpers and third-party packages — it is a real module in the server module graph, never serialized source.
Middleware packages/element/src/internal/protocol/framework.ts:154OpenElement@openelement/element · ./client-onlyclasspublic
Custom Element base class for the compiled Part Program architecture. Subclasses are produced by the compiler; hand-written subclasses that never pass through the compiler fail closed at connect time.
class OpenElement extends OpenElementConfiguration packages/element/src/open-element-implementation.ts:89OpenElementAttribute@openelement/element · ./client-onlyinterfacepublic
One documented attribute of a custom element declaration.
OpenElementAttributename: string (required); type?: string (optional); default?: string (optional); description?: string (optional); reflects?: boolean (optional); fieldName?: string (optional)
packages/element/src/internal/protocol/manifest.ts:10OpenElementCssPart@openelement/element · ./client-onlyinterfacepublic
One documented CSS part of a custom element declaration.
OpenElementCssPartname: string (required); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:33OpenElementDeclaration@openelement/element · ./client-onlyinterfacepublic
One custom element declaration in a package manifest: tag, members and delivery metadata.
OpenElementDeclarationtagName: string (required); className?: string (optional); superclassName?: string (optional); attributes?: OpenElementAttribute[] (optional); events?: OpenElementEvent[] (optional); slots?: OpenElementSlot[] (optional); cssParts?: OpenElementCssPart[] (optional); openElement.ssr?: boolean (optional); openElement.dsd?: boolean (optional); openElement.layer?: ComponentLayer (optional); openElement.hydrate?: "load" | "idle" | "visible" | "only" (optional); openElement.status?: "stable" | "experimental" (optional) — Stability marker from the owning package's manifest policy.; openElement.module?: string (optional); openElement.export?: string (optional); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:50OpenElementError@openelement/element · ./client-onlyclasspublic
Framework error carrying a stable code, severity, phase and recoverability contract.
class OpenElementError extends Error packages/element/src/internal/protocol/errors.ts:78OpenElementEvent@openelement/element · ./client-onlyinterfacepublic
One documented custom event of a custom element declaration.
OpenElementEventname: string (required); type?: string (optional); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:20OpenElementPackageManifest@openelement/element · ./client-onlyinterfacepublic
Package manifest of component declarations (not a Custom Elements Manifest).
OpenElementPackageManifestschemaVersion: string (required); packageName: string (required); version: string (required); description?: string (optional); author?: string (optional); license?: string (optional); homepage?: string (optional); repository?: string (optional); declarations: OpenElementDeclaration[] (required)
packages/element/src/internal/protocol/manifest.ts:63OpenElementRouteKind@openelement/element · ./client-onlytypepublic
Host-agnostic route and asset contracts shared by app and build drivers.
OpenElementRouteKind packages/element/src/internal/protocol/app-model.ts:2OpenElementRouteNode@openelement/element · ./client-onlyinterfacepublic
One node of the host-agnostic route tree: the matched URL `path` and route kind, the source and module paths the drivers resolve, the optional registered tag and param names, and the nested `children`.
OpenElementRouteNodekind: OpenElementRouteKind (required); path: string (required); filePath?: string (optional); importPath?: string (optional); tagName?: string (optional); paramNames?: string[] (optional); children?: OpenElementRouteNode[] (optional); meta?: Record<string, unknown> (optional)
packages/element/src/internal/protocol/app-model.ts:9OpenElementSlot@openelement/element · ./client-onlyinterfacepublic
One documented slot of a custom element declaration.
OpenElementSlotname: string (required); description?: string (optional)
packages/element/src/internal/protocol/manifest.ts:27ProblemDetails@openelement/element · ./client-onlyinterfacepublic
RFC 9457 Problem Details document (#863): the action error channel answers `application/problem+json` instead of the bespoke `{ type: 'error', error: { message } }` JSON, so HTTP tooling recognizes failures natively. With `type: 'about:blank'`, `title` is the HTTP reason phrase and `detail` carries the specific explanation. The wire shape is alpha-unfrozen; the 1.0 acceptance freezes it in this problem+json form.
ProblemDetailstype: string (required) — URI reference identifying the problem type; 'about:blank' when none applies.; title: string (required) — Short human-readable summary (the HTTP reason phrase for 'about:blank').; status.toString: (radix?: number) => string (required) — Returns a string representation of an object.; status.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; status.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; status.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; status.valueOf: () => number (required) — Returns the primitive value of the specified object.; status.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; detail?: string (optional) — Human-readable explanation specific to this occurrence.
packages/element/src/internal/protocol/data.ts:96property@openelement/element · ./client-onlyfunctionpublic
Compiler-recognized property decorator; inert no-op at runtime.
(_options: { reflect: boolean; attribute?: false | string; type?: unknown; converter?: unknown; }): (target: unknown, context?: unknown) => voidreflect: boolean (required); attribute?: string | false (optional); type?: unknown (optional); converter?: unknown (optional)
packages/element/src/internal/core/compile-decorators.ts:34provideContext@openelement/element · ./client-onlyfunctionpublic
Provide a plain protocol value; the provider Signal remains OE-private.
<T>(host: HTMLElement, context: Context<T>, value: T): Unsubscribe packages/element/src/internal/core/signal-context.ts:107ReadonlySignal@openelement/element · ./client-onlyinterfacepublic
Read-only signal protocol used by computed values.
ReadonlySignal<T>value: T (required); subscribe: (fn: (value: T) => void) => Unsubscribe (required); __@[email protected]: () => boolean (required) — Returns the primitive value of the specified object.
packages/element/src/internal/protocol/signal.ts:26renderDsd@openelement/element · ./client-onlyfunctionpublic
Server-render one compiled element through canonical Element composition.
(input: string | CustomElementConstructor, options?: RenderDsdOptions): RenderOutput packages/element/src/public-runtime.ts:698RenderDsdOptions@openelement/element · ./client-onlyinterfacepublic
Options for one `renderDsd()` call: the compiled component class to serialize, the values projected onto its compiled properties, optional route/source diagnostics metadata, the nested compiled tags the build admitted, and trusted parent-owned light children keyed by slot name.
RenderDsdOptionscomponentClass?: CustomElementConstructor (optional); props?: Record<string, unknown> (optional); sourceInfo.route?: string (optional); sourceInfo.source?: string (optional); ssrRenderableTags?: readonly string[] (optional) — Build-admitted nested compiled tags. Omitted means shell-only rendering.; projectedChildren?: ReadonlyMap<string, TrustedHtml> (optional) — Trusted parent-owned light children keyed by slot name.
packages/element/src/public-runtime.ts:138RenderError@openelement/element · ./client-onlyclasspublic
Recoverable render-phase error carrying the failing component path and tag.
class RenderError extends OpenElementError packages/element/src/internal/core/errors.ts:91RenderOutput@openelement/element · ./client-onlyinterfacepublic
The public result of one `renderDsd()` call: the serialized DSD `html`, the render errors collected while composing it (empty on success), the render metrics for the root component, and the hydration hints the client scheduler reads to upgrade islands.
RenderOutputhtml: string (required); errors: RenderError[] (required); metrics: DsdRenderMetrics (required); hydrationHints: HydrationHint[] (required)
packages/element/src/internal/protocol/render.ts:32reportError@openelement/element · ./client-onlyfunctionpublic
Report an {@linkcode OpenElementError} to the telemetry hook, or console.error when none is installed.
(error: OpenElementError): voidcode: string (required); severity: ErrorSeverity (required); phase: ErrorPhase (required); recoverable: boolean (required); statusCode.toString: (radix?: number) => string (required) — Returns a string representation of an object.; statusCode.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; statusCode.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; statusCode.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; statusCode.valueOf: () => number (required) — Returns the primitive value of the specified object.; statusCode.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; toJSON: () => Record<string, unknown> (required); name: string (required); message: string (required); stack?: string (optional); cause?: unknown (optional)
packages/element/src/internal/core/errors.ts:135RouteEntry@openelement/element · ./client-onlyinterfacepublic
One route admitted by the scanner: URL `path`, source `filePath`, the route `type`, the generated variable name (`varName`) the entry binds it to, and the optional registration tag. {@link RouteEntry.definePage} and {@link RouteEntry.hasEnhancedForms} carry the two source-derived admission facts the generated entries branch on.
RouteEntrypath: string (required); filePath: string (required); type: "page" | "api" | "island" | "special" (required); varName: string (required); tagName?: string (optional); definePage?: boolean (optional) — True when the route module's default export is a definePage() definition (#960 — registration decoupling). The generated entry registers the page class under the path-derived fallback tag and IGNORES the tagName export for registration: on a definePage route the export only names a content element. Plain element routes keep tagName as their registration tag.; source?: string (optional) — Source text captured during scanning when includeSource is enabled.; hasEnhancedForms?: boolean (optional) — True when the page route source carries data-open-enhance (#569): the client entry must ship the form-enhancement layer even when the app has zero islands.; special?: SpecialFileType (optional); params?: string[] (optional)
packages/element/src/internal/protocol/framework.ts:109ServerRouteContext@openelement/element · ./client-onlyinterfacepublic
Canonical request-time/SSG server route context.
ServerRouteContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:25setErrorTelemetryHook@openelement/element · ./client-onlyfunctionpublic
Install the process-wide error telemetry hook (replaceable for tests, HMR, multi-app pages).
(hook: ErrorTelemetryHook): void packages/element/src/internal/core/errors.ts:123signal@openelement/element · ./client-onlyfunctionpublic
Create a writable signal through the selected signal engine.
<T>(initialValue: T): WritableSignal<T> packages/element/src/internal/signal/framework.ts:19Signal@openelement/element · ./client-onlytypepublic
Alias for APIs that accept either writable or read-only signals.
Signal<T> packages/element/src/internal/protocol/signal.ts:31SpecialFileType@openelement/element · ./client-onlytypepublic
Special file kinds the route scanner recognizes by filename: `renderer` and `middleware`.
SpecialFileType packages/element/src/internal/protocol/framework.ts:78SsrAdmissionDecision@openelement/element · ./client-onlyinterfacepublic
The build's admission verdict for one discovered tag: where the declaration lives (`modulePath`), how it was discovered (`source`), which render path it is admitted to, and the reason recorded for the manifest.
SsrAdmissionDecisiontagName: string (required); modulePath: string (required) — Module path of the island declaration. Empty for 'foreign' decisions: a foreign tag is consumed in JSX but declares no module the build owns.; source: "local" | "package" | "nested" | "foreign" (required) — 'foreign' (#979, 0.43.0-alpha.2): a third-party WC tag discovered by the foreign-tag scanner in page/island JSX — recorded for visibility only; SSR still treats it as an opaque passthrough (renderPath 'client-only').; renderPath: "ssr+client" | "client-only" | "rejected" (required); reason: string (required)
packages/element/src/internal/protocol/render.ts:53STREAM_FRAME_UNSAFE_URL@openelement/element · ./client-onlyconstpublic
Schemes that make a URL attribute unsafe in a streamed frame.
RegExp packages/element/src/internal/protocol/stream-frame-policy.ts:60STREAM_FRAME_URL_ATTRIBUTES@openelement/element · ./client-onlyconstpublic
URL-carrying attributes the frame check screens for script-bearing scheme obfuscation; only these attribute names are value-screened.
readonly ["href", "src", "action", "formaction", "xlink:href"] packages/element/src/internal/protocol/stream-frame-policy.ts:42STREAM_FRAME_URL_CONTROL_MAX@openelement/element · ./client-onlyconstpublic
Control characters at or below this code point are stripped before the URL-scheme test, so tab/newline/control obfuscation cannot smuggle a scheme past admission.
32 packages/element/src/internal/protocol/stream-frame-policy.ts:55STREAM_MAX_FIELDS@openelement/element · ./client-onlyconstpublic
Deferred fields (declared streamed properties) one stream route's manifest may carry. The build scan, the server executor, and the browser seed contract enforce the same bound.
32 packages/element/src/internal/protocol/policy.ts:24STREAM_MAX_OWNERS@openelement/element · ./client-onlyconstpublic
Part/Region owners one stream route's manifest may address in total across all deferred fields.
64 packages/element/src/internal/protocol/policy.ts:30STREAM_MAX_PAYLOAD_LENGTH@openelement/element · ./client-onlyconstpublic
Serialized stream payload bound, as a string length in UTF-16 code units: one seed attribute or one deferred frame's markup may not exceed it. The server checks the JSON text and the rendered range before emitting; the browser checks the attribute before parsing.
number packages/element/src/internal/protocol/policy.ts:45STREAM_MAX_SEED_PROPERTIES@openelement/element · ./client-onlyconstpublic
Typed properties one streamed seed may carry: the browser seed contract rejects the WHOLE seed above this count, so an oversized component would silently fail to hydrate instead of failing loud at the server.
64 packages/element/src/internal/protocol/policy.ts:37STREAM_TIMEOUT_MS@openelement/element · ./client-onlyconstpublic
Deferred-field resolution budget (milliseconds) for one streamed response: fields still pending when it expires are failed in place and the stream ends with the shell and whatever resolved.
30000 packages/element/src/internal/protocol/policy.ts:64StyleSheet@openelement/element · ./client-onlyconstpublic
Cross-realm StyleSheet constructor: the native CSSStyleSheet or the internal shim.
new () => StyleSheetLike packages/element/src/internal/core/style-sheet.ts:67StyleSheetLike@openelement/element · ./client-onlyinterfacepublic
Minimal stylesheet contract (replaceSync + cssRules) satisfied by native and shim sheets.
StyleSheetLikereplaceSync: (text: string) => void (required); cssRules: StyleSheetRule[] (required)
packages/element/src/internal/protocol/style-sheet.ts:14trustedHtml@openelement/element · ./client-onlyfunctionpublic
Mark an HTML string as trusted for explicit `innerHTML` sinks (the trust does not serialize).
(html: string): TrustedHtml packages/element/src/internal/core/security.ts:83TrustedHtml@openelement/element · ./client-onlyinterfacepublic
Opaque capability marking HTML the application has explicitly vetted as trusted.
TrustedHtmlhtml: string (required)
packages/element/src/internal/core/security.ts:78unsafeStreamFrameAttribute@openelement/element · ./client-onlyfunctionpublic
Whether a static attribute (name/value as authored into the Part Program) makes a streamed frame unsafely installable: event-handler, seed-spoofing, and srcdoc names fail outright, and URL-carrying names fail when the entity-decoded, control-stripped value carries a script scheme.
(name: string, value: string): boolean packages/element/src/internal/protocol/stream-frame-policy.ts:115wrapInDocument@openelement/element · ./client-onlyfunctionpublic
Wrap rendered HTML in a full HTML document. Adds DOCTYPE, head (title, meta, preload), and body. Supports CSP nonce and dev scripts (e.g. Vite client, route module registration).
(html: string, options?: DocumentWrapOptions): string packages/element/src/internal/core/html-escape.ts:109analyzeModuleSemantics@openelement/element · ./compilerfunctionpublic
Parse one module source and report the semantic facts the compiler boundary and the Vite graph adapters branch on. Pure: it never resolves imports from disk and never throws on foreign or invalid syntax — an unparsable module simply yields no recognized facts. The scan's factory vocabulary is host-injected: the default knows only the element package's own registration factories, and page-definition/registration facts for other packages require the caller's {@link ModuleSemanticsOptions.vocabulary} descriptors.
(source: string, fileName: string, options?: ModuleSemanticsOptions): ModuleSemanticFacts packages/element/src/internal/compiler/semantic-core/module-analysis.ts:389COMPILED_ELEMENT_MARKER@openelement/element · ./compilerconstpublic
The authored substring every compiled element module contains (`@element(`), used as the cheap prefilter.
"@element(" packages/element/src/internal/compiler/plugin.ts:39CompiledElementError@openelement/element · ./compilerclasspublic
Error shape consumed by the Vite plugin and compiler tests.
class CompiledElementError extends CompilerDiagnosticError packages/element/src/internal/compiler/semantic-core/compiler-diagnostics.ts:20compiledElementPlugin@openelement/element · ./compilerfunctionpublic
The `open:compiled-element` Vite plugin: runs at `enforce: 'pre'` so the compiler sees authored TSX before Vite's own TS/JSX lowering, compiles every module with a canonically bound `@element` decorator, and leaves all other modules untouched. `workspaceRoot` anchors generated source-map ids for linked workspace packages.
(options?: CompiledElementPluginOptions): PluginworkspaceRoot?: string (optional) — Workspace root used as the second identity anchor: Vite ids outside the project root are typically linked workspace packages, and anchoring them on the workspace keeps machine paths out of emitted source maps. Callers that do not know a workspace root omit it and get ids passed through.; typeCheckEmitted?: boolean (optional) — Type-check every module the compiler emits and fail the build when one does not compile (#1386 item 2). Off by default: it runs a TypeScript program per emitted module, which a dev-server transform must not pay. A build or verification pass turns it on, so the emitted program is checked against the declarations the consumer compiles against.; resolutionPaths?: Record<string, string[]> (optional) — Specifier → candidate files map used when `typeCheckEmitted` is on.; staticSidecars?: readonly StaticSidecarDescriptor[] (optional) — Static-sidecar descriptors the host application admits into the compiled module grammar (e.g. its island delivery policy factory). The default core knows none: without an injected descriptor a module carrying a sidecar policy statement fails closed with OEC9008.
packages/element/src/internal/compiler/plugin.ts:164compileElementModule@openelement/element · ./compilerfunctionpublic
Compile one opted-in module without binding the caller to Vite. The core adapter hook and the inline SSR/client builds all use this same function, which prevents duplicate compiler implementations from drifting. Returns null for modules without a canonically bound
(code: string, id: string, options?: SemanticCoreOptions): CompileElementResult | null packages/element/src/internal/compiler/plugin.ts:75compileElementProgram@openelement/element · ./compilerfunctionpublic
Compile one authored TSX module into the compiled Part Program module. `fileName` is used for diagnostics and the emitted source map only — filesystem resolution is the caller's job. Fails closed with a {@link CompiledElementError} carrying the ordered OEC diagnostics. `options.staticSidecars` admits host-declared sidecar policy statements (e.g. an island delivery descriptor); the default core admits none.
(source: string, fileName: string, options?: SemanticCoreOptions): CompileElementResult packages/element/src/internal/compiler/semantic-core/compile.ts:62CompileElementResult@openelement/element · ./compilerinterfacepublic
The compiled module the transform emits for one authored TSX source: the generated `code`, its Source Map v3, the Part Program facts the runtime consumes, and the ordered diagnostics that did not fail the compile.
CompileElementResultcode: string (required); map: CompiledElementSourceMap (required) — Real Source Map v3 for the emitted module (VLQ line+column segments derived from the compiler's span records and emission provenance). The same map is embedded as the module's inline map; the Vite shell returns it as its `map` output for downstream composition (#1210).; program: PartProgramV1 (required)
packages/element/src/internal/compiler/semantic-core/compile.ts:42ElementCompilerDiagnostic@openelement/element · ./compilerinterfacepublic
A source-aware compiler diagnostic: stable OEC code, message and source range.
ElementCompilerDiagnosticcode: string (required); message: string (required); file: string (required); line.toString: (radix?: number) => string (required) — Returns a string representation of an object.; line.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; line.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; line.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; line.valueOf: () => number (required) — Returns the primitive value of the specified object.; line.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; character: number (required); start: number (required); end: number (required)
packages/element/src/internal/compiler/semantic-core/compiler-diagnostics.ts:17EmittedModuleDiagnostic@openelement/element · ./compilerinterfacepublic
One diagnostic the type checker produced for the emitted module. `file` is the virtual module id the check was given; the remaining fields locate the range inside the EMITTED text.
EmittedModuleDiagnosticcode.toString: (radix?: number) => string (required) — Returns a string representation of an object.; code.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; code.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; code.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; code.valueOf: () => number (required) — Returns the primitive value of the specified object.; code.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; message: string (required); file: string (required); line: number (required); character: number (required)
packages/element/src/internal/compiler/semantic-core/type-check.ts:37EmittedModuleTypeCheckOptions@openelement/element · ./compilerinterfacepublic
How the emitted module's imports resolve, and any virtual files to add.
EmittedModuleTypeCheckOptionspaths?: Record<string, string[]> (optional) — Module resolution map for the specifiers the emitted module imports, in TypeScript `paths` form (specifier → candidate files). A caller that resolves `@openelement/element` through the workspace passes that map; omitting it means imported specifiers resolve through `node_modules`, which is what a packed consumer has instead.; compilerOptions?: ts.CompilerOptions (optional) — Extra compiler options, merged over the defaults below.; extraFiles?: Readonly<Record<string, string>> (optional) — Support files the emitted module imports, supplied as text for ids that do not exist on disk (a bundler's other virtual modules). The emitted module itself is added under `fileName`.
packages/element/src/internal/compiler/semantic-core/type-check.ts:46emittedModuleTypeChecks@openelement/element · ./compilerfunctionpublic
`true` when the emitted module type-checks. The boolean form exists so a caller that only needs a verdict does not destructure an empty array; the diagnostics form is for callers that must report what failed.
(code: string, fileName: string, options?: EmittedModuleTypeCheckOptions): boolean packages/element/src/internal/compiler/semantic-core/type-check.ts:177hasElementDecoratorApplication@openelement/element · ./compilerfunctionpublic
Precise second stage behind the substring prefilter: a canonically bound `@element(...)` decorator application on a class declaration (provenance decided by the semantic core's intrinsic-binding model). Modules that only mention the marker in a string literal or comment, or spell it through a foreign/local binding, do not reach the compiler.
(code: string, id: string): boolean packages/element/src/internal/compiler/plugin.ts:60isCompiledElementModule@openelement/element · ./compilerfunctionpublic
Cheap first stage only — NOT a recognizer. The substring match exists to keep plain modules off the AST path and may false-positive (string literals and comments match); it may also false-negative on namespace-qualified spellings (`@ns.element(...)`), which are unsupported by the grammar anyway (#1209). Binding provenance and admission are decided exclusively by the semantic core.
(code: string, id: string): boolean packages/element/src/internal/compiler/plugin.ts:49ModuleSemanticFacts@openelement/element · ./compilerinterfacepublic
The bundler-neutral facts one module source yields: its relative imports, the intrinsic bindings it admits ({@link ModuleSemanticFacts.compiledElementDecorator}, {@link ModuleSemanticFacts.exportedTagName}, custom-element tags it defines or references) and the interaction-event names its handlers bind. The Vite graph adapter branches on these without re-parsing the AST.
ModuleSemanticFactsrelativeImports: string[] (required); compiledElementDecorator: boolean (required); unsupportedElementDecorator?: string (optional) — Set when a class decorator spells the `element` intrinsic through unsupported or ambiguous provenance (type-only import, namespace access, default import, conflicting duplicate bindings, or a relative-module re-export). Never set for clearly foreign bindings (third-party packages, local declarations, bare/global spellings) — those modules are simply not OpenElement modules. The plugin gate compil…; exportedTagName?: string (optional); definePage: boolean (required) — True when the module default-exports a page-definition factory call from the host's injected vocabulary, or is an .mdx route. The default scan (no injected vocabulary) never recognizes another package's factories.; usesExportedTagName: boolean (required); enhancedForm: boolean (required); defaultCompiledTag?: string (optional); definedCustomElementTags: string[] (required); referencedCustomElementTags: string[] (required); compilerInteractionEvents: string[] (required)
packages/element/src/internal/compiler/semantic-core/module-analysis.ts:12ModuleSemanticsOptions@openelement/element · ./compilerinterfacepublic
Host-supplied vocabulary extensions for the module scan.
ModuleSemanticsOptionsvocabulary?: readonly ModuleVocabularyDescriptor[] (optional) — Vocabulary descriptors the host admits beyond the core's own element bindings. The default scan knows no other package: a route module's page-definition export or registration factory is recognized only when the host injects its descriptor.
packages/element/src/internal/compiler/semantic-core/module-analysis.ts:108ModuleVocabularyDescriptor@openelement/element · ./compilerinterfacepublic
One module-scan vocabulary entry the host admits: a binding identity (module specifier + exported name, aliases followed) plus the fact a canonical call of that binding contributes. Plain data — the scan consumes the descriptors without learning the caller's package vocabulary, the same direction as the compiler's {@link StaticSidecarDescriptor} admission (#1473 item 3).
ModuleVocabularyDescriptormoduleSpecifier: string (required) — Canonical module specifier the factory must be imported from.; exportName: string (required) — Exported name of the factory binding.; kind: "page-definition" | "element-registration" (required) — What a canonical call of the binding contributes to the scan.
packages/element/src/internal/compiler/semantic-core/module-analysis.ts:98SemanticCoreOptions@openelement/element · ./compilerinterfacepublic
Host-supplied admission extensions for the semantic core.
SemanticCoreOptionsstaticSidecars?: readonly StaticSidecarDescriptor[] (optional) — Static-sidecar descriptors the host admits. The default core knows none: a module carrying a sidecar policy statement fails closed until the host injects its descriptor.
packages/element/src/internal/compiler/semantic-core/module-analysis.ts:81stableModuleId@openelement/element · ./compilerfunctionpublic
Compile-time source identity for a module: absolute Vite ids are converted to project-relative POSIX paths so Part Program `metadata.sourceFile` and `sourceMap.file` never embed the build machine's path. Module resolution, diagnostics, and HMR keys keep using the caller's own id. Anchors are explicit, never guessed from path substrings (a checkout living under e.g. `/srv/www/` must not fool the cut): the Vite project root first, then the workspace root when the caller knows it (a module outside the project root is typically a linked workspace package). Callers that hand the compiler a path outside every known root (synthetic ids, non-Deno projects without a Vite root) get the id back unchanged — there is no correct relative form to invent, and the library boundary must not reject paths it cannot anchor. This module stays runtime-neutral: resolving a workspace root from disk is the caller's job.
(file: string, root: string | undefined, workspaceRoot?: string): string packages/element/src/internal/compiler/plugin.ts:115StaticSidecarDescriptor@openelement/element · ./compilerinterfacepublic
A compile-time binding a host application teaches the semantic core beyond the built-in element intrinsics. Admission stays a binding identity: the export must arrive as a runtime named import from the canonical specifier (aliases followed); namespace, default, type-only, conflicting and relative-re-export provenance is never admitted.
StaticSidecarDescriptormoduleSpecifier: string (required) — Canonical module specifier the sidecar export must be imported from.; exportName: string (required) — Exported name of the sidecar factory binding.; kind: "static-sidecar" (required) — The admission granted: a colocated static policy statement.
packages/element/src/internal/compiler/semantic-core/module-analysis.ts:71typeCheckEmittedModule@openelement/element · ./compilerfunctionpublic
Type-check one emitted compiled module. Returns `[]` when the module type-checks; otherwise every diagnostic the checker reported, in emission order, so a build can print all of them instead of only the first. The `fileName` should be the module's real (virtual) id, not a placeholder: module resolution and `paths` matching both key off it, and the diagnostics quote it back.
(code: string, fileName: string, options?: EmittedModuleTypeCheckOptions): EmittedModuleDiagnostic[] packages/element/src/internal/compiler/semantic-core/type-check.ts:91validatePartProgram@openelement/element · ./compilerfunctionpublic
Validate an unknown value as a Part Program v1. The validator is intentionally strict: unknown instruction kinds, missing ownership records and unsafe paths fail before a runtime can guess at their meaning.
(raw: unknown): asserts raw is PartProgram packages/element/src/internal/protocol/part-program.ts:815escapeAttr@openelement/element · ./htmlfunctionpublic
Escape an HTML attribute value. Delegates to `escapeHtml` so both share the single `ESCAPE_MAP` and the same single-pass replacement (consolidated in #633). Empty-value conventions remain intentionally distinct by design: - `escapeHtml` returns '' for non-string input. - `escapeAttrValue` (below) coerces via `String()` and is the boundary meant for unknown/variable attribute values.
(value: string): string packages/element/src/internal/core/html-escape.ts:53escapeAttrValue@openelement/element · ./htmlfunctionpublic
Escape a string for use as an attribute value (double-quoted)
(value: unknown): string packages/element/src/internal/core/html-escape.ts:58escapeHtml@openelement/element · ./htmlfunctionpublic
Escape the five HTML-significant characters in text content.
(str: string): string packages/element/src/internal/core/html-escape.ts:37SafeHtml@openelement/element · ./htmltypepublic
Branded type: a string that has been HTML-escaped (safe for text content)
SafeHtml packages/element/src/internal/protocol/framework.ts:9trustedHtml@openelement/element · ./htmlfunctionpublic
Mark an HTML string as trusted for explicit `innerHTML` sinks (the trust does not serialize).
(html: string): TrustedHtml packages/element/src/internal/core/security.ts:83TrustedHtml@openelement/element · ./htmlinterfacepublic
Opaque capability marking HTML the application has explicitly vetted as trusted.
TrustedHtmlhtml: string (required)
packages/element/src/internal/core/security.ts:78UnsafeHtml@openelement/element · ./htmltypepublic
Branded type: a string that is intentionally raw/untrusted HTML
UnsafeHtml packages/element/src/internal/protocol/framework.ts:12wrapInDocument@openelement/element · ./htmlfunctionpublic
Wrap rendered HTML in a full HTML document. Adds DOCTYPE, head (title, meta, preload), and body. Supports CSP nonce and dev scripts (e.g. Vite client, route module registration).
(html: string, options?: DocumentWrapOptions): string packages/element/src/internal/core/html-escape.ts:109Fragment@openelement/element · ./jsx-dev-runtimefunctionpublic
Typechecking-only fragment marker; fails closed when executed at runtime.
(_props?: unknown): JSX.Element packages/element/src/jsx-dev-runtime.ts:38JSX@openelement/element · ./jsx-dev-runtimenamespacepublic
JSX type interface consumed by TypeScript's automatic JSX transform.
any packages/element/src/jsx-dev-runtime.ts:43jsxDEV@openelement/element · ./jsx-dev-runtimefunctionpublic
Typechecking-only factory; fails closed when executed at runtime.
(_type: unknown, _props: unknown, _key: unknown, _isStaticChildren: unknown, _source: unknown, _self: unknown): JSX.Element packages/element/src/jsx-dev-runtime.ts:26Fragment@openelement/element · ./jsx-runtimefunctionpublic
Typechecking-only fragment marker; fails closed when executed at runtime.
(_props?: unknown): JSX.Element packages/element/src/jsx-runtime.ts:39jsx@openelement/element · ./jsx-runtimefunctionpublic
Typechecking-only factory; fails closed when executed at runtime.
(_type: unknown, _props: unknown): JSX.Element packages/element/src/jsx-runtime.ts:29JSX@openelement/element · ./jsx-runtimenamespacepublic
JSX type interface consumed by TypeScript's automatic JSX transform.
any packages/element/src/jsx-runtime.ts:44jsxs@openelement/element · ./jsx-runtimefunctionpublic
Typechecking-only factory; fails closed when executed at runtime.
(_type: unknown, _props: unknown): JSX.Element packages/element/src/jsx-runtime.ts:34createLogger@openelement/element · ./loggerfunctionpublic
Create a {@link Logger} that prefixes every message with `[tag]`.
(tag: string): Logger packages/element/src/internal/core/logger.ts:18createWarnScope@openelement/element · ./loggerfunctionpublic
Create a fresh, empty warning scope for one render.
(): WarnScope packages/element/src/internal/core/logger.ts:42Logger@openelement/element · ./loggerinterfacepublic
logger.ts - Tagged console logger. Lightweight scoped logger. Returns plain functions so it is tree-shakable and has zero class overhead.
Loggerdebug: (msg: string, ...args: unknown[]) => void (required); info: (msg: string, ...args: unknown[]) => void (required); warn: (msg: string, ...args: unknown[]) => void (required); error: (msg: string, ...args: unknown[]) => void (required)
packages/element/src/internal/core/logger.ts:10warnOnce@openelement/element · ./loggerfunctionpublic
Warn at most once per `key` for the given render {@link WarnScope}, falling back to a process-wide set when no scope is passed.
(key: string, logger: Logger, msg: string, scope?: WarnScope): void packages/element/src/internal/core/logger.ts:53WarnScope@openelement/element · ./loggerinterfacepublic
A render-scoped warning tracker. Pass a fresh `WarnScope` (via `createWarnScope()`) into `warnOnce` at a render entry (e.g. once per SSR document in `wrapInDocument`). This keeps a given key from being suppressed for the entire process: the next page/request gets a new scope and the warning can fire again. This fixes the previous behavior where `warnOnce` permanently muted a key across all requests/SSG pages (#643).
WarnScopewarned: Set<string> (required)
packages/element/src/internal/core/logger.ts:37element@openelement/element · ./vitefunctionpublic
The `open:compiled-element` Vite plugin: runs at `enforce: 'pre'` so the compiler sees authored TSX before Vite's own TS/JSX lowering, compiles every module with a canonically bound `@element` decorator, and leaves all other modules untouched. `workspaceRoot` anchors generated source-map ids for linked workspace packages.
(options?: CompiledElementPluginOptions): PluginworkspaceRoot?: string (optional) — Workspace root used as the second identity anchor: Vite ids outside the project root are typically linked workspace packages, and anchoring them on the workspace keeps machine paths out of emitted source maps. Callers that do not know a workspace root omit it and get ids passed through.; typeCheckEmitted?: boolean (optional) — Type-check every module the compiler emits and fail the build when one does not compile (#1386 item 2). Off by default: it runs a TypeScript program per emitted module, which a dev-server transform must not pay. A build or verification pass turns it on, so the emitted program is checked against the declarations the consumer compiles against.; resolutionPaths?: Record<string, string[]> (optional) — Specifier → candidate files map used when `typeCheckEmitted` is on.; staticSidecars?: readonly StaticSidecarDescriptor[] (optional) — Static-sidecar descriptors the host application admits into the compiled module grammar (e.g. its island delivery policy factory). The default core knows none: without an injected descriptor a module carrying a sidecar policy statement fails closed with OEC9008.
packages/element/src/internal/compiler/plugin.ts:164Action@openelement/router · roottypepublic
Route action: handles form submissions for a page route.
Action<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:64ActionContext@openelement/router · rootinterfacepublic
Context passed to a route action function (extends loader context).
ActionContext<Env, Platform, Route>formData: FormData (required); request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:47ActionOutcome@openelement/router · roottypepublic
The discriminated result an action returns: `success` carries the action's data; `failure` carries an HTTP status and payload. See `ActionResult` for the canonical classifier that produces it.
ActionOutcome<Data> packages/router/src/authoring.ts:199ActionResult@openelement/router · roottypepublic
Wire shape returned to the JavaScript form-enhancement path. The no-JS path never sees this: it gets the equivalent semantics as plain HTTP (303 on success, 422 with the re-rendered form on validation failure, redirect/error as status codes). Error outcomes (CSRF 403, unknown action 404, unparseable body 400, unexpected 500) are NOT part of this union: since #863 they answer RFC 9457 Problem Details with the PROBLEM_JSON_MEDIA_TYPE content type — see ProblemDetails.
ActionResult<Success, Failure> packages/element/src/internal/protocol/data.ts:82classifyActionResult@openelement/router · rootfunctionpublic
Canonical application-level classification for an action return value. Hono and SPA executors project this result differently, but neither may redefine validation failure or admit a raw Response as action data.
<Data>(result: Data): ActionOutcome<Data> packages/router/src/authoring.ts:208CONVENTION_APP_SHELL_PATH@openelement/router · rootconstpublic
Convention path for the auto-registered application shell.
"app/islands/app-shell.tsx" packages/router/src/config.ts:87CONVENTION_APP_SHELL_SUFFIX@openelement/router · rootconstpublic
Convention-relative suffix of the auto-registered application shell.
"islands/app-shell.tsx" packages/router/src/config.ts:78CONVENTION_APP_SHELL_TAG@openelement/router · rootconstpublic
The tag name the convention shell is registered under.
"app-shell" packages/router/src/config.ts:93CONVENTION_BASE_DIR@openelement/router · rootconstpublic
Default convention base: the directory the tokens/app-shell/data conventions resolve under when `dirs` is omitted (or has no shared leading segment).
"app" packages/router/src/config.ts:72CONVENTION_COMPONENTS_DIR@openelement/router · rootconstpublic
Default component directory (`app/components`), the `dirs.components` default.
"app/components" packages/router/src/config.ts:66CONVENTION_HEAD_PATH@openelement/router · rootconstpublic
Convention path for the structural document-head module (`app/head.tsx`).
"app/head.tsx" packages/router/src/config.ts:90CONVENTION_HEAD_SUFFIX@openelement/router · rootconstpublic
Convention-relative suffix of the structural document-head module.
"head.tsx" packages/router/src/config.ts:81CONVENTION_ISLANDS_DIR@openelement/router · rootconstpublic
Default island directory (`app/islands`), the `dirs.islands` default.
"app/islands" packages/router/src/config.ts:63CONVENTION_PACKAGE_JSON@openelement/router · rootconstpublic
The site-title convention source (the package.json `name` field).
"package.json" packages/router/src/config.ts:96CONVENTION_ROUTES_DIR@openelement/router · rootconstpublic
Default route directory (`app/routes`), the `dirs.routes` default.
"app/routes" packages/router/src/config.ts:60CONVENTION_STYLES_SUFFIX@openelement/router · rootconstpublic
Convention-relative suffix of the design-token stylesheet.
"styles/tokens.css" packages/router/src/config.ts:75CONVENTION_TOKENS_PATH@openelement/router · rootconstpublic
Convention path for the design-token stylesheet.
"app/styles/tokens.css" packages/router/src/config.ts:84conventionAppShellPath@openelement/router · rootfunctionpublic
The app-shell convention path for a resolved `dirs` block.
(base: string): string packages/router/src/config.ts:569conventionHeadPath@openelement/router · rootfunctionpublic
The structural document-head convention path for a resolved `dirs` block.
(base: string): string packages/router/src/config.ts:574conventionTokensPath@openelement/router · rootfunctionpublic
The token stylesheet convention path for a resolved `dirs` block.
(base: string): string packages/router/src/config.ts:564createRequestContext@openelement/router · rootfunctionpublic
Build the canonical OpenElement request context from a platform request event.
<Env extends Record<string, unknown> = Record<string, unknown>>(options: CreateRequestContextOptions<Env>): OpenElementRequestContext<Env>request: Request (required); params?: Record<string, string> (optional); env?: Env (optional); platform?: unknown (optional)
packages/router/src/model.ts:27CreateRequestContextOptions@openelement/router · rootinterfacepublic
Inputs for building an {@linkcode OpenElementRequestContext} from a platform request event.
CreateRequestContextOptions<Env>request: Request (required); params?: Record<string, string> (optional); env?: Env (optional); platform?: unknown (optional)
packages/router/src/model.ts:17defineConfig@openelement/router · rootfunctionpublic
`defineConfig()` — identity helper that pins the config file's shape.
(config: OpenElementUserConfig): OpenElementUserConfigrenderer?: "native" | "lit" (optional) — Page renderer. Omit to keep the compiled native renderer.; dirs.routes?: string (optional) — Route directory. Defaults to `app/routes`.; dirs.islands?: string (optional) — Island directory. Defaults to `app/islands`.; dirs.components?: string (optional) — Component directory. Defaults to `app/components`.; appShell?: false | { import: string; props?: Record<string, unknown>; } (optional) — Application shell. `false` opts out of the `app-shell.tsx` convention; an object registers the named module. `tagName` is derived from the import's basename, so it is not part of the surface.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits (e.g. `['@openelement/ui']`). The loader folds this list into the SSR externalization list the bundler needs, so a package listed here is bundled rather than imported at run time; there is no separate `ssr.noExternal` key.; head.title?: string (optional) — Document title; defaults to the package.json `name`.; head.description?: string (optional) — `<meta name="description">` + `og:description`.; head.lang?: string (optional) — `<html lang>`; defaults to `en`.; head.favicon?: string (optional) — Site-root-relative favicon path, emitted as `<link rel="icon">`.; head.ogImage?: string (optional) — `og:image` URL. Absolute (crawlable) or site-root-relative.; head.stylesheets?: string[] (optional) — External stylesheets linked into `<head>`.; head.scripts?: OpenElementHeadScript[] (optional) — External scripts emitted into `<head>`; inline code is not accepted here.; styles.tokens?: string (optional) — Token stylesheet path; defaults to the `styles/tokens.css` convention.; i18n?: OpenElementI18nConfig (optional) — Locale-prefixed build configuration.; viewTransition?: boolean (optional) — Client-navigation View Transitions. Boolean for now; an object form (per-transition types) is a possible future widening of this key.; speculation?: boolean (optional) — Speculation Rules emission. Boolean for now: `true` uses the framework route-derived defaults, `false` emits none. An object form (explicit prerender/prefetch lists, exclusions, eagerness) is a possible future widening of this key.; build.manifestBudget?: Record<string, number> (optional) — Advisory per-entry manifest budgets in KB, e.g. `{ islandKB: 100, totalJsKB: 300 }`.; middleware.corsOrigin?: string | string[] (optional) — CORS allowlist; omitted means localhost-only reflection (production warning).
packages/router/src/config.ts:214defineIslandConfig@openelement/router · rootfunctionpublic
Validate and register an island delivery descriptor; returns the normalized config.
(config: IslandConfig): IslandConfigssr?: boolean (optional); dsd?: boolean (optional); hydrate?: IslandDeliveryStrategy (optional) — Hydration strategy — same values as `IslandOptions.hydrate` on the element package (`the element/src/internal/protocol/island.ts`): 'load' | 'idle' | 'visible' | 'media' | 'only'.; media?: string (optional) — Media query required by the `media` delivery strategy.; tags?: readonly string[] (optional) — Custom-element tags delivered by this one capability module.; tagNames?: readonly string[] (optional) — Alias accepted by generated artifact producers.; exportNames?: Readonly<Record<string, string>> (optional) — Named constructor exports keyed by delivered custom-element tag.
packages/router/src/authoring.ts:650definePage@openelement/router · rootfunctionpublic
Attach a page descriptor to a compiled page element class. Canonical page authoring: the route module default-exports the compiled class (produced by the open:compiled-element transform) wrapped in definePage(). The descriptor holds head/route/renderIntent metadata plus the optional props/error projectors; it must NOT create classes or hold a render function — the compiled class's Part Program is the render. import { definePage } from '@openelement/router'; import { HomePage } from '../components/page-home.tsx'; export const loader = async (ctx) => ({ ... }); // module named exports export default definePage(HomePage, { head: { title: 'Home' }, props: ({ data }) => ({ heading: data?.heading ?? '' }), });
<Data = unknown, Params extends Record<string, string> = Record<string, string>>(componentClass: CustomElementConstructor, descriptor?: PageDescriptorInput<Data, Params>): PageComponentConstructor<Data, Params> packages/router/src/authoring.ts:400fail@openelement/router · rootfunctionpublic
Return a structured action failure with an HTTP status and typed data payload.
<Data>(status: number, data: Data): OpenElementActionFailure<Data>toString: (radix?: number) => string (required) — Returns a string representation of an object.; toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; valueOf: () => number (required) — Returns the primitive value of the specified object.; toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.
packages/router/src/authoring.ts:178isActionFailure@openelement/router · rootfunctionpublic
Type guard for {@linkcode OpenElementActionFailure}, including its duck-typed cross-realm shape.
(error: unknown): error is OpenElementActionFailure packages/router/src/authoring.ts:183IslandConfig@openelement/router · rootinterfacepublic
Per-island delivery configuration (SSR/DSD participation and hydration strategy).
IslandConfigssr?: boolean (optional); dsd?: boolean (optional); hydrate?: IslandDeliveryStrategy (optional) — Hydration strategy — same values as `IslandOptions.hydrate` on the element package (`the element/src/internal/protocol/island.ts`): 'load' | 'idle' | 'visible' | 'media' | 'only'.; media?: string (optional) — Media query required by the `media` delivery strategy.; tags?: readonly string[] (optional) — Custom-element tags delivered by this one capability module.; tagNames?: readonly string[] (optional) — Alias accepted by generated artifact producers.; exportNames?: Readonly<Record<string, string>> (optional) — Named constructor exports keyed by delivered custom-element tag.
packages/router/src/authoring.ts:568IslandDeliveryStrategy@openelement/router · roottypepublic
Delivery strategy for an island: a hydration trigger or media-gated loading.
IslandDeliveryStrategy packages/router/src/authoring.ts:565isOpenElementNotFound@openelement/router · rootfunctionpublic
Type guard for {@linkcode OpenElementNotFound}, including its duck-typed cross-realm shape.
(error: unknown): error is OpenElementNotFound packages/router/src/authoring.ts:142isOpenElementRedirect@openelement/router · rootfunctionpublic
Type guard for {@linkcode OpenElementRedirect}, including its duck-typed cross-realm shape.
(error: unknown): error is OpenElementRedirect packages/router/src/authoring.ts:126JsonValue@openelement/router · roottypepublic
A JSON value: the complete set of shapes the structured-data channel admits (JSON primitives, arrays and plain objects, all readonly). Functions, `undefined`, bigint, symbols, class instances, Date, Map and Set are rejected by the runtime normalizer and by this type, so an author cannot write a document the serializer would refuse.
JsonValue packages/router/src/authoring.ts:229Loader@openelement/router · roottypepublic
Route loader: fetches data for a page route.
Loader<T, Env, Platform, Route> packages/element/src/internal/protocol/data.ts:56LoaderContext@openelement/router · rootinterfacepublic
Context passed to a request-time ('dynamic') route loader.
LoaderContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:40notFound@openelement/router · rootfunctionpublic
Throw an {@linkcode OpenElementNotFound} to render the 404 path.
(message?: string): never packages/router/src/authoring.ts:121OPEN_ELEMENT_APP_SHELL_KEYS@openelement/router · rootconstpublic
Accepted keys inside `appShell`.
readonly string[] packages/router/src/config.ts:271OPEN_ELEMENT_BUILD_KEYS@openelement/router · rootconstpublic
Accepted keys inside `build`.
readonly string[] packages/router/src/config.ts:280OPEN_ELEMENT_CONFIG_FILE@openelement/router · rootconstpublic
Canonical config-file name, resolved in the project root.
"openelement.config.ts" packages/router/src/config.ts:57OPEN_ELEMENT_CONFIG_KEYS@openelement/router · rootconstpublic
The exact accepted key set, used by the fail-closed unknown-key check and by the error message (the message must name the accepted surface, never just reject). The nested arrays below are this module's single copy of the sub-key surfaces; the host-tooling loader imports them instead of restating them.
readonly string[] packages/router/src/config.ts:225OPEN_ELEMENT_DIRS_KEYS@openelement/router · rootconstpublic
Accepted keys inside `dirs`.
readonly string[] packages/router/src/config.ts:268OPEN_ELEMENT_HEAD_KEYS@openelement/router · rootconstpublic
Accepted keys inside `head`.
readonly string[] packages/router/src/config.ts:240OPEN_ELEMENT_HEAD_SCRIPT_KEYS@openelement/router · rootconstpublic
Keys of one `head.scripts` entry.
readonly string[] packages/router/src/config.ts:251OPEN_ELEMENT_HEAD_STRING_KEYS@openelement/router · rootconstpublic
Head keys that carry a plain string value.
readonly string[] packages/router/src/config.ts:259OPEN_ELEMENT_I18N_KEYS@openelement/router · rootconstpublic
Accepted keys inside `i18n`.
readonly string[] packages/router/src/config.ts:277OPEN_ELEMENT_MIDDLEWARE_KEYS@openelement/router · rootconstpublic
Accepted keys inside `middleware`.
readonly string[] packages/router/src/config.ts:283OPEN_ELEMENT_STYLES_KEYS@openelement/router · rootconstpublic
Accepted keys inside `styles`.
readonly string[] packages/router/src/config.ts:274OpenElementActionFailure@openelement/router · rootclasspublic
Expected-failure channel for actions (decision 0120): validation failures RETURN `fail(status, data)` — never throw — so the server can answer 422 with the form re-rendered and the submitted values echoed back. Thrown values keep the exception channel (redirect/notFound/error page).
class OpenElementActionFailure packages/router/src/authoring.ts:159OpenElementBuildConfig@openelement/router · rootinterfacepublic
Build-output switches.
OpenElementBuildConfigmanifestBudget?: Record<string, number> (optional) — Advisory per-entry manifest budgets in KB, e.g. `{ islandKB: 100, totalJsKB: 300 }`.
packages/router/src/config.ts:152OpenElementDirsConfig@openelement/router · rootinterfacepublic
Source roots; see the `dirs` section of the module doc comment.
OpenElementDirsConfigroutes?: string (optional) — Route directory. Defaults to `app/routes`.; islands?: string (optional) — Island directory. Defaults to `app/islands`.; components?: string (optional) — Component directory. Defaults to `app/components`.
packages/router/src/config.ts:142OpenElementHeadConfig@openelement/router · rootinterfacepublic
The document-head channel. Structured only: every entry serializes through the framework's URL/attribute validators, so a raw HTML string has no way in. Structural head content that is not expressible here (font preloads, icons, feed links, inline CSS) belongs in the `app/head.tsx` convention instead.
OpenElementHeadConfigtitle?: string (optional) — Document title; defaults to the package.json `name`.; description?: string (optional) — `<meta name="description">` + `og:description`.; lang?: string (optional) — `<html lang>`; defaults to `en`.; favicon?: string (optional) — Site-root-relative favicon path, emitted as `<link rel="icon">`.; ogImage?: string (optional) — `og:image` URL. Absolute (crawlable) or site-root-relative.; stylesheets?: string[] (optional) — External stylesheets linked into `<head>`.; scripts?: OpenElementHeadScript[] (optional) — External scripts emitted into `<head>`; inline code is not accepted here.
packages/router/src/config.ts:116OpenElementHeadScript@openelement/router · rootinterfacepublic
One structured `<script src>` descriptor accepted by `head.scripts`.
OpenElementHeadScriptsrc: string (required) — Script URL: absolute, or site-root relative (`/prism-init.js`).; defer?: boolean (optional) — Emit `defer`; leave unset for a parser-blocking external script.; crossOrigin?: string (optional) — `crossorigin` attribute value, e.g. `anonymous`.; integrity?: string (optional) — Subresource-integrity digest for the script.
packages/router/src/config.ts:99OpenElementI18nConfig@openelement/router · rootinterfacepublic
Locale configuration for a locale-prefixed build.
OpenElementI18nConfiglocales: string[] (required) — Every locale the build emits, default locale included.; defaultLocale: string (required) — The locale served at the unprefixed root.
packages/router/src/config.ts:134OpenElementNotFound@openelement/router · rootclasspublic
Not-found signal thrown from a loader to render the route's 404 path.
class OpenElementNotFound extends OpenElementError packages/router/src/authoring.ts:100OpenElementPageDescriptor@openelement/router · rootinterfacepublic
The page descriptor the pipeline reads (`module.default.openElementPage`). Attached to the compiled page class by definePage(); the class owns the render program, so the descriptor carries metadata and projectors only.
OpenElementPageDescriptor<Data, Params>kind: "page" (required); route.id?: string (optional); route.params?: readonly string[] (optional); route.layout?: string | false (optional) — Named layout selection (decision 0123): a string picks one of the `openElement({ layouts })` entries by name (unknown names fall back to the default shell); `false` renders the page without any app shell. Unset means the default shell.; head?: PageHead | PageHeadResolver<Data, Params> (optional); renderIntent: NormalizedPageRenderIntent (required); props?: PagePropsProjector<Data, Params> (optional); error?: PageErrorProjector<Data, Params> (optional)
packages/router/src/authoring.ts:355OpenElementRedirect@openelement/router · rootclasspublic
Redirect signal thrown from a loader/action to short-circuit rendering with an HTTP redirect.
class OpenElementRedirect extends OpenElementError packages/router/src/authoring.ts:72OpenElementRequestContext@openelement/router · rootinterfacepublic
Host-agnostic request context shared by App request adapters.
OpenElementRequestContext<Env>request: Request (required); url: URL (required); path: string (required); method: string (required); params: Record<string, string> (required); searchParams: URLSearchParams (required); env?: Env (optional); platform?: unknown (optional)
packages/router/src/model.ts:3OpenElementUserConfig@openelement/router · rootinterfacepublic
Overrides accepted by an `openelement.config.ts` file (unknown keys fail closed).
OpenElementUserConfigrenderer?: "native" | "lit" (optional) — Page renderer. Omit to keep the compiled native renderer.; dirs.routes?: string (optional) — Route directory. Defaults to `app/routes`.; dirs.islands?: string (optional) — Island directory. Defaults to `app/islands`.; dirs.components?: string (optional) — Component directory. Defaults to `app/components`.; appShell?: false | { import: string; props?: Record<string, unknown>; } (optional) — Application shell. `false` opts out of the `app-shell.tsx` convention; an object registers the named module. `tagName` is derived from the import's basename, so it is not part of the surface.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits (e.g. `['@openelement/ui']`). The loader folds this list into the SSR externalization list the bundler needs, so a package listed here is bundled rather than imported at run time; there is no separate `ssr.noExternal` key.; head.title?: string (optional) — Document title; defaults to the package.json `name`.; head.description?: string (optional) — `<meta name="description">` + `og:description`.; head.lang?: string (optional) — `<html lang>`; defaults to `en`.; head.favicon?: string (optional) — Site-root-relative favicon path, emitted as `<link rel="icon">`.; head.ogImage?: string (optional) — `og:image` URL. Absolute (crawlable) or site-root-relative.; head.stylesheets?: string[] (optional) — External stylesheets linked into `<head>`.; head.scripts?: OpenElementHeadScript[] (optional) — External scripts emitted into `<head>`; inline code is not accepted here.; styles.tokens?: string (optional) — Token stylesheet path; defaults to the `styles/tokens.css` convention.; i18n?: OpenElementI18nConfig (optional) — Locale-prefixed build configuration.; viewTransition?: boolean (optional) — Client-navigation View Transitions. Boolean for now; an object form (per-transition types) is a possible future widening of this key.; speculation?: boolean (optional) — Speculation Rules emission. Boolean for now: `true` uses the framework route-derived defaults, `false` emits none. An object form (explicit prerender/prefetch lists, exclusions, eagerness) is a possible future widening of this key.; build.manifestBudget?: Record<string, number> (optional) — Advisory per-entry manifest budgets in KB, e.g. `{ islandKB: 100, totalJsKB: 300 }`.; middleware.corsOrigin?: string | string[] (optional) — CORS allowlist; omitted means localhost-only reflection (production warning).
packages/router/src/config.ts:161PageComponentConstructor@openelement/router · roottypepublic
A compiled element class carrying the page descriptor static.
PageComponentConstructor<Data, Params> packages/router/src/authoring.ts:368PageErrorProjector@openelement/router · roottypepublic
Maps a caught render/loader/action failure onto the error variant of the page's compiled properties. Its presence declares that the page's compiled markup carries an error variant (the generated entry renders the page with these props and status 500 — the POST/GET error-boundary channel of decision 0121 §7); without it the generic status page answers.
PageErrorProjector<Data, Params> packages/router/src/authoring.ts:320PageHead@openelement/router · rootinterfacepublic
Page <head> meaning declared by a route descriptor (decision 0143; canonical/alternates in #1326; structured data via the typed JSON-LD channel). Either a static object or — via PageHeadResolver — resolved per render from the request-scoped context by resolvePageDocument (@openelement/router/document) before either serializer runs.
PageHeadtitle?: string (optional); description?: string (optional); meta?: Record<string, string | number | boolean>[] (optional); canonical?: string (optional) — Canonical URL of this page (Beta.2.2, #1326), resolved into <link rel="canonical"> by the shared Document seam.; alternates?: { href: string; hreflang?: string; }[] (optional) — Locale alternates of this page (Beta.2.2, #1326), resolved into <link rel="alternate" hreflang="..."> entries in author order.; structuredData?: StructuredDataEntry[] (optional) — Structured data (JSON-LD) for this page, resolved into one `<script type="application/ld+json">` element per document in <head>. This is a DATA channel, not a markup channel: entries must be JSON data, and resolvePageDocument fails closed on anything JSON cannot represent (functions, undefined, non-finite numbers, non-plain objects, cycles). It is deliberately NOT reachable through `dangerouslyHe…; dangerouslyHeadFragments?: string[] (optional)
packages/router/src/authoring.ts:252PageHeadResolver@openelement/router · roottypepublic
Resolves a page's head from the request-scoped context (Beta.2.2, #1326). The resolver receives the same context object the props projector gets and must stay a pure function of it — the Document seam (@openelement/router/ document) never fetches, caches, or schedules loaders on its own.
PageHeadResolver<Data, Params> packages/router/src/authoring.ts:334PagePropsContext@openelement/router · rootinterfacepublic
The request-scoped context handed to a page's props projector. Everything a compiled page can render must pass through here: the compiled render() only reads `this.<property>`, so the projector is the single deterministic seam that maps loader data, action data, params and request onto the page's compiled properties (decision 0143).
PagePropsContext<Data, Params>data: Data (required); actionData: unknown (required); params: Params (required); request?: Request (optional); locale?: string (optional) — Resolved application locale for this render, when i18n is configured.; route.path?: string (optional); route.filePath?: string (optional); meta: PageMeta (required)
packages/router/src/authoring.ts:288PagePropsProjector@openelement/router · roottypepublic
Maps the request-scoped context onto the page's compiled properties. Declared as part of the page descriptor; the generated server entry and the SPA bootstrap call it per render and feed the result to renderDsd() props (server) or pre-connect property sets (SPA).
PagePropsProjector<Data, Params> packages/router/src/authoring.ts:308ProblemDetails@openelement/router · rootinterfacepublic
RFC 9457 Problem Details document (#863): the action error channel answers `application/problem+json` instead of the bespoke `{ type: 'error', error: { message } }` JSON, so HTTP tooling recognizes failures natively. With `type: 'about:blank'`, `title` is the HTTP reason phrase and `detail` carries the specific explanation. The wire shape is alpha-unfrozen; the 1.0 acceptance freezes it in this problem+json form.
ProblemDetailstype: string (required) — URI reference identifying the problem type; 'about:blank' when none applies.; title: string (required) — Short human-readable summary (the HTTP reason phrase for 'about:blank').; status.toString: (radix?: number) => string (required) — Returns a string representation of an object.; status.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; status.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; status.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; status.valueOf: () => number (required) — Returns the primitive value of the specified object.; status.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; detail?: string (optional) — Human-readable explanation specific to this occurrence.
packages/element/src/internal/protocol/data.ts:96projectPageProps@openelement/router · rootfunctionpublic
Default request-to-props projection used when a page descriptor declares no props projector: route params first, then loader-data record entries. The compiled serializer consumes only the page's declared compiled properties, so extra entries are ignored. Shared by the generated server entries and the SPA bootstrap (each carries its own copy — generated code cannot import this module's internals). Dangerous keys are filtered through the canonical isDangerousKey predicate (#1214): a hostile loader payload such as JSON.parse('{"__proto__": ...}') can never re-prototype the projection record or the page host it is projected onto. The generated server runtime enforces the same rule with a serialized copy of the canonical DANGEROUS_KEYS list.
(context: { params?: Record<string, string>; data?: unknown; }): Record<string, unknown>params?: Record<string, string> (optional); data?: unknown (optional)
packages/router/src/authoring.ts:546redirect@openelement/router · rootfunctionpublic
Throw an {@linkcode OpenElementRedirect} for `location` (status must be a real 3xx).
(location: string | URL, status?: number): neverhash: string (required) — The **`hash`** property of the URL interface is a string containing a "#" followed by the fragment identifier of the URL. If the URL does not have a fragment identifier, this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hash); host: string (required) — The **`host`** property of the URL interface is a string containing the host, which is the hostname, and then, if the port of the URL is nonempty, a ":", followed by the port of the URL. If the URL does not have a hostname, this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/host); hostname: string (required) — The **`hostname`** property of the URL interface is a string containing either the domain name or IP address of the URL. If the URL does not have a hostname, this property contains an empty string, "". IPv4 and IPv6 addresses are normalized, such as stripping leading zeros, and domain names are converted to IDN. [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/hostname); href: string (required) — The **`href`** property of the URL interface is a string containing the whole URL. [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/href); toString: () => string (required); origin: string (required) — The **`origin`** read-only property of the URL interface returns a string containing the Unicode serialization of the origin of the represented URL. [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/origin); password: string (required) — The **`password`** property of the URL interface is a string containing the password component of the URL. If the URL does not have a password, this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/password); pathname: string (required) — The **`pathname`** property of the URL interface represents a location in a hierarchical structure. It is a string constructed from a list of path segments, each of which is prefixed by a / character. [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/pathname); port: string (required) — The **`port`** property of the URL interface is a string containing the port number of the URL. If the port is the default for the protocol (80 for ws: and http:, 443 for wss: and https:, and 21 for ftp:), this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/port); protocol: string (required) — The **`protocol`** property of the URL interface is a string containing the protocol or scheme of the URL, including the final ":". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/protocol); search: string (required) — The **`search`** property of the URL interface is a search string, also called a query string, that is a string containing a "?" followed by the parameters of the URL. If the URL does not have a search query, this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/search); searchParams: URLSearchParams (required) — The **`searchParams`** read-only property of the URL interface returns a URLSearchParams object allowing access to the GET decoded query arguments contained in the URL. [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/searchParams); username: string (required) — The **`username`** property of the URL interface is a string containing the username component of the URL. If the URL does not have a username, this property contains an empty string, "". [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/username); toJSON: () => string (required) — The **`toJSON()`** method of the URL interface returns a string containing a serialized version of the URL, although in practice it seems to have the same effect as URL.toString(). [MDN Reference](https://developer.mozilla.org/docs/Web/API/URL/toJSON)
packages/router/src/authoring.ts:116resolveDirs@openelement/router · rootfunctionpublic
Resolve `dirs` to the three absolute-in-project roots the scanner reads. Omitted entries take the documented defaults.
(dirs: OpenElementDirsConfig | undefined): { routes: string; islands: string; components: string; base: string; }routes?: string (optional) — Route directory. Defaults to `app/routes`.; islands?: string (optional) — Island directory. Defaults to `app/islands`.; components?: string (optional) — Component directory. Defaults to `app/components`.
packages/router/src/config.ts:528ServerRouteContext@openelement/router · rootinterfacepublic
Canonical request-time/SSG server route context.
ServerRouteContext<Env, Platform, Route>request: Request (required); params: Record<string, string> (required); env: Env (required); platform: Platform (required); responseHeaders: Headers (required) — Mutable response-only channel merged into the framework response.; route: Route (required)
packages/element/src/internal/protocol/data.ts:25StructuredDataEntry@openelement/router · roottypepublic
One structured-data document — a JSON-LD node such as a schema.org BlogPosting or WebSite. Its values are JSON data (string, finite number, boolean, null, array, plain object) and nothing else: the serializer emits the document as data, so an HTML string is not a document here.
StructuredDataEntry packages/router/src/authoring.ts:243ClientScriptDescriptor@openelement/router · ./documentinterfacepublic
One framework client script a resolved document embeds before `</body>`. Shape-compatible with the serializer's script descriptors, so the document channel routes it through without conversion; entries without src or code are meaningless and rejected at resolution (never silently dropped).
ClientScriptDescriptorsrc?: string (optional) — External script URL (attribute-escaped at serialization).; code?: string (optional) — Inline script body. Trusted framework input, never user content.; type?: string (optional) — Script type attribute, e.g. 'module'; omitted means a classic script.
packages/router/src/loading/module/nonce.ts:31PageHeadAlternate@openelement/router · ./documentinterfacepublic
One <link rel="alternate"> record, typically carrying an hreflang.
PageHeadAlternatehref: string (required); hreflang?: string (optional)
packages/router/src/document.ts:42ResolvedDocument@openelement/router · ./documentinterfacepublic
A page's resolved document meaning: every <head> field after the head resolver (when the descriptor declares one) has run, plus the normalized `links` projection the serializers consume. Call-site precedence is resolved-document value first, route/build docConfig fallback second.
ResolvedDocumenttitle?: string (optional); description?: string (optional); meta?: Record<string, string | number | boolean>[] (optional); structuredData?: StructuredDataEntry[] (optional) — Structured data (JSON-LD), one serialized `<script type= "application/ld+json">` element per entry. Normalized here to plain JSON data so the serializer only has to escape, never interpret.; dangerouslyHeadFragments?: string[] (optional); clientScripts?: ClientScriptDescriptor[] (optional) — The framework client scripts this document embeds before `</body>` — structured descriptors rendered by the serializer at document time (#1471), never by post-build HTML surgery. The serializer attaches the per-request CSP nonce; SSG output carries none.; lang?: string (optional) — Document language: the resolved application locale for this render.; canonical?: string (optional); alternates?: PageHeadAlternate[] (optional); links: ResolvedDocumentLink[] (required) — Canonical first, then alternates in author order — deterministic.
packages/router/src/document.ts:60ResolvedDocumentLink@openelement/router · ./documentinterfacepublic
A normalized <link> the serializers emit into <head>.
ResolvedDocumentLinkrel: "canonical" | "alternate" (required); href: string (required); hreflang?: string (optional)
packages/router/src/document.ts:48resolvePageDocument@openelement/router · ./documentfunctionpublic
Resolves the descriptor head into the page's ResolvedDocument. A head may be a static object or a resolver receiving the same request-scoped context the props projector gets; resolver output is validated exactly like a static head so malformed page meaning fails loudly at either build time or request time instead of being silently dropped from the serialized document. `clientScripts` carries the framework's client-script descriptors (the build's client asset manifest — the render wiring hands them in, they are never author head data); they are validated like every other field and become part of the resolved document, so every render channel — the SSG render pass included — serializes the final script tags from one place.
(head: PageHead | PageHeadResolver | undefined, context: PagePropsContext, clientScripts?: readonly ClientScriptDescriptor[]): ResolvedDocumenttitle?: string (optional); description?: string (optional); meta?: Record<string, string | number | boolean>[] (optional); canonical?: string (optional) — Canonical URL of this page (Beta.2.2, #1326), resolved into <link rel="canonical"> by the shared Document seam.; alternates?: { href: string; hreflang?: string; }[] (optional) — Locale alternates of this page (Beta.2.2, #1326), resolved into <link rel="alternate" hreflang="..."> entries in author order.; structuredData?: StructuredDataEntry[] (optional) — Structured data (JSON-LD) for this page, resolved into one `<script type="application/ld+json">` element per document in <head>. This is a DATA channel, not a markup channel: entries must be JSON data, and resolvePageDocument fails closed on anything JSON cannot represent (functions, undefined, non-finite numbers, non-plain objects, cycles). It is deliberately NOT reachable through `dangerouslyHe…; dangerouslyHeadFragments?: string[] (optional)
packages/router/src/document.ts:190createRouteMiddleware@openelement/router · ./httpfunctionpublic
Mount after host middleware/routes; unmatched URLs continue to the host.
(records: readonly HttpRouteRecord[], options?: RouteTableOptions & { methodNotAllowed?: (request: Request, allow: readonly string[]) => Response | Promise<Response>; }): (request: Request, next: () => Promise<Response>… packages/router/src/http.ts:47HttpHandler@openelement/router · ./httptypepublic
Dialect-free WinterCG route handler: return a Response to short-circuit, or `next()` to pass control down the method's handler chain; the last handler's `next` is the host middleware chain's own next.
HttpHandler packages/router/src/http.ts:16HttpRouteContext@openelement/router · ./httpinterfacepublic
Route-scoped request context handed to every {@link HttpHandler}.
HttpRouteContextparams: Record<string, string> (required); searchParams: URLSearchParams (required); url: URL (required)
packages/router/src/http.ts:5HttpRouteRecord@openelement/router · ./httpinterfacepublic
A route record for the WinterCG middleware ({@link createRouteMiddleware}): the matching fields of a {@link RouteRecord} plus a per-method handler (or handler chain) map, so one path can answer each HTTP method differently.
HttpRouteRecordhandlers: Readonly<Record<string, HttpHandler | readonly HttpHandler[]>> (required); path: string (required); id?: string (optional); pattern.protocol?: string (optional); pattern.username?: string (optional); pattern.password?: string (optional); pattern.hostname?: string (optional); pattern.port?: string (optional); pattern.search?: string (optional); pattern.hash?: string (optional); pattern.baseURL?: string (optional)
packages/router/src/http.ts:27defineLitPage@openelement/router · ./litfunctionpublic
Attach a page descriptor and host tag to a LitElement page class. import { defineLitPage } from '@openelement/router/lit'; import { NotesListPage } from '../components/notes-list-page.ts'; export const loader = async (ctx) => ({ ... }); export default defineLitPage('notes-list-page', NotesListPage, { renderIntent: { mode: 'dynamic' }, head: { title: 'Notes' }, props: ({ data }) => ({ notes: data?.notes ?? [] }), }); The class is rendered server-side by
<Data = unknown, Params extends Record<string, string> = Record<string, string>>(tag: string, componentClass: CustomElementConstructor, descriptor?: LitPageDescriptorInput<Data, Params>): LitPageConstructor<Data, Params> packages/router/src/lit.ts:63LitPageConstructor@openelement/router · ./littypepublic
A LitElement page class carrying the page descriptor and its host tag.
LitPageConstructor<Data, Params> packages/router/src/lit.ts:39OpenElementPageDescriptor@openelement/router · ./litinterfacepublic
The page descriptor the pipeline reads (`module.default.openElementPage`). Attached to the compiled page class by definePage(); the class owns the render program, so the descriptor carries metadata and projectors only.
OpenElementPageDescriptor<Data, Params>kind: "page" (required); route.id?: string (optional); route.params?: readonly string[] (optional); route.layout?: string | false (optional) — Named layout selection (decision 0123): a string picks one of the `openElement({ layouts })` entries by name (unknown names fall back to the default shell); `false` renders the page without any app shell. Unset means the default shell.; head?: PageHead | PageHeadResolver<Data, Params> (optional); renderIntent: NormalizedPageRenderIntent (required); props?: PagePropsProjector<Data, Params> (optional); error?: PageErrorProjector<Data, Params> (optional)
packages/router/src/authoring.ts:355renderLitPageToHtml@openelement/router · ./lit-ssrfunctionpublic
Render a registered LitElement page host to DSD HTML. Fails closed when the tag is invalid or no element class is registered for it in the SSR registry: the generated entry registers every page/island class explicitly before rendering, so an unregistered host is a pipeline bug, never a silent passthrough.
({ tag, props }: { tag: string; props?: Record<string, unknown>; }): { html: string; }tag: string (required); props?: Record<string, unknown> (optional)
packages/router/src/lit-ssr.ts:71createOpenElementNitroHandler@openelement/router · ./nitro-mountfunctionpublic
Mounts an OpenElement request handler on a Nitro v3 route. Near pass-through: the event's standard `req` goes in, the handler's Response comes out — h3 v2 serves a returned Response as-is.
<Env extends Record<string, unknown> = Record<string, unknown>>(options: OpenElementNitroMountOptions<Env>): (event: NitroRequestEvent<Env>) => Promise<Response>handler: OpenElementRequestHandler<Env> (required); env?: Env (optional); platform?: unknown (optional); onBeforeRequestContext?: ((context: OpenElementRequestContext<Env>) => void | Promise<void>) (optional) — Observes the normalized OpenElement request context before the application handler runs. Route params are empty here unless the host supplies them on `event.context.params` before dispatch.
packages/router/src/nitro-mount.ts:62NitroRequestEvent@openelement/router · ./nitro-mountinterfacepublic
Minimal Nitro v3 route event shape (#857). Nitro v3 is fetch-native: its h3 v2 event carries `req`, a srvx ServerRequest that already IS a standard Request, so the pre-v3 method/path/headers/body translation layer is gone. The mount only wires the OpenElement runtime context around the standard Request → Response seam.
NitroRequestEvent<Env>req: Request (required); context.params?: Record<string, string> (optional); env?: Env (optional); platform?: unknown (optional)
packages/router/src/nitro-mount.ts:11OpenElementNitroMountOptions@openelement/router · ./nitro-mountinterfacepublic
Options for mounting an OpenElement request handler under a Nitro/Node server.
OpenElementNitroMountOptions<Env>handler: OpenElementRequestHandler<Env> (required); env?: Env (optional); platform?: unknown (optional); onBeforeRequestContext?: ((context: OpenElementRequestContext<Env>) => void | Promise<void>) (optional) — Observes the normalized OpenElement request context before the application handler runs. Route params are empty here unless the host supplies them on `event.context.params` before dispatch.
packages/router/src/nitro-mount.ts:21normalizeRoutePatternForURLPattern@openelement/router · ./routerfunctionpublic
Convert the framework's Hono-style route dialect to WHATWG URLPattern syntax.
(path: string): string packages/router/src/internal/router/route-pattern.ts:2RouteMatch@openelement/router · ./routerinterfacepublic
One URL matched against the table: the matched `route` record, the identity reported for it, the decoded path `params`, the parsed `searchParams`, and the raw URLPattern `patternResult` the match was derived from.
RouteMatch<T>route: T (required); id: string (required); params: Record<string, string> (required); searchParams: URLSearchParams (required); patternResult: RoutePatternResult (required)
packages/router/src/internal/router/route-table.ts:67RouteRecord@openelement/router · ./routerinterfacepublic
One route as the table stores it: the pathname `path`, an optional stable `id` used in match results, optional non-pathname URL component patterns, and the admitted `methods`.
RouteRecordpath: string (required); id?: string (optional); pattern.protocol?: string (optional); pattern.username?: string (optional); pattern.password?: string (optional); pattern.hostname?: string (optional); pattern.port?: string (optional); pattern.search?: string (optional); pattern.hash?: string (optional); pattern.baseURL?: string (optional); methods?: readonly string[] (optional)
packages/router/src/internal/router/route-table.ts:54RouteResolution@openelement/router · ./routertypepublic
The table's verdict for one request: a `match` (with the resolved method), `method-not-allowed` (with the `allow` list the caller answers 405 with), or `not-found` when no path in the table matches at all.
RouteResolution<T> packages/router/src/internal/router/route-table.ts:80RouteTable@openelement/router · ./routerclasspublic
Immutable route matcher built once from a route list: it freezes every record, rejects duplicate identities and pathname-owning patterns at construction, and answers {@link RouteTable.resolve} with a {@link RouteResolution}. `Pattern` is injectable so callers can pin the URLPattern implementation.
class RouteTable packages/router/src/internal/router/route-table.ts:163RouteTableOptions@openelement/router · ./routerinterfacepublic
Construction options: a URL prefix every route is mounted under, and whether a trailing slash is significant.
RouteTableOptionsbasePath?: string (optional); trailingSlash?: "strict" | "ignore" (optional)
packages/router/src/internal/router/route-table.ts:86CompiledRouteMatcher@openelement/router · ./router/clienttypepublic
The matcher surface a client route list compiles to: matching, resolution and candidate count.
CompiledRouteMatchermatch: (input: string | URL, search?: string) => RouteMatch<RouteConfig> | null (required); resolve: (input: string | URL, search?: string, method?: string) => RouteResolution<RouteConfig> (required); candidateCount: (input: string | URL) => number (required)
packages/router/src/internal/router/client-router.ts:60compileRouteMatcher@openelement/router · ./router/clientfunctionpublic
Compile a client route list into the canonical {@link RouteTable} matcher, with no router instance attached.
(routes: RouteConfig[]): CompiledRouteMatcher packages/router/src/internal/router/client-router.ts:88createRouter@openelement/router · ./router/clientfunctionpublic
Create the client-side SPA router for `options.mode` over `options.routes`: it matches through the shared RouteTable, owns its navigation listeners and history/hash state, and reports every committed navigation through `onChange`.
(options: RouterOptions): RouterInstancemode: RouterMode (required); routes: RouteConfig[] (required); onChange?: (() => void | Promise<void>) (optional) — Called after navigation or browser history/hash changes update the current match.; onPending?: (() => void) (optional) — Invalidate pending execution as soon as a newer navigation owns intent.
packages/router/src/internal/router/client-router.ts:111matchRoute@openelement/router · ./router/clientfunctionpublic
Match a route through the canonical Alpha.9 RouteTable.
(pathname: string, search: string, routes: RouteConfig[]): RouteMatch<RouteConfig> | null packages/router/src/internal/router/client-router.ts:76RouteConfig@openelement/router · ./router/clientinterfacepublic
One client route: a {@link RouteRecord} plus the custom element `tagName` SPA mode instantiates for it and an optional `guard` that may veto the navigation by returning `false` or a redirect path.
RouteConfigtagName: string (required) — Custom element tag to instantiate directly in SPA mode.; guard?: (() => Promise<boolean | string>) (optional); path: string (required); id?: string (optional); pattern.protocol?: string (optional); pattern.username?: string (optional); pattern.password?: string (optional); pattern.hostname?: string (optional); pattern.port?: string (optional); pattern.search?: string (optional); pattern.hash?: string (optional); pattern.baseURL?: string (optional); methods?: readonly string[] (optional)
packages/router/src/internal/router/client-router.ts:27RouterInstance@openelement/router · ./router/clientinterfacepublic
A live client router: the navigation entry points, the current match (`currentPath`/`currentRoute`/`params`/`searchParams`), and `dispose()` to release its listeners.
RouterInstancenavigate: (path: string) => Promise<void> (required); replace: (path: string) => Promise<void> (required); dispose: () => void (required); currentPath: string (required); currentRoute: RouteConfig | null (required); params: Record<string, string> (required); searchParams: URLSearchParams (required)
packages/router/src/internal/router/client-router.ts:47RouterMode@openelement/router · ./router/clienttypepublic
Navigation strategy: the History API ('history'), the URL hash ('hash'), or file-protocol auto-detection ('auto').
RouterMode packages/router/src/internal/router/client-router.ts:20actionErrorResponse@openelement/router · ./server-runtimefunctionpublic
The fetch-channel 500 (#863, #558): an unexpected action rejection answers RFC 9457 problem+json with internals scrubbed in production (the detail degrades to the reason phrase; development keeps the message for debugging). The native channel stays on the generated handler's HTML error boundary. `production` is the entry's `import.meta.env.PROD`, injected so this module stays free of build-tool globals.
(context: ActionHonoContext, routePath: string, error: unknown, production: boolean): Responsereq: { readonly url: string; readonly raw: Request; header(name: string): string | undefined; } (required); header: (name: string, value: string) => void (required); get: (key: string) => unknown (required); json: (object: unknown, status?: number, headers?: Record<string, string>) => Response (required); text: (text: string, status?: number, headers?: Record<string, string>) => Response (required); redirect: (location: string, status?: number) => Response (required); res: Response (required) — The response under construction (read by the middleware bridge fallback).
packages/router/src/vite/internal/server-runtime/action-runtime.ts:312ActionExecution@openelement/router · ./server-runtimeinterfacepublic
What one protocol run hands back to the generated handler.
ActionExecutionresponse?: Response (optional) — When set, the handler returns this response and renders nothing.; actionResult?: ActionOutcome (optional) — The classified action outcome for the 422 re-render (native failure path).
packages/router/src/vite/internal/server-runtime/action-runtime.ts:87ActionHonoContext@openelement/router · ./server-runtimeinterfacepublic
The slice of the Hono request context the action protocol touches. The generated entry passes its real Hono context; the narrow shape keeps this module unit-testable without hono.
ActionHonoContextreq: { readonly url: string; readonly raw: Request; header(name: string): string | undefined; } (required); header: (name: string, value: string) => void (required); get: (key: string) => unknown (required); json: (object: unknown, status?: number, headers?: Record<string, string>) => Response (required); text: (text: string, status?: number, headers?: Record<string, string>) => Response (required); redirect: (location: string, status?: number) => Response (required); res: Response (required) — The response under construction (read by the middleware bridge fallback).
packages/router/src/vite/internal/server-runtime/action-runtime.ts:47ActionLoadContext@openelement/router · ./server-runtimetypepublic
The load context the generated handler built; actions receive it plus `formData`.
ActionLoadContext packages/router/src/vite/internal/server-runtime/action-runtime.ts:75ActionProtocolState@openelement/router · ./server-runtimeinterfacepublic
The per-request action channel state: mutated by {@linkcode runActionProtocol} before any protocol exit so the generated handler's catch block can branch on the fetch path.
ActionProtocolStateisFetch: boolean (required)
packages/router/src/vite/internal/server-runtime/action-runtime.ts:82actionRedirectResponse@openelement/router · ./server-runtimefunctionpublic
The redirect exit for a POST action: every 3xx an author throws out of an action is coerced to 303 — PRG must be method-safe and non-cacheable. The native form channel answers a real 303; the fetch channel answers HTTP 200 with the redirect carried as the ActionResult body (`{ type: 'redirect', status: 303, location }`) — the serialized client executor matches on the body, not the HTTP status. GET handlers keep the author's status (the generated catch emits that branch itself).
(context: ActionHonoContext, location: string, isFetch: boolean): Responsereq: { readonly url: string; readonly raw: Request; header(name: string): string | undefined; } (required); header: (name: string, value: string) => void (required); get: (key: string) => unknown (required); json: (object: unknown, status?: number, headers?: Record<string, string>) => Response (required); text: (text: string, status?: number, headers?: Record<string, string>) => Response (required); redirect: (location: string, status?: number) => Response (required); res: Response (required) — The response under construction (read by the middleware bridge fallback).
packages/router/src/vite/internal/server-runtime/action-runtime.ts:292applyCspNonce@openelement/router · ./server-runtimefunctionpublic
Instantiates a generated CSP policy template for one request: replaces the first `NONCE_PLACEHOLDER` marker with the request nonce. The template is build-time data (route wiring produced it from the author's `middleware.csp` policy); only this substitution is runtime semantics.
(policyTemplate: string, nonce: string): string packages/router/src/vite/internal/server-runtime/response-channel.ts:147AppShellRuntime@openelement/router · ./server-runtimeinterfacepublic
The app-shell runtime bound into the generated entry.
AppShellRuntimeresolveAppShell: (routeMeta?: Record<string, unknown>) => ResolvedAppShell (required) — Resolve the shell for one route's metadata: `layout: false` disables the shell, a named layout looks up `appShellPlan.layouts`, anything else (and an unset layout) takes the plan default.; renderAppShell: (pageHtml: unknown, routePath: string, options?: { locale?: string; routeMeta?: Record<string, unknown>; }) => string (required) — Render route content inside the resolved app shell layout: the page HTML is projected into the shell's default slot through the page renderer, so nested admitted islands expand deterministically and route content stays inside the declared layout-main boundary. An unresolved shell returns the content unchanged.
packages/router/src/vite/internal/server-runtime/document-runtime.ts:54AppShellRuntimeDeps@openelement/router · ./server-runtimeinterfacepublic
What {@linkcode createAppShellRuntime} binds: the entry's Element imports plus its serialized plan data.
AppShellRuntimeDepsssr: PageSsrRenderer (required) — The entry's bound page renderer (`__ssr`) — the shell renders through the same seam.; trustedHtml: (html: string) => TrustedHtmlValue (required) — The entry's `trustedHtml` import — the slot projection is an explicit trust boundary.; appShellPlan: AppShellPlan (required) — The build's shell plan (serialized generated data).; locales: readonly string[] (required) — Declared project locales (serialized generated data).; navSections: readonly unknown[] (required) — Nav sections (serialized generated data; empty on the 1.0 surface).; headerNav: readonly Record<string, unknown>[] (required) — Header nav links (serialized generated data; empty on the 1.0 surface).; defaultLocale: string (required) — The project's default locale (generated data).
packages/router/src/vite/internal/server-runtime/document-runtime.ts:76assertCompiledStreamRoute@openelement/router · ./server-runtimefunctionpublic
Startup guard for a page route under the compiled stream runtime: the route's literal stream declaration must match the build-time manifest (field list, program tag, program version) and the module must carry the compiled Part Program the manifest was derived from. Moved verbatim from the emitted `__assertStreamRoute` body.
(module: unknown, route: string, file: string, manifest: StreamRouteManifestLike | undefined): void packages/router/src/vite/internal/server-runtime/route-dispatch.ts:37assertLitStreamRoute@openelement/router · ./server-runtimefunctionpublic
Startup guard for a page route under a renderer without compiled-stream support (the lit fork): a route declaring `renderIntent.stream` fails the build loudly instead of silently rendering static. Moved verbatim from the emitted `__assertLitStreamRoute` body.
(module: unknown, route: string, file: string): void packages/router/src/vite/internal/server-runtime/route-dispatch.ts:22createActionBodyLimit@openelement/router · ./server-runtimefunctionpublic
The default body-limit middleware for action POST routes (#568), bound to the serialized `MAX_ACTION_BODY_BYTES` policy constant (see the module doc): an oversized body answers the fetch channel with problem+json 413 (same fork as the CSRF 403) and the native form channel with plain text. The no-store/Vary negotiation headers ride every 413 like every other action response. Larger uploads belong on API routes with explicit limits.
(maxSize: number): MiddlewareHandlertoString: (radix?: number) => string (required) — Returns a string representation of an object.; toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; valueOf: () => number (required) — Returns the primitive value of the specified object.; toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.
packages/router/src/vite/internal/server-runtime/action-runtime.ts:260createAppShellRuntime@openelement/router · ./server-runtimefunctionpublic
Binds the app-shell runtime to the entry's renderer, trust boundary, and serialized shell/nav/locale data. The entry destructures `{ resolveAppShell: __resolveAppShell, renderAppShell: __renderAppShell }`.
(deps: AppShellRuntimeDeps): AppShellRuntimessr: PageSsrRenderer (required) — The entry's bound page renderer (`__ssr`) — the shell renders through the same seam.; trustedHtml: (html: string) => TrustedHtmlValue (required) — The entry's `trustedHtml` import — the slot projection is an explicit trust boundary.; appShellPlan: AppShellPlan (required) — The build's shell plan (serialized generated data).; locales: readonly string[] (required) — Declared project locales (serialized generated data).; navSections: readonly unknown[] (required) — Nav sections (serialized generated data; empty on the 1.0 surface).; headerNav: readonly Record<string, unknown>[] (required) — Header nav links (serialized generated data; empty on the 1.0 surface).; defaultLocale: string (required) — The project's default locale (generated data).
packages/router/src/vite/internal/server-runtime/document-runtime.ts:98createCspNonce@openelement/router · ./server-runtimefunctionpublic
Creates one per-request CSP nonce: a UUID without its dashes (32 hex characters). The CSP middleware embeds this value into the `script-src 'nonce-…'` policy it sets on the response and exposes it to the handlers as the `cspNonce` Hono context variable.
(): string packages/router/src/vite/internal/server-runtime/response-channel.ts:137createDeferredPageShell@openelement/router · ./server-runtimefunctionpublic
The per-route shell gate the streamed handlers await before any streamed document exists: the route must resolve its build manifest, the page class must carry the compiled Part Program, and both must agree on tag and program version — the gate fails closed with the route before the executor re-verifies the wire hash (#1276 B1.3-F1). Bound to the entry's serialized manifests and its `createDeferredDsdExecutor` import; the returned gate is the `__createDeferredPageShell` call site (Amendment 1 — the last runtime function body that stayed emitted for its oracle pin).
(config: DeferredPageShellConfig): (route: string, routeModule: unknown, props: unknown, instanceId: string, documentToken: string) => Promise<StreamExecutorView>streamManifests: Record<string, StreamRouteManifest> (required) — The entry's serialized route→stream-manifest build data (`__streamManifests`).; createDeferredDsdExecutor: (options: { componentClass: unknown; props?: unknown; manifest: StreamRouteManifest; instanceId: string; documentToken?: string; }) => Promise<StreamExecutorVi… (required) — The entry's `createDeferredDsdExecutor` import — the deferred shell it produces is the pump's executor view.
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:459createGeneratedApp@openelement/router · ./server-runtimefunctionpublic
Assembles the generated Hono app from the entry's route descriptor. Pure factory: descriptor data in, handler contract out — every emitted call site in the entry binds a property of the returned record.
(config: GeneratedAppConfig): GeneratedAppislands: Record<string, string> (required) — Build-time island map: tag -> client module path (#951 upgrade URLs).; appShellPlan: AppShellPlan (required) — The build's shell plan (serialized generated data).; locales: readonly string[] (required) — Declared project locales (serialized generated data).; navSections: readonly unknown[] (required) — Nav sections (serialized generated data; empty on the 1.0 surface).; headerNav: readonly Record<string, unknown>[] (required) — Header nav links (serialized generated data; empty on the 1.0 surface).; defaultLocale: string (required) — The project's default locale (generated data).; devClientScriptSrc: string | null (required) — The dev island-client URL the entry computed from its compile-time `import.meta.env` constants; null when the app ships no client entry.; pageHandlerPaths: readonly string[] (required) — Page route paths, in route order — the handler table's keys.; fetchMiddleware?: readonly FetchMiddleware[] (optional) — `middleware.use` module defaults, user-configured order (use[0] outermost).; pageRuntime?: GeneratedPageRuntime (optional)
packages/router/src/vite/internal/server-runtime/app.ts:147createHonoBridge@openelement/router · ./server-runtimefunctionpublic
Creates the per-entry Hono bridge the generated handlers compose through.
(): HonoBridge packages/router/src/vite/internal/server-runtime/action-runtime.ts:361createMethodNotAllowedResponder@openelement/router · ./server-runtimefunctionpublic
The 405 responder handed to `createRouteMiddleware` as `methodNotAllowed`: no-store (request-time responses are never cacheable), the action negotiation `Vary`, and the `Allow` header listing the route's methods (#572). Reads the bridged per-request Hono context so the WinterCG-side middleware can still answer with the Hono text channel.
(contexts: WeakMap<object, ActionHonoContext>): (request: Request, allow: string[]) => Responsedelete: (key: object) => boolean (required) — Removes the specified element from the WeakMap.; get: (key: object) => ActionHonoContext (required) — @returns a specified element.; has: (key: object) => boolean (required) — @returns a boolean indicating whether an element with the specified key exists or not.; set: (key: object, value: ActionHonoContext) => WeakMap<object, ActionHonoContext> (required) — Adds a new element with a specified key and value.; getOrInsert: (key: object, defaultValue: ActionHonoContext) => ActionHonoContext (required) — Returns a specified element from the WeakMap object. If no element is associated with the specified key, a new element with the value `defaultValue` will be inserted into the WeakMap and returned.; getOrInsertComputed: (key: object, callback: (key: object) => ActionHonoContext) => ActionHonoContext (required) — Returns a specified element from the WeakMap object. If no element is associated with the specified key, the result of passing the specified key to the `callback` function will be inserted into the WeakMap and returned.; __@toStringTag@4901: string (required)
packages/router/src/vite/internal/server-runtime/route-dispatch.ts:91createPageHandlerTable@openelement/router · ./server-runtimefunctionpublic
Creates the per-path page handler table the generated GET/POST wiring populates: one mutable method record per page path, keyed by the route path literal the wiring emits. (Previously emitted inline as `Object.fromEntries([...].map(path => [path, {}]))`.)
(paths: readonly string[]): Record<string, Record<string, unknown>> packages/router/src/vite/internal/server-runtime/route-dispatch.ts:78createPagePropsRuntime@openelement/router · ./server-runtimefunctionpublic
Binds the page props projection to the generated entry's serialized dangerous-key list. Returns the three projection seams under their generated binding names (`__pageProps`, `__pageErrorProps` — the entry destructures them).
(deps: PagePropsRuntimeDeps): PagePropsRuntimedangerousKeys: ReadonlySet<string> (required) — The canonical dangerous-key set (the factory imports it from the kernel-free /authoring leaf): one rule, no second copy.
packages/router/src/vite/internal/server-runtime/page-render.ts:123createStatusHtml@openelement/router · ./server-runtimefunctionpublic
Binds the status-page renderer to the entry's `escapeHtml` import. Both the native and the lit entry import the same canonical escaper (@openelement/element[/html]), so the one implementation serves every status channel (404 fallbacks, render failures, SSG redirect pages).
(escapeHtml: (value: string) => string): StatusHtmlRenderer packages/router/src/vite/internal/server-runtime/document-runtime.ts:47createStreamBody@openelement/router · ./server-runtimefunctionpublic
Binds the streaming body builder to the entry's injected Element function (and the policy timeout default): the returned builder is the `__streamBody` call site the generated handler invokes once per streamed response.
(config: StreamBodyConfig): StreamBodyFnescapeAttr: (value: string) => string (required) — The entry's `escapeAttr` import — an Element function, injected so this module stays free of an Element runtime edge.; timeoutMs.toString: (radix?: number) => string (required) — Returns a string representation of an object.; timeoutMs.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; timeoutMs.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; timeoutMs.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; timeoutMs.valueOf: () => number (required) — Returns the primitive value of the specified object.; timeoutMs.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:262createStreamRequestScope@openelement/router · ./server-runtimefunctionpublic
The request scope for one streamed route: the loader's `request.signal` aborts when the client disconnects (upstream abort fan-out), the response body's `cancel()` tears the whole scope down, and {@linkcode * StreamRequestScope.abortWork} aborts pending loader work at the timeout without cancelling the still-open response.
(original: Request): StreamRequestScopecache: RequestCache (required) — The **`cache`** read-only property of the Request interface contains the cache mode of the request. It controls how the request will interact with the browser's HTTP cache. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/cache); credentials: RequestCredentials (required) — The **`credentials`** read-only property of the Request interface reflects the value given to the Request() constructor in the credentials option. It determines whether or not the browser sends credentials with the request, as well as whether any Set-Cookie response headers are respected. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/credentials); destination: RequestDestination (required) — The **`destination`** read-only property of the Request interface returns a string describing the type of content being requested. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/destination); headers: Headers (required) — The **`headers`** read-only property of the Request interface contains the Headers object associated with the request. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/headers); integrity: string (required) — The **`integrity`** read-only property of the Request interface contains the subresource integrity value of the request. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/integrity); keepalive: boolean (required) — The **`keepalive`** read-only property of the Request interface contains the request's keepalive setting (true or false), which indicates whether the browser will keep the associated request alive if the page that initiated it is unloaded before the request is complete. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/keepalive); method: string (required) — The **`method`** read-only property of the Request interface contains the request's method (GET, POST, etc.) [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/method); mode: RequestMode (required) — The **`mode`** read-only property of the Request interface contains the mode of the request (e.g., cors, no-cors, same-origin, or navigate.) This is used to determine if cross-origin requests lead to valid responses, and which properties of the response are readable. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/mode); redirect: RequestRedirect (required) — The **`redirect`** read-only property of the Request interface contains the mode for how redirects are handled. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/redirect); referrer: string (required) — The **`referrer`** read-only property of the Request interface is set by the user agent to be the referrer of the Request. (e.g., client, no-referrer, or a URL.) [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/referrer); referrerPolicy: ReferrerPolicy (required) — The **`referrerPolicy`** read-only property of the Request interface returns the referrer policy, which governs what referrer information, sent in the Referer header, should be included with the request. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/referrerPolicy); signal: AbortSignal (required) — The read-only **`signal`** property of the Request interface returns the AbortSignal associated with the request. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/signal); url: string (required) — The **`url`** read-only property of the Request interface contains the URL of the request. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/url); clone: () => Request (required) — The **`clone()`** method of the Request interface creates a copy of the current Request object. [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/clone); body: ReadableStream<Uint8Array<ArrayBuffer>> | null (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/body); bodyUsed: boolean (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bodyUsed); arrayBuffer: () => Promise<ArrayBuffer> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/arrayBuffer); blob: () => Promise<Blob> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/blob); bytes: () => Promise<Uint8Array<ArrayBuffer>> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/bytes); formData: () => Promise<FormData> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/formData); json: () => Promise<any> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/json); text: () => Promise<string> (required) — [MDN Reference](https://developer.mozilla.org/docs/Web/API/Request/text)
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:123DANGEROUS_KEYS@openelement/router · ./server-runtimeconstpublic
Object prototype keys that must never be injected from untrusted props.
ReadonlySet<string> packages/element/src/internal/core/security.ts:24DeferredPageShellConfig@openelement/router · ./server-runtimeinterfacepublic
The entry bindings the deferred-shell gate reads. `streamManifests` is the generated `__streamManifests` build data; the executor creator is the entry's `createDeferredDsdExecutor` Element import, injected so this module stays free of an Element runtime edge (#1339).
DeferredPageShellConfigstreamManifests: Record<string, StreamRouteManifest> (required) — The entry's serialized route→stream-manifest build data (`__streamManifests`).; createDeferredDsdExecutor: (options: { componentClass: unknown; props?: unknown; manifest: StreamRouteManifest; instanceId: string; documentToken?: string; }) => Promise<StreamExecutorVi… (required) — The entry's `createDeferredDsdExecutor` import — the deferred shell it produces is the pump's executor view.
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:433GeneratedApp@openelement/router · ./server-runtimeinterfacepublic
Everything the generated entry destructures and re-exports.
GeneratedAppapp: Hono<BlankEnv, BlankSchema, "/"> (required) — The Hono app — the entry's default export.; hono: HonoBridge (required) — The internal Hono↔WinterCG bridge: `contexts` feeds the entry's `app.all('*')` request hook, `asFetchHandler`/`asFetchMiddleware` adapt every generated page handler onto the WinterCG route middleware.; handler: (request: Request, context?: { env?: unknown; platform?: unknown; }) => Promise<Response> (required) — The WinterCG request handler: `app.fetch` with the fetch-middleware onion composed around it when `middleware.use` is configured (#858).; devFetch?: { fetch: (request: Request, env: unknown, executionContext: unknown) => Promise<Response>; } (optional) — Dev-server boundary export, present only with `middleware.use` (#858).; runtimeAdapter: Record<string, unknown> (required) — Deployment adapter record (`openElementRuntimeAdapter`).; pageHandlers: Record<string, Record<string, unknown>> (required) — Per-path page handler table the generated GET/POST wiring populates.; apiRouteRecords: { id: string; path: string; handlers: unknown; }[] (required) — API route records the generated API wiring pushes into.; methodNotAllowed: (request: Request, allow: string[]) => Response (required) — The 405 responder for `createRouteMiddleware({ methodNotAllowed })` (#572).; actionBodyLimit: MiddlewareHandler (required) — The default action body-limit middleware (#568), bound to the policy constant.; registerSsrComponent: (tag: string, ctor: unknown) => void (required) — SSR registration seam (security.ts).; setRequestTimeClientScript: (src: string | null | undefined) => void (required) — Request-time client-script src setter (`dist/server/index.js` startup).; clientScriptDescriptors: () => Array<{ type: "module"; src: string; }> (required) — wrapInDocument `scripts` descriptors for the current runtime mode (#951).; locales: readonly string[] (required); getDefaultLocale: () => string (required); ssr?: PageSsrRenderer (optional) — Page-render bindings — present only when the config carried `pageRuntime`.; pageProps?: ((routeModule: unknown, context: PageContext) => ProjectedProps) (optional); pageErrorProps?: ((routeModule: unknown, error: unknown, context: PageContext) => ProjectedProps) (optional); statusHtml?: StatusHtmlRenderer (optional); resolveAppShell?: ((routeMeta?: Record<string, unknown>) => ResolvedAppShell) (optional); renderAppShell?: ((pageHtml: unknown, routePath: string, options?: { locale?: string; routeMeta?: Record<string, unknown>; }) => string) (optional)
packages/router/src/vite/internal/server-runtime/app.ts:94GeneratedAppConfig@openelement/router · ./server-runtimeinterfacepublic
The route-descriptor data the generated entry hands the factory.
GeneratedAppConfigislands: Record<string, string> (required) — Build-time island map: tag -> client module path (#951 upgrade URLs).; appShellPlan: AppShellPlan (required) — The build's shell plan (serialized generated data).; locales: readonly string[] (required) — Declared project locales (serialized generated data).; navSections: readonly unknown[] (required) — Nav sections (serialized generated data; empty on the 1.0 surface).; headerNav: readonly Record<string, unknown>[] (required) — Header nav links (serialized generated data; empty on the 1.0 surface).; defaultLocale: string (required) — The project's default locale (generated data).; devClientScriptSrc: string | null (required) — The dev island-client URL the entry computed from its compile-time `import.meta.env` constants; null when the app ships no client entry.; pageHandlerPaths: readonly string[] (required) — Page route paths, in route order — the handler table's keys.; fetchMiddleware?: readonly FetchMiddleware[] (optional) — `middleware.use` module defaults, user-configured order (use[0] outermost).; pageRuntime?: GeneratedPageRuntime (optional)
packages/router/src/vite/internal/server-runtime/app.ts:68HonoBridge@openelement/router · ./server-runtimeinterfacepublic
The internal Hono↔WinterCG bridge (never user-visible): the WinterCG route middleware from
HonoBridgecontexts: WeakMap<object, ActionHonoContext> (required) — Request → Hono context, populated by the entry's `app.all('*')` hook.; asFetchHandler: (handler: (context: ActionHonoContext, route: unknown) => unknown) => (request: Request, route: unknown, next: () => unknown) => unknown (required) — Adapts a Hono-dialect handler onto the WinterCG `(request, route)` shape.; asFetchMiddleware: (middleware: (context: ActionHonoContext, next: () => unknown) => unknown) => (request: Request, route: unknown, next: () => unknown) => Promise<unknown> (required) — Adapts a Hono-dialect middleware onto the WinterCG onion shape.
packages/router/src/vite/internal/server-runtime/action-runtime.ts:347installSsrRegistryGuard@openelement/router · ./server-runtimefunctionpublic
Installs the SSR registry guard and returns its registration seam. Behavior contract (moved verbatim from the generated entry): - The TRUE original `define` is captured ONCE on the registry itself (SSR_REGISTRY_ORIGINAL_DEFINE): the registry outlives vite dev SSR module re-evaluations, so a second installation must never capture the already-wrapped `define` as its "original" (#1339). - On the dev SSR stub registry (SSR_REGISTRY_STUB_MARKER) re-definition WINS — the registry outlives module re-evaluation, so route edits only reach SSR output when define() overwrites the stale class (#952). - `NotSupportedError` from a non-stub registry is swallowed (the shim's duplicate-define rejection is its designed live-reload notice); any other error propagates. - A tag the entry registered itself (ownership map) is re-registered through the TRUE original define — a dev re-evaluation registers a FRESH class for the SAME tag and the new class must win. A registration the entry did NOT make is a genuine conflict and keeps the fail-closed no-op.
(): SsrRegistryGuard packages/router/src/vite/internal/server-runtime/security.ts:70isSsgPrerenderDispatch@openelement/router · ./server-runtimefunctionpublic
True when the dispatch is an hono/ssg prerender pass. Static build output cannot carry per-request state — the SSG nonce contract (nonce.ts: SSG output carries none, static bytes cannot be per-request) — so the CSP auto-nonce binds nothing on this pass: the handlers' `c.get('cspNonce')` stays undefined and `wrapInDocument` serializes the client script tags nonce-free while the SSG CSP injector writes the policy-only meta.
(env: unknown): boolean packages/router/src/vite/internal/server-runtime/response-channel.ts:168localeFromPath@openelement/router · ./server-runtimefunctionpublic
Path-derived locale resolution: the first non-empty path segment when it is a declared locale, the fallback otherwise. `locales` is the generated entry's `__locales` project declaration, so request-time resolution and the pages the build emits agree (see expandI18nLocales).
(locales: readonly string[], path: unknown, fallback: string): string packages/router/src/vite/internal/server-runtime/page-render.ts:73localizeShellHref@openelement/router · ./server-runtimefunctionpublic
Shell href localization: root-relative hrefs gain the active locale prefix unless they already carry it; locale-neutral, external, and protocol-relative hrefs pass through untouched. Nav data is not part of the 1.0 surface, so the generated `__headerNav` is empty today — the contract keeps its guard.
(href: string, locale: string, defaultLocale: string): string packages/router/src/vite/internal/server-runtime/document-runtime.ts:27PageContext@openelement/router · ./server-runtimeinterfacepublic
The request-scoped page context the generated handlers build for one render (#1326).
PageContext packages/router/src/vite/internal/server-runtime/page-render.ts:83pageDefinition@openelement/router · ./server-runtimefunctionpublic
Canonical page-definition extractor: a route module's default export carries the authoring descriptor on `openElementPage`; anything else projects to the empty descriptor. Kept a hoisted-friendly plain function — the generated entry calls it at module evaluation (route registration, routeInfo) and inside every request handler.
(routeModule: unknown): PageDefinition packages/router/src/vite/internal/server-runtime/page-render.ts:43PageDefinition@openelement/router · ./server-runtimetypepublic
The page descriptor a definePage/defineLitPage route module carries on its default export.
PageDefinition packages/router/src/vite/internal/server-runtime/page-render.ts:24PagePropsRuntime@openelement/router · ./server-runtimeinterfacepublic
The page props projection runtime: the default projection from route params/loader data plus the descriptor's `props`/`error` projector seams. Every seam filters the canonical dangerous-key set (#1214) so hostile params, loader data, or author projector output can never pollute the props record that flows into the compiled serializer.
PagePropsRuntimedefaultPageProps: (context: PageContext) => ProjectedProps (required) — The descriptor-less fallback: params + plain-object loader data.; pageProps: (routeModule: unknown, context: PageContext) => ProjectedProps (required) — The descriptor `props` projector, falling back to the default projection.; pageErrorProps: (routeModule: unknown, error: unknown, context: PageContext) => ProjectedProps (required) — The descriptor `error` projector for the error-boundary re-render.
packages/router/src/vite/internal/server-runtime/page-render.ts:99PagePropsRuntimeDeps@openelement/router · ./server-runtimeinterfacepublic
The binding the generated-app factory hands {@linkcode createPagePropsRuntime}.
PagePropsRuntimeDepsdangerousKeys: ReadonlySet<string> (required) — The canonical dangerous-key set (the factory imports it from the kernel-free /authoring leaf): one rule, no second copy.
packages/router/src/vite/internal/server-runtime/page-render.ts:109PageSsrRenderer@openelement/router · ./server-runtimetypepublic
The generated entry's `__ssr` binding: render one registered host tag to HTML. `depth` bounds nested island expansion; `projectedChildren` claims external content (the app-shell slot). Fails closed per the forks below.
PageSsrRenderer packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:41PageSsrSourceInfo@openelement/router · ./server-runtimeinterfacepublic
Source metadata the serializer attributes to a render (the `{ route }` seam).
PageSsrSourceInforoute?: string (optional); source?: string (optional)
packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:28ProjectedChildren@openelement/router · ./server-runtimetypepublic
Trusted parent-owned light children keyed by slot name (the shell slot claim).
ProjectedChildrenforEach: (callbackfn: (value: TrustedHtmlValue, key: string, map: ReadonlyMap<string, TrustedHtmlValue>) => void, thisArg?: any) => void (required); get: (key: string) => TrustedHtmlValue (required); has: (key: string) => boolean (required); size.toString: (radix?: number) => string (required) — Returns a string representation of an object.; size.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; size.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; size.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; size.valueOf: () => number (required) — Returns the primitive value of the specified object.; size.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; entries: () => MapIterator<[string, TrustedHtmlValue]> (required) — Returns an iterable of key, value pairs for every entry in the map.; keys: () => MapIterator<string> (required) — Returns an iterable of keys in the map; values: () => MapIterator<TrustedHtmlValue> (required) — Returns an iterable of values in the map; __@iterator@4634: () => MapIterator<[string, TrustedHtmlValue]> (required) — Returns an iterable of entries in the map.
packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:34ProjectedProps@openelement/router · ./server-runtimetypepublic
The projected props record handed to the compiled page host.
ProjectedProps packages/router/src/vite/internal/server-runtime/page-render.ts:90resolveCompiledPageTag@openelement/router · ./server-runtimefunctionpublic
Native page-tag resolution (#1276, B1.3-F1): the compiled Part Program is the one canonical source for the route→program tag binding. A definePage route module default-exports the compiled page class, whose `__partProgram.tag` carries the
(routeModule: unknown, fallbackTag: string): string packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:144resolveLitPageTag@openelement/router · ./server-runtimefunctionpublic
Lit page-tag resolution (#1339 lit fork): a defineLitPage route records its host tag on the class's `openElementPageTag` static (there is no compiled Part Program in the lit path); the path-derived tag stays the fallback.
(routeModule: unknown, fallbackTag: string): string packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:159RouteModule@openelement/router · ./server-runtimeinterfacepublic
A route module namespace as the generated entry imports it (`import * as $route`).
RouteModule packages/router/src/vite/internal/server-runtime/page-render.ts:27runActionProtocol@openelement/router · ./server-runtimefunctionpublic
Runs the action POST protocol for one request: resolve the action (named `?/name` map or bare `action` export), enforce the same-origin CSRF floor, parse the form body, classify the outcome, and answer per channel: - fetch callers (`ACTION_FETCH_HEADER: true`) always get JSON — the ActionResult union for outcomes, RFC 9457 problem+json for protocol errors (CSRF 403, unknown action 404, unparseable body 400); - native form callers get PRG 303 on success, the status page on protocol errors, and `{ actionResult }` back for a `fail()` so the handler re-renders the form at the author's status (422).
(context: ActionHonoContext, routeModule: unknown, loadContext: ActionLoadContext, renderStatusPage: (title: string, message: string, status: number) => Response, state: ActionProtocolState): Promise<ActionExecution>req: { readonly url: string; readonly raw: Request; header(name: string): string | undefined; } (required); header: (name: string, value: string) => void (required); get: (key: string) => unknown (required); json: (object: unknown, status?: number, headers?: Record<string, string>) => Response (required); text: (text: string, status?: number, headers?: Record<string, string>) => Response (required); redirect: (location: string, status?: number) => Response (required); res: Response (required) — The response under construction (read by the middleware bridge fallback).
packages/router/src/vite/internal/server-runtime/action-runtime.ts:106SsrRegistryGuard@openelement/router · ./server-runtimeinterfacepublic
What the generated entry gets from {@linkcode installSsrRegistryGuard}.
SsrRegistryGuardregister: (tag: string, ctor: unknown) => void (required) — Registers one component class under `tag` with the same ownership/conflict rules the generated entry has always applied (#952, #1339).
packages/router/src/vite/internal/server-runtime/security.ts:36StatusHtmlRenderer@openelement/router · ./server-runtimetypepublic
The generated entry's `__statusHtml` binding: title/message rendered into a minimal status page.
StatusHtmlRenderer packages/router/src/vite/internal/server-runtime/document-runtime.ts:39STREAM_BROWSER_BOOTSTRAP@openelement/router · ./server-runtimeconstpublic
The browser installer bootstrap — the inline head script of every streamed page: the MutationObserver that scans streaming templates, the typed seed admission against the same policy budgets the server enforced, the anchor range ownership check, the frame markup safety screen, and the pagehide retirement/BFCache contract. The module owns the string so the server pump and the browser installer read the same constants from one place; S4 will re-home it from the per-page inline form to a shared asset.
string packages/router/src/vite/internal/server-runtime/stream-runtime.ts:515StreamBodyConfig@openelement/router · ./server-runtimeinterfacepublic
Binding-time configuration of {@linkcode createStreamBody}.
StreamBodyConfigescapeAttr: (value: string) => string (required) — The entry's `escapeAttr` import — an Element function, injected so this module stays free of an Element runtime edge.; timeoutMs.toString: (radix?: number) => string (required) — Returns a string representation of an object.; timeoutMs.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; timeoutMs.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; timeoutMs.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; timeoutMs.valueOf: () => number (required) — Returns the primitive value of the specified object.; timeoutMs.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:99StreamBodyFn@openelement/router · ./server-runtimetypepublic
The bound streaming body builder the generated handler calls.
StreamBodyFn packages/router/src/vite/internal/server-runtime/stream-runtime.ts:114StreamBodyOptions@openelement/router · ./server-runtimeinterfacepublic
Per-request inputs of the streaming body builder.
StreamBodyOptionsscope: StreamRequestScope (required); route: string (required); manifest: StreamRouteManifest (required); executor: StreamExecutorView (required); records: readonly StreamFieldRecord[] (required); document: StreamDocumentParts (required); token: string (required)
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:88StreamDocumentParts@openelement/router · ./server-runtimeinterfacepublic
The streamed document halves the element `documentStreamParts` produced.
StreamDocumentPartsprefix: string (required); suffix: string (required)
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:82StreamExecutorView@openelement/router · ./server-runtimeinterfacepublic
The slice of the element deferred executor the pump consumes.
StreamExecutorViewshell: string (required); owner: { readonly instanceId: string; } (required); seed: Record<string, { type: string; }> (required); resolvedValue: (field: string, value: unknown) => unknown (required); serializeResolved: (field: string, value: unknown) => string[] (required)
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:73StreamFieldRecord@openelement/router · ./server-runtimeinterfacepublic
One declared deferred field's settlement record (the pump's queue unit).
StreamFieldRecordentry: { field: string; signal: string; owners: Array<{ kind: "part" | "region"; index: number; location: string; source: CompileElementResult["program"]["sourceMap"]… (required); settled: boolean (required); failed: boolean (required); error: unknown (required); value: unknown (required); notify?: (() => void) (optional)
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:51streamFields@openelement/router · ./server-runtimefunctionpublic
The deferred-field front gate: validates the loader data against the route's build manifest (one plain object, the `STREAM_MAX_FIELDS` / `STREAM_MAX_OWNERS` budget, every declared field present, no undeclared thenable), attaches both settlement observers per field, and hands back the records the pump queues. Every rejection first sweeps the loader's own thenables for observation (see {@linkcode observeThenables}).
(data: unknown, manifest: StreamRouteManifest): StreamFieldRecord[] packages/router/src/vite/internal/server-runtime/stream-runtime.ts:193StreamRequestScope@openelement/router · ./server-runtimeinterfacepublic
The request scope the generated handler builds around a streamed route.
StreamRequestScoperequest: Request (required) — The request the loader sees, carrying the scope's abort signal.; upstreamSignal: AbortSignal (required) — The original WinterCG request's signal (the response-cancel source).; abortWork: () => void (required) — Aborts the loader's work without tearing down the scope bridge.; cancel: () => void (required) — Detaches the upstream bridge and aborts the scope (handler-level exit).
packages/router/src/vite/internal/server-runtime/stream-runtime.ts:61TrustedHtmlValue@openelement/router · ./server-runtimeinterfacepublic
Opaque capability marking HTML the application has explicitly vetted as trusted.
TrustedHtmlValuehtml: string (required)
packages/router/src/vite/internal/server-runtime/renderer-runtime.ts:23ArtifactInfo@openelement/router · ./viteinterfacepublic
File size info for a single artifact
ArtifactInfoname: string (required); path: string (required); sizeBytes.toString: (radix?: number) => string (required) — Returns a string representation of an object.; sizeBytes.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; sizeBytes.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; sizeBytes.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; sizeBytes.valueOf: () => number (required) — Returns the primitive value of the specified object.; sizeBytes.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; sizeKB: string (required)
packages/router/src/vite/build-manifest.ts:28buildApp@openelement/router · ./vitefunctionpublic
Build an OpenElement application through the supported adapter boundary. Consumers configure the adapter in `vite.config.ts`; this function owns the invocation so CLI callers do not need to know the adapter's internal build phases or Vite plugin ordering.
(config?: InlineConfig): Promise<unknown> packages/router/src/vite/index.ts:76BuildManifest@openelement/router · ./viteinterfacepublic
Full build manifest summary
BuildManifestphase: 1 | 2 | 3 (required); timestamp: string (required); islands: ArtifactInfo[] (required); clientEntry: ArtifactInfo | null (required); htmlPages: ArtifactInfo[] (required); totalJsBytes.toString: (radix?: number) => string (required) — Returns a string representation of an object.; totalJsBytes.toFixed: (fractionDigits?: number) => string (required) — Returns a string representing a number in fixed-point notation.; totalJsBytes.toExponential: (fractionDigits?: number) => string (required) — Returns a string containing a number represented in exponential notation.; totalJsBytes.toPrecision: (precision?: number) => string (required) — Returns a string containing a number represented either in exponential or fixed-point notation with a specified number of digits.; totalJsBytes.valueOf: () => number (required) — Returns the primitive value of the specified object.; totalJsBytes.toLocaleString: { (locales?: string | string[], options?: Intl.NumberFormatOptions): string; (locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions): string; } (required) — Converts a number to a string by using the current or specified locale.; totalHtmlBytes: number (required); headExtrasSize: number (required); warnings: string[] (required) — Budget warnings (files > threshold)
packages/router/src/vite/build-manifest.ts:36default@openelement/router · ./vitefunctionpublic
Low-level Vite plugin pipeline: SSR dev server, SSG and islands without the content/i18n conveniences of `openElement()`.
(config?: OpenPipelineConfig): Plugin[]mode?: "ssg" (optional) — Build/dev mode. 'ssg' (default) enables SSR dev server + static generation.; routes.dir?: string (optional); output.outDir?: string (optional); island.dir?: string (optional); island.upgradeStrategy?: string (optional); viewTransition?: boolean (optional); headExtras?: string (optional)
packages/router/src/vite/index.ts:52FrameworkOptions@openelement/router · ./vitetypepublic
Adapter options extend Element options with build-only delivery declarations. The element package remains unaware of Vite/SSG policy.
FrameworkOptions packages/router/src/vite/framework.ts:36mdxPlugin@openelement/router · ./vitefunctionpublic
Vite plugin compiling `.mdx` route files into compiled page modules.
(options?: OpenMdxPluginOptions): PluginroutesDir?: string (optional) — Routes directory (as configured in openElement()). The compiled page tag derives from the route-file-relative path so the generated entry's path-derived registration tag matches the program tag.
packages/router/src/vite/plugin-mdx.ts:59openElement@openelement/router · ./vitefunctionpublic
Create the full OpenElement Vite plugin set: route pipeline, SSG and islands.
(options?: OpenElementOptions): Plugin[]head.title?: string (optional) — Document title; defaults to the package.json `name`.; head.description?: string (optional) — `<meta name="description">` + `og:description`.; head.lang?: string (optional) — `<html lang>`; defaults to `en`.; head.favicon?: string (optional) — Site-root-relative favicon path, emitted as `<link rel="icon">`.; head.ogImage?: string (optional) — `og:image` URL. Absolute (crawlable) or site-root-relative.; head.stylesheets?: string[] (optional) — External stylesheets linked into `<head>`.; head.scripts?: OpenElementHeadScript[] (optional) — External scripts emitted into `<head>`; inline code is not accepted here.; ssg.dynamicRouteFailure?: "fail" | "warn" (optional) — Policy for dynamic-route render failures during SSG. See {@link SsgRenderOptions.dynamicRouteFailure}.; build.outDir?: string (optional) — Output directory for the build artifacts. Defaults to `dist`.; build.manifestBudget?: { islandKB?: number; totalJsKB?: number; pageKB?: number; } (optional) — Advisory only: exceeded budgets print build-manifest warnings and never fail the build; enforce them in your own build-output test.; renderer?: "native" | "lit" (optional) — Page renderer selection (Beta.2.2, #1339). EXPLICIT, never inferred: 'native' (default) renders pages through the compiled Part Program serializer (renderDsd); 'lit' renders LitElement pages through; routesDir?: string (optional) — Directory the route scanner walks, relative to the Vite root. Defaults to `app/routes`.; islandsDir?: string (optional) — Directory island modules are discovered in. Defaults to `app/islands`.; componentsDir?: string (optional) — Directory non-route components live in. Defaults to `app/components`.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits, e.g. `['@openelement/ui']`.; appShell?: AppShellConfig (optional) — Application shell declaration; `false` disables the shell, `'default'` uses the built-in one.; layouts?: LayoutsConfig (optional) — Per-layout shell declarations keyed by layout name.; mode?: "ssg" (optional) — Build mode. 'ssg' (default) generates static HTML.; headExtras?: string (optional) — @dangerous injected as-is, only use with controlled content; inject.stylesheets?: (string | { href: string; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<string, string | number | boolean>; })[] (optional) — Stylesheets linked into the document head; each entry is an href or a link record with integrity/crossorigin/attrs.; inject.scripts?: (string | { src: string; type?: string; async?: boolean; defer?: boolean; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<str… (optional) — Scripts emitted into the document; each entry is a src or a script record with type/async/defer/integrity/crossorigin/attrs.; inject.headFragments?: string[] (optional) — @dangerous fragments injected as-is. Trust boundary (same level as `trustedHtml`): never concatenate user-controlled content into these fragments; sanitize untrusted data at your own system boundary first. The framework only enforces no-`<script>` and no-executable-`<style>`.; ssr.noExternal?: (string | RegExp)[] (optional); island.upgradeStrategy?: "load" | "idle" | "visible" | "only" (optional); viewTransition?: boolean (optional) — Enable the View Transitions API for client navigations. Defaults to true.; speculation?: boolean | { prerender?: string[]; prefetch?: string[]; exclude?: string[]; eagerness?: "immediate" | "moderate" | "conservative"; } (optional) — Speculation Rules emission: `true` uses framework defaults, or pass prerender/prefetch URL lists, exclusions and an eagerness.; middleware.cors?: boolean (optional) — Enable the built-in CORS middleware.; middleware.corsOrigin?: string | string[] (optional) — Static CORS allowlist data, serialized into the generated entry as JSON. Mutually exclusive with {@link FrameworkOptions.middleware.corsOriginModule }.; middleware.corsOriginModule?: string (optional) — Path to a module that default-exports `(origin: string) => string | undefined`. The generated entry imports the module — the callback is never serialized — so it may close over module scope and import dependencies. Resolved with the same idiom as `appShell.import` (e.g. './app/cors-origin.ts'). Mutually exclusive with `corsOrigin`.; middleware.requestId?: boolean (optional) — Emit and honor a per-request id header.; middleware.logger?: boolean (optional) — Log each request through the built-in logger.; middleware.securityHeaders?: boolean (optional) — Attach the built-in security response headers.; middleware.csp?: { policy?: string; nonce?: boolean; reportOnly?: boolean; } (optional) — Content-Security-Policy emission: the policy string, nonce generation, and report-only mode.; middleware.use?: string[] (optional) — Fetch middleware chain (#858), composed around the framework handler in onion order (`use[0]` outermost), outside all built-in middleware above. Each entry is a MODULE PATH (same resolution idiom as `appShell.import`, e.g. './app/middleware/auth.ts') whose default export is a {@link Middleware}; the generated entry emits `import * as __mw_N from '<path>'` and composes `__mw_N.default` in configur…; criticalAssets.fonts?: CriticalFontAsset[] (optional); criticalAssets.styles?: (string | CriticalStyleAsset)[] (optional); criticalAssets.stylesheets?: (string | CriticalStyleAsset)[] (optional) — Alias for styles accepted by config producers.; criticalAssets.inlineScripts?: (string | CriticalInlineScriptAsset)[] (optional); criticalAssets.allowExternalRenderBlocking?: boolean (optional) — Allow intentional external render-blocking styles/scripts.; criticalAssets.allowRenderBlockingExternal?: boolean (optional) — Alias retained only within this build-side config shape.; criticalAssets.minifyInlineStyles?: boolean (optional) — Minify inline CSS. Defaults to true.; criticalAssets.origin?: string (optional) — Origin used to distinguish same-origin and cross-origin absolute URLs.; critical?: CriticalAssetsOptions (optional); i18n?: OpenElementI18nOptions (optional)
packages/router/src/vite/app-vite.ts:43OpenElementBlogOptions@openelement/router · ./viteinterfacepublic
Blog options stored in the adapter build context.
OpenElementBlogOptionscontentDir?: string (optional); basePath?: string (optional)
packages/router/src/vite/framework.ts:43OpenElementBuildContext@openelement/router · ./viteclasspublic
The build's shared mutable state: the resolved framework options, the phase-1/phase-3 metadata, the sub-plugin data slots, and the production plan and artifact records the release and deployment adapters read. One instance is threaded through every adapter plugin for a build.
class OpenElementBuildContext packages/router/src/vite/build-context.ts:170OpenElementBuildContextLike@openelement/router · ./viteinterfacepublic
Minimal build-context contract available to adapter sub-plugins.
OpenElementBuildContextLikeplugins: { [key: string]: unknown; blogOptions: OpenElementBlogOptions | null; navSections: OpenElementNavSection[]; headerNav: OpenElementHeaderNavLink[]; sitemapOptio… (required); registerPlugin: (name: string, instance: unknown) => void (required)
packages/router/src/vite/framework.ts:68OpenElementI18nContextOptions@openelement/router · ./viteinterfacepublic
Locale options carried through the build context to the i18n integration.
OpenElementI18nContextOptions packages/router/src/vite/framework.ts:61OpenElementI18nOptions@openelement/router · ./viteinterfacepublic
Project locale declaration. The build expands every static and dynamic route under each additional locale prefix (`/zh/docs`), passes the resolved locale to page `head`/`props` hooks and localizes app-shell navigation. Absent means a single-locale site with no locale prefixing — the pre-i18n output, byte for byte.
OpenElementI18nOptionslocales: string[] (required) — Locale prefixes the build expands, e.g. `['en', 'zh']`.; defaultLocale?: string (optional) — Locale served without a prefix. Defaults to the first entry.
packages/router/src/vite/framework.ts:25OpenElementNavSection@openelement/router · ./viteinterfacepublic
Navigation section produced by the adapter content pipeline.
OpenElementNavSectionsection: string (required); items: { path: string; label: string; order?: number; }[] (required)
packages/router/src/vite/framework.ts:49OpenElementOptions@openelement/router · ./viteinterfacepublic
Options for the openElement() unified Vite entry. The framework-options face here is deliberately narrower than the internal {@linkcode FrameworkOptions} transfer type: - the document-head channel is spelled `head` (never `html`), the same spelling `openelement.config.ts` uses — passing `html` fails closed and names the replacement; - the source roots keep their explicit spellings (`routesDir`, `islandsDir`, `componentsDir`), while a config file's `dirs` block is the spelling that also moves the file conventions.
OpenElementOptionshead.title?: string (optional) — Document title; defaults to the package.json `name`.; head.description?: string (optional) — `<meta name="description">` + `og:description`.; head.lang?: string (optional) — `<html lang>`; defaults to `en`.; head.favicon?: string (optional) — Site-root-relative favicon path, emitted as `<link rel="icon">`.; head.ogImage?: string (optional) — `og:image` URL. Absolute (crawlable) or site-root-relative.; head.stylesheets?: string[] (optional) — External stylesheets linked into `<head>`.; head.scripts?: OpenElementHeadScript[] (optional) — External scripts emitted into `<head>`; inline code is not accepted here.; ssg.dynamicRouteFailure?: "fail" | "warn" (optional) — Policy for dynamic-route render failures during SSG. See {@link SsgRenderOptions.dynamicRouteFailure}.; build.outDir?: string (optional) — Output directory for the build artifacts. Defaults to `dist`.; build.manifestBudget?: { islandKB?: number; totalJsKB?: number; pageKB?: number; } (optional) — Advisory only: exceeded budgets print build-manifest warnings and never fail the build; enforce them in your own build-output test.; renderer?: "native" | "lit" (optional) — Page renderer selection (Beta.2.2, #1339). EXPLICIT, never inferred: 'native' (default) renders pages through the compiled Part Program serializer (renderDsd); 'lit' renders LitElement pages through; routesDir?: string (optional) — Directory the route scanner walks, relative to the Vite root. Defaults to `app/routes`.; islandsDir?: string (optional) — Directory island modules are discovered in. Defaults to `app/islands`.; componentsDir?: string (optional) — Directory non-route components live in. Defaults to `app/components`.; packageIslands?: string[] (optional) — Extra package names whose island modules the build admits, e.g. `['@openelement/ui']`.; appShell?: AppShellConfig (optional) — Application shell declaration; `false` disables the shell, `'default'` uses the built-in one.; layouts?: LayoutsConfig (optional) — Per-layout shell declarations keyed by layout name.; mode?: "ssg" (optional) — Build mode. 'ssg' (default) generates static HTML.; headExtras?: string (optional) — @dangerous injected as-is, only use with controlled content; inject.stylesheets?: (string | { href: string; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<string, string | number | boolean>; })[] (optional) — Stylesheets linked into the document head; each entry is an href or a link record with integrity/crossorigin/attrs.; inject.scripts?: (string | { src: string; type?: string; async?: boolean; defer?: boolean; integrity?: string; crossorigin?: "anonymous" | "use-credentials"; attrs?: Record<str… (optional) — Scripts emitted into the document; each entry is a src or a script record with type/async/defer/integrity/crossorigin/attrs.; inject.headFragments?: string[] (optional) — @dangerous fragments injected as-is. Trust boundary (same level as `trustedHtml`): never concatenate user-controlled content into these fragments; sanitize untrusted data at your own system boundary first. The framework only enforces no-`<script>` and no-executable-`<style>`.; ssr.noExternal?: (string | RegExp)[] (optional); island.upgradeStrategy?: "load" | "idle" | "visible" | "only" (optional); viewTransition?: boolean (optional) — Enable the View Transitions API for client navigations. Defaults to true.; speculation?: boolean | { prerender?: string[]; prefetch?: string[]; exclude?: string[]; eagerness?: "immediate" | "moderate" | "conservative"; } (optional) — Speculation Rules emission: `true` uses framework defaults, or pass prerender/prefetch URL lists, exclusions and an eagerness.; middleware.cors?: boolean (optional) — Enable the built-in CORS middleware.; middleware.corsOrigin?: string | string[] (optional) — Static CORS allowlist data, serialized into the generated entry as JSON. Mutually exclusive with {@link FrameworkOptions.middleware.corsOriginModule }.; middleware.corsOriginModule?: string (optional) — Path to a module that default-exports `(origin: string) => string | undefined`. The generated entry imports the module — the callback is never serialized — so it may close over module scope and import dependencies. Resolved with the same idiom as `appShell.import` (e.g. './app/cors-origin.ts'). Mutually exclusive with `corsOrigin`.; middleware.requestId?: boolean (optional) — Emit and honor a per-request id header.; middleware.logger?: boolean (optional) — Log each request through the built-in logger.; middleware.securityHeaders?: boolean (optional) — Attach the built-in security response headers.; middleware.csp?: { policy?: string; nonce?: boolean; reportOnly?: boolean; } (optional) — Content-Security-Policy emission: the policy string, nonce generation, and report-only mode.; middleware.use?: string[] (optional) — Fetch middleware chain (#858), composed around the framework handler in onion order (`use[0]` outermost), outside all built-in middleware above. Each entry is a MODULE PATH (same resolution idiom as `appShell.import`, e.g. './app/middleware/auth.ts') whose default export is a {@link Middleware}; the generated entry emits `import * as __mw_N from '<path>'` and composes `__mw_N.default` in configur…; criticalAssets.fonts?: CriticalFontAsset[] (optional); criticalAssets.styles?: (string | CriticalStyleAsset)[] (optional); criticalAssets.stylesheets?: (string | CriticalStyleAsset)[] (optional) — Alias for styles accepted by config producers.; criticalAssets.inlineScripts?: (string | CriticalInlineScriptAsset)[] (optional); criticalAssets.allowExternalRenderBlocking?: boolean (optional) — Allow intentional external render-blocking styles/scripts.; criticalAssets.allowRenderBlockingExternal?: boolean (optional) — Alias retained only within this build-side config shape.; criticalAssets.minifyInlineStyles?: boolean (optional) — Minify inline CSS. Defaults to true.; criticalAssets.origin?: string (optional) — Origin used to distinguish same-origin and cross-origin absolute URLs.; critical?: CriticalAssetsOptions (optional); i18n?: OpenElementI18nOptions (optional)
packages/router/src/vite/app-vite.ts:35OpenMdxPluginOptions@openelement/router · ./viteinterfacepublic
Options for the `.mdx` route plugin ({@linkcode mdxPlugin}).
OpenMdxPluginOptionsroutesDir?: string (optional) — Routes directory (as configured in openElement()). The compiled page tag derives from the route-file-relative path so the generated entry's path-derived registration tag matches the program tag.
packages/router/src/vite/plugin-mdx.ts:26openPipeline@openelement/router · ./vitefunctionpublic
Low-level Vite plugin pipeline: SSR dev server, SSG and islands without the content/i18n conveniences of `openElement()`.
(config?: OpenPipelineConfig): Plugin[]mode?: "ssg" (optional) — Build/dev mode. 'ssg' (default) enables SSR dev server + static generation.; routes.dir?: string (optional); output.outDir?: string (optional); island.dir?: string (optional); island.upgradeStrategy?: string (optional); viewTransition?: boolean (optional); headExtras?: string (optional)
packages/router/src/vite/index.ts:52OpenPipelineConfig@openelement/router · ./viteinterfacepublic
Options for the low-level {@linkcode openPipeline} Vite plugin pipeline.
OpenPipelineConfigmode?: "ssg" (optional) — Build/dev mode. 'ssg' (default) enables SSR dev server + static generation.; routes.dir?: string (optional); output.outDir?: string (optional); island.dir?: string (optional); island.upgradeStrategy?: string (optional); viewTransition?: boolean (optional); headExtras?: string (optional)
packages/router/src/vite/index.ts:41SpeculationRulesOptions@openelement/router · ./viteinterfacepublic
Speculation Rules configuration for SSG post-processing
SpeculationRulesOptionsprerender?: string[] (optional) — URL patterns to prerender (fully render in background before navigation).; prefetch?: string[] (optional) — URL patterns to prefetch (fetch HTML + resources without rendering).; exclude?: string[] (optional) — URL patterns to exclude from both prefetch and prerender.; eagerness?: "immediate" | "moderate" | "conservative" (optional) — Eagerness level for prerender rules.
packages/router/src/vite/internal/protocol/ssg.ts:379SsgBehaviorOptions@openelement/router · ./viteinterfacepublic
User-facing SSG build behavior switches (OpenElementOptions['ssg']).
SsgBehaviorOptionsdynamicRouteFailure?: "fail" | "warn" (optional) — Policy for dynamic-route render failures during SSG. See {@link SsgRenderOptions.dynamicRouteFailure}.
packages/router/src/vite/internal/protocol/ssg.ts:64CREATE_INSTALL_PERMISSIONS@openelement/create · ./install-commandconstpublic
Deno permissions the bootstrap needs. Owner ruling 2026-09-21: the documented command uses bare `-A` — the consumer scaffolds their own project, and the scoped-permission form reads as noise (the same ruling narrowed the `check-no-allow-all` tripwire to an exact-line exemption for this command). `--minimum-dependency-age 0` is a functional footnote kept in prose where needed, not part of the documented shape.
readonly string[] packages/create/src/install-command.ts:30CREATE_INSTALL_TAG@openelement/create · ./install-commandconstpublic
The dist-tag the documented install resolves; the exact version is registry truth.
"alpha" packages/create/src/install-command.ts:20CREATE_PACKAGE_SPECIFIER@openelement/create · ./install-commandconstpublic
The npm specifier the generator is published under.
"npm:@openelement/create" packages/create/src/install-command.ts:17CREATE_PROJECT_PLACEHOLDER@openelement/create · ./install-commandconstpublic
Placeholder the usage text and the docs use in place of a project name.
"<project-name>" packages/create/src/install-command.ts:33createInstallCommand@openelement/create · ./install-commandfunctionpublic
Build the canonical install command for `projectName`. `projectName` defaults to the placeholder so callers that document the command shape (usage output) and callers that show a concrete example share one builder and therefore one flag list.
(projectName?: string, options?: { tag?: string; }): string packages/create/src/install-command.ts:42manifest@openelement/ui · rootconstpublic
The build-time generated package manifest (declarations for every UI component).
OpenElementPackageManifest packages/ui/src/manifest.ts:14OpenBadge@openelement/ui · rootclasspublic
Compact status badge backed by Open Props semantic tokens.
class OpenBadge extends OpenElement packages/ui/src/open-badge.tsx:13OpenCallout@openelement/ui · rootclasspublic
Callout/notice box for inline documentation alerts.
class OpenCallout extends OpenElement packages/ui/src/open-callout.tsx:37OpenCard@openelement/ui · rootclasspublic
Minimal card container with optional header and footer.
class OpenCard extends OpenElement packages/ui/src/open-card.tsx:31OpenCodeBlock@openelement/ui · rootclasspublic
Token-color rationale (the styles below ship to clients, so this note stays out of the template): the vendored light-DOM Prism theme's comment gray #708090 is 3.6:1 on its own #f5f2f0 background (under AA), but that pairing never renders — the vendor only paints it through pre[class*=language-] and site fences carry the language class on code, not pre. A host site that pins its code surface to --bg-code/#0d0f12 (pre[class*=language-] override) measures 4.7:1 there.
class OpenCodeBlock extends OpenElement packages/ui/src/open-code-block.tsx:41OpenDialog@openelement/ui · rootclasspublic
Dialog component using native <dialog> element + popover API.
class OpenDialog extends OpenElement packages/ui/src/open-dialog.tsx:39OpenDropdown@openelement/ui · rootclasspublic
Popover-API dropdown with CSS Anchor Positioning placement.
class OpenDropdown extends OpenElement packages/ui/src/open-dropdown.tsx:31openPropsTokenSheet@openelement/ui · rootconstpublic
The full token set as one constructable sheet. The token block selects `:root, :host`, so the same sheet serves a document-level adoption and a shadow-root adoption; only the structural fallback is :host-exclusive.
StyleSheetLike packages/ui/src/open-props-tokens.ts:463OpenTabs@openelement/ui · rootclasspublic
WAI-ARIA tabs pattern. The slotted [slot="tab"] and [slot="panel"] elements
class OpenTabs extends OpenElement packages/ui/src/open-tabs.tsx:28OpenThemeToggle@openelement/ui · rootclasspublic
Theme toggle Reactive DSD component for Dark/Light mode switching.
class OpenThemeToggle extends OpenElement packages/ui/src/open-theme-toggle.tsx:26readInstanceState@openelement/ui · rootfunctionpublic
Read the host's `key` slot, initializing it with `init()` on first use.
<T>(host: object, key: string, init: () => T): T packages/ui/src/instance-state.ts:15registerOpenUi@openelement/ui · rootfunctionpublic
Explicitly register every first-party UI element. Safe to call repeatedly.
(registry?: CustomElementRegistry | undefined): voiddefine: (name: string, constructor: CustomElementConstructor, options?: ElementDefinitionOptions) => void (required) — The **`define()`** method of the CustomElementRegistry interface adds a definition for a custom element to the custom element registry, mapping its name to the constructor which will be used to create it. [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomElementRegistry/define); get: (name: string) => CustomElementConstructor (required) — The **`get()`** method of the CustomElementRegistry interface returns the constructor for a previously-defined custom element. [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomElementRegistry/get); getName: (constructor: CustomElementConstructor) => string | null (required) — The **`getName()`** method of the CustomElementRegistry interface returns the name for a previously-defined custom element. [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomElementRegistry/getName); initialize: (root: Node) => void (required); upgrade: (root: Node) => void (required) — The **`upgrade()`** method of the CustomElementRegistry interface upgrades all shadow-containing custom elements in a Node subtree, even before they are connected to the main document. [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomElementRegistry/upgrade); whenDefined: (name: string) => Promise<CustomElementConstructor> (required) — The **`whenDefined()`** method of the CustomElementRegistry interface returns a Promise that resolves when the named element is defined. [MDN Reference](https://developer.mozilla.org/docs/Web/API/CustomElementRegistry/whenDefined)
packages/ui/src/register.ts:29writeInstanceState@openelement/ui · rootfunctionpublic
Overwrite the host's `key` slot.
(host: object, key: string, value: unknown): void packages/ui/src/instance-state.ts:26readInstanceState@openelement/ui · ./instance-statefunctionpublic
Read the host's `key` slot, initializing it with `init()` on first use.
<T>(host: object, key: string, init: () => T): T packages/ui/src/instance-state.ts:15writeInstanceState@openelement/ui · ./instance-statefunctionpublic
Overwrite the host's `key` slot.
(host: object, key: string, value: unknown): void packages/ui/src/instance-state.ts:26OpenBadge@openelement/ui · ./open-badgeclasspublic
Compact status badge backed by Open Props semantic tokens.
class OpenBadge extends OpenElement packages/ui/src/open-badge.tsx:13OpenCallout@openelement/ui · ./open-calloutclasspublic
Callout/notice box for inline documentation alerts.
class OpenCallout extends OpenElement packages/ui/src/open-callout.tsx:37OpenCard@openelement/ui · ./open-cardclasspublic
Minimal card container with optional header and footer.
class OpenCard extends OpenElement packages/ui/src/open-card.tsx:31OpenCodeBlock@openelement/ui · ./open-code-blockclasspublic
Token-color rationale (the styles below ship to clients, so this note stays out of the template): the vendored light-DOM Prism theme's comment gray #708090 is 3.6:1 on its own #f5f2f0 background (under AA), but that pairing never renders — the vendor only paints it through pre[class*=language-] and site fences carry the language class on code, not pre. A host site that pins its code surface to --bg-code/#0d0f12 (pre[class*=language-] override) measures 4.7:1 there.
class OpenCodeBlock extends OpenElement packages/ui/src/open-code-block.tsx:41OpenDialog@openelement/ui · ./open-dialogclasspublic
Dialog component using native <dialog> element + popover API.
class OpenDialog extends OpenElement packages/ui/src/open-dialog.tsx:39OpenDropdown@openelement/ui · ./open-dropdownclasspublic
Popover-API dropdown with CSS Anchor Positioning placement.
class OpenDropdown extends OpenElement packages/ui/src/open-dropdown.tsx:31openPropsTokenSheet@openelement/ui · ./open-props-tokensconstpublic
The full token set as one constructable sheet. The token block selects `:root, :host`, so the same sheet serves a document-level adoption and a shadow-root adoption; only the structural fallback is :host-exclusive.
StyleSheetLike packages/ui/src/open-props-tokens.ts:463openPropsTokenSheet@openelement/ui · ./open-props-tokens.jsconstpublic
The full token set as one constructable sheet. The token block selects `:root, :host`, so the same sheet serves a document-level adoption and a shadow-root adoption; only the structural fallback is :host-exclusive.
StyleSheetLike packages/ui/src/open-props-tokens.ts:463OpenTabs@openelement/ui · ./open-tabsclasspublic
WAI-ARIA tabs pattern. The slotted [slot="tab"] and [slot="panel"] elements
class OpenTabs extends OpenElement packages/ui/src/open-tabs.tsx:28OpenThemeToggle@openelement/ui · ./open-theme-toggleclasspublic
Theme toggle Reactive DSD component for Dark/Light mode switching.
class OpenThemeToggle extends OpenElement packages/ui/src/open-theme-toggle.tsx:26