@fukict/basic 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/dist/component-class/fukict.d.ts +207 -0
  3. package/dist/component-class/fukict.d.ts.map +1 -0
  4. package/dist/component-class/fukict.js +299 -0
  5. package/dist/component-class/fukict.js.map +1 -0
  6. package/dist/component-class/index.d.ts +5 -0
  7. package/dist/component-class/index.d.ts.map +1 -0
  8. package/dist/component-class/index.js +5 -0
  9. package/dist/component-class/index.js.map +1 -0
  10. package/dist/component-class/slot.d.ts +9 -0
  11. package/dist/component-class/slot.d.ts.map +1 -0
  12. package/dist/component-class/slot.js +46 -0
  13. package/dist/component-class/slot.js.map +1 -0
  14. package/dist/component-function/define.d.ts +36 -0
  15. package/dist/component-function/define.d.ts.map +1 -0
  16. package/dist/component-function/define.js +23 -0
  17. package/dist/component-function/define.js.map +1 -0
  18. package/dist/component-function/index.d.ts +6 -0
  19. package/dist/component-function/index.d.ts.map +1 -0
  20. package/dist/component-function/index.js +5 -0
  21. package/dist/component-function/index.js.map +1 -0
  22. package/dist/dom/attributes.d.ts +36 -0
  23. package/dist/dom/attributes.d.ts.map +1 -0
  24. package/dist/dom/attributes.js +113 -0
  25. package/dist/dom/attributes.js.map +1 -0
  26. package/dist/dom/element.d.ts +22 -0
  27. package/dist/dom/element.d.ts.map +1 -0
  28. package/dist/dom/element.js +98 -0
  29. package/dist/dom/element.js.map +1 -0
  30. package/dist/dom/events.d.ts +14 -0
  31. package/dist/dom/events.d.ts.map +1 -0
  32. package/dist/dom/events.js +18 -0
  33. package/dist/dom/events.js.map +1 -0
  34. package/dist/dom/index.d.ts +10 -0
  35. package/dist/dom/index.d.ts.map +1 -0
  36. package/dist/dom/index.js +14 -0
  37. package/dist/dom/index.js.map +1 -0
  38. package/dist/dom/node.d.ts +22 -0
  39. package/dist/dom/node.d.ts.map +1 -0
  40. package/dist/dom/node.js +30 -0
  41. package/dist/dom/node.js.map +1 -0
  42. package/dist/index.d.ts +22 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +26 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/jsx-runtime.d.ts +10 -0
  47. package/dist/jsx-runtime.d.ts.map +1 -0
  48. package/dist/jsx-runtime.js +9 -0
  49. package/dist/jsx-runtime.js.map +1 -0
  50. package/dist/metadata.d.ts +14 -0
  51. package/dist/metadata.d.ts.map +1 -0
  52. package/dist/metadata.js +14 -0
  53. package/dist/metadata.js.map +1 -0
  54. package/dist/renderer/attributes.d.ts +15 -0
  55. package/dist/renderer/attributes.d.ts.map +1 -0
  56. package/dist/renderer/attributes.js +61 -0
  57. package/dist/renderer/attributes.js.map +1 -0
  58. package/dist/renderer/create.d.ts +30 -0
  59. package/dist/renderer/create.d.ts.map +1 -0
  60. package/dist/renderer/create.js +223 -0
  61. package/dist/renderer/create.js.map +1 -0
  62. package/dist/renderer/diff/children.d.ts +12 -0
  63. package/dist/renderer/diff/children.d.ts.map +1 -0
  64. package/dist/renderer/diff/children.js +55 -0
  65. package/dist/renderer/diff/children.js.map +1 -0
  66. package/dist/renderer/diff/class.d.ts +8 -0
  67. package/dist/renderer/diff/class.d.ts.map +1 -0
  68. package/dist/renderer/diff/class.js +38 -0
  69. package/dist/renderer/diff/class.js.map +1 -0
  70. package/dist/renderer/diff/element.d.ts +14 -0
  71. package/dist/renderer/diff/element.d.ts.map +1 -0
  72. package/dist/renderer/diff/element.js +34 -0
  73. package/dist/renderer/diff/element.js.map +1 -0
  74. package/dist/renderer/diff/fragment.d.ts +13 -0
  75. package/dist/renderer/diff/fragment.d.ts.map +1 -0
  76. package/dist/renderer/diff/fragment.js +32 -0
  77. package/dist/renderer/diff/fragment.js.map +1 -0
  78. package/dist/renderer/diff/function.d.ts +9 -0
  79. package/dist/renderer/diff/function.d.ts.map +1 -0
  80. package/dist/renderer/diff/function.js +58 -0
  81. package/dist/renderer/diff/function.js.map +1 -0
  82. package/dist/renderer/diff/helpers.d.ts +19 -0
  83. package/dist/renderer/diff/helpers.d.ts.map +1 -0
  84. package/dist/renderer/diff/helpers.js +194 -0
  85. package/dist/renderer/diff/helpers.js.map +1 -0
  86. package/dist/renderer/diff/index.d.ts +18 -0
  87. package/dist/renderer/diff/index.d.ts.map +1 -0
  88. package/dist/renderer/diff/index.js +103 -0
  89. package/dist/renderer/diff/index.js.map +1 -0
  90. package/dist/renderer/diff/props.d.ts +18 -0
  91. package/dist/renderer/diff/props.d.ts.map +1 -0
  92. package/dist/renderer/diff/props.js +99 -0
  93. package/dist/renderer/diff/props.js.map +1 -0
  94. package/dist/renderer/index.d.ts +26 -0
  95. package/dist/renderer/index.d.ts.map +1 -0
  96. package/dist/renderer/index.js +93 -0
  97. package/dist/renderer/index.js.map +1 -0
  98. package/dist/renderer/mount.d.ts +30 -0
  99. package/dist/renderer/mount.d.ts.map +1 -0
  100. package/dist/renderer/mount.js +209 -0
  101. package/dist/renderer/mount.js.map +1 -0
  102. package/dist/types/class.d.ts +88 -0
  103. package/dist/types/class.d.ts.map +1 -0
  104. package/dist/types/class.js +2 -0
  105. package/dist/types/class.js.map +1 -0
  106. package/dist/types/context.d.ts +36 -0
  107. package/dist/types/context.d.ts.map +1 -0
  108. package/dist/types/context.js +9 -0
  109. package/dist/types/context.js.map +1 -0
  110. package/dist/types/core.d.ts +124 -0
  111. package/dist/types/core.d.ts.map +1 -0
  112. package/dist/types/core.js +15 -0
  113. package/dist/types/core.js.map +1 -0
  114. package/dist/types/dom-attributes.d.ts +236 -0
  115. package/dist/types/dom-attributes.d.ts.map +1 -0
  116. package/dist/types/dom-attributes.js +2 -0
  117. package/dist/types/dom-attributes.js.map +1 -0
  118. package/dist/types/events.d.ts +13 -0
  119. package/dist/types/events.d.ts.map +1 -0
  120. package/dist/types/events.js +7 -0
  121. package/dist/types/events.js.map +1 -0
  122. package/dist/types/index.d.ts +12 -0
  123. package/dist/types/index.d.ts.map +1 -0
  124. package/dist/types/index.js +7 -0
  125. package/dist/types/index.js.map +1 -0
  126. package/dist/types/jsx.d.ts +215 -0
  127. package/dist/types/jsx.d.ts.map +1 -0
  128. package/dist/types/jsx.js +2 -0
  129. package/dist/types/jsx.js.map +1 -0
  130. package/dist/utils/context.d.ts +31 -0
  131. package/dist/utils/context.d.ts.map +1 -0
  132. package/dist/utils/context.js +80 -0
  133. package/dist/utils/context.js.map +1 -0
  134. package/dist/utils/dom-helpers.d.ts +29 -0
  135. package/dist/utils/dom-helpers.d.ts.map +1 -0
  136. package/dist/utils/dom-helpers.js +53 -0
  137. package/dist/utils/dom-helpers.js.map +1 -0
  138. package/dist/vnode.d.ts +28 -0
  139. package/dist/vnode.d.ts.map +1 -0
  140. package/dist/vnode.js +68 -0
  141. package/dist/vnode.js.map +1 -0
  142. package/package.json +61 -0
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @fukict/basic - Renderer
3
+ *
4
+ * Main rendering API
5
+ */
6
+ import * as dom from '../dom/index.js';
7
+ import { createRealNode } from './create.js';
8
+ import { removeNode } from './diff/index.js';
9
+ import { activate } from './mount.js';
10
+ // Export diff function for use in Fukict.update
11
+ export { diff } from './diff/index.js';
12
+ /**
13
+ * Attach VNode to container (complete mounting flow)
14
+ *
15
+ * @param vnode - VNode to render
16
+ * @param container - Container element
17
+ * @returns Unmount function
18
+ */
19
+ export function attach(vnode, container) {
20
+ if (vnode === null || vnode === undefined) {
21
+ // Clear container
22
+ while (container.firstChild) {
23
+ dom.removeChild(container, container.firstChild);
24
+ }
25
+ return null;
26
+ }
27
+ // 1. Create real DOM nodes (ClassComponent creates placeholder)
28
+ createRealNode(vnode);
29
+ // 2. Activate: mount DOM and trigger lifecycle
30
+ activate({ vnode, container });
31
+ // Return unmount function
32
+ return () => {
33
+ removeNode(vnode, container);
34
+ };
35
+ }
36
+ /**
37
+ * Replace an existing DOM node with a new VNode
38
+ *
39
+ * @param oldNode - Existing DOM node to replace
40
+ * @param newVNode - New VNode to render
41
+ * @param _oldVNode - Optional VNode associated with oldNode (unused, kept for API compatibility)
42
+ * @returns New DOM node(s) or null
43
+ */
44
+ export function replaceNode(oldNode, newVNode, _oldVNode) {
45
+ const parentNode = oldNode.parentNode;
46
+ if (!parentNode) {
47
+ return null;
48
+ }
49
+ // If new VNode is null, just remove old node
50
+ if (newVNode === null || newVNode === undefined) {
51
+ dom.removeChild(parentNode, oldNode);
52
+ return null;
53
+ }
54
+ // Create new node(s)
55
+ const newNode = createRealNode(newVNode);
56
+ if (newNode) {
57
+ if (Array.isArray(newNode)) {
58
+ // Multiple nodes - insert all before oldNode, then remove oldNode
59
+ newNode.forEach(n => {
60
+ parentNode.insertBefore(n, oldNode);
61
+ });
62
+ parentNode.removeChild(oldNode);
63
+ }
64
+ else {
65
+ // Single node - replace directly
66
+ dom.replaceChild(parentNode, newNode, oldNode);
67
+ }
68
+ return newNode;
69
+ }
70
+ // If creation failed, remove old node
71
+ dom.removeChild(parentNode, oldNode);
72
+ return null;
73
+ }
74
+ /**
75
+ * Unmount node (DOM removal)
76
+ *
77
+ * @param node - DOM node or node array
78
+ */
79
+ export function unmount(node) {
80
+ if (Array.isArray(node)) {
81
+ node.forEach(n => {
82
+ if (n.parentNode) {
83
+ dom.removeChild(n.parentNode, n);
84
+ }
85
+ });
86
+ }
87
+ else {
88
+ if (node.parentNode) {
89
+ dom.removeChild(node.parentNode, node);
90
+ }
91
+ }
92
+ }
93
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,gDAAgD;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CACpB,KAAiB,EACjB,SAAkB;IAElB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,kBAAkB;QAClB,OAAO,SAAS,CAAC,UAAU,EAAE,CAAC;YAC5B,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gEAAgE;IAChE,cAAc,CAAC,KAAK,CAAC,CAAC;IAEtB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/B,0BAA0B;IAC1B,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,OAAa,EACb,QAAoB,EACpB,SAAiB;IAEjB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACtC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChD,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,kEAAkE;YAClE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBAClB,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;YACH,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,sCAAsC;IACtC,GAAG,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,IAAmB;IACzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACf,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBACjB,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YACnC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fukict/basic - Renderer: Activate Nodes
3
+ *
4
+ * Mount DOM nodes and trigger lifecycle hooks at mounting moment
5
+ */
6
+ import type { VNodeChild } from '../types/index.js';
7
+ type ActivateOptions = {
8
+ vnode: VNodeChild;
9
+ container: Element;
10
+ onMounted?: () => void;
11
+ } | {
12
+ vnode: VNodeChild;
13
+ placeholder: Comment;
14
+ onMounted?: () => void;
15
+ };
16
+ /**
17
+ * Strategy registry
18
+ */
19
+ /**
20
+ * Activate VNode: mount DOM and trigger lifecycle at mounting moment
21
+ *
22
+ * Two modes:
23
+ * 1. container mode: mount DOM to container (used by attach)
24
+ * 2. placeholder mode: replace placeholder with DOM (used by ClassComponent.mount)
25
+ *
26
+ * @param options - { vnode, container } or { vnode, placeholder }
27
+ */
28
+ export declare function activate(options: ActivateOptions): void;
29
+ export {};
30
+ //# sourceMappingURL=mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.d.ts","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAOV,UAAU,EACX,MAAM,mBAAmB,CAAC;AAG3B,KAAK,eAAe,GAChB;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,GACD;IACE,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AA0MN;;GAEG;AAQH;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAuCvD"}
@@ -0,0 +1,209 @@
1
+ import { VNodeType } from '../types/index.js';
2
+ /**
3
+ * Helper: Auto-activate ClassComponents in VNode tree
4
+ *
5
+ * For JSX natural mounting - placeholders are already in DOM.
6
+ * Recursively searches for ClassComponents, but stops at ClassComponent nodes
7
+ * (since they handle their own children).
8
+ */
9
+ function autoActivateClassComponentsInTree(vnode, _container) {
10
+ // Special handling for FunctionComponent: use __rendered__ instead of children
11
+ if (vnode.__type__ === VNodeType.FunctionComponent) {
12
+ const rendered = vnode.__rendered__;
13
+ if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
14
+ autoActivateClassComponentsInTree(rendered, _container);
15
+ }
16
+ return;
17
+ }
18
+ // For other node types (Element, Fragment), check children
19
+ if (vnode.children && Array.isArray(vnode.children)) {
20
+ for (const child of vnode.children) {
21
+ if (child && typeof child === 'object' && '__type__' in child) {
22
+ const childVNode = child;
23
+ // If child is a ClassComponent, activate it and stop recursion
24
+ if (childVNode.__type__ === VNodeType.ClassComponent) {
25
+ const instance = childVNode.__instance__;
26
+ const placeholder = childVNode.__placeholder__;
27
+ // Placeholder is already in DOM (from parent's createRealNode)
28
+ // Use placeholder replacement mounting
29
+ if (instance && placeholder && placeholder.parentNode) {
30
+ instance.mount(placeholder.parentNode, placeholder);
31
+ }
32
+ // Don't recurse into ClassComponent's children (it handles its own)
33
+ }
34
+ else {
35
+ // For other node types, recurse
36
+ autoActivateClassComponentsInTree(childVNode, _container);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Strategy: Activate ClassComponent
44
+ *
45
+ * Supports both container and placeholder modes:
46
+ * - container mode: for manual mounting via attach()
47
+ * - placeholder mode: for diff/replace operations
48
+ */
49
+ function activateClassComponent(ctx) {
50
+ const { vnode, container, placeholder, onMounted } = ctx;
51
+ const instance = vnode.__instance__;
52
+ if (!instance)
53
+ return;
54
+ // Determine which mode to use
55
+ if (placeholder && placeholder.parentNode) {
56
+ // Placeholder mode: replace placeholder with component DOM
57
+ onMounted?.();
58
+ instance.mount(placeholder.parentNode, placeholder);
59
+ }
60
+ else if (container) {
61
+ // Container mode: mount to container
62
+ onMounted?.();
63
+ instance.mount(container);
64
+ }
65
+ }
66
+ /**
67
+ * Strategy: Activate Element
68
+ */
69
+ function activateElement(ctx) {
70
+ const { vnode, container, placeholder, onMounted } = ctx;
71
+ const dom = vnode.__dom__;
72
+ const actualContainer = container || placeholder?.parentNode;
73
+ if (!actualContainer)
74
+ return;
75
+ // Mount or replace DOM
76
+ if (dom) {
77
+ if (placeholder && placeholder.parentNode) {
78
+ placeholder.parentNode.replaceChild(dom, placeholder);
79
+ }
80
+ else {
81
+ actualContainer.appendChild(dom);
82
+ }
83
+ }
84
+ onMounted?.();
85
+ // Auto-activate ClassComponent children (their placeholders are already in dom)
86
+ autoActivateClassComponentsInTree(vnode, dom);
87
+ }
88
+ /**
89
+ * Strategy: Activate Fragment
90
+ */
91
+ function activateFragment(ctx) {
92
+ const { vnode, container, placeholder, onMounted } = ctx;
93
+ const domArray = vnode.__dom__;
94
+ const actualContainer = container || placeholder?.parentNode;
95
+ if (!actualContainer)
96
+ return;
97
+ // Mount or replace DOM array
98
+ if (Array.isArray(domArray)) {
99
+ if (placeholder && placeholder.parentNode) {
100
+ // Replace mode: insert all before placeholder, then remove
101
+ domArray.forEach(node => {
102
+ placeholder.parentNode.insertBefore(node, placeholder);
103
+ });
104
+ placeholder.parentNode.removeChild(placeholder);
105
+ }
106
+ else {
107
+ // Mount mode: append all to container
108
+ domArray.forEach(node => actualContainer.appendChild(node));
109
+ }
110
+ }
111
+ onMounted?.();
112
+ // Auto-activate ClassComponent children (their placeholders are already in actualContainer)
113
+ autoActivateClassComponentsInTree(vnode, actualContainer);
114
+ }
115
+ /**
116
+ * Strategy: Activate FunctionComponent
117
+ */
118
+ function activateFunctionComponent(ctx) {
119
+ const { vnode, container, placeholder, onMounted } = ctx;
120
+ const dom = vnode.__dom__;
121
+ const actualContainer = container || placeholder?.parentNode;
122
+ if (!actualContainer)
123
+ return;
124
+ // Mount or replace DOM (can be single or array)
125
+ if (dom) {
126
+ if (placeholder && placeholder.parentNode) {
127
+ // Replace mode
128
+ if (Array.isArray(dom)) {
129
+ dom.forEach(node => {
130
+ placeholder.parentNode.insertBefore(node, placeholder);
131
+ });
132
+ placeholder.parentNode.removeChild(placeholder);
133
+ }
134
+ else {
135
+ placeholder.parentNode.replaceChild(dom, placeholder);
136
+ }
137
+ }
138
+ else {
139
+ // Mount mode
140
+ if (Array.isArray(dom)) {
141
+ dom.forEach(node => actualContainer.appendChild(node));
142
+ }
143
+ else {
144
+ actualContainer.appendChild(dom);
145
+ }
146
+ }
147
+ }
148
+ onMounted?.();
149
+ // Auto-activate all ClassComponents in __rendered__ tree
150
+ const rendered = vnode.__rendered__;
151
+ if (rendered && typeof rendered === 'object' && '__type__' in rendered) {
152
+ autoActivateClassComponentsInTree(rendered, actualContainer);
153
+ }
154
+ }
155
+ /**
156
+ * Strategy registry
157
+ */
158
+ // const strategies: Record<VNodeType, ActivateStrategy> = {
159
+ // [VNodeType.ClassComponent]: activateClassComponent,
160
+ // [VNodeType.Element]: activateElement,
161
+ // [VNodeType.Fragment]: activateFragment,
162
+ // [VNodeType.FunctionComponent]: activateFunctionComponent,
163
+ // };
164
+ /**
165
+ * Activate VNode: mount DOM and trigger lifecycle at mounting moment
166
+ *
167
+ * Two modes:
168
+ * 1. container mode: mount DOM to container (used by attach)
169
+ * 2. placeholder mode: replace placeholder with DOM (used by ClassComponent.mount)
170
+ *
171
+ * @param options - { vnode, container } or { vnode, placeholder }
172
+ */
173
+ export function activate(options) {
174
+ const { vnode, onMounted } = options;
175
+ const container = 'container' in options ? options.container : undefined;
176
+ const placeholder = 'placeholder' in options ? options.placeholder : undefined;
177
+ // Early return for invalid vnodes
178
+ if (!vnode || typeof vnode !== 'object' || !('__type__' in vnode)) {
179
+ return;
180
+ }
181
+ const vnodeObj = vnode;
182
+ switch (vnodeObj.__type__) {
183
+ case VNodeType.ClassComponent:
184
+ activateClassComponent({
185
+ vnode: vnodeObj,
186
+ container,
187
+ placeholder,
188
+ onMounted,
189
+ });
190
+ break;
191
+ case VNodeType.Element:
192
+ activateElement({ vnode: vnodeObj, container, placeholder, onMounted });
193
+ break;
194
+ case VNodeType.Fragment:
195
+ activateFragment({ vnode: vnodeObj, container, placeholder, onMounted });
196
+ break;
197
+ case VNodeType.FunctionComponent:
198
+ activateFunctionComponent({
199
+ vnode: vnodeObj,
200
+ container,
201
+ placeholder,
202
+ onMounted,
203
+ });
204
+ break;
205
+ default:
206
+ break;
207
+ }
208
+ }
209
+ //# sourceMappingURL=mount.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mount.js","sourceRoot":"","sources":["../../src/renderer/mount.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @fukict/basic - Class Component Type Definitions
3
+ *
4
+ * Types for Fukict class components (stateful, lifecycle, self-updating)
5
+ * Runtime implementation is in component-class/index.ts
6
+ */
7
+ import type { VNode, VNodeChild } from './core.js';
8
+ /**
9
+ * Slots object type
10
+ * Maps slot names to their content (single VNodeChild or array)
11
+ */
12
+ export type Slots = Record<string, VNodeChild | VNodeChild[]>;
13
+ /**
14
+ * Ref object type
15
+ * Holds a reference to a DOM element or component instance
16
+ */
17
+ export interface Ref<T = any> {
18
+ current: T | null;
19
+ }
20
+ /**
21
+ * Lifecycle hooks interface for Fukict class components
22
+ */
23
+ export interface FukictLifecycle<P extends Record<string, any> = any> {
24
+ /**
25
+ * Called after component is mounted to DOM
26
+ * Use for: DOM manipulation, event listeners, data fetching
27
+ */
28
+ mounted?(): void;
29
+ /**
30
+ * Called before component is unmounted from DOM
31
+ * Use for: cleanup, removing event listeners, canceling timers
32
+ */
33
+ beforeUnmount?(): void;
34
+ /**
35
+ * Called after component is updated (props changed or self-update)
36
+ * @param prevProps - Previous props before update
37
+ */
38
+ updated?(prevProps: P): void;
39
+ }
40
+ /**
41
+ * Fukict class component interface
42
+ *
43
+ * Type parameters:
44
+ * - P: Props type (extends Record<string, any>)
45
+ * - S: Slots type (extends Slots, default to Slots)
46
+ */
47
+ export interface FukictComponent<P extends Record<string, any> = {}, S extends Slots = Slots> extends FukictLifecycle<P> {
48
+ /** Component props (readonly) */
49
+ readonly props: P;
50
+ /** Extracted slots from children */
51
+ readonly slots: S;
52
+ /** Refs map (shared with framework and user) */
53
+ readonly refs: Map<string | symbol, Ref>;
54
+ /** Current rendered VNode (internal, framework use) */
55
+ __vnode__: VNode | null;
56
+ /** Parent DOM container (internal, framework use) */
57
+ __container__: Element | null;
58
+ /** Render method (must be implemented) */
59
+ render(): VNode;
60
+ /**
61
+ * Update component (props-driven update with built-in diff)
62
+ *
63
+ * Called by renderer when parent updates props.
64
+ * Can be overridden for custom update logic (e.g., shouldUpdate).
65
+ * Skipped when fukict:detach is set (props updated, but no re-render).
66
+ */
67
+ update(newProps: P): void;
68
+ /**
69
+ * Mount method (called by renderer after instance creation)
70
+ * @internal
71
+ */
72
+ mount(container: Element, placeholder?: Comment): void;
73
+ /** Unmount method (internal, framework use) */
74
+ unmount(): void;
75
+ }
76
+ /**
77
+ * Helper type to extract props type from Fukict component
78
+ */
79
+ export type FukictProps<T> = T extends FukictComponent<infer P, any> ? P : never;
80
+ /**
81
+ * Helper type to extract slots type from Fukict component
82
+ */
83
+ export type FukictSlots<T> = T extends FukictComponent<any, infer S> ? S : never;
84
+ /**
85
+ * Helper type for Fukict class constructor
86
+ */
87
+ export type FukictConstructor<P extends Record<string, any> = any, S extends Slots = Slots> = new (props: P, children?: VNodeChild[]) => FukictComponent<P, S>;
88
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../src/types/class.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEnD;;;GAGG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC,CAAC;AAE9D;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,GAAG;IAC1B,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG;IAClE;;;OAGG;IACH,OAAO,CAAC,IAAI,IAAI,CAAC;IAEjB;;;OAGG;IACH,aAAa,CAAC,IAAI,IAAI,CAAC;IAEvB;;;OAGG;IACH,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;;GAMG;AACH,MAAM,WAAW,eAAe,CAC9B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,EAClC,CAAC,SAAS,KAAK,GAAG,KAAK,CACvB,SAAQ,eAAe,CAAC,CAAC,CAAC;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,oCAAoC;IACpC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAElB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;IAEzC,uDAAuD;IACvD,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;IAExB,qDAAqD;IACrD,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAE9B,0CAA0C;IAC1C,MAAM,IAAI,KAAK,CAAC;IAEhB;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;IAE1B;;;OAGG;IACH,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAEvD,+CAA+C;IAC/C,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACvB,CAAC,SAAS,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EACnC,CAAC,SAAS,KAAK,GAAG,KAAK,IACrB,KAAK,KAAK,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../src/types/class.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @fukict/basic - Context Types
3
+ *
4
+ * Context system for passing data down the component tree
5
+ * without prop drilling. Context is stored on VNode tree with
6
+ * no global state.
7
+ */
8
+ /**
9
+ * Context definition
10
+ *
11
+ * Use Symbol or string as key for type-safe context.
12
+ * Symbol is recommended for production to avoid naming collisions.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * // contexts.ts
17
+ * export const THEME_CONTEXT = Symbol('theme');
18
+ * export interface ThemeContext {
19
+ * mode: 'light' | 'dark';
20
+ * color: string;
21
+ * }
22
+ * ```
23
+ */
24
+ export interface Context<T> {
25
+ key: string | symbol;
26
+ defaultValue?: T;
27
+ }
28
+ /**
29
+ * Context data structure on VNode
30
+ * @internal
31
+ */
32
+ export interface ContextData {
33
+ [key: string | symbol]: any;
34
+ __parent__?: ContextData;
35
+ }
36
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,CAAC,CAAC;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,GAAG,CAAC;IAC5B,UAAU,CAAC,EAAE,WAAW,CAAC;CAC1B"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fukict/basic - Context Types
3
+ *
4
+ * Context system for passing data down the component tree
5
+ * without prop drilling. Context is stored on VNode tree with
6
+ * no global state.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/types/context.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * @fukict/runtime - Core Type Definitions
3
+ *
4
+ * Core VNode and basic runtime types
5
+ */
6
+ import type { ContextData } from './context.js';
7
+ /**
8
+ * VNode child types - supports primitives, VNodes, and nested arrays
9
+ */
10
+ export type VNodeChild = VNode | string | number | boolean | null | undefined | VNodeChild[];
11
+ /**
12
+ * VNode type enum
13
+ */
14
+ export declare enum VNodeType {
15
+ Element = "element",
16
+ Fragment = "fragment",
17
+ FunctionComponent = "function",
18
+ ClassComponent = "class"
19
+ }
20
+ /**
21
+ * Base VNode properties (shared by all VNode types)
22
+ */
23
+ interface VNodeBase {
24
+ /** Props (including on: prefixed events) */
25
+ props: Record<string, any> | null;
26
+ /** Child VNodes */
27
+ children: VNodeChild[];
28
+ /**
29
+ * Detached flag
30
+ * When true, component won't be updated by parent
31
+ */
32
+ __detached__?: boolean;
33
+ /**
34
+ * Slot name for slot mechanism
35
+ */
36
+ __slot_name__?: string;
37
+ /**
38
+ * Context data (added in v3.1)
39
+ * Stores context chain for data passing without prop drilling
40
+ * @see {@link ContextData}
41
+ */
42
+ __context__?: ContextData;
43
+ }
44
+ /**
45
+ * Element VNode
46
+ * - type: string (tag name like 'div', 'span')
47
+ * - __dom__: Node (single DOM element)
48
+ */
49
+ export interface ElementVNode extends VNodeBase {
50
+ __type__: VNodeType.Element;
51
+ type: string;
52
+ __dom__?: Node | null;
53
+ }
54
+ /**
55
+ * Fragment VNode
56
+ * - type: Fragment symbol
57
+ * - __dom__: Node[] (all child nodes)
58
+ */
59
+ export interface FragmentVNode extends VNodeBase {
60
+ __type__: VNodeType.Fragment;
61
+ type: symbol;
62
+ __dom__?: Node[] | null;
63
+ }
64
+ /**
65
+ * Function Component VNode
66
+ * - type: Function
67
+ * - __rendered__: VNode (cached result of function call)
68
+ * - __dom__: Node | Node[] (depends on rendered result)
69
+ */
70
+ export interface FunctionComponentVNode extends VNodeBase {
71
+ __type__: VNodeType.FunctionComponent;
72
+ type: Function;
73
+ __rendered__?: VNode;
74
+ __dom__?: Node | Node[] | null;
75
+ }
76
+ /**
77
+ * Class Component VNode
78
+ * - type: Function (class constructor)
79
+ * - __instance__: FukictInstance (component instance)
80
+ * - __placeholder__: Comment node as placeholder for insertion position
81
+ * - __dom__: ❌ NOT USED (managed by instance)
82
+ */
83
+ export interface ClassComponentVNode extends VNodeBase {
84
+ __type__: VNodeType.ClassComponent;
85
+ type: Function;
86
+ __instance__?: any;
87
+ __placeholder__?: Comment;
88
+ }
89
+ /**
90
+ * VNode - Discriminated Union
91
+ *
92
+ * Use __type__ to narrow down to specific VNode type:
93
+ *
94
+ * ```typescript
95
+ * if (vnode.__type__ === VNodeType.Element) {
96
+ * // vnode is ElementVNode
97
+ * const element: Node = vnode.__dom__;
98
+ * } else if (vnode.__type__ === VNodeType.Fragment) {
99
+ * // vnode is FragmentVNode
100
+ * const nodes: Node[] = vnode.__dom__;
101
+ * } else if (vnode.__type__ === VNodeType.FunctionComponent) {
102
+ * // vnode is FunctionComponentVNode
103
+ * const rendered = vnode.__rendered__;
104
+ * } else if (vnode.__type__ === VNodeType.ClassComponent) {
105
+ * // vnode is ClassComponentVNode
106
+ * const instance = vnode.__instance__;
107
+ * }
108
+ * ```
109
+ */
110
+ export type VNode = ElementVNode | FragmentVNode | FunctionComponentVNode | ClassComponentVNode;
111
+ /**
112
+ * Fragment symbol for multiple root elements
113
+ */
114
+ export declare const Fragment: unique symbol;
115
+ /**
116
+ * Ref callback type
117
+ */
118
+ export type RefCallback<T extends Element = Element> = (element: T) => void;
119
+ /**
120
+ * Unregister function returned by registration APIs
121
+ */
122
+ export type UnregisterFn = () => void;
123
+ export {};
124
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD;;GAEG;AACH,MAAM,MAAM,UAAU,GAClB,KAAK,GACL,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,GACT,UAAU,EAAE,CAAC;AAEjB;;GAEG;AACH,oBAAY,SAAS;IACnB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,iBAAiB,aAAa;IAC9B,cAAc,UAAU;CACzB;AAED;;GAEG;AACH,UAAU,SAAS;IACjB,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAElC,mBAAmB;IACnB,QAAQ,EAAE,UAAU,EAAE,CAAC;IAEvB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,QAAQ,EAAE,SAAS,CAAC,OAAO,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACvB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,SAAS;IAC9C,QAAQ,EAAE,SAAS,CAAC,QAAQ,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,sBAAuB,SAAQ,SAAS;IACvD,QAAQ,EAAE,SAAS,CAAC,iBAAiB,CAAC;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,OAAO,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,mBAAoB,SAAQ,SAAS;IACpD,QAAQ,EAAE,SAAS,CAAC,cAAc,CAAC;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;CAE3B;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,MAAM,KAAK,GACb,YAAY,GACZ,aAAa,GACb,sBAAsB,GACtB,mBAAmB,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,QAAQ,eAAqB,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;AAE5E;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * VNode type enum
3
+ */
4
+ export var VNodeType;
5
+ (function (VNodeType) {
6
+ VNodeType["Element"] = "element";
7
+ VNodeType["Fragment"] = "fragment";
8
+ VNodeType["FunctionComponent"] = "function";
9
+ VNodeType["ClassComponent"] = "class";
10
+ })(VNodeType || (VNodeType = {}));
11
+ /**
12
+ * Fragment symbol for multiple root elements
13
+ */
14
+ export const Fragment = Symbol('Fragment');
15
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/types/core.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,gCAAmB,CAAA;IACnB,kCAAqB,CAAA;IACrB,2CAA8B,CAAA;IAC9B,qCAAwB,CAAA;AAC1B,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB;AA4GD;;GAEG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC"}