@miurajs/miura-render 0.0.0 → 0.1.1

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 (262) hide show
  1. package/dist/index.d.ts +14 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +13 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/src/binding-manager/binding-manager.d.ts +30 -0
  6. package/dist/src/binding-manager/binding-manager.d.ts.map +1 -0
  7. package/dist/src/binding-manager/binding-manager.js +245 -0
  8. package/dist/src/binding-manager/binding-manager.js.map +1 -0
  9. package/dist/src/binding-manager/binding-type.d.ts +24 -0
  10. package/dist/src/binding-manager/binding-type.d.ts.map +1 -0
  11. package/dist/src/binding-manager/binding-type.js +25 -0
  12. package/dist/src/binding-manager/binding-type.js.map +1 -0
  13. package/dist/src/binding-manager/bindings/async-binding.d.ts +23 -0
  14. package/dist/src/binding-manager/bindings/async-binding.d.ts.map +1 -0
  15. package/dist/src/binding-manager/bindings/async-binding.js +67 -0
  16. package/dist/src/binding-manager/bindings/async-binding.js.map +1 -0
  17. package/dist/src/binding-manager/bindings/attribute-binding.d.ts +41 -0
  18. package/dist/src/binding-manager/bindings/attribute-binding.d.ts.map +1 -0
  19. package/dist/src/binding-manager/bindings/attribute-binding.js +79 -0
  20. package/dist/src/binding-manager/bindings/attribute-binding.js.map +1 -0
  21. package/dist/src/binding-manager/bindings/bind-binding.d.ts +30 -0
  22. package/dist/src/binding-manager/bindings/bind-binding.d.ts.map +1 -0
  23. package/dist/src/binding-manager/bindings/bind-binding.js +81 -0
  24. package/dist/src/binding-manager/bindings/bind-binding.js.map +1 -0
  25. package/dist/src/binding-manager/bindings/binding.d.ts +6 -0
  26. package/dist/src/binding-manager/bindings/binding.d.ts.map +1 -0
  27. package/dist/src/binding-manager/bindings/binding.js +2 -0
  28. package/dist/src/binding-manager/bindings/binding.js.map +1 -0
  29. package/dist/src/binding-manager/bindings/boolean-binding.d.ts +18 -0
  30. package/dist/src/binding-manager/bindings/boolean-binding.d.ts.map +1 -0
  31. package/dist/src/binding-manager/bindings/boolean-binding.js +65 -0
  32. package/dist/src/binding-manager/bindings/boolean-binding.js.map +1 -0
  33. package/dist/src/binding-manager/bindings/class-binding.d.ts +10 -0
  34. package/dist/src/binding-manager/bindings/class-binding.d.ts.map +1 -0
  35. package/dist/src/binding-manager/bindings/class-binding.js +68 -0
  36. package/dist/src/binding-manager/bindings/class-binding.js.map +1 -0
  37. package/dist/src/binding-manager/bindings/directive-binding.d.ts +15 -0
  38. package/dist/src/binding-manager/bindings/directive-binding.d.ts.map +1 -0
  39. package/dist/src/binding-manager/bindings/directive-binding.js +70 -0
  40. package/dist/src/binding-manager/bindings/directive-binding.js.map +1 -0
  41. package/dist/src/binding-manager/bindings/event-binding.d.ts +14 -0
  42. package/dist/src/binding-manager/bindings/event-binding.d.ts.map +1 -0
  43. package/dist/src/binding-manager/bindings/event-binding.js +73 -0
  44. package/dist/src/binding-manager/bindings/event-binding.js.map +1 -0
  45. package/dist/src/binding-manager/bindings/node-binding.d.ts +36 -0
  46. package/dist/src/binding-manager/bindings/node-binding.d.ts.map +1 -0
  47. package/dist/src/binding-manager/bindings/node-binding.js +235 -0
  48. package/dist/src/binding-manager/bindings/node-binding.js.map +1 -0
  49. package/dist/src/binding-manager/bindings/object-class-binding.d.ts +16 -0
  50. package/dist/src/binding-manager/bindings/object-class-binding.d.ts.map +1 -0
  51. package/dist/src/binding-manager/bindings/object-class-binding.js +42 -0
  52. package/dist/src/binding-manager/bindings/object-class-binding.js.map +1 -0
  53. package/dist/src/binding-manager/bindings/object-style-binding.d.ts +16 -0
  54. package/dist/src/binding-manager/bindings/object-style-binding.d.ts.map +1 -0
  55. package/dist/src/binding-manager/bindings/object-style-binding.js +38 -0
  56. package/dist/src/binding-manager/bindings/object-style-binding.js.map +1 -0
  57. package/dist/src/binding-manager/bindings/property-binding.d.ts +12 -0
  58. package/dist/src/binding-manager/bindings/property-binding.d.ts.map +1 -0
  59. package/dist/src/binding-manager/bindings/property-binding.js +44 -0
  60. package/dist/src/binding-manager/bindings/property-binding.js.map +1 -0
  61. package/dist/src/binding-manager/bindings/reference-binding.d.ts +14 -0
  62. package/dist/src/binding-manager/bindings/reference-binding.d.ts.map +1 -0
  63. package/dist/src/binding-manager/bindings/reference-binding.js +44 -0
  64. package/dist/src/binding-manager/bindings/reference-binding.js.map +1 -0
  65. package/dist/src/binding-manager/bindings/spread-binding.d.ts +16 -0
  66. package/dist/src/binding-manager/bindings/spread-binding.d.ts.map +1 -0
  67. package/dist/src/binding-manager/bindings/spread-binding.js +40 -0
  68. package/dist/src/binding-manager/bindings/spread-binding.js.map +1 -0
  69. package/dist/src/binding-manager/bindings/style-binding.d.ts +10 -0
  70. package/dist/src/binding-manager/bindings/style-binding.d.ts.map +1 -0
  71. package/dist/src/binding-manager/bindings/style-binding.js +44 -0
  72. package/dist/src/binding-manager/bindings/style-binding.js.map +1 -0
  73. package/dist/src/compiler/code-factory.d.ts +45 -0
  74. package/dist/src/compiler/code-factory.d.ts.map +1 -0
  75. package/dist/src/compiler/code-factory.js +211 -0
  76. package/dist/src/compiler/code-factory.js.map +1 -0
  77. package/dist/src/compiler/compiler.d.ts +77 -0
  78. package/dist/src/compiler/compiler.d.ts.map +1 -0
  79. package/dist/src/compiler/compiler.js +77 -0
  80. package/dist/src/compiler/compiler.js.map +1 -0
  81. package/dist/src/compiler/constants.d.ts +5 -0
  82. package/dist/src/compiler/constants.d.ts.map +1 -0
  83. package/dist/src/compiler/constants.js +9 -0
  84. package/dist/src/compiler/constants.js.map +1 -0
  85. package/dist/src/css-result.d.ts +27 -0
  86. package/dist/src/css-result.d.ts.map +1 -0
  87. package/dist/src/css-result.js +56 -0
  88. package/dist/src/css-result.js.map +1 -0
  89. package/dist/src/css.d.ts +26 -0
  90. package/dist/src/css.d.ts.map +1 -0
  91. package/dist/src/css.js +62 -0
  92. package/dist/src/css.js.map +1 -0
  93. package/dist/src/directives/animate.directive.d.ts +42 -0
  94. package/dist/src/directives/animate.directive.d.ts.map +1 -0
  95. package/dist/src/directives/animate.directive.js +349 -0
  96. package/dist/src/directives/animate.directive.js.map +1 -0
  97. package/dist/src/directives/await.d.ts +68 -0
  98. package/dist/src/directives/await.d.ts.map +1 -0
  99. package/dist/src/directives/await.js +70 -0
  100. package/dist/src/directives/await.js.map +1 -0
  101. package/dist/src/directives/choose.d.ts +28 -0
  102. package/dist/src/directives/choose.d.ts.map +1 -0
  103. package/dist/src/directives/choose.js +30 -0
  104. package/dist/src/directives/choose.js.map +1 -0
  105. package/dist/src/directives/decorator-example.d.ts +8 -0
  106. package/dist/src/directives/decorator-example.d.ts.map +1 -0
  107. package/dist/src/directives/decorator-example.js +32 -0
  108. package/dist/src/directives/decorator-example.js.map +1 -0
  109. package/dist/src/directives/decorators.d.ts +3 -0
  110. package/dist/src/directives/decorators.d.ts.map +1 -0
  111. package/dist/src/directives/decorators.js +17 -0
  112. package/dist/src/directives/decorators.js.map +1 -0
  113. package/dist/src/directives/directive-manager.d.ts +26 -0
  114. package/dist/src/directives/directive-manager.d.ts.map +1 -0
  115. package/dist/src/directives/directive-manager.js +114 -0
  116. package/dist/src/directives/directive-manager.js.map +1 -0
  117. package/dist/src/directives/directive.d.ts +38 -0
  118. package/dist/src/directives/directive.d.ts.map +1 -0
  119. package/dist/src/directives/directive.js +18 -0
  120. package/dist/src/directives/directive.js.map +1 -0
  121. package/dist/src/directives/focus.directive.d.ts +16 -0
  122. package/dist/src/directives/focus.directive.d.ts.map +1 -0
  123. package/dist/src/directives/focus.directive.js +29 -0
  124. package/dist/src/directives/focus.directive.js.map +1 -0
  125. package/dist/src/directives/gesture.directive.d.ts +58 -0
  126. package/dist/src/directives/gesture.directive.d.ts.map +1 -0
  127. package/dist/src/directives/gesture.directive.js +331 -0
  128. package/dist/src/directives/gesture.directive.js.map +1 -0
  129. package/dist/src/directives/index.d.ts +34 -0
  130. package/dist/src/directives/index.d.ts.map +1 -0
  131. package/dist/src/directives/index.js +35 -0
  132. package/dist/src/directives/index.js.map +1 -0
  133. package/dist/src/directives/intersection.directive.d.ts +18 -0
  134. package/dist/src/directives/intersection.directive.d.ts.map +1 -0
  135. package/dist/src/directives/intersection.directive.js +50 -0
  136. package/dist/src/directives/intersection.directive.js.map +1 -0
  137. package/dist/src/directives/keyed-diff.d.ts +30 -0
  138. package/dist/src/directives/keyed-diff.d.ts.map +1 -0
  139. package/dist/src/directives/keyed-diff.js +185 -0
  140. package/dist/src/directives/keyed-diff.js.map +1 -0
  141. package/dist/src/directives/lazy-setup.d.ts +3 -0
  142. package/dist/src/directives/lazy-setup.d.ts.map +1 -0
  143. package/dist/src/directives/lazy-setup.js +55 -0
  144. package/dist/src/directives/lazy-setup.js.map +1 -0
  145. package/dist/src/directives/lazy.directive.d.ts +19 -0
  146. package/dist/src/directives/lazy.directive.d.ts.map +1 -0
  147. package/dist/src/directives/lazy.directive.js +73 -0
  148. package/dist/src/directives/lazy.directive.js.map +1 -0
  149. package/dist/src/directives/media.directive.d.ts +31 -0
  150. package/dist/src/directives/media.directive.d.ts.map +1 -0
  151. package/dist/src/directives/media.directive.js +105 -0
  152. package/dist/src/directives/media.directive.js.map +1 -0
  153. package/dist/src/directives/mutation.directive.d.ts +11 -0
  154. package/dist/src/directives/mutation.directive.d.ts.map +1 -0
  155. package/dist/src/directives/mutation.directive.js +56 -0
  156. package/dist/src/directives/mutation.directive.js.map +1 -0
  157. package/dist/src/directives/repeat.d.ts +50 -0
  158. package/dist/src/directives/repeat.d.ts.map +1 -0
  159. package/dist/src/directives/repeat.js +47 -0
  160. package/dist/src/directives/repeat.js.map +1 -0
  161. package/dist/src/directives/resize.directive.d.ts +14 -0
  162. package/dist/src/directives/resize.directive.d.ts.map +1 -0
  163. package/dist/src/directives/resize.directive.js +81 -0
  164. package/dist/src/directives/resize.directive.js.map +1 -0
  165. package/dist/src/directives/setup.d.ts +9 -0
  166. package/dist/src/directives/setup.d.ts.map +1 -0
  167. package/dist/src/directives/setup.js +9 -0
  168. package/dist/src/directives/setup.js.map +1 -0
  169. package/dist/src/directives/structural/async.directive.d.ts +39 -0
  170. package/dist/src/directives/structural/async.directive.d.ts.map +1 -0
  171. package/dist/src/directives/structural/async.directive.js +115 -0
  172. package/dist/src/directives/structural/async.directive.js.map +1 -0
  173. package/dist/src/directives/structural/for.directive.d.ts +37 -0
  174. package/dist/src/directives/structural/for.directive.d.ts.map +1 -0
  175. package/dist/src/directives/structural/for.directive.js +209 -0
  176. package/dist/src/directives/structural/for.directive.js.map +1 -0
  177. package/dist/src/directives/structural/if.directive.d.ts +54 -0
  178. package/dist/src/directives/structural/if.directive.d.ts.map +1 -0
  179. package/dist/src/directives/structural/if.directive.js +210 -0
  180. package/dist/src/directives/structural/if.directive.js.map +1 -0
  181. package/dist/src/directives/structural/structural.directive.d.ts +11 -0
  182. package/dist/src/directives/structural/structural.directive.d.ts.map +1 -0
  183. package/dist/src/directives/structural/structural.directive.js +29 -0
  184. package/dist/src/directives/structural/structural.directive.js.map +1 -0
  185. package/dist/src/directives/structural/switch.directive.d.ts +12 -0
  186. package/dist/src/directives/structural/switch.directive.d.ts.map +1 -0
  187. package/dist/src/directives/structural/switch.directive.js +69 -0
  188. package/dist/src/directives/structural/switch.directive.js.map +1 -0
  189. package/dist/src/directives/structural/virtual-scroll.directive.d.ts +50 -0
  190. package/dist/src/directives/structural/virtual-scroll.directive.d.ts.map +1 -0
  191. package/dist/src/directives/structural/virtual-scroll.directive.js +165 -0
  192. package/dist/src/directives/structural/virtual-scroll.directive.js.map +1 -0
  193. package/dist/src/directives/utils.d.ts +61 -0
  194. package/dist/src/directives/utils.d.ts.map +1 -0
  195. package/dist/src/directives/utils.js +121 -0
  196. package/dist/src/directives/utils.js.map +1 -0
  197. package/dist/src/directives/validate.directive.d.ts +41 -0
  198. package/dist/src/directives/validate.directive.d.ts.map +1 -0
  199. package/dist/src/directives/validate.directive.js +161 -0
  200. package/dist/src/directives/validate.directive.js.map +1 -0
  201. package/dist/src/directives/virtual-scroll.d.ts +91 -0
  202. package/dist/src/directives/virtual-scroll.d.ts.map +1 -0
  203. package/dist/src/directives/virtual-scroll.js +78 -0
  204. package/dist/src/directives/virtual-scroll.js.map +1 -0
  205. package/dist/src/directives/when.d.ts +24 -0
  206. package/dist/src/directives/when.d.ts.map +1 -0
  207. package/dist/src/directives/when.js +25 -0
  208. package/dist/src/directives/when.js.map +1 -0
  209. package/dist/src/html.d.ts +23 -0
  210. package/dist/src/html.d.ts.map +1 -0
  211. package/dist/src/html.js +37 -0
  212. package/dist/src/html.js.map +1 -0
  213. package/dist/src/modifiers/capture-modifier.d.ts +6 -0
  214. package/dist/src/modifiers/capture-modifier.d.ts.map +1 -0
  215. package/dist/src/modifiers/capture-modifier.js +14 -0
  216. package/dist/src/modifiers/capture-modifier.js.map +1 -0
  217. package/dist/src/modifiers/event-modifiers.d.ts +38 -0
  218. package/dist/src/modifiers/event-modifiers.d.ts.map +1 -0
  219. package/dist/src/modifiers/event-modifiers.js +90 -0
  220. package/dist/src/modifiers/event-modifiers.js.map +1 -0
  221. package/dist/src/modifiers/key-modifiers.d.ts +8 -0
  222. package/dist/src/modifiers/key-modifiers.d.ts.map +1 -0
  223. package/dist/src/modifiers/key-modifiers.js +29 -0
  224. package/dist/src/modifiers/key-modifiers.js.map +1 -0
  225. package/dist/src/modifiers/mouse-modifiers.d.ts +8 -0
  226. package/dist/src/modifiers/mouse-modifiers.d.ts.map +1 -0
  227. package/dist/src/modifiers/mouse-modifiers.js +15 -0
  228. package/dist/src/modifiers/mouse-modifiers.js.map +1 -0
  229. package/dist/src/modifiers/once-modifier.d.ts +6 -0
  230. package/dist/src/modifiers/once-modifier.d.ts.map +1 -0
  231. package/dist/src/modifiers/once-modifier.js +11 -0
  232. package/dist/src/modifiers/once-modifier.js.map +1 -0
  233. package/dist/src/modifiers/passive-modifier.d.ts +6 -0
  234. package/dist/src/modifiers/passive-modifier.d.ts.map +1 -0
  235. package/dist/src/modifiers/passive-modifier.js +14 -0
  236. package/dist/src/modifiers/passive-modifier.js.map +1 -0
  237. package/dist/src/processor/parser.d.ts +74 -0
  238. package/dist/src/processor/parser.d.ts.map +1 -0
  239. package/dist/src/processor/parser.js +345 -0
  240. package/dist/src/processor/parser.js.map +1 -0
  241. package/dist/src/processor/processor.d.ts +68 -0
  242. package/dist/src/processor/processor.d.ts.map +1 -0
  243. package/dist/src/processor/processor.js +138 -0
  244. package/dist/src/processor/processor.js.map +1 -0
  245. package/dist/src/processor/template-result.d.ts +74 -0
  246. package/dist/src/processor/template-result.d.ts.map +1 -0
  247. package/dist/src/processor/template-result.js +53 -0
  248. package/dist/src/processor/template-result.js.map +1 -0
  249. package/dist/src/processor/types.d.ts +16 -0
  250. package/dist/src/processor/types.d.ts.map +1 -0
  251. package/dist/src/processor/types.js +13 -0
  252. package/dist/src/processor/types.js.map +1 -0
  253. package/dist/src/utils/debug.d.ts +7 -0
  254. package/dist/src/utils/debug.d.ts.map +1 -0
  255. package/dist/src/utils/debug.js +7 -0
  256. package/dist/src/utils/debug.js.map +1 -0
  257. package/dist/src/utils/performance.d.ts +50 -0
  258. package/dist/src/utils/performance.d.ts.map +1 -0
  259. package/dist/src/utils/performance.js +51 -0
  260. package/dist/src/utils/performance.js.map +1 -0
  261. package/dist/tsconfig.tsbuildinfo +1 -0
  262. package/package.json +8 -10
@@ -0,0 +1,185 @@
1
+ // ── LIS-based keyed diff (ported from Miura) ────────────────────
2
+ /**
3
+ * Compute the indexes of the Longest Increasing Subsequence within
4
+ * `values`. Entries < 0 are treated as "new" and skipped.
5
+ * O(n log n) via patience-sorting.
6
+ */
7
+ function longestIncreasingSubsequenceIndexes(values) {
8
+ const predecessors = new Array(values.length).fill(-1);
9
+ const pileTops = [];
10
+ const pileTopIndexes = [];
11
+ for (let i = 0; i < values.length; i++) {
12
+ const value = values[i];
13
+ if (value < 0)
14
+ continue; // new item, no previous position
15
+ let left = 0;
16
+ let right = pileTops.length;
17
+ while (left < right) {
18
+ const mid = (left + right) >> 1;
19
+ if (value <= pileTops[mid]) {
20
+ right = mid;
21
+ }
22
+ else {
23
+ left = mid + 1;
24
+ }
25
+ }
26
+ if (left === pileTops.length) {
27
+ pileTops.push(value);
28
+ pileTopIndexes.push(i);
29
+ }
30
+ else {
31
+ pileTops[left] = value;
32
+ pileTopIndexes[left] = i;
33
+ }
34
+ if (left > 0) {
35
+ predecessors[i] = pileTopIndexes[left - 1];
36
+ }
37
+ }
38
+ const result = [];
39
+ if (pileTopIndexes.length === 0)
40
+ return result;
41
+ let cursor = pileTopIndexes[pileTopIndexes.length - 1];
42
+ for (let i = pileTopIndexes.length - 1; i >= 0; i--) {
43
+ result[i] = cursor;
44
+ cursor = predecessors[cursor];
45
+ }
46
+ return result;
47
+ }
48
+ /**
49
+ * Manages keyed list reconciliation for a NodeBinding.
50
+ * Uses an LIS-based algorithm to compute the minimal set of DOM
51
+ * moves required to reorder existing items, while reusing
52
+ * TemplateInstance objects and only creating/removing as needed.
53
+ */
54
+ export class KeyedListState {
55
+ startMarker;
56
+ endMarker;
57
+ processor;
58
+ items = [];
59
+ keyMap = new Map();
60
+ constructor(startMarker, endMarker, processor) {
61
+ this.startMarker = startMarker;
62
+ this.endMarker = endMarker;
63
+ this.processor = processor;
64
+ }
65
+ /**
66
+ * Reconcile the DOM to reflect a new RepeatResult.
67
+ *
68
+ * 1. Compute new keys & detect removals.
69
+ * 2. Reuse or create TemplateInstances per key.
70
+ * 3. Use LIS on the old→new position mapping to find items
71
+ * that can stay in place (the longest already-ordered run).
72
+ * 4. Move only the items not in the LIS.
73
+ */
74
+ async update(result) {
75
+ const { items: newData, keyFn, templateFn } = result;
76
+ const parent = this.endMarker.parentNode;
77
+ // ── 1. Compute new keys ─────────────────────────────────
78
+ const newKeys = [];
79
+ const newKeySet = new Set();
80
+ for (let i = 0; i < newData.length; i++) {
81
+ const key = keyFn(newData[i], i);
82
+ if (newKeySet.has(key)) {
83
+ console.warn(`[miura][repeat] Duplicate key: ${String(key)}. Items may not reconcile correctly.`);
84
+ }
85
+ newKeys.push(key);
86
+ newKeySet.add(key);
87
+ }
88
+ // ── 2. Remove items whose keys are gone ─────────────────
89
+ for (const [key, item] of this.keyMap) {
90
+ if (!newKeySet.has(key)) {
91
+ this.removeItem(item);
92
+ this.keyMap.delete(key);
93
+ }
94
+ }
95
+ // ── 3. Build old-key→old-index map ──────────────────────
96
+ const oldKeyToIndex = new Map();
97
+ for (let i = 0; i < this.items.length; i++) {
98
+ if (this.keyMap.has(this.items[i].key)) {
99
+ oldKeyToIndex.set(this.items[i].key, i);
100
+ }
101
+ }
102
+ // ── 4. Reuse or create items ────────────────────────────
103
+ const newItemsList = new Array(newData.length);
104
+ const positions = new Array(newData.length);
105
+ const createPromises = [];
106
+ for (let i = 0; i < newData.length; i++) {
107
+ const key = newKeys[i];
108
+ const existing = this.keyMap.get(key);
109
+ if (existing) {
110
+ // Reuse — update values
111
+ const templateResult = templateFn(newData[i], i);
112
+ await existing.instance.update(templateResult.values, { item: newData[i], index: i });
113
+ newItemsList[i] = existing;
114
+ positions[i] = oldKeyToIndex.get(key) ?? -1;
115
+ }
116
+ else {
117
+ // Will create below
118
+ const templateResult = templateFn(newData[i], i);
119
+ createPromises.push({
120
+ idx: i,
121
+ promise: this.processor.createInstance(templateResult, { item: newData[i], index: i })
122
+ });
123
+ positions[i] = -1; // new item
124
+ }
125
+ }
126
+ // Await creations
127
+ for (const { idx, promise } of createPromises) {
128
+ const instance = await promise;
129
+ const fragment = instance.getFragment();
130
+ const nodes = Array.from(fragment.childNodes);
131
+ newItemsList[idx] = { key: newKeys[idx], instance, nodes };
132
+ }
133
+ // ── 5. LIS — find items that can stay in place ──────────
134
+ const lisIndexes = longestIncreasingSubsequenceIndexes(positions);
135
+ const lisSet = new Set(lisIndexes);
136
+ // ── 6. Apply DOM moves ──────────────────────────────────
137
+ // Items in the LIS are already in correct relative order.
138
+ // Everything else needs to be inserted at the right position.
139
+ // Walk backwards from the end: maintain a `nextSibling` reference.
140
+ let nextSibling = this.endMarker;
141
+ for (let i = newItemsList.length - 1; i >= 0; i--) {
142
+ const item = newItemsList[i];
143
+ const nodes = item.nodes;
144
+ if (nodes.length === 0)
145
+ continue;
146
+ if (lisSet.has(i)) {
147
+ // This item can stay — but verify it's actually in the DOM
148
+ // and update nextSibling reference.
149
+ if (nodes[0].parentNode === parent) {
150
+ nextSibling = nodes[0];
151
+ continue;
152
+ }
153
+ }
154
+ // Move or insert all nodes for this item
155
+ for (let j = nodes.length - 1; j >= 0; j--) {
156
+ parent.insertBefore(nodes[j], nextSibling);
157
+ nextSibling = nodes[j];
158
+ }
159
+ }
160
+ // ── 7. Update internal state ────────────────────────────
161
+ this.items = newItemsList;
162
+ this.keyMap = new Map();
163
+ for (const item of newItemsList) {
164
+ this.keyMap.set(item.key, item);
165
+ }
166
+ }
167
+ removeItem(item) {
168
+ item.instance.disconnect();
169
+ for (const node of item.nodes) {
170
+ node.parentNode?.removeChild(node);
171
+ }
172
+ item.nodes = [];
173
+ }
174
+ clear() {
175
+ for (const item of this.items) {
176
+ this.removeItem(item);
177
+ }
178
+ this.items = [];
179
+ this.keyMap.clear();
180
+ }
181
+ disconnect() {
182
+ this.clear();
183
+ }
184
+ }
185
+ //# sourceMappingURL=keyed-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyed-diff.js","sourceRoot":"","sources":["../../../src/directives/keyed-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { DirectiveManager } from './directive-manager';
2
+ export { DirectiveManager };
3
+ //# sourceMappingURL=lazy-setup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-setup.d.ts","sourceRoot":"","sources":["../../../src/directives/lazy-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAgEvD,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { DirectiveManager } from './directive-manager';
2
+ import { IfDirective, ElseIfDirective } from './structural/if.directive';
3
+ import { ForDirective } from './structural/for.directive';
4
+ import { SwitchDirective } from './structural/switch.directive';
5
+ import { VirtualScrollDirective } from './structural/virtual-scroll.directive';
6
+ import { AsyncDirective } from './structural/async.directive';
7
+ // Initialize core structural directives (always loaded)
8
+ DirectiveManager.initialize({
9
+ 'if': IfDirective,
10
+ 'elseif': ElseIfDirective,
11
+ 'for': ForDirective,
12
+ 'switch': SwitchDirective,
13
+ 'virtualScroll': VirtualScrollDirective,
14
+ 'async': AsyncDirective
15
+ });
16
+ // Register utility directives as lazy loadable
17
+ DirectiveManager.registerLazyDirective('resize', async () => {
18
+ const { ResizeDirective } = await import('./resize.directive');
19
+ return ResizeDirective;
20
+ });
21
+ DirectiveManager.registerLazyDirective('intersect', async () => {
22
+ const { IntersectionDirective } = await import('./intersection.directive');
23
+ return IntersectionDirective;
24
+ });
25
+ DirectiveManager.registerLazyDirective('focus', async () => {
26
+ const { FocusDirective } = await import('./focus.directive');
27
+ return FocusDirective;
28
+ });
29
+ DirectiveManager.registerLazyDirective('mutation', async () => {
30
+ const { MutationDirective } = await import('./mutation.directive');
31
+ return MutationDirective;
32
+ });
33
+ DirectiveManager.registerLazyDirective('lazy', async () => {
34
+ const { LazyDirective } = await import('./lazy.directive');
35
+ return LazyDirective;
36
+ });
37
+ DirectiveManager.registerLazyDirective('animate', async () => {
38
+ const { AnimateDirective } = await import('./animate.directive');
39
+ return AnimateDirective;
40
+ });
41
+ DirectiveManager.registerLazyDirective('validate', async () => {
42
+ const { ValidateDirective } = await import('./validate.directive');
43
+ return ValidateDirective;
44
+ });
45
+ DirectiveManager.registerLazyDirective('media', async () => {
46
+ const { MediaDirective } = await import('./media.directive');
47
+ return MediaDirective;
48
+ });
49
+ DirectiveManager.registerLazyDirective('gesture', async () => {
50
+ const { GestureDirective } = await import('./gesture.directive');
51
+ return GestureDirective;
52
+ });
53
+ // Export for manual initialization if needed
54
+ export { DirectiveManager };
55
+ //# sourceMappingURL=lazy-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy-setup.js","sourceRoot":"","sources":["../../../src/directives/lazy-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,wDAAwD;AACxD,gBAAgB,CAAC,UAAU,CAAC;IAC1B,IAAI,EAAE,WAAW;IACjB,QAAQ,EAAE,eAAe;IACzB,KAAK,EAAE,YAAY;IACnB,QAAQ,EAAE,eAAe;IACzB,eAAe,EAAE,sBAAsB;IACvC,OAAO,EAAE,cAAc;CACxB,CAAC,CAAC;AAEH,+CAA+C;AAC/C,gBAAgB,CAAC,qBAAqB,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAC/D,OAAO,eAAe,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,WAAW,EAAE,KAAK,IAAI,EAAE;IAC7D,MAAM,EAAE,qBAAqB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;IAC3E,OAAO,qBAAqB,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC7D,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACnE,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE;IACxD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC3D,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjE,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;IAC5D,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;IACnE,OAAO,iBAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE;IACzD,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC7D,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,gBAAgB,CAAC,qBAAqB,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;IAC3D,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjE,OAAO,gBAAgB,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,6CAA6C;AAC7C,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { BaseDirective } from './directive';
2
+ interface LazyOptions {
3
+ threshold?: number;
4
+ placeholder?: string;
5
+ onLoad?: () => void;
6
+ onError?: (error: Error) => void;
7
+ rootMargin?: string;
8
+ }
9
+ export declare class LazyDirective extends BaseDirective {
10
+ private options;
11
+ private observer;
12
+ private isLoaded;
13
+ mount(element: Element): void;
14
+ private loadContent;
15
+ update(options: LazyOptions): void;
16
+ unmount(): void;
17
+ }
18
+ export {};
19
+ //# sourceMappingURL=lazy.directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.directive.d.ts","sourceRoot":"","sources":["../../../src/directives/lazy.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,WAAW;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAc,SAAQ,aAAa;IAC5C,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,QAAQ,CAAS;IAEzB,KAAK,CAAC,OAAO,EAAE,OAAO;IAgCtB,OAAO,CAAC,WAAW;IAmCnB,MAAM,CAAC,OAAO,EAAE,WAAW;IAI3B,OAAO;CAOV"}
@@ -0,0 +1,73 @@
1
+ import { BaseDirective } from './directive';
2
+ import { debugLog } from '../utils/debug';
3
+ export class LazyDirective extends BaseDirective {
4
+ options = {};
5
+ observer = null;
6
+ isLoaded = false;
7
+ mount(element) {
8
+ debugLog('lazy', 'Mounting lazy directive');
9
+ this.options = {
10
+ threshold: 0.1,
11
+ rootMargin: '50px',
12
+ ...this.options
13
+ };
14
+ // Set placeholder if provided
15
+ if (this.options.placeholder && element instanceof HTMLImageElement) {
16
+ element.src = this.options.placeholder;
17
+ }
18
+ // Create intersection observer
19
+ this.observer = new IntersectionObserver((entries) => {
20
+ entries.forEach((entry) => {
21
+ if (entry.isIntersecting && !this.isLoaded) {
22
+ this.loadContent(element);
23
+ }
24
+ });
25
+ }, {
26
+ threshold: this.options.threshold,
27
+ rootMargin: this.options.rootMargin
28
+ });
29
+ this.observer.observe(element);
30
+ }
31
+ loadContent(element) {
32
+ debugLog('lazy', 'Loading lazy content');
33
+ if (element instanceof HTMLImageElement) {
34
+ const originalSrc = element.dataset.src || element.src;
35
+ if (originalSrc && originalSrc !== this.options.placeholder) {
36
+ element.src = originalSrc;
37
+ element.onload = () => {
38
+ this.isLoaded = true;
39
+ this.options.onLoad?.();
40
+ debugLog('lazy', 'Image loaded successfully');
41
+ };
42
+ element.onerror = (error) => {
43
+ this.options.onError?.(new Error('Failed to load image'));
44
+ debugLog('lazy', 'Image failed to load', error);
45
+ };
46
+ }
47
+ }
48
+ else if (element instanceof HTMLIFrameElement) {
49
+ const originalSrc = element.dataset.src || element.src;
50
+ if (originalSrc && originalSrc !== this.options.placeholder) {
51
+ element.src = originalSrc;
52
+ this.isLoaded = true;
53
+ this.options.onLoad?.();
54
+ }
55
+ }
56
+ else {
57
+ // For other elements, trigger load callback
58
+ this.isLoaded = true;
59
+ this.options.onLoad?.();
60
+ }
61
+ }
62
+ update(options) {
63
+ this.options = { ...this.options, ...options };
64
+ }
65
+ unmount() {
66
+ if (this.observer) {
67
+ this.observer.disconnect();
68
+ this.observer = null;
69
+ }
70
+ this.isLoaded = false;
71
+ }
72
+ }
73
+ //# sourceMappingURL=lazy.directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazy.directive.js","sourceRoot":"","sources":["../../../src/directives/lazy.directive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { BaseDirective } from './directive';
2
+ interface MediaBreakpoints {
3
+ mobile?: () => string;
4
+ tablet?: () => string;
5
+ desktop?: () => string;
6
+ [key: string]: (() => string) | undefined;
7
+ }
8
+ interface MediaOptions {
9
+ breakpoints?: MediaBreakpoints;
10
+ defaultBreakpoint?: string;
11
+ onBreakpointChange?: (breakpoint: string) => void;
12
+ }
13
+ export declare class MediaDirective extends BaseDirective {
14
+ private options;
15
+ private currentBreakpoint;
16
+ private mediaQueries;
17
+ private breakpointHandlers;
18
+ mount(element: Element): void;
19
+ private setupMediaQueries;
20
+ private updateContent;
21
+ update(options: MediaOptions): void;
22
+ private cleanup;
23
+ unmount(): void;
24
+ getCurrentBreakpoint(): string;
25
+ isBreakpoint(breakpoint: string): boolean;
26
+ isMobile(): boolean;
27
+ isTablet(): boolean;
28
+ isDesktop(): boolean;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=media.directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.directive.d.ts","sourceRoot":"","sources":["../../../src/directives/media.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,UAAU,gBAAgB;IACtB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,MAAM,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;CAC7C;AAED,UAAU,YAAY;IAClB,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED,qBAAa,cAAe,SAAQ,aAAa;IAC7C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,iBAAiB,CAAM;IAC/B,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,kBAAkB,CAA4D;IAEtF,KAAK,CAAC,OAAO,EAAE,OAAO;IAatB,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,aAAa;IAerB,MAAM,CAAC,OAAO,EAAE,YAAY;IAY5B,OAAO,CAAC,OAAO;IAaf,OAAO;IAKP,oBAAoB,IAAI,MAAM;IAI9B,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAIzC,QAAQ,IAAI,OAAO;IAInB,QAAQ,IAAI,OAAO;IAInB,SAAS,IAAI,OAAO;CAGvB"}
@@ -0,0 +1,105 @@
1
+ import { BaseDirective } from './directive';
2
+ import { debugLog } from '../utils/debug';
3
+ export class MediaDirective extends BaseDirective {
4
+ options = {};
5
+ currentBreakpoint = '';
6
+ mediaQueries = new Map();
7
+ breakpointHandlers = new Map();
8
+ mount(element) {
9
+ debugLog('media', 'Mounting media directive');
10
+ this.options = {
11
+ defaultBreakpoint: 'desktop',
12
+ breakpoints: {},
13
+ ...this.options
14
+ };
15
+ this.setupMediaQueries();
16
+ this.updateContent(element);
17
+ }
18
+ setupMediaQueries() {
19
+ const breakpoints = {
20
+ mobile: '(max-width: 768px)',
21
+ tablet: '(min-width: 769px) and (max-width: 1024px)',
22
+ desktop: '(min-width: 1025px)',
23
+ ...this.options.breakpoints
24
+ };
25
+ // Create media query listeners for each breakpoint
26
+ Object.entries(breakpoints).forEach(([breakpoint, query]) => {
27
+ if (typeof query === 'string') {
28
+ const mediaQuery = window.matchMedia(query);
29
+ this.mediaQueries.set(breakpoint, mediaQuery);
30
+ const handler = (e) => {
31
+ if (e.matches) {
32
+ this.currentBreakpoint = breakpoint;
33
+ this.options.onBreakpointChange?.(breakpoint);
34
+ if (this.element) {
35
+ this.updateContent(this.element);
36
+ }
37
+ debugLog('media', 'Breakpoint changed to:', breakpoint);
38
+ }
39
+ };
40
+ this.breakpointHandlers.set(breakpoint, handler);
41
+ mediaQuery.addEventListener('change', handler);
42
+ // Set initial breakpoint
43
+ if (mediaQuery.matches) {
44
+ this.currentBreakpoint = breakpoint;
45
+ }
46
+ }
47
+ });
48
+ // Set default if no breakpoint matches
49
+ if (!this.currentBreakpoint) {
50
+ this.currentBreakpoint = this.options.defaultBreakpoint || 'desktop';
51
+ }
52
+ }
53
+ updateContent(element) {
54
+ const breakpoint = this.currentBreakpoint;
55
+ const breakpoints = this.options.breakpoints || {};
56
+ const renderFunction = breakpoints[breakpoint];
57
+ if (renderFunction && typeof renderFunction === 'function') {
58
+ const content = renderFunction();
59
+ if (element instanceof HTMLElement) {
60
+ element.innerHTML = content;
61
+ debugLog('media', 'Updated content for breakpoint:', breakpoint);
62
+ }
63
+ }
64
+ }
65
+ update(options) {
66
+ this.options = { ...this.options, ...options };
67
+ // Re-setup media queries if breakpoints changed
68
+ this.cleanup();
69
+ this.setupMediaQueries();
70
+ if (this.element) {
71
+ this.updateContent(this.element);
72
+ }
73
+ }
74
+ cleanup() {
75
+ // Remove all media query listeners
76
+ this.mediaQueries.forEach((mediaQuery, breakpoint) => {
77
+ const handler = this.breakpointHandlers.get(breakpoint);
78
+ if (handler) {
79
+ mediaQuery.removeEventListener('change', handler);
80
+ }
81
+ });
82
+ this.mediaQueries.clear();
83
+ this.breakpointHandlers.clear();
84
+ }
85
+ unmount() {
86
+ this.cleanup();
87
+ }
88
+ // Public methods
89
+ getCurrentBreakpoint() {
90
+ return this.currentBreakpoint;
91
+ }
92
+ isBreakpoint(breakpoint) {
93
+ return this.currentBreakpoint === breakpoint;
94
+ }
95
+ isMobile() {
96
+ return this.currentBreakpoint === 'mobile';
97
+ }
98
+ isTablet() {
99
+ return this.currentBreakpoint === 'tablet';
100
+ }
101
+ isDesktop() {
102
+ return this.currentBreakpoint === 'desktop';
103
+ }
104
+ }
105
+ //# sourceMappingURL=media.directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.directive.js","sourceRoot":"","sources":["../../../src/directives/media.directive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { BaseDirective } from './directive';
2
+ export declare class MutationDirective extends BaseDirective {
3
+ private observer;
4
+ private callback;
5
+ private options;
6
+ constructor(element: Element);
7
+ mount(element: Element): void;
8
+ update(value: unknown): void;
9
+ unmount(): void;
10
+ }
11
+ //# sourceMappingURL=mutation.directive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.directive.d.ts","sourceRoot":"","sources":["../../../src/directives/mutation.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiB5C,qBAAa,iBAAkB,SAAQ,aAAa;IAChD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,QAAQ,CAAiC;IACjD,OAAO,CAAC,OAAO,CAIb;gBAEU,OAAO,EAAE,OAAO;IAK5B,KAAK,CAAC,OAAO,EAAE,OAAO;IAiBtB,MAAM,CAAC,KAAK,EAAE,OAAO;IAyBrB,OAAO;CAOV"}
@@ -0,0 +1,56 @@
1
+ import { BaseDirective } from './directive';
2
+ import { debugLog } from '../utils/debug';
3
+ export class MutationDirective extends BaseDirective {
4
+ observer = null;
5
+ callback = null;
6
+ options = {
7
+ attributes: true,
8
+ childList: true,
9
+ subtree: true
10
+ };
11
+ constructor(element) {
12
+ super(element);
13
+ debugLog('mutation', 'Creating directive');
14
+ }
15
+ mount(element) {
16
+ debugLog('mutation', 'Mounting observer', { options: this.options });
17
+ this.observer = new MutationObserver((mutations) => {
18
+ debugLog('mutation', 'Mutations detected', {
19
+ count: mutations.length,
20
+ mutations
21
+ });
22
+ if (this.callback) {
23
+ this.callback(mutations);
24
+ }
25
+ });
26
+ this.observer.observe(element, this.options);
27
+ }
28
+ update(value) {
29
+ debugLog('mutation', 'Updating', { value });
30
+ // Handle callback update
31
+ if (typeof value === 'function') {
32
+ this.callback = value;
33
+ }
34
+ // Handle options update
35
+ if (value && typeof value === 'object' && 'options' in value) {
36
+ const newOptions = value.options;
37
+ // Only update observer if options actually changed
38
+ if (JSON.stringify(newOptions) !== JSON.stringify(this.options)) {
39
+ this.options = newOptions;
40
+ // Remount observer with new options
41
+ if (this.observer && this.element) {
42
+ this.observer.disconnect();
43
+ this.observer.observe(this.element, this.options);
44
+ }
45
+ }
46
+ }
47
+ }
48
+ unmount() {
49
+ debugLog('mutation', 'Unmounting observer');
50
+ if (this.observer) {
51
+ this.observer.disconnect();
52
+ this.observer = null;
53
+ }
54
+ }
55
+ }
56
+ //# sourceMappingURL=mutation.directive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.directive.js","sourceRoot":"","sources":["../../../src/directives/mutation.directive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAgB1C,MAAM,OAAO,iBAAkB,SAAQ,aAAa;IACxC,QAAQ,GAA4B,IAAI,CAAC;IACzC,QAAQ,GAA4B,IAAI,CAAC;IACzC,OAAO,GAAyB;QACpC,UAAU,EAAE,IAAI;QAChB,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,IAAI;KAChB,CAAC;IAEF,YAAY,OAAgB;QACxB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAgB;QAClB,QAAQ,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAErE,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,CAAC,SAAS,EAAE,EAAE;YAC/C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,EAAE;gBACvC,KAAK,EAAE,SAAS,CAAC,MAAM;gBACvB,SAAS;aACZ,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CAAC,KAAc;QACjB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5C,yBAAyB;QACzB,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,QAAQ,GAAG,KAAyB,CAAC;QAC9C,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;YAC3D,MAAM,UAAU,GAAI,KAAsC,CAAC,OAAO,CAAC;YAEnE,mDAAmD;YACnD,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,IAAI,CAAC,OAAO,GAAG,UAAU,CAAC;gBAE1B,oCAAoC;gBACpC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;oBAChC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtD,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACzB,CAAC;IACL,CAAC;CACJ"}
@@ -0,0 +1,50 @@
1
+ import { TemplateResult } from '../processor/template-result';
2
+ /**
3
+ * Key function: extracts a unique key from an item.
4
+ */
5
+ export type KeyFn<T> = (item: T, index: number) => unknown;
6
+ /**
7
+ * Template function: produces a TemplateResult for an item.
8
+ */
9
+ export type TemplateFn<T> = (item: T, index: number) => TemplateResult;
10
+ /**
11
+ * Marker object returned by repeat(). Detected by NodeBinding
12
+ * to trigger keyed reconciliation instead of full teardown+rebuild.
13
+ */
14
+ export declare class RepeatResult {
15
+ readonly items: readonly unknown[];
16
+ readonly keyFn: KeyFn<any>;
17
+ readonly templateFn: TemplateFn<any>;
18
+ constructor(items: readonly unknown[], keyFn: KeyFn<any>, templateFn: TemplateFn<any>);
19
+ }
20
+ /**
21
+ * Keyed list rendering directive.
22
+ *
23
+ * Usage:
24
+ * ```ts
25
+ * html`
26
+ * <ul>
27
+ * ${repeat(
28
+ * this.items,
29
+ * item => item.id,
30
+ * (item, index) => html`<li>${item.name}</li>`
31
+ * )}
32
+ * </ul>
33
+ * `
34
+ * ```
35
+ *
36
+ * When items change, the diff algorithm:
37
+ * - Reuses DOM for items with the same key (calls instance.update())
38
+ * - Creates new DOM only for genuinely new items
39
+ * - Removes DOM only for items that disappeared
40
+ * - Moves DOM nodes to match the new order
41
+ *
42
+ * This is dramatically faster than the default array rendering
43
+ * which tears down and rebuilds all DOM on every update.
44
+ *
45
+ * @param items - The array of items to render
46
+ * @param keyFn - Function that returns a unique key for each item
47
+ * @param templateFn - Function that returns a TemplateResult for each item
48
+ */
49
+ export declare function repeat<T>(items: readonly T[], keyFn: KeyFn<T>, templateFn: TemplateFn<T>): RepeatResult;
50
+ //# sourceMappingURL=repeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repeat.d.ts","sourceRoot":"","sources":["../../../src/directives/repeat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,cAAc,CAAC;AAEvE;;;GAGG;AACH,qBAAa,YAAY;aAED,KAAK,EAAE,SAAS,OAAO,EAAE;aACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;aACjB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;gBAF3B,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EACjB,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC;CAElD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,MAAM,CAAC,CAAC,EACpB,KAAK,EAAE,SAAS,CAAC,EAAE,EACnB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EACf,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAC1B,YAAY,CAEd"}