@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.
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/src/binding-manager/binding-manager.d.ts +30 -0
- package/dist/src/binding-manager/binding-manager.d.ts.map +1 -0
- package/dist/src/binding-manager/binding-manager.js +245 -0
- package/dist/src/binding-manager/binding-manager.js.map +1 -0
- package/dist/src/binding-manager/binding-type.d.ts +24 -0
- package/dist/src/binding-manager/binding-type.d.ts.map +1 -0
- package/dist/src/binding-manager/binding-type.js +25 -0
- package/dist/src/binding-manager/binding-type.js.map +1 -0
- package/dist/src/binding-manager/bindings/async-binding.d.ts +23 -0
- package/dist/src/binding-manager/bindings/async-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/async-binding.js +67 -0
- package/dist/src/binding-manager/bindings/async-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/attribute-binding.d.ts +41 -0
- package/dist/src/binding-manager/bindings/attribute-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/attribute-binding.js +79 -0
- package/dist/src/binding-manager/bindings/attribute-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/bind-binding.d.ts +30 -0
- package/dist/src/binding-manager/bindings/bind-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/bind-binding.js +81 -0
- package/dist/src/binding-manager/bindings/bind-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/binding.d.ts +6 -0
- package/dist/src/binding-manager/bindings/binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/binding.js +2 -0
- package/dist/src/binding-manager/bindings/binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/boolean-binding.d.ts +18 -0
- package/dist/src/binding-manager/bindings/boolean-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/boolean-binding.js +65 -0
- package/dist/src/binding-manager/bindings/boolean-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/class-binding.d.ts +10 -0
- package/dist/src/binding-manager/bindings/class-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/class-binding.js +68 -0
- package/dist/src/binding-manager/bindings/class-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/directive-binding.d.ts +15 -0
- package/dist/src/binding-manager/bindings/directive-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/directive-binding.js +70 -0
- package/dist/src/binding-manager/bindings/directive-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/event-binding.d.ts +14 -0
- package/dist/src/binding-manager/bindings/event-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/event-binding.js +73 -0
- package/dist/src/binding-manager/bindings/event-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/node-binding.d.ts +36 -0
- package/dist/src/binding-manager/bindings/node-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/node-binding.js +235 -0
- package/dist/src/binding-manager/bindings/node-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/object-class-binding.d.ts +16 -0
- package/dist/src/binding-manager/bindings/object-class-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/object-class-binding.js +42 -0
- package/dist/src/binding-manager/bindings/object-class-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/object-style-binding.d.ts +16 -0
- package/dist/src/binding-manager/bindings/object-style-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/object-style-binding.js +38 -0
- package/dist/src/binding-manager/bindings/object-style-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/property-binding.d.ts +12 -0
- package/dist/src/binding-manager/bindings/property-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/property-binding.js +44 -0
- package/dist/src/binding-manager/bindings/property-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/reference-binding.d.ts +14 -0
- package/dist/src/binding-manager/bindings/reference-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/reference-binding.js +44 -0
- package/dist/src/binding-manager/bindings/reference-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/spread-binding.d.ts +16 -0
- package/dist/src/binding-manager/bindings/spread-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/spread-binding.js +40 -0
- package/dist/src/binding-manager/bindings/spread-binding.js.map +1 -0
- package/dist/src/binding-manager/bindings/style-binding.d.ts +10 -0
- package/dist/src/binding-manager/bindings/style-binding.d.ts.map +1 -0
- package/dist/src/binding-manager/bindings/style-binding.js +44 -0
- package/dist/src/binding-manager/bindings/style-binding.js.map +1 -0
- package/dist/src/compiler/code-factory.d.ts +45 -0
- package/dist/src/compiler/code-factory.d.ts.map +1 -0
- package/dist/src/compiler/code-factory.js +211 -0
- package/dist/src/compiler/code-factory.js.map +1 -0
- package/dist/src/compiler/compiler.d.ts +77 -0
- package/dist/src/compiler/compiler.d.ts.map +1 -0
- package/dist/src/compiler/compiler.js +77 -0
- package/dist/src/compiler/compiler.js.map +1 -0
- package/dist/src/compiler/constants.d.ts +5 -0
- package/dist/src/compiler/constants.d.ts.map +1 -0
- package/dist/src/compiler/constants.js +9 -0
- package/dist/src/compiler/constants.js.map +1 -0
- package/dist/src/css-result.d.ts +27 -0
- package/dist/src/css-result.d.ts.map +1 -0
- package/dist/src/css-result.js +56 -0
- package/dist/src/css-result.js.map +1 -0
- package/dist/src/css.d.ts +26 -0
- package/dist/src/css.d.ts.map +1 -0
- package/dist/src/css.js +62 -0
- package/dist/src/css.js.map +1 -0
- package/dist/src/directives/animate.directive.d.ts +42 -0
- package/dist/src/directives/animate.directive.d.ts.map +1 -0
- package/dist/src/directives/animate.directive.js +349 -0
- package/dist/src/directives/animate.directive.js.map +1 -0
- package/dist/src/directives/await.d.ts +68 -0
- package/dist/src/directives/await.d.ts.map +1 -0
- package/dist/src/directives/await.js +70 -0
- package/dist/src/directives/await.js.map +1 -0
- package/dist/src/directives/choose.d.ts +28 -0
- package/dist/src/directives/choose.d.ts.map +1 -0
- package/dist/src/directives/choose.js +30 -0
- package/dist/src/directives/choose.js.map +1 -0
- package/dist/src/directives/decorator-example.d.ts +8 -0
- package/dist/src/directives/decorator-example.d.ts.map +1 -0
- package/dist/src/directives/decorator-example.js +32 -0
- package/dist/src/directives/decorator-example.js.map +1 -0
- package/dist/src/directives/decorators.d.ts +3 -0
- package/dist/src/directives/decorators.d.ts.map +1 -0
- package/dist/src/directives/decorators.js +17 -0
- package/dist/src/directives/decorators.js.map +1 -0
- package/dist/src/directives/directive-manager.d.ts +26 -0
- package/dist/src/directives/directive-manager.d.ts.map +1 -0
- package/dist/src/directives/directive-manager.js +114 -0
- package/dist/src/directives/directive-manager.js.map +1 -0
- package/dist/src/directives/directive.d.ts +38 -0
- package/dist/src/directives/directive.d.ts.map +1 -0
- package/dist/src/directives/directive.js +18 -0
- package/dist/src/directives/directive.js.map +1 -0
- package/dist/src/directives/focus.directive.d.ts +16 -0
- package/dist/src/directives/focus.directive.d.ts.map +1 -0
- package/dist/src/directives/focus.directive.js +29 -0
- package/dist/src/directives/focus.directive.js.map +1 -0
- package/dist/src/directives/gesture.directive.d.ts +58 -0
- package/dist/src/directives/gesture.directive.d.ts.map +1 -0
- package/dist/src/directives/gesture.directive.js +331 -0
- package/dist/src/directives/gesture.directive.js.map +1 -0
- package/dist/src/directives/index.d.ts +34 -0
- package/dist/src/directives/index.d.ts.map +1 -0
- package/dist/src/directives/index.js +35 -0
- package/dist/src/directives/index.js.map +1 -0
- package/dist/src/directives/intersection.directive.d.ts +18 -0
- package/dist/src/directives/intersection.directive.d.ts.map +1 -0
- package/dist/src/directives/intersection.directive.js +50 -0
- package/dist/src/directives/intersection.directive.js.map +1 -0
- package/dist/src/directives/keyed-diff.d.ts +30 -0
- package/dist/src/directives/keyed-diff.d.ts.map +1 -0
- package/dist/src/directives/keyed-diff.js +185 -0
- package/dist/src/directives/keyed-diff.js.map +1 -0
- package/dist/src/directives/lazy-setup.d.ts +3 -0
- package/dist/src/directives/lazy-setup.d.ts.map +1 -0
- package/dist/src/directives/lazy-setup.js +55 -0
- package/dist/src/directives/lazy-setup.js.map +1 -0
- package/dist/src/directives/lazy.directive.d.ts +19 -0
- package/dist/src/directives/lazy.directive.d.ts.map +1 -0
- package/dist/src/directives/lazy.directive.js +73 -0
- package/dist/src/directives/lazy.directive.js.map +1 -0
- package/dist/src/directives/media.directive.d.ts +31 -0
- package/dist/src/directives/media.directive.d.ts.map +1 -0
- package/dist/src/directives/media.directive.js +105 -0
- package/dist/src/directives/media.directive.js.map +1 -0
- package/dist/src/directives/mutation.directive.d.ts +11 -0
- package/dist/src/directives/mutation.directive.d.ts.map +1 -0
- package/dist/src/directives/mutation.directive.js +56 -0
- package/dist/src/directives/mutation.directive.js.map +1 -0
- package/dist/src/directives/repeat.d.ts +50 -0
- package/dist/src/directives/repeat.d.ts.map +1 -0
- package/dist/src/directives/repeat.js +47 -0
- package/dist/src/directives/repeat.js.map +1 -0
- package/dist/src/directives/resize.directive.d.ts +14 -0
- package/dist/src/directives/resize.directive.d.ts.map +1 -0
- package/dist/src/directives/resize.directive.js +81 -0
- package/dist/src/directives/resize.directive.js.map +1 -0
- package/dist/src/directives/setup.d.ts +9 -0
- package/dist/src/directives/setup.d.ts.map +1 -0
- package/dist/src/directives/setup.js +9 -0
- package/dist/src/directives/setup.js.map +1 -0
- package/dist/src/directives/structural/async.directive.d.ts +39 -0
- package/dist/src/directives/structural/async.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/async.directive.js +115 -0
- package/dist/src/directives/structural/async.directive.js.map +1 -0
- package/dist/src/directives/structural/for.directive.d.ts +37 -0
- package/dist/src/directives/structural/for.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/for.directive.js +209 -0
- package/dist/src/directives/structural/for.directive.js.map +1 -0
- package/dist/src/directives/structural/if.directive.d.ts +54 -0
- package/dist/src/directives/structural/if.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/if.directive.js +210 -0
- package/dist/src/directives/structural/if.directive.js.map +1 -0
- package/dist/src/directives/structural/structural.directive.d.ts +11 -0
- package/dist/src/directives/structural/structural.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/structural.directive.js +29 -0
- package/dist/src/directives/structural/structural.directive.js.map +1 -0
- package/dist/src/directives/structural/switch.directive.d.ts +12 -0
- package/dist/src/directives/structural/switch.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/switch.directive.js +69 -0
- package/dist/src/directives/structural/switch.directive.js.map +1 -0
- package/dist/src/directives/structural/virtual-scroll.directive.d.ts +50 -0
- package/dist/src/directives/structural/virtual-scroll.directive.d.ts.map +1 -0
- package/dist/src/directives/structural/virtual-scroll.directive.js +165 -0
- package/dist/src/directives/structural/virtual-scroll.directive.js.map +1 -0
- package/dist/src/directives/utils.d.ts +61 -0
- package/dist/src/directives/utils.d.ts.map +1 -0
- package/dist/src/directives/utils.js +121 -0
- package/dist/src/directives/utils.js.map +1 -0
- package/dist/src/directives/validate.directive.d.ts +41 -0
- package/dist/src/directives/validate.directive.d.ts.map +1 -0
- package/dist/src/directives/validate.directive.js +161 -0
- package/dist/src/directives/validate.directive.js.map +1 -0
- package/dist/src/directives/virtual-scroll.d.ts +91 -0
- package/dist/src/directives/virtual-scroll.d.ts.map +1 -0
- package/dist/src/directives/virtual-scroll.js +78 -0
- package/dist/src/directives/virtual-scroll.js.map +1 -0
- package/dist/src/directives/when.d.ts +24 -0
- package/dist/src/directives/when.d.ts.map +1 -0
- package/dist/src/directives/when.js +25 -0
- package/dist/src/directives/when.js.map +1 -0
- package/dist/src/html.d.ts +23 -0
- package/dist/src/html.d.ts.map +1 -0
- package/dist/src/html.js +37 -0
- package/dist/src/html.js.map +1 -0
- package/dist/src/modifiers/capture-modifier.d.ts +6 -0
- package/dist/src/modifiers/capture-modifier.d.ts.map +1 -0
- package/dist/src/modifiers/capture-modifier.js +14 -0
- package/dist/src/modifiers/capture-modifier.js.map +1 -0
- package/dist/src/modifiers/event-modifiers.d.ts +38 -0
- package/dist/src/modifiers/event-modifiers.d.ts.map +1 -0
- package/dist/src/modifiers/event-modifiers.js +90 -0
- package/dist/src/modifiers/event-modifiers.js.map +1 -0
- package/dist/src/modifiers/key-modifiers.d.ts +8 -0
- package/dist/src/modifiers/key-modifiers.d.ts.map +1 -0
- package/dist/src/modifiers/key-modifiers.js +29 -0
- package/dist/src/modifiers/key-modifiers.js.map +1 -0
- package/dist/src/modifiers/mouse-modifiers.d.ts +8 -0
- package/dist/src/modifiers/mouse-modifiers.d.ts.map +1 -0
- package/dist/src/modifiers/mouse-modifiers.js +15 -0
- package/dist/src/modifiers/mouse-modifiers.js.map +1 -0
- package/dist/src/modifiers/once-modifier.d.ts +6 -0
- package/dist/src/modifiers/once-modifier.d.ts.map +1 -0
- package/dist/src/modifiers/once-modifier.js +11 -0
- package/dist/src/modifiers/once-modifier.js.map +1 -0
- package/dist/src/modifiers/passive-modifier.d.ts +6 -0
- package/dist/src/modifiers/passive-modifier.d.ts.map +1 -0
- package/dist/src/modifiers/passive-modifier.js +14 -0
- package/dist/src/modifiers/passive-modifier.js.map +1 -0
- package/dist/src/processor/parser.d.ts +74 -0
- package/dist/src/processor/parser.d.ts.map +1 -0
- package/dist/src/processor/parser.js +345 -0
- package/dist/src/processor/parser.js.map +1 -0
- package/dist/src/processor/processor.d.ts +68 -0
- package/dist/src/processor/processor.d.ts.map +1 -0
- package/dist/src/processor/processor.js +138 -0
- package/dist/src/processor/processor.js.map +1 -0
- package/dist/src/processor/template-result.d.ts +74 -0
- package/dist/src/processor/template-result.d.ts.map +1 -0
- package/dist/src/processor/template-result.js +53 -0
- package/dist/src/processor/template-result.js.map +1 -0
- package/dist/src/processor/types.d.ts +16 -0
- package/dist/src/processor/types.d.ts.map +1 -0
- package/dist/src/processor/types.js +13 -0
- package/dist/src/processor/types.js.map +1 -0
- package/dist/src/utils/debug.d.ts +7 -0
- package/dist/src/utils/debug.d.ts.map +1 -0
- package/dist/src/utils/debug.js +7 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/performance.d.ts +50 -0
- package/dist/src/utils/performance.d.ts.map +1 -0
- package/dist/src/utils/performance.js +51 -0
- package/dist/src/utils/performance.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- 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 @@
|
|
|
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"}
|