oxiui-lib 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +15 -0
  3. package/biome.json +34 -0
  4. package/bun.lock +71 -0
  5. package/dist/core/elements/AbaComponent.d.ts +36 -0
  6. package/dist/core/elements/AbaComponent.js +114 -0
  7. package/dist/core/elements/AbaStateFull.d.ts +20 -0
  8. package/dist/core/elements/AbaStateFull.js +7 -0
  9. package/dist/core/elements/Animation.d.ts +31 -0
  10. package/dist/core/elements/Animation.js +83 -0
  11. package/dist/core/elements/Button.d.ts +23 -0
  12. package/dist/core/elements/Button.js +15 -0
  13. package/dist/core/elements/HRow.d.ts +4 -0
  14. package/dist/core/elements/HRow.js +11 -0
  15. package/dist/core/elements/InputText.d.ts +25 -0
  16. package/dist/core/elements/InputText.js +28 -0
  17. package/dist/core/elements/Stack.d.ts +26 -0
  18. package/dist/core/elements/Stack.js +40 -0
  19. package/dist/core/elements/Text.d.ts +40 -0
  20. package/dist/core/elements/Text.js +45 -0
  21. package/dist/core/elements/VRow.d.ts +4 -0
  22. package/dist/core/elements/VRow.js +11 -0
  23. package/dist/core/elements/index.d.ts +10 -0
  24. package/dist/core/elements/index.js +26 -0
  25. package/dist/core/elements/ui.d.ts +1 -0
  26. package/dist/core/elements/ui.js +6 -0
  27. package/dist/core/renderer.d.ts +3 -0
  28. package/dist/core/renderer.js +15 -0
  29. package/dist/core/renderers/html.d.ts +22 -0
  30. package/dist/core/renderers/html.js +201 -0
  31. package/dist/core/scheduler.d.ts +10 -0
  32. package/dist/core/scheduler.js +102 -0
  33. package/dist/core/signals.d.ts +13 -0
  34. package/dist/core/signals.js +77 -0
  35. package/dist/core/tree.d.ts +5 -0
  36. package/dist/core/tree.js +18 -0
  37. package/dist/core/types/component.d.ts +21 -0
  38. package/dist/core/types/component.js +2 -0
  39. package/dist/core/types/html.d.ts +66 -0
  40. package/dist/core/types/html.js +27 -0
  41. package/dist/index.d.ts +3 -0
  42. package/dist/index.js +19 -0
  43. package/lefthook.yml +6 -0
  44. package/package.json +23 -0
  45. package/src/core/elements/Animation.ts +80 -0
  46. package/src/core/elements/Button.ts +14 -0
  47. package/src/core/elements/HRow.ts +8 -0
  48. package/src/core/elements/InputText.ts +25 -0
  49. package/src/core/elements/OxiComponent.ts +143 -0
  50. package/src/core/elements/OxiStateFull.ts +3 -0
  51. package/src/core/elements/Stack.ts +44 -0
  52. package/src/core/elements/Text.ts +53 -0
  53. package/src/core/elements/VRow.ts +8 -0
  54. package/src/core/elements/index.ts +10 -0
  55. package/src/core/elements/ui.ts +5 -0
  56. package/src/core/renderer.ts +12 -0
  57. package/src/core/renderers/html.ts +268 -0
  58. package/src/core/scheduler.ts +124 -0
  59. package/src/core/signals.ts +84 -0
  60. package/src/core/tree.ts +20 -0
  61. package/src/core/types/component.ts +25 -0
  62. package/src/core/types/html.ts +97 -0
  63. package/src/index.ts +3 -0
  64. package/tsconfig.json +12 -0
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Button = void 0;
4
+ const AbaComponent_js_1 = require("./AbaComponent.js");
5
+ class Button extends (0, AbaComponent_js_1.intrinsic)("button") {
6
+ constructor(text, props) {
7
+ super();
8
+ this.withProps({ content: text !== null && text !== void 0 ? text : props === null || props === void 0 ? void 0 : props.content });
9
+ }
10
+ onClick(callback) {
11
+ this.withProps({ onClick: callback });
12
+ return this;
13
+ }
14
+ }
15
+ exports.Button = Button;
@@ -0,0 +1,4 @@
1
+ import { Stack } from "./Stack.js";
2
+ export declare class HRow extends Stack {
3
+ constructor();
4
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HRow = void 0;
4
+ const Stack_js_1 = require("./Stack.js");
5
+ class HRow extends Stack_js_1.Stack {
6
+ constructor() {
7
+ super();
8
+ this.horizontal().expand();
9
+ }
10
+ }
11
+ exports.HRow = HRow;
@@ -0,0 +1,25 @@
1
+ declare const TextInput_base: {
2
+ new (props?: import("../types/html.js").InputProps | undefined): {
3
+ "__#private@#__states": Map<string | symbol, import("../signals.js").Signal<any>>;
4
+ type: "input";
5
+ props: import("../types/html.js").InputProps;
6
+ up?: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>;
7
+ down: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>[];
8
+ cursors: Set<string>;
9
+ index: string;
10
+ view?: (() => void) | undefined;
11
+ body(fn?: ((component: /*elided*/ any) => void) | undefined): /*elided*/ any;
12
+ onAppear(fn: (component: /*elided*/ any) => void): /*elided*/ any;
13
+ withProps<T extends Partial<import("../types/html.js").InputProps>>(newProps: T): /*elided*/ any;
14
+ withStyle(style: Partial<CSSStyleDeclaration>): /*elided*/ any;
15
+ withExtension(extension: (component: /*elided*/ any) => void): /*elided*/ any;
16
+ };
17
+ };
18
+ export declare class TextInput extends TextInput_base {
19
+ constructor();
20
+ value(value: string | number): this;
21
+ placeholder(text: string): this;
22
+ required(required?: boolean): this;
23
+ onChangeText(fn: (value: string) => void): this;
24
+ }
25
+ export {};
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TextInput = void 0;
4
+ const AbaComponent_js_1 = require("./AbaComponent.js");
5
+ class TextInput extends (0, AbaComponent_js_1.intrinsic)("input") {
6
+ constructor() {
7
+ super();
8
+ }
9
+ value(value) {
10
+ this.props.value = value;
11
+ return this;
12
+ }
13
+ placeholder(text) {
14
+ this.props.placeholder = text;
15
+ return this;
16
+ }
17
+ required(required = true) {
18
+ this.props.required = required;
19
+ return this;
20
+ }
21
+ onChangeText(fn) {
22
+ this.props.onTextChange = (text) => {
23
+ fn(text);
24
+ };
25
+ return this;
26
+ }
27
+ }
28
+ exports.TextInput = TextInput;
@@ -0,0 +1,26 @@
1
+ declare const Stack_base: {
2
+ new (props?: import("../types/html.js").CommonProps | undefined): {
3
+ "__#private@#__states": Map<string | symbol, import("../signals.js").Signal<any>>;
4
+ type: "div";
5
+ props: import("../types/html.js").CommonProps;
6
+ up?: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>;
7
+ down: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>[];
8
+ cursors: Set<string>;
9
+ index: string;
10
+ view?: (() => void) | undefined;
11
+ body(fn?: ((component: /*elided*/ any) => void) | undefined): /*elided*/ any;
12
+ onAppear(fn: (component: /*elided*/ any) => void): /*elided*/ any;
13
+ withProps<T extends Partial<import("../types/html.js").CommonProps>>(newProps: T): /*elided*/ any;
14
+ withStyle(style: Partial<CSSStyleDeclaration>): /*elided*/ any;
15
+ withExtension(extension: (component: /*elided*/ any) => void): /*elided*/ any;
16
+ };
17
+ };
18
+ export declare class Stack extends Stack_base {
19
+ constructor();
20
+ verticalAlignment(value: "top" | "center" | "bottom"): this;
21
+ horizontalAlignment(value: "left" | "center" | "right"): this;
22
+ expand(): this;
23
+ horizontal(): this;
24
+ vertical(): this;
25
+ }
26
+ export {};
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Stack = void 0;
4
+ const AbaComponent_js_1 = require("./AbaComponent.js");
5
+ class Stack extends (0, AbaComponent_js_1.intrinsic)("div") {
6
+ constructor() {
7
+ super();
8
+ this.withStyle({
9
+ display: "flex",
10
+ });
11
+ }
12
+ verticalAlignment(value) {
13
+ return this.withStyle({
14
+ alignItems: value === "top"
15
+ ? "flex-start"
16
+ : value === "center"
17
+ ? "center"
18
+ : "flex-end",
19
+ });
20
+ }
21
+ horizontalAlignment(value) {
22
+ return this.withStyle({
23
+ justifyContent: value === "left"
24
+ ? "flex-start"
25
+ : value === "center"
26
+ ? "center"
27
+ : "flex-end",
28
+ });
29
+ }
30
+ expand() {
31
+ return this.withStyle({ flex: "1" });
32
+ }
33
+ horizontal() {
34
+ return this.withStyle({ flexDirection: "row" });
35
+ }
36
+ vertical() {
37
+ return this.withStyle({ flexDirection: "column" });
38
+ }
39
+ }
40
+ exports.Stack = Stack;
@@ -0,0 +1,40 @@
1
+ import type { SemanticText } from "../types/html.js";
2
+ declare const Text_base: {
3
+ new (props?: {
4
+ type: keyof SemanticText;
5
+ props: import("../types/html.js").CommonProps;
6
+ } | undefined): {
7
+ "__#private@#__states": Map<string | symbol, import("../signals.js").Signal<any>>;
8
+ type: "semanticText";
9
+ props: {
10
+ type: keyof SemanticText;
11
+ props: import("../types/html.js").CommonProps;
12
+ };
13
+ up?: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>;
14
+ down: import("../types/component.js").IComponent<keyof import("../types/html.js").IntrinsicElements>[];
15
+ cursors: Set<string>;
16
+ index: string;
17
+ view?: (() => void) | undefined;
18
+ body(fn?: ((component: /*elided*/ any) => void) | undefined): /*elided*/ any;
19
+ onAppear(fn: (component: /*elided*/ any) => void): /*elided*/ any;
20
+ withProps<T extends Partial<{
21
+ type: keyof SemanticText;
22
+ props: import("../types/html.js").CommonProps;
23
+ }>>(newProps: T): /*elided*/ any;
24
+ withStyle(style: string | Partial<CSSStyleDeclaration>): /*elided*/ any;
25
+ withExtension(extension: (component: /*elided*/ any) => void): /*elided*/ any;
26
+ };
27
+ };
28
+ export declare class Text extends Text_base {
29
+ constructor(text: string | number | (() => string | number));
30
+ withStyle(style: string | Partial<CSSStyleDeclaration>): this;
31
+ private setType;
32
+ asTitle(): this;
33
+ asSubtitle(): this;
34
+ asH3(): this;
35
+ asH4(): this;
36
+ asH5(): this;
37
+ asBody(): this;
38
+ asParagraph(): this;
39
+ }
40
+ export {};
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Text = void 0;
4
+ const AbaComponent_js_1 = require("./AbaComponent.js");
5
+ class Text extends (0, AbaComponent_js_1.intrinsic)("semanticText") {
6
+ constructor(text) {
7
+ super();
8
+ this.props = {
9
+ type: "span",
10
+ props: {
11
+ content: text
12
+ }
13
+ };
14
+ }
15
+ withStyle(style) {
16
+ this.props.props.style = style;
17
+ return this;
18
+ }
19
+ setType(type) {
20
+ this.props.type = type;
21
+ return this;
22
+ }
23
+ asTitle() {
24
+ return this.setType("h1");
25
+ }
26
+ asSubtitle() {
27
+ return this.setType("h2");
28
+ }
29
+ asH3() {
30
+ return this.setType("h3");
31
+ }
32
+ asH4() {
33
+ return this.setType("h4");
34
+ }
35
+ asH5() {
36
+ return this.setType("h5");
37
+ }
38
+ asBody() {
39
+ return this.setType("body");
40
+ }
41
+ asParagraph() {
42
+ return this.setType("p");
43
+ }
44
+ }
45
+ exports.Text = Text;
@@ -0,0 +1,4 @@
1
+ import { Stack } from "./Stack.js";
2
+ export declare class VRow extends Stack {
3
+ constructor();
4
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VRow = void 0;
4
+ const Stack_js_1 = require("./Stack.js");
5
+ class VRow extends Stack_js_1.Stack {
6
+ constructor() {
7
+ super();
8
+ this.vertical().expand();
9
+ }
10
+ }
11
+ exports.VRow = VRow;
@@ -0,0 +1,10 @@
1
+ export * from "./AbaComponent.js";
2
+ export * from "./AbaStateFull.js";
3
+ export * from "./Animation.js";
4
+ export * from "./Button.js";
5
+ export * from "./HRow.js";
6
+ export * from "./VRow.js";
7
+ export * from "./InputText.js";
8
+ export * from "./Stack.js";
9
+ export * from "./Text.js";
10
+ export * from "./ui.js";
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./AbaComponent.js"), exports);
18
+ __exportStar(require("./AbaStateFull.js"), exports);
19
+ __exportStar(require("./Animation.js"), exports);
20
+ __exportStar(require("./Button.js"), exports);
21
+ __exportStar(require("./HRow.js"), exports);
22
+ __exportStar(require("./VRow.js"), exports);
23
+ __exportStar(require("./InputText.js"), exports);
24
+ __exportStar(require("./Stack.js"), exports);
25
+ __exportStar(require("./Text.js"), exports);
26
+ __exportStar(require("./ui.js"), exports);
@@ -0,0 +1 @@
1
+ export declare function createStyle<T extends Record<string, Partial<CSSStyleDeclaration>>>(style: T): T;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStyle = createStyle;
4
+ function createStyle(style) {
5
+ return style;
6
+ }
@@ -0,0 +1,3 @@
1
+ export declare function getGlobalCursor(): number;
2
+ export declare function nextCursor(): number;
3
+ export declare function resetCursor(): void;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getGlobalCursor = getGlobalCursor;
4
+ exports.nextCursor = nextCursor;
5
+ exports.resetCursor = resetCursor;
6
+ let globalCursor = 0;
7
+ function getGlobalCursor() {
8
+ return globalCursor;
9
+ }
10
+ function nextCursor() {
11
+ return globalCursor++;
12
+ }
13
+ function resetCursor() {
14
+ globalCursor = 0;
15
+ }
@@ -0,0 +1,22 @@
1
+ import type { IComponent } from "../types/component.js";
2
+ import { type IntrinsicElements } from "../types/html.js";
3
+ export declare class HTMLRenderer {
4
+ private rootBody;
5
+ private oldRoot?;
6
+ private nodeMap;
7
+ constructor(rootId?: string);
8
+ render(stateId: string, readers: Set<string>, tree: IComponent<keyof IntrinsicElements>): void;
9
+ private findByIndex;
10
+ private findAllByState;
11
+ private structureChanged;
12
+ private cloneTree;
13
+ private renderNode;
14
+ private renderTextNode;
15
+ private replaceRoot;
16
+ private replaceNode;
17
+ private getTopMost;
18
+ private applyProps;
19
+ private applyCommonProps;
20
+ private applyStyle;
21
+ private applyInputProps;
22
+ }
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HTMLRenderer = void 0;
4
+ class HTMLRenderer {
5
+ constructor(rootId = "app") {
6
+ this.nodeMap = new Map();
7
+ const el = document.getElementById(rootId);
8
+ if (!el)
9
+ throw new Error(`Root element #${rootId} not found`);
10
+ this.rootBody = el;
11
+ }
12
+ render(stateId, readers, tree) {
13
+ if (!this.oldRoot) {
14
+ this.oldRoot = this.cloneTree(tree);
15
+ this.replaceRoot(this.oldRoot);
16
+ return;
17
+ }
18
+ const affected = this.findAllByState(this.oldRoot, stateId);
19
+ const topMost = this.getTopMost(Array.from(affected).map((n) => n.index));
20
+ for (const index of topMost) {
21
+ const newNode = this.findByIndex(tree, index);
22
+ const oldNode = this.findByIndex(this.oldRoot, index);
23
+ if (newNode && oldNode && this.structureChanged(oldNode, newNode)) {
24
+ this.replaceNode(index, newNode);
25
+ this.oldRoot = this.cloneTree(tree);
26
+ this.nodeMap.forEach((e, k) => {
27
+ // clean map
28
+ if (!this.findByIndex(this.oldRoot, k)) {
29
+ this.nodeMap.delete(k);
30
+ }
31
+ });
32
+ return;
33
+ }
34
+ }
35
+ for (const id of readers) {
36
+ const compNode = this.findByIndex(tree, id);
37
+ if (!compNode)
38
+ continue;
39
+ const domNode = this.nodeMap.get(id);
40
+ if (!domNode)
41
+ continue;
42
+ this.applyProps(domNode, compNode);
43
+ }
44
+ console.log(this.nodeMap);
45
+ }
46
+ findByIndex(node, index) {
47
+ if (node.index === index)
48
+ return node;
49
+ for (const child of node.down) {
50
+ const found = this.findByIndex(child, index);
51
+ if (found)
52
+ return found;
53
+ }
54
+ return undefined;
55
+ }
56
+ findAllByState(node, index, acc = new Set()) {
57
+ var _a;
58
+ if ((_a = node.cursors) === null || _a === void 0 ? void 0 : _a.has(index)) {
59
+ acc.add(node);
60
+ }
61
+ for (const child of node.down) {
62
+ this.findAllByState(child, index, acc);
63
+ }
64
+ return acc;
65
+ }
66
+ structureChanged(prev, next) {
67
+ if (!prev)
68
+ return true;
69
+ if (prev.type !== next.type)
70
+ return true;
71
+ if (prev.down.length !== next.down.length)
72
+ return true;
73
+ for (let i = 0; i < next.down.length; i++) {
74
+ if (next.down[i] !== undefined) {
75
+ if (this.structureChanged(prev.down[i], next.down[i])) {
76
+ return true;
77
+ }
78
+ }
79
+ }
80
+ return false;
81
+ }
82
+ cloneTree(node) {
83
+ return {
84
+ type: node.type,
85
+ index: node.index,
86
+ cursors: new Set(node.cursors),
87
+ down: node.down.map((n) => this.cloneTree(n)),
88
+ props: node.props,
89
+ };
90
+ }
91
+ renderNode(node) {
92
+ if (node.type === 'semanticText')
93
+ return this.renderTextNode(node);
94
+ const element = document.createElement(node.type);
95
+ element.setAttribute("id", node.index);
96
+ this.nodeMap.set(node.index, element);
97
+ this.applyProps(element, node);
98
+ for (const child of node.down) {
99
+ element.appendChild(this.renderNode(child));
100
+ }
101
+ return element;
102
+ }
103
+ renderTextNode(node) {
104
+ const props = node.props;
105
+ const element = document.createElement(props.type);
106
+ element.setAttribute("id", node.index);
107
+ this.nodeMap.set(node.index, element);
108
+ this.applyProps(element, node);
109
+ for (const child of node.down) {
110
+ element.appendChild(this.renderNode(child));
111
+ }
112
+ return element;
113
+ }
114
+ replaceRoot(component) {
115
+ const fragment = document.createDocumentFragment();
116
+ for (const child of component.down) {
117
+ fragment.appendChild(this.renderNode(child));
118
+ }
119
+ this.rootBody.replaceChildren(fragment);
120
+ }
121
+ replaceNode(index, node) {
122
+ if (index === '0')
123
+ this.replaceRoot(node);
124
+ const oldNode = this.findByIndex(this.oldRoot, index);
125
+ if (!oldNode)
126
+ return;
127
+ const domNode = this.nodeMap.get(oldNode.index);
128
+ if (!domNode)
129
+ return;
130
+ const newDom = this.renderNode(node);
131
+ domNode.replaceWith(newDom);
132
+ }
133
+ getTopMost(indices) {
134
+ const sorted = indices.sort((a, b) => a.length - b.length);
135
+ const result = [];
136
+ for (const value of sorted) {
137
+ const isChild = result.some((parent) => value.startsWith(parent + "."));
138
+ if (!isChild)
139
+ result.push(value);
140
+ }
141
+ return result;
142
+ }
143
+ applyProps(element, node) {
144
+ if (!node.props)
145
+ return;
146
+ const props = node.type === "semanticText"
147
+ ? node.props.props
148
+ : node.props;
149
+ this.applyCommonProps(element, props);
150
+ if (node.type === "input") {
151
+ this.applyInputProps(element, props);
152
+ }
153
+ }
154
+ applyCommonProps(element, props) {
155
+ var _a, _b, _c, _d, _e, _f;
156
+ if (props.content !== undefined) {
157
+ const value = typeof props.content === "function"
158
+ ? props.content()
159
+ : props.content;
160
+ element.textContent = String(value);
161
+ }
162
+ this.applyStyle(element, props.style);
163
+ if (props.id)
164
+ element.id = props.id;
165
+ if (props.class)
166
+ element.className = props.class;
167
+ if (props.title)
168
+ element.title = props.title;
169
+ if (props.hidden !== undefined)
170
+ element.hidden = props.hidden;
171
+ element.onclick = (_a = props.onClick) !== null && _a !== void 0 ? _a : null;
172
+ element.onchange = (_b = props.onChange) !== null && _b !== void 0 ? _b : null;
173
+ element.onfocus = (_c = props.onFocus) !== null && _c !== void 0 ? _c : null;
174
+ element.onblur = (_d = props.onBlur) !== null && _d !== void 0 ? _d : null;
175
+ element.onkeydown = (_e = props.onKeyDown) !== null && _e !== void 0 ? _e : null;
176
+ element.onkeyup = (_f = props.onKeyUp) !== null && _f !== void 0 ? _f : null;
177
+ element.oninput = (ev) => { var _a, _b; return (_b = (_a = props.onInput) === null || _a === void 0 ? void 0 : _a.call(props, ev)) !== null && _b !== void 0 ? _b : null; };
178
+ }
179
+ applyStyle(element, style) {
180
+ if (!style)
181
+ return;
182
+ if (typeof style === "string") {
183
+ element.setAttribute("style", style);
184
+ }
185
+ else {
186
+ Object.assign(element.style, style);
187
+ }
188
+ }
189
+ applyInputProps(element, props) {
190
+ if (props.value !== undefined) {
191
+ element.value = String(props.value);
192
+ }
193
+ element.oninput = (ev) => {
194
+ var _a, _b;
195
+ const input = ev.target;
196
+ (_a = props.onTextChange) === null || _a === void 0 ? void 0 : _a.call(props, input.value);
197
+ (_b = props.onInput) === null || _b === void 0 ? void 0 : _b.call(props, ev);
198
+ };
199
+ }
200
+ }
201
+ exports.HTMLRenderer = HTMLRenderer;
@@ -0,0 +1,10 @@
1
+ import type { DivContainer } from "./elements/AbaStateFull";
2
+ import type { IComponent } from "./types/component";
3
+ import type { IntrinsicElements } from "./types/html";
4
+ type RenderCallback = (stateId: string, readers: Set<string>, root: IComponent<keyof IntrinsicElements>) => void;
5
+ export declare function initScheduler(App: new () => DivContainer, renderer: RenderCallback): void;
6
+ export declare function scheduleEffect(fn: () => void): void;
7
+ export declare function rerender(stateId: string, readers: Set<string>): void;
8
+ export declare function startImmediateMode(): void;
9
+ export declare function stopImmediateMode(): void;
10
+ export {};
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initScheduler = initScheduler;
4
+ exports.scheduleEffect = scheduleEffect;
5
+ exports.rerender = rerender;
6
+ exports.startImmediateMode = startImmediateMode;
7
+ exports.stopImmediateMode = stopImmediateMode;
8
+ const renderer_1 = require("./renderer");
9
+ let running = false;
10
+ let app = null;
11
+ let renderCallback = null;
12
+ const postRenderQueue = [];
13
+ const resetTree = () => {
14
+ if (app === null || app === void 0 ? void 0 : app.down) {
15
+ app.down = [];
16
+ }
17
+ };
18
+ function initScheduler(App, renderer) {
19
+ app = new App();
20
+ renderCallback = renderer;
21
+ performRender("", new Set());
22
+ }
23
+ function scheduleEffect(fn) {
24
+ postRenderQueue.push(fn);
25
+ }
26
+ function findByIndex(node, index) {
27
+ if (node.index === index)
28
+ return node;
29
+ for (const child of node.down) {
30
+ const found = findByIndex(child, index);
31
+ if (found)
32
+ return found;
33
+ }
34
+ return null;
35
+ }
36
+ function clearCursors(node) {
37
+ var _a;
38
+ if (!node)
39
+ return;
40
+ (_a = node.cursors) === null || _a === void 0 ? void 0 : _a.clear();
41
+ for (const child of node.down) {
42
+ clearCursors(child);
43
+ }
44
+ }
45
+ function performRender(stateId, readers) {
46
+ if (!app || !renderCallback)
47
+ return;
48
+ console.clear();
49
+ resetTree();
50
+ (0, renderer_1.resetCursor)();
51
+ app.body();
52
+ renderCallback(stateId, readers, app);
53
+ postRenderQueue.forEach((fn) => fn());
54
+ postRenderQueue.length = 0;
55
+ clearCursors(app);
56
+ }
57
+ function rerender(stateId, readers) {
58
+ if (!renderCallback || !app)
59
+ return;
60
+ if (running)
61
+ return;
62
+ const validComponents = new Set();
63
+ readers.forEach((id) => {
64
+ if (findByIndex(app, id)) {
65
+ validComponents.add(id);
66
+ }
67
+ });
68
+ running = true;
69
+ setTimeout(() => {
70
+ running = false;
71
+ performRender(stateId, validComponents);
72
+ }, 0);
73
+ }
74
+ let immediateRunning = false;
75
+ let frameId = null;
76
+ function startImmediateMode() {
77
+ if (!app || !renderCallback)
78
+ return;
79
+ if (immediateRunning)
80
+ return;
81
+ immediateRunning = true;
82
+ const loop = () => {
83
+ if (!immediateRunning || !app)
84
+ return;
85
+ resetTree();
86
+ (0, renderer_1.resetCursor)();
87
+ app.body();
88
+ renderCallback === null || renderCallback === void 0 ? void 0 : renderCallback("", new Set(), app);
89
+ postRenderQueue.forEach((fn) => fn());
90
+ postRenderQueue.length = 0;
91
+ clearCursors(app);
92
+ frameId = requestAnimationFrame(loop);
93
+ };
94
+ frameId = requestAnimationFrame(loop);
95
+ }
96
+ function stopImmediateMode() {
97
+ immediateRunning = false;
98
+ if (frameId !== null) {
99
+ cancelAnimationFrame(frameId);
100
+ frameId = null;
101
+ }
102
+ }