creo 0.2.6 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +156 -0
- package/CHANGELOG.md +138 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +130 -87
- package/dist/index.js.map +10 -10
- package/dist/internal/internal_view.d.ts +6 -1
- package/dist/public/primitive.d.ts +9 -10
- package/dist/public/primitives/primitives.d.ts +341 -111
- package/dist/public/view.d.ts +27 -8
- package/dist/render/html_render.d.ts +1 -0
- package/docs/create-app.md +110 -0
- package/docs/events.md +236 -0
- package/docs/getting-started.md +201 -0
- package/docs/how-to/data-fetching.md +155 -0
- package/docs/how-to/deploy-vercel.md +130 -0
- package/docs/how-to/router.md +111 -0
- package/docs/how-to/styles.md +124 -0
- package/docs/how-to/suspense.md +116 -0
- package/docs/index.md +66 -0
- package/docs/lifecycle.md +173 -0
- package/docs/primitives.md +195 -0
- package/docs/renderers.md +183 -0
- package/docs/state.md +131 -0
- package/docs/store.md +135 -0
- package/docs/view.md +205 -0
- package/package.json +5 -2
package/dist/index.js.map
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/internal/internal_view.ts", "../src/
|
|
3
|
+
"sources": ["../src/internal/internal_view.ts", "../src/internal/orchestrator.ts", "../src/public/view.ts", "../src/public/primitive.ts", "../src/public/primitives/primitives.ts", "../src/public/state.ts", "../src/public/store.ts", "../src/functional/shallow_equal.ts", "../src/functional/lis.ts", "../src/internal/engine.ts", "../src/public/app.ts", "../src/render/html_render.ts", "../src/render/json_render.ts", "../src/render/string_render.ts", "../src/functional/maybe.ts", "../src/functional/assert.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewBody, ViewFn } from \"@/public/view\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Wildcard } from \"./wildcard\";\n\n// ---------------------------------------------------------------------------\n// Bitwise flags\n// ---------------------------------------------------------------------------\n\nexport type BitFlags = number;\nexport const F_PENDING = 1;\nexport const F_DIRTY = 1 << 1;\nexport const F_MOVED = 1 << 2;\nexport const F_PRIMITIVE = 1 << 3;\nexport const F_TEXT_CONTENT = 1 << 4;\nexport const F_DISPOSED = 1 << 5;\n\n// ---------------------------------------------------------------------------\n// ViewRecord — pure data, no methods\n// ---------------------------------------------------------------------------\n\nexport type ViewRecord<\n Props = Wildcard,\n Api = Wildcard,\n RenderRef = Wildcard,\n> = {\n viewFn: ViewFn<Props, Api>;\n userKey: Maybe<Key>;\n props: Props;\n slot: Maybe<SlotContent>;\n // Once ViewRecord moves from Pending to Real state,\n // it will cache the body of the view, so that ViewFn is called once per View Lifecycle\n body: Maybe<ViewBody<Props
|
|
6
|
-
"import type { Key } from \"@/functional/key\";\nimport type { Slot, ViewBody } from \"./view\";\n\n/**\n * Maps event type { click: (e: X) => void } to\n * handler props { onClick?: (e: X) => void }.\n */\nexport type EventHandlerProps<Events> = {\n [K in keyof Events as `on${Capitalize<string & K>}`]?: Events[K];\n};\n\n/**\n * Props passed when calling a primitive in the render stream.\n * Attrs + on* event handler props + optional key.\n */\nexport type PrimitiveProps<Attrs, Events> = Attrs &\n EventHandlerProps<Events> & { key?: Key };\n\nexport const $primitive = Symbol(\"primitive\");\n\nexport function primitiveViewFn<Props>({\n slot,\n}: {\n slot: Slot;\n}): ViewBody<Props, void> {\n return {\n render() {\n slot();\n },\n };\n}\n",
|
|
5
|
+
"import type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewBody, ViewFn } from \"@/public/view\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Wildcard } from \"./wildcard\";\n\n// ---------------------------------------------------------------------------\n// Bitwise flags\n// ---------------------------------------------------------------------------\n\nexport type BitFlags = number;\nexport const F_PENDING = 1;\nexport const F_DIRTY = 1 << 1;\nexport const F_MOVED = 1 << 2;\nexport const F_PRIMITIVE = 1 << 3;\nexport const F_TEXT_CONTENT = 1 << 4;\nexport const F_DISPOSED = 1 << 5;\n\n// ---------------------------------------------------------------------------\n// ViewRecord — pure data, no methods\n// ---------------------------------------------------------------------------\n\nexport type ViewRecord<\n Props = Wildcard,\n Api = Wildcard,\n RenderRef = Wildcard,\n> = {\n viewFn: ViewFn<Props, Api>;\n userKey: Maybe<Key>;\n props: Props;\n slot: Maybe<SlotContent>;\n // Once ViewRecord moves from Pending to Real state,\n // it will cache the body of the view, so that ViewFn is called once per View Lifecycle\n body: Maybe<ViewBody<Props>>;\n // Provided by higher component slot — we calculate children and keep their refs here\n sc: Maybe<ViewRecord[]>;\n // Each renderer provides its own RenderRef type, associated with how the renderer works\n renderRef: Maybe<RenderRef>;\n\n flags: BitFlags;\n\n children: Maybe<ViewRecord[]>;\n\n /** Position in `parent.children`. Maintained by the reconciler so the\n * renderer can find the next-sibling insertion anchor without an O(n)\n * `indexOf` scan. -1 means \"not yet placed by a reconcile pass\". */\n pos: number;\n\n keyToView: Maybe<Map<Key, ViewRecord>>;\n unsubscribe: Maybe<(() => void)[]>;\n\n parent: Maybe<ViewRecord>;\n\n /** The primitive whose .children contains the live sc items after reconcile. */\n scHost: Maybe<ViewRecord>;\n\n /**\n * Last value the viewFn passed to `ctx.ref(...)`. Stored so the engine\n * can re-apply it when the consumer's `ref` prop changes between renders.\n */\n publicRef: Maybe<unknown>;\n};\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Structural change: viewFn, key, or count differs. Does NOT check props. */\nexport function hasScStructuralChange(\n prev: Maybe<ViewRecord[]>,\n next: Maybe<ViewRecord[]>,\n): boolean {\n const prevLen = prev?.length ?? 0;\n const nextLen = next?.length ?? 0;\n if (prevLen === 0 && nextLen === 0) return false;\n if (!prev || !next) return true;\n if (prev.length !== next.length) return true;\n for (let i = 0; i < next.length; i++) {\n if (next[i]!.viewFn !== prev[i]!.viewFn) return true;\n if (next[i]!.userKey !== prev[i]!.userKey) return true;\n }\n return false;\n}\n",
|
|
7
6
|
"import type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n/**\n * Orchestrator is the high-level class, that handles the oveall operations for the UI engine\n * 1. When View is rendered or updated, orchestrator is responsible of bringing the renderer, virtual dom and engine together\n * 2. Keeps track on current views / stores in the app\n * 3. Keeps track on which views need to be updated, which onces are in updating process\n * 4. Sets the current orchestrator scope (e.g. if the app has several Creo renderers)\n */\nclass Orchestrator {\n #currentEngine: Maybe<Engine>;\n\n setCurrentEngine(engine: Maybe<Engine>) {\n this.#currentEngine = engine;\n }\n\n public currentEngine(): Maybe<Engine> {\n return this.#currentEngine;\n }\n}\n\nexport const orchestrator = new Orchestrator();\n",
|
|
8
|
-
"import type { Key } from \"@/functional/key\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport { orchestrator } from \"@/internal/orchestrator\";\nimport type { Use } from \"./state\";\nimport type { $primitive } from \"./primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\
|
|
9
|
-
"import type { Wildcard } from \"@/internal/wildcard\";\nimport { $primitive, type EventHandlerProps } from \"../primitive\";\nimport {\n view,\n type PublicView,\n type Slot,\n type ViewBody,\n type ViewFn,\n} from \"../view\";\nimport { orchestrator } from \"@/internal/orchestrator\";\n\n// ---------------------------------------------------------------------------\n// Engine-agnostic event data types\n// ---------------------------------------------------------------------------\n\nexport type BaseEventData = {\n stopPropagation: () => void;\n preventDefault: () => void;\n};\n\nexport type PointerEventData = BaseEventData & {\n x: number;\n y: number;\n};\n\nexport type KeyEventData = BaseEventData & {\n key: string;\n code: string;\n};\n\nexport type InputEventData = BaseEventData & {\n value: string;\n checked: boolean;\n};\n\nexport type FocusEventData = BaseEventData;\n\nexport type ScrollEventData = BaseEventData & {\n scrollTop: number;\n scrollLeft: number;\n};\n\nexport type LoadEventData = BaseEventData;\n\nexport type ErrorEventData = BaseEventData & {\n message: string;\n};\n\nexport type ToggleEventData = BaseEventData & {\n open: boolean;\n};\n\nexport type MediaEventData = BaseEventData & {\n muted: boolean;\n paused: boolean;\n volume: number;\n currentTime: number;\n duration: number;\n};\n\n// ---------------------------------------------------------------------------\n// Event maps\n// ---------------------------------------------------------------------------\n\nexport type ContainerEvents = {\n click: (e: PointerEventData) => void;\n dblclick: (e: PointerEventData) => void;\n pointerDown: (e: PointerEventData) => void;\n pointerUp: (e: PointerEventData) => void;\n pointerMove: (e: PointerEventData) => void;\n // Hover (capture-phase, per-target, not double-fired up the tree).\n mouseEnter: (e: PointerEventData) => void;\n mouseLeave: (e: PointerEventData) => void;\n pointerEnter: (e: PointerEventData) => void;\n pointerLeave: (e: PointerEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n focus: (e: FocusEventData) => void;\n blur: (e: FocusEventData) => void;\n // Scroll fires passively at high frequency; preventDefault is a no-op.\n scroll: (e: ScrollEventData) => void;\n load: (e: LoadEventData) => void;\n error: (e: ErrorEventData) => void;\n};\n\nexport type FormEvents = ContainerEvents & {\n input: (e: InputEventData) => void;\n change: (e: InputEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n};\n\nexport type MediaEvents = ContainerEvents & {\n volumeChange: (e: MediaEventData) => void;\n play: (e: MediaEventData) => void;\n pause: (e: MediaEventData) => void;\n ended: (e: MediaEventData) => void;\n timeUpdate: (e: MediaEventData) => void;\n loadedMetadata: (e: MediaEventData) => void;\n loadedData: (e: MediaEventData) => void;\n canPlay: (e: MediaEventData) => void;\n canPlayThrough: (e: MediaEventData) => void;\n durationChange: (e: MediaEventData) => void;\n rateChange: (e: MediaEventData) => void;\n seeking: (e: MediaEventData) => void;\n seeked: (e: MediaEventData) => void;\n stalled: (e: MediaEventData) => void;\n waiting: (e: MediaEventData) => void;\n};\n\nexport type DisclosureEvents = ContainerEvents & {\n toggle: (e: ToggleEventData) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Common HTML attributes\n// ---------------------------------------------------------------------------\n\nexport type HtmlAttrs = {\n class?: string;\n id?: string;\n style?: string;\n title?: string;\n tabindex?: number;\n hidden?: boolean;\n role?: string;\n draggable?: boolean;\n [attr: string]: unknown;\n};\n\nexport function html<\n Attrs extends HtmlAttrs = HtmlAttrs,\n Events = ContainerEvents,\n>(tag: string): PublicView<Attrs & EventHandlerProps<Events>, void> {\n const fn: ViewFn<Attrs & EventHandlerProps<Events>, void> = <Props>({\n slot,\n }: {\n slot: Slot;\n }): ViewBody<Props, void> => ({\n render() {\n slot();\n },\n });\n fn[$primitive] = tag;\n return view(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Text node — typed as (content: string | number) => void\n// ---------------------------------------------------------------------------\n\nexport const textViewFn: ViewFn<string | number, void> = Object.assign(\n (() => ({ render() {} })) as ViewFn<string | number, void>,\n { [$primitive]: \"text\" as string },\n);\n\nexport function text(content: string | number): void {\n orchestrator.currentEngine()!.view(textViewFn, content, null, null);\n}\n\n// ---------------------------------------------------------------------------\n// Layout / structural\n// ---------------------------------------------------------------------------\n\nexport const div = html(\"div\");\nexport const span = html(\"span\");\nexport const section = html(\"section\");\nexport const article = html(\"article\");\nexport const aside = html(\"aside\");\nexport const nav = html(\"nav\");\nexport const header = html(\"header\");\nexport const footer = html(\"footer\");\nexport const main = html(\"main\");\n\n// ---------------------------------------------------------------------------\n// Text / inline\n// ---------------------------------------------------------------------------\n\nexport const p = html(\"p\");\nexport const h1 = html(\"h1\");\nexport const h2 = html(\"h2\");\nexport const h3 = html(\"h3\");\nexport const h4 = html(\"h4\");\nexport const h5 = html(\"h5\");\nexport const h6 = html(\"h6\");\nexport const pre = html(\"pre\");\nexport const code = html(\"code\");\nexport const em = html(\"em\");\nexport const strong = html(\"strong\");\nexport const small = html(\"small\");\nexport const br = html(\"br\");\nexport const hr = html(\"hr\");\nexport const a = html<\n HtmlAttrs & { href?: string; target?: string },\n ContainerEvents\n>(\"a\");\nexport const blockquote = html(\"blockquote\");\nexport const label = html<HtmlAttrs & { for?: string }, ContainerEvents>(\n \"label\",\n);\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport const ul = html(\"ul\");\nexport const ol = html(\"ol\");\nexport const li = html(\"li\");\n\n// ---------------------------------------------------------------------------\n// Table\n// ---------------------------------------------------------------------------\n\nexport const table = html(\"table\");\nexport const thead = html(\"thead\");\nexport const tbody = html(\"tbody\");\nexport const tfoot = html(\"tfoot\");\nexport const tr = html(\"tr\");\nexport const th = html<\n HtmlAttrs & { colspan?: number; rowspan?: number; scope?: string },\n ContainerEvents\n>(\"th\");\nexport const td = html<\n HtmlAttrs & { colspan?: number; rowspan?: number },\n ContainerEvents\n>(\"td\");\n\n// ---------------------------------------------------------------------------\n// Form\n// ---------------------------------------------------------------------------\n\nexport const form = html<\n HtmlAttrs & { action?: string; method?: string },\n ContainerEvents\n>(\"form\");\n\nexport const button = html<\n HtmlAttrs & { disabled?: boolean; type?: string },\n ContainerEvents\n>(\"button\");\n\nexport const input = html<\n HtmlAttrs & {\n type?: string;\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n checked?: boolean;\n readOnly?: boolean;\n name?: string;\n min?: string;\n max?: string;\n step?: string;\n pattern?: string;\n required?: boolean;\n autofocus?: boolean;\n },\n FormEvents\n>(\"input\");\n\nexport const textarea = html<\n HtmlAttrs & {\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n rows?: number;\n cols?: number;\n name?: string;\n required?: boolean;\n },\n FormEvents\n>(\"textarea\");\n\nexport const select = html<\n HtmlAttrs & {\n value?: string;\n disabled?: boolean;\n name?: string;\n multiple?: boolean;\n required?: boolean;\n },\n FormEvents\n>(\"select\");\n\nexport const option = html<\n HtmlAttrs & { value?: string; selected?: boolean; disabled?: boolean },\n ContainerEvents\n>(\"option\");\n\nexport const fieldset = html<\n HtmlAttrs & { disabled?: boolean },\n ContainerEvents\n>(\"fieldset\");\nexport const legend = html(\"legend\");\n\n// ---------------------------------------------------------------------------\n// Media\n// ---------------------------------------------------------------------------\n\nexport const img = html<\n HtmlAttrs & { src: string; alt?: string; width?: number; height?: number },\n ContainerEvents\n>(\"img\");\n\nexport const video = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n width?: number;\n height?: number;\n },\n MediaEvents\n>(\"video\");\n\nexport const audio = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n },\n MediaEvents\n>(\"audio\");\n\nexport const canvas = html<\n HtmlAttrs & { width?: number; height?: number },\n ContainerEvents\n>(\"canvas\");\n\nexport const source = html<\n HtmlAttrs & { src?: string; type?: string },\n ContainerEvents\n>(\"source\");\n\n// ---------------------------------------------------------------------------\n// Interactive\n// ---------------------------------------------------------------------------\n\nexport const details = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"details\",\n);\nexport const summary = html(\"summary\");\nexport const dialog = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"dialog\",\n);\nexport const menu = html(\"menu\");\n\n// ---------------------------------------------------------------------------\n// Embedded content\n// ---------------------------------------------------------------------------\n\nexport const iframe = html<\n HtmlAttrs & {\n src?: string;\n width?: number;\n height?: number;\n sandbox?: string;\n allow?: string;\n loading?: string;\n referrerpolicy?: string;\n },\n ContainerEvents\n>(\"iframe\");\nexport const embed = html<\n HtmlAttrs & { src?: string; type?: string; width?: number; height?: number },\n ContainerEvents\n>(\"embed\");\nexport const object = html<\n HtmlAttrs & {\n data?: string;\n type?: string;\n width?: number;\n height?: number;\n name?: string;\n },\n ContainerEvents\n>(\"object\");\nexport const picture = html(\"picture\");\nexport const portal = html<HtmlAttrs & { src?: string }, ContainerEvents>(\n \"portal\",\n);\n\n// ---------------------------------------------------------------------------\n// SVG (container only — inner SVG elements use html() ad-hoc)\n// ---------------------------------------------------------------------------\n\nexport const svg = html<\n HtmlAttrs & {\n viewBox?: string;\n xmlns?: string;\n width?: number | string;\n height?: number | string;\n fill?: string;\n },\n ContainerEvents\n>(\"svg\");\n\n// ---------------------------------------------------------------------------\n// Scripting / metadata (rarely used in render, but complete for parity)\n// ---------------------------------------------------------------------------\n\nexport const script = html<\n HtmlAttrs & { src?: string; type?: string; async?: boolean; defer?: boolean },\n ContainerEvents\n>(\"script\");\nexport const noscript = html(\"noscript\");\nexport const template = html(\"template\");\nexport const slot = html<HtmlAttrs & { name?: string }, ContainerEvents>(\n \"slot\",\n);\n\n// ---------------------------------------------------------------------------\n// Sectioning\n// ---------------------------------------------------------------------------\n\nexport const address = html(\"address\");\nexport const hgroup = html(\"hgroup\");\nexport const search = html(\"search\");\n\n// ---------------------------------------------------------------------------\n// Text semantics\n// ---------------------------------------------------------------------------\n\nexport const abbr = html(\"abbr\");\nexport const b = html(\"b\");\nexport const bdi = html(\"bdi\");\nexport const bdo = html<HtmlAttrs & { dir?: string }, ContainerEvents>(\"bdo\");\nexport const cite = html(\"cite\");\nexport const data = html<HtmlAttrs & { value?: string }, ContainerEvents>(\n \"data\",\n);\nexport const dfn = html(\"dfn\");\nexport const i = html(\"i\");\nexport const kbd = html(\"kbd\");\nexport const mark = html(\"mark\");\nexport const q = html<HtmlAttrs & { cite?: string }, ContainerEvents>(\"q\");\nexport const rp = html(\"rp\");\nexport const rt = html(\"rt\");\nexport const ruby = html(\"ruby\");\nexport const s = html(\"s\");\nexport const samp = html(\"samp\");\nexport const sub = html(\"sub\");\nexport const sup = html(\"sup\");\nexport const time = html<HtmlAttrs & { datetime?: string }, ContainerEvents>(\n \"time\",\n);\nexport const u = html(\"u\");\nexport const varEl = html(\"var\");\nexport const wbr = html(\"wbr\");\n\n// ---------------------------------------------------------------------------\n// Demarcating edits\n// ---------------------------------------------------------------------------\n\nexport const del = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"del\");\nexport const ins = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"ins\");\n\n// ---------------------------------------------------------------------------\n// Table (additional)\n// ---------------------------------------------------------------------------\n\nexport const caption = html(\"caption\");\nexport const colgroup = html<HtmlAttrs & { span?: number }, ContainerEvents>(\n \"colgroup\",\n);\nexport const col = html<HtmlAttrs & { span?: number }, ContainerEvents>(\"col\");\n\n// ---------------------------------------------------------------------------\n// Form (additional)\n// ---------------------------------------------------------------------------\n\nexport const datalist = html(\"datalist\");\nexport const optgroup = html<\n HtmlAttrs & { label?: string; disabled?: boolean },\n ContainerEvents\n>(\"optgroup\");\nexport const output = html<\n HtmlAttrs & { for?: string; name?: string },\n ContainerEvents\n>(\"output\");\nexport const progress = html<\n HtmlAttrs & { value?: number; max?: number },\n ContainerEvents\n>(\"progress\");\nexport const meter = html<\n HtmlAttrs & {\n value?: number;\n min?: number;\n max?: number;\n low?: number;\n high?: number;\n optimum?: number;\n },\n ContainerEvents\n>(\"meter\");\n\n// ---------------------------------------------------------------------------\n// Figure\n// ---------------------------------------------------------------------------\n\nexport const figure = html(\"figure\");\nexport const figcaption = html(\"figcaption\");\n\n// ---------------------------------------------------------------------------\n// Line break opportunity / content\n// ---------------------------------------------------------------------------\n\nexport const dd = html(\"dd\");\nexport const dl = html(\"dl\");\nexport const dt = html(\"dt\");\n\n// ---------------------------------------------------------------------------\n// Media (additional)\n// ---------------------------------------------------------------------------\n\nexport const track = html<\n HtmlAttrs & {\n src?: string;\n kind?: string;\n srclang?: string;\n label?: string;\n default?: boolean;\n },\n ContainerEvents\n>(\"track\");\nexport const map = html<HtmlAttrs & { name?: string }, ContainerEvents>(\"map\");\nexport const area = html<\n HtmlAttrs & {\n alt?: string;\n coords?: string;\n href?: string;\n shape?: string;\n target?: string;\n },\n ContainerEvents\n>(\"area\");\n",
|
|
7
|
+
"import type { Key } from \"@/functional/key\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport { orchestrator } from \"@/internal/orchestrator\";\nimport type { Use } from \"./state\";\nimport type { $primitive } from \"./primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\n// ---------------------------------------------------------------------------\n// Refs — used both for primitive elements and for view-exposed APIs.\n// ---------------------------------------------------------------------------\n\nexport type RefCallback<T> = (value: T | null) => void;\nexport type RefObject<T> = { current: T | null };\nexport type Ref<T> = RefCallback<T> | RefObject<T>;\n\n/** Apply a value (or null) to either ref shape. Engine + renderer share this. */\nexport function applyRef<T>(ref: Maybe<Ref<T>>, value: T | null): void {\n if (!ref) return;\n if (typeof ref === \"function\") ref(value);\n else ref.current = value;\n}\n\n// ---------------------------------------------------------------------------\n// ViewBody\n// ---------------------------------------------------------------------------\n\nexport type ViewBody<Props> = {\n render: () => void;\n onMount?: () => void;\n shouldUpdate?: (nextProps: Props) => boolean;\n onUpdateBefore?: () => void;\n onUpdateAfter?: () => void;\n dispose?: () => void;\n};\n\n/** Slot callback — passed by the caller at the call site. */\nexport type Slot = () => void;\n\n/** What callers may pass as a slot: a callback or a plain string (rendered as text). */\nexport type SlotContent = Slot | string;\n\n/**\n * Setter handed to the viewFn for publishing an api into the consumer's `ref`.\n * Typically called once during the body. Subsequent calls overwrite.\n */\nexport type RefSetter<Api> = (value: Api) => void;\n\nexport type ViewFn<Props, Api> = {\n (ctx: {\n props: () => Props;\n use: Use;\n slot: Slot;\n ref: RefSetter<Api>;\n }): ViewBody<Props>;\n [$primitive]?: string;\n};\n\n/**\n * Caller-facing props type. Allows `void` when Props is void or all-optional.\n * `ref` is added alongside `key`; its element type is whatever the view\n * publishes via `ctx.ref(...)`.\n */\ntype ViewProps<Props, Api> = Props extends void\n ? { key?: Key; ref?: Ref<Api> } | void\n : {} extends Props\n ? (Props & { key?: Key; ref?: Ref<Api> }) | void\n : Props & { key?: Key; ref?: Ref<Api> };\n\nexport function view<Props = void, Api = void>(\n body: ViewFn<Props, Api>,\n): (props: ViewProps<Props, Api>, slot?: SlotContent) => void {\n return (props: ViewProps<Props, Api>, slot?: SlotContent) => {\n orchestrator\n .currentEngine()!\n .view(\n body as ViewFn<Wildcard, Wildcard>,\n props,\n slot,\n maybeGetUserKey(props),\n );\n };\n}\n\nexport type PublicView<Props, Api> = ReturnType<typeof view<Props, Api>>;\n\nfunction maybeGetUserKey<P>(params: P): Maybe<Key> {\n if (\n params != null &&\n typeof params === \"object\" &&\n \"key\" in params &&\n params.key != null &&\n (typeof params.key === \"string\" || typeof params.key === \"number\")\n ) {\n return params.key;\n }\n}\n",
|
|
8
|
+
"import type { Key } from \"@/functional/key\";\nimport type { Slot, ViewBody } from \"./view\";\n\n/**\n * Props passed when calling a primitive in the render stream.\n * Attrs + nested `on` event-handler object + optional key.\n *\n * Events are grouped under `on` (e.g. `{ on: { click, input } }`) instead of\n * being mixed into the prop bag as `onClick`, `onInput`, … This keeps the\n * event namespace separate from HTML attrs and lets the renderer skip the\n * per-prop event-detection step on every diff.\n */\nexport type PrimitiveProps<Attrs, Events> = Attrs & {\n on?: Partial<Events>;\n key?: Key;\n};\n\nexport const $primitive = Symbol(\"primitive\");\n\nexport function primitiveViewFn<Props>({\n slot,\n}: {\n slot: Slot;\n}): ViewBody<Props> {\n return {\n render() {\n slot();\n },\n };\n}\n",
|
|
9
|
+
"import type { Wildcard } from \"@/internal/wildcard\";\nimport { $primitive } from \"../primitive\";\nimport {\n view,\n type PublicView,\n type Ref,\n type Slot,\n type ViewBody,\n type ViewFn,\n} from \"../view\";\nimport { orchestrator } from \"@/internal/orchestrator\";\n\n// ---------------------------------------------------------------------------\n// Engine-agnostic event data types\n// ---------------------------------------------------------------------------\n\nexport type BaseEventData = {\n stopPropagation: () => void;\n preventDefault: () => void;\n};\n\nexport type PointerEventData = BaseEventData & {\n x: number;\n y: number;\n /** Pointer ID — pass to setPointerCapture. */\n pointerId: number;\n pointerType: \"mouse\" | \"touch\" | \"pen\" | \"\";\n button: number;\n buttons: number;\n target: HTMLElement;\n /** The element the handler is bound to (handles event delegation correctly). */\n currentTarget: HTMLElement;\n /** Capture the pointer to currentTarget — keeps move/up firing when the pointer leaves bounds. */\n capture: () => void;\n release: () => void;\n /** Escape hatch — the underlying DOM event. Avoid where the typed fields cover the use case. */\n nativeEvent: Event;\n};\n\nexport type KeyEventData = BaseEventData & {\n key: string;\n code: string;\n};\n\nexport type InputEventData = BaseEventData & {\n value: string;\n checked: boolean;\n};\n\nexport type FocusEventData = BaseEventData;\n\nexport type ScrollEventData = BaseEventData & {\n scrollTop: number;\n scrollLeft: number;\n};\n\nexport type LoadEventData = BaseEventData;\n\nexport type ErrorEventData = BaseEventData & {\n message: string;\n};\n\nexport type ToggleEventData = BaseEventData & {\n open: boolean;\n};\n\nexport type MediaEventData = BaseEventData & {\n muted: boolean;\n paused: boolean;\n volume: number;\n currentTime: number;\n duration: number;\n};\n\n// ---------------------------------------------------------------------------\n// Event maps\n// ---------------------------------------------------------------------------\n\nexport type ContainerEvents = {\n click: (e: PointerEventData) => void;\n dblclick: (e: PointerEventData) => void;\n pointerDown: (e: PointerEventData) => void;\n pointerUp: (e: PointerEventData) => void;\n pointerMove: (e: PointerEventData) => void;\n pointerCancel: (e: PointerEventData) => void;\n // Hover (capture-phase, per-target, not double-fired up the tree).\n pointerEnter: (e: PointerEventData) => void;\n pointerLeave: (e: PointerEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n focus: (e: FocusEventData) => void;\n blur: (e: FocusEventData) => void;\n // Scroll fires passively at high frequency; preventDefault is a no-op.\n scroll: (e: ScrollEventData) => void;\n load: (e: LoadEventData) => void;\n error: (e: ErrorEventData) => void;\n};\n\nexport type FormEvents = ContainerEvents & {\n input: (e: InputEventData) => void;\n change: (e: InputEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n};\n\nexport type MediaEvents = ContainerEvents & {\n volumeChange: (e: MediaEventData) => void;\n play: (e: MediaEventData) => void;\n pause: (e: MediaEventData) => void;\n ended: (e: MediaEventData) => void;\n timeUpdate: (e: MediaEventData) => void;\n loadedMetadata: (e: MediaEventData) => void;\n loadedData: (e: MediaEventData) => void;\n canPlay: (e: MediaEventData) => void;\n canPlayThrough: (e: MediaEventData) => void;\n durationChange: (e: MediaEventData) => void;\n rateChange: (e: MediaEventData) => void;\n seeking: (e: MediaEventData) => void;\n seeked: (e: MediaEventData) => void;\n stalled: (e: MediaEventData) => void;\n waiting: (e: MediaEventData) => void;\n};\n\nexport type DisclosureEvents = ContainerEvents & {\n toggle: (e: ToggleEventData) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Common HTML attributes\n// ---------------------------------------------------------------------------\n\nexport type HtmlAttrs = {\n class?: string;\n id?: string;\n style?: string;\n title?: string;\n tabindex?: number;\n hidden?: boolean;\n role?: string;\n draggable?: boolean;\n /**\n * Set with the underlying DOM element after mount, and with `null` after\n * unmount. Accepts either a callback or a `{ current }` ref object \n */\n ref?: Ref<Element>;\n [attr: string]: unknown;\n};\n\nexport function html<\n Attrs extends HtmlAttrs = HtmlAttrs,\n Events = ContainerEvents,\n>(tag: string): PublicView<Attrs & { on?: Partial<Events> }, Element> {\n const fn: ViewFn<Attrs & { on?: Partial<Events> }, Element> = <Props>({\n slot,\n }: {\n slot: Slot;\n }): ViewBody<Props> => ({\n render() {\n slot();\n },\n });\n fn[$primitive] = tag;\n return view(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Text node — typed as (content: string | number) => void\n// ---------------------------------------------------------------------------\n\nexport const textViewFn: ViewFn<string | number, void> = Object.assign(\n (() => ({ render() {} })) as ViewFn<string | number, void>,\n { [$primitive]: \"text\" as string },\n);\n\nexport function text(content: string | number): void {\n orchestrator.currentEngine()!.view(textViewFn, content, null, null);\n}\n\n// ---------------------------------------------------------------------------\n// Layout / structural\n// ---------------------------------------------------------------------------\n\nexport const div = html(\"div\");\nexport const span = html(\"span\");\nexport const section = html(\"section\");\nexport const article = html(\"article\");\nexport const aside = html(\"aside\");\nexport const nav = html(\"nav\");\nexport const header = html(\"header\");\nexport const footer = html(\"footer\");\nexport const main = html(\"main\");\n\n// ---------------------------------------------------------------------------\n// Text / inline\n// ---------------------------------------------------------------------------\n\nexport const p = html(\"p\");\nexport const h1 = html(\"h1\");\nexport const h2 = html(\"h2\");\nexport const h3 = html(\"h3\");\nexport const h4 = html(\"h4\");\nexport const h5 = html(\"h5\");\nexport const h6 = html(\"h6\");\nexport const pre = html(\"pre\");\nexport const code = html(\"code\");\nexport const em = html(\"em\");\nexport const strong = html(\"strong\");\nexport const small = html(\"small\");\nexport const br = html(\"br\");\nexport const hr = html(\"hr\");\nexport const a = html<\n HtmlAttrs & { href?: string; target?: string },\n ContainerEvents\n>(\"a\");\nexport const blockquote = html(\"blockquote\");\nexport const label = html<HtmlAttrs & { for?: string }, ContainerEvents>(\n \"label\",\n);\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport const ul = html(\"ul\");\nexport const ol = html(\"ol\");\nexport const li = html(\"li\");\n\n// ---------------------------------------------------------------------------\n// Table\n// ---------------------------------------------------------------------------\n\nexport const table = html(\"table\");\nexport const thead = html(\"thead\");\nexport const tbody = html(\"tbody\");\nexport const tfoot = html(\"tfoot\");\nexport const tr = html(\"tr\");\nexport const th = html<\n HtmlAttrs & { colspan?: number; rowspan?: number; scope?: string },\n ContainerEvents\n>(\"th\");\nexport const td = html<\n HtmlAttrs & { colspan?: number; rowspan?: number },\n ContainerEvents\n>(\"td\");\n\n// ---------------------------------------------------------------------------\n// Form\n// ---------------------------------------------------------------------------\n\nexport const form = html<\n HtmlAttrs & { action?: string; method?: string },\n ContainerEvents\n>(\"form\");\n\nexport const button = html<\n HtmlAttrs & { disabled?: boolean; type?: string },\n ContainerEvents\n>(\"button\");\n\nexport const input = html<\n HtmlAttrs & {\n type?: string;\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n checked?: boolean;\n readOnly?: boolean;\n name?: string;\n min?: string;\n max?: string;\n step?: string;\n pattern?: string;\n required?: boolean;\n autofocus?: boolean;\n },\n FormEvents\n>(\"input\");\n\nexport const textarea = html<\n HtmlAttrs & {\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n rows?: number;\n cols?: number;\n name?: string;\n required?: boolean;\n },\n FormEvents\n>(\"textarea\");\n\nexport const select = html<\n HtmlAttrs & {\n value?: string;\n disabled?: boolean;\n name?: string;\n multiple?: boolean;\n required?: boolean;\n },\n FormEvents\n>(\"select\");\n\nexport const option = html<\n HtmlAttrs & { value?: string; selected?: boolean; disabled?: boolean },\n ContainerEvents\n>(\"option\");\n\nexport const fieldset = html<\n HtmlAttrs & { disabled?: boolean },\n ContainerEvents\n>(\"fieldset\");\nexport const legend = html(\"legend\");\n\n// ---------------------------------------------------------------------------\n// Media\n// ---------------------------------------------------------------------------\n\nexport const img = html<\n HtmlAttrs & { src: string; alt?: string; width?: number; height?: number },\n ContainerEvents\n>(\"img\");\n\nexport const video = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n width?: number;\n height?: number;\n },\n MediaEvents\n>(\"video\");\n\nexport const audio = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n },\n MediaEvents\n>(\"audio\");\n\nexport const canvas = html<\n HtmlAttrs & { width?: number; height?: number },\n ContainerEvents\n>(\"canvas\");\n\nexport const source = html<\n HtmlAttrs & { src?: string; type?: string },\n ContainerEvents\n>(\"source\");\n\n// ---------------------------------------------------------------------------\n// Interactive\n// ---------------------------------------------------------------------------\n\nexport const details = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"details\",\n);\nexport const summary = html(\"summary\");\nexport const dialog = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"dialog\",\n);\nexport const menu = html(\"menu\");\n\n// ---------------------------------------------------------------------------\n// Embedded content\n// ---------------------------------------------------------------------------\n\nexport const iframe = html<\n HtmlAttrs & {\n src?: string;\n width?: number;\n height?: number;\n sandbox?: string;\n allow?: string;\n loading?: string;\n referrerpolicy?: string;\n },\n ContainerEvents\n>(\"iframe\");\nexport const embed = html<\n HtmlAttrs & { src?: string; type?: string; width?: number; height?: number },\n ContainerEvents\n>(\"embed\");\nexport const object = html<\n HtmlAttrs & {\n data?: string;\n type?: string;\n width?: number;\n height?: number;\n name?: string;\n },\n ContainerEvents\n>(\"object\");\nexport const picture = html(\"picture\");\nexport const portal = html<HtmlAttrs & { src?: string }, ContainerEvents>(\n \"portal\",\n);\n\n// ---------------------------------------------------------------------------\n// SVG (container only — inner SVG elements use html() ad-hoc)\n// ---------------------------------------------------------------------------\n\nexport const svg = html<\n HtmlAttrs & {\n viewBox?: string;\n xmlns?: string;\n width?: number | string;\n height?: number | string;\n fill?: string;\n },\n ContainerEvents\n>(\"svg\");\n\n// ---------------------------------------------------------------------------\n// Scripting / metadata (rarely used in render, but complete for parity)\n// ---------------------------------------------------------------------------\n\nexport const script = html<\n HtmlAttrs & { src?: string; type?: string; async?: boolean; defer?: boolean },\n ContainerEvents\n>(\"script\");\nexport const noscript = html(\"noscript\");\nexport const template = html(\"template\");\nexport const slot = html<HtmlAttrs & { name?: string }, ContainerEvents>(\n \"slot\",\n);\n\n// ---------------------------------------------------------------------------\n// Sectioning\n// ---------------------------------------------------------------------------\n\nexport const address = html(\"address\");\nexport const hgroup = html(\"hgroup\");\nexport const search = html(\"search\");\n\n// ---------------------------------------------------------------------------\n// Text semantics\n// ---------------------------------------------------------------------------\n\nexport const abbr = html(\"abbr\");\nexport const b = html(\"b\");\nexport const bdi = html(\"bdi\");\nexport const bdo = html<HtmlAttrs & { dir?: string }, ContainerEvents>(\"bdo\");\nexport const cite = html(\"cite\");\nexport const data = html<HtmlAttrs & { value?: string }, ContainerEvents>(\n \"data\",\n);\nexport const dfn = html(\"dfn\");\nexport const i = html(\"i\");\nexport const kbd = html(\"kbd\");\nexport const mark = html(\"mark\");\nexport const q = html<HtmlAttrs & { cite?: string }, ContainerEvents>(\"q\");\nexport const rp = html(\"rp\");\nexport const rt = html(\"rt\");\nexport const ruby = html(\"ruby\");\nexport const s = html(\"s\");\nexport const samp = html(\"samp\");\nexport const sub = html(\"sub\");\nexport const sup = html(\"sup\");\nexport const time = html<HtmlAttrs & { datetime?: string }, ContainerEvents>(\n \"time\",\n);\nexport const u = html(\"u\");\nexport const varEl = html(\"var\");\nexport const wbr = html(\"wbr\");\n\n// ---------------------------------------------------------------------------\n// Demarcating edits\n// ---------------------------------------------------------------------------\n\nexport const del = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"del\");\nexport const ins = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"ins\");\n\n// ---------------------------------------------------------------------------\n// Table (additional)\n// ---------------------------------------------------------------------------\n\nexport const caption = html(\"caption\");\nexport const colgroup = html<HtmlAttrs & { span?: number }, ContainerEvents>(\n \"colgroup\",\n);\nexport const col = html<HtmlAttrs & { span?: number }, ContainerEvents>(\"col\");\n\n// ---------------------------------------------------------------------------\n// Form (additional)\n// ---------------------------------------------------------------------------\n\nexport const datalist = html(\"datalist\");\nexport const optgroup = html<\n HtmlAttrs & { label?: string; disabled?: boolean },\n ContainerEvents\n>(\"optgroup\");\nexport const output = html<\n HtmlAttrs & { for?: string; name?: string },\n ContainerEvents\n>(\"output\");\nexport const progress = html<\n HtmlAttrs & { value?: number; max?: number },\n ContainerEvents\n>(\"progress\");\nexport const meter = html<\n HtmlAttrs & {\n value?: number;\n min?: number;\n max?: number;\n low?: number;\n high?: number;\n optimum?: number;\n },\n ContainerEvents\n>(\"meter\");\n\n// ---------------------------------------------------------------------------\n// Figure\n// ---------------------------------------------------------------------------\n\nexport const figure = html(\"figure\");\nexport const figcaption = html(\"figcaption\");\n\n// ---------------------------------------------------------------------------\n// Line break opportunity / content\n// ---------------------------------------------------------------------------\n\nexport const dd = html(\"dd\");\nexport const dl = html(\"dl\");\nexport const dt = html(\"dt\");\n\n// ---------------------------------------------------------------------------\n// Media (additional)\n// ---------------------------------------------------------------------------\n\nexport const track = html<\n HtmlAttrs & {\n src?: string;\n kind?: string;\n srclang?: string;\n label?: string;\n default?: boolean;\n },\n ContainerEvents\n>(\"track\");\nexport const map = html<HtmlAttrs & { name?: string }, ContainerEvents>(\"map\");\nexport const area = html<\n HtmlAttrs & {\n alt?: string;\n coords?: string;\n href?: string;\n shape?: string;\n target?: string;\n },\n ContainerEvents\n>(\"area\");\n",
|
|
10
10
|
"import type { Maybe } from \"@/functional/maybe\";\nimport type { MaybePromise } from \"@/functional/maybe_promise\";\n\n/**\n * Reactive value — the shared interface returned by `use()`.\n * Both local state and store bindings implement this.\n */\nexport interface Reactive<T> {\n get(): T;\n set(value: T): void;\n update(fn: (current: T) => MaybePromise<T>): void;\n}\n\n/**\n * A single reactive state slot.\n * Returned by calling use(initial) during view init.\n *\n * const count = use(0);\n * count.get() // read current value\n * count.set(5) // set immediately, schedule render\n * count.update(n => n + 1) // update via fn, schedule render\n *\n * Async updates chain: a second `update` issued while a previous async\n * update is still in flight runs against the previous update's result,\n * not against the snapshot at issue time. `set` cancels any pending\n * chain — its value becomes authoritative and in-flight links won't\n * commit afterwards.\n */\nexport class State<T> implements Reactive<T> {\n #current: T;\n #schedule: () => void;\n // Tail of the pending async update chain. Subsequent updates queue onto\n // it; `set` clears it to cancel any in-flight resolutions.\n #pending: Maybe<Promise<T>>;\n\n constructor(initial: T, schedule: () => void) {\n this.#current = initial;\n this.#schedule = schedule;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n if (this.#pending) {\n // Queue onto the pending chain so this fn runs against the previous\n // update's result, not against #current at call time.\n const next: Promise<T> = this.#pending.then((v) => fn(v));\n this.#pending = next;\n next.then((value) => {\n // Skip if a later update or `set` moved the tail past us.\n if (this.#pending !== next) return;\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n });\n return;\n }\n\n const result = fn(this.#current);\n if (!(result instanceof Promise)) {\n this.#current = result;\n this.#schedule();\n return;\n }\n\n const captured = result;\n this.#pending = captured;\n captured.then((value) => {\n if (this.#pending !== captured) return;\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n });\n }\n}\n\n/**\n * Use factory bound to a view.\n * Tracks instances by call order (like React hooks).\n *\n * use(store) — subscribe to a Store, returns Store<T> (Reactive<T>)\n * use(initial) — create local State<T> (Reactive<T>)\n */\nexport type Use = {\n <T>(storeOrInitial: import(\"@/public/store\").Store<T>): Reactive<T>;\n <T>(initial: T): Reactive<T>;\n};\n",
|
|
11
11
|
"import type { Maybe } from \"@/functional/maybe\";\nimport type { MaybePromise } from \"@/functional/maybe_promise\";\n\n// Symbol.for so isStore() works across multiple bundles of creo (e.g. when\n// a downstream library brings its own copy). A module-private Symbol() would\n// make `use(storeFromOtherBundle)` silently degrade to a fresh State.\nconst $store = Symbol.for(\"creo.store\");\n\n/**\n * Store — globally visible reactive data.\n *\n * Create a store:\n * const ThemeStore = store.new(\"light\");\n *\n * Set from anywhere:\n * ThemeStore.set(\"dark\"); // updates all subscribers\n *\n * Read from a view:\n * const myView = view(({ use }) => {\n * const theme = use(ThemeStore); // re-renders on change\n * return {\n * render() {\n * div(() => text(`Current theme: ${theme.get()}`));\n * }\n * };\n * });\n */\nexport class Store<T> {\n readonly [$store] = true;\n #current: T;\n #subscribers = new Set<() => void>();\n // Tail of the pending async update chain. Subsequent updates queue onto\n // it; `set` clears it to cancel any in-flight resolutions.\n #pending: Maybe<Promise<T>>;\n\n constructor(initial: T) {\n this.#current = initial;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#pending = null;\n this.#current = value;\n this.#notify();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n if (this.#pending) {\n const next: Promise<T> = this.#pending.then((v) => fn(v));\n this.#pending = next;\n next.then((value) => {\n if (this.#pending !== next) return;\n this.#pending = null;\n this.#current = value;\n this.#notify();\n });\n return;\n }\n\n const result = fn(this.#current);\n if (!(result instanceof Promise)) {\n this.#current = result;\n this.#notify();\n return;\n }\n\n const captured = result;\n this.#pending = captured;\n captured.then((value) => {\n if (this.#pending !== captured) return;\n this.#pending = null;\n this.#current = value;\n this.#notify();\n });\n }\n\n subscribe(cb: () => void): () => void {\n this.#subscribers.add(cb);\n return () => {\n this.#subscribers.delete(cb);\n };\n }\n\n #notify(): void {\n for (const sub of this.#subscribers) {\n sub();\n }\n }\n}\n\nexport function isStore(value: unknown): value is Store<unknown> {\n return value != null && typeof value === \"object\" && $store in value;\n}\n\nexport const store = {\n new<T>(initial: T): Store<T> {\n return new Store(initial);\n },\n};\n",
|
|
12
12
|
"import type { Wildcard } from \"@/internal/wildcard\";\n\nexport function shallowEqual(a: Wildcard, b: Wildcard): boolean {\n if (a === b) return true;\n\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n // Single-walk-with-count: avoid Object.keys() allocations and the slower\n // Object.is semantics (NaN/-0 distinctions don't matter for props).\n let countA = 0;\n for (const key in a) {\n countA++;\n if (a[key] !== b[key]) return false;\n }\n\n let countB = 0;\n for (const _ in b) {\n countB++;\n // Early bail: b has at least one key not in a (since all a's keys\n // matched, any extra in b means counts must diverge).\n if (countB > countA) return false;\n }\n\n return countA === countB;\n}\n",
|
|
13
13
|
"/**\n * Longest Increasing Subsequence — O(n log n).\n *\n * Given an array of numbers, returns the Set of *indices* into that array\n * whose elements form the longest strictly increasing subsequence.\n * Entries equal to -1 are skipped (treated as \"not present\").\n *\n * Used by the keyed reconciler to identify the maximal set of children\n * that are already in correct relative order and don't need DOM moves.\n */\nexport function lis(arr: number[]): Set<number> {\n const len = arr.length;\n if (len === 0) return new Set();\n\n // tails[k] = index into arr of the smallest tail element for an IS of length k+1\n const tails: number[] = [];\n // prev[i] = index into arr of the predecessor of arr[i] in the LIS\n const prev = new Array<number>(len).fill(-1);\n\n for (let i = 0; i < len; i++) {\n if (arr[i]! < 0) continue; // skip -1 entries\n\n const val = arr[i]!;\n\n // Binary search for the leftmost tail >= val\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (arr[tails[mid]!]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n // lo is the position where val should go\n if (lo > 0) prev[i] = tails[lo - 1]!;\n tails[lo] = i;\n }\n\n // Backtrack from the last element of tails to reconstruct the LIS\n const result = new Set<number>();\n if (tails.length === 0) return result;\n\n let idx = tails[tails.length - 1]!;\n for (let k = tails.length - 1; k >= 0; k--) {\n result.add(idx);\n idx = prev[idx]!;\n }\n\n return result;\n}\n",
|
|
14
|
-
"import type { IRender } from \"@/render/render_interface\";\nimport {\n type ViewRecord,\n hasScStructuralChange,\n F_DIRTY,\n F_MOVED,\n F_PRIMITIVE,\n F_PENDING,\n F_DISPOSED,\n} from \"./internal_view\";\nimport type { Wildcard } from \"./wildcard\";\nimport { type Maybe } from \"@/functional/maybe\";\nimport type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewFn } from \"@/public/view\";\nimport { textViewFn } from \"@/public/primitives/primitives\";\nimport { $primitive } from \"@/public/primitive\";\nimport { State, type Reactive } from \"@/public/state\";\nimport { Store, isStore } from \"@/public/store\";\nimport { shallowEqual } from \"@/functional/shallow_equal\";\nimport { lis } from \"@/functional/lis\";\nimport { orchestrator } from \"./orchestrator\";\n\nexport type Scheduler = (callback: () => void) => void;\n\nexport class Engine {\n #dirtyQueue = new Set<ViewRecord>();\n #collector: Maybe<ViewRecord[]>;\n #collectFor: Maybe<ViewRecord>;\n\n #scheduler: Scheduler;\n #renderScheduled = false;\n #rendering = false;\n\n constructor(\n public renderer: IRender<Wildcard>,\n scheduler?: Scheduler,\n ) {\n this.#scheduler = scheduler ?? ((cb) => queueMicrotask(cb));\n renderer.engine = this;\n }\n\n // -- Record initialization --------------------------------------------------\n newView<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n parent: Maybe<ViewRecord>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord {\n const res: ViewRecord = {\n viewFn,\n userKey,\n props,\n slot,\n // View was not rendered yet, so there is no body\n body: null,\n // slot was not called _yet_, so there is no slot children\n sc: null,\n // there is no renderer _yet_\n renderRef: null,\n\n flags: F_PENDING | (viewFn[$primitive] != null ? F_PRIMITIVE : 0),\n\n children: null,\n\n keyToView: null,\n unsubscribe: null,\n parent,\n scHost: null,\n pos: -1,\n };\n if (slot) {\n if (typeof slot === \"string\") {\n // String slot — inline a single text ViewRecord. Avoids both the\n // throwaway closure and a collector trip per view.\n res.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n res,\n slot,\n null,\n null,\n ),\n ];\n } else {\n res.sc = this.#collect(slot, [], res);\n }\n }\n return res;\n }\n\n // called when view renders view\n // Saved potential pending view to collector for further reconsilication\n view<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord<Props, Api, RenderRef> {\n const view = this.newView(viewFn, this.#collectFor, props, slot, userKey);\n this.#collector?.push(view);\n return view;\n }\n\n views(views: Maybe<ViewRecord[]>): void {\n if (views) this.#collector?.push(...views);\n }\n\n // ViewRecord already exist, but we still need to initialise the whole record\n initViewBody(view: ViewRecord): void {\n // Only for non initialised views:\n if (!(view.flags & F_PENDING)) return;\n\n view.flags &= ~F_PENDING;\n\n // If view is primitive\n if (view.flags & F_PRIMITIVE) {\n const engine = this;\n view.body = {\n render() {\n engine.views(view.sc);\n },\n };\n return;\n }\n // View is composite\n view.body = view.viewFn({\n props: () => view.props,\n use: <T>(storeOrState: T | Store<T>): Reactive<T> => {\n if (!isStore(storeOrState)) {\n return new State(storeOrState, () => this.markDirty(view));\n }\n const s = storeOrState;\n const unsub = s.subscribe(() => this.markDirty(view));\n if (!view.unsubscribe) view.unsubscribe = [];\n view.unsubscribe.push(unsub);\n return s;\n },\n slot: () => {\n if (!view.sc) return;\n view.scHost = this.#collectFor ?? view;\n for (const child of view.sc) {\n child.parent = this.#collectFor ?? view;\n this.#collector?.push(child);\n }\n },\n });\n }\n\n createRoot(children: () => void, props: Wildcard): ViewRecord {\n orchestrator.setCurrentEngine(this);\n const view = this.newView(\n ({ slot }) => ({\n render() {\n slot();\n },\n }),\n null,\n props,\n children,\n null,\n );\n this.markDirty(view);\n return view;\n }\n\n // -- Dirty tracking ---------------------------------------------------------\n\n markDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_DIRTY) {\n return;\n }\n view.flags |= F_DIRTY;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n markMoved<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_MOVED) {\n return;\n }\n view.flags |= F_MOVED;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n schedule(): void {\n if (this.#renderScheduled) return;\n this.#renderScheduled = true;\n this.#scheduler(() => {\n this.#renderScheduled = false;\n this.render();\n });\n }\n\n // -- Collector --------------------------------------------------------------\n\n #collect(\n render: () => void,\n collector: ViewRecord[],\n parent: ViewRecord,\n ): ViewRecord[] {\n const before = this.#collector;\n const beforeParent = this.#collectFor;\n this.#collector = collector;\n this.#collectFor = parent;\n render();\n this.#collector = before;\n this.#collectFor = beforeParent;\n return collector;\n }\n\n // -- Props update -----------------------------------------------------------\n\n nextProps<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n nextProps: Props,\n nextSlot: Maybe<SlotContent>,\n preCollectedSc?: Maybe<ViewRecord[]>,\n ): void {\n const prevSc = view.sc;\n view.slot = nextSlot;\n // Use pre-collected sc if available (avoids re-running the slot function)\n if (preCollectedSc) {\n // Re-parent sc items to this view (they were parented to the pending view)\n for (const child of preCollectedSc) child.parent = view;\n view.sc = preCollectedSc;\n } else if (nextSlot) {\n if (typeof nextSlot === \"string\") {\n view.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n view,\n nextSlot,\n null,\n null,\n ),\n ];\n } else {\n view.sc = this.#collect(nextSlot, [], view);\n }\n } else {\n view.sc = null;\n }\n\n const structChanged = hasScStructuralChange(prevSc, view.sc);\n const shouldUpdate = view.body?.shouldUpdate\n ? view.body.shouldUpdate(nextProps)\n : !shallowEqual(view.props, nextProps) ||\n // Primitive whose live output may have drifted from props (e.g. user\n // typed in <input value=…>) — let the renderer decide whether a\n // re-assertion is actually needed.\n ((view.flags & F_PRIMITIVE) !== 0 &&\n this.renderer.shouldReassert?.(view, nextProps) === true);\n\n if (shouldUpdate || structChanged) {\n // Full re-render: own props or slot structure changed\n view.props = nextProps;\n this.markDirty(view);\n } else if (view.sc && view.scHost?.children) {\n // Composite with stable structure and own props — propagate sc prop changes directly\n this.#propagateScProps(view);\n } else if (view.sc && prevSc) {\n // No scHost (e.g. primitive) — check if any sc child props changed\n for (let i = 0; i < view.sc.length; i++) {\n if (view.sc[i]!.props !== prevSc[i]!.props) {\n this.markDirty(view);\n break;\n }\n }\n }\n }\n\n /** Propagate slot children prop changes directly to live children, skipping parent reconcile. */\n #propagateScProps(owner: ViewRecord): void {\n const host = owner.scHost;\n const sc = owner.sc;\n if (!host?.children || !sc) return;\n\n if (host.keyToView) {\n for (const item of sc) {\n if (item.userKey != null) {\n const live = host.keyToView.get(item.userKey);\n if (live && live.viewFn === item.viewFn) {\n this.nextProps(live, item.props, item.slot);\n }\n }\n }\n } else {\n const len = Math.min(sc.length, host.children.length);\n for (let i = 0; i < len; i++) {\n const live = host.children[i]!;\n if (live.viewFn === sc[i]!.viewFn) {\n this.nextProps(live, sc[i]!.props, sc[i]!.slot);\n }\n }\n }\n }\n\n // -- Reconciliation ---------------------------------------------------------\n\n reconcile(view: ViewRecord): void {\n let pendingChildren: Maybe<ViewRecord[]> = null;\n if (view.body?.render) {\n pendingChildren = this.#collect(view.body.render, [], view);\n }\n\n if (pendingChildren == null || pendingChildren.length === 0) {\n // No children case\n if (view.children) for (const child of view.children) this.dispose(child);\n return;\n }\n\n // We do not have any previous children. In this case, we just insert new items and that's it\n if (view.children == null) {\n view.children = pendingChildren;\n for (let i = 0; i < pendingChildren.length; i++) {\n const child = pendingChildren[i]!;\n child.pos = i;\n this.initViewBody(child);\n this.markDirty(child);\n if (child.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(child.userKey, child);\n }\n }\n return;\n }\n // Now, we have both view.children & pendingChildren\n // Check if any child is keyed — if so, use keyed algorithm\n const hasKeys = pendingChildren.some((c) => c.userKey != null);\n if (hasKeys) {\n this.#reconcileKeyed(view, view.children, pendingChildren);\n } else {\n this.#reconcileNonKeyed(view, view.children, pendingChildren);\n }\n }\n\n // -- Non-keyed reconciliation ------------------------------------------------\n\n #reconcileNonKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n const oldLen = oldChildren.length;\n const newLen = pending.length;\n const minLen = Math.min(oldLen, newLen);\n\n // Patch overlapping range by position\n for (let i = 0; i < minLen; i++) {\n const old = oldChildren[i]!;\n const pend = pending[i]!;\n this.#patchOrReplace(view, oldChildren, i, old, pend);\n oldChildren[i]!.pos = i;\n }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[i]!;\n pending[i]!.pos = i;\n this.initViewBody(pending[i]!);\n this.markDirty(pending[i]!);\n }\n\n // Dispose removed children\n for (let i = newLen; i < oldLen; i++) {\n this.dispose(oldChildren[i]!);\n }\n oldChildren.length = newLen;\n }\n\n // -- Keyed reconciliation\n\n #reconcileKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n let i = 0;\n let oldEnd = oldChildren.length - 1;\n let newEnd = pending.length - 1;\n\n // Phase 1: Head sync — match from start\n while (i <= oldEnd && i <= newEnd) {\n const oldView = oldChildren[i]!;\n const pendView = pending[i]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, i, oldView, pendView);\n i++;\n }\n\n // Phase 2: Tail sync — match from end\n while (oldEnd >= i && newEnd >= i) {\n const oldView = oldChildren[oldEnd]!;\n const pendView = pending[newEnd]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, oldEnd, oldView, pendView);\n oldEnd--;\n newEnd--;\n }\n\n // Phase 3: Simple cases\n if (i > oldEnd) {\n // All remaining pending are insertions\n for (let j = i; j <= newEnd; j++) {\n this.initViewBody(pending[j]!);\n this.markDirty(pending[j]!);\n if (pending[j]!.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pending[j]!.userKey!, pending[j]!);\n }\n }\n // Rebuild children: head (already patched) + insertions + tail.\n // Pre-sized array, indexed write — no intermediate slices/spreads.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const insertCount = newEnd - i + 1;\n const out = new Array<ViewRecord>(i + insertCount + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < insertCount; j++) {\n const c = pending[i + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + insertCount + j;\n out[i + insertCount + j] = c;\n }\n view.children = out;\n return;\n }\n\n if (i > newEnd) {\n // All remaining old are removals\n for (let j = i; j <= oldEnd; j++) {\n this.dispose(oldChildren[j]!);\n }\n // Rebuild children array: head + tail. Pre-sized indexed write.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n view.children = out;\n return;\n }\n\n // Phase 4: Middle diff\n // Build map: pending key → index in pending\n const newKeyToIndex = new Map<Key, number>();\n for (let j = i; j <= newEnd; j++) {\n const key = pending[j]!.userKey;\n if (key != null) newKeyToIndex.set(key, j);\n }\n\n const middleLen = newEnd - i + 1;\n // newIdxToOldIdx[j] = old index of the view now at pending[i+j], or -1 if new\n const newIdxToOldIdx = new Array<number>(middleLen).fill(-1);\n // Track which old children were matched\n const matched = new Set<number>();\n\n for (let j = i; j <= oldEnd; j++) {\n const oldView = oldChildren[j]!;\n const key = oldView.userKey;\n if (key != null && newKeyToIndex.has(key)) {\n const newIdx = newKeyToIndex.get(key)!;\n newIdxToOldIdx[newIdx - i] = j;\n matched.add(j);\n }\n }\n\n // Dispose unmatched old children\n for (let j = i; j <= oldEnd; j++) {\n if (!matched.has(j)) {\n this.dispose(oldChildren[j]!);\n }\n }\n\n // Compute LIS on the old indices — these views stay in place\n const stable = lis(newIdxToOldIdx);\n\n // Build view.children directly: head + middle + tail. Pre-sized,\n // indexed write — no intermediate `newChildren` array, no slices.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + middleLen + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = middleLen - 1; j >= 0; j--) {\n const newIdx = i + j;\n const pendView = pending[newIdx]!;\n\n if (newIdxToOldIdx[j] === -1) {\n // New child — init and mount\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pendView.userKey, pendView);\n }\n pendView.pos = i + j;\n out[i + j] = pendView;\n } else {\n // Matched child — reuse the old view\n const oldView = oldChildren[newIdxToOldIdx[j]!]!;\n this.#patchOrReplace(\n view,\n oldChildren,\n newIdxToOldIdx[j]!,\n oldView,\n pendView,\n );\n if (!stable.has(j)) {\n this.markMoved(oldView);\n }\n // Use whatever ended up in oldChildren after the patch (may be\n // pendView if viewFn changed and #patchOrReplace replaced it).\n const placed = oldChildren[newIdxToOldIdx[j]!]!;\n placed.pos = i + j;\n out[i + j] = placed;\n }\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + middleLen + j;\n out[i + middleLen + j] = c;\n }\n view.children = out;\n }\n\n /** Patch an existing view with pending props, or replace if viewFn changed. */\n #patchOrReplace(\n parent: ViewRecord,\n oldChildren: ViewRecord[],\n idx: number,\n oldView: ViewRecord,\n pendView: ViewRecord,\n ): void {\n if (oldView.viewFn === pendView.viewFn) {\n this.nextProps(oldView, pendView.props, pendView.slot, pendView.sc);\n } else {\n this.dispose(oldView);\n oldChildren[idx] = pendView;\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!parent.keyToView) parent.keyToView = new Map();\n parent.keyToView.set(pendView.userKey, pendView);\n }\n }\n }\n\n // -- Disposal ---------------------------------------------------------------\n\n dispose(view: ViewRecord): void {\n // If this is a primitive with a DOM element, removing it from DOM\n // automatically removes all descendant DOM nodes. Only do virtual\n // cleanup (unsubscribe, key removal, dirty queue) for children.\n const isPrimitiveWithDom = view.flags & F_PRIMITIVE && view.renderRef;\n\n if (view.children) {\n for (const child of view.children) {\n if (isPrimitiveWithDom) {\n this.#disposeVirtual(child);\n } else {\n this.dispose(child);\n }\n }\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n this.renderer.unmount(view);\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n /** Dispose without DOM removal — parent primitive handles DOM cleanup. */\n #disposeVirtual(view: ViewRecord): void {\n if (view.children) {\n for (const child of view.children) this.#disposeVirtual(child);\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n view.renderRef = undefined;\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n // -- Render loop ------------------------------------------------------------\n\n render(): void {\n // Already rendering. Exit.\n if (this.#rendering) return;\n\n // Orchestrator should know which engine is currently active.\n // Inside single task only one engine can be active\n orchestrator.setCurrentEngine(this);\n this.#rendering = true;\n\n try {\n const cbs: (() => void)[] = [];\n for (const view of this.#dirtyQueue) {\n if (view.flags & F_DISPOSED) continue;\n this.initViewBody(view);\n const isNew = !view.renderRef;\n if (!isNew) view.body?.onUpdateBefore?.();\n\n if (view.flags & F_DIRTY) {\n // Full re-render\n this.reconcile(view);\n this.renderer.render(view);\n view.flags &= ~F_DIRTY;\n view.flags &= ~F_MOVED;\n\n if (isNew && view.body?.onMount) {\n const b = view.body;\n cbs.push(() => b.onMount!());\n } else if (!isNew && view.body?.onUpdateAfter) {\n const b = view.body;\n cbs.push(() => b.onUpdateAfter!());\n }\n } else {\n // Move only\n this.renderer.render(view);\n view.flags &= ~F_MOVED;\n }\n }\n\n this.#dirtyQueue.clear();\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n for (const cb of cbs) cb();\n } catch (e) {\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n throw e;\n }\n }\n}\n",
|
|
14
|
+
"import type { IRender } from \"@/render/render_interface\";\nimport {\n type ViewRecord,\n hasScStructuralChange,\n F_DIRTY,\n F_MOVED,\n F_PRIMITIVE,\n F_PENDING,\n F_DISPOSED,\n} from \"./internal_view\";\nimport type { Wildcard } from \"./wildcard\";\nimport { type Maybe } from \"@/functional/maybe\";\nimport type { Key } from \"@/functional/key\";\nimport type { Ref, SlotContent, ViewFn } from \"@/public/view\";\nimport { applyRef } from \"@/public/view\";\nimport { textViewFn } from \"@/public/primitives/primitives\";\nimport { $primitive } from \"@/public/primitive\";\nimport { State, type Reactive } from \"@/public/state\";\nimport { Store, isStore } from \"@/public/store\";\nimport { shallowEqual } from \"@/functional/shallow_equal\";\nimport { lis } from \"@/functional/lis\";\nimport { orchestrator } from \"./orchestrator\";\n\nexport type Scheduler = (callback: () => void) => void;\n\nfunction getConsumerRef(view: ViewRecord): Maybe<Ref<unknown>> {\n if (view.flags & F_PRIMITIVE) return undefined;\n return view.props?.ref;\n}\n\nexport class Engine {\n #dirtyQueue = new Set<ViewRecord>();\n #collector: Maybe<ViewRecord[]>;\n #collectFor: Maybe<ViewRecord>;\n\n #scheduler: Scheduler;\n #renderScheduled = false;\n #rendering = false;\n\n constructor(\n public renderer: IRender<Wildcard>,\n scheduler?: Scheduler,\n ) {\n this.#scheduler = scheduler ?? ((cb) => queueMicrotask(cb));\n renderer.engine = this;\n }\n\n // -- Record initialization --------------------------------------------------\n newView<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n parent: Maybe<ViewRecord>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord {\n const res: ViewRecord = {\n viewFn,\n userKey,\n props,\n slot,\n // View was not rendered yet, so there is no body\n body: null,\n // slot was not called _yet_, so there is no slot children\n sc: null,\n // there is no renderer _yet_\n renderRef: null,\n\n flags: F_PENDING | (viewFn[$primitive] != null ? F_PRIMITIVE : 0),\n\n children: null,\n\n keyToView: null,\n unsubscribe: null,\n parent,\n scHost: null,\n pos: -1,\n publicRef: null,\n };\n if (slot) {\n if (typeof slot === \"string\") {\n // String slot — inline a single text ViewRecord. Avoids both the\n // throwaway closure and a collector trip per view.\n res.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n res,\n slot,\n null,\n null,\n ),\n ];\n } else {\n res.sc = this.#collect(slot, [], res);\n }\n }\n return res;\n }\n\n // called when view renders view\n // Saved potential pending view to collector for further reconsilication\n view<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord<Props, Api, RenderRef> {\n const view = this.newView(viewFn, this.#collectFor, props, slot, userKey);\n this.#collector?.push(view);\n return view;\n }\n\n views(views: Maybe<ViewRecord[]>): void {\n if (views) this.#collector?.push(...views);\n }\n\n // ViewRecord already exist, but we still need to initialise the whole record\n initViewBody(view: ViewRecord): void {\n // Only for non initialised views:\n if (!(view.flags & F_PENDING)) return;\n\n view.flags &= ~F_PENDING;\n\n // If view is primitive\n if (view.flags & F_PRIMITIVE) {\n const engine = this;\n view.body = {\n render() {\n engine.views(view.sc);\n },\n };\n return;\n }\n // View is composite\n view.body = view.viewFn({\n props: () => view.props,\n use: <T>(storeOrState: T | Store<T>): Reactive<T> => {\n if (!isStore(storeOrState)) {\n return new State(storeOrState, () => this.markDirty(view));\n }\n const s = storeOrState;\n const unsub = s.subscribe(() => this.markDirty(view));\n if (!view.unsubscribe) view.unsubscribe = [];\n view.unsubscribe.push(unsub);\n return s;\n },\n slot: () => {\n if (!view.sc) return;\n view.scHost = this.#collectFor ?? view;\n for (const child of view.sc) {\n child.parent = this.#collectFor ?? view;\n this.#collector?.push(child);\n }\n },\n // Stays valid past initial body construction — user can call from\n // onMount or async work to swap the exposed value later.\n ref: (value: unknown) => {\n view.publicRef = value;\n applyRef(getConsumerRef(view), value);\n },\n });\n }\n\n createRoot(children: () => void, props: Wildcard): ViewRecord {\n orchestrator.setCurrentEngine(this);\n const view = this.newView(\n ({ slot }) => ({\n render() {\n slot();\n },\n }),\n null,\n props,\n children,\n null,\n );\n this.markDirty(view);\n return view;\n }\n\n // -- Dirty tracking ---------------------------------------------------------\n\n markDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_DIRTY) {\n return;\n }\n view.flags |= F_DIRTY;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n markMoved<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_MOVED) {\n return;\n }\n view.flags |= F_MOVED;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n schedule(): void {\n if (this.#renderScheduled) return;\n this.#renderScheduled = true;\n this.#scheduler(() => {\n this.#renderScheduled = false;\n this.render();\n });\n }\n\n // -- Collector --------------------------------------------------------------\n\n #collect(\n render: () => void,\n collector: ViewRecord[],\n parent: ViewRecord,\n ): ViewRecord[] {\n const before = this.#collector;\n const beforeParent = this.#collectFor;\n this.#collector = collector;\n this.#collectFor = parent;\n render();\n this.#collector = before;\n this.#collectFor = beforeParent;\n return collector;\n }\n\n // -- Props update -----------------------------------------------------------\n\n nextProps<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n nextProps: Props,\n nextSlot: Maybe<SlotContent>,\n preCollectedSc?: Maybe<ViewRecord[]>,\n ): void {\n // Ref migration: if the consumer swapped `ref` between renders, detach\n // the old (write null) and seed the new with whatever the view has\n // already published via ctx.ref(). Do this before view.props is\n // overwritten so getConsumerRef sees the *previous* ref.\n const prevRef = getConsumerRef(view);\n const nextRef = (nextProps as { ref?: Ref<unknown> } | null | undefined)\n ?.ref;\n if (prevRef !== nextRef) {\n if (prevRef) applyRef(prevRef, null);\n if (nextRef && view.publicRef != null) applyRef(nextRef, view.publicRef);\n }\n\n const prevSc = view.sc;\n view.slot = nextSlot;\n // Use pre-collected sc if available (avoids re-running the slot function)\n if (preCollectedSc) {\n // Re-parent sc items to this view (they were parented to the pending view)\n for (const child of preCollectedSc) child.parent = view;\n view.sc = preCollectedSc;\n } else if (nextSlot) {\n if (typeof nextSlot === \"string\") {\n view.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n view,\n nextSlot,\n null,\n null,\n ),\n ];\n } else {\n view.sc = this.#collect(nextSlot, [], view);\n }\n } else {\n view.sc = null;\n }\n\n const structChanged = hasScStructuralChange(prevSc, view.sc);\n const shouldUpdate = view.body?.shouldUpdate\n ? view.body.shouldUpdate(nextProps)\n : !shallowEqual(view.props, nextProps) ||\n // Primitive whose live output may have drifted from props (e.g. user\n // typed in <input value=…>) — let the renderer decide whether a\n // re-assertion is actually needed.\n ((view.flags & F_PRIMITIVE) !== 0 &&\n this.renderer.shouldReassert?.(view, nextProps) === true);\n\n if (shouldUpdate || structChanged) {\n // Full re-render: own props or slot structure changed\n view.props = nextProps;\n this.markDirty(view);\n } else if (view.sc && view.scHost?.children) {\n // Composite with stable structure and own props — propagate sc prop changes directly\n this.#propagateScProps(view);\n } else if (view.sc && prevSc) {\n // No scHost (e.g. primitive) — check if any sc child props changed\n for (let i = 0; i < view.sc.length; i++) {\n if (view.sc[i]!.props !== prevSc[i]!.props) {\n this.markDirty(view);\n break;\n }\n }\n }\n }\n\n /** Propagate slot children prop changes directly to live children, skipping parent reconcile. */\n #propagateScProps(owner: ViewRecord): void {\n const host = owner.scHost;\n const sc = owner.sc;\n if (!host?.children || !sc) return;\n\n if (host.keyToView) {\n for (const item of sc) {\n if (item.userKey != null) {\n const live = host.keyToView.get(item.userKey);\n if (live && live.viewFn === item.viewFn) {\n this.nextProps(live, item.props, item.slot);\n }\n }\n }\n } else {\n const len = Math.min(sc.length, host.children.length);\n for (let i = 0; i < len; i++) {\n const live = host.children[i]!;\n if (live.viewFn === sc[i]!.viewFn) {\n this.nextProps(live, sc[i]!.props, sc[i]!.slot);\n }\n }\n }\n }\n\n // -- Reconciliation ---------------------------------------------------------\n\n reconcile(view: ViewRecord): void {\n let pendingChildren: Maybe<ViewRecord[]> = null;\n if (view.body?.render) {\n pendingChildren = this.#collect(view.body.render, [], view);\n }\n\n if (pendingChildren == null || pendingChildren.length === 0) {\n // No children case\n if (view.children) for (const child of view.children) this.dispose(child);\n return;\n }\n\n // We do not have any previous children. In this case, we just insert new items and that's it\n if (view.children == null) {\n view.children = pendingChildren;\n for (let i = 0; i < pendingChildren.length; i++) {\n const child = pendingChildren[i]!;\n child.pos = i;\n this.initViewBody(child);\n this.markDirty(child);\n if (child.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(child.userKey, child);\n }\n }\n return;\n }\n // Now, we have both view.children & pendingChildren\n // Check if any child is keyed — if so, use keyed algorithm\n const hasKeys = pendingChildren.some((c) => c.userKey != null);\n if (hasKeys) {\n this.#reconcileKeyed(view, view.children, pendingChildren);\n } else {\n this.#reconcileNonKeyed(view, view.children, pendingChildren);\n }\n }\n\n // -- Non-keyed reconciliation ------------------------------------------------\n\n #reconcileNonKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n const oldLen = oldChildren.length;\n const newLen = pending.length;\n const minLen = Math.min(oldLen, newLen);\n\n // Patch overlapping range by position\n for (let i = 0; i < minLen; i++) {\n const old = oldChildren[i]!;\n const pend = pending[i]!;\n this.#patchOrReplace(view, oldChildren, i, old, pend);\n oldChildren[i]!.pos = i;\n }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[i]!;\n pending[i]!.pos = i;\n this.initViewBody(pending[i]!);\n this.markDirty(pending[i]!);\n }\n\n // Dispose removed children\n for (let i = newLen; i < oldLen; i++) {\n this.dispose(oldChildren[i]!);\n }\n oldChildren.length = newLen;\n }\n\n // -- Keyed reconciliation\n\n #reconcileKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n let i = 0;\n let oldEnd = oldChildren.length - 1;\n let newEnd = pending.length - 1;\n\n // Phase 1: Head sync — match from start\n while (i <= oldEnd && i <= newEnd) {\n const oldView = oldChildren[i]!;\n const pendView = pending[i]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, i, oldView, pendView);\n i++;\n }\n\n // Phase 2: Tail sync — match from end\n while (oldEnd >= i && newEnd >= i) {\n const oldView = oldChildren[oldEnd]!;\n const pendView = pending[newEnd]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, oldEnd, oldView, pendView);\n oldEnd--;\n newEnd--;\n }\n\n // Phase 3: Simple cases\n if (i > oldEnd) {\n // All remaining pending are insertions\n for (let j = i; j <= newEnd; j++) {\n this.initViewBody(pending[j]!);\n this.markDirty(pending[j]!);\n if (pending[j]!.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pending[j]!.userKey!, pending[j]!);\n }\n }\n // Rebuild children: head (already patched) + insertions + tail.\n // Pre-sized array, indexed write — no intermediate slices/spreads.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const insertCount = newEnd - i + 1;\n const out = new Array<ViewRecord>(i + insertCount + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < insertCount; j++) {\n const c = pending[i + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + insertCount + j;\n out[i + insertCount + j] = c;\n }\n view.children = out;\n return;\n }\n\n if (i > newEnd) {\n // All remaining old are removals\n for (let j = i; j <= oldEnd; j++) {\n this.dispose(oldChildren[j]!);\n }\n // Rebuild children array: head + tail. Pre-sized indexed write.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n view.children = out;\n return;\n }\n\n // Phase 4: Middle diff\n // Build map: pending key → index in pending\n const newKeyToIndex = new Map<Key, number>();\n for (let j = i; j <= newEnd; j++) {\n const key = pending[j]!.userKey;\n if (key != null) newKeyToIndex.set(key, j);\n }\n\n const middleLen = newEnd - i + 1;\n // newIdxToOldIdx[j] = old index of the view now at pending[i+j], or -1 if new\n const newIdxToOldIdx = new Array<number>(middleLen).fill(-1);\n // Track which old children were matched\n const matched = new Set<number>();\n\n for (let j = i; j <= oldEnd; j++) {\n const oldView = oldChildren[j]!;\n const key = oldView.userKey;\n if (key != null && newKeyToIndex.has(key)) {\n const newIdx = newKeyToIndex.get(key)!;\n newIdxToOldIdx[newIdx - i] = j;\n matched.add(j);\n }\n }\n\n // Dispose unmatched old children\n for (let j = i; j <= oldEnd; j++) {\n if (!matched.has(j)) {\n this.dispose(oldChildren[j]!);\n }\n }\n\n // Compute LIS on the old indices — these views stay in place\n const stable = lis(newIdxToOldIdx);\n\n // Build view.children directly: head + middle + tail. Pre-sized,\n // indexed write — no intermediate `newChildren` array, no slices.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + middleLen + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = middleLen - 1; j >= 0; j--) {\n const newIdx = i + j;\n const pendView = pending[newIdx]!;\n\n if (newIdxToOldIdx[j] === -1) {\n // New child — init and mount\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pendView.userKey, pendView);\n }\n pendView.pos = i + j;\n out[i + j] = pendView;\n } else {\n // Matched child — reuse the old view\n const oldView = oldChildren[newIdxToOldIdx[j]!]!;\n this.#patchOrReplace(\n view,\n oldChildren,\n newIdxToOldIdx[j]!,\n oldView,\n pendView,\n );\n if (!stable.has(j)) {\n this.markMoved(oldView);\n }\n // Use whatever ended up in oldChildren after the patch (may be\n // pendView if viewFn changed and #patchOrReplace replaced it).\n const placed = oldChildren[newIdxToOldIdx[j]!]!;\n placed.pos = i + j;\n out[i + j] = placed;\n }\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + middleLen + j;\n out[i + middleLen + j] = c;\n }\n view.children = out;\n }\n\n /** Patch an existing view with pending props, or replace if viewFn changed. */\n #patchOrReplace(\n parent: ViewRecord,\n oldChildren: ViewRecord[],\n idx: number,\n oldView: ViewRecord,\n pendView: ViewRecord,\n ): void {\n if (oldView.viewFn === pendView.viewFn) {\n this.nextProps(oldView, pendView.props, pendView.slot, pendView.sc);\n } else {\n this.dispose(oldView);\n oldChildren[idx] = pendView;\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!parent.keyToView) parent.keyToView = new Map();\n parent.keyToView.set(pendView.userKey, pendView);\n }\n }\n }\n\n // -- Disposal ---------------------------------------------------------------\n\n dispose(view: ViewRecord): void {\n // If this is a primitive with a DOM element, removing it from DOM\n // automatically removes all descendant DOM nodes. Only do virtual\n // cleanup (unsubscribe, key removal, dirty queue) for children.\n const isPrimitiveWithDom = view.flags & F_PRIMITIVE && view.renderRef;\n\n if (view.children) {\n for (const child of view.children) {\n if (isPrimitiveWithDom) {\n this.#disposeVirtual(child);\n } else {\n this.dispose(child);\n }\n }\n }\n view.body?.dispose?.();\n applyRef(getConsumerRef(view), null);\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n this.renderer.unmount(view);\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n /** Dispose without DOM removal — parent primitive handles DOM cleanup. */\n #disposeVirtual(view: ViewRecord): void {\n if (view.children) {\n for (const child of view.children) this.#disposeVirtual(child);\n }\n view.body?.dispose?.();\n applyRef(getConsumerRef(view), null);\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n view.renderRef = undefined;\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n // -- Render loop ------------------------------------------------------------\n\n render(): void {\n // Already rendering. Exit.\n if (this.#rendering) return;\n\n // Orchestrator should know which engine is currently active.\n // Inside single task only one engine can be active\n orchestrator.setCurrentEngine(this);\n this.#rendering = true;\n\n try {\n const cbs: (() => void)[] = [];\n for (const view of this.#dirtyQueue) {\n if (view.flags & F_DISPOSED) continue;\n this.initViewBody(view);\n const isNew = !view.renderRef;\n if (!isNew) view.body?.onUpdateBefore?.();\n\n if (view.flags & F_DIRTY) {\n // Full re-render\n this.reconcile(view);\n this.renderer.render(view);\n view.flags &= ~F_DIRTY;\n view.flags &= ~F_MOVED;\n\n if (isNew && view.body?.onMount) {\n const b = view.body;\n cbs.push(() => b.onMount!());\n } else if (!isNew && view.body?.onUpdateAfter) {\n const b = view.body;\n cbs.push(() => b.onUpdateAfter!());\n }\n } else {\n // Move only\n this.renderer.render(view);\n view.flags &= ~F_MOVED;\n }\n }\n\n this.#dirtyQueue.clear();\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n for (const cb of cbs) cb();\n } catch (e) {\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n throw e;\n }\n }\n}\n",
|
|
15
15
|
"import { Engine, type Scheduler } from \"@/internal/engine\";\nimport type { IRender } from \"@/render/render_interface\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\ntype AppOptions = {\n scheduler?: Scheduler;\n};\n\ntype AppHandle = {\n engine: Engine;\n};\n\n/**\n * Create a Creo application.\n *\n * createApp(() => App(), new HtmlRender(el)).mount();\n * createApp(() => App(), new HtmlRender(el), { scheduler: requestAnimationFrame }).mount();\n */\nexport function createApp(\n slot: () => void,\n renderer: IRender<Wildcard>,\n options?: AppOptions,\n) {\n return {\n mount(props?: Wildcard): AppHandle {\n const engine = new Engine(renderer, options?.scheduler);\n engine.createRoot(slot, props ?? {});\n engine.render();\n return { engine };\n },\n };\n}\n",
|
|
16
|
-
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE, F_MOVED, F_TEXT_CONTENT } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// Render refs — stored on view.renderRef\n// ---------------------------------------------------------------------------\n\n/**\n * For primitives: { element, prevProps }\n * For composites: renderRef is set to `true` (just a non-null marker)\n *\n * Discriminated via view.flags & F_PRIMITIVE — no `kind` field needed.\n */\ntype PrimitiveDomRef = {\n element: Element | Text;\n prevProps: Maybe<Record<string, unknown>>;\n};\n\n// ---------------------------------------------------------------------------\n// Event delegation — Inferno-style: one listener per event type on container\n// ---------------------------------------------------------------------------\n\nfunction isEventProp(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 && // 'o'\n key.charCodeAt(1) === 110 && // 'n'\n key.charCodeAt(2) >= 65 && // 'A'\n key.charCodeAt(2) <= 90 // 'Z'\n );\n}\n\nconst DOM_EVENT: Record<string, string> = {\n // Pointer / mouse — bubble.\n Click: \"click\",\n Dblclick: \"dblclick\",\n PointerDown: \"pointerdown\",\n PointerUp: \"pointerup\",\n PointerMove: \"pointermove\",\n // Form — bubble.\n Input: \"input\",\n Change: \"change\",\n // Keyboard — bubble.\n KeyDown: \"keydown\",\n KeyUp: \"keyup\",\n // Focus / blur — don't bubble (capture-phase delegation).\n Focus: \"focus\",\n Blur: \"blur\",\n // Hover — don't bubble; per-target only (no ancestor walk).\n MouseEnter: \"mouseenter\",\n MouseLeave: \"mouseleave\",\n PointerEnter: \"pointerenter\",\n PointerLeave: \"pointerleave\",\n // Scroll / load / error — don't bubble.\n Scroll: \"scroll\",\n Load: \"load\",\n Error: \"error\",\n // Disclosure — don't bubble.\n Toggle: \"toggle\",\n // Media — don't bubble (capture-phase delegation).\n VolumeChange: \"volumechange\",\n Play: \"play\",\n Pause: \"pause\",\n Ended: \"ended\",\n TimeUpdate: \"timeupdate\",\n LoadedMetadata: \"loadedmetadata\",\n LoadedData: \"loadeddata\",\n CanPlay: \"canplay\",\n CanPlayThrough: \"canplaythrough\",\n DurationChange: \"durationchange\",\n RateChange: \"ratechange\",\n Seeking: \"seeking\",\n Seeked: \"seeked\",\n Stalled: \"stalled\",\n Waiting: \"waiting\",\n};\n\nconst $EV = Symbol.for(\"creo.ev\");\n\nconst containerState = new WeakMap<\n HTMLElement,\n {\n counts: Map<string, number>;\n handler: (e: Event) => void;\n }\n>();\n\nfunction getState(container: HTMLElement) {\n let state = containerState.get(container);\n if (!state) {\n state = {\n counts: new Map(),\n handler(e: Event) {\n const domEvent = e.type;\n const noWalk = NO_WALK_EVENTS.has(domEvent);\n let dom = e.target as\n | (HTMLElement & { [$EV]?: Record<string, Function> })\n | null;\n while (dom && dom !== container) {\n const evObj = dom[$EV];\n if (evObj) {\n const handler = evObj[domEvent];\n if (handler) {\n handler(mapEventData(domEvent, e));\n if (e.cancelBubble) return;\n }\n }\n // For mouseenter/leave-style events the browser already dispatches\n // one event per ancestor newly entered — walking up here would\n // double-fire ancestor handlers.\n if (noWalk) return;\n dom = dom.parentElement as typeof dom;\n }\n },\n };\n containerState.set(container, state);\n }\n return state;\n}\n\n// Events that don't bubble — register in the capture phase so delegation\n// at the container still receives them.\nconst CAPTURE_EVENTS = new Set([\n \"focus\",\n \"blur\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n \"scroll\",\n \"load\",\n \"error\",\n \"toggle\",\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\n// Events whose semantics are \"this element specifically\" — the browser\n// dispatches one event per ancestor newly entered, so walking up the tree\n// from target to container would double-fire ancestor handlers. For these,\n// only consult the actual target element.\nconst NO_WALK_EVENTS = new Set([\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\n// Events fired at high frequency where we want passive listeners by default.\nconst PASSIVE_EVENTS = new Set([\"scroll\"]);\n\nfunction listenerOptions(domEvent: string): boolean | AddEventListenerOptions {\n const capture = CAPTURE_EVENTS.has(domEvent);\n if (PASSIVE_EVENTS.has(domEvent)) {\n return { capture, passive: true };\n }\n return capture;\n}\n\nfunction ensureDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count === 0) {\n container.addEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n }\n state.counts.set(domEvent, count + 1);\n}\n\nfunction removeDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count <= 1) {\n state.counts.delete(domEvent);\n container.removeEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n } else {\n state.counts.set(domEvent, count - 1);\n }\n}\n\nconst POINTER_EVENTS = new Set([\n \"click\",\n \"dblclick\",\n \"pointerdown\",\n \"pointerup\",\n \"pointermove\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\nconst MEDIA_EVENTS = new Set([\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\nfunction mapEventData(domEvent: string, e: Event): Record<string, unknown> {\n let data: Record<string, unknown>;\n if (POINTER_EVENTS.has(domEvent)) {\n const pe = e as PointerEvent;\n data = { x: pe.clientX, y: pe.clientY };\n } else if (domEvent === \"input\" || domEvent === \"change\") {\n const target = e.target as HTMLInputElement;\n data = { value: target.value, checked: !!target.checked };\n } else if (MEDIA_EVENTS.has(domEvent)) {\n const target = e.target as HTMLMediaElement;\n data = {\n muted: !!target.muted,\n paused: !!target.paused,\n volume: target.volume,\n currentTime: target.currentTime,\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n };\n } else if (domEvent === \"scroll\") {\n const target = e.target as Element;\n data = {\n scrollTop: (target as HTMLElement).scrollTop ?? 0,\n scrollLeft: (target as HTMLElement).scrollLeft ?? 0,\n };\n } else if (domEvent === \"error\") {\n const ev = e as ErrorEvent;\n data = { message: ev.message ?? \"\" };\n } else if (domEvent === \"toggle\") {\n const target = e.target as HTMLDetailsElement;\n data = { open: !!target.open };\n } else if (domEvent === \"keydown\" || domEvent === \"keyup\") {\n const ke = e as KeyboardEvent;\n data = { key: ke.key, code: ke.code };\n } else {\n data = {};\n }\n data.stopPropagation = () => e.stopPropagation();\n data.preventDefault = () => e.preventDefault();\n return data;\n}\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst DOM_PROPERTIES = new Set([\n \"value\",\n \"checked\",\n \"selected\",\n \"indeterminate\",\n \"muted\",\n]);\n\n// ---------------------------------------------------------------------------\n// HTML Renderer\n// ---------------------------------------------------------------------------\n\nexport class HtmlRender implements IRender<HTMLElement | Text> {\n engine!: Engine;\n\n constructor(private container: HTMLElement) {}\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.renderRef) {\n // --- Mount ---\n if (view.flags & F_PRIMITIVE) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n const tag = view.viewFn[$primitive]!;\n\n if (tag === \"text\") {\n const textNode = document.createTextNode(String(view.props));\n view.renderRef = { element: textNode, prevProps: null };\n parentNode.insertBefore(textNode, refNode);\n } else {\n const parentIsSvg = (parentNode as Element).namespaceURI === SVG_NS;\n const useSvg = tag === \"svg\" || parentIsSvg;\n const element = useSvg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n const props = view.props as Record<string, unknown>;\n const domRef: PrimitiveDomRef = { element, prevProps: null };\n view.renderRef = domRef;\n this.setAttributes(element, props);\n domRef.prevProps = props;\n\n // If single text child, use textContent directly\n if (view.children?.length === 1) {\n const child = view.children[0]!;\n if (\n child.flags & F_PRIMITIVE &&\n child.viewFn[$primitive] === \"text\"\n ) {\n element.textContent = String(child.props);\n child.renderRef = { element, prevProps: null };\n child.flags |= F_TEXT_CONTENT;\n }\n }\n\n parentNode.insertBefore(element, refNode);\n\n // The HTML `autofocus` attribute only fires during initial document\n // parse — for dynamically inserted elements browsers ignore it.\n // Match React's behaviour by calling .focus() once after mount.\n if (\n props != null &&\n (props as Record<string, unknown>).autofocus === true &&\n typeof (element as HTMLElement).focus === \"function\"\n ) {\n (element as HTMLElement).focus();\n }\n }\n } else {\n // Composite: no DOM — just mark as mounted\n view.renderRef = true;\n }\n return;\n }\n\n // --- Update ---\n\n if (view.flags & F_MOVED) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n if (view.flags & F_PRIMITIVE) {\n const ref = view.renderRef as PrimitiveDomRef;\n parentNode.insertBefore(ref.element, refNode);\n } else {\n this.moveDomNodes(view, parentNode, refNode);\n }\n }\n\n if (!(view.flags & F_PRIMITIVE)) return;\n\n const ref = view.renderRef as PrimitiveDomRef;\n\n // Text node in textContent mode — update parent's textContent\n if (view.flags & F_TEXT_CONTENT) {\n const parentEl = ref.element as Element;\n const nextText = String(view.props);\n if (parentEl.textContent !== nextText) {\n parentEl.textContent = nextText;\n }\n return;\n }\n\n if (ref.element instanceof Text) {\n const nextText = String(view.props);\n if (ref.element.textContent !== nextText) {\n ref.element.textContent = nextText;\n }\n return;\n }\n\n const nextProps = view.props as Record<string, unknown>;\n const el = ref.element as Element;\n if (!ref.prevProps) {\n this.setAttributes(el, nextProps);\n } else if (ref.prevProps !== nextProps) {\n this.diffAttributes(el, ref.prevProps, nextProps);\n }\n ref.prevProps = nextProps;\n }\n\n unmount(view: ViewRecord): void {\n if (view.flags & F_PRIMITIVE) {\n this.removeDomNodes(view);\n }\n view.renderRef = undefined;\n }\n\n /**\n * Re-render only when a stateful DOM property in `nextProps` actually\n * differs from the live DOM. With this in place a 50-input form whose\n * parent re-renders touches the DOM only for the input the user is\n * actually editing.\n */\n shouldReassert(view: ViewRecord, nextProps: unknown): boolean {\n if (nextProps == null || typeof nextProps !== \"object\") return false;\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || ref.element instanceof Text) return false;\n const el = ref.element as Wildcard;\n const props = nextProps as Record<string, unknown>;\n for (const key of DOM_PROPERTIES) {\n if (!(key in props)) continue;\n const live = el[key];\n const next = props[key];\n // Browser coerces these properties — compare under matching coercion.\n if (typeof next === \"boolean\" || typeof live === \"boolean\") {\n if (Boolean(live) !== Boolean(next)) return true;\n } else if (String(live) !== String(next)) {\n return true;\n }\n }\n return false;\n }\n\n // -- Internal: DOM tree navigation ------------------------------------------\n\n private findParentDom(view: ViewRecord): Node {\n let parent = view.parent;\n while (parent) {\n if (parent.flags & F_PRIMITIVE) {\n const ref = parent.renderRef as Maybe<PrimitiveDomRef>;\n if (ref && !(ref.element instanceof Text)) return ref.element;\n }\n parent = parent.parent;\n }\n return this.container;\n }\n\n private findInsertionPoint(view: ViewRecord): Node | null {\n const parent = view.parent;\n if (!parent?.children) return null;\n\n const children = parent.children;\n\n // Fast path: last child\n if (children[children.length - 1] === view) {\n return this.#parentEndAnchor(parent);\n }\n\n // view.pos is maintained by the reconciler — avoid the O(n) indexOf scan.\n // Fall back to indexOf if pos is unset (-1) or stale (defensive).\n let idx = view.pos;\n if (idx < 0 || children[idx] !== view) idx = children.indexOf(view);\n for (let i = idx + 1; i < children.length; i++) {\n const dom = this.getFirstDomNode(children[i]!);\n if (dom) return dom;\n }\n\n return this.#parentEndAnchor(parent);\n }\n\n #parentEndAnchor(parent: ViewRecord): Node | null {\n if (parent.flags & F_PRIMITIVE) return null; // append to element\n // Composite: walk up\n return this.findInsertionPoint(parent);\n }\n\n // -- Internal: attributes + delegated events --------------------------------\n\n private setAttributes(element: Element, props: Record<string, unknown>) {\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n if (isEventProp(key)) {\n this.bindEvent(element, key, value as Function);\n continue;\n }\n this.setAttribute(element, key, value);\n }\n }\n\n private diffAttributes(\n element: Element,\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n ) {\n for (const key in prev) {\n if (key === \"key\") continue;\n if (!(key in next) || next[key] == null) {\n if (isEventProp(key)) {\n this.unbindEvent(element, key);\n } else {\n this.removeAttribute(element, key);\n }\n }\n }\n\n for (const key in next) {\n const value = next[key];\n if (key === \"key\" || value == null) continue;\n // Re-assert DOM properties even if prevProps matches: the live DOM\n // value can drift from prevProps via user input (typing in an input,\n // toggling a checkbox) without our state ever changing.\n if (prev[key] === value && !DOM_PROPERTIES.has(key)) continue;\n if (isEventProp(key)) {\n const creoName = key.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj && domEvent in evObj) {\n evObj[domEvent] = value as Function;\n } else {\n this.bindEvent(element, key, value as Function);\n }\n } else {\n this.setAttribute(element, key, value);\n }\n }\n }\n\n private bindEvent(element: Element, prop: string, handler: Function): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj: Record<string, Function> =\n (element as any)[$EV] ?? ((element as any)[$EV] = {});\n evObj[domEvent] = handler;\n ensureDelegated(this.container, domEvent);\n }\n\n private unbindEvent(element: Element, prop: string): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as Record<string, Function> | undefined;\n if (evObj) {\n delete evObj[domEvent];\n }\n removeDelegated(this.container, domEvent);\n }\n\n private setAttribute(element: Element, key: string, value: unknown) {\n if (key === \"class\") {\n // className is a settable string on HTMLElement but readonly (SVGAnimatedString)\n // on SVG — use setAttribute which works for both.\n element.setAttribute(\"class\", String(value));\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = String(value);\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = value;\n } else if (typeof value === \"boolean\") {\n if (value) element.setAttribute(key, \"\");\n else element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n\n private removeAttribute(element: Element, key: string) {\n if (key === \"class\") {\n element.removeAttribute(\"class\");\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = \"\";\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = key === \"value\" ? \"\" : false;\n } else {\n element.removeAttribute(key);\n }\n }\n\n // -- Internal: DOM navigation -----------------------------------------------\n\n private getFirstDomNode(view: ViewRecord): Node | null {\n if (!view.renderRef) return null;\n if (view.flags & F_PRIMITIVE)\n return (view.renderRef as PrimitiveDomRef).element;\n if (view.children) {\n for (const child of view.children) {\n const dom = this.getFirstDomNode(child);\n if (dom) return dom;\n }\n }\n return null;\n }\n\n private moveDomNodes(\n view: ViewRecord,\n parentNode: Node,\n insertBefore: Node | null,\n ): void {\n if (!view.renderRef) return;\n if (view.flags & F_PRIMITIVE) {\n parentNode.insertBefore(\n (view.renderRef as PrimitiveDomRef).element,\n insertBefore,\n );\n } else if (view.children) {\n for (const child of view.children) {\n this.moveDomNodes(child, parentNode, insertBefore);\n }\n }\n }\n\n private removeDomNodes(view: ViewRecord) {\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || !(view.flags & F_PRIMITIVE)) return;\n // F_TEXT_CONTENT: ref.element is the PARENT's element (optimization),\n // not this text view's own node. Clear the parent's textContent so\n // incoming siblings mount into an empty host, but never remove the\n // parent — the parent owns its own lifecycle.\n if (view.flags & F_TEXT_CONTENT) {\n (ref.element as Element).textContent = \"\";\n return;\n }\n const evObj = (ref.element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj) {\n for (const domEvent in evObj) {\n removeDelegated(this.container, domEvent);\n }\n delete (ref.element as any)[$EV];\n }\n ref.element.parentNode?.removeChild(ref.element);\n }\n}\n",
|
|
16
|
+
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE, F_MOVED, F_TEXT_CONTENT } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport { applyRef, type Ref } from \"@/public/view\";\nimport type { Wildcard } from \"@/internal/wildcard\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// Render refs — stored on view.renderRef\n// ---------------------------------------------------------------------------\n\n/**\n * For primitives: { element, prevProps }\n * For composites: renderRef is set to `true` (just a non-null marker)\n *\n * Discriminated via view.flags & F_PRIMITIVE — no `kind` field needed.\n */\ntype PrimitiveDomRef = {\n element: Element | Text;\n prevProps: Maybe<Record<string, unknown>>;\n};\n\n// ---------------------------------------------------------------------------\n// Event delegation — Inferno-style: one listener per event type on container\n// ---------------------------------------------------------------------------\n\nconst $EV = Symbol.for(\"creo.ev\");\n\nconst containerState = new WeakMap<\n HTMLElement,\n {\n counts: Map<string, number>;\n handler: (e: Event) => void;\n }\n>();\n\nfunction getState(container: HTMLElement) {\n let state = containerState.get(container);\n if (!state) {\n state = {\n counts: new Map(),\n handler(e: Event) {\n const domEvent = e.type;\n const noWalk = NO_WALK_EVENTS.has(domEvent);\n let dom = e.target as\n | (HTMLElement & { [$EV]?: Record<string, Function> })\n | null;\n while (dom && dom !== container) {\n const evObj = dom[$EV];\n if (evObj) {\n const handler = evObj[domEvent];\n if (handler) {\n handler(mapEventData(domEvent, e, dom));\n if (e.cancelBubble) return;\n }\n }\n // For pointerenter/leave events the browser already dispatches\n // one event per ancestor newly entered — walking up here would\n // double-fire ancestor handlers.\n if (noWalk) return;\n dom = dom.parentElement as typeof dom;\n }\n },\n };\n containerState.set(container, state);\n }\n return state;\n}\n\n// Events that don't bubble — register in the capture phase so delegation\n// at the container still receives them.\nconst CAPTURE_EVENTS = new Set([\n \"focus\",\n \"blur\",\n \"pointerenter\",\n \"pointerleave\",\n \"scroll\",\n \"load\",\n \"error\",\n \"toggle\",\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\n// Events whose semantics are \"this element specifically\" — the browser\n// dispatches one event per ancestor newly entered, so walking up the tree\n// from target to container would double-fire ancestor handlers. For these,\n// only consult the actual target element.\nconst NO_WALK_EVENTS = new Set([\n \"pointerenter\",\n \"pointerleave\",\n]);\n\n// Events fired at high frequency where we want passive listeners by default.\nconst PASSIVE_EVENTS = new Set([\"scroll\"]);\n\nfunction listenerOptions(domEvent: string): boolean | AddEventListenerOptions {\n const capture = CAPTURE_EVENTS.has(domEvent);\n if (PASSIVE_EVENTS.has(domEvent)) {\n return { capture, passive: true };\n }\n return capture;\n}\n\nfunction ensureDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count === 0) {\n container.addEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n }\n state.counts.set(domEvent, count + 1);\n}\n\nfunction removeDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count <= 1) {\n state.counts.delete(domEvent);\n container.removeEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n } else {\n state.counts.set(domEvent, count - 1);\n }\n}\n\nconst POINTER_EVENTS = new Set([\n \"click\",\n \"dblclick\",\n \"pointerdown\",\n \"pointerup\",\n \"pointermove\",\n \"pointercancel\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\nconst MEDIA_EVENTS = new Set([\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\nfunction mapEventData(\n domEvent: string,\n e: Event,\n currentTarget: HTMLElement,\n): Record<string, unknown> {\n let data: Record<string, unknown>;\n if (POINTER_EVENTS.has(domEvent)) {\n const pe = e as PointerEvent;\n // pointerId/pointerType can be missing on synthetic events; -1 / \"\" are\n // sentinel values that won't collide with real pointer ids.\n const pointerId = typeof pe.pointerId === \"number\" ? pe.pointerId : -1;\n data = {\n x: pe.clientX,\n y: pe.clientY,\n pointerId,\n pointerType: typeof pe.pointerType === \"string\" ? pe.pointerType : \"\",\n button: typeof pe.button === \"number\" ? pe.button : 0,\n buttons: typeof pe.buttons === \"number\" ? pe.buttons : 0,\n target: e.target as HTMLElement,\n currentTarget,\n capture: () => {\n if (pointerId >= 0 && currentTarget.setPointerCapture) {\n currentTarget.setPointerCapture(pointerId);\n }\n },\n release: () => {\n if (pointerId >= 0 && currentTarget.releasePointerCapture) {\n currentTarget.releasePointerCapture(pointerId);\n }\n },\n nativeEvent: e,\n };\n } else if (domEvent === \"input\" || domEvent === \"change\") {\n const target = e.target as HTMLInputElement;\n data = { value: target.value, checked: !!target.checked };\n } else if (MEDIA_EVENTS.has(domEvent)) {\n const target = e.target as HTMLMediaElement;\n data = {\n muted: !!target.muted,\n paused: !!target.paused,\n volume: target.volume,\n currentTime: target.currentTime,\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n };\n } else if (domEvent === \"scroll\") {\n const target = e.target as Element;\n data = {\n scrollTop: (target as HTMLElement).scrollTop ?? 0,\n scrollLeft: (target as HTMLElement).scrollLeft ?? 0,\n };\n } else if (domEvent === \"error\") {\n const ev = e as ErrorEvent;\n data = { message: ev.message ?? \"\" };\n } else if (domEvent === \"toggle\") {\n const target = e.target as HTMLDetailsElement;\n data = { open: !!target.open };\n } else if (domEvent === \"keydown\" || domEvent === \"keyup\") {\n const ke = e as KeyboardEvent;\n data = { key: ke.key, code: ke.code };\n } else {\n data = {};\n }\n data.stopPropagation = () => e.stopPropagation();\n data.preventDefault = () => e.preventDefault();\n return data;\n}\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst DOM_PROPERTIES = new Set([\n \"value\",\n \"checked\",\n \"selected\",\n \"indeterminate\",\n \"muted\",\n]);\n\n// ---------------------------------------------------------------------------\n// HTML Renderer\n// ---------------------------------------------------------------------------\n\nexport class HtmlRender implements IRender<HTMLElement | Text> {\n engine!: Engine;\n\n constructor(private container: HTMLElement) {}\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.renderRef) {\n // --- Mount ---\n if (view.flags & F_PRIMITIVE) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n const tag = view.viewFn[$primitive]!;\n\n if (tag === \"text\") {\n const textNode = document.createTextNode(String(view.props));\n view.renderRef = { element: textNode, prevProps: null };\n parentNode.insertBefore(textNode, refNode);\n } else {\n const parentIsSvg = (parentNode as Element).namespaceURI === SVG_NS;\n const useSvg = tag === \"svg\" || parentIsSvg;\n const element = useSvg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n const props = view.props as Record<string, unknown>;\n const domRef: PrimitiveDomRef = { element, prevProps: null };\n view.renderRef = domRef;\n this.setAttributes(element, props);\n domRef.prevProps = props;\n\n // If single text child, use textContent directly\n if (view.children?.length === 1) {\n const child = view.children[0]!;\n if (\n child.flags & F_PRIMITIVE &&\n child.viewFn[$primitive] === \"text\"\n ) {\n element.textContent = String(child.props);\n child.renderRef = { element, prevProps: null };\n child.flags |= F_TEXT_CONTENT;\n }\n }\n\n parentNode.insertBefore(element, refNode);\n\n // The HTML `autofocus` attribute only fires during initial document\n // parse — for dynamically inserted elements browsers ignore it.\n // Match React's behaviour by calling .focus() once after mount.\n if (\n props != null &&\n (props as Record<string, unknown>).autofocus === true &&\n typeof (element as HTMLElement).focus === \"function\"\n ) {\n (element as HTMLElement).focus();\n }\n\n // Fire user ref after the element is in the DOM so ref(el) can\n // call focus(), measure layout, attach observers, etc.\n if (props != null) {\n applyRef((props as { ref?: Ref<Element> }).ref, element);\n }\n }\n } else {\n // Composite: no DOM — just mark as mounted\n view.renderRef = true;\n }\n return;\n }\n\n // --- Update ---\n\n if (view.flags & F_MOVED) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n if (view.flags & F_PRIMITIVE) {\n const ref = view.renderRef as PrimitiveDomRef;\n parentNode.insertBefore(ref.element, refNode);\n } else {\n this.moveDomNodes(view, parentNode, refNode);\n }\n }\n\n if (!(view.flags & F_PRIMITIVE)) return;\n\n const ref = view.renderRef as PrimitiveDomRef;\n\n // Text node in textContent mode — update parent's textContent\n if (view.flags & F_TEXT_CONTENT) {\n const parentEl = ref.element as Element;\n const nextText = String(view.props);\n if (parentEl.textContent !== nextText) {\n parentEl.textContent = nextText;\n }\n return;\n }\n\n if (ref.element instanceof Text) {\n const nextText = String(view.props);\n if (ref.element.textContent !== nextText) {\n ref.element.textContent = nextText;\n }\n return;\n }\n\n const nextProps = view.props as Record<string, unknown>;\n const el = ref.element as Element;\n if (!ref.prevProps) {\n this.setAttributes(el, nextProps);\n } else if (ref.prevProps !== nextProps) {\n this.diffAttributes(el, ref.prevProps, nextProps);\n }\n ref.prevProps = nextProps;\n }\n\n unmount(view: ViewRecord): void {\n if (view.flags & F_PRIMITIVE) {\n this.removeDomNodes(view);\n }\n view.renderRef = undefined;\n }\n\n /**\n * Re-render only when a stateful DOM property in `nextProps` actually\n * differs from the live DOM. With this in place a 50-input form whose\n * parent re-renders touches the DOM only for the input the user is\n * actually editing.\n */\n shouldReassert(view: ViewRecord, nextProps: unknown): boolean {\n if (nextProps == null || typeof nextProps !== \"object\") return false;\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || ref.element instanceof Text) return false;\n const el = ref.element as Wildcard;\n const props = nextProps as Record<string, unknown>;\n for (const key of DOM_PROPERTIES) {\n if (!(key in props)) continue;\n const live = el[key];\n const next = props[key];\n // Browser coerces these properties — compare under matching coercion.\n if (typeof next === \"boolean\" || typeof live === \"boolean\") {\n if (Boolean(live) !== Boolean(next)) return true;\n } else if (String(live) !== String(next)) {\n return true;\n }\n }\n return false;\n }\n\n // -- Internal: DOM tree navigation ------------------------------------------\n\n private findParentDom(view: ViewRecord): Node {\n let parent = view.parent;\n while (parent) {\n if (parent.flags & F_PRIMITIVE) {\n const ref = parent.renderRef as Maybe<PrimitiveDomRef>;\n if (ref && !(ref.element instanceof Text)) return ref.element;\n }\n parent = parent.parent;\n }\n return this.container;\n }\n\n private findInsertionPoint(view: ViewRecord): Node | null {\n const parent = view.parent;\n if (!parent?.children) return null;\n\n const children = parent.children;\n\n // Fast path: last child\n if (children[children.length - 1] === view) {\n return this.#parentEndAnchor(parent);\n }\n\n // view.pos is maintained by the reconciler — avoid the O(n) indexOf scan.\n // Fall back to indexOf if pos is unset (-1) or stale (defensive).\n let idx = view.pos;\n if (idx < 0 || children[idx] !== view) idx = children.indexOf(view);\n for (let i = idx + 1; i < children.length; i++) {\n const dom = this.getFirstDomNode(children[i]!);\n if (dom) return dom;\n }\n\n return this.#parentEndAnchor(parent);\n }\n\n #parentEndAnchor(parent: ViewRecord): Node | null {\n if (parent.flags & F_PRIMITIVE) return null; // append to element\n // Composite: walk up\n return this.findInsertionPoint(parent);\n }\n\n // -- Internal: attributes + delegated events --------------------------------\n\n private setAttributes(element: Element, props: Record<string, unknown>) {\n if (props == null) return;\n for (const key in props) {\n const value = props[key];\n // `ref` is fired after insertion in render(); never written to DOM.\n // `on` is the event-handler sub-object, handled separately below.\n if (key === \"key\" || key === \"ref\" || key === \"on\" || value == null)\n continue;\n this.setAttribute(element, key, value);\n }\n const on = props.on as Maybe<Record<string, Function>>;\n if (on) {\n for (const ev in on) {\n const handler = on[ev];\n if (handler) this.bindEvent(element, ev, handler);\n }\n }\n }\n\n private diffAttributes(\n element: Element,\n prev: Maybe<Record<string, unknown>>,\n next: Maybe<Record<string, unknown>>,\n ) {\n if (prev) {\n for (const key in prev) {\n if (key === \"key\" || key === \"ref\" || key === \"on\") continue;\n if (next == null || !(key in next) || next[key] == null) {\n this.removeAttribute(element, key);\n }\n }\n }\n\n if (next) {\n for (const key in next) {\n const value = next[key];\n if (key === \"key\" || key === \"ref\" || key === \"on\" || value == null)\n continue;\n // Re-assert DOM properties even if prevProps matches: the live DOM\n // value can drift from prevProps via user input (typing in an input,\n // toggling a checkbox) without our state ever changing.\n if (prev && prev[key] === value && !DOM_PROPERTIES.has(key)) continue;\n this.setAttribute(element, key, value);\n }\n }\n\n // Event handlers under `on`. Common case: the user keeps the `on` object\n // referentially stable across renders — `prevOn === nextOn` short-circuits\n // without touching individual handlers.\n const prevOn = prev?.on as Maybe<Record<string, Function>>;\n const nextOn = next?.on as Maybe<Record<string, Function>>;\n if (prevOn !== nextOn) {\n this.diffEvents(element, prevOn, nextOn);\n }\n\n // ref reassignment: detach the old, attach the new. Same pattern as React.\n const prevRef = prev?.ref as Maybe<Ref<Element>>;\n const nextRef = next?.ref as Maybe<Ref<Element>>;\n if (prevRef !== nextRef) {\n applyRef(prevRef, null);\n applyRef(nextRef, element);\n }\n }\n\n private diffEvents(\n element: Element,\n prev: Maybe<Record<string, Function>>,\n next: Maybe<Record<string, Function>>,\n ) {\n if (prev) {\n for (const ev in prev) {\n if (!next || next[ev] == null) {\n this.unbindEvent(element, ev);\n }\n }\n }\n if (next) {\n for (const ev in next) {\n const value = next[ev];\n if (value == null) continue;\n if (prev && prev[ev] === value) continue;\n const domEvent = ev.toLowerCase();\n const evObj = (element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj && domEvent in evObj) {\n evObj[domEvent] = value;\n } else {\n this.bindEvent(element, ev, value);\n }\n }\n }\n }\n\n private bindEvent(\n element: Element,\n eventName: string,\n handler: Function,\n ): void {\n const domEvent = eventName.toLowerCase();\n const evObj: Record<string, Function> =\n (element as any)[$EV] ?? ((element as any)[$EV] = {});\n evObj[domEvent] = handler;\n ensureDelegated(this.container, domEvent);\n }\n\n private unbindEvent(element: Element, eventName: string): void {\n const domEvent = eventName.toLowerCase();\n const evObj = (element as any)[$EV] as Record<string, Function> | undefined;\n if (evObj) {\n delete evObj[domEvent];\n }\n removeDelegated(this.container, domEvent);\n }\n\n private setAttribute(element: Element, key: string, value: unknown) {\n if (key === \"class\") {\n // className is a settable string on HTMLElement but readonly (SVGAnimatedString)\n // on SVG — use setAttribute which works for both.\n element.setAttribute(\"class\", String(value));\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = String(value);\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = value;\n } else if (typeof value === \"boolean\") {\n if (value) element.setAttribute(key, \"\");\n else element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n\n private removeAttribute(element: Element, key: string) {\n if (key === \"class\") {\n element.removeAttribute(\"class\");\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = \"\";\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = key === \"value\" ? \"\" : false;\n } else {\n element.removeAttribute(key);\n }\n }\n\n // -- Internal: DOM navigation -----------------------------------------------\n\n private getFirstDomNode(view: ViewRecord): Node | null {\n if (!view.renderRef) return null;\n if (view.flags & F_PRIMITIVE)\n return (view.renderRef as PrimitiveDomRef).element;\n if (view.children) {\n for (const child of view.children) {\n const dom = this.getFirstDomNode(child);\n if (dom) return dom;\n }\n }\n return null;\n }\n\n private moveDomNodes(\n view: ViewRecord,\n parentNode: Node,\n insertBefore: Node | null,\n ): void {\n if (!view.renderRef) return;\n if (view.flags & F_PRIMITIVE) {\n parentNode.insertBefore(\n (view.renderRef as PrimitiveDomRef).element,\n insertBefore,\n );\n } else if (view.children) {\n for (const child of view.children) {\n this.moveDomNodes(child, parentNode, insertBefore);\n }\n }\n }\n\n private removeDomNodes(view: ViewRecord) {\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || !(view.flags & F_PRIMITIVE)) return;\n // F_TEXT_CONTENT: ref.element is the PARENT's element (optimization),\n // not this text view's own node. Clear the parent's textContent so\n // incoming siblings mount into an empty host, but never remove the\n // parent — the parent owns its own lifecycle.\n if (view.flags & F_TEXT_CONTENT) {\n (ref.element as Element).textContent = \"\";\n return;\n }\n const evObj = (ref.element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj) {\n for (const domEvent in evObj) {\n removeDelegated(this.container, domEvent);\n }\n delete (ref.element as any)[$EV];\n }\n // Detach user ref before the element leaves the DOM so the callback\n // still has a chance to read layout / disconnect observers if needed.\n const prevProps = ref.prevProps as Maybe<{ ref?: Ref<Element> }>;\n if (prevProps) applyRef(prevProps.ref, null);\n ref.element.parentNode?.removeChild(ref.element);\n }\n}\n",
|
|
17
17
|
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// JSON node — the output type\n// ---------------------------------------------------------------------------\n\nexport type JsonNode = {\n type: string;\n props: Record<string, unknown>;\n children: JsonNode[];\n key?: string | number;\n};\n\n// ---------------------------------------------------------------------------\n// JSON Renderer\n// ---------------------------------------------------------------------------\n\nexport class JsonRender implements IRender<JsonNode> {\n /** The root JSON node after mount. */\n root: Maybe<JsonNode>;\n\n engine!: Engine;\n constructor() {\n this.root = null;\n }\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n const existing = view.renderRef as Maybe<JsonNode>;\n\n if (!existing) {\n // Mount\n const node = this.buildNode(view);\n if (!view.parent) {\n this.root = node;\n return;\n }\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n // view.pos is maintained by the reconciler — no indexOf scan.\n const idx = view.pos;\n if (idx >= 0 && idx < parentNode.children.length) {\n parentNode.children.splice(idx, 0, node);\n } else {\n parentNode.children.push(node);\n }\n }\n return;\n }\n\n // Update: reposition + patch props\n if (view.parent) {\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n const targetIdx = view.pos;\n // Skip the indexOf scan entirely when the node is already in\n // place (the steady-state for non-moved updates).\n if (targetIdx >= 0 && parentNode.children[targetIdx] !== existing) {\n const oldIdx = parentNode.children.indexOf(existing);\n if (oldIdx !== -1) {\n parentNode.children.splice(oldIdx, 1);\n parentNode.children.splice(\n Math.min(targetIdx, parentNode.children.length),\n 0,\n existing,\n );\n }\n }\n }\n }\n const tag = view.viewFn[$primitive];\n existing.props = tag === \"text\"\n ? { content: view.props }\n : { ...view.props };\n }\n\n unmount(view: ViewRecord): void {\n const childNode = view.renderRef as Maybe<JsonNode>;\n if (!childNode || !view.parent) return;\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n const idx = parentNode.children.indexOf(childNode);\n if (idx !== -1) parentNode.children.splice(idx, 1);\n }\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildNode(view: ViewRecord): JsonNode {\n const tag = view.viewFn[$primitive];\n\n const props = tag === \"text\"\n ? { content: view.props }\n : { ...view.props };\n\n const node: JsonNode = {\n type: tag ?? \"composite\",\n props,\n children: [],\n };\n if (view.userKey != null) node.key = view.userKey;\n view.renderRef = node;\n return node;\n }\n}\n",
|
|
18
|
-
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// Self-closing HTML tags (no closing tag)\nconst VOID_TAGS = new Set([\n \"br\", \"hr\", \"img\", \"input\", \"source\", \"track\", \"embed\",\n \"area\", \"col\", \"wbr\",\n]);\n\n// Attributes that are set as DOM properties, not HTML attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"]);\n\
|
|
18
|
+
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// Self-closing HTML tags (no closing tag)\nconst VOID_TAGS = new Set([\n \"br\", \"hr\", \"img\", \"input\", \"source\", \"track\", \"embed\",\n \"area\", \"col\", \"wbr\",\n]);\n\n// Attributes that are set as DOM properties, not HTML attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"]);\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/**\n * HtmlStringRender — pull-based string renderer.\n * render/unmount are no-ops. Call renderToString() to\n * get the current HTML string from the VDOM.\n *\n * Output matches HtmlRender's DOM serialization (innerHTML).\n */\nexport class HtmlStringRender implements IRender<string> {\n private root: Maybe<ViewRecord> = null;\n\n engine!: Engine;\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.parent) {\n this.root = view;\n }\n }\n\n unmount(_view: ViewRecord): void {}\n\n // -- Public -----------------------------------------------------------------\n\n renderToString(): string {\n if (!this.root) return \"\";\n return this.buildString(this.root);\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildString(rec: ViewRecord): string {\n const tag = rec.viewFn[$primitive];\n\n if (tag != null) {\n if (tag === \"text\") {\n return escapeHtml(String(rec.props));\n }\n const attrs = this.buildAttrs(rec.props as Record<string, unknown>);\n if (VOID_TAGS.has(tag)) {\n return `<${tag}${attrs}>`;\n }\n return `<${tag}${attrs}>${this.buildChildren(rec)}</${tag}>`;\n }\n\n // Composite — transparent, just render children\n return this.buildChildren(rec);\n }\n\n private buildAttrs(props: Record<string, unknown>): string {\n if (props == null) return \"\";\n let result = \"\";\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n // Skip the event-handler sub-object and refs — neither appears in HTML.\n if (key === \"on\" || key === \"ref\") continue;\n // Skip DOM-only properties (value, checked, etc.)\n if (DOM_PROPERTIES.has(key)) continue;\n\n if (key === \"style\") {\n // Normalize style to match DOM's cssText (trailing semicolon)\n let css = String(value);\n css = css.trim();\n if (css && !css.endsWith(\";\")) css += \";\";\n result += ` style=\"${escapeAttr(css)}\"`;\n continue;\n }\n if (typeof value === \"boolean\") {\n if (value) result += ` ${key}=\"\"`;\n // false booleans are omitted\n } else {\n const attrName = key === \"class\" ? \"class\" : key;\n result += ` ${attrName}=\"${escapeAttr(String(value))}\"`;\n }\n }\n return result;\n }\n\n private buildChildren(rec: ViewRecord): string {\n if (!rec.children) return \"\";\n let result = \"\";\n for (const child of rec.children) {\n result += this.buildString(child);\n }\n return result;\n }\n}\n",
|
|
19
19
|
"export type None = null | undefined;\nexport type Just<T> = T;\nexport type Maybe<T> = Just<T> | None;\n\nexport function just<T>(\n maybe: Maybe<T>,\n errorMessage?: string,\n): asserts maybe is Just<T> {\n if (maybe == null) {\n throw new TypeError(\n errorMessage ?? \"Expected Just, received None as Maybe\",\n );\n }\n}\n\nexport function isJust<T>(maybe: Maybe<T>): maybe is Just<T> {\n return maybe != null;\n}\n\nexport function isNone<T>(maybe: Maybe<T>): maybe is None {\n return maybe == null;\n}\n\nexport function withDefault<T, K>(v: Maybe<T>, alternative: K) {\n if (v != null) {\n return v;\n }\n return alternative;\n}\n\nexport const _ = undefined;\n",
|
|
20
20
|
"export function assertNever(x: never): never {\n throw new Error(`Unhandled case: ${x}`)\n}\n"
|
|
21
21
|
],
|
|
22
|
-
"mappings": "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",
|
|
23
|
-
"debugId": "
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "020C6F0F4AB24D1164756E2164756E21",
|
|
24
24
|
"names": []
|
|
25
25
|
}
|