foldkit 0.112.1 → 0.112.4

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.
@@ -93,6 +93,12 @@ export declare const getOrCreateBoundaryDispatch: (registry: BoundaryRegistry, o
93
93
  * per-render duplicate-slotId tracking map so siblings inside the
94
94
  * same parent boundary can be re-validated. Does NOT touch `wraps`
95
95
  * or `boundaryDispatches`. Those persist across renders and are
96
- * evicted by vnode destroy hooks instead. */
96
+ * evicted by vnode destroy hooks instead.
97
+ *
98
+ * Clear `seenThisRender` only here, at the start of a cycle, never
99
+ * between the view and patch phases. The Submodel destroy hook reads
100
+ * it during patch to tell a same-cycle remount (a keyed root whose
101
+ * key changed) from a true unmount; clearing it mid-cycle would
102
+ * resurrect the `dispatchAcrossBoundary missing wrap` crash. */
97
103
  export declare const beginRender: (registry: BoundaryRegistry) => void;
98
104
  //# sourceMappingURL=boundary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/html/boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;CAC/C,CAAC,CAAA;AAEF;;;;eAIe;AACf,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAI/B,eAAO,MAAM,aAAa,EAAE,UAAe,CAAA;AAE3C,eAAO,MAAM,eAAe,GAC1B,QAAQ,UAAU,EAClB,SAAS,MAAM,KACd,UAUF,CAAA;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAsCa;AACb,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC/C,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAClC,YAAY,EACZ,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAC9B,CAAA;IACD,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAChD,QAAQ,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CAC3D,CAAA;AAED,eAAO,MAAM,sBAAsB,QAAO,gBAKxC,CAAA;AAqBF,eAAO,MAAM,oBAAoB,GAC/B,UAAU,gBAAgB,EAC1B,YAAY,UAAU,EACtB,YAAY,cAAc,KACzB,IA6BF,CAAA;AAED;;;;wCAIwC;AACxC,eAAO,MAAM,iBAAiB,GAC5B,UAAU,gBAAgB,KACzB,GAAG,CAAC,UAAU,EAAE,MAAM,CAIxB,CAAA;AAED;;yCAEyC;AACzC,eAAO,MAAM,eAAe,GAAI,UAAU,gBAAgB,KAAG,IAQ5D,CAAA;AAED;;;;;;;4CAO4C;AAC5C,eAAO,MAAM,kBAAkB,GAC7B,UAAU,gBAAgB,EAC1B,YAAY,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,KAC1C,IAWF,CAAA;AAED;;;;;;;;;gBASgB;AAChB,eAAO,MAAM,sBAAsB,GACjC,UAAU,gBAAgB,EAC1B,YAAY,UAAU,KACrB,IAEF,CAAA;AA4CD,eAAO,MAAM,2BAA2B,GACtC,UAAU,gBAAgB,EAC1B,eAAe,YAAY,EAC3B,YAAY,UAAU,KACrB,YAkBF,CAAA;AAED;;;;8CAI8C;AAC9C,eAAO,MAAM,WAAW,GAAI,UAAU,gBAAgB,KAAG,IAExD,CAAA"}
1
+ {"version":3,"file":"boundary.d.ts","sourceRoot":"","sources":["../../src/html/boundary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAEzD,wDAAwD;AACxD,MAAM,MAAM,cAAc,GAAG,QAAQ,CAAC;IACpC,eAAe,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAA;CAC/C,CAAC,CAAA;AAEF;;;;eAIe;AACf,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAI/B,eAAO,MAAM,aAAa,EAAE,UAAe,CAAA;AAE3C,eAAO,MAAM,eAAe,GAC1B,QAAQ,UAAU,EAClB,SAAS,MAAM,KACd,UAUF,CAAA;AAKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAsCa;AACb,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC,UAAU,EAAE,cAAc,CAAC,CAAA;IAC/C,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAClC,YAAY,EACZ,GAAG,CAAC,UAAU,EAAE,YAAY,CAAC,CAC9B,CAAA;IACD,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;IAChD,QAAQ,CAAC,iBAAiB,EAAE,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;CAC3D,CAAA;AAED,eAAO,MAAM,sBAAsB,QAAO,gBAKxC,CAAA;AAqBF,eAAO,MAAM,oBAAoB,GAC/B,UAAU,gBAAgB,EAC1B,YAAY,UAAU,EACtB,YAAY,cAAc,KACzB,IA6BF,CAAA;AAED;;;;wCAIwC;AACxC,eAAO,MAAM,iBAAiB,GAC5B,UAAU,gBAAgB,KACzB,GAAG,CAAC,UAAU,EAAE,MAAM,CAIxB,CAAA;AAED;;yCAEyC;AACzC,eAAO,MAAM,eAAe,GAAI,UAAU,gBAAgB,KAAG,IAQ5D,CAAA;AAED;;;;;;;4CAO4C;AAC5C,eAAO,MAAM,kBAAkB,GAC7B,UAAU,gBAAgB,EAC1B,YAAY,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,KAC1C,IAWF,CAAA;AAED;;;;;;;;;gBASgB;AAChB,eAAO,MAAM,sBAAsB,GACjC,UAAU,gBAAgB,EAC1B,YAAY,UAAU,KACrB,IAEF,CAAA;AA8CD,eAAO,MAAM,2BAA2B,GACtC,UAAU,gBAAgB,EAC1B,eAAe,YAAY,EAC3B,YAAY,UAAU,KACrB,YAkBF,CAAA;AAED;;;;;;;;;;iEAUiE;AACjE,eAAO,MAAM,WAAW,GAAI,UAAU,gBAAgB,KAAG,IAExD,CAAA"}
@@ -135,13 +135,15 @@ const dispatchAcrossBoundary = (registry, outerDispatch, boundaryId, message) =>
135
135
  const descriptor = registry.wraps.get(ancestorBoundary);
136
136
  if (descriptor === undefined) {
137
137
  throw new Error(`Foldkit: dispatchAcrossBoundary missing wrap for ancestor ` +
138
- `"${ancestorBoundary}" of boundary "${boundaryId}". This means a ` +
139
- `Submodel's wrap was deregistered between event scheduling and ` +
140
- `dispatch. Most likely cause: a slot callback (h.submodel ` +
141
- `\`viewInputs\` function value) was invoked from a deferred context ` +
142
- `(setTimeout, Promise.then, stored callback) after the parent ` +
143
- `Submodel unmounted. Slot callbacks must be invoked synchronously ` +
144
- `inside the render in which they were created.`);
138
+ `"${ancestorBoundary}" of boundary "${boundaryId}". The Submodel's ` +
139
+ `wrap was absent from the registry at dispatch time. A known cause: ` +
140
+ `a slot callback (an h.submodel \`viewInputs\` function value) was ` +
141
+ `invoked from a deferred context (setTimeout, Promise.then, a ` +
142
+ `stored callback) after the parent Submodel unmounted. Slot ` +
143
+ `callbacks must be invoked synchronously inside the render that ` +
144
+ `created them. It can also mean foldkit was loaded as more than ` +
145
+ `one instance (a bundler split foldkit and @foldkit/ui), so the ` +
146
+ `wrap was registered in one copy and read from another.`);
145
147
  }
146
148
  wrapped = descriptor.toParentMessage(wrapped);
147
149
  }
@@ -170,7 +172,13 @@ export const getOrCreateBoundaryDispatch = (registry, outerDispatch, boundaryId)
170
172
  * per-render duplicate-slotId tracking map so siblings inside the
171
173
  * same parent boundary can be re-validated. Does NOT touch `wraps`
172
174
  * or `boundaryDispatches`. Those persist across renders and are
173
- * evicted by vnode destroy hooks instead. */
175
+ * evicted by vnode destroy hooks instead.
176
+ *
177
+ * Clear `seenThisRender` only here, at the start of a cycle, never
178
+ * between the view and patch phases. The Submodel destroy hook reads
179
+ * it during patch to tell a same-cycle remount (a keyed root whose
180
+ * key changed) from a true unmount; clearing it mid-cycle would
181
+ * resurrect the `dispatchAcrossBoundary missing wrap` crash. */
174
182
  export const beginRender = (registry) => {
175
183
  registry.seenThisRender.clear();
176
184
  };
@@ -1 +1 @@
1
- {"version":3,"file":"runtimeSingleton.d.ts","sourceRoot":"","sources":["../../src/html/runtimeSingleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAItB,MAAM,eAAe,CAAA;AAEtB,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAErD,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,YAAY,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAC,CAAA;AAIF;;;;;;;;;;gBAUgB;AAChB,eAAO,MAAM,UAAU,GACrB,UAAU,YAAY,EACtB,gBAAgB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EACtC,mBAAkB,gBAA2C,KAC5D,IAOF,CAAA;AAED;;;4BAG4B;AAC5B,eAAO,MAAM,YAAY,GAAI,YAAY,UAAU,KAAG,IAarD,CAAA;AAED;;;;;;;;;;;0DAW0D;AAC1D,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,IAExC,CAAA;AAED;;;;;;;6BAO6B;AAC7B,eAAO,MAAM,YAAY,QAAO,IAU/B,CAAA;AAED;;;sEAGsE;AACtE,eAAO,MAAM,eAAe,QAAO,YAYlC,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,qBAAqB,QAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAQ7D,CAAA;AAED;;mEAEmE;AACnE,eAAO,MAAM,eAAe,QAAO,QAAQ,CAAC;IAC1C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,CAQA,CAAA;AAED;;;;;8CAK8C;AAC9C,eAAO,MAAM,eAAe,QAAO,KAQlC,CAAA"}
1
+ {"version":3,"file":"runtimeSingleton.d.ts","sourceRoot":"","sources":["../../src/html/runtimeSingleton.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAA;AAErC,OAAO,EACL,KAAK,UAAU,EACf,KAAK,gBAAgB,EAItB,MAAM,eAAe,CAAA;AAEtB,iFAAiF;AACjF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;AAErD,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC;IAC3B,aAAa,EAAE,YAAY,CAAA;IAC3B,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,UAAU,EAAE,UAAU,CAAA;CACvB,CAAC,CAAA;AAIF;;;;;;;;;;gBAUgB;AAChB,eAAO,MAAM,UAAU,GACrB,UAAU,YAAY,EACtB,gBAAgB,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EACtC,mBAAkB,gBAA2C,KAC5D,IAOF,CAAA;AAED;;;4BAG4B;AAC5B,eAAO,MAAM,YAAY,GAAI,YAAY,UAAU,KAAG,IAarD,CAAA;AAED;;;;;;;;;;;0DAW0D;AAC1D,eAAO,MAAM,SAAS,GAAI,OAAO,KAAK,KAAG,IAExC,CAAA;AAED;;;;;;;6BAO6B;AAC7B,eAAO,MAAM,YAAY,QAAO,IAU/B,CAAA;AAED;;;sEAGsE;AACtE,eAAO,MAAM,eAAe,QAAO,YAelC,CAAA;AAED;6EAC6E;AAC7E,eAAO,MAAM,qBAAqB,QAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAW7D,CAAA;AAED;;mEAEmE;AACnE,eAAO,MAAM,eAAe,QAAO,QAAQ,CAAC;IAC1C,QAAQ,EAAE,gBAAgB,CAAA;IAC1B,UAAU,EAAE,UAAU,CAAA;CACvB,CAQA,CAAA;AAED;;;;;8CAK8C;AAC9C,eAAO,MAAM,eAAe,QAAO,KAQlC,CAAA"}
@@ -74,7 +74,10 @@ export const clearRuntime = () => {
74
74
  export const requireDispatch = () => {
75
75
  const frame = stack[stack.length - 1];
76
76
  if (frame === undefined) {
77
- throw new Error('Foldkit: html element constructors must be called inside a runtime-driven render');
77
+ throw new Error('Foldkit: html element constructors must be called inside a runtime-driven ' +
78
+ 'render. The element was built outside a view, or foldkit was loaded as ' +
79
+ 'more than one instance (a bundler split foldkit and @foldkit/ui into ' +
80
+ 'separate copies).');
78
81
  }
79
82
  return getOrCreateBoundaryDispatch(frame.boundaryRegistry, frame.outerDispatch, frame.boundaryId);
80
83
  };
@@ -83,7 +86,10 @@ export const requireDispatch = () => {
83
86
  export const requireRuntimeContext = () => {
84
87
  const frame = stack[stack.length - 1];
85
88
  if (frame === undefined) {
86
- throw new Error('Foldkit: html element constructors must be called inside a runtime-driven render');
89
+ throw new Error('Foldkit: html element constructors must be called inside a runtime-driven ' +
90
+ 'render. The element was built outside a view, or foldkit was loaded as ' +
91
+ 'more than one instance (a bundler split foldkit and @foldkit/ui into ' +
92
+ 'separate copies).');
87
93
  }
88
94
  return frame.runtimeContext;
89
95
  };
@@ -1 +1 @@
1
- {"version":3,"file":"submodel.d.ts","sourceRoot":"","sources":["../../src/html/submodel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAoBvC,QAAA,MAAM,sBAAsB,sBAAsB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;gCAqBgC;AAChC,MAAM,MAAM,YAAY,CACtB,KAAK,EACL,OAAO,EACP,UAAU,GAAG,IAAI,IACf,CAAC,UAAU,SAAS,IAAI,GACxB,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,GAC9B,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG;IAC5D,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED;;;;;;;;;yDASyD;AACzD,eAAO,MAAM,UAAU,GAAI,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1D,IAAI,UAAU,SAAS,IAAI,GACvB,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,GAC9B,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,KAAK,KAAK,GAAG,IAAI,KACzD,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAQM,CAAA;AAEhD,KAAK,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG;IACvE,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED,KAAK,WAAW,CAAC,IAAI,SAAS,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpE,KAAK,YAAY,CAAC,IAAI,SAAS,eAAe,IAC5C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,CAAA;AAE1E,KAAK,aAAa,CAAC,IAAI,SAAS,eAAe,IAAI,IAAI,SAAS;IAC9D,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAA;CACjD,GACG,OAAO,GACP,KAAK,CAAA;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAyCqC;AACrC,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,eAAe,IAAI,QAAQ,CAAC;IAClE,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,OAAO,CAAA;CAC3D,CAAC,CAAA;AA2IF,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,eAAe,EACnD,QAAQ,cAAc,CAAC,IAAI,CAAC,KAC3B,KAAK,GAAG,IAsDV,CAAA"}
1
+ {"version":3,"file":"submodel.d.ts","sourceRoot":"","sources":["../../src/html/submodel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAoBvC,QAAA,MAAM,sBAAsB,sBAAsB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;gCAqBgC;AAChC,MAAM,MAAM,YAAY,CACtB,KAAK,EACL,OAAO,EACP,UAAU,GAAG,IAAI,IACf,CAAC,UAAU,SAAS,IAAI,GACxB,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,GAC9B,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG;IAC5D,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED;;;;;;;;;yDASyD;AACzD,eAAO,MAAM,UAAU,GAAI,KAAK,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI,EAC1D,IAAI,UAAU,SAAS,IAAI,GACvB,CAAC,KAAK,EAAE,KAAK,KAAK,KAAK,GAAG,IAAI,GAC9B,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,KAAK,KAAK,GAAG,IAAI,KACzD,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAQM,CAAA;AAEhD,KAAK,eAAe,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,IAAI,CAAC,GAAG;IACvE,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAC3C,CAAA;AAED,KAAK,WAAW,CAAC,IAAI,SAAS,eAAe,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AAEpE,KAAK,YAAY,CAAC,IAAI,SAAS,eAAe,IAC5C,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,UAAU,CAAC,GAAG,UAAU,GAAG,IAAI,CAAA;AAE1E,KAAK,aAAa,CAAC,IAAI,SAAS,eAAe,IAAI,IAAI,SAAS;IAC9D,QAAQ,CAAC,CAAC,sBAAsB,CAAC,EAAE,MAAM,OAAO,CAAA;CACjD,GACG,OAAO,GACP,KAAK,CAAA;AAET;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qCAyCqC;AACrC,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,eAAe,IAAI,QAAQ,CAAC;IAClE,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC,CAAA;IACxB,IAAI,EAAE,IAAI,CAAA;IACV,UAAU,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,OAAO,CAAA;CAC3D,CAAC,CAAA;AAsJF,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,eAAe,EACnD,QAAQ,cAAc,CAAC,IAAI,CAAC,KAC3B,KAAK,GAAG,IAsDV,CAAA"}
@@ -129,7 +129,18 @@ const withBoundaryCleanup = (vnode, registry, boundaryId) => {
129
129
  const hook = data.hook ?? {};
130
130
  const previousDestroy = hook.destroy;
131
131
  const compositeDestroy = (removed) => {
132
- deregisterBoundaryWrap(registry, boundaryId);
132
+ // NOTE: a Submodel whose root vnode changes snabbdom identity across
133
+ // renders (e.g. a keyed root whose key changed) re-registers its
134
+ // boundary in the new view phase, then snabbdom destroys the OLD root
135
+ // vnode in the following patch phase. That destroy must not evict the
136
+ // freshly re-registered wrap. `seenThisRender` is cleared in
137
+ // `beginRender`, so during patch it still reflects the just-completed
138
+ // view phase: the boundary's presence there means it is live this cycle
139
+ // (a remount), not a true unmount. Deleting it here would surface later
140
+ // as `dispatchAcrossBoundary missing wrap`.
141
+ if (!registry.seenThisRender.has(boundaryId)) {
142
+ deregisterBoundaryWrap(registry, boundaryId);
143
+ }
133
144
  if (previousDestroy !== undefined) {
134
145
  previousDestroy(removed);
135
146
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foldkit",
3
- "version": "0.112.1",
3
+ "version": "0.112.4",
4
4
  "description": "A TypeScript frontend framework, built on Effect and architected like Elm",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",