@geajs/ui 0.2.3 → 0.2.9
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/accordion.d.mts +2 -2
- package/dist/accordion.mjs +92 -122
- package/dist/accordion.mjs.map +1 -1
- package/dist/alert.d.mts +3 -3
- package/dist/alert.mjs +45 -107
- package/dist/alert.mjs.map +1 -1
- package/dist/avatar.d.mts +2 -2
- package/dist/avatar.mjs +38 -62
- package/dist/avatar.mjs.map +1 -1
- package/dist/badge.d.mts +1 -1
- package/dist/badge.mjs +18 -43
- package/dist/badge.mjs.map +1 -1
- package/dist/bind.mjs +130 -0
- package/dist/bind.mjs.map +1 -0
- package/dist/button.d.mts +3 -2
- package/dist/button.mjs +30 -85
- package/dist/button.mjs.map +1 -1
- package/dist/card.d.mts +6 -6
- package/dist/card.mjs +82 -194
- package/dist/card.mjs.map +1 -1
- package/dist/checkbox.d.mts +2 -2
- package/dist/checkbox.mjs +30 -31
- package/dist/checkbox.mjs.map +1 -1
- package/dist/clipboard.d.mts +2 -2
- package/dist/clipboard.mjs +49 -55
- package/dist/clipboard.mjs.map +1 -1
- package/dist/collapsible.d.mts +2 -2
- package/dist/collapsible.mjs +18 -45
- package/dist/collapsible.mjs.map +1 -1
- package/dist/combobox.d.mts +2 -2
- package/dist/combobox.mjs +322 -261
- package/dist/combobox.mjs.map +1 -1
- package/dist/compiled-component.mjs +119 -0
- package/dist/compiled-component.mjs.map +1 -0
- package/dist/compiled-reactive-component.mjs +337 -0
- package/dist/compiled-reactive-component.mjs.map +1 -0
- package/dist/component-id.mjs +10 -0
- package/dist/component-id.mjs.map +1 -0
- package/dist/conditional-truthy.mjs +48 -0
- package/dist/conditional-truthy.mjs.map +1 -0
- package/dist/conditional.mjs +54 -0
- package/dist/conditional.mjs.map +1 -0
- package/dist/delegate-event.mjs +53 -0
- package/dist/delegate-event.mjs.map +1 -0
- package/dist/dialog.d.mts +4 -3
- package/dist/dialog.mjs +57 -70
- package/dist/dialog.mjs.map +1 -1
- package/dist/dirty-symbols.mjs +7 -0
- package/dist/dirty-symbols.mjs.map +1 -0
- package/dist/disposer.mjs +46 -0
- package/dist/disposer.mjs.map +1 -0
- package/dist/dnd-manager.d.mts +9 -1
- package/dist/dnd-manager.mjs +67 -29
- package/dist/dnd-manager.mjs.map +1 -1
- package/dist/drag-drop-context.d.mts +1 -1
- package/dist/drag-drop-context.mjs +17 -33
- package/dist/drag-drop-context.mjs.map +1 -1
- package/dist/draggable.d.mts +1 -1
- package/dist/draggable.mjs +2 -91
- package/dist/draggable2.mjs +321 -0
- package/dist/draggable2.mjs.map +1 -0
- package/dist/droppable.d.mts +1 -1
- package/dist/droppable.mjs +20 -44
- package/dist/droppable.mjs.map +1 -1
- package/dist/file-upload.d.mts +2 -2
- package/dist/file-upload.mjs +337 -122
- package/dist/file-upload.mjs.map +1 -1
- package/dist/hover-card.d.mts +2 -2
- package/dist/hover-card.mjs +24 -59
- package/dist/hover-card.mjs.map +1 -1
- package/dist/index.mjs +3 -3
- package/dist/input.d.mts +1 -1
- package/dist/input.mjs +1 -93
- package/dist/input2.mjs +56 -0
- package/dist/input2.mjs.map +1 -0
- package/dist/internal-symbols.mjs +9 -0
- package/dist/internal-symbols.mjs.map +1 -0
- package/dist/item-obs.mjs +68 -0
- package/dist/item-obs.mjs.map +1 -0
- package/dist/keyed-list-symbols.mjs +6 -0
- package/dist/keyed-list-symbols.mjs.map +1 -0
- package/dist/keyed-list.mjs +487 -0
- package/dist/keyed-list.mjs.map +1 -0
- package/dist/label.d.mts +1 -1
- package/dist/label.mjs +20 -45
- package/dist/label.mjs.map +1 -1
- package/dist/menu.d.mts +2 -2
- package/dist/menu.mjs +87 -41
- package/dist/menu.mjs.map +1 -1
- package/dist/number-input.d.mts +2 -2
- package/dist/number-input.mjs +28 -32
- package/dist/number-input.mjs.map +1 -1
- package/dist/pagination.d.mts +2 -2
- package/dist/pagination.mjs +12 -35
- package/dist/pagination.mjs.map +1 -1
- package/dist/patch.mjs +21 -0
- package/dist/patch.mjs.map +1 -0
- package/dist/pin-input.d.mts +2 -2
- package/dist/pin-input.mjs +88 -87
- package/dist/pin-input.mjs.map +1 -1
- package/dist/popover.d.mts +2 -2
- package/dist/popover.mjs +45 -67
- package/dist/popover.mjs.map +1 -1
- package/dist/progress.d.mts +2 -2
- package/dist/progress.mjs +37 -43
- package/dist/progress.mjs.map +1 -1
- package/dist/radio-group.d.mts +2 -2
- package/dist/radio-group.mjs +99 -140
- package/dist/radio-group.mjs.map +1 -1
- package/dist/rating-group.d.mts +2 -2
- package/dist/rating-group.mjs +91 -99
- package/dist/rating-group.mjs.map +1 -1
- package/dist/reactive-attr.mjs +13 -0
- package/dist/reactive-attr.mjs.map +1 -0
- package/dist/reactive-bool.mjs +13 -0
- package/dist/reactive-bool.mjs.map +1 -0
- package/dist/reactive-class-name.mjs +15 -0
- package/dist/reactive-class-name.mjs.map +1 -0
- package/dist/reactive-class.mjs +53 -0
- package/dist/reactive-class.mjs.map +1 -0
- package/dist/reactive-style.mjs +21 -0
- package/dist/reactive-style.mjs.map +1 -0
- package/dist/reactive-text.mjs +62 -0
- package/dist/reactive-text.mjs.map +1 -0
- package/dist/select.d.mts +2 -2
- package/dist/select.mjs +106 -186
- package/dist/select.mjs.map +1 -1
- package/dist/separator.d.mts +1 -1
- package/dist/separator.mjs +19 -45
- package/dist/separator.mjs.map +1 -1
- package/dist/skeleton.d.mts +1 -1
- package/dist/skeleton.mjs +11 -35
- package/dist/skeleton.mjs.map +1 -1
- package/dist/slider.d.mts +2 -2
- package/dist/slider.mjs +31 -32
- package/dist/slider.mjs.map +1 -1
- package/dist/switch.d.mts +2 -2
- package/dist/switch.mjs +30 -31
- package/dist/switch.mjs.map +1 -1
- package/dist/tabs.d.mts +7 -2
- package/dist/tabs.mjs +180 -147
- package/dist/tabs.mjs.map +1 -1
- package/dist/tags-input.d.mts +2 -2
- package/dist/tags-input.mjs +102 -188
- package/dist/tags-input.mjs.map +1 -1
- package/dist/textarea.d.mts +1 -1
- package/dist/textarea.mjs +32 -75
- package/dist/textarea.mjs.map +1 -1
- package/dist/theme.css +4 -5
- package/dist/toast.d.mts +1 -1
- package/dist/toast.mjs +14 -34
- package/dist/toast.mjs.map +1 -1
- package/dist/toggle-group.d.mts +2 -2
- package/dist/toggle-group.mjs +78 -85
- package/dist/toggle-group.mjs.map +1 -1
- package/dist/tooltip.d.mts +2 -2
- package/dist/tooltip.mjs +23 -43
- package/dist/tooltip.mjs.map +1 -1
- package/dist/tree-view.d.mts +2 -2
- package/dist/tree-view.mjs +32 -50
- package/dist/tree-view.mjs.map +1 -1
- package/dist/types.d.mts +9 -0
- package/dist/zag-component.d.mts +25 -3
- package/dist/zag-component.mjs +63 -16
- package/dist/zag-component.mjs.map +1 -1
- package/package.json +5 -5
- package/dist/cn.mjs +0 -10
- package/dist/cn.mjs.map +0 -1
- package/dist/draggable.mjs.map +0 -1
- package/dist/input.mjs.map +0 -1
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
import { a as subscribe, i as withTracking, u as GEA_PROXY_RAW } from "./bind.mjs";
|
|
2
|
+
import { n as _DIRTY_PROPS, t as _DIRTY } from "./dirty-symbols.mjs";
|
|
3
|
+
//#region ../gea/src/runtime/keyed-list/lis.ts
|
|
4
|
+
/**
|
|
5
|
+
* Longest Increasing Subsequence — O(n log n). Input is `newToOld[]`
|
|
6
|
+
* (index in new array → index in old array, or `-1` for new items). Output
|
|
7
|
+
* is the set of new-indices that form the longest increasing run of old
|
|
8
|
+
* indices, i.e. the set of entries that can stay put during a reorder.
|
|
9
|
+
*/
|
|
10
|
+
function lis(arr) {
|
|
11
|
+
const n = arr.length;
|
|
12
|
+
if (n === 0) return [];
|
|
13
|
+
const vals = [];
|
|
14
|
+
const idxs = [];
|
|
15
|
+
for (let i = 0; i < n; i++) if (arr[i] !== -1) {
|
|
16
|
+
vals.push(arr[i]);
|
|
17
|
+
idxs.push(i);
|
|
18
|
+
}
|
|
19
|
+
const m = vals.length;
|
|
20
|
+
if (m === 0) return [];
|
|
21
|
+
const tails = [];
|
|
22
|
+
const tIdx = [];
|
|
23
|
+
const pred = new Array(m).fill(-1);
|
|
24
|
+
for (let i = 0; i < m; i++) {
|
|
25
|
+
const v = vals[i];
|
|
26
|
+
let lo = 0, hi = tails.length;
|
|
27
|
+
while (lo < hi) {
|
|
28
|
+
const mid = lo + hi >> 1;
|
|
29
|
+
if (tails[mid] < v) lo = mid + 1;
|
|
30
|
+
else hi = mid;
|
|
31
|
+
}
|
|
32
|
+
if (lo === tails.length) {
|
|
33
|
+
tails.push(v);
|
|
34
|
+
tIdx.push(i);
|
|
35
|
+
} else {
|
|
36
|
+
tails[lo] = v;
|
|
37
|
+
tIdx[lo] = i;
|
|
38
|
+
}
|
|
39
|
+
if (lo > 0) pred[i] = tIdx[lo - 1];
|
|
40
|
+
}
|
|
41
|
+
const out = new Array(tails.length);
|
|
42
|
+
let k = tIdx[tails.length - 1];
|
|
43
|
+
for (let i = tails.length - 1; i >= 0; i--) {
|
|
44
|
+
out[i] = idxs[k];
|
|
45
|
+
k = pred[k];
|
|
46
|
+
}
|
|
47
|
+
return out;
|
|
48
|
+
}
|
|
49
|
+
//#endregion
|
|
50
|
+
//#region ../gea/src/runtime/keyed-list/rescue.ts
|
|
51
|
+
const _toFlush = /* @__PURE__ */ new Set();
|
|
52
|
+
const _live = /* @__PURE__ */ new WeakMap();
|
|
53
|
+
const _claimed = /* @__PURE__ */ new WeakSet();
|
|
54
|
+
const _claimable = /* @__PURE__ */ new WeakSet();
|
|
55
|
+
let _pendingBulk = null;
|
|
56
|
+
let _flushQueued = false;
|
|
57
|
+
const _unwrap = (v) => v && typeof v === "object" && v[GEA_PROXY_RAW] || v;
|
|
58
|
+
function _liveFor(pending) {
|
|
59
|
+
let live = _live.get(pending);
|
|
60
|
+
if (!live) {
|
|
61
|
+
live = /* @__PURE__ */ new Map();
|
|
62
|
+
_live.set(pending, live);
|
|
63
|
+
}
|
|
64
|
+
return live;
|
|
65
|
+
}
|
|
66
|
+
function _trackLive(pending, e) {
|
|
67
|
+
const key = String(e.key);
|
|
68
|
+
const live = _liveFor(pending);
|
|
69
|
+
let bucket = live.get(key);
|
|
70
|
+
if (!bucket) live.set(key, bucket = /* @__PURE__ */ new Set());
|
|
71
|
+
bucket.add(e);
|
|
72
|
+
}
|
|
73
|
+
function _untrackLive(pending, e) {
|
|
74
|
+
_claimable.delete(e);
|
|
75
|
+
const bucket = _live.get(pending)?.get(String(e.key));
|
|
76
|
+
if (!bucket) return;
|
|
77
|
+
bucket.delete(e);
|
|
78
|
+
if (bucket.size === 0) _live.get(pending)?.delete(String(e.key));
|
|
79
|
+
}
|
|
80
|
+
function _markClaimable(e, claimable) {
|
|
81
|
+
if (claimable) _claimable.add(e);
|
|
82
|
+
else _claimable.delete(e);
|
|
83
|
+
}
|
|
84
|
+
function _consumeClaim(e) {
|
|
85
|
+
if (!_claimed.has(e)) return false;
|
|
86
|
+
_claimed.delete(e);
|
|
87
|
+
_claimable.delete(e);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
function _schedule() {
|
|
91
|
+
if (_flushQueued) return;
|
|
92
|
+
_flushQueued = true;
|
|
93
|
+
queueMicrotask(() => {
|
|
94
|
+
_flushQueued = false;
|
|
95
|
+
const drainMaps = Array.from(_toFlush);
|
|
96
|
+
const bulk = _pendingBulk;
|
|
97
|
+
_toFlush.clear();
|
|
98
|
+
_pendingBulk = null;
|
|
99
|
+
for (let i = 0; i < drainMaps.length; i++) {
|
|
100
|
+
const m = drainMaps[i];
|
|
101
|
+
for (const e of m.values()) try {
|
|
102
|
+
e.disposer.dispose();
|
|
103
|
+
} catch {}
|
|
104
|
+
m.clear();
|
|
105
|
+
}
|
|
106
|
+
if (bulk) for (let i = 0; i < bulk.length; i++) {
|
|
107
|
+
const batch = bulk[i].entries;
|
|
108
|
+
for (let j = 0; j < batch.length; j++) try {
|
|
109
|
+
batch[j].disposer.dispose();
|
|
110
|
+
} catch {}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function _defer(pending, e) {
|
|
115
|
+
_untrackLive(pending, e);
|
|
116
|
+
pending.set(String(e.key), e);
|
|
117
|
+
_toFlush.add(pending);
|
|
118
|
+
_schedule();
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Queue a full batch of removed entries for deferred disposal. Cheaper than
|
|
122
|
+
* per-row `_defer` for whole-list ops (clear, disjoint replace): no
|
|
123
|
+
* `Map.set` per row. If a `_rescue` call arrives before the microtask
|
|
124
|
+
* drains, the batch is materialized into its target `pending` map first.
|
|
125
|
+
*/
|
|
126
|
+
function _deferBulk(pending, entries) {
|
|
127
|
+
if (entries.length === 0) return;
|
|
128
|
+
const next = [];
|
|
129
|
+
for (let i = 0; i < entries.length; i++) {
|
|
130
|
+
const e = entries[i];
|
|
131
|
+
if (_consumeClaim(e)) continue;
|
|
132
|
+
_untrackLive(pending, e);
|
|
133
|
+
next.push(e);
|
|
134
|
+
}
|
|
135
|
+
if (next.length === 0) return;
|
|
136
|
+
const batch = {
|
|
137
|
+
pending,
|
|
138
|
+
entries: next
|
|
139
|
+
};
|
|
140
|
+
if (_pendingBulk) _pendingBulk.push(batch);
|
|
141
|
+
else _pendingBulk = [batch];
|
|
142
|
+
_schedule();
|
|
143
|
+
}
|
|
144
|
+
function _rescue(pending, key, item) {
|
|
145
|
+
const e = pending.get(key);
|
|
146
|
+
if (e) {
|
|
147
|
+
pending.delete(key);
|
|
148
|
+
return e;
|
|
149
|
+
}
|
|
150
|
+
if (_pendingBulk) {
|
|
151
|
+
for (let i = 0; i < _pendingBulk.length; i++) {
|
|
152
|
+
const batch = _pendingBulk[i];
|
|
153
|
+
const target = batch.pending;
|
|
154
|
+
const items = batch.entries;
|
|
155
|
+
for (let j = 0; j < items.length; j++) target.set(String(items[j].key), items[j]);
|
|
156
|
+
_toFlush.add(target);
|
|
157
|
+
}
|
|
158
|
+
_pendingBulk = null;
|
|
159
|
+
const r = pending.get(key);
|
|
160
|
+
if (r) {
|
|
161
|
+
pending.delete(key);
|
|
162
|
+
return r;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (arguments.length >= 3) {
|
|
166
|
+
const raw = _unwrap(item);
|
|
167
|
+
const bucket = _live.get(pending)?.get(key);
|
|
168
|
+
if (bucket) {
|
|
169
|
+
for (const live of bucket) if (_claimable.has(live) && live.item === raw) {
|
|
170
|
+
_claimed.add(live);
|
|
171
|
+
_claimable.delete(live);
|
|
172
|
+
return live;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
//#endregion
|
|
179
|
+
//#region ../gea/src/runtime/keyed-list.ts
|
|
180
|
+
/** Unwrap a proxy value to its raw target. */
|
|
181
|
+
const unwrap = (v) => v && typeof v === "object" && v[GEA_PROXY_RAW] || v;
|
|
182
|
+
function keyedList(cfg) {
|
|
183
|
+
const { container, anchor, disposer, root, path, key: keyFn, createEntry, patchEntry, onItemRemove } = cfg;
|
|
184
|
+
const pending = cfg.pending ?? /* @__PURE__ */ new Map();
|
|
185
|
+
let entries = [];
|
|
186
|
+
const byKey = /* @__PURE__ */ new Map();
|
|
187
|
+
if (cfg.onByKeyCreated) cfg.onByKeyCreated(byKey);
|
|
188
|
+
const resolveArr = () => {
|
|
189
|
+
if (typeof path === "function") {
|
|
190
|
+
const v = path();
|
|
191
|
+
return Array.isArray(v) ? v : [];
|
|
192
|
+
}
|
|
193
|
+
let v = root;
|
|
194
|
+
for (let i = 0; i < path.length; i++) {
|
|
195
|
+
if (v == null) return [];
|
|
196
|
+
v = v[path[i]];
|
|
197
|
+
}
|
|
198
|
+
return Array.isArray(v) ? v : [];
|
|
199
|
+
};
|
|
200
|
+
const removeEntry = (e) => {
|
|
201
|
+
if (onItemRemove) onItemRemove(e);
|
|
202
|
+
byKey.delete(e.key);
|
|
203
|
+
if (_consumeClaim(e)) return;
|
|
204
|
+
if (e.element.parentNode) e.element.parentNode.removeChild(e.element);
|
|
205
|
+
_defer(pending, e);
|
|
206
|
+
};
|
|
207
|
+
const markEntriesLeaving = (next) => {
|
|
208
|
+
if (entries.length === 0) return;
|
|
209
|
+
const nextByKey = /* @__PURE__ */ new Map();
|
|
210
|
+
for (let i = 0; i < next.length; i++) {
|
|
211
|
+
const k = keyFn(next[i], i);
|
|
212
|
+
let bucket = nextByKey.get(k);
|
|
213
|
+
if (!bucket) nextByKey.set(k, bucket = /* @__PURE__ */ new Set());
|
|
214
|
+
bucket.add(unwrap(next[i]));
|
|
215
|
+
}
|
|
216
|
+
for (let i = 0; i < entries.length; i++) {
|
|
217
|
+
const e = entries[i];
|
|
218
|
+
_markClaimable(e, !nextByKey.get(e.key)?.has(e.item));
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
const firstArr = resolveArr();
|
|
222
|
+
if (firstArr.length > 0) {
|
|
223
|
+
const frag = container.ownerDocument.createDocumentFragment();
|
|
224
|
+
for (let i = 0; i < firstArr.length; i++) {
|
|
225
|
+
const item = firstArr[i];
|
|
226
|
+
const e = createEntry(item, i);
|
|
227
|
+
entries.push(e);
|
|
228
|
+
byKey.set(e.key, e);
|
|
229
|
+
_trackLive(pending, e);
|
|
230
|
+
frag.appendChild(e.element);
|
|
231
|
+
if (item && typeof item === "object") {
|
|
232
|
+
item[_DIRTY] = false;
|
|
233
|
+
item[_DIRTY_PROPS]?.clear();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
container.insertBefore(frag, anchor);
|
|
237
|
+
}
|
|
238
|
+
let prevArrRef = firstArr;
|
|
239
|
+
const reconcile = (arr, changes) => {
|
|
240
|
+
if (arr === prevArrRef && entries.length === arr.length) {
|
|
241
|
+
let structural = false;
|
|
242
|
+
let aipuOnly = changes && changes.length > 0;
|
|
243
|
+
if (changes && changes.length > 0) for (let i = 0; i < changes.length; i++) {
|
|
244
|
+
const c = changes[i];
|
|
245
|
+
if (c.type === "append" || c.type === "remove" || c.type === "delete" || c.type === "reorder") {
|
|
246
|
+
structural = true;
|
|
247
|
+
aipuOnly = false;
|
|
248
|
+
break;
|
|
249
|
+
}
|
|
250
|
+
if (!c.aipu) aipuOnly = false;
|
|
251
|
+
else structural = true;
|
|
252
|
+
}
|
|
253
|
+
if (aipuOnly && changes.length === 2) {
|
|
254
|
+
const a = changes[0].arix;
|
|
255
|
+
const b = changes[1].arix;
|
|
256
|
+
if (a >= 0 && b >= 0 && a < entries.length && b < entries.length && a !== b) {
|
|
257
|
+
const eA = entries[a];
|
|
258
|
+
const eB = entries[b];
|
|
259
|
+
const newAKey = keyFn(arr[a], a);
|
|
260
|
+
const newBKey = keyFn(arr[b], b);
|
|
261
|
+
if (eA.key === newBKey && eB.key === newAKey) {
|
|
262
|
+
const refB = eB.element.nextSibling;
|
|
263
|
+
container.insertBefore(eB.element, eA.element);
|
|
264
|
+
if (refB) container.insertBefore(eA.element, refB);
|
|
265
|
+
else container.appendChild(eA.element);
|
|
266
|
+
entries[a] = eB;
|
|
267
|
+
entries[b] = eA;
|
|
268
|
+
if (unwrap(arr[a]) !== eB.item) patchEntry(eB, arr[a], a);
|
|
269
|
+
if (unwrap(arr[b]) !== eA.item) patchEntry(eA, arr[b], b);
|
|
270
|
+
prevArrRef = arr;
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (!structural) {
|
|
276
|
+
const raw = arr[GEA_PROXY_RAW] || arr;
|
|
277
|
+
for (let i = 0; i < raw.length; i++) {
|
|
278
|
+
const item = raw[i];
|
|
279
|
+
if (item && typeof item === "object" && item[_DIRTY]) {
|
|
280
|
+
patchEntry(entries[i], item, i);
|
|
281
|
+
item[_DIRTY] = false;
|
|
282
|
+
item[_DIRTY_PROPS]?.clear();
|
|
283
|
+
entries[i].item = item;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (changes && changes.length > 0 && entries.length < arr.length) {
|
|
290
|
+
let onlyAppends = true;
|
|
291
|
+
let appendCount = 0;
|
|
292
|
+
for (let i = 0; i < changes.length; i++) {
|
|
293
|
+
if (changes[i].type !== "append") {
|
|
294
|
+
onlyAppends = false;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
appendCount += changes[i].count || 0;
|
|
298
|
+
}
|
|
299
|
+
if (onlyAppends && appendCount === arr.length - entries.length) {
|
|
300
|
+
const startIdx = entries.length;
|
|
301
|
+
const frag = container.ownerDocument.createDocumentFragment();
|
|
302
|
+
for (let i = startIdx; i < arr.length; i++) {
|
|
303
|
+
const e = createEntry(arr[i], i);
|
|
304
|
+
entries.push(e);
|
|
305
|
+
byKey.set(e.key, e);
|
|
306
|
+
_trackLive(pending, e);
|
|
307
|
+
frag.appendChild(e.element);
|
|
308
|
+
}
|
|
309
|
+
container.insertBefore(frag, anchor);
|
|
310
|
+
prevArrRef = arr;
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (changes && changes.length > 0 && entries.length > arr.length) {
|
|
315
|
+
let onlyRemoves = true;
|
|
316
|
+
let totalRemoved = 0;
|
|
317
|
+
for (let i = 0; i < changes.length; i++) {
|
|
318
|
+
const c = changes[i];
|
|
319
|
+
if (c.type !== "remove") {
|
|
320
|
+
onlyRemoves = false;
|
|
321
|
+
break;
|
|
322
|
+
}
|
|
323
|
+
totalRemoved += c.count || 0;
|
|
324
|
+
}
|
|
325
|
+
if (onlyRemoves && entries.length - arr.length === totalRemoved) {
|
|
326
|
+
if (changes.length === 1 && changes[0].count === 1) {
|
|
327
|
+
const idx = changes[0].start;
|
|
328
|
+
if (idx >= 0 && idx < entries.length) {
|
|
329
|
+
removeEntry(entries[idx]);
|
|
330
|
+
entries.splice(idx, 1);
|
|
331
|
+
}
|
|
332
|
+
prevArrRef = arr;
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
const rmIdx = [];
|
|
336
|
+
for (const c of changes) {
|
|
337
|
+
const s = c.start;
|
|
338
|
+
const ct = c.count;
|
|
339
|
+
for (let k = 0; k < ct; k++) rmIdx.push(s + k);
|
|
340
|
+
}
|
|
341
|
+
rmIdx.sort((a, b) => b - a);
|
|
342
|
+
for (let i = 0; i < rmIdx.length; i++) {
|
|
343
|
+
const j = rmIdx[i];
|
|
344
|
+
if (j >= 0 && j < entries.length) {
|
|
345
|
+
removeEntry(entries[j]);
|
|
346
|
+
entries.splice(j, 1);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
prevArrRef = arr;
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
const newLen = arr.length;
|
|
354
|
+
const oldLen = entries.length;
|
|
355
|
+
if (oldLen === 0 && newLen > 0) {
|
|
356
|
+
const freshEntries = new Array(newLen);
|
|
357
|
+
const frag = container.ownerDocument.createDocumentFragment();
|
|
358
|
+
for (let i = 0; i < newLen; i++) {
|
|
359
|
+
const e = createEntry(arr[i], i);
|
|
360
|
+
freshEntries[i] = e;
|
|
361
|
+
byKey.set(e.key, e);
|
|
362
|
+
_trackLive(pending, e);
|
|
363
|
+
frag.appendChild(e.element);
|
|
364
|
+
}
|
|
365
|
+
container.insertBefore(frag, anchor);
|
|
366
|
+
entries = freshEntries;
|
|
367
|
+
prevArrRef = arr;
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
const newKeys = new Array(newLen);
|
|
371
|
+
for (let i = 0; i < newLen; i++) newKeys[i] = keyFn(arr[i], i);
|
|
372
|
+
if (newLen === 0) {
|
|
373
|
+
if (container.childNodes.length === oldLen + 1) {
|
|
374
|
+
if (onItemRemove) {
|
|
375
|
+
for (let i = 0; i < oldLen; i++) onItemRemove(entries[i]);
|
|
376
|
+
_deferBulk(pending, entries);
|
|
377
|
+
} else _deferBulk(pending, entries);
|
|
378
|
+
container.textContent = "";
|
|
379
|
+
container.appendChild(anchor);
|
|
380
|
+
} else for (let i = oldLen - 1; i >= 0; i--) removeEntry(entries[i]);
|
|
381
|
+
entries = [];
|
|
382
|
+
byKey.clear();
|
|
383
|
+
prevArrRef = arr;
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
if (newLen === oldLen) {
|
|
387
|
+
let diffA = -1, diffB = -1, diffCount = 0;
|
|
388
|
+
for (let i = 0; i < newLen; i++) if (entries[i].key !== newKeys[i]) {
|
|
389
|
+
if (diffCount === 0) diffA = i;
|
|
390
|
+
else if (diffCount === 1) diffB = i;
|
|
391
|
+
diffCount++;
|
|
392
|
+
if (diffCount > 2) break;
|
|
393
|
+
}
|
|
394
|
+
if (diffCount === 2 && entries[diffA].key === newKeys[diffB] && entries[diffB].key === newKeys[diffA]) {
|
|
395
|
+
const eA = entries[diffA], eB = entries[diffB];
|
|
396
|
+
const refB = eB.element.nextSibling;
|
|
397
|
+
container.insertBefore(eB.element, eA.element);
|
|
398
|
+
if (refB) container.insertBefore(eA.element, refB);
|
|
399
|
+
else container.appendChild(eA.element);
|
|
400
|
+
entries[diffA] = eB;
|
|
401
|
+
entries[diffB] = eA;
|
|
402
|
+
if (unwrap(arr[diffA]) !== eB.item) patchEntry(eB, arr[diffA], diffA);
|
|
403
|
+
if (unwrap(arr[diffB]) !== eA.item) patchEntry(eA, arr[diffB], diffB);
|
|
404
|
+
prevArrRef = arr;
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (oldLen > 0 && newLen > 0 && container.childNodes.length === oldLen + 1) {
|
|
409
|
+
let disjoint = true;
|
|
410
|
+
for (let i = 0; i < newLen; i++) if (byKey.has(newKeys[i])) {
|
|
411
|
+
disjoint = false;
|
|
412
|
+
break;
|
|
413
|
+
}
|
|
414
|
+
if (disjoint) {
|
|
415
|
+
if (onItemRemove) {
|
|
416
|
+
for (let i = 0; i < oldLen; i++) onItemRemove(entries[i]);
|
|
417
|
+
_deferBulk(pending, entries);
|
|
418
|
+
} else _deferBulk(pending, entries);
|
|
419
|
+
byKey.clear();
|
|
420
|
+
const newEntries = new Array(newLen);
|
|
421
|
+
const newEls = new Array(newLen + 1);
|
|
422
|
+
for (let i = 0; i < newLen; i++) {
|
|
423
|
+
const e = createEntry(arr[i], i);
|
|
424
|
+
newEntries[i] = e;
|
|
425
|
+
newEls[i] = e.element;
|
|
426
|
+
byKey.set(e.key, e);
|
|
427
|
+
_trackLive(pending, e);
|
|
428
|
+
}
|
|
429
|
+
newEls[newLen] = anchor;
|
|
430
|
+
container.replaceChildren(...newEls);
|
|
431
|
+
entries = newEntries;
|
|
432
|
+
prevArrRef = arr;
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
for (let i = 0; i < oldLen; i++) entries[i]._i = i;
|
|
437
|
+
const newToOld = new Array(newLen);
|
|
438
|
+
const seenOld = new Array(oldLen).fill(false);
|
|
439
|
+
for (let i = 0; i < newLen; i++) {
|
|
440
|
+
const existing = byKey.get(newKeys[i]);
|
|
441
|
+
if (existing) {
|
|
442
|
+
const oldIdx = existing._i;
|
|
443
|
+
newToOld[i] = oldIdx;
|
|
444
|
+
seenOld[oldIdx] = true;
|
|
445
|
+
} else newToOld[i] = -1;
|
|
446
|
+
}
|
|
447
|
+
for (let i = oldLen - 1; i >= 0; i--) if (!seenOld[i]) removeEntry(entries[i]);
|
|
448
|
+
const stable = new Set(lis(newToOld));
|
|
449
|
+
const next = new Array(newLen);
|
|
450
|
+
let nextRef = anchor;
|
|
451
|
+
for (let i = newLen - 1; i >= 0; i--) {
|
|
452
|
+
const oldIdx = newToOld[i];
|
|
453
|
+
let e;
|
|
454
|
+
if (oldIdx === -1) {
|
|
455
|
+
e = createEntry(arr[i], i);
|
|
456
|
+
byKey.set(e.key, e);
|
|
457
|
+
_trackLive(pending, e);
|
|
458
|
+
container.insertBefore(e.element, nextRef);
|
|
459
|
+
} else {
|
|
460
|
+
e = entries[oldIdx];
|
|
461
|
+
if (e.item !== unwrap(arr[i])) patchEntry(e, arr[i], i);
|
|
462
|
+
if (e.element.parentNode !== container) container.insertBefore(e.element, nextRef);
|
|
463
|
+
else if (!stable.has(i)) container.insertBefore(e.element, nextRef);
|
|
464
|
+
}
|
|
465
|
+
next[i] = e;
|
|
466
|
+
nextRef = e.element;
|
|
467
|
+
}
|
|
468
|
+
entries = next;
|
|
469
|
+
prevArrRef = arr;
|
|
470
|
+
};
|
|
471
|
+
if (typeof path === "function") withTracking(disposer, root, () => {
|
|
472
|
+
const arr = path();
|
|
473
|
+
const next = Array.isArray(arr) ? arr : [];
|
|
474
|
+
markEntriesLeaving(next);
|
|
475
|
+
queueMicrotask(() => reconcile(next));
|
|
476
|
+
});
|
|
477
|
+
else {
|
|
478
|
+
const off = subscribe(root, path, (_v, changes) => {
|
|
479
|
+
reconcile(resolveArr(), changes);
|
|
480
|
+
});
|
|
481
|
+
disposer.add(off);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
//#endregion
|
|
485
|
+
export { _rescue as n, keyedList as t };
|
|
486
|
+
|
|
487
|
+
//# sourceMappingURL=keyed-list.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keyed-list.mjs","names":["GEA_DIRTY","GEA_DIRTY_PROPS"],"sources":["../../gea/src/runtime/keyed-list/lis.ts","../../gea/src/runtime/keyed-list/rescue.ts","../../gea/src/runtime/keyed-list.ts"],"sourcesContent":["/**\n * Longest Increasing Subsequence — O(n log n). Input is `newToOld[]`\n * (index in new array → index in old array, or `-1` for new items). Output\n * is the set of new-indices that form the longest increasing run of old\n * indices, i.e. the set of entries that can stay put during a reorder.\n */\nexport function lis(arr: number[]): number[] {\n const n = arr.length\n if (n === 0) return []\n const vals: number[] = []\n const idxs: number[] = []\n for (let i = 0; i < n; i++) {\n if (arr[i] !== -1) {\n vals.push(arr[i])\n idxs.push(i)\n }\n }\n const m = vals.length\n if (m === 0) return []\n const tails: number[] = []\n const tIdx: number[] = []\n const pred = new Array(m).fill(-1)\n for (let i = 0; i < m; i++) {\n const v = vals[i]\n let lo = 0,\n hi = tails.length\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (tails[mid] < v) lo = mid + 1\n else hi = mid\n }\n if (lo === tails.length) {\n tails.push(v)\n tIdx.push(i)\n } else {\n tails[lo] = v\n tIdx[lo] = i\n }\n if (lo > 0) pred[i] = tIdx[lo - 1]\n }\n const out = new Array(tails.length)\n let k = tIdx[tails.length - 1]\n for (let i = tails.length - 1; i >= 0; i--) {\n out[i] = idxs[k]\n k = pred[k]\n }\n return out\n}\n","/**\n * Cross-list rescue. `removeEntry` queues `disposer.dispose()` to a microtask\n * instead of firing it synchronously. If the same `.map()` site's\n * `createEntry` sees the matching key before that microtask runs, it pulls\n * the entry back out — DOM + disposer + subscriptions transfer intact.\n *\n * The `pending` map is **per-site**: the compiler emits one `Map<string, Entry>`\n * literal per `.map()` site at module scope and threads it into every\n * `_defer` / `_deferBulk` / `_rescue` call. Two unrelated `.map()` sites\n * can't collide because they literally don't share a Map.\n */\nimport type { Entry } from './types'\nimport { GEA_PROXY_RAW } from '../symbols'\n\ntype Pending = Map<string, Entry>\ntype LiveEntries = Map<string, Set<Entry>>\n\ninterface PendingBulkBatch {\n pending: Pending\n entries: Entry[]\n}\n\nconst _toFlush = new Set<Pending>()\nconst _live = new WeakMap<Pending, LiveEntries>()\nconst _claimed = new WeakSet<Entry>()\nconst _claimable = new WeakSet<Entry>()\nlet _pendingBulk: PendingBulkBatch[] | null = null\nlet _flushQueued = false\n\nconst _unwrap = (v: any): any => (v && typeof v === 'object' && v[GEA_PROXY_RAW]) || v\n\nfunction _liveFor(pending: Pending): LiveEntries {\n let live = _live.get(pending)\n if (!live) {\n live = new Map()\n _live.set(pending, live)\n }\n return live\n}\n\nexport function _trackLive(pending: Pending, e: Entry): void {\n const key = String(e.key)\n const live = _liveFor(pending)\n let bucket = live.get(key)\n if (!bucket) live.set(key, (bucket = new Set()))\n bucket.add(e)\n}\n\nfunction _untrackLive(pending: Pending, e: Entry): void {\n _claimable.delete(e)\n const bucket = _live.get(pending)?.get(String(e.key))\n if (!bucket) return\n bucket.delete(e)\n if (bucket.size === 0) _live.get(pending)?.delete(String(e.key))\n}\n\nexport function _markClaimable(e: Entry, claimable: boolean): void {\n if (claimable) _claimable.add(e)\n else _claimable.delete(e)\n}\n\nexport function _consumeClaim(e: Entry): boolean {\n if (!_claimed.has(e)) return false\n _claimed.delete(e)\n _claimable.delete(e)\n return true\n}\n\nfunction _schedule(): void {\n if (_flushQueued) return\n _flushQueued = true\n queueMicrotask(() => {\n _flushQueued = false\n const drainMaps = Array.from(_toFlush)\n const bulk = _pendingBulk\n _toFlush.clear()\n _pendingBulk = null\n for (let i = 0; i < drainMaps.length; i++) {\n const m = drainMaps[i]\n for (const e of m.values()) {\n try {\n e.disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n m.clear()\n }\n if (bulk) {\n for (let i = 0; i < bulk.length; i++) {\n const batch = bulk[i].entries\n for (let j = 0; j < batch.length; j++) {\n try {\n batch[j].disposer.dispose()\n } catch {\n /* isolated */\n }\n }\n }\n }\n })\n}\n\nexport function _defer(pending: Pending, e: Entry): void {\n _untrackLive(pending, e)\n pending.set(String(e.key), e)\n _toFlush.add(pending)\n _schedule()\n}\n\n/**\n * Queue a full batch of removed entries for deferred disposal. Cheaper than\n * per-row `_defer` for whole-list ops (clear, disjoint replace): no\n * `Map.set` per row. If a `_rescue` call arrives before the microtask\n * drains, the batch is materialized into its target `pending` map first.\n */\nexport function _deferBulk(pending: Pending, entries: Entry[]): void {\n if (entries.length === 0) return\n const next: Entry[] = []\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n if (_consumeClaim(e)) continue\n _untrackLive(pending, e)\n next.push(e)\n }\n if (next.length === 0) return\n const batch: PendingBulkBatch = { pending, entries: next }\n if (_pendingBulk) _pendingBulk.push(batch)\n else _pendingBulk = [batch]\n _schedule()\n}\n\nexport function _rescue(pending: Pending, key: string, item?: any): Entry | null {\n const e = pending.get(key)\n if (e) {\n pending.delete(key)\n return e\n }\n\n // Lazy fallback: materialize any pending bulk batches into their target\n // pending maps so cross-site rescue still works without paying per-row\n // Map.set on the common no-rescue-needed bulk path.\n if (_pendingBulk) {\n for (let i = 0; i < _pendingBulk.length; i++) {\n const batch = _pendingBulk[i]\n const target = batch.pending\n const items = batch.entries\n for (let j = 0; j < items.length; j++) target.set(String(items[j].key), items[j])\n _toFlush.add(target)\n }\n _pendingBulk = null\n const r = pending.get(key)\n if (r) {\n pending.delete(key)\n return r\n }\n }\n\n if (arguments.length >= 3) {\n const raw = _unwrap(item)\n const bucket = _live.get(pending)?.get(key)\n if (bucket) {\n for (const live of bucket) {\n if (_claimable.has(live) && live.item === raw) {\n _claimed.add(live)\n _claimable.delete(live)\n return live\n }\n }\n }\n }\n return null\n}\n","/**\n * keyedList — compile-time-specialized keyed list reconciler.\n *\n * This module is the **diff kernel only**. It does not know about:\n * - item proxies (`ItemObs`, `createItemProxy`)\n * - row disposers (allocated or shared no-op)\n * - compiler analysis flags (`noItemProxy`, `skipInitialPatch`, etc.)\n * - the `createItem` / `patchRow` pair\n * - owner lifecycle hooks (`registerListState`, `onItemSync`)\n *\n * All that logic is inlined by the compiler at each `.map()` site via\n * three specialized closures:\n *\n * - `createEntry(item, idx) => Entry`:\n * Full per-row work — `_rescue` lookup, disposer allocation (or\n * not), `ItemObs` construction (or not), template clone + walks +\n * bindings + stamps, initial patch writes. Opaque to the kernel.\n * - `patchEntry(e, newItem, newIdx)`:\n * Per-row identity-change work — `e.item` update, `obs.fire` (if\n * proxied), direct DOM writes on dirty bindings, dirty-bit clear.\n * - `onItemRemove?(e)` (optional):\n * User-level cleanup on removal (relational-class map delete, etc.).\n * Omit entirely for rows with no cleanup.\n *\n * Apps whose sites never need item-proxies end up with zero references\n * to `ItemObs` / `createItemProxy` through the kernel's import graph\n * → tree-shaker drops them → bundle shrinks.\n */\n\nimport type { Disposer } from './disposer'\nimport { subscribe } from './subscribe'\nimport { withTracking } from './with-tracking'\nimport type { Change } from '../store'\nimport { GEA_DIRTY, GEA_DIRTY_PROPS } from './dirty-symbols'\nimport { GEA_PROXY_RAW } from './symbols'\nimport { lis } from './keyed-list/lis'\nimport type { Entry } from './keyed-list/types'\nimport { _consumeClaim, _defer, _deferBulk, _markClaimable, _trackLive } from './keyed-list/rescue'\nimport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\n/** Unwrap a proxy value to its raw target. */\nconst unwrap = (v: any): any => (v && typeof v === 'object' && v[GEA_PROXY_RAW]) || v\n\nexport { GEA_DOM_ITEM, GEA_DOM_KEY } from './keyed-list-symbols'\n\nexport type { Entry, ItemObservable } from './keyed-list/types'\n\nexport interface KeyedListConfig {\n container: Element\n anchor: Comment\n disposer: Disposer\n root: any\n /**\n * Per-site rescue queue. The compiler emits one `Map<string, Entry>` literal\n * per `.map()` site at module scope and threads it through here so two\n * unrelated sites can't collide. Optional for hand-written callers (a fresh\n * map is allocated when omitted, disabling cross-render rescue but keeping\n * the disposer microtask intact).\n */\n pending?: Map<string, Entry>\n /** Either a static path on `root` (`['items']`) OR a getter returning the array. */\n path: readonly string[] | (() => any[])\n key: (item: any, idx: number) => string\n /** Compiler-specialized: create a new entry for this item at index `idx`. */\n createEntry: (item: any, idx: number) => Entry\n /** Compiler-specialized: apply a new item identity to an existing entry. */\n patchEntry: (e: Entry, newItem: any, newIdx: number) => void\n /** Optional: user-level cleanup on row removal (relational-class map delete). */\n onItemRemove?: (e: Entry) => void\n /** Optional: gives relational-class setup access to the kernel's byKey Map. */\n onByKeyCreated?: (byKey: Map<string, Entry>) => void\n}\n\nexport function keyedList(cfg: KeyedListConfig): void {\n const { container, anchor, disposer, root, path, key: keyFn, createEntry, patchEntry, onItemRemove } = cfg\n const pending: Map<string, Entry> = cfg.pending ?? new Map()\n\n let entries: Entry[] = []\n const byKey = new Map<string, Entry>()\n if (cfg.onByKeyCreated) cfg.onByKeyCreated(byKey)\n\n const resolveArr = (): any[] => {\n if (typeof path === 'function') {\n const v = (path as () => any[])()\n return Array.isArray(v) ? v : []\n }\n let v: any = root\n for (let i = 0; i < (path as readonly string[]).length; i++) {\n if (v == null) return []\n v = v[(path as readonly string[])[i]]\n }\n return Array.isArray(v) ? v : []\n }\n\n const removeEntry = (e: Entry): void => {\n if (onItemRemove) onItemRemove(e)\n byKey.delete(e.key)\n if (_consumeClaim(e)) return\n if (e.element.parentNode) e.element.parentNode.removeChild(e.element)\n _defer(pending, e)\n }\n\n const markEntriesLeaving = (next: any[]): void => {\n if (entries.length === 0) return\n const nextByKey = new Map<string, Set<any>>()\n for (let i = 0; i < next.length; i++) {\n const k = keyFn(next[i], i)\n let bucket = nextByKey.get(k)\n if (!bucket) nextByKey.set(k, (bucket = new Set()))\n bucket.add(unwrap(next[i]))\n }\n for (let i = 0; i < entries.length; i++) {\n const e = entries[i]\n _markClaimable(e, !nextByKey.get(e.key)?.has(e.item))\n }\n }\n\n // ── First render ──────────────────────────────────────────────────────\n const firstArr = resolveArr()\n if (firstArr.length > 0) {\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < firstArr.length; i++) {\n const item = firstArr[i]\n const e = createEntry(item, i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n if (item && typeof item === 'object') {\n ;(item as any)[GEA_DIRTY] = false\n ;(item as any)[GEA_DIRTY_PROPS]?.clear()\n }\n }\n container.insertBefore(frag, anchor)\n }\n\n let prevArrRef: any = firstArr\n\n // ── Reconciliation ────────────────────────────────────────────────────\n const reconcile = (arr: any[], changes?: Change[]): void => {\n // Same array ref + same length → structural no-op. Dirty-bit scan\n // picks up in-place item writes.\n if (arr === prevArrRef && entries.length === arr.length) {\n let structural = false\n let aipuOnly = changes && changes.length > 0\n if (changes && changes.length > 0) {\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type === 'append' || c.type === 'remove' || c.type === 'delete' || c.type === 'reorder') {\n structural = true\n aipuOnly = false\n break\n }\n if (!c.aipu) aipuOnly = false\n else structural = true\n }\n }\n // aipu-only 2-swap: items[i]↔items[j] via two symmetric aipu records.\n if (aipuOnly && changes!.length === 2) {\n const a = changes![0].arix as number\n const b = changes![1].arix as number\n if (a >= 0 && b >= 0 && a < entries.length && b < entries.length && a !== b) {\n const eA = entries[a]\n const eB = entries[b]\n const newAKey = keyFn(arr[a], a)\n const newBKey = keyFn(arr[b], b)\n if (eA.key === newBKey && eB.key === newAKey) {\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[a] = eB\n entries[b] = eA\n if (unwrap(arr[a]) !== eB.item) patchEntry(eB, arr[a], a)\n if (unwrap(arr[b]) !== eA.item) patchEntry(eA, arr[b], b)\n prevArrRef = arr\n return\n }\n }\n }\n if (!structural) {\n // Dirty-aware patch pass. Same array ref + no structural change →\n // in-place item mutations (e.g. `store.items[i].label = 'X'`) only.\n // The store's nested-proxy set trap stamped `item[GEA_DIRTY]=true`;\n // walk the raw array and patch marked items. Runtime owns the\n // dirty-bit protocol — compiler-emitted patchEntry doesn't see it.\n const raw = (arr as any)[GEA_PROXY_RAW] || arr\n for (let i = 0; i < raw.length; i++) {\n const item = raw[i]\n if (item && typeof item === 'object' && item[GEA_DIRTY]) {\n patchEntry(entries[i], item, i)\n item[GEA_DIRTY] = false\n item[GEA_DIRTY_PROPS]?.clear()\n entries[i].item = item\n }\n }\n return\n }\n }\n\n // Append-only.\n if (changes && changes.length > 0 && entries.length < arr.length) {\n let onlyAppends = true\n let appendCount = 0\n for (let i = 0; i < changes.length; i++) {\n if (changes[i].type !== 'append') {\n onlyAppends = false\n break\n }\n appendCount += (changes[i].count as number) || 0\n }\n if (onlyAppends && appendCount === arr.length - entries.length) {\n const startIdx = entries.length\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = startIdx; i < arr.length; i++) {\n const e = createEntry(arr[i], i)\n entries.push(e)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n prevArrRef = arr\n return\n }\n }\n\n // Remove-only.\n if (changes && changes.length > 0 && entries.length > arr.length) {\n let onlyRemoves = true\n let totalRemoved = 0\n for (let i = 0; i < changes.length; i++) {\n const c = changes[i]\n if (c.type !== 'remove') {\n onlyRemoves = false\n break\n }\n totalRemoved += (c.count as number) || 0\n }\n if (onlyRemoves && entries.length - arr.length === totalRemoved) {\n if (changes.length === 1 && (changes[0].count as number) === 1) {\n const idx = changes[0].start as number\n if (idx >= 0 && idx < entries.length) {\n removeEntry(entries[idx])\n entries.splice(idx, 1)\n }\n prevArrRef = arr\n return\n }\n const rmIdx: number[] = []\n for (const c of changes) {\n const s = c.start as number\n const ct = c.count as number\n for (let k = 0; k < ct; k++) rmIdx.push(s + k)\n }\n rmIdx.sort((a, b) => b - a)\n for (let i = 0; i < rmIdx.length; i++) {\n const j = rmIdx[i]\n if (j >= 0 && j < entries.length) {\n removeEntry(entries[j])\n entries.splice(j, 1)\n }\n }\n prevArrRef = arr\n return\n }\n }\n\n // ── General keyed reconciliation ─────────────────────────────────\n const newLen = arr.length\n const oldLen = entries.length\n\n // Fresh-create fast path (09_clear1k_x8 per-cycle).\n if (oldLen === 0 && newLen > 0) {\n const freshEntries: Entry[] = new Array(newLen)\n const frag = container.ownerDocument!.createDocumentFragment()\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n freshEntries[i] = e\n byKey.set(e.key, e)\n _trackLive(pending, e)\n frag.appendChild(e.element)\n }\n container.insertBefore(frag, anchor)\n entries = freshEntries\n prevArrRef = arr\n return\n }\n\n const newKeys: string[] = new Array(newLen)\n for (let i = 0; i < newLen; i++) newKeys[i] = keyFn(arr[i], i)\n\n if (newLen === 0) {\n // Bulk clear.\n if (container.childNodes.length === oldLen + 1) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n container.textContent = ''\n container.appendChild(anchor)\n } else {\n for (let i = oldLen - 1; i >= 0; i--) removeEntry(entries[i])\n }\n entries = []\n byKey.clear()\n prevArrRef = arr\n return\n }\n\n // Swap fast path (05_swap).\n if (newLen === oldLen) {\n let diffA = -1,\n diffB = -1,\n diffCount = 0\n for (let i = 0; i < newLen; i++) {\n if (entries[i].key !== newKeys[i]) {\n if (diffCount === 0) diffA = i\n else if (diffCount === 1) diffB = i\n diffCount++\n if (diffCount > 2) break\n }\n }\n if (diffCount === 2 && entries[diffA].key === newKeys[diffB] && entries[diffB].key === newKeys[diffA]) {\n const eA = entries[diffA],\n eB = entries[diffB]\n const refB = eB.element.nextSibling\n container.insertBefore(eB.element, eA.element)\n if (refB) container.insertBefore(eA.element, refB)\n else container.appendChild(eA.element)\n entries[diffA] = eB\n entries[diffB] = eA\n if (unwrap(arr[diffA]) !== eB.item) patchEntry(eB, arr[diffA], diffA)\n if (unwrap(arr[diffB]) !== eA.item) patchEntry(eA, arr[diffB], diffB)\n prevArrRef = arr\n return\n }\n }\n\n // Disjoint-replace (02_replace1k).\n if (oldLen > 0 && newLen > 0 && container.childNodes.length === oldLen + 1) {\n let disjoint = true\n for (let i = 0; i < newLen; i++) {\n if (byKey.has(newKeys[i])) {\n disjoint = false\n break\n }\n }\n if (disjoint) {\n if (onItemRemove) {\n for (let i = 0; i < oldLen; i++) onItemRemove(entries[i])\n _deferBulk(pending, entries)\n } else {\n _deferBulk(pending, entries)\n }\n byKey.clear()\n const newEntries: Entry[] = new Array(newLen)\n const newEls: Node[] = new Array(newLen + 1)\n for (let i = 0; i < newLen; i++) {\n const e = createEntry(arr[i], i)\n newEntries[i] = e\n newEls[i] = e.element\n byKey.set(e.key, e)\n _trackLive(pending, e)\n }\n newEls[newLen] = anchor\n ;(container as any).replaceChildren(...newEls)\n entries = newEntries\n prevArrRef = arr\n return\n }\n }\n\n // General LIS reconcile.\n for (let i = 0; i < oldLen; i++) (entries[i] as any)._i = i\n const newToOld = new Array(newLen)\n const seenOld = new Array(oldLen).fill(false)\n for (let i = 0; i < newLen; i++) {\n const existing = byKey.get(newKeys[i])\n if (existing) {\n const oldIdx = (existing as any)._i as number\n newToOld[i] = oldIdx\n seenOld[oldIdx] = true\n } else {\n newToOld[i] = -1\n }\n }\n\n for (let i = oldLen - 1; i >= 0; i--) {\n if (!seenOld[i]) removeEntry(entries[i])\n }\n\n const stable = new Set(lis(newToOld))\n\n const next: Entry[] = new Array(newLen)\n let nextRef: Node = anchor\n for (let i = newLen - 1; i >= 0; i--) {\n const oldIdx = newToOld[i]\n let e: Entry\n if (oldIdx === -1) {\n e = createEntry(arr[i], i)\n byKey.set(e.key, e)\n _trackLive(pending, e)\n container.insertBefore(e.element, nextRef)\n } else {\n e = entries[oldIdx]\n if (e.item !== unwrap(arr[i])) patchEntry(e, arr[i], i)\n if (e.element.parentNode !== container) container.insertBefore(e.element, nextRef)\n else if (!stable.has(i)) container.insertBefore(e.element, nextRef)\n }\n next[i] = e\n nextRef = e.element\n }\n\n entries = next\n prevArrRef = arr\n }\n\n // ── Subscribe for array updates ──────────────────────────────────────\n if (typeof path === 'function') {\n withTracking(disposer, root, () => {\n const arr = (path as () => any[])()\n const next = Array.isArray(arr) ? arr : []\n markEntriesLeaving(next)\n queueMicrotask(() => reconcile(next))\n })\n } else {\n const off = subscribe(root, path as readonly string[], (_v: any, changes?: Change[]) => {\n reconcile(resolveArr(), changes)\n })\n disposer.add(off)\n }\n}\n"],"mappings":"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"}
|
package/dist/label.d.mts
CHANGED
package/dist/label.mjs
CHANGED
|
@@ -1,49 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { n as cn, t as CompiledComponent } from "./compiled-component.mjs";
|
|
2
|
+
import { o as GEA_CREATE_TEMPLATE } from "./bind.mjs";
|
|
3
|
+
import { t as reactiveText } from "./reactive-text.mjs";
|
|
4
|
+
import { t as reactiveAttr } from "./reactive-attr.mjs";
|
|
5
|
+
import { t as reactiveClass } from "./reactive-class.mjs";
|
|
3
6
|
//#region src/components/label.tsx
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
if (key === "htmlFor") {
|
|
22
|
-
const __el = this[GEA_ELEMENT];
|
|
23
|
-
if (__el) {
|
|
24
|
-
var __av = value;
|
|
25
|
-
if (__av == null || __av === false) __el.removeAttribute("for");
|
|
26
|
-
else {
|
|
27
|
-
const __newAttr = String(__av);
|
|
28
|
-
if (__el.getAttribute("for") !== __newAttr) __el.setAttribute("for", __newAttr);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
if (key === "children") {
|
|
33
|
-
const __el = this[GEA_ELEMENT];
|
|
34
|
-
if (__el) {
|
|
35
|
-
const __tw = document.createElement("template");
|
|
36
|
-
__tw.innerHTML = value;
|
|
37
|
-
const __newEl = __tw.content.firstElementChild;
|
|
38
|
-
const __existEl = __el.firstElementChild;
|
|
39
|
-
if (__newEl && __existEl && __tw.content.childNodes.length === 1) this.constructor[GEA_PATCH_NODE](__existEl, __newEl, true);
|
|
40
|
-
else if (__el.innerHTML !== value) {
|
|
41
|
-
__el.innerHTML = value;
|
|
42
|
-
this[GEA_INSTANTIATE_CHILD_COMPONENTS]();
|
|
43
|
-
if (this.parentComponent) this.parentComponent[GEA_MOUNT_COMPILED_CHILD_COMPONENTS]();
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
7
|
+
function _tpl0_create() {
|
|
8
|
+
const e = document.createElement("label");
|
|
9
|
+
e.textContent = "0";
|
|
10
|
+
return e;
|
|
11
|
+
}
|
|
12
|
+
var Label = class extends CompiledComponent {
|
|
13
|
+
[GEA_CREATE_TEMPLATE](d) {
|
|
14
|
+
const root = _tpl0_create();
|
|
15
|
+
const el0 = root;
|
|
16
|
+
const el1 = el0;
|
|
17
|
+
const marker2 = root.firstChild;
|
|
18
|
+
reactiveClass(el0, d, this, () => cn("text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70", this.props.class));
|
|
19
|
+
reactiveAttr(el1, d, this, "for", () => this.props.htmlFor);
|
|
20
|
+
reactiveText(marker2, d, this, () => this.props.children);
|
|
21
|
+
return root;
|
|
47
22
|
}
|
|
48
23
|
};
|
|
49
24
|
//#endregion
|
package/dist/label.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.mjs","names":["
|
|
1
|
+
{"version":3,"file":"label.mjs","names":["GEA_CREATE_TEMPLATE","reactiveClass","reactiveAttr","reactiveText","CompiledComponent","Component","cn","_tpl0_create","e","document","createElement","textContent","Label","d","root","el0","el1","marker2","firstChild","props","class","htmlFor","t2","children"],"sources":["../src/components/label.tsx"],"sourcesContent":["import { Component } from '@geajs/core'\nimport { cn } from '../utils/cn'\n\nexport default class Label extends Component {\n template(props: any) {\n return (\n <label\n class={cn(\n 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70',\n props.class,\n )}\n for={props.htmlFor}\n >\n {props.children}\n </label>\n )\n }\n}\n"],"mappings":";;;;;;AAGA,SAASO,eAAe;CACtB,MAAMC,IAAIC,SAASC,cAAc,QAAQ;AACzCF,GAAEG,cAAc;AAChB,QAAOH;;AAET,IAAqBI,QAArB,cAAmCR,kBAAkB;CACnD,CAACJ,qBAAqBa,GAAG;EACvB,MAAMC,OAAOP,cAAc;EAC3B,MAAMQ,MAAMD;EACZ,MAAME,MAAMD;EACZ,MAAME,UAAUH,KAAKI;AACrBjB,gBAAcc,KAAKF,GAAG,YAAYP,GAAG,8FAA8F,KAAKa,MAAMC,MAAM,CAAC;AACrJlB,eAAac,KAAKH,GAAG,MAAM,aAAa,KAAKM,MAAME,QAAQ;AAE3DlB,eAAamB,SAAIT,GAAG,YAAY,KAAKM,MAAMI,SAAS;AACpD,SAAOT"}
|
package/dist/menu.d.mts
CHANGED
|
@@ -7,7 +7,7 @@ declare class Menu extends ZagComponent {
|
|
|
7
7
|
open: boolean;
|
|
8
8
|
createMachine(_props: any): any;
|
|
9
9
|
getMachineProps(props: any): {
|
|
10
|
-
id:
|
|
10
|
+
id: string;
|
|
11
11
|
open: any;
|
|
12
12
|
defaultOpen: any;
|
|
13
13
|
closeOnSelect: any;
|
|
@@ -29,7 +29,7 @@ declare class Menu extends ZagComponent {
|
|
|
29
29
|
'[data-part="item-group-label"]': (api: any, el: any) => any;
|
|
30
30
|
};
|
|
31
31
|
syncState(api: any): void;
|
|
32
|
-
template(props: any):
|
|
32
|
+
template(props: any): any;
|
|
33
33
|
}
|
|
34
34
|
//#endregion
|
|
35
35
|
export { Menu as default };
|