creo 0.0.3-dev → 0.1.0
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/README.md +5 -1
- package/dist/functional/assert.d.ts +1 -0
- package/dist/functional/key.d.ts +2 -0
- package/dist/functional/maybe.d.ts +6 -0
- package/dist/functional/maybe_promise.d.ts +1 -0
- package/dist/functional/shallow_equal.d.ts +2 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +1373 -0
- package/dist/index.js.map +26 -0
- package/dist/internal/engine.d.ts +18 -0
- package/dist/internal/internal_view.d.ts +38 -0
- package/dist/internal/orchestrator.d.ts +16 -0
- package/dist/internal/wildcard.d.ts +1 -0
- package/dist/public/app.d.ts +19 -0
- package/dist/public/event_handle.d.ts +32 -0
- package/dist/public/primitive.d.ts +20 -0
- package/dist/public/primitives/primitives.d.ts +318 -0
- package/dist/public/state.d.ts +37 -0
- package/dist/public/store.d.ts +35 -0
- package/dist/public/view.d.ts +37 -0
- package/dist/render/canvas_render.d.ts +1 -0
- package/dist/render/html_render.d.ts +35 -0
- package/dist/render/json_render.d.ts +17 -0
- package/dist/render/render_interface.d.ts +7 -0
- package/dist/render/stream_render.d.ts +1 -0
- package/dist/render/string_render.d.ts +17 -0
- package/dist/structures/indexed_list.d.ts +46 -0
- package/dist/structures/list.d.ts +68 -0
- package/package.json +24 -7
- package/bun.lockb +0 -0
- package/index.html +0 -13
- package/src/main.ts +0 -13
- package/src/record/record.spec.ts +0 -146
- package/src/record/record.ts +0 -101
- package/src/style.css +0 -96
- package/src/tools/isRecordLike.spec.ts +0 -29
- package/src/tools/isRecordLike.ts +0 -3
- package/src/tools/optional.ts +0 -25
- package/src/ui/component.ts +0 -1
- package/src/ui/index.ts +0 -0
- package/src/ui/prop.ts +0 -13
- package/src/ui/state.ts +0 -0
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.json +0 -23
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/structures/list.ts", "../src/structures/indexed_list.ts", "../src/internal/engine.ts", "../src/public/state.ts", "../src/public/store.ts", "../src/functional/shallow_equal.ts", "../src/internal/internal_view.ts", "../src/internal/orchestrator.ts", "../src/public/app.ts", "../src/public/view.ts", "../src/public/primitive.ts", "../src/public/primitives/primitives.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
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Linked list implementation\n */\n\nimport type { Maybe } from \"@/functional/maybe\";\n\nconst $next: unique symbol = Symbol(\"next\");\nconst $prev: unique symbol = Symbol(\"prev\");\nconst $owner: unique symbol = Symbol(\"owner\");\n\nexport interface INode<T> {\n insertNext(value: T): INode<T>;\n insertPrev(value: T): INode<T>;\n v: T;\n delete(): void;\n getNext(): Maybe<INode<T>>;\n getPrev(): Maybe<INode<T>>;\n isFirst(): boolean;\n isLast(): boolean;\n}\n\nexport class ListNode<T> implements INode<T> {\n [$owner]: Maybe<IBaseContainer<T>>;\n [$next]: Maybe<ListNode<T>>;\n [$prev]: Maybe<ListNode<T>>;\n public v: T;\n\n constructor(\n node: T,\n prev: Maybe<ListNode<T>> = null,\n next: Maybe<ListNode<T>> = null,\n list: IBaseContainer<T>,\n ) {\n this[$prev] = prev;\n this[$next] = next;\n this[$owner] = list;\n this.v = node;\n }\n\n isFirst(): boolean {\n return this[$prev] == null;\n }\n\n isLast(): boolean {\n return this[$next] == null;\n }\n\n delete() {\n this[$owner]?.delete(this);\n }\n\n clearFields() {\n this[$next] = null;\n this[$prev] = null;\n this[$owner] = null;\n }\n\n insertNext(value: T) {\n const owner = this[$owner];\n if (!owner) {\n throw new Error(\"The item is detached from DataContainer\");\n }\n return owner.insertNext(this, value);\n }\n\n insertPrev(value: T) {\n const owner = this[$owner];\n if (!owner) {\n throw new Error(\"The item is detached from DataContainer\");\n }\n return owner.insertPrev(this, value);\n }\n\n getNext(): Maybe<ListNode<T>> {\n return this[$next];\n }\n\n getPrev(): Maybe<ListNode<T>> {\n return this[$prev];\n }\n\n getList() {\n return this[$owner];\n }\n}\n\ninterface IBaseContainer<T> {\n delete(node: INode<T>): void;\n insertNext(ref: INode<T>, value: T): INode<T>;\n insertPrev(ref: INode<T>, value: T): INode<T>;\n}\n\nexport interface IList<T> extends Iterable<INode<T>>, IBaseContainer<T> {\n insertStart(value: T): INode<T>;\n insertEnd(value: T): INode<T>;\n at(n: number): Maybe<INode<T>>;\n first(): Maybe<INode<T>>;\n last(): Maybe<INode<T>>;\n readonly size: number;\n [Symbol.iterator](): IterableIterator<INode<T>>;\n}\n\nexport class InternalList<T> implements IList<T> {\n #head: Maybe<ListNode<T>>;\n #tail: Maybe<ListNode<T>>;\n #size = 0;\n\n // Cursor cache: remembers last .at() result so sequential access is O(1)\n #cursorNode: Maybe<ListNode<T>>;\n #cursorIndex = -1;\n\n #invalidateCursor() {\n this.#cursorNode = null;\n this.#cursorIndex = -1;\n }\n\n insertStart(value: T) {\n const node = new ListNode(value, null, this.#head, this);\n if (this.#head != null) {\n this.#head[$prev] = node;\n } else {\n this.#tail = node;\n }\n this.#head = node;\n this.#size++;\n this.#invalidateCursor();\n return this.#head;\n }\n\n delete(node: INode<T>): void {\n const n = node as ListNode<T>;\n const prev = n[$prev];\n const next = n[$next];\n\n if (next) {\n next[$prev] = prev;\n }\n if (prev) {\n prev[$next] = next;\n }\n if (node === this.#head) {\n this.#head = next;\n }\n if (node === this.#tail) {\n this.#tail = prev;\n }\n n.clearFields();\n this.#size--;\n this.#invalidateCursor();\n }\n\n at(n: number): Maybe<ListNode<T>> {\n // Normalise negative index\n if (n < 0) n = this.#size + n;\n if (n < 0 || n >= this.#size) return;\n\n // Pick the closest starting point among head, tail, and cached cursor\n let current: Maybe<ListNode<T>>;\n let pos: number;\n\n const distFromHead = n;\n const distFromTail = this.#size - 1 - n;\n const distFromCursor =\n this.#cursorNode != null ? Math.abs(n - this.#cursorIndex) : Infinity;\n\n if (distFromCursor <= distFromHead && distFromCursor <= distFromTail) {\n // Start from cursor\n current = this.#cursorNode;\n pos = this.#cursorIndex;\n } else if (distFromHead <= distFromTail) {\n // Start from head\n current = this.#head;\n pos = 0;\n } else {\n // Start from tail\n current = this.#tail;\n pos = this.#size - 1;\n }\n\n // Walk to target\n while (pos < n && current != null) {\n current = current[$next];\n pos++;\n }\n while (pos > n && current != null) {\n current = current[$prev];\n pos--;\n }\n\n // Update cursor cache\n if (current != null) {\n this.#cursorNode = current;\n this.#cursorIndex = pos;\n }\n\n return current;\n }\n\n get size(): number {\n return this.#size;\n }\n\n /** Reset the list to empty. O(1). */\n clear(): void {\n this.#head = null;\n this.#tail = null;\n this.#size = 0;\n this.#invalidateCursor();\n }\n\n /** O(1) head access. */\n first(): Maybe<ListNode<T>> {\n return this.#head;\n }\n\n /** O(1) tail access. */\n last(): Maybe<ListNode<T>> {\n return this.#tail;\n }\n\n insertEnd(value: T): ListNode<T> {\n const node = new ListNode(value, this.#tail, null, this);\n if (this.#tail != null) {\n this.#tail[$next] = node;\n } else {\n this.#head = node;\n }\n this.#tail = node;\n this.#size++;\n // Don't invalidate cursor — appending doesn't shift existing indices\n return this.#tail;\n }\n\n insertNext(ref: INode<T>, value: T): ListNode<T> {\n const r = ref as ListNode<T>;\n if (r[$owner] != this) {\n throw new TypeError(\n \"The reference node does not belong to the current list\",\n );\n }\n const node = new ListNode(value, r, r[$next], this);\n if (r[$next]) {\n r[$next][$prev] = node;\n } else {\n this.#tail = node;\n }\n r[$next] = node;\n this.#size++;\n this.#invalidateCursor();\n return node;\n }\n\n insertPrev(ref: INode<T>, value: T): ListNode<T> {\n const r = ref as ListNode<T>;\n if (r[$owner] != this) {\n throw new TypeError(\n \"The reference node does not belong to the current list\",\n );\n }\n const node = new ListNode(value, r[$prev], r, this);\n if (r[$prev]) {\n r[$prev][$next] = node;\n } else {\n this.#head = node;\n }\n r[$prev] = node;\n this.#size++;\n this.#invalidateCursor();\n return node;\n }\n\n *[Symbol.iterator]() {\n let current = this.#head;\n while (current) {\n const next = current[$next]; // save before yield — node may be deleted during iteration\n yield current;\n current = next;\n }\n }\n}\n\nexport class List<T> extends InternalList<T> implements IList<T> {\n static from<T>(arrayLike: Iterable<T>): List<T> {\n const list = new List<T>();\n for (const item of arrayLike) {\n list.insertEnd(item);\n }\n return list;\n }\n}\n",
|
|
6
|
+
"/**\n * IndexedList — linked list with O(1) identity-based lookup.\n *\n * Combines a doubly-linked list (O(1) insert/delete given a node)\n * with a Map<T, INode<T>> for O(1) lookup by value identity.\n *\n * All mutating operations are O(1):\n * push, delete, has, first, last, clear\n */\n\nimport { InternalList, type INode } from \"./list\";\nimport type { Maybe } from \"@/functional/maybe\";\n\nexport class IndexedList<T> {\n #list = new InternalList<T>();\n #map = new Map<T, INode<T>>();\n\n /** Append item to the end. No-op if already present. Returns the node. */\n push(item: T): INode<T> {\n const existing = this.#map.get(item);\n if (existing) return existing;\n const node = this.#list.insertEnd(item);\n this.#map.set(item, node);\n return node;\n }\n\n /** Insert item at the front. No-op if already present. */\n unshift(item: T): void {\n if (this.#map.has(item)) return;\n const node = this.#list.insertStart(item);\n this.#map.set(item, node);\n }\n\n /** Insert item after ref. No-op if item already present. */\n insertAfter(ref: T, item: T): void {\n if (this.#map.has(item)) return;\n const refNode = this.#map.get(ref);\n if (!refNode) {\n this.push(item);\n return;\n }\n const node = refNode.insertNext(item);\n this.#map.set(item, node);\n }\n\n /** Remove item. O(1). */\n delete(item: T): void {\n const node = this.#map.get(item);\n if (!node) return;\n this.#map.delete(item);\n node.delete();\n }\n\n /** Check membership. O(1). */\n has(item: T): boolean {\n return this.#map.has(item);\n }\n\n /** Number of items. */\n get length(): number {\n return this.#map.size;\n }\n\n /** Get the first item (head). O(1). */\n first(): Maybe<T> {\n return this.#list.first()?.v;\n }\n\n /** Get the last item (tail). O(1). */\n last(): Maybe<T> {\n return this.#list.last()?.v;\n }\n\n /** Get the linked-list node for an item. O(1). */\n getNode(item: T): Maybe<INode<T>> {\n return this.#map.get(item);\n }\n\n /** Positional access. O(n) — prefer getNode + getNext for traversal. */\n at(index: number): Maybe<T> {\n return this.#list.at(index)?.v;\n }\n\n /**\n * Replace item at `pos`, or insert if nothing is there.\n * If `pos >= length`, appends to the end.\n * Returns the node.\n */\n upsert(pos: number, item: T): INode<T> {\n const existing = this.#list.at(pos);\n if (!existing) {\n return this.push(item);\n }\n // Remove old identity mapping\n this.#map.delete(existing.v);\n // Replace value in-place\n existing.v = item;\n // Register new identity\n this.#map.set(item, existing);\n return existing;\n }\n\n /** Swap two items in the list. O(1). No-op if either item is missing. */\n swap(a: T, b: T): void {\n const nodeA = this.#map.get(a);\n const nodeB = this.#map.get(b);\n if (!nodeA || !nodeB) return;\n nodeA.v = b;\n nodeB.v = a;\n this.#map.set(a, nodeB);\n this.#map.set(b, nodeA);\n }\n\n /** Reset to empty. O(1). */\n clear(): void {\n this.#list.clear();\n this.#map.clear();\n }\n\n /** Iterate values in insertion order. */\n *[Symbol.iterator](): IterableIterator<T> {\n for (const node of this.#list) {\n yield node.v;\n }\n }\n}\n",
|
|
7
|
+
"import type { IRender } from \"@/render/render_interface\";\nimport type { View, PendingView } from \"./internal_view\";\nimport { IndexedList } from \"@/structures/indexed_list\";\nimport type { Wildcard } from \"./wildcard\";\nimport type { Maybe } from \"@/functional/maybe\";\n\nexport type Scheduler = (callback: () => void) => void;\n\nexport class Engine {\n dirty = new IndexedList<View>();\n #scheduler: Scheduler;\n\n #renderScheduled = false;\n\n #collector: Maybe<(view: PendingView) => void>;\n\n constructor(\n public renderer: IRender<Wildcard>,\n scheduler?: Scheduler,\n ) {\n this.#scheduler =\n (scheduler ?? \"scheduler\" in globalThis)\n ? // @ts-ignore\n (cb) => window.scheduler.postTask(cb)\n : (cb) => queueMicrotask(cb);\n }\n\n disposeView(view: View) {\n this.dirty.delete(view);\n }\n\n schedule() {\n if (this.#renderScheduled) {\n return;\n }\n\n this.#renderScheduled = true;\n this.#scheduler(() => {\n this.#renderScheduled = false;\n this.render();\n });\n }\n\n /** Mark a view dirty and schedule a render loop if not already scheduled. */\n markDirty(view: View) {\n this.dirty.push(view);\n this.schedule();\n }\n\n pendingView(view: PendingView) {\n this.#collector?.(view);\n }\n\n collect(slot: () => void): PendingView[] {\n const list: PendingView[] = [];\n const prev = this.#collector;\n this.#collector = list.push.bind(list);\n slot();\n this.#collector = prev;\n return list;\n }\n\n #rendering = false;\n render() {\n if (this.#rendering) return;\n\n this.#rendering = true;\n try {\n const cbs: (() => void)[] = [];\n\n while (this.dirty.length > 0) {\n const view = this.dirty.first()!;\n const isNew = view.renderRef == null;\n\n if (!isNew) view.onUpdateBefore();\n\n // Physical render. Might need to have separate queue for this.\n this.renderer.render(view);\n\n if (view.dirty) {\n // Reconsiling view to prepare their children & vdom\n view.reconsile();\n cbs.push(isNew ? view.onMount : view.onUpdateAfter);\n view.dirty = false; // view is renrendered at this stage\n }\n\n this.dirty.delete(view);\n }\n\n for (const cb of cbs) {\n cb();\n }\n } finally {\n this.#rendering = false;\n }\n }\n}\n",
|
|
8
|
+
"import 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 */\nexport class State<T> implements Reactive<T> {\n #current: T;\n #schedule: () => void;\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.#current = value;\n this.#schedule();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n const result = fn(this.#current);\n if (result instanceof Promise) {\n result.then((value) => {\n this.#current = value;\n this.#schedule();\n });\n } else {\n this.#current = result;\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",
|
|
9
|
+
"import type { MaybePromise } from \"@/functional/maybe_promise\";\n\nconst $store = Symbol(\"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\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.#current = value;\n this.#notify();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n const result = fn(this.#current);\n if (result instanceof Promise) {\n result.then((value) => {\n this.#current = value;\n this.#notify();\n });\n } else {\n this.#current = result;\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",
|
|
10
|
+
"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 const keysA = Object.keys(a);\n if (keysA.length !== Object.keys(b).length) return false;\n\n for (let i = 0; i < keysA.length; i++) {\n const key = keysA[i];\n // @ts-ignore\n if (!Object.is(a[key], b[key])) {\n return false;\n }\n }\n\n return true;\n}\n",
|
|
11
|
+
"import type { Key } from \"@/functional/key\";\nimport type { Children, Slot, ViewBody, ViewFn } from \"@/public/view\";\nimport type { Engine } from \"./engine\";\nimport { State, type Reactive } from \"@/public/state\";\nimport { Store, isStore } from \"@/public/store\";\nimport { IndexedList } from \"@/structures/indexed_list\";\nimport { shallowEqual } from \"@/functional/shallow_equal\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Wildcard } from \"./wildcard\";\n\nexport type PendingView<Props = Wildcard, Api = Wildcard> = {\n viewFn: ViewFn<Props, Api>;\n props: Props;\n slot: Maybe<Slot>;\n userKey: Maybe<Key>;\n};\n\nexport class View<Props = Wildcard, Api = Wildcard> implements Disposable {\n // Renderer matched details (depends on each renderer)\n // TODO: need to be typed better\n renderRef: unknown;\n\n // Props\n props: Props;\n\n // Children received from slot\n slotChildren: Children;\n\n // User defined View APIs\n body: ViewBody<Props, Api>;\n\n // VDom elements: structure & user-key mapper\n virtualDom: Maybe<IndexedList<View>>;\n keyToIndex: Maybe<Map<Key, number>>;\n\n // marks if the entity itself needs rerender\n dirty: boolean = true;\n\n // marks if the entity was moved in the vdom (needs DOM repositioning)\n moved: boolean = false;\n quickRerender: boolean = true;\n\n #unsubscribe: (() => void)[] = [];\n\n constructor(\n public viewFn: ViewFn<Props, Api>,\n initialProps: Props,\n slot: Maybe<Slot>,\n public engine: Engine,\n public parent: Maybe<View>,\n public userKey: Maybe<Key>,\n ) {\n this.props = initialProps;\n\n this.body = viewFn({\n props: () => this.props,\n\n use: <T>(storeOrInitial: T | Store<T>): Reactive<T> => {\n if (!isStore(storeOrInitial)) {\n // Local state\n return new State(storeOrInitial, this.markDirty);\n }\n\n // Store operation\n const s = storeOrInitial;\n this.#unsubscribe.push(this.markDirty);\n return s;\n },\n\n slot: () => {\n if (!this.slotChildren) {\n return;\n }\n for (const child of this.slotChildren) {\n this.engine.pendingView(child);\n }\n },\n });\n\n this.slotChildren = slot && this.engine.collect(slot);\n this.markDirty();\n }\n\n markDirty = () => {\n this.dirty = true;\n this.engine.markDirty(this);\n };\n\n markMove() {\n this.moved = true;\n this.engine.markDirty(this);\n }\n\n shouldUpdate(nextProps: Props): boolean {\n if (this.body.shouldUpdate) {\n return this.body.shouldUpdate(nextProps);\n }\n return !shallowEqual(this.props, nextProps);\n }\n\n onMount = () => {\n this.quickRerender = false;\n this.body.onMount?.();\n };\n\n onUpdateBefore() {\n this.body.onUpdateBefore?.();\n }\n\n onUpdateAfter = () => {\n this.quickRerender = false;\n this.body.onUpdateBefore?.();\n };\n\n nextProps(nextProps: Props, nextSlot: Maybe<Slot>) {\n const prevChildren = this.slotChildren;\n this.slotChildren = nextSlot && this.engine.collect(nextSlot);\n\n if (\n this.shouldUpdate(nextProps) ||\n hasNewChildren(prevChildren, this.slotChildren)\n ) {\n this.markDirty();\n this.props = nextProps;\n }\n }\n\n reconsile() {\n const children = this.engine.collect(this.body.render);\n if (!this.virtualDom && children.length === 0) return;\n if (!this.virtualDom) this.virtualDom = new IndexedList();\n this.quickRerender = true;\n const vdom = this.virtualDom;\n\n for (let i = 0; i < children.length; i++) {\n const pending = children[i]!;\n const expectedNext = vdom.at(i);\n // Non-keyed operation\n if (pending.userKey == null) {\n if (expectedNext?.viewFn === pending.viewFn) {\n this.quickRerender = false;\n expectedNext.nextProps(pending.props, pending.slot);\n } else {\n if (expectedNext) {\n if (expectedNext.userKey)\n this.keyToIndex?.delete(expectedNext.userKey);\n expectedNext[Symbol.dispose]();\n }\n vdom.upsert(\n i,\n new View(\n pending.viewFn,\n pending.props,\n pending.slot,\n this.engine,\n this,\n null, // no user key\n ),\n );\n }\n } else {\n // Keyed operation\n // TODO\n // We need to somehow handle case where keyed elements are mixed with non keyed and then repeated with same keys.\n // We likely need keyed groups, following separate reconsiliation\n const matchedIndex = this.keyToIndex?.get(pending.userKey);\n const matched = matchedIndex != null ? vdom.at(matchedIndex) : null;\n if (matched && matched.viewFn === pending.viewFn) {\n this.quickRerender = false;\n matched.nextProps(pending.props, pending.slot);\n\n // We have some element in expectedNext. Need to identify actions\n if (expectedNext != null) {\n // We have non-matched element in expectedNext, we need to swap them\n if (matched !== expectedNext) {\n matched.markMove();\n expectedNext.markMove();\n vdom.swap(matched, expectedNext);\n // Update keyToIndex after swap: matched is now at i, expectedNext at matchedIndex\n if (this.keyToIndex) {\n if (matched.userKey != null)\n this.keyToIndex.set(matched.userKey, i);\n if (expectedNext.userKey != null)\n this.keyToIndex.set(expectedNext.userKey, matchedIndex!);\n }\n }\n // elements matched, all good\n } else {\n // No element in expectedNext, we just need to put matched to correct position.\n // TODO:\n // technically this case should NOT be possible, as we have matched item, while exceeding the array size already.\n matched.markMove();\n vdom.upsert(i, matched);\n if (this.keyToIndex && matched.userKey != null) {\n this.keyToIndex.set(matched.userKey, i);\n }\n }\n } else {\n if (expectedNext) {\n if (expectedNext.userKey)\n this.keyToIndex?.delete(expectedNext.userKey);\n expectedNext[Symbol.dispose]();\n }\n // No matched element, we need to create new one and put it to correct position\n vdom.upsert(\n i,\n new View(\n pending.viewFn,\n pending.props,\n pending.slot,\n this.engine,\n this,\n pending.userKey,\n ),\n );\n\n if (!this.keyToIndex) this.keyToIndex = new Map();\n this.keyToIndex.set(pending.userKey, i);\n }\n }\n }\n\n // Cleanup removed nodes\n if (children.length < vdom.length) {\n for (let i = vdom.length; i >= children.length; i--) {\n const removed = vdom.at(i);\n if (removed) {\n if (removed.userKey) this.keyToIndex?.delete(removed.userKey);\n removed[Symbol.dispose]();\n vdom.delete(removed);\n }\n }\n }\n }\n\n [Symbol.dispose]() {\n if (this.virtualDom) {\n for (const child of this.virtualDom) {\n child[Symbol.dispose]();\n }\n }\n this.engine.renderer.unmount(this);\n\n this.engine.disposeView(this);\n }\n}\n\n/** True if nextChildren differ from prev (structure or props). */\nfunction hasNewChildren(\n prev: Maybe<PendingView[]>,\n next: Maybe<PendingView[]>,\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 if (next[i]!.props !== prev[i]!.props) return true;\n }\n return false;\n}\n",
|
|
12
|
+
"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: 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",
|
|
13
|
+
"import { Engine, type Scheduler } from \"@/internal/engine\";\nimport { View } from \"@/internal/internal_view\";\nimport { orchestrator } from \"@/internal/orchestrator\";\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 orchestrator.setCurrentEngine(engine);\n new View(\n () => ({ render() { slot(); } }),\n props ?? {},\n null,\n engine,\n null,\n null,\n );\n engine.render();\n return { engine };\n },\n };\n}\n",
|
|
14
|
+
"import type { Key } from \"@/functional/key\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport { orchestrator } from \"@/internal/orchestrator\";\nimport type { Use } from \"./state\";\nimport type { PendingView } from \"@/internal/internal_view\";\nimport type { $primitive } from \"./primitive\";\n\nexport type ViewBody<Props, Api> = Api extends void\n ? {\n render: () => void;\n onMount?: () => void;\n shouldUpdate?: (nextProps: Props) => boolean;\n onUpdateBefore?: () => void;\n onUpdateafter?: () => void;\n }\n : {\n render: () => void;\n onMount?: () => void;\n shouldUpdate?: (nextProps: Props) => boolean;\n onUpdateBefore?: () => void;\n onUpdateafter?: () => void;\n api: Api;\n };\n\n/** Slot callback — passed by the caller at the call site. */\nexport type Slot = () => void;\n\n/** Children — pre-collected PendingViews available inside the view. */\nexport type Children = Maybe<PendingView[]>;\n\nexport type ViewFn<Props, Api> = {\n (ctx: { props: () => Props; use: Use; slot: Slot }): ViewBody<Props, Api>;\n [$primitive]?: string;\n};\n\nexport function view<Props = void, Api = void>(\n body: ViewFn<Props, Api>,\n): (\n props: Props extends void ? { key?: Key } | void : Props & { key?: Key },\n slot?: Slot,\n) => void {\n return (\n props: Props extends void ? { key?: Key } | void : Props & { key?: Key },\n slot?: Slot,\n ) => {\n orchestrator.currentEngine()!.pendingView({\n viewFn: body,\n props,\n slot,\n userKey: 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",
|
|
15
|
+
"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",
|
|
16
|
+
"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\";\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};\n\nexport type FocusEventData = BaseEventData;\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 keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n focus: (e: FocusEventData) => void;\n blur: (e: FocusEventData) => 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\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\n// ---------------------------------------------------------------------------\n\nexport const text = html<Wildcard>(\"text\");\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 ContainerEvents\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 ContainerEvents\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 }, ContainerEvents>(\n \"details\",\n);\nexport const summary = html(\"summary\");\nexport const dialog = html<HtmlAttrs & { open?: boolean }, ContainerEvents>(\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",
|
|
17
|
+
"import type { View } 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\";\n\n// ---------------------------------------------------------------------------\n// Render refs — stored on view.renderRef\n// ---------------------------------------------------------------------------\n\ntype PrimitiveDomRef = {\n kind: \"primitive\";\n element: HTMLElement | Text;\n prevProps: Record<string, unknown> | null;\n listeners: Map<string, EventListener> | null;\n};\n\ntype CompositeDomRef = {\n kind: \"composite\";\n endComment: Comment;\n};\n\ntype DomRef = PrimitiveDomRef | CompositeDomRef;\n\n// ---------------------------------------------------------------------------\n// Creo event name → DOM event name\n// ---------------------------------------------------------------------------\n\nconst DOM_EVENT: Record<string, string> = {\n click: \"click\",\n dblclick: \"dblclick\",\n pointerDown: \"pointerdown\",\n pointerUp: \"pointerup\",\n pointerMove: \"pointermove\",\n input: \"input\",\n change: \"change\",\n keyDown: \"keydown\",\n keyUp: \"keyup\",\n focus: \"focus\",\n blur: \"blur\",\n};\n\n// Props that are framework-internal, not HTML attributes\nconst SKIP_PROPS = new Set([\"key\"]);\n\n// DOM properties that must be set directly (not via setAttribute)\nconst DOM_PROPERTIES = new Set([\n \"value\",\n \"checked\",\n \"selected\",\n \"indeterminate\",\n]);\n\n// ---------------------------------------------------------------------------\n// HTML Renderer\n// ---------------------------------------------------------------------------\n\nexport class HtmlRender implements IRender<HTMLElement | Text> {\n constructor(private container: HTMLElement) {}\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: View): void {\n const ref = view.renderRef as Maybe<DomRef>;\n\n if (!ref) {\n // --- Mount: create DOM and insert ---\n const node = this.buildDom(view);\n const parent = view.parent;\n if (!parent) {\n this.container.appendChild(node);\n } else {\n const parentNode = this.getParentDomNode(parent);\n if (parentNode) {\n parentNode.insertBefore(node, this.fastInsertionPoint(parent, view));\n }\n }\n // Handle autofocus\n const newRef = view.renderRef as Maybe<DomRef>;\n if (\n newRef?.kind === \"primitive\" &&\n newRef.element instanceof HTMLElement &&\n (view.props as Record<string, unknown>)?.autofocus\n ) {\n newRef.element.focus();\n }\n return;\n }\n\n // --- Update: reposition (only if moved) + diff ---\n\n if (view.moved) {\n view.moved = false;\n if (view.parent) {\n const expectedStart = this.fastInsertionPoint(view.parent, view);\n const firstDom = this.getFirstDomNode(view);\n\n if (firstDom && firstDom !== expectedStart) {\n const parentNode = this.getParentDomNode(view.parent);\n if (parentNode) {\n if (ref.kind === \"primitive\") {\n parentNode.insertBefore(ref.element, expectedStart);\n } else {\n if (view.virtualDom) {\n for (const child of view.virtualDom) {\n this.moveDomNodes(child, parentNode, expectedStart);\n }\n }\n parentNode.insertBefore(ref.endComment, expectedStart);\n }\n }\n }\n }\n }\n\n // Diff attributes for primitives\n if (ref.kind !== \"primitive\") return;\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 const nextProps = view.props as Record<string, unknown>;\n if (!ref.prevProps) {\n this.setAttributes(ref, ref.element, nextProps);\n } else {\n this.diffAttributes(ref, ref.element, ref.prevProps, nextProps);\n }\n ref.prevProps = { ...nextProps };\n }\n\n unmount(view: View): void {\n this.removeDomNodes(view);\n view.renderRef = undefined;\n }\n\n // -- Internal: DOM building -------------------------------------------------\n\n private buildDom(view: View): Node {\n const tag = view.viewFn[$primitive];\n\n if (tag != null) {\n if (tag === \"text\") {\n const textNode = document.createTextNode(String(view.props));\n const ref: PrimitiveDomRef = {\n kind: \"primitive\",\n element: textNode,\n prevProps: null,\n listeners: null,\n };\n view.renderRef = ref;\n return textNode;\n }\n\n const element = document.createElement(tag);\n const props = view.props as Record<string, unknown>;\n const ref: PrimitiveDomRef = {\n kind: \"primitive\",\n element,\n prevProps: null,\n listeners: null,\n };\n view.renderRef = ref;\n this.setAttributes(ref, element, props);\n return element;\n }\n\n const endComment = document.createComment(\"\");\n view.renderRef = {\n kind: \"composite\",\n endComment,\n } as CompositeDomRef;\n\n return endComment;\n }\n\n // -- Internal: attributes + events ------------------------------------------\n\n private isEventProp(key: string, value: unknown): boolean {\n return (\n key.length > 2 &&\n key[0] === \"o\" &&\n key[1] === \"n\" &&\n key[2]! >= \"A\" &&\n key[2]! <= \"Z\" &&\n typeof value === \"function\"\n );\n }\n\n private eventPropToCreoName(prop: string): string {\n return prop[2]!.toLowerCase() + prop.slice(3);\n }\n\n private setAttributes(\n ref: PrimitiveDomRef,\n element: HTMLElement,\n props: Record<string, unknown>,\n ) {\n for (const key in props) {\n const value = props[key];\n if (SKIP_PROPS.has(key) || value == null) continue;\n if (this.isEventProp(key, value)) {\n this.bindEvent(ref, element, key, value as Function);\n continue;\n }\n this.setAttribute(element, key, value);\n }\n }\n\n private diffAttributes(\n ref: PrimitiveDomRef,\n element: HTMLElement,\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n ) {\n // Remove attrs/events that existed before but are gone or null now\n for (const key of Object.keys(prev)) {\n if (SKIP_PROPS.has(key)) continue;\n if (!(key in next) || next[key] == null) {\n if (this.isEventProp(key, prev[key])) {\n this.unbindEvent(ref, element, key);\n } else {\n this.removeAttribute(element, key);\n }\n }\n }\n\n // Set attrs/events that are new or changed\n for (const key in next) {\n const value = next[key];\n if (SKIP_PROPS.has(key) || value == null) continue;\n if (prev[key] === value) continue;\n if (this.isEventProp(key, value)) {\n this.unbindEvent(ref, element, key);\n this.bindEvent(ref, element, key, value as Function);\n } else {\n this.setAttribute(element, key, value);\n }\n }\n }\n\n private bindEvent(\n ref: PrimitiveDomRef,\n element: HTMLElement,\n prop: string,\n handler: Function,\n ) {\n const creoEvent = this.eventPropToCreoName(prop);\n const domEvent = DOM_EVENT[creoEvent] ?? creoEvent.toLowerCase();\n const wrapped: EventListener = (e: Event) => {\n const data = this.mapEventData(creoEvent, e) as Record<string, unknown>;\n data.stopPropagation = () => e.stopPropagation();\n data.preventDefault = () => e.preventDefault();\n handler(data);\n };\n if (!ref.listeners) ref.listeners = new Map();\n ref.listeners.set(prop, wrapped);\n element.addEventListener(domEvent, wrapped);\n }\n\n private unbindEvent(\n ref: PrimitiveDomRef,\n element: HTMLElement,\n prop: string,\n ) {\n const wrapped = ref.listeners?.get(prop);\n if (!wrapped) return;\n const creoEvent = this.eventPropToCreoName(prop);\n const domEvent = DOM_EVENT[creoEvent] ?? creoEvent.toLowerCase();\n element.removeEventListener(domEvent, wrapped);\n ref.listeners!.delete(prop);\n }\n\n private mapEventData(creoEvent: string, e: Event): unknown {\n if (\n creoEvent === \"click\" ||\n creoEvent === \"dblclick\" ||\n creoEvent.startsWith(\"pointer\")\n ) {\n const pe = e as PointerEvent;\n return { x: pe.clientX, y: pe.clientY };\n }\n if (creoEvent === \"input\" || creoEvent === \"change\") {\n return { value: (e.target as HTMLInputElement).value };\n }\n if (creoEvent.startsWith(\"key\")) {\n const ke = e as KeyboardEvent;\n return { key: ke.key, code: ke.code };\n }\n return {};\n }\n\n private setAttribute(element: HTMLElement, key: string, value: unknown) {\n if (key === \"class\") {\n element.className = String(value);\n } else if (key === \"style\") {\n element.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) {\n element.setAttribute(key, \"\");\n } else {\n element.removeAttribute(key);\n }\n } else {\n element.setAttribute(key, String(value));\n }\n }\n\n private removeAttribute(element: HTMLElement, key: string) {\n if (key === \"class\") {\n element.className = \"\";\n } else if (key === \"style\") {\n element.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 /**\n * Compute where a view's DOM node should be placed in its parent.\n *\n * Fast paths (O(1)):\n * - Last child → endComment (composite) or null/appendChild (primitive)\n * - Previous sibling rendered → nextSibling of prev's last DOM node\n *\n * Slow path (O(k)): walk backward through unrendered siblings.\n *\n * Composite parents always return endComment as fallback (never null),\n * so insertBefore(node, result) is safe for all parent types.\n */\n private fastInsertionPoint(parent: View, view: View): Node | null {\n const vdom = parent.virtualDom;\n if (vdom && vdom.length > 0) {\n const node = vdom.getNode(view);\n if (node) {\n // Fast path: last child → append at end of parent\n if (node.isLast() || parent.quickRerender) {\n const ref = parent.renderRef as Maybe<DomRef>;\n if (ref?.kind === \"composite\") {\n return ref.endComment;\n } else {\n return null;\n }\n }\n\n // Fast path: immediate previous sibling is rendered\n const prev = node.getPrev();\n if (prev) {\n const prevRef = prev.v.renderRef as Maybe<DomRef>;\n if (prevRef) {\n return (\n prevRef.kind === \"composite\"\n ? prevRef.endComment\n : prevRef.element\n ).nextSibling;\n }\n // Slow path: walk further back through unrendered siblings\n let cur = prev.getPrev();\n while (cur) {\n const curRef = cur.v.renderRef as Maybe<DomRef>;\n if (curRef) {\n return (\n curRef.kind === \"composite\" ? curRef.endComment : curRef.element\n ).nextSibling;\n }\n cur = cur.getPrev();\n }\n }\n }\n }\n\n // First child (or no vdom): insert at start of parent\n const ref = parent.renderRef as Maybe<DomRef>;\n if (!ref) return null;\n // Composite: endComment is both start and end anchor (children go before it)\n // Primitive: firstChild (null if empty → appendChild)\n return ref.kind === \"composite\" ? ref.endComment : ref.element.firstChild;\n }\n\n private getParentDomNode(parent: View): Maybe<Node> {\n const ref = parent.renderRef as Maybe<DomRef>;\n if (!ref) return null;\n\n if (ref.kind === \"primitive\") {\n return ref.element;\n }\n return ref.endComment.parentNode;\n }\n\n private moveDomNodes(\n view: View,\n parentNode: Node,\n insertBefore: Node | null,\n ): void {\n const ref = view.renderRef as Maybe<DomRef>;\n if (!ref) return;\n if (ref.kind === \"primitive\") {\n parentNode.insertBefore(ref.element, insertBefore);\n } else {\n if (view.virtualDom) {\n for (const child of view.virtualDom) {\n this.moveDomNodes(child, parentNode, insertBefore);\n }\n }\n parentNode.insertBefore(ref.endComment, insertBefore);\n }\n }\n\n private getFirstDomNode(view: View): Node | null {\n const ref = view.renderRef as Maybe<DomRef>;\n if (!ref) return null;\n if (ref.kind === \"primitive\") return ref.element;\n if (view.virtualDom) {\n for (const child of view.virtualDom) {\n const node = this.getFirstDomNode(child);\n if (node) return node;\n }\n }\n return ref.endComment;\n }\n\n private removeDomNodes(view: View) {\n const ref = view.renderRef as Maybe<DomRef>;\n if (!ref) return;\n\n if (ref.kind === \"primitive\") {\n ref.element.parentNode?.removeChild(ref.element);\n return;\n }\n\n ref.endComment.parentNode?.removeChild(ref.endComment);\n }\n}\n",
|
|
18
|
+
"import type { View } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\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 // -- IRender ----------------------------------------------------------------\n\n render(view: View): 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 parentNode.children.push(node);\n }\n return;\n }\n\n // Update: reposition + patch props\n const parentNode = view.parent?.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n const oldIdx = parentNode.children.indexOf(existing);\n if (oldIdx !== -1) {\n const nextSibling = this.getNextSibling(view);\n const nextNode = nextSibling?.renderRef as Maybe<JsonNode>;\n const expectedIdx = nextNode\n ? parentNode.children.indexOf(nextNode)\n : parentNode.children.length;\n if (oldIdx !== expectedIdx && oldIdx !== expectedIdx - 1) {\n parentNode.children.splice(oldIdx, 1);\n const insertIdx = nextNode\n ? parentNode.children.indexOf(nextNode)\n : parentNode.children.length;\n parentNode.children.splice(insertIdx, 0, existing);\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: View): void {\n const childNode = view.renderRef as Maybe<JsonNode>;\n const parentNode = view.parent?.renderRef as Maybe<JsonNode>;\n if (parentNode && childNode) {\n const idx = parentNode.children.indexOf(childNode);\n if (idx !== -1) parentNode.children.splice(idx, 1);\n }\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private getNextSibling(view: View): Maybe<View> {\n return view.parent?.virtualDom?.getNode(view)?.getNext()?.v;\n }\n\n private buildNode(view: View): 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",
|
|
19
|
+
"import type { View } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\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/**\n * Stateless string renderer — pull-based.\n * mount/unmount/update are no-ops. Call renderToString() to\n * get the current HTML string from the VDOM.\n */\nexport class StringRender implements IRender<string> {\n private rootView: Maybe<View>;\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: View): void {\n if (!view.parent) {\n this.rootView = view;\n }\n }\n\n unmount(_view: View): void {}\n\n // -- Public -----------------------------------------------------------------\n\n /** Build and return the current HTML string from the VDOM. */\n renderToString(): string {\n if (!this.rootView) return \"\";\n return this.buildString(this.rootView);\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildString(view: View): string {\n const tag = view.viewFn[$primitive];\n\n if (tag != null) {\n if (tag === \"text\") {\n return `${view.props}`;\n }\n if (VOID_TAGS.has(tag)) {\n return this.buildVoidTag(tag, view);\n }\n return `<${tag}>${this.buildChildren(view)}</${tag}>`;\n }\n\n return this.buildChildren(view);\n }\n\n private buildVoidTag(tag: string, view: View): string {\n const props = view.props as Record<string, unknown>;\n let attrs = \"\";\n if (props.src) attrs += ` src=\"${props.src}\"`;\n if (props.alt) attrs += ` alt=\"${props.alt}\"`;\n return `<${tag}${attrs} />`;\n }\n\n private buildChildren(view: View): string {\n let result = \"\";\n if (view.virtualDom) {\n for (const child of view.virtualDom) {\n result += this.buildString(child);\n }\n }\n return result;\n }\n}\n",
|
|
20
|
+
"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 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",
|
|
21
|
+
"export function assertNever(x: never): never {\n throw new Error(`Unhandled case: ${x}`)\n}\n"
|
|
22
|
+
],
|
|
23
|
+
"mappings": "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",
|
|
24
|
+
"debugId": "3A0F56854FC011F464756E2164756E21",
|
|
25
|
+
"names": []
|
|
26
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IRender } from "../render/render_interface";
|
|
2
|
+
import type { View, PendingView } from "./internal_view";
|
|
3
|
+
import { IndexedList } from "../structures/indexed_list";
|
|
4
|
+
import type { Wildcard } from "./wildcard";
|
|
5
|
+
export type Scheduler = (callback: () => void) => void;
|
|
6
|
+
export declare class Engine {
|
|
7
|
+
#private;
|
|
8
|
+
renderer: IRender<Wildcard>;
|
|
9
|
+
dirty: IndexedList<View<any, any>>;
|
|
10
|
+
constructor(renderer: IRender<Wildcard>, scheduler?: Scheduler);
|
|
11
|
+
disposeView(view: View): void;
|
|
12
|
+
schedule(): void;
|
|
13
|
+
/** Mark a view dirty and schedule a render loop if not already scheduled. */
|
|
14
|
+
markDirty(view: View): void;
|
|
15
|
+
pendingView(view: PendingView): void;
|
|
16
|
+
collect(slot: () => void): PendingView[];
|
|
17
|
+
render(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Key } from "../functional/key";
|
|
2
|
+
import type { Children, Slot, ViewBody, ViewFn } from "../public/view";
|
|
3
|
+
import type { Engine } from "./engine";
|
|
4
|
+
import { IndexedList } from "../structures/indexed_list";
|
|
5
|
+
import type { Maybe } from "../functional/maybe";
|
|
6
|
+
import type { Wildcard } from "./wildcard";
|
|
7
|
+
export type PendingView<Props = Wildcard, Api = Wildcard> = {
|
|
8
|
+
viewFn: ViewFn<Props, Api>;
|
|
9
|
+
props: Props;
|
|
10
|
+
slot: Maybe<Slot>;
|
|
11
|
+
userKey: Maybe<Key>;
|
|
12
|
+
};
|
|
13
|
+
export declare class View<Props = Wildcard, Api = Wildcard> implements Disposable {
|
|
14
|
+
#private;
|
|
15
|
+
viewFn: ViewFn<Props, Api>;
|
|
16
|
+
engine: Engine;
|
|
17
|
+
parent: Maybe<View>;
|
|
18
|
+
userKey: Maybe<Key>;
|
|
19
|
+
renderRef: unknown;
|
|
20
|
+
props: Props;
|
|
21
|
+
slotChildren: Children;
|
|
22
|
+
body: ViewBody<Props, Api>;
|
|
23
|
+
virtualDom: Maybe<IndexedList<View>>;
|
|
24
|
+
keyToIndex: Maybe<Map<Key, number>>;
|
|
25
|
+
dirty: boolean;
|
|
26
|
+
moved: boolean;
|
|
27
|
+
quickRerender: boolean;
|
|
28
|
+
constructor(viewFn: ViewFn<Props, Api>, initialProps: Props, slot: Maybe<Slot>, engine: Engine, parent: Maybe<View>, userKey: Maybe<Key>);
|
|
29
|
+
markDirty: () => void;
|
|
30
|
+
markMove(): void;
|
|
31
|
+
shouldUpdate(nextProps: Props): boolean;
|
|
32
|
+
onMount: () => void;
|
|
33
|
+
onUpdateBefore(): void;
|
|
34
|
+
onUpdateAfter: () => void;
|
|
35
|
+
nextProps(nextProps: Props, nextSlot: Maybe<Slot>): void;
|
|
36
|
+
reconsile(): void;
|
|
37
|
+
[Symbol.dispose](): void;
|
|
38
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Maybe } from "../functional/maybe";
|
|
2
|
+
import type { Engine } from "../internal/engine";
|
|
3
|
+
/**
|
|
4
|
+
* Orchestrator is the high-level class, that handles the oveall operations for the UI engine
|
|
5
|
+
* 1. When View is rendered or updated, orchestrator is responsible of bringing the renderer, virtual dom and engine together
|
|
6
|
+
* 2. Keeps track on current views / stores in the app
|
|
7
|
+
* 3. Keeps track on which views need to be updated, which onces are in updating process
|
|
8
|
+
* 4. Sets the current orchestrator scope (e.g. if the app has several Creo renderers)
|
|
9
|
+
*/
|
|
10
|
+
declare class Orchestrator {
|
|
11
|
+
#private;
|
|
12
|
+
setCurrentEngine(engine: Engine): void;
|
|
13
|
+
currentEngine(): Maybe<Engine>;
|
|
14
|
+
}
|
|
15
|
+
export declare const orchestrator: Orchestrator;
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type Wildcard = any;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Engine, type Scheduler } from "../internal/engine";
|
|
2
|
+
import type { IRender } from "../render/render_interface";
|
|
3
|
+
import type { Wildcard } from "../internal/wildcard";
|
|
4
|
+
type AppOptions = {
|
|
5
|
+
scheduler?: Scheduler;
|
|
6
|
+
};
|
|
7
|
+
type AppHandle = {
|
|
8
|
+
engine: Engine;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Create a Creo application.
|
|
12
|
+
*
|
|
13
|
+
* createApp(() => App(), new HtmlRender(el)).mount();
|
|
14
|
+
* createApp(() => App(), new HtmlRender(el), { scheduler: requestAnimationFrame }).mount();
|
|
15
|
+
*/
|
|
16
|
+
export declare function createApp(slot: () => void, renderer: IRender<Wildcard>, options?: AppOptions): {
|
|
17
|
+
mount(props?: Wildcard): AppHandle;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Wildcard } from "../internal/wildcard";
|
|
2
|
+
type EventCallback = (...args: Wildcard[]) => void;
|
|
3
|
+
/**
|
|
4
|
+
* Delegate that the renderer provides to wire event subscriptions
|
|
5
|
+
* to the actual output (DOM addEventListener, etc.).
|
|
6
|
+
* Set on the EventHandle after the view's output is created.
|
|
7
|
+
*/
|
|
8
|
+
export type EventDelegate = {
|
|
9
|
+
bind(event: string, callback: EventCallback, once?: boolean): void;
|
|
10
|
+
unbind(event: string, callback: EventCallback): void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Handle returned when calling a primitive in the render stream.
|
|
14
|
+
* Provides on/once/off for event subscription.
|
|
15
|
+
*
|
|
16
|
+
* When a delegate is set (by the renderer after mount), calls are
|
|
17
|
+
* proxied to the renderer — only events the user subscribes to
|
|
18
|
+
* get bound. Before the delegate exists, listeners are stored and
|
|
19
|
+
* flushed once the delegate arrives.
|
|
20
|
+
*/
|
|
21
|
+
export declare class EventHandle<Events> {
|
|
22
|
+
#private;
|
|
23
|
+
on<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
24
|
+
once<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
25
|
+
off<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
26
|
+
/**
|
|
27
|
+
* Called by the renderer after the view's output is created.
|
|
28
|
+
* Flushes any listeners that were added before the delegate existed.
|
|
29
|
+
*/
|
|
30
|
+
setDelegate(delegate: EventDelegate): void;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Key } from "../functional/key";
|
|
2
|
+
import type { Slot, ViewBody } from "./view";
|
|
3
|
+
/**
|
|
4
|
+
* Maps event type { click: (e: X) => void } to
|
|
5
|
+
* handler props { onClick?: (e: X) => void }.
|
|
6
|
+
*/
|
|
7
|
+
export type EventHandlerProps<Events> = {
|
|
8
|
+
[K in keyof Events as `on${Capitalize<string & K>}`]?: Events[K];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Props passed when calling a primitive in the render stream.
|
|
12
|
+
* Attrs + on* event handler props + optional key.
|
|
13
|
+
*/
|
|
14
|
+
export type PrimitiveProps<Attrs, Events> = Attrs & EventHandlerProps<Events> & {
|
|
15
|
+
key?: Key;
|
|
16
|
+
};
|
|
17
|
+
export declare const $primitive: unique symbol;
|
|
18
|
+
export declare function primitiveViewFn<Props>({ slot, }: {
|
|
19
|
+
slot: Slot;
|
|
20
|
+
}): ViewBody<Props, void>;
|