creo 0.2.3 → 0.2.5

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/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ export { Store, store, isStore } from "./public/store";
7
7
  export { $primitive } from "./public/primitive";
8
8
  export type { PrimitiveProps, EventHandlerProps } from "./public/primitive";
9
9
  export { html, text, div, span, section, article, aside, nav, header, footer, main, address, hgroup, search, p, h1, h2, h3, h4, h5, h6, pre, code, em, strong, small, br, hr, a, blockquote, label, abbr, b, bdi, bdo, cite, data, dfn, i, kbd, mark, q, rp, rt, ruby, s, samp, sub, sup, time, u, varEl, wbr, del, ins, ul, ol, li, dl, dt, dd, table, thead, tbody, tfoot, tr, th, td, caption, colgroup, col, form, button, input, textarea, select, option, fieldset, legend, datalist, optgroup, output, progress, meter, img, video, audio, canvas, source, track, map, area, picture, iframe, embed, object, portal, svg, details, summary, dialog, menu, figure, figcaption, script, noscript, template, slot, } from "./public/primitives/primitives";
10
- export type { BaseEventData, PointerEventData, KeyEventData, InputEventData, FocusEventData, ContainerEvents, FormEvents, HtmlAttrs, } from "./public/primitives/primitives";
10
+ export type { BaseEventData, PointerEventData, KeyEventData, InputEventData, FocusEventData, MediaEventData, ScrollEventData, LoadEventData, ErrorEventData, ToggleEventData, ContainerEvents, FormEvents, MediaEvents, DisclosureEvents, HtmlAttrs, } from "./public/primitives/primitives";
11
11
  export type { IRender } from "./render/render_interface";
12
12
  export { HtmlRender } from "./render/html_render";
13
13
  export { JsonRender } from "./render/json_render";
package/dist/index.js CHANGED
@@ -307,6 +307,17 @@ function lis(arr) {
307
307
  }
308
308
 
309
309
  // src/internal/engine.ts
310
+ var STATEFUL_DOM_KEYS = ["value", "checked", "selected", "indeterminate", "muted"];
311
+ function hasStatefulDomKey(props) {
312
+ if (props == null || typeof props !== "object")
313
+ return false;
314
+ for (const k of STATEFUL_DOM_KEYS) {
315
+ if (k in props)
316
+ return true;
317
+ }
318
+ return false;
319
+ }
320
+
310
321
  class Engine {
311
322
  renderer;
312
323
  #dirtyQueue = new Set;
@@ -458,7 +469,7 @@ class Engine {
458
469
  }
459
470
  }
460
471
  const structChanged = hasScStructuralChange(prevSc, view2.sc);
461
- const shouldUpdate = view2.body?.shouldUpdate ? view2.body.shouldUpdate(nextProps) : !shallowEqual(view2.props, nextProps);
472
+ const shouldUpdate = view2.body?.shouldUpdate ? view2.body.shouldUpdate(nextProps) : !shallowEqual(view2.props, nextProps) || (view2.flags & F_PRIMITIVE) !== 0 && hasStatefulDomKey(nextProps);
462
473
  if (shouldUpdate || structChanged) {
463
474
  view2.props = nextProps;
464
475
  this.markDirty(view2);
@@ -766,7 +777,30 @@ var DOM_EVENT = {
766
777
  KeyDown: "keydown",
767
778
  KeyUp: "keyup",
768
779
  Focus: "focus",
769
- Blur: "blur"
780
+ Blur: "blur",
781
+ MouseEnter: "mouseenter",
782
+ MouseLeave: "mouseleave",
783
+ PointerEnter: "pointerenter",
784
+ PointerLeave: "pointerleave",
785
+ Scroll: "scroll",
786
+ Load: "load",
787
+ Error: "error",
788
+ Toggle: "toggle",
789
+ VolumeChange: "volumechange",
790
+ Play: "play",
791
+ Pause: "pause",
792
+ Ended: "ended",
793
+ TimeUpdate: "timeupdate",
794
+ LoadedMetadata: "loadedmetadata",
795
+ LoadedData: "loadeddata",
796
+ CanPlay: "canplay",
797
+ CanPlayThrough: "canplaythrough",
798
+ DurationChange: "durationchange",
799
+ RateChange: "ratechange",
800
+ Seeking: "seeking",
801
+ Seeked: "seeked",
802
+ Stalled: "stalled",
803
+ Waiting: "waiting"
770
804
  };
771
805
  var $EV = Symbol.for("creo.ev");
772
806
  var containerState = new WeakMap;
@@ -777,6 +811,7 @@ function getState(container) {
777
811
  counts: new Map,
778
812
  handler(e) {
779
813
  const domEvent = e.type;
814
+ const noWalk = NO_WALK_EVENTS.has(domEvent);
780
815
  let dom = e.target;
781
816
  while (dom && dom !== container) {
782
817
  const evObj = dom[$EV];
@@ -788,6 +823,8 @@ function getState(container) {
788
823
  return;
789
824
  }
790
825
  }
826
+ if (noWalk)
827
+ return;
791
828
  dom = dom.parentElement;
792
829
  }
793
830
  }
@@ -796,11 +833,52 @@ function getState(container) {
796
833
  }
797
834
  return state;
798
835
  }
836
+ var CAPTURE_EVENTS = new Set([
837
+ "focus",
838
+ "blur",
839
+ "mouseenter",
840
+ "mouseleave",
841
+ "pointerenter",
842
+ "pointerleave",
843
+ "scroll",
844
+ "load",
845
+ "error",
846
+ "toggle",
847
+ "volumechange",
848
+ "play",
849
+ "pause",
850
+ "ended",
851
+ "timeupdate",
852
+ "loadedmetadata",
853
+ "loadeddata",
854
+ "canplay",
855
+ "canplaythrough",
856
+ "durationchange",
857
+ "ratechange",
858
+ "seeking",
859
+ "seeked",
860
+ "stalled",
861
+ "waiting"
862
+ ]);
863
+ var NO_WALK_EVENTS = new Set([
864
+ "mouseenter",
865
+ "mouseleave",
866
+ "pointerenter",
867
+ "pointerleave"
868
+ ]);
869
+ var PASSIVE_EVENTS = new Set(["scroll"]);
870
+ function listenerOptions(domEvent) {
871
+ const capture = CAPTURE_EVENTS.has(domEvent);
872
+ if (PASSIVE_EVENTS.has(domEvent)) {
873
+ return { capture, passive: true };
874
+ }
875
+ return capture;
876
+ }
799
877
  function ensureDelegated(container, domEvent) {
800
878
  const state = getState(container);
801
879
  const count = state.counts.get(domEvent) ?? 0;
802
880
  if (count === 0) {
803
- container.addEventListener(domEvent, state.handler);
881
+ container.addEventListener(domEvent, state.handler, listenerOptions(domEvent));
804
882
  }
805
883
  state.counts.set(domEvent, count + 1);
806
884
  }
@@ -809,18 +887,68 @@ function removeDelegated(container, domEvent) {
809
887
  const count = state.counts.get(domEvent) ?? 0;
810
888
  if (count <= 1) {
811
889
  state.counts.delete(domEvent);
812
- container.removeEventListener(domEvent, state.handler);
890
+ container.removeEventListener(domEvent, state.handler, listenerOptions(domEvent));
813
891
  } else {
814
892
  state.counts.set(domEvent, count - 1);
815
893
  }
816
894
  }
895
+ var POINTER_EVENTS = new Set([
896
+ "click",
897
+ "dblclick",
898
+ "pointerdown",
899
+ "pointerup",
900
+ "pointermove",
901
+ "mouseenter",
902
+ "mouseleave",
903
+ "pointerenter",
904
+ "pointerleave"
905
+ ]);
906
+ var MEDIA_EVENTS = new Set([
907
+ "volumechange",
908
+ "play",
909
+ "pause",
910
+ "ended",
911
+ "timeupdate",
912
+ "loadedmetadata",
913
+ "loadeddata",
914
+ "canplay",
915
+ "canplaythrough",
916
+ "durationchange",
917
+ "ratechange",
918
+ "seeking",
919
+ "seeked",
920
+ "stalled",
921
+ "waiting"
922
+ ]);
817
923
  function mapEventData(domEvent, e) {
818
924
  let data2;
819
- if (domEvent === "click" || domEvent === "dblclick" || domEvent === "pointerdown" || domEvent === "pointerup" || domEvent === "pointermove") {
925
+ if (POINTER_EVENTS.has(domEvent)) {
820
926
  const pe = e;
821
927
  data2 = { x: pe.clientX, y: pe.clientY };
822
928
  } else if (domEvent === "input" || domEvent === "change") {
823
- data2 = { value: e.target.value };
929
+ const target = e.target;
930
+ data2 = { value: target.value, checked: !!target.checked };
931
+ } else if (MEDIA_EVENTS.has(domEvent)) {
932
+ const target = e.target;
933
+ data2 = {
934
+ muted: !!target.muted,
935
+ paused: !!target.paused,
936
+ volume: target.volume,
937
+ currentTime: target.currentTime,
938
+ duration: Number.isFinite(target.duration) ? target.duration : 0
939
+ };
940
+ } else if (domEvent === "scroll") {
941
+ const target = e.target;
942
+ data2 = {
943
+ scrollTop: target.scrollTop ?? 0,
944
+ scrollLeft: target.scrollLeft ?? 0
945
+ };
946
+ } else if (domEvent === "error") {
947
+ const ev = e;
948
+ data2 = { message: ev.message ?? "" };
949
+ } else if (domEvent === "toggle") {
950
+ const target = e.target;
951
+ data2 = { open: !!target.open };
824
952
  } else if (domEvent === "keydown" || domEvent === "keyup") {
825
953
  const ke = e;
826
954
  data2 = { key: ke.key, code: ke.code };
@@ -836,7 +964,8 @@ var DOM_PROPERTIES = new Set([
836
964
  "value",
837
965
  "checked",
838
966
  "selected",
839
- "indeterminate"
967
+ "indeterminate",
968
+ "muted"
840
969
  ]);
841
970
 
842
971
  class HtmlRender {
@@ -982,7 +1111,7 @@ class HtmlRender {
982
1111
  const value = next[key];
983
1112
  if (key === "key" || value == null)
984
1113
  continue;
985
- if (prev[key] === value)
1114
+ if (prev[key] === value && !DOM_PROPERTIES.has(key))
986
1115
  continue;
987
1116
  if (isEventProp(key)) {
988
1117
  const creoName = key.slice(2);
@@ -1162,7 +1291,7 @@ var VOID_TAGS = new Set([
1162
1291
  "col",
1163
1292
  "wbr"
1164
1293
  ]);
1165
- var DOM_PROPERTIES2 = new Set(["value", "checked", "selected", "indeterminate"]);
1294
+ var DOM_PROPERTIES2 = new Set(["value", "checked", "selected", "indeterminate", "muted"]);
1166
1295
  function isEventProp2(key) {
1167
1296
  return key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90;
1168
1297
  }
@@ -1385,4 +1514,4 @@ export {
1385
1514
  $primitive
1386
1515
  };
1387
1516
 
1388
- //# debugId=95FCA16C2C70A1BA64756E2164756E21
1517
+ //# debugId=AEF6273D02CC4DF064756E2164756E21
package/dist/index.js.map CHANGED
@@ -6,20 +6,20 @@
6
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",
7
7
  "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
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\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/** What callers may pass as a slot: a callback or a plain string (rendered as text). */\nexport type SlotContent = Slot | string;\n\nexport type ViewFn<Props, Api> = {\n (ctx: { props: () => Props; use: Use; slot: Slot }): ViewBody<Props, Api>;\n [$primitive]?: string;\n};\n\n/** Resolves to the caller-facing props type. Allows `void` when Props is void or all-optional. */\ntype ViewProps<Props> = Props extends void\n ? { key?: Key } | void\n : {} extends Props\n ? (Props & { key?: Key }) | void\n : Props & { key?: Key };\n\nexport function view<Props = void, Api = void>(\n body: ViewFn<Props, Api>,\n): (props: ViewProps<Props>, slot?: SlotContent) => void {\n return (props: ViewProps<Props>, 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",
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};\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 — 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 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",
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",
10
10
  "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",
11
11
  "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",
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 // Avoid Object.keys() allocations — use for...in instead\n let countA = 0;\n for (const key in a) {\n countA++;\n // @ts-ignore\n if (!Object.is(a[key], b[key])) return false;\n }\n\n let countB = 0;\n for (const _ in b) countB++;\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 { Slot, 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 };\n if (slot) {\n const slotFn = typeof slot === \"string\" ? this.#stringSlot(slot) : slot;\n res.sc = this.#collect(slotFn, [], res);\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 // #removeDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n // view: ViewRecord<Props, Api, RenderRef>,\n // ): void {\n // view.flags &= ~F_DIRTY;\n // view.flags &= ~F_MOVED;\n // this.#dirtyQueue.delete(view);\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 /** Convert a string slot into a callback that emits a text ViewRecord. */\n #stringSlot(content: string): Slot {\n return () => {\n this.view(textViewFn as ViewFn<Wildcard, Wildcard>, content, null, null);\n };\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 {\n if (nextSlot) {\n const slotFn =\n typeof nextSlot === \"string\" ? this.#stringSlot(nextSlot) : nextSlot;\n view.sc = this.#collect(slotFn, [], view);\n } else {\n view.sc = null;\n }\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\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 (const child of pendingChildren) {\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 }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[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 array\n view.children = [\n ...oldChildren.slice(0, i),\n ...pending.slice(i, newEnd + 1),\n ...oldChildren.slice(i, oldEnd + 1), // tail-synced portion is already patched\n ];\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\n view.children = [\n ...oldChildren.slice(0, i),\n ...oldChildren.slice(oldEnd + 1),\n ];\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 new children array for the middle portion\n const newChildren: ViewRecord[] = new Array(middleLen);\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 newChildren[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 newChildren[j] = oldView;\n }\n }\n\n // Rebuild view.children: head + middle + tail\n const head = oldChildren.slice(0, i);\n const tail = oldChildren.slice(oldEnd + 1);\n view.children = [...head, ...newChildren, ...tail];\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 { Slot, 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\n// Primitive props that map to live DOM properties whose value can drift away\n// from the rendered prop via user input (typing in an input, toggling a\n// checkbox, muting a video). For these keys we cannot trust shallowEqual to\n// mean \"DOM is up to date\" — re-render the primitive so the renderer can\n// re-assert the live property.\nconst STATEFUL_DOM_KEYS = [\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"] as const;\nfunction hasStatefulDomKey(props: unknown): boolean {\n if (props == null || typeof props !== \"object\") return false;\n for (const k of STATEFUL_DOM_KEYS) {\n if (k in (props as object)) return true;\n }\n return false;\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 };\n if (slot) {\n const slotFn = typeof slot === \"string\" ? this.#stringSlot(slot) : slot;\n res.sc = this.#collect(slotFn, [], res);\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 // #removeDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n // view: ViewRecord<Props, Api, RenderRef>,\n // ): void {\n // view.flags &= ~F_DIRTY;\n // view.flags &= ~F_MOVED;\n // this.#dirtyQueue.delete(view);\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 /** Convert a string slot into a callback that emits a text ViewRecord. */\n #stringSlot(content: string): Slot {\n return () => {\n this.view(textViewFn as ViewFn<Wildcard, Wildcard>, content, null, null);\n };\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 {\n if (nextSlot) {\n const slotFn =\n typeof nextSlot === \"string\" ? this.#stringSlot(nextSlot) : nextSlot;\n view.sc = this.#collect(slotFn, [], view);\n } else {\n view.sc = null;\n }\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 holding a stateful DOM key — DOM may have drifted from\n // the rendered prop; force a re-render so the renderer re-asserts.\n ((view.flags & F_PRIMITIVE) !== 0 && hasStatefulDomKey(nextProps));\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 (const child of pendingChildren) {\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 }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[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 array\n view.children = [\n ...oldChildren.slice(0, i),\n ...pending.slice(i, newEnd + 1),\n ...oldChildren.slice(i, oldEnd + 1), // tail-synced portion is already patched\n ];\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\n view.children = [\n ...oldChildren.slice(0, i),\n ...oldChildren.slice(oldEnd + 1),\n ];\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 new children array for the middle portion\n const newChildren: ViewRecord[] = new Array(middleLen);\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 newChildren[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 newChildren[j] = oldView;\n }\n }\n\n // Rebuild view.children: head + middle + tail\n const head = oldChildren.slice(0, i);\n const tail = oldChildren.slice(oldEnd + 1);\n view.children = [...head, ...newChildren, ...tail];\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",
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 {\n F_PRIMITIVE,\n F_MOVED,\n F_TEXT_CONTENT,\n} 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 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\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 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 dom = dom.parentElement as typeof dom;\n }\n },\n };\n containerState.set(container, state);\n }\n return state;\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(domEvent, state.handler);\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(domEvent, state.handler);\n } else {\n state.counts.set(domEvent, count - 1);\n }\n}\n\nfunction mapEventData(domEvent: string, e: Event): Record<string, unknown> {\n let data: Record<string, unknown>;\n if (\n domEvent === \"click\" ||\n domEvent === \"dblclick\" ||\n domEvent === \"pointerdown\" ||\n domEvent === \"pointerup\" ||\n domEvent === \"pointermove\"\n ) {\n const pe = e as PointerEvent;\n data = { x: pe.clientX, y: pe.clientY };\n } else if (domEvent === \"input\" || domEvent === \"change\") {\n data = { value: (e.target as HTMLInputElement).value };\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]);\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 =\n (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\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 } 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 // -- 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 const 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(\n element: Element,\n props: Record<string, unknown>,\n ) {\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 if (prev[key] === value) 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) {\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(\n element: Element,\n prop: string,\n handler: Function,\n ): 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) 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((view.renderRef as PrimitiveDomRef).element, insertBefore);\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 {\n F_PRIMITIVE,\n F_MOVED,\n F_TEXT_CONTENT,\n} 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(domEvent, state.handler, listenerOptions(domEvent));\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(domEvent, state.handler, listenerOptions(domEvent));\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 =\n (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\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 } 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 // -- 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 const 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(\n element: Element,\n props: Record<string, unknown>,\n ) {\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) {\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(\n element: Element,\n prop: string,\n handler: Function,\n ): 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) 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((view.renderRef as PrimitiveDomRef).element, insertBefore);\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",
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 // Insert at correct position\n const idx = view.parent.children\n ? view.parent.children.indexOf(view)\n : -1;\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 oldIdx = parentNode.children.indexOf(existing);\n const targetIdx = view.parent.children\n ? view.parent.children.indexOf(view)\n : -1;\n if (oldIdx !== -1 && targetIdx !== -1 && oldIdx !== targetIdx) {\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 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\"]);\n\n// Event handler prefix detection\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\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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 let result = \"\";\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n // Skip event handlers — they don't appear in HTML\n if (isEventProp(key)) 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\n/** @deprecated Use HtmlStringRender instead */\nexport const StringRender = HtmlStringRender;\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\n// Event handler prefix detection\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\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\n}\n\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, \"&amp;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\");\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 let result = \"\";\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n // Skip event handlers — they don't appear in HTML\n if (isEventProp(key)) 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\n/** @deprecated Use HtmlStringRender instead */\nexport const StringRender = HtmlStringRender;\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": "95FCA16C2C70A1BA64756E2164756E21",
22
+ "mappings": "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",
23
+ "debugId": "AEF6273D02CC4DF064756E2164756E21",
24
24
  "names": []
25
25
  }
@@ -14,18 +14,44 @@ export type KeyEventData = BaseEventData & {
14
14
  };
15
15
  export type InputEventData = BaseEventData & {
16
16
  value: string;
17
+ checked: boolean;
17
18
  };
18
19
  export type FocusEventData = BaseEventData;
20
+ export type ScrollEventData = BaseEventData & {
21
+ scrollTop: number;
22
+ scrollLeft: number;
23
+ };
24
+ export type LoadEventData = BaseEventData;
25
+ export type ErrorEventData = BaseEventData & {
26
+ message: string;
27
+ };
28
+ export type ToggleEventData = BaseEventData & {
29
+ open: boolean;
30
+ };
31
+ export type MediaEventData = BaseEventData & {
32
+ muted: boolean;
33
+ paused: boolean;
34
+ volume: number;
35
+ currentTime: number;
36
+ duration: number;
37
+ };
19
38
  export type ContainerEvents = {
20
39
  click: (e: PointerEventData) => void;
21
40
  dblclick: (e: PointerEventData) => void;
22
41
  pointerDown: (e: PointerEventData) => void;
23
42
  pointerUp: (e: PointerEventData) => void;
24
43
  pointerMove: (e: PointerEventData) => void;
44
+ mouseEnter: (e: PointerEventData) => void;
45
+ mouseLeave: (e: PointerEventData) => void;
46
+ pointerEnter: (e: PointerEventData) => void;
47
+ pointerLeave: (e: PointerEventData) => void;
25
48
  keyDown: (e: KeyEventData) => void;
26
49
  keyUp: (e: KeyEventData) => void;
27
50
  focus: (e: FocusEventData) => void;
28
51
  blur: (e: FocusEventData) => void;
52
+ scroll: (e: ScrollEventData) => void;
53
+ load: (e: LoadEventData) => void;
54
+ error: (e: ErrorEventData) => void;
29
55
  };
30
56
  export type FormEvents = ContainerEvents & {
31
57
  input: (e: InputEventData) => void;
@@ -33,6 +59,26 @@ export type FormEvents = ContainerEvents & {
33
59
  keyDown: (e: KeyEventData) => void;
34
60
  keyUp: (e: KeyEventData) => void;
35
61
  };
62
+ export type MediaEvents = ContainerEvents & {
63
+ volumeChange: (e: MediaEventData) => void;
64
+ play: (e: MediaEventData) => void;
65
+ pause: (e: MediaEventData) => void;
66
+ ended: (e: MediaEventData) => void;
67
+ timeUpdate: (e: MediaEventData) => void;
68
+ loadedMetadata: (e: MediaEventData) => void;
69
+ loadedData: (e: MediaEventData) => void;
70
+ canPlay: (e: MediaEventData) => void;
71
+ canPlayThrough: (e: MediaEventData) => void;
72
+ durationChange: (e: MediaEventData) => void;
73
+ rateChange: (e: MediaEventData) => void;
74
+ seeking: (e: MediaEventData) => void;
75
+ seeked: (e: MediaEventData) => void;
76
+ stalled: (e: MediaEventData) => void;
77
+ waiting: (e: MediaEventData) => void;
78
+ };
79
+ export type DisclosureEvents = ContainerEvents & {
80
+ toggle: (e: ToggleEventData) => void;
81
+ };
36
82
  export type HtmlAttrs = {
37
83
  class?: string;
38
84
  id?: string;
@@ -158,14 +204,14 @@ export declare const video: PublicView<HtmlAttrs & {
158
204
  muted?: boolean;
159
205
  width?: number;
160
206
  height?: number;
161
- } & EventHandlerProps<ContainerEvents>, void>;
207
+ } & EventHandlerProps<MediaEvents>, void>;
162
208
  export declare const audio: PublicView<HtmlAttrs & {
163
209
  src?: string;
164
210
  controls?: boolean;
165
211
  autoplay?: boolean;
166
212
  loop?: boolean;
167
213
  muted?: boolean;
168
- } & EventHandlerProps<ContainerEvents>, void>;
214
+ } & EventHandlerProps<MediaEvents>, void>;
169
215
  export declare const canvas: PublicView<HtmlAttrs & {
170
216
  width?: number;
171
217
  height?: number;
@@ -176,11 +222,11 @@ export declare const source: PublicView<HtmlAttrs & {
176
222
  } & EventHandlerProps<ContainerEvents>, void>;
177
223
  export declare const details: PublicView<HtmlAttrs & {
178
224
  open?: boolean;
179
- } & EventHandlerProps<ContainerEvents>, void>;
225
+ } & EventHandlerProps<DisclosureEvents>, void>;
180
226
  export declare const summary: PublicView<HtmlAttrs & EventHandlerProps<ContainerEvents>, void>;
181
227
  export declare const dialog: PublicView<HtmlAttrs & {
182
228
  open?: boolean;
183
- } & EventHandlerProps<ContainerEvents>, void>;
229
+ } & EventHandlerProps<DisclosureEvents>, void>;
184
230
  export declare const menu: PublicView<HtmlAttrs & EventHandlerProps<ContainerEvents>, void>;
185
231
  export declare const iframe: PublicView<HtmlAttrs & {
186
232
  src?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "creo",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",