mnfst 0.5.263 → 0.5.264

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  (function () {
4
4
 
5
- const MANIFEST_BUILD_VERSION = '0.5.263';
5
+ const MANIFEST_BUILD_VERSION = '0.5.264';
6
6
 
7
7
  /* Manifest Data Sources - Appwrite Integration */
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  (function () {
4
4
 
5
- const MANIFEST_BUILD_VERSION = '0.5.263';
5
+ const MANIFEST_BUILD_VERSION = '0.5.264';
6
6
 
7
7
  /* Manifest Data Sources - Configuration */
8
8
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "manifest.appwrite.auth.js": "sha384-9WNhIeSEzxxJm+yP7cV41kV2xyzyXgFCNpThqiREcNbb6tnIW6O7VRZPL2jwy9Nk",
3
- "manifest.appwrite.data.js": "sha384-2JOzhWYTxSjkkp8XJzegFVTCejbHLDH2giMvKPjRg60GoYUhd4LSzLbxFwNhC6OV",
3
+ "manifest.appwrite.data.js": "sha384-eV1YxeLMCf9zm5onq75vkiJwNB5ykd6Fv4ZPKz4L9DME2ZvEmef5FQSq4HMRbAEK",
4
4
  "manifest.appwrite.presences.js": "sha384-/CagPsgWhO1sWEevCNGJmZ/ezRK9YCjLjvF7hxNSM4gVlJmEVtfSLfF7wnsRq441",
5
5
  "manifest.bindings.js": "sha384-lPtMf8Ykaic9gNVZKq8Scia1881ZeMAyxer3WCIkUNwwrgzGBWto1OXADUwjvORF",
6
6
  "manifest.charts.js": "sha384-AFbP7mQnigy7DU1s+YE30yKTeQAKfgNazhbfSNbfd9ZpLgeulZKaPi/fAq3gJHDO",
@@ -11,7 +11,7 @@
11
11
  "manifest.combobox.js": "sha384-/lJo6vaxKjgnBSRs/dzkhK1dzGk3GBw8FISoNJZB70mwAVwu1k5veZyBXjOb4keS",
12
12
  "manifest.components.js": "sha384-BUFA8h+G5Plr82sV7bKzO42pPoiRZwRQcKj1lt2ROFiKjjlkayU/vmkAFqEsdBA+",
13
13
  "manifest.computed.js": "sha384-GYML/e81gQfN+iDbqhPUgny8bINCyL+SrbTofoGk4hlCnLLjv51mCv42JMqq+ku5",
14
- "manifest.data.js": "sha384-B+rsxpC/ediBoMP0LeEwKgb7WEARzBmndGmnl2jOs4KrdnnzhTfzN4sJtwcnF0KK",
14
+ "manifest.data.js": "sha384-f3ncx+C3dVh8WQfzsMqLzP+f7r6aAtrTJ/yzz7jKA8SV743cq4rPr10COtH22J2e",
15
15
  "manifest.datepicker.js": "sha384-EzlMwvIxlla/0BuyhAEqxN0M8TGcWIWgEIg840V0akKQQK1uY648wPWMkobvtq/o",
16
16
  "manifest.defer.js": "sha384-5cHzFTbx+cZmGpk9FuiUtW3ciC9NvvHwJeHP7xL5yiZVp9PhMWVdQ7L9y6ju2yoo",
17
17
  "manifest.device.js": "sha384-YeQaS56L8IILqrQNBSeAOLwIh5DuAOrE60cYLK1+46qJtUrXlAvqGe2j5mbV4Vq7",
@@ -28,13 +28,13 @@
28
28
  "manifest.slides.js": "sha384-3uRTkyK9XPLmnxI2+igZlpi4EyPlU/7IHj5j3BZJJ2KN455vXyk99fiXV3feO/XY",
29
29
  "manifest.status.js": "sha384-ofu7nBnVIGZ1U1o2R9d2H3V8aEMPUCVbl5FO3gIToXqi0oa36fTviEdh5UU7Kitw",
30
30
  "manifest.svg.js": "sha384-qr/8H9+2cIhSXNbRWRtIdrDlTOxKlNJqwEefHvCYoiBNW/kKhPTFa109Orv/EBnb",
31
- "manifest.sw.js": "sha384-dQrAW1WMCbGqwao0ppVom/krl9e/eFQPHpUq0UPEkmZowgFu7E73FWwdFwpvc6YP",
31
+ "manifest.sw.js": "sha384-1YhTn8oZZM4IrB59KqwQ7zk7P+KIAoMT4POZaz08NpQqhwJh4qDEERuKDT9jro1N",
32
32
  "manifest.tabs.js": "sha384-otU09H7jnawVKQdLAYpMCd3jx00tgyPVr42D2hLIBzN5dG4se505YesavdnMqEi1",
33
33
  "manifest.tailwind.js": "sha384-yuP3LEvWU+QVjxjkZ0YhErtC9RrGmhOmHjjFjhS9obqZbp5/KTIEnSR0CXDvHE0B",
34
34
  "manifest.toasts.js": "sha384-3zkWxzw693pxg3QDFsoYCA3CqYaLKmBaMArULXODD66Utolpewl0OAeTB92aWUVv",
35
35
  "manifest.tooltips.js": "sha384-hXGp5j0s6p2kGZY/hqLPEbaUv68ca63kFCjYiZqK3DcC12mpHTBy1vz3kuApyf4p",
36
36
  "manifest.url.parameters.js": "sha384-J2aSVBOPsoqsbafHndrWLHEDpKb4AKJAoQnVmKA4gZh5P/8HHjFWHO/lkusmG84l",
37
37
  "manifest.utilities.js": "sha384-h17EquaRtNcEW0yfhk7R+a+2+CzTlBxPuFryO6i9NV/OiIRMihREoyzQ77QawoQ7",
38
- "manifest.virtual.js": "sha384-ZDNoF9QVhVcVpkjIK6NH15S6I5c6OBshiJpXSOYjNsIB+298I0a7g3aFO+jyq4Vb",
38
+ "manifest.virtual.js": "sha384-ru/eYigBWgJHcHCP0yGKRaF1FNsKisWN61LBWaH16+8ZIh5H8fWtP3aMe0s9/mrg",
39
39
  "manifest.js": "sha384-qMp2SeZUWYE/Lth8sguzlCAzXxn72gBDBPYUZ1iDlQVvzYuCc8/NPgw1gUJR88u1"
40
40
  }
@@ -16,7 +16,7 @@
16
16
 
17
17
  // Build stamps the published version here; unstamped (dev) falls back to the
18
18
  // registration URL's `v`, then 'dev'.
19
- const BUILD_VERSION = '0.5.263';
19
+ const BUILD_VERSION = '0.5.264';
20
20
  const CACHE_PREFIX = 'mnfst-sw:';
21
21
  const META_CACHE = CACHE_PREFIX + 'meta';
22
22
  // Sized to hold a full precache.json warm-up (PRECACHE_MAX_ENTRIES server-side)
@@ -241,6 +241,7 @@ function initializeVirtualPlugin() {
241
241
 
242
242
  const visible = new Set();
243
243
  const keys = [];
244
+ const items = [];
244
245
  for (let i = startItem; i < endItem; i++) {
245
246
  const item = data[i];
246
247
  if (item == null) continue;
@@ -248,15 +249,35 @@ function initializeVirtualPlugin() {
248
249
  if (key == null) continue;
249
250
  visible.add(key);
250
251
  keys.push(key);
251
- let entry = rendered.get(key);
252
- if (!entry) entry = mountRow(item, key);
253
- else if (entry.scope[itemName] !== item) entry.scope[itemName] = item; // rebind by key
254
- host.insertBefore(entry.node, botSpacer); // keep DOM order = data order
252
+ items.push(item);
255
253
  }
256
254
  for (const [key, entry] of rendered) {
257
255
  if (!visible.has(key)) removeRow(key, entry);
258
256
  }
259
257
 
258
+ // Keep DOM order = data order, moving only rows out of place
259
+ const rowNodes = new Set();
260
+ for (const entry of rendered.values()) rowNodes.add(entry.node);
261
+ // Next row in the host; skips what a row root rendered (x-if clones), survives a row's init detaching it
262
+ const nextRow = (n) => {
263
+ while (n && n !== botSpacer && n.parentNode === host && !rowNodes.has(n)) n = n.nextSibling;
264
+ return n && n.parentNode === host ? n : botSpacer;
265
+ };
266
+ let cursor = nextRow(topSpacer.nextSibling);
267
+ for (let i = 0; i < keys.length; i++) {
268
+ if (cursor.parentNode !== host) cursor = botSpacer;
269
+ let entry = rendered.get(keys[i]);
270
+ if (!entry) {
271
+ entry = mountRow(items[i], keys[i], cursor);
272
+ rowNodes.add(entry.node);
273
+ if (entry.node.parentNode !== host) host.insertBefore(entry.node, cursor); // root replaced itself in init
274
+ continue;
275
+ }
276
+ if (entry.scope[itemName] !== items[i]) entry.scope[itemName] = items[i]; // rebind by key
277
+ if (entry.node === cursor) cursor = nextRow(cursor.nextSibling);
278
+ else host.insertBefore(entry.node, cursor);
279
+ }
280
+
260
281
  // Measure anything not yet measured, then reconcile offsets once.
261
282
  scheduleMeasure(keys);
262
283
  }
@@ -306,10 +327,10 @@ function initializeVirtualPlugin() {
306
327
  scheduleMeasure(keys);
307
328
  }
308
329
 
309
- function mountRow(item, key) {
330
+ function mountRow(item, key, before = anchor) {
310
331
  const tpl = template.content.firstElementChild;
311
332
  const node = tpl.cloneNode(true);
312
- host.insertBefore(node, anchor); // connect before init
333
+ host.insertBefore(node, before); // connect before init
313
334
  const scope = Alpine.reactive({ [itemName]: item });
314
335
  const removeScope = Alpine.addScopeToNode(node, scope);
315
336
  Alpine.initTree(node);
@@ -422,11 +443,12 @@ function initializeVirtualPlugin() {
422
443
 
423
444
  // ---- Scroll / resize ----
424
445
 
446
+ let destroyed = false;
425
447
  let scrollScheduled = false;
426
448
  const onScroll = () => {
427
449
  if (scrollScheduled) return;
428
450
  scrollScheduled = true;
429
- requestAnimationFrame(() => { scrollScheduled = false; render(); });
451
+ requestAnimationFrame(() => { scrollScheduled = false; if (!destroyed) render(); });
430
452
  };
431
453
  scrollEl.addEventListener('scroll', onScroll, { passive: true });
432
454
 
@@ -440,6 +462,7 @@ function initializeVirtualPlugin() {
440
462
  if (!kind && !isMasonry && host !== scrollEl) ro.observe(host); // only until a hidden host is classified
441
463
 
442
464
  cleanup(() => {
465
+ destroyed = true;
443
466
  scrollEl.removeEventListener('scroll', onScroll);
444
467
  ro.disconnect();
445
468
  clearTimeout(resizeTimer);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mnfst",
3
- "version": "0.5.263",
3
+ "version": "0.5.264",
4
4
  "private": false,
5
5
  "workspaces": [
6
6
  "templates/starter",