@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,61 @@
1
+ import * as dom from '../dom/index.js';
2
+ /**
3
+ * Set attributes on element
4
+ *
5
+ * @param element - DOM element
6
+ * @param props - Props object
7
+ * @param componentInstance - Optional component instance for fukict:ref
8
+ */
9
+ export function setAttributes(element, props, componentInstance) {
10
+ for (const [key, value] of Object.entries(props)) {
11
+ if (key === 'children') {
12
+ continue;
13
+ }
14
+ // Handle fukict:ref (class component refs)
15
+ if (key === 'fukict:ref' &&
16
+ typeof value === 'string' &&
17
+ componentInstance) {
18
+ // Register ref in component's refs Map
19
+ if (!componentInstance.refs.has(value)) {
20
+ componentInstance.refs.set(value, { current: null });
21
+ }
22
+ const ref = componentInstance.refs.get(value);
23
+ if (ref) {
24
+ ref.current = element;
25
+ }
26
+ continue;
27
+ }
28
+ // TODO: dom 应该统一处理流程
29
+ // Handle ref callback
30
+ if (key === 'ref' && typeof value === 'function') {
31
+ value(element);
32
+ continue;
33
+ }
34
+ // Handle events (on: prefix)
35
+ if (key.startsWith('on:')) {
36
+ const eventName = key.slice(3);
37
+ dom.addEventListener(element, eventName, value);
38
+ continue;
39
+ }
40
+ // Handle style object
41
+ if (key === 'style' && typeof value === 'object' && value !== null) {
42
+ for (const [styleKey, styleValue] of Object.entries(value)) {
43
+ dom.setStyle(element, styleKey, styleValue);
44
+ }
45
+ continue;
46
+ }
47
+ // Handle special properties
48
+ if (key === 'value' || key === 'checked' || key === 'selected') {
49
+ dom.setProperty(element, key, value);
50
+ continue;
51
+ }
52
+ // Handle class with enhanced support
53
+ if (key === 'class') {
54
+ dom.setClass(element, value);
55
+ continue;
56
+ }
57
+ // Default: set as attribute
58
+ dom.setAttribute(element, key, value);
59
+ }
60
+ }
61
+ //# sourceMappingURL=attributes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attributes.js","sourceRoot":"","sources":["../../src/renderer/attributes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAgB,EAChB,KAA8B,EAC9B,iBAA0B;IAE1B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QAED,2CAA2C;QAC3C,IACE,GAAG,KAAK,YAAY;YACpB,OAAO,KAAK,KAAK,QAAQ;YACzB,iBAAiB,EACjB,CAAC;YACD,uCAAuC;YACvC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvC,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9C,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;YACxB,CAAC;YACD,SAAS;QACX,CAAC;QAED,qBAAqB;QAErB,sBAAsB;QACtB,IAAI,GAAG,KAAK,KAAK,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAChD,KAAoC,CAAC,OAAO,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAsB,CAAC,CAAC;YACjE,SAAS;QACX,CAAC;QAED,sBAAsB;QACtB,IAAI,GAAG,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnE,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,QAAQ,CACV,OAAsB,EACtB,QAAQ,EACR,UAA6B,CAC9B,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,4BAA4B;QAC5B,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YAC/D,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAED,qCAAqC;QACrC,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,QAAQ,CACV,OAAO,EACP,KAAoD,CACrD,CAAC;YACF,SAAS;QACX,CAAC;QAED,4BAA4B;QAC5B,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fukict/basic - Renderer: Create Real Nodes
3
+ *
4
+ * Create real DOM nodes from VNode (supports Node | Node[] return)
5
+ */
6
+ import { Fukict } from '../component-class/fukict.js';
7
+ import type { VNode, VNodeChild } from '../types/index.js';
8
+ /**
9
+ * Create real DOM node(s) from VNode
10
+ *
11
+ * @param vnode - VNode or primitive (can be array from slots)
12
+ * @param componentInstance - Optional component instance for fukict:ref
13
+ * @returns Node | Node[] | null
14
+ * - Element: returns Node
15
+ * - Fragment: returns Node[]
16
+ * - Function Component: returns Node | Node[] (depends on rendered result)
17
+ * - Class Component: returns Comment placeholder
18
+ * - Primitives: returns Text Node
19
+ * - Array: returns Node[] (flattened)
20
+ */
21
+ export declare function createRealNode(vnode: VNodeChild, componentInstance?: Fukict): Node | Node[] | null;
22
+ /**
23
+ * Create element from VNode object
24
+ *
25
+ * @param vnode - VNode
26
+ * @param componentInstance - Optional component instance for fukict:ref
27
+ * @returns Node | Node[] | null
28
+ */
29
+ export declare function createElementFromVNode(vnode: VNode, componentInstance?: Fukict): Node | Node[] | null;
30
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAItD,OAAO,KAAK,EAGV,KAAK,EACL,UAAU,EACX,MAAM,mBAAmB,CAAC;AAI3B;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,UAAU,EACjB,iBAAiB,CAAC,EAAE,MAAM,GACzB,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAkCtB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,iBAAiB,CAAC,EAAE,MAAM,GACzB,IAAI,GAAG,IAAI,EAAE,GAAG,IAAI,CAkBtB"}
@@ -0,0 +1,223 @@
1
+ import { extractSlots } from '../component-class/slot.js';
2
+ import * as dom from '../dom/index.js';
3
+ import { VNodeType } from '../types/index.js';
4
+ import { setAttributes } from './attributes.js';
5
+ /**
6
+ * Create real DOM node(s) from VNode
7
+ *
8
+ * @param vnode - VNode or primitive (can be array from slots)
9
+ * @param componentInstance - Optional component instance for fukict:ref
10
+ * @returns Node | Node[] | null
11
+ * - Element: returns Node
12
+ * - Fragment: returns Node[]
13
+ * - Function Component: returns Node | Node[] (depends on rendered result)
14
+ * - Class Component: returns Comment placeholder
15
+ * - Primitives: returns Text Node
16
+ * - Array: returns Node[] (flattened)
17
+ */
18
+ export function createRealNode(vnode, componentInstance) {
19
+ // Handle arrays (e.g., from slots)
20
+ // Recursively flatten and render each item
21
+ if (Array.isArray(vnode)) {
22
+ const nodes = [];
23
+ for (const item of vnode) {
24
+ const node = createRealNode(item, componentInstance);
25
+ if (node) {
26
+ if (Array.isArray(node)) {
27
+ nodes.push(...node);
28
+ }
29
+ else {
30
+ nodes.push(node);
31
+ }
32
+ }
33
+ }
34
+ return nodes.length === 0 ? null : nodes;
35
+ }
36
+ // Filter out invalid values
37
+ if (vnode === null || vnode === undefined || typeof vnode === 'boolean') {
38
+ return null;
39
+ }
40
+ // Primitive values become text nodes
41
+ if (typeof vnode === 'string' || typeof vnode === 'number') {
42
+ return dom.createTextNode(String(vnode));
43
+ }
44
+ // VNode object - use discriminated union
45
+ if (typeof vnode === 'object' && '__type__' in vnode) {
46
+ return createElementFromVNode(vnode, componentInstance);
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * Create element from VNode object
52
+ *
53
+ * @param vnode - VNode
54
+ * @param componentInstance - Optional component instance for fukict:ref
55
+ * @returns Node | Node[] | null
56
+ */
57
+ export function createElementFromVNode(vnode, componentInstance) {
58
+ // Use discriminated union for type-safe rendering
59
+ switch (vnode.__type__) {
60
+ case VNodeType.Element:
61
+ return renderElement(vnode, componentInstance);
62
+ case VNodeType.Fragment:
63
+ return renderFragment(vnode, componentInstance);
64
+ case VNodeType.FunctionComponent:
65
+ return renderFunctionComponent(vnode, componentInstance);
66
+ case VNodeType.ClassComponent:
67
+ return renderClassComponent(vnode, componentInstance);
68
+ default:
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * Render Element VNode
74
+ * Returns single DOM node
75
+ */
76
+ function renderElement(vnode, componentInstance) {
77
+ // TypeScript now knows vnode is ElementVNode
78
+ if (vnode.__type__ !== VNodeType.Element) {
79
+ throw new Error('Expected ElementVNode');
80
+ }
81
+ const { type, props, children } = vnode;
82
+ const element = dom.createElement(type);
83
+ // Set attributes and events
84
+ if (props) {
85
+ setAttributes(element, props, componentInstance);
86
+ }
87
+ // Render children (pass component instance for nested fukict:ref)
88
+ if (Array.isArray(children)) {
89
+ for (const child of children) {
90
+ const node = createRealNode(child, componentInstance);
91
+ if (!node)
92
+ continue;
93
+ // node 可能是单个或数组
94
+ if (Array.isArray(node)) {
95
+ node.forEach(n => element.appendChild(n));
96
+ }
97
+ else {
98
+ element.appendChild(node);
99
+ }
100
+ }
101
+ }
102
+ else {
103
+ console.warn('Element vnode children is not an array:', vnode);
104
+ }
105
+ // 保存单个节点到 __dom__
106
+ vnode.__dom__ = element;
107
+ return element;
108
+ }
109
+ /**
110
+ * Render Fragment VNode
111
+ * Returns array of DOM nodes
112
+ */
113
+ function renderFragment(vnode, componentInstance) {
114
+ // TypeScript now knows vnode is FragmentVNode
115
+ if (vnode.__type__ !== VNodeType.Fragment) {
116
+ throw new Error('Expected FragmentVNode');
117
+ }
118
+ const { children } = vnode;
119
+ const nodes = [];
120
+ if (Array.isArray(children)) {
121
+ for (const child of children) {
122
+ const node = createRealNode(child, componentInstance);
123
+ if (!node)
124
+ continue;
125
+ // node 可能是单个 Node 或 Node[](嵌套 Fragment)
126
+ if (Array.isArray(node)) {
127
+ nodes.push(...node);
128
+ }
129
+ else {
130
+ nodes.push(node);
131
+ }
132
+ }
133
+ }
134
+ else {
135
+ console.warn('Element vnode children is not an array:', vnode);
136
+ }
137
+ // 保存所有节点到 __dom__
138
+ vnode.__dom__ = nodes;
139
+ return nodes;
140
+ }
141
+ /**
142
+ * Render Function Component VNode
143
+ * Returns Node | Node[] | null (depends on rendered result)
144
+ */
145
+ function renderFunctionComponent(vnode, componentInstance) {
146
+ // TypeScript now knows vnode is FunctionComponentVNode
147
+ if (vnode.__type__ !== VNodeType.FunctionComponent) {
148
+ throw new Error('Expected FunctionComponentVNode');
149
+ }
150
+ // Type assertion after runtime check
151
+ const funcVNode = vnode;
152
+ const { type, props, children } = funcVNode;
153
+ // Merge children into props (like React)
154
+ const propsWithChildren = {
155
+ ...props,
156
+ children: children.length === 1 ? children[0] : children,
157
+ };
158
+ // Call function component with proper typing
159
+ const funcComponent = type;
160
+ const rendered = funcComponent(propsWithChildren);
161
+ if (!rendered) {
162
+ funcVNode.__rendered__ = undefined;
163
+ funcVNode.__dom__ = null;
164
+ return null;
165
+ }
166
+ // Render result (pass component instance for nested fukict:ref)
167
+ const domNode = createRealNode(rendered, componentInstance);
168
+ // Save rendered VNode and DOM
169
+ funcVNode.__rendered__ = rendered;
170
+ funcVNode.__dom__ = domNode; // 可能是 Node 或 Node[]
171
+ return domNode;
172
+ }
173
+ /**
174
+ * Render Class Component VNode
175
+ * Returns Comment node as placeholder
176
+ */
177
+ function renderClassComponent(vnode, componentInstance) {
178
+ // TypeScript now knows vnode is ClassComponentVNode
179
+ if (vnode.__type__ !== VNodeType.ClassComponent) {
180
+ throw new Error('Expected ClassComponentVNode');
181
+ }
182
+ // Type assertion after runtime check
183
+ const classVNode = vnode;
184
+ const { type, props, children } = classVNode;
185
+ // 1. Create instance (only props)
186
+ // Type assertion is safe here because we know it's a class constructor
187
+ const ComponentClass = type;
188
+ const instance = new ComponentClass(props ?? {});
189
+ // 2. Extract and set slots from children
190
+ if (children) {
191
+ instance.slots = extractSlots(children);
192
+ }
193
+ // 3. Handle fukict:ref for class components
194
+ // If parent is a class component and this component has fukict:ref,
195
+ // register this instance to parent's refs
196
+ if (componentInstance && props && props['fukict:ref']) {
197
+ const refName = props['fukict:ref'];
198
+ if (typeof refName === 'string') {
199
+ // Create or update ref in parent component
200
+ if (!componentInstance.refs.has(refName)) {
201
+ componentInstance.refs.set(refName, { current: null });
202
+ }
203
+ const ref = componentInstance.refs.get(refName);
204
+ if (ref) {
205
+ ref.current = instance;
206
+ }
207
+ }
208
+ }
209
+ // 4. Save instance to vnode
210
+ classVNode.__instance__ = instance;
211
+ // 5. Save wrapper VNode to instance (for context traversal)
212
+ instance.__wrapper__ = classVNode;
213
+ // 6. Save parent instance reference on wrapper VNode (for context chain)
214
+ if (componentInstance) {
215
+ classVNode.__parentInstance__ = componentInstance;
216
+ }
217
+ // 7. Create comment placeholder with instance ID and name
218
+ const placeholder = dom.createComment(`fukict:${instance.__name__}#${instance.__id__}`);
219
+ // 8. Save placeholder to vnode
220
+ classVNode.__placeholder__ = placeholder;
221
+ return placeholder;
222
+ }
223
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/renderer/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @fukict/basic - Diff: Children
3
+ *
4
+ * Diff children arrays
5
+ */
6
+ import type { VNodeChild } from '../../types/index.js';
7
+ /**
8
+ * Diff children arrays
9
+ * Simplified algorithm without key-based optimization
10
+ */
11
+ export declare function diffChildren(oldChildren: VNodeChild[], newChildren: VNodeChild[], container: Element): void;
12
+ //# sourceMappingURL=children.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"children.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/children.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMvD;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,UAAU,EAAE,EACzB,SAAS,EAAE,OAAO,GACjB,IAAI,CAiDN"}
@@ -0,0 +1,55 @@
1
+ import { createRealNode } from '../create.js';
2
+ import { activate } from '../mount.js';
3
+ import { removeNode } from './helpers.js';
4
+ import { diff } from './index.js';
5
+ /**
6
+ * Diff children arrays
7
+ * Simplified algorithm without key-based optimization
8
+ */
9
+ export function diffChildren(oldChildren, newChildren, container) {
10
+ const oldLen = oldChildren.length;
11
+ const newLen = newChildren.length;
12
+ const commonLen = Math.min(oldLen, newLen);
13
+ // Diff common children
14
+ for (let i = 0; i < commonLen; i++) {
15
+ const oldChild = oldChildren[i];
16
+ const newChild = newChildren[i];
17
+ // Both are primitives - update text node directly
18
+ if ((typeof oldChild === 'string' || typeof oldChild === 'number') &&
19
+ (typeof newChild === 'string' || typeof newChild === 'number')) {
20
+ if (oldChild !== newChild) {
21
+ // Find the i-th text node in container
22
+ const childNodes = Array.from(container.childNodes);
23
+ if (childNodes[i] && childNodes[i].nodeType === Node.TEXT_NODE) {
24
+ childNodes[i].textContent = String(newChild);
25
+ }
26
+ }
27
+ }
28
+ else {
29
+ // VNode diff
30
+ diff(oldChild, newChild, container);
31
+ }
32
+ }
33
+ // Remove extra old children
34
+ if (oldLen > newLen) {
35
+ for (let i = commonLen; i < oldLen; i++) {
36
+ removeNode(oldChildren[i], container);
37
+ }
38
+ }
39
+ // Append new children
40
+ if (newLen > oldLen) {
41
+ for (let i = commonLen; i < newLen; i++) {
42
+ const node = createRealNode(newChildren[i]);
43
+ if (node) {
44
+ if (Array.isArray(node)) {
45
+ node.forEach(n => container.appendChild(n));
46
+ }
47
+ else {
48
+ container.appendChild(node);
49
+ }
50
+ activate({ vnode: newChildren[i], container });
51
+ }
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=children.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"children.js","sourceRoot":"","sources":["../../../src/renderer/diff/children.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,WAAyB,EACzB,WAAyB,EACzB,SAAkB;IAElB,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE3C,uBAAuB;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAEhC,kDAAkD;QAClD,IACE,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC;YAC9D,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC,EAC9D,CAAC;YACD,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC1B,uCAAuC;gBACvC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACpD,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;oBAC/D,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,aAAa;YACb,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,4BAA4B;IAC5B,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,IAAI,MAAM,GAAG,MAAM,EAAE,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,CAAC;gBACD,QAAQ,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { VNode } from '../../types/index.js';
2
+ /**
3
+ * Diff Class Component VNode
4
+ * - Call instance.update(newProps)
5
+ * - Handle detached mode (fukict:detach)
6
+ */
7
+ export declare function diffClassComponent(oldVNode: VNode, newVNode: VNode, container: Element): void;
8
+ //# sourceMappingURL=class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIvE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CAoCN"}
@@ -0,0 +1,38 @@
1
+ import { VNodeType } from '../../types/index.js';
2
+ import { replaceNode } from './helpers.js';
3
+ /**
4
+ * Diff Class Component VNode
5
+ * - Call instance.update(newProps)
6
+ * - Handle detached mode (fukict:detach)
7
+ */
8
+ export function diffClassComponent(oldVNode, newVNode, container) {
9
+ if (oldVNode.__type__ !== VNodeType.ClassComponent ||
10
+ newVNode.__type__ !== VNodeType.ClassComponent) {
11
+ throw new Error('Expected ClassComponentVNode');
12
+ }
13
+ // Type assertion after runtime check
14
+ const oldClassVNode = oldVNode;
15
+ const newClassVNode = newVNode;
16
+ // Class changed - replace entire component
17
+ if (oldClassVNode.type !== newClassVNode.type) {
18
+ replaceNode(oldClassVNode, newClassVNode, container);
19
+ return;
20
+ }
21
+ // Reuse instance
22
+ const instance = oldClassVNode.__instance__;
23
+ newClassVNode.__instance__ = instance;
24
+ // Check detached mode
25
+ if (newClassVNode.props && newClassVNode.props['fukict:detach']) {
26
+ // Detached mode: only update props, skip update()
27
+ if (instance) {
28
+ // Use same pattern as Fukict.update() - cast to bypass readonly
29
+ instance.props = newClassVNode.props;
30
+ }
31
+ return;
32
+ }
33
+ // Normal mode: call instance.update(newProps)
34
+ if (instance && typeof instance.update === 'function') {
35
+ instance.update(newClassVNode.props ?? {});
36
+ }
37
+ }
38
+ //# sourceMappingURL=class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"class.js","sourceRoot":"","sources":["../../../src/renderer/diff/class.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc;QAC9C,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,cAAc,EAC9C,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,qCAAqC;IACrC,MAAM,aAAa,GAAG,QAA+B,CAAC;IACtD,MAAM,aAAa,GAAG,QAA+B,CAAC;IAEtD,2CAA2C;IAC3C,IAAI,aAAa,CAAC,IAAI,KAAK,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9C,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG,aAAa,CAAC,YAA2C,CAAC;IAC3E,aAAa,CAAC,YAAY,GAAG,QAAQ,CAAC;IAEtC,sBAAsB;IACtB,IAAI,aAAa,CAAC,KAAK,IAAI,aAAa,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;QAChE,kDAAkD;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,gEAAgE;YAC/D,QAAQ,CAAC,KAA6B,GAAG,aAAa,CAAC,KAAK,CAAC;QAChE,CAAC;QACD,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,IAAI,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACtD,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fukict/basic - Diff: Element
3
+ *
4
+ * Diff element VNodes
5
+ */
6
+ import type { VNode } from '../../types/index.js';
7
+ /**
8
+ * Diff Element VNode
9
+ * - Reuse DOM node
10
+ * - Patch props
11
+ * - Recursively diff children
12
+ */
13
+ export declare function diffElement(oldVNode: VNode, newVNode: VNode, container: Element): void;
14
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAMlD;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA6BN"}
@@ -0,0 +1,34 @@
1
+ import { VNodeType } from '../../types/index.js';
2
+ import { diffChildren } from './children.js';
3
+ import { replaceNode } from './helpers.js';
4
+ import { patchProps } from './props.js';
5
+ /**
6
+ * Diff Element VNode
7
+ * - Reuse DOM node
8
+ * - Patch props
9
+ * - Recursively diff children
10
+ */
11
+ export function diffElement(oldVNode, newVNode, container) {
12
+ if (oldVNode.__type__ !== VNodeType.Element ||
13
+ newVNode.__type__ !== VNodeType.Element) {
14
+ throw new Error('Expected ElementVNode');
15
+ }
16
+ // Tag name changed - replace entire element
17
+ if (oldVNode.type !== newVNode.type) {
18
+ replaceNode(oldVNode, newVNode, container);
19
+ return;
20
+ }
21
+ // Reuse DOM element
22
+ const element = oldVNode.__dom__;
23
+ if (!element) {
24
+ // DOM doesn't exist, replace node
25
+ replaceNode(oldVNode, newVNode, container);
26
+ return;
27
+ }
28
+ newVNode.__dom__ = element;
29
+ // Patch props
30
+ patchProps(element, oldVNode.props, newVNode.props);
31
+ // Diff children
32
+ diffChildren(oldVNode.children, newVNode.children, element);
33
+ }
34
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../../../src/renderer/diff/element.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO;QACvC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,OAAO,EACvC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAC5C,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,oBAAoB;IACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAkB,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,kCAAkC;QAClC,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO;IACT,CAAC;IAED,QAAQ,CAAC,OAAO,GAAG,OAAO,CAAC;IAE3B,cAAc;IACd,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,gBAAgB;IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fukict/basic - Diff: Fragment
3
+ *
4
+ * Diff fragment VNodes
5
+ */
6
+ import type { VNode } from '../../types/index.js';
7
+ /**
8
+ * Diff Fragment VNode
9
+ * - Diff children array
10
+ * - Update __dom__ array
11
+ */
12
+ export declare function diffFragment(oldVNode: VNode, newVNode: VNode, container: Element): void;
13
+ //# sourceMappingURL=fragment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAIlD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA0BN"}
@@ -0,0 +1,32 @@
1
+ import { VNodeType } from '../../types/index.js';
2
+ import { diffChildren } from './children.js';
3
+ /**
4
+ * Diff Fragment VNode
5
+ * - Diff children array
6
+ * - Update __dom__ array
7
+ */
8
+ export function diffFragment(oldVNode, newVNode, container) {
9
+ if (oldVNode.__type__ !== VNodeType.Fragment ||
10
+ newVNode.__type__ !== VNodeType.Fragment) {
11
+ throw new Error('Expected FragmentVNode');
12
+ }
13
+ // Diff children
14
+ diffChildren(oldVNode.children, newVNode.children, container);
15
+ // Update __dom__ reference (collect all current child nodes)
16
+ const newNodes = [];
17
+ for (const child of newVNode.children) {
18
+ if (child && typeof child === 'object' && '__dom__' in child) {
19
+ const dom = child.__dom__;
20
+ if (dom) {
21
+ if (Array.isArray(dom)) {
22
+ newNodes.push(...dom);
23
+ }
24
+ else {
25
+ newNodes.push(dom);
26
+ }
27
+ }
28
+ }
29
+ }
30
+ newVNode.__dom__ = newNodes;
31
+ }
32
+ //# sourceMappingURL=fragment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../../src/renderer/diff/fragment.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAe,EACf,QAAe,EACf,SAAkB;IAElB,IACE,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ;QACxC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EACxC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,gBAAgB;IAChB,YAAY,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE9D,6DAA6D;IAC7D,MAAM,QAAQ,GAAW,EAAE,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC7D,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACR,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBACxB,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { VNode } from '../../types/index.js';
2
+ /**
3
+ * Diff Function Component VNode
4
+ * - Shallow compare props
5
+ * - Re-call function if props changed
6
+ * - Recursively diff __rendered__
7
+ */
8
+ export declare function diffFunctionComponent(oldVNode: VNode, newVNode: VNode, container: Element): void;
9
+ //# sourceMappingURL=function.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../../../src/renderer/diff/function.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,KAAK,EAEN,MAAM,sBAAsB,CAAC;AAK9B;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,KAAK,EACf,QAAQ,EAAE,KAAK,EACf,SAAS,EAAE,OAAO,GACjB,IAAI,CA4DN"}