@vielzeug/ore 26.11.8 → 26.11.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/base-element.cjs +1 -1
  2. package/dist/base-element.cjs.map +1 -1
  3. package/dist/base-element.d.ts +12 -26
  4. package/dist/base-element.d.ts.map +1 -1
  5. package/dist/base-element.js +1 -1
  6. package/dist/base-element.js.map +1 -1
  7. package/dist/context.cjs.map +1 -1
  8. package/dist/context.js.map +1 -1
  9. package/dist/define.cjs +1 -1
  10. package/dist/define.cjs.map +1 -1
  11. package/dist/define.d.ts.map +1 -1
  12. package/dist/define.js +1 -1
  13. package/dist/define.js.map +1 -1
  14. package/dist/directives/each.cjs +1 -1
  15. package/dist/directives/each.cjs.map +1 -1
  16. package/dist/directives/each.d.ts +5 -0
  17. package/dist/directives/each.d.ts.map +1 -1
  18. package/dist/directives/each.js +1 -1
  19. package/dist/directives/each.js.map +1 -1
  20. package/dist/directives/model.cjs.map +1 -1
  21. package/dist/directives/model.d.ts +2 -3
  22. package/dist/directives/model.d.ts.map +1 -1
  23. package/dist/directives/model.js.map +1 -1
  24. package/dist/directives/unsafe-html.cjs +1 -1
  25. package/dist/directives/unsafe-html.cjs.map +1 -1
  26. package/dist/directives/unsafe-html.d.ts.map +1 -1
  27. package/dist/directives/unsafe-html.js +1 -1
  28. package/dist/directives/unsafe-html.js.map +1 -1
  29. package/dist/directives/when.cjs +1 -1
  30. package/dist/directives/when.cjs.map +1 -1
  31. package/dist/directives/when.d.ts.map +1 -1
  32. package/dist/directives/when.js +1 -1
  33. package/dist/directives/when.js.map +1 -1
  34. package/dist/errors.cjs +1 -1
  35. package/dist/errors.cjs.map +1 -1
  36. package/dist/errors.d.ts +2 -0
  37. package/dist/errors.d.ts.map +1 -1
  38. package/dist/errors.js +1 -1
  39. package/dist/errors.js.map +1 -1
  40. package/dist/host-bind.cjs +1 -1
  41. package/dist/host-bind.cjs.map +1 -1
  42. package/dist/host-bind.d.ts +2 -2
  43. package/dist/host-bind.js +1 -1
  44. package/dist/host-bind.js.map +1 -1
  45. package/dist/index.cjs +1 -1
  46. package/dist/index.d.ts +0 -1
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/ore.cjs +2 -2
  50. package/dist/ore.cjs.map +1 -1
  51. package/dist/ore.iife.js +2 -2
  52. package/dist/ore.iife.js.map +1 -1
  53. package/dist/ore.js +423 -373
  54. package/dist/ore.js.map +1 -1
  55. package/dist/props.cjs +1 -1
  56. package/dist/props.cjs.map +1 -1
  57. package/dist/props.d.ts +6 -10
  58. package/dist/props.d.ts.map +1 -1
  59. package/dist/props.js +1 -1
  60. package/dist/props.js.map +1 -1
  61. package/dist/runtime.cjs +1 -1
  62. package/dist/runtime.cjs.map +1 -1
  63. package/dist/runtime.d.ts +22 -9
  64. package/dist/runtime.d.ts.map +1 -1
  65. package/dist/runtime.js +1 -1
  66. package/dist/runtime.js.map +1 -1
  67. package/dist/slots.cjs +1 -1
  68. package/dist/slots.cjs.map +1 -1
  69. package/dist/slots.d.ts.map +1 -1
  70. package/dist/slots.js +1 -1
  71. package/dist/slots.js.map +1 -1
  72. package/dist/template/binding-types.d.ts +3 -9
  73. package/dist/template/binding-types.d.ts.map +1 -1
  74. package/dist/template/bindings.cjs +1 -1
  75. package/dist/template/bindings.cjs.map +1 -1
  76. package/dist/template/bindings.d.ts +8 -9
  77. package/dist/template/bindings.d.ts.map +1 -1
  78. package/dist/template/bindings.js +1 -1
  79. package/dist/template/bindings.js.map +1 -1
  80. package/dist/template/instantiator.cjs +1 -1
  81. package/dist/template/instantiator.cjs.map +1 -1
  82. package/dist/template/instantiator.d.ts.map +1 -1
  83. package/dist/template/instantiator.js +1 -1
  84. package/dist/template/instantiator.js.map +1 -1
  85. package/dist/template/result.cjs +1 -1
  86. package/dist/template/result.cjs.map +1 -1
  87. package/dist/template/result.d.ts +10 -16
  88. package/dist/template/result.d.ts.map +1 -1
  89. package/dist/template/result.js +1 -1
  90. package/dist/template/result.js.map +1 -1
  91. package/dist/testing/index.d.ts +1 -1
  92. package/dist/testing/index.d.ts.map +1 -1
  93. package/dist/testing/mount.cjs +1 -1
  94. package/dist/testing/mount.cjs.map +1 -1
  95. package/dist/testing/mount.d.ts.map +1 -1
  96. package/dist/testing/mount.js +1 -1
  97. package/dist/testing/mount.js.map +1 -1
  98. package/dist/testing/render-hook.cjs +1 -1
  99. package/dist/testing/render-hook.cjs.map +1 -1
  100. package/dist/testing/render-hook.d.ts +16 -13
  101. package/dist/testing/render-hook.d.ts.map +1 -1
  102. package/dist/testing/render-hook.js +1 -1
  103. package/dist/testing/render-hook.js.map +1 -1
  104. package/dist/testing.cjs.map +1 -1
  105. package/dist/testing.js.map +1 -1
  106. package/dist/utils/brand.cjs.map +1 -1
  107. package/dist/utils/brand.d.ts +1 -1
  108. package/dist/utils/brand.js.map +1 -1
  109. package/dist/utils/dom.cjs +1 -1
  110. package/dist/utils/dom.cjs.map +1 -1
  111. package/dist/utils/dom.d.ts +12 -10
  112. package/dist/utils/dom.d.ts.map +1 -1
  113. package/dist/utils/dom.js +1 -1
  114. package/dist/utils/dom.js.map +1 -1
  115. package/package.json +5 -5
  116. package/dist/directives/live.cjs +0 -2
  117. package/dist/directives/live.cjs.map +0 -1
  118. package/dist/directives/live.d.ts +0 -23
  119. package/dist/directives/live.d.ts.map +0 -1
  120. package/dist/directives/live.js +0 -2
  121. package/dist/directives/live.js.map +0 -1
package/dist/ore.js CHANGED
@@ -1,4 +1,4 @@
1
- import { batch as e, computed as t, createScope as n, effect as r, isReactive as i, signal as a, untrack as o } from "@vielzeug/ripple";
1
+ import { batch as e, computed as t, createScope as n, effect as r, isReactive as i, onCleanup as a, signal as o, untrack as s } from "@vielzeug/ripple";
2
2
  // src/errors.ts
3
3
  var OreError = class extends Error {
4
4
  constructor(e, t) {
@@ -18,18 +18,20 @@ function reportRuntimeError(e, t) {
18
18
  detail: e
19
19
  }));
20
20
  }
21
- var s = {
21
+ var c = {
22
22
  asyncSetupUnsupported: "setup() must return an HTMLResult or null; use reactive state for asynchronous work",
23
23
  defineDuplicate: (e) => `define('${e}') called twice: custom element already registered`,
24
24
  defineFieldRequiresFormAssociated: (e) => `useField() requires define('${e}', { formAssociated: true })`,
25
25
  defineRequiresTag: "define() requires a tag name",
26
26
  eachDuplicateKey: (e, t) => `each() received duplicate key "${e}" at index ${t}`,
27
27
  eventModifierUnknown: (e, t) => `@${e}.${t}: unknown event modifier "${t}". Supported: .stop, .prevent, .once, .capture`,
28
+ htmlResultReused: "html`...` result was already rendered: each result renders once. Call the template function again for another copy.",
28
29
  injectStrictFailed: (e, t) => `injectStrict() could not resolve key "${e}" in <${t}>`,
29
30
  invariantViolated: (e) => `invariant violated: ${e}`,
30
31
  lifecycleOutsideSetup: "Lifecycle hooks must be called during component setup",
31
32
  listenNullTarget: (e) => `listen() called with a null/undefined target for event "${e}": listener not attached`,
32
33
  modelRequiresValueBinding: (e) => `model(): "${e}" must be a plain value/checked attribute binding, not a boolean attribute. Bind it as ${e}=\${model(sig)}, not ?${e}=\${model(sig)}.`,
34
+ notAnHtmlResult: "expected an html`...` result",
33
35
  propBindingForbiddenName: (e) => `html\`...\`: ".${e}" is a forbidden property-binding name (prototype pollution guard)`,
34
36
  propBindingHtmlInjectionName: (e) => `html\`...\`: ".${e}" parses raw HTML and is not a supported property binding. Sanitize untrusted content, then bind it with the unsafeHtml() directive.`,
35
37
  propInvalidReflect: "Structured props cannot use reflect:true: use prop.json() with reflect:false",
@@ -38,30 +40,35 @@ var s = {
38
40
  validationFailed: (e, t) => `Validation failed for <${e}>:\n${t.join("\n")}`
39
41
  };
40
42
  function invariant(e, t) {
41
- if (!e) throw new OreInternalError(s.invariantViolated(t));
43
+ if (!e) throw new OreInternalError(c.invariantViolated(t));
42
44
  }
43
45
  // src/utils/dom.ts
44
- var resolveMaybeReactive = (e) => typeof e == "function" ? e() : i(e) ? e.value : e, c = /[;{}]/g, sanitizeCssToken = (e) => e.replace(c, ""), runAll = (e) => {
45
- for (let t = e.length - 1; t >= 0; t--) e[t]?.();
46
- }, removeNodes = (e) => {
46
+ var resolveMaybeReactive = (e) => typeof e == "function" ? e() : i(e) ? e.value : e, l = /[;{}]/g, sanitizeCssToken = (e) => e.replace(l, ""), removeNodes = (e) => {
47
47
  for (let t of e) t.remove();
48
48
  }, createReplaceableSlot = () => {
49
- let e = [], t = [];
49
+ let e = [], t = null, clear = () => {
50
+ t?.dispose(), t = null, removeNodes(e), e = [];
51
+ };
50
52
  return {
51
- clear() {
52
- runAll(t), removeNodes(e), t = [], e = [];
53
- },
53
+ clear,
54
54
  get nodes() {
55
55
  return e;
56
56
  },
57
- registerCleanup(e) {
58
- t.push(e);
57
+ render(e) {
58
+ clear();
59
+ let r = n();
60
+ t = r;
61
+ try {
62
+ return r.run(e);
63
+ } catch (e) {
64
+ throw r.dispose(), t = null, e;
65
+ }
59
66
  },
60
67
  setNodes(t) {
61
68
  e = t;
62
69
  }
63
70
  };
64
- }, l = /* @__PURE__ */ new Set([
71
+ }, u = /* @__PURE__ */ new Set([
65
72
  "action",
66
73
  "cite",
67
74
  "codebase",
@@ -73,20 +80,29 @@ var resolveMaybeReactive = (e) => typeof e == "function" ? e() : i(e) ? e.value
73
80
  "poster",
74
81
  "src",
75
82
  "xlink:href"
76
- ]), u = /^\s*(?:(?:javascript|vbscript|blob):|data:(?:[^,]*\/(?:html|svg\+xml)|application\/(?:xhtml|xml)))/i, d = /[\t\n\r]/g, f = /^[\s\p{C}]+|[\s\p{C}]+$/gu, normalizeUrlForSchemeCheck = (e) => e.replace(d, "").replace(f, ""), isDangerousUrl = (e) => u.test(normalizeUrlForSchemeCheck(e)), setAttr = (e, t, n) => {
77
- let r = t.toLowerCase();
78
- if (/^on[a-z]/i.test(t)) {
83
+ ]), d = /^\s*(?:(?:javascript|vbscript|blob):|data:(?:[^,]*\/(?:html|svg\+xml)|application\/(?:xhtml|xml)))/i, f = /[\t\n\r]/g, p = /^[\s\p{C}]+|[\s\p{C}]+$/gu, normalizeUrlForSchemeCheck = (e) => e.replace(f, "").replace(p, ""), isDangerousUrl = (e) => d.test(normalizeUrlForSchemeCheck(e)), m = /* @__PURE__ */ new Map(), h = 512, getAttrWritePlan = (e) => {
84
+ let t = m.get(e);
85
+ if (t) return t;
86
+ let n = e.toLowerCase(), r = {
87
+ event: /^on[a-z]/i.test(e),
88
+ srcdoc: n === "srcdoc",
89
+ url: u.has(n)
90
+ };
91
+ return m.size >= h && m.clear(), m.set(e, r), r;
92
+ }, setAttr = (e, t, n) => {
93
+ let r = getAttrWritePlan(t);
94
+ if (r.event) {
79
95
  `${t}${t.slice(2)}`, e.removeAttribute(t);
80
96
  return;
81
97
  }
82
- if (r === "srcdoc" || n == null || n === !1) {
98
+ if (r.srcdoc || n == null || n === !1) {
83
99
  e.removeAttribute(t);
84
100
  return;
85
101
  }
86
102
  let i = n === !0 ? "true" : String(n);
87
- l.has(r) && isDangerousUrl(i) ? (`${t}`, e.removeAttribute(t)) : e.setAttribute(t, i);
103
+ r.url && isDangerousUrl(i) ? (`${t}`, e.removeAttribute(t)) : e.setAttribute(t, i);
88
104
  }, listen = (e, t, n, r) => {
89
- if (!e) return s.listenNullTarget(t), () => {};
105
+ if (!e) return c.listenNullTarget(t), () => {};
90
106
  let i = n;
91
107
  return e.addEventListener(t, i, r), () => e.removeEventListener(t, i, r);
92
108
  }, toKebab = (e) => e.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`), cssDeclarationName = (e) => sanitizeCssToken(e.startsWith("--") ? e : toKebab(e)), cssDeclarationValue = (e) => {
@@ -100,79 +116,79 @@ var resolveMaybeReactive = (e) => typeof e == "function" ? e() : i(e) ? e.value
100
116
  e && t.add(e);
101
117
  }
102
118
  return t;
103
- }, isStructuredValue = (e) => Array.isArray(e) || typeof e == "object" && !!e, p = null, createRuntimeContext = (e) => ({
119
+ }, isStructuredValue = (e) => Array.isArray(e) || typeof e == "object" && !!e, g = null, createRuntimeContext = (e) => ({
104
120
  element: e,
105
121
  formResetCallbacks: [],
106
- mountCallbacks: []
107
- }), m = 0, beginPendingWork = () => {
108
- m++;
122
+ mountCallbacks: [],
123
+ scope: n()
124
+ }), _ = 0, beginPendingWork = () => {
125
+ _++;
109
126
  let e = !1;
110
127
  return () => {
111
- e || (e = !0, m--);
128
+ e || (e = !0, _--);
112
129
  };
113
130
  }, runWithContext = (e, t) => {
114
- let n = p;
115
- p = e;
131
+ let n = g;
132
+ g = e;
116
133
  try {
117
- return t();
134
+ return e.scope.run(t);
118
135
  } finally {
119
- p = n;
136
+ g = n;
120
137
  }
121
138
  }, requireSetupContext = (e) => {
122
- if (p) return p;
123
- throw new OreApiError(`${e}: ${s.lifecycleOutsideSetup}`);
124
- }, getHost = () => requireSetupContext("getHost").element, tryRegisterCleanup = (e) => p ? (r(() => e), !0) : !1, onCleanup = (e) => {
125
- if (!tryRegisterCleanup(e)) throw new OreApiError(`onCleanup: ${s.lifecycleOutsideSetup}`);
139
+ if (g) return g;
140
+ throw new OreApiError(`${e}: ${c.lifecycleOutsideSetup}`);
141
+ }, getHost = () => requireSetupContext("getHost").element, hasSetupContext = () => g !== null, onCleanup = (e) => {
142
+ requireSetupContext("onCleanup"), a(e);
126
143
  }, onMounted = (e) => {
127
144
  requireSetupContext("onMounted").mountCallbacks.push(e);
128
145
  }, onFormReset = (e) => {
129
146
  requireSetupContext("onFormReset").formResetCallbacks.push(e);
130
147
  }, watchEffect = (e) => {
131
- let t = r(e), stop = () => t.dispose();
132
- return tryRegisterCleanup(stop), stop;
148
+ requireSetupContext("watchEffect");
149
+ let t = r(e);
150
+ return () => t.dispose();
133
151
  };
134
152
  function onEvent(e, t, n, r) {
135
- if (requireSetupContext("onEvent"), !e) return;
136
- let i = listen(e, t, n, r);
137
- tryRegisterCleanup(i) || i();
153
+ requireSetupContext("onEvent"), e && a(listen(e, t, n, r));
138
154
  }
139
155
  var onElement = (e, t) => watchEffect(() => {
140
156
  let n = e.value;
141
157
  if (n) return t(n);
142
- }), h = /* @__PURE__ */ new WeakMap(), buildAncestorChain = (e) => {
158
+ }), v = /* @__PURE__ */ new WeakMap(), buildAncestorChain = (e) => {
143
159
  let t = [], n = e;
144
160
  for (; n;) n instanceof HTMLElement && t.push(n), n = n.parentNode ?? (n instanceof ShadowRoot ? n.host : null);
145
161
  return t;
146
162
  }, provideOnElement = (e, t, n) => {
147
- let r = h.get(e) ?? /* @__PURE__ */ new Map();
148
- r.has(t) && `${e.localName}`, r.set(t, n), h.set(e, r);
163
+ let r = v.get(e) ?? /* @__PURE__ */ new Map();
164
+ r.has(t) && `${e.localName}`, r.set(t, n), v.set(e, r);
149
165
  }, provide = (e, t) => {
150
166
  let n = requireSetupContext("provide").element;
151
167
  provideOnElement(n, e, t), onCleanup(() => {
152
- let t = h.get(n);
153
- t && (t.delete(e), t.size === 0 && h.delete(n));
168
+ let t = v.get(n);
169
+ t && (t.delete(e), t.size === 0 && v.delete(n));
154
170
  });
155
- }, g = Symbol("inject.not_found"), _ = /* @__PURE__ */ new WeakMap(), walkAndFind = (e, t) => {
171
+ }, y = Symbol("inject.not_found"), b = /* @__PURE__ */ new WeakMap(), walkAndFind = (e, t) => {
156
172
  let n = buildAncestorChain(e);
157
173
  for (let e of n) {
158
- let n = h.get(e);
174
+ let n = v.get(e);
159
175
  if (n?.has(t)) return n.get(t);
160
176
  }
161
- return g;
177
+ return y;
162
178
  }, lookup = (e, t) => {
163
- let n = _.get(e);
164
- n || (n = /* @__PURE__ */ new Map(), _.set(e, n));
179
+ let n = b.get(e);
180
+ n || (n = /* @__PURE__ */ new Map(), b.set(e, n));
165
181
  let r = t;
166
182
  return n.has(r) || n.set(r, walkAndFind(e.element, t)), n.get(r);
167
183
  };
168
184
  function inject(e, ...t) {
169
185
  let n = lookup(requireSetupContext("inject"), e);
170
- return n === g ? t.length > 0 ? t[0] : void 0 : n;
186
+ return n === y ? t.length > 0 ? t[0] : void 0 : n;
171
187
  }
172
188
  var injectStrict = (e) => {
173
189
  let t = requireSetupContext("injectStrict"), n = lookup(t, e);
174
- if (n !== g) return n;
175
- throw new OreApiError(s.injectStrictFailed(String(e), t.element.localName));
190
+ if (n !== y) return n;
191
+ throw new OreApiError(c.injectStrictFailed(String(e), t.element.localName));
176
192
  };
177
193
  function createContext(e) {
178
194
  return Symbol(e);
@@ -204,7 +220,7 @@ function _stringProp(e) {
204
220
  reflect: !0
205
221
  };
206
222
  }
207
- var v = {
223
+ var x = {
208
224
  bool(e) {
209
225
  return {
210
226
  default: e ?? !1,
@@ -248,51 +264,57 @@ var v = {
248
264
  };
249
265
  },
250
266
  string: _stringProp
251
- }, isPropDef = (e) => typeof e == "object" && !!e && "default" in e && "parse" in e;
252
- function normalizePropDefinition(e, t) {
253
- if (!isPropDef(e)) throw new OreApiError(`Prop "${t}" must use a prop.* helper (string/number/bool/json/oneOf). Received: ${typeof e}`);
254
- let n = e;
255
- if (!n.parse) throw new OreApiError(`Prop "${t}" must have a parse function. Use prop.* helpers.`);
256
- let r = n.reflect ?? !1;
257
- if (r && isStructuredValue(n.default)) throw new OreApiError(`Prop "${t}": ${s.propInvalidReflect}`);
258
- return {
259
- ...n,
260
- reflect: r
261
- };
262
- }
263
- function validatePropDefs(e) {
264
- let t = [];
265
- for (let [n, r] of Object.entries(e)) try {
266
- normalizePropDefinition(r, n);
267
- } catch (e) {
268
- t.push(e instanceof Error ? e.message : String(e));
267
+ }, describeReceived = (e) => e === null ? "null" : typeof e, checkPropDef = (e, t) => {
268
+ if (typeof e != "object" || !e || !("default" in e)) return `Prop "${t}" must be a PropDef ({ default, parse, reflect? }), e.g. from a prop.* helper. Received: ${describeReceived(e)}`;
269
+ let { parse: n, reflect: r } = e;
270
+ if (typeof n != "function") return `Prop "${t}" must have a parse function.`;
271
+ if (r && isStructuredValue(e.default)) return `Prop "${t}": ${c.propInvalidReflect}`;
272
+ };
273
+ function normalizePropDefs(e, t) {
274
+ let n = [], r = {};
275
+ for (let [e, i] of Object.entries(t)) {
276
+ let t = checkPropDef(i, e);
277
+ t ? n.push(t) : r[e] = {
278
+ ...i,
279
+ reflect: i.reflect ?? !1
280
+ };
269
281
  }
270
- return t;
282
+ if (n.length > 0) throw new OreApiError(c.validationFailed(e, n));
283
+ return r;
271
284
  }
272
- var y = /* @__PURE__ */ new WeakMap(), getPropMeta = (e, t) => y.get(e)?.get(t), coerceIncoming = (e, t) => typeof e == "string" ? t(e) : e, registerProp = (e, t, n, r) => {
273
- let i = y.get(e);
274
- i || (i = /* @__PURE__ */ new Map(), y.set(e, i));
275
- let { default: o, parse: s, reflect: c = !1 } = r, l = a(o), u = i.get(n), d = Object.hasOwn(e, t), f = d ? e[t] : void 0, p = {
276
- parse: s,
277
- reflect: c,
278
- signal: l
279
- };
280
- return u ? l.value = u.signal.peek() : d ? (delete e[t], l.value = coerceIncoming(f, s)) : e.hasAttribute(n) && (l.value = s(e.getAttribute(n))), i.set(n, p), Object.defineProperty(e, t, {
285
+ var S = /* @__PURE__ */ new WeakMap(), getPropMeta = (e, t) => S.get(e)?.get(t), coerceIncoming = (e, t) => typeof e == "string" ? t(e) : e, createPropMeta = (e, t, n, r) => {
286
+ let { default: i, parse: a, reflect: s = !1 } = r, c = e, l = o(i);
287
+ if (Object.hasOwn(c, t)) {
288
+ let e = c[t];
289
+ delete c[t], l.value = coerceIncoming(e, a);
290
+ } else e.hasAttribute(n) && (l.value = a(e.getAttribute(n)));
291
+ return Object.defineProperty(e, t, {
281
292
  configurable: !0,
282
293
  enumerable: !0,
283
294
  get: () => l.value,
284
295
  set: (e) => {
285
- l.value = coerceIncoming(e, s);
296
+ l.value = coerceIncoming(e, a);
286
297
  }
287
- }), c && watchEffect(() => {
288
- let t = l.value;
289
- t == null ? e.removeAttribute(n) : typeof t == "boolean" ? e.toggleAttribute(n, t) : setAttr(e, n, t);
290
- }), l;
298
+ }), {
299
+ parse: a,
300
+ reflect: s,
301
+ signal: l
302
+ };
303
+ }, reflectProp = (e, t, n) => {
304
+ watchEffect(() => {
305
+ let r = n.value;
306
+ r == null ? e.removeAttribute(t) : typeof r == "boolean" ? e.toggleAttribute(t, r) : setAttr(e, t, r);
307
+ });
291
308
  };
292
309
  function createProps(e, t) {
293
- let n = {};
294
- for (let [r, i] of Object.entries(t)) n[r] = registerProp(e, r, toKebab(r), i);
295
- return n;
310
+ let n = S.get(e);
311
+ n || (n = /* @__PURE__ */ new Map(), S.set(e, n));
312
+ let r = {};
313
+ for (let [i, a] of Object.entries(t)) {
314
+ let t = toKebab(i), o = n.get(t);
315
+ o || (o = createPropMeta(e, i, t, a), n.set(t, o)), o.reflect && reflectProp(e, t, o.signal), r[i] = o.signal;
316
+ }
317
+ return r;
296
318
  }
297
319
  // src/utils/brand.ts
298
320
  var makeBrand = (e) => {
@@ -301,62 +323,79 @@ var makeBrand = (e) => {
301
323
  is,
302
324
  stamp
303
325
  };
304
- }, b = makeBrand("ore:css-result"), x = b.is, cssResultToString = function() {
326
+ };
327
+ // src/template/result.ts
328
+ function ref() {
329
+ return o(null);
330
+ }
331
+ var C = makeBrand("ore:directive"), createDirectiveResult = (e) => C.stamp({ mount: e }), w = C.is, T = makeBrand("ore:html-result"), E = T.is, asCompiled = (e) => {
332
+ if (!E(e)) throw new OreApiError(c.notAnHtmlResult);
333
+ return e;
334
+ };
335
+ function createHtmlResult(e, t) {
336
+ let n = !1, claim = () => {
337
+ if (n) throw new OreApiError(c.htmlResultReused);
338
+ n = !0;
339
+ }, mount = (n, r) => {
340
+ claim();
341
+ let i = Array.from(e.childNodes);
342
+ return n.insertBefore(e, r), t(), i;
343
+ };
344
+ return T.stamp({
345
+ apply: t,
346
+ claim,
347
+ fragment: e,
348
+ mount
349
+ });
350
+ }
351
+ // src/utils/css.ts
352
+ var D = makeBrand("ore:css-result"), O = D.is, cssResultToString = function() {
305
353
  return this.content;
306
354
  }, css = (e, ...t) => {
307
355
  let n = "";
308
356
  for (let r = 0; r < e.length; r++) if (n += e[r], r < t.length) {
309
357
  let e = t[r];
310
- n += x(e) ? e.content : String(e);
358
+ n += O(e) ? e.content : String(e);
311
359
  }
312
- return b.stamp({
360
+ return D.stamp({
313
361
  content: n.trim(),
314
362
  toString: cssResultToString
315
363
  });
316
- }, S = /* @__PURE__ */ new Map(), C = 256, loadStylesheet = (e) => {
364
+ }, k = /* @__PURE__ */ new Map(), A = 256, loadStylesheet = (e) => {
317
365
  if (e instanceof CSSStyleSheet) return e;
318
- let t = typeof e == "string" ? e : e.content, n = S.get(t);
319
- if (n) return S.delete(t), S.set(t, n), n;
366
+ let t = typeof e == "string" ? e : e.content, n = k.get(t);
367
+ if (n) return k.delete(t), k.set(t, n), n;
320
368
  let r = new CSSStyleSheet();
321
369
  try {
322
370
  r.replaceSync(t);
323
371
  } catch {
324
372
  return r;
325
373
  }
326
- if (S.set(t, r), S.size > C) {
327
- let e = S.keys().next().value;
328
- e !== void 0 && S.delete(e);
374
+ if (k.set(t, r), k.size > A) {
375
+ let e = k.keys().next().value;
376
+ e !== void 0 && k.delete(e);
329
377
  }
330
378
  return r;
331
- }, w = {
332
- SETUP_DONE: "setup_done",
333
- SETUP_RUNNING: "setup_running",
334
- UNINITIALIZED: "uninitialized",
335
- UNMOUNTED: "unmounted"
336
- }, createComponentState = () => ({
337
- formResetCallbacks: [],
338
- generation: 0,
339
- mountCallbacks: [],
340
- phase: w.UNINITIALIZED,
341
- scope: n(),
342
- templateResult: null
343
- }), isPromiseLike = (e) => (typeof e == "object" || typeof e == "function") && e !== null && "then" in e && typeof e.then == "function", BaseElement = class extends HTMLElement {
379
+ }, isPromiseLike = (e) => (typeof e == "object" || typeof e == "function") && e !== null && "then" in e && typeof e.then == "function", BaseElement = class extends HTMLElement {
344
380
  static _definition;
345
381
  static _normalizedPropDefs;
346
382
  static formAssociated = !1;
347
383
  static observedAttributes = [];
348
- _component;
384
+ _connection = null;
385
+ _teardownPending = !1;
349
386
  constructor() {
350
387
  super();
351
388
  let e = this.constructor._definition;
352
- e?.shadow !== !1 && this.attachShadow({
389
+ if (e?.shadow === !1) return;
390
+ let t = this.attachShadow({
353
391
  mode: "open",
354
392
  ...e?.shadow
355
- }), this._component = createComponentState();
393
+ });
394
+ e?.styles?.length && (t.adoptedStyleSheets = e.styles.map(loadStylesheet));
356
395
  }
357
396
  connectedCallback() {
358
- o(() => {
359
- this._component.phase === w.UNINITIALIZED && this._runSetup(), this._init();
397
+ s(() => {
398
+ this._teardownPending ? (this._teardownPending = !1, this._scheduleMountCallbacks()) : this._connect();
360
399
  });
361
400
  }
362
401
  attributeChangedCallback(e, t, n) {
@@ -364,16 +403,15 @@ var makeBrand = (e) => {
364
403
  let r = getPropMeta(this, e);
365
404
  if (!r) return;
366
405
  let i = r.parse(n);
367
- Object.is(o(() => r.signal.value), i) || (r.signal.value = i);
406
+ Object.is(s(() => r.signal.value), i) || (r.signal.value = i);
368
407
  }
369
408
  disconnectedCallback() {
370
- this._component.generation++, this._component.phase = w.UNMOUNTED, this._resetSetupState();
371
- }
372
- _resetSetupState() {
373
- this._component.scope.dispose(), this._component.formResetCallbacks = [], this._component.mountCallbacks = [], this._component.phase = w.UNINITIALIZED, this._component.scope = n(), this._component.templateResult = null;
409
+ this._teardownPending = !0, queueMicrotask(() => {
410
+ this._teardownPending && (this._teardownPending = !1, this._connection?.scope.dispose(), this._connection = null);
411
+ });
374
412
  }
375
413
  formResetCallback() {
376
- for (let e of this._component.formResetCallbacks) try {
414
+ for (let e of this._connection?.formResetCallbacks ?? []) try {
377
415
  e();
378
416
  } catch (e) {
379
417
  this._reportLifecycleError(e, "form-reset");
@@ -381,71 +419,46 @@ var makeBrand = (e) => {
381
419
  }
382
420
  _reportLifecycleError(e, t) {
383
421
  let n = e instanceof Error ? e : Error(String(e));
384
- reportRuntimeError(new OreLifecycleError(`<${this.localName}> failed during ${this._component.phase} (${t})`, {
422
+ reportRuntimeError(new OreLifecycleError(`<${this.localName}> failed during ${t}`, {
385
423
  cause: n,
386
424
  component: this.localName,
387
425
  phase: t
388
426
  }), this);
389
427
  }
390
- _runSetup() {
391
- this._component.phase = w.SETUP_RUNNING;
392
- let e = this.constructor._definition, t = this.constructor._normalizedPropDefs, n = createRuntimeContext(this);
428
+ _connect() {
429
+ let e = this.constructor, t = createRuntimeContext(this);
393
430
  try {
394
- let r;
395
- if (this._component.scope.run(() => {
396
- r = runWithContext(n, () => {
397
- let n = t ? createProps(this, t) : {};
398
- return e.setup(n);
399
- });
400
- }), this._component.mountCallbacks.push(...n.mountCallbacks), this._component.formResetCallbacks.push(...n.formResetCallbacks), isPromiseLike(r)) throw new OreApiError(s.asyncSetupUnsupported);
401
- this._component.templateResult = r ?? null, this._component.phase = w.SETUP_DONE;
431
+ runWithContext(t, () => {
432
+ let t = e._normalizedPropDefs ? createProps(this, e._normalizedPropDefs) : {}, n = e._definition.setup(t);
433
+ if (isPromiseLike(n)) throw new OreApiError(c.asyncSetupUnsupported);
434
+ if (n == null) return;
435
+ let r = this.shadowRoot ?? this;
436
+ r.replaceChildren(), asCompiled(n).mount(r, null);
437
+ });
402
438
  } catch (e) {
403
- throw this._reportLifecycleError(e, "setup"), this._resetSetupState(), e;
439
+ throw t.scope.dispose(), this._reportLifecycleError(e, "setup"), e;
404
440
  }
405
- }
406
- _isStale(e) {
407
- return this._component.generation !== e || !this.isConnected;
408
- }
409
- _applyResult(e) {
410
- if (!e) return;
411
- let t = this.shadowRoot ?? this, n = createRuntimeContext(this);
412
- t.replaceChildren(), this._component.scope.run(() => {
413
- runWithContext(n, () => {
414
- e.mount(t, null, onCleanup);
415
- });
416
- });
417
- }
418
- _init() {
419
- this._applyStyles(), this._mountTemplate(), this._component.phase === w.SETUP_DONE && this._scheduleMountCallbacks();
420
- }
421
- _applyStyles() {
422
- let e = this.constructor._definition;
423
- this.shadowRoot && e?.styles?.length && (this.shadowRoot.adoptedStyleSheets = e.styles.map(loadStylesheet));
424
- }
425
- _mountTemplate() {
426
- let e = this._component.templateResult;
427
- e && this._applyResult(e);
441
+ this._connection = t, this._scheduleMountCallbacks();
428
442
  }
429
443
  _scheduleMountCallbacks() {
430
- if (this._component.mountCallbacks.length === 0) return;
431
- let e = this._component.generation, t = beginPendingWork();
444
+ let e = this._connection;
445
+ if (!e || e.mountCallbacks.length === 0) return;
446
+ let t = beginPendingWork();
432
447
  queueMicrotask(() => {
433
448
  try {
434
- if (this._isStale(e)) return;
435
- let t = this._component.mountCallbacks.splice(0);
436
- for (let e = 0; e < t.length; e++) {
437
- let n = t[e];
449
+ if (this._connection !== e || !this.isConnected) return;
450
+ let t = e.mountCallbacks.shift();
451
+ for (; t;) {
452
+ let n = t;
438
453
  try {
439
- let e = createRuntimeContext(this);
440
- this._component.scope.run(() => {
441
- runWithContext(e, () => {
442
- let e = n();
443
- typeof e == "function" && onCleanup(e);
444
- });
445
- }), e.mountCallbacks.length > 0 && t.push(...e.mountCallbacks), e.formResetCallbacks.length > 0 && this._component.formResetCallbacks.push(...e.formResetCallbacks);
454
+ runWithContext(e, () => {
455
+ let e = n();
456
+ typeof e == "function" && onCleanup(e);
457
+ });
446
458
  } catch (e) {
447
459
  this._reportLifecycleError(e, "mounted");
448
460
  }
461
+ t = e.mountCallbacks.shift();
449
462
  }
450
463
  } finally {
451
464
  t();
@@ -455,16 +468,9 @@ var makeBrand = (e) => {
455
468
  };
456
469
  // src/define.ts
457
470
  function define(e, t) {
458
- if (!e) throw new OreApiError(s.defineRequiresTag);
459
- if (customElements.get(e)) throw new OreApiError(s.defineDuplicate(e));
460
- let { props: n } = t, r = (() => {
461
- if (!n) return;
462
- let t = validatePropDefs(n);
463
- if (t.length > 0) throw new OreApiError(s.validationFailed(e, t));
464
- let r = {};
465
- for (let [e, t] of Object.entries(n)) r[e] = normalizePropDefinition(t, e);
466
- return r;
467
- })(), i = r ? Object.keys(r).map(toKebab) : [], ComponentClass = class extends BaseElement {
471
+ if (!e) throw new OreApiError(c.defineRequiresTag);
472
+ if (customElements.get(e)) throw new OreApiError(c.defineDuplicate(e));
473
+ let { props: n } = t, r = n ? normalizePropDefs(e, n) : void 0, i = r ? Object.keys(r).map(toKebab) : [], ComponentClass = class extends BaseElement {
468
474
  static _definition = t;
469
475
  static _normalizedPropDefs = r;
470
476
  static formAssociated = t.formAssociated ?? !1;
@@ -473,60 +479,67 @@ function define(e, t) {
473
479
  return Object.defineProperty(ComponentClass, "name", { value: e }), customElements.define(e, ComponentClass), ComponentClass;
474
480
  }
475
481
  // src/directives/classMap.ts
476
- var classMap = (e) => t(() => [...resolveClassTokens(e)].join(" "));
477
- // src/template/result.ts
478
- function ref() {
479
- return a(null);
480
- }
481
- var T = makeBrand("ore:directive"), createDirectiveResult = (e) => T.stamp({ mount: e }), E = T.is, D = makeBrand("ore:html-result"), O = D.is;
482
- function createHtmlResult(e, t) {
483
- let mount = (n, r, i) => {
484
- let a = Array.from(e.childNodes);
485
- return n.insertBefore(e, r), t(i), a;
486
- };
487
- return D.stamp({
488
- apply: t,
489
- fragment: e,
490
- mount
482
+ var classMap = (e) => t(() => [...resolveClassTokens(e)].join(" ")), createItem = (e, t, r, i) => {
483
+ let a = o(e), s = o(t), c = n(), l = [], u = document.createComment("each/item-start");
484
+ i.appendChild(u), c.run(() => {
485
+ l = asCompiled(r(a, s)).mount(i, null);
491
486
  });
492
- }
493
- // src/directives/each.ts
494
- var createItem = (e, t, r, i, o) => {
495
- let s = a(e), c = a(t), l = n(), u = [], d = [];
496
- return l.run(() => {
497
- d = r(s, c).mount(i, o, (e) => u.push(e));
498
- }), {
499
- cleanups: u,
500
- data: s,
501
- index: c,
502
- nodes: d,
503
- scope: l
487
+ let d = document.createComment("each/item");
488
+ return i.appendChild(d), l = [
489
+ u,
490
+ ...l,
491
+ d
492
+ ], {
493
+ data: a,
494
+ index: s,
495
+ nodes: l,
496
+ scope: c
504
497
  };
505
498
  }, removeItem = (e) => {
506
- e.scope.dispose(), runAll(e.cleanups), removeNodes(e.nodes);
507
- }, reconcileItems = (t, n, r, i, a, s, c) => {
499
+ e.scope.dispose(), removeNodes(e.nodes);
500
+ }, reusedEntriesInOrder = (e, t) => {
501
+ let n = /* @__PURE__ */ new Map();
502
+ for (let e = 0; e < t.length; e++) n.set(t[e], e);
503
+ let r = -1;
504
+ for (let t of e) {
505
+ let e = n.get(t);
506
+ if (e !== void 0) {
507
+ if (e < r) return !1;
508
+ r = e;
509
+ }
510
+ }
511
+ return !0;
512
+ }, reconcileItems = (t, n, r, i, a, o, c, l) => {
513
+ let u = document.createDocumentFragment();
508
514
  for (let e = 0; e < n.length; e++) {
509
- let l = r[e];
510
- if (t.has(l)) continue;
511
- let u = o(() => createItem(n[e], e, i, a, s));
512
- c.push(u), t.set(l, u);
515
+ let a = r[e];
516
+ if (t.has(a)) continue;
517
+ let o = s(() => createItem(n[e], e, i, u));
518
+ c.push(o), t.set(a, o);
513
519
  }
514
- let l = [];
520
+ let d = [];
515
521
  e(() => {
516
522
  for (let e = 0; e < n.length; e++) {
517
523
  let i = t.get(r[e]);
518
- invariant(i, "each() reconcile phase 2 lost an entry created in phase 1"), i.data.value = n[e], i.index.value = e, l.push(i);
524
+ invariant(i, "each() reconcile phase 2 lost an entry created in phase 1"), i.data.value = n[e], i.index.value = e, d.push(i);
519
525
  }
520
526
  });
521
- let u = s;
522
- for (let e = l.length - 1; e >= 0; e--) {
523
- let t = l[e], n = t.nodes[0], r = t.nodes[t.nodes.length - 1];
524
- if (n && r !== u.previousSibling) for (let e of t.nodes) a.insertBefore(e, u);
525
- u = n ?? u;
527
+ let f = reusedEntriesInOrder(d, l), p = new Set(c), m = o;
528
+ for (let e = d.length - 1; e >= 0; e--) {
529
+ let t = d[e], n = t.nodes[0], r = t.nodes[t.nodes.length - 1];
530
+ if ((!f || p.has(t)) && r !== m.previousSibling) {
531
+ let e = n;
532
+ for (; e;) {
533
+ let t = e === r ? null : e.nextSibling;
534
+ if (a.insertBefore(e, m), e === r) break;
535
+ e = t;
536
+ }
537
+ }
538
+ m = n;
526
539
  }
527
- let d = new Set(r);
528
- for (let [e, n] of t) d.has(e) || (removeItem(n), t.delete(e));
529
- return l;
540
+ let h = new Set(r);
541
+ for (let [e, n] of t) h.has(e) || (removeItem(n), t.delete(e));
542
+ return d;
530
543
  }, rollbackCreated = (e, t) => {
531
544
  for (let n of t) {
532
545
  removeItem(n);
@@ -539,7 +552,7 @@ var createItem = (e, t, r, i, o) => {
539
552
  let n = [], r = /* @__PURE__ */ new Set();
540
553
  for (let i = 0; i < e.length; i++) {
541
554
  let a = t(e[i], i);
542
- if (r.has(a)) throw new OreApiError(s.eachDuplicateKey(String(a), i));
555
+ if (r.has(a)) throw new OreApiError(c.eachDuplicateKey(String(a), i));
543
556
  r.add(a), n.push(a);
544
557
  }
545
558
  return n;
@@ -551,48 +564,61 @@ var createItem = (e, t, r, i, o) => {
551
564
  phase: "each-reconcile"
552
565
  }), t);
553
566
  };
554
- function each(e, n, i, s) {
555
- let c = Array.isArray(e) ? a(e) : typeof e == "function" ? t(e) : e;
556
- return createDirectiveResult((e, t) => {
557
- let a = e.parentNode;
558
- invariant(a, "each() anchor comment has no parent node");
559
- let l = document.createComment("each/end");
560
- a.insertBefore(l, e.nextSibling);
561
- let u = /* @__PURE__ */ new Map(), d = [], f = null, p = [], mountFallback = () => {
562
- s && (f = s().mount(a, l, (e) => p.push(e)));
567
+ function each(e, i, c, l) {
568
+ let u = Array.isArray(e) ? o(e) : typeof e == "function" ? t(e) : e;
569
+ return createDirectiveResult((e) => {
570
+ let t = e.parentNode;
571
+ invariant(t, "each() anchor comment has no parent node");
572
+ let o = document.createComment("each/end");
573
+ t.insertBefore(o, e.nextSibling);
574
+ let container = () => o.parentNode, d = /* @__PURE__ */ new Map(), f = [], p = null, m = null, mountFallback = () => {
575
+ if (!l) return;
576
+ let e = container();
577
+ if (!e) return;
578
+ let t = n();
579
+ m = t;
580
+ try {
581
+ t.run(() => {
582
+ p = asCompiled(l()).mount(e, o);
583
+ });
584
+ } catch (e) {
585
+ throw clearFallback(), e;
586
+ }
563
587
  }, clearFallback = () => {
564
- f && (runAll(p), removeNodes(f), f = null, p = []);
565
- }, m = r(() => {
566
- let t = c.value ?? [];
588
+ m?.dispose(), m = null, p &&= (removeNodes(p), null);
589
+ }, h = r(() => {
590
+ let t = u.value ?? [];
567
591
  if (t.length === 0) {
568
- for (let e of o(() => d)) removeItem(e);
569
- u = /* @__PURE__ */ new Map(), d = [], f || o(mountFallback);
592
+ for (let e of s(() => f)) removeItem(e);
593
+ d = /* @__PURE__ */ new Map(), f = [], p || s(mountFallback);
570
594
  return;
571
595
  }
572
- let r;
596
+ let n;
573
597
  try {
574
- r = o(() => collectKeys(t, n));
598
+ n = s(() => collectKeys(t, i));
575
599
  } catch (t) {
576
600
  reportEachError(t, e);
577
601
  return;
578
602
  }
579
603
  clearFallback();
580
- let s = [];
604
+ let r = container();
605
+ if (!r) return;
606
+ let a = [];
581
607
  try {
582
- d = o(() => reconcileItems(u, t, r, i, a, l, s));
608
+ f = s(() => reconcileItems(d, t, n, c, r, o, a, f));
583
609
  } catch (t) {
584
- reportEachError(t, e), o(() => rollbackCreated(u, s));
610
+ reportEachError(t, e), s(() => rollbackCreated(d, a));
585
611
  }
586
612
  });
587
- t(() => m.dispose()), t(() => {
588
- clearFallback();
589
- for (let e of d) removeItem(e);
590
- l.remove();
613
+ a(() => {
614
+ h.dispose(), clearFallback();
615
+ for (let e of f) removeItem(e);
616
+ o.remove();
591
617
  });
592
618
  });
593
619
  }
594
- // src/directives/live.ts
595
- var k = makeBrand("ore:live"), live = (e) => k.stamp({ source: e }), A = k.is, j = makeBrand("ore:model"), M = j.is, modelDefaultGet = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio") ? e.checked : e.value, modelDefaultEvent = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio") || e instanceof HTMLSelectElement ? "change" : "input", model = (e, t) => j.stamp({
620
+ // src/directives/model.ts
621
+ var j = makeBrand("ore:model"), M = j.is, modelDefaultGet = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio") ? e.checked : e.value, modelDefaultEvent = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio") || e instanceof HTMLSelectElement ? "change" : "input", model = (e, t) => j.stamp({
596
622
  event: t?.event,
597
623
  get: t?.get,
598
624
  source: e
@@ -614,51 +640,61 @@ var k = makeBrand("ore:live"), live = (e) => k.stamp({ source: e }), A = k.is, j
614
640
  };
615
641
  function unsafeHtml(e) {
616
642
  let n = typeof e == "function" ? t(e) : i(e) ? e : null;
617
- return createDirectiveResult((t, i) => {
618
- let a = t.parentNode;
619
- invariant(a, "unsafeHtml() anchor comment has no parent node");
643
+ return createDirectiveResult((t) => {
644
+ let i = t.parentNode;
645
+ invariant(i, "unsafeHtml() anchor comment has no parent node");
620
646
  let o = document.createComment("unsafe-html/end");
621
- if (a.insertBefore(o, t.nextSibling), n) {
647
+ if (i.insertBefore(o, t.nextSibling), n) {
622
648
  let e = createReplaceableSlot(), t = r(() => {
623
- e.clear(), e.setNodes(parseHtml(n.value, a, o));
649
+ let t = o.parentNode;
650
+ t ? e.render(() => {
651
+ e.setNodes(parseHtml(n.value, t, o));
652
+ }) : e.clear();
624
653
  });
625
- i(() => t.dispose()), i(() => {
626
- e.clear(), o.remove();
654
+ a(() => {
655
+ t.dispose(), e.clear(), o.remove();
627
656
  });
628
- } else parseHtml(e, a, o), i(() => o.remove());
657
+ } else parseHtml(e, i, o), a(() => o.remove());
629
658
  });
630
659
  }
631
660
  // src/directives/when.ts
632
661
  var N = "when() anchor comment has no parent node";
633
- function when(e, n, a) {
634
- return typeof e != "function" && !i(e) ? createDirectiveResult((t, r) => {
635
- let i = e ? n() : a ? a() : null;
636
- if (!i || !O(i)) return;
637
- let o = t.parentNode;
638
- invariant(o, N);
639
- let s = i.mount(o, t, r);
640
- r(() => removeNodes(s));
641
- }) : createDirectiveResult((i, s) => {
662
+ function when(e, n, o) {
663
+ return typeof e != "function" && !i(e) ? createDirectiveResult((t) => {
664
+ let r = e ? n() : o ? o() : null;
665
+ if (!r || !E(r)) return;
666
+ let i = t.parentNode;
667
+ invariant(i, N);
668
+ let s = r.mount(i, t);
669
+ a(() => removeNodes(s));
670
+ }) : createDirectiveResult((i) => {
642
671
  let c = (typeof e == "function" ? t(e) : null) ?? e, l = i.parentNode;
643
672
  invariant(l, N);
644
673
  let u = document.createComment("when/end");
645
674
  l.insertBefore(u, i.nextSibling);
646
675
  let d = createReplaceableSlot(), f = r(() => {
647
- let e = c.value;
648
- d.clear();
649
- let t = e ? n() : a ? a() : null;
650
- t && O(t) && d.setNodes(o(() => t.mount(l, u, d.registerCleanup)));
676
+ let e = c.value ? n() : o ? o() : null;
677
+ if (!e || !E(e)) {
678
+ d.clear();
679
+ return;
680
+ }
681
+ let t = u.parentNode;
682
+ t ? s(() => {
683
+ d.render(() => {
684
+ d.setNodes(e.mount(t, u));
685
+ });
686
+ }) : d.clear();
651
687
  });
652
- s(() => f.dispose()), s(() => {
653
- d.clear(), u.remove();
688
+ a(() => {
689
+ f.dispose(), d.clear(), u.remove();
654
690
  });
655
691
  });
656
692
  }
657
693
  // src/forms/field.ts
658
694
  var P = /* @__PURE__ */ new WeakMap(), F = /* @__PURE__ */ new WeakSet(), useField = (e) => {
659
695
  let t = getHost();
660
- if (!t.constructor.formAssociated) throw new OreApiError(s.defineFieldRequiresFormAssociated(t.localName));
661
- if (F.has(t)) throw new OreApiError(s.useFieldAlreadyCalled(t.localName));
696
+ if (!t.constructor.formAssociated) throw new OreApiError(c.defineFieldRequiresFormAssociated(t.localName));
697
+ if (F.has(t)) throw new OreApiError(c.useFieldAlreadyCalled(t.localName));
662
698
  let n = P.get(t) ?? t.attachInternals();
663
699
  P.set(t, n), F.add(t), onCleanup(() => F.delete(t));
664
700
  let r = e.toFormValue ?? ((t) => t == null ? e.emptyStringForNull ? "" : null : t instanceof File || t instanceof FormData ? t : String(t));
@@ -708,14 +744,15 @@ var P = /* @__PURE__ */ new WeakMap(), F = /* @__PURE__ */ new WeakSet(), useFie
708
744
  let cleanup = () => {
709
745
  for (let e of r) e();
710
746
  };
711
- return tryRegisterCleanup(cleanup), cleanup;
712
- }, I = normalizeHostAttrKey, applyReactiveBinding = (e, t) => {
713
- if (typeof e == "function") return watchEffect(() => {
714
- t(e());
715
- });
716
- if (i(e)) return watchEffect(() => {
717
- t(e.value);
747
+ return hasSetupContext() && a(cleanup), cleanup;
748
+ }, I = normalizeHostAttrKey, reactive = (e) => {
749
+ let t = r(() => {
750
+ e();
718
751
  });
752
+ return () => t.dispose();
753
+ }, applyReactiveBinding = (e, t) => {
754
+ if (typeof e == "function") return reactive(() => t(e()));
755
+ if (i(e)) return reactive(() => t(e.value));
719
756
  t(e);
720
757
  };
721
758
  function applyAttribute(e, t, n) {
@@ -732,7 +769,7 @@ function applyStyle(e, t, n) {
732
769
  }
733
770
  function applyClassMap(e, t) {
734
771
  let n = typeof t == "function" ? t : () => Object.fromEntries([...resolveClassTokens(t)].map((e) => [e, !0])), r = /* @__PURE__ */ new Set();
735
- return watchEffect(() => {
772
+ return reactive(() => {
736
773
  let t = /* @__PURE__ */ new Set();
737
774
  for (let [i, a] of Object.entries(n())) a && (t.add(i), r.has(i) || e.classList.add(i));
738
775
  for (let n of r) t.has(n) || e.classList.remove(n);
@@ -744,8 +781,8 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
744
781
  let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(), ensureSlotEntry = (e) => {
745
782
  let n = t.get(e);
746
783
  return n || (n = {
747
- elements: a([]),
748
- presence: a(!1)
784
+ elements: o([]),
785
+ presence: o(!1)
749
786
  }, t.set(e, n)), n;
750
787
  }, areElementsEqual = (e, t) => {
751
788
  if (e.length !== t.length) return !1;
@@ -778,10 +815,23 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
778
815
  });
779
816
  }, recomputeAllSlots = () => {
780
817
  for (let e of n.keys()) recomputeSlot(e);
818
+ }, isOrContainsSlot = (e) => e instanceof HTMLSlotElement || e.nodeType === Node.ELEMENT_NODE && e.querySelector("slot") !== null, unbindSlotsIn = (e) => {
819
+ e instanceof HTMLSlotElement ? unbindSlot(e) : e.nodeType === Node.ELEMENT_NODE && e.querySelectorAll("slot").forEach((e) => {
820
+ unbindSlot(e);
821
+ });
781
822
  }, i = null, initSlots = () => {
782
823
  bindAllSlots(), recomputeAllSlots(), !i && e.shadowRoot && (i = new MutationObserver((e) => {
783
- for (let t of e) for (let e of t.removedNodes) e instanceof HTMLSlotElement && unbindSlot(e);
784
- bindAllSlots(), r.size > 0 && recomputeAllSlots();
824
+ let t = !1;
825
+ for (let n of e) {
826
+ for (let e of n.removedNodes) isOrContainsSlot(e) && (t = !0, unbindSlotsIn(e));
827
+ if (!t) {
828
+ for (let e of n.addedNodes) if (isOrContainsSlot(e)) {
829
+ t = !0;
830
+ break;
831
+ }
832
+ }
833
+ }
834
+ t && (bindAllSlots(), r.size > 0 && recomputeAllSlots());
785
835
  }), i.observe(e.shadowRoot, {
786
836
  childList: !0,
787
837
  subtree: !0
@@ -798,107 +848,106 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
798
848
  }, R = /* @__PURE__ */ new WeakMap(), useSlots = () => {
799
849
  let e = requireSetupContext("useSlots"), t = R.get(e.element);
800
850
  return t || (t = createSlots(e.element), R.set(e.element, t)), t;
801
- }, signalEffect = (e, t, n) => {
802
- let i = r(() => {
851
+ }, signalEffect = (e, t) => {
852
+ r(() => {
803
853
  t(e.value);
804
854
  });
805
- n(() => i.dispose());
806
- }, isNativeFormInput = (e) => e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement || e instanceof HTMLSelectElement, isCheckableInput = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio"), syncFormControl = (e, t, n, r = { last: void 0 }) => {
807
- let i = isCheckableInput(e), a = i ? !!t : t == null ? "" : String(t), o = i ? e.checked : e.value;
808
- (!n || r.last === void 0 || Object.is(o, r.last) || Object.is(o, a)) && (i ? e.checked = a : e.value = a, n && (r.last = a));
809
- }, syncRegisteredProp = (e, t, n, r) => {
810
- let i = isStructuredValue(r) ? r : t.parse(n.mode === "bool" ? r ? "" : null : r == null || r === !1 ? null : String(r));
811
- if (Object.is(o(() => t.signal.value), i) || (t.signal.value = i), !t.reflect) {
812
- if (isStructuredValue(r)) return;
813
- n.mode === "bool" ? e.toggleAttribute(n.name, !!r) : setAttr(e, n.name, r);
814
- }
815
- }, applyAttrBinding = (e, t) => {
816
- let { el: n, mode: r, name: i } = e, a = { last: void 0 }, update = (t) => {
817
- let o = getPropMeta(n, i);
818
- o ? syncRegisteredProp(n, o, e, t) : i === "value" && isNativeFormInput(n) || i === "checked" && n instanceof HTMLInputElement ? syncFormControl(n, t, e.live, a) : i === "indeterminate" && n instanceof HTMLInputElement ? n.indeterminate = !!t : r === "bool" ? n.toggleAttribute(i, !!t) : setAttr(n, i, t);
855
+ }, isNativeFormInput = (e) => e instanceof HTMLInputElement || e instanceof HTMLTextAreaElement || e instanceof HTMLSelectElement, isCheckableInput = (e) => e instanceof HTMLInputElement && (e.type === "checkbox" || e.type === "radio"), syncFormControl = (e, t, n) => {
856
+ let r = isCheckableInput(e), i = r ? !!t : t == null ? "" : String(t), a = r ? e.checked : e.value;
857
+ (!n || n.last === void 0 || Object.is(a, n.last) || Object.is(a, i)) && (r ? e.checked = i : e.value = i, n && (n.last = i));
858
+ }, isAttributeValue = (e) => typeof e == "string" || typeof e == "number" || typeof e == "boolean", toRegisteredPropValue = (e, t, n) => t === "bool" ? e.parse(n ? "" : null) : n == null || n === !1 ? e.parse(null) : typeof n == "string" ? e.parse(n) : n, syncRegisteredProp = (e, t, n, r) => {
859
+ let i = toRegisteredPropValue(t, n.mode, r);
860
+ Object.is(s(() => t.signal.value), i) || (t.signal.value = i), !t.reflect && (r == null || isAttributeValue(r)) && (n.mode === "bool" ? e.toggleAttribute(n.name, !!r) : setAttr(e, n.name, r));
861
+ }, applyAttrBinding = (e) => {
862
+ let { el: t, mode: n, name: r } = e, update = (i) => {
863
+ let a = getPropMeta(t, r);
864
+ a ? syncRegisteredProp(t, a, e, i) : r === "value" && isNativeFormInput(t) || r === "checked" && t instanceof HTMLInputElement ? syncFormControl(t, i) : r === "indeterminate" && t instanceof HTMLInputElement ? t.indeterminate = !!i : n === "bool" ? t.toggleAttribute(r, !!i) : setAttr(t, r, i);
819
865
  };
820
- "signal" in e ? signalEffect(e.signal, update, t) : update(e.value);
821
- }, applyEventBinding = (e, t) => {
822
- let { modifiers: n } = e, r = n?.stop || n?.prevent ? (t) => {
823
- n.stop && t.stopPropagation(), n.prevent && t.preventDefault(), e.handler(t);
824
- } : e.handler, i = n?.once || n?.capture ? {
825
- capture: n.capture,
826
- once: n.once
866
+ "signal" in e ? signalEffect(e.signal, update) : update(e.value);
867
+ }, applyEventBinding = (e) => {
868
+ let { modifiers: t } = e, n = t?.stop || t?.prevent ? (n) => {
869
+ t.stop && n.stopPropagation(), t.prevent && n.preventDefault(), e.handler(n);
870
+ } : e.handler, r = t?.once || t?.capture ? {
871
+ capture: t.capture,
872
+ once: t.once
827
873
  } : void 0;
828
- t(listen(e.el, e.name, r, i));
829
- }, applyPropBinding = (e, t) => {
874
+ a(listen(e.el, e.name, n, r));
875
+ }, applyPropBinding = (e) => {
830
876
  let update = (t) => {
831
877
  e.el[e.name] = t;
832
878
  };
833
- "signal" in e ? signalEffect(e.signal, update, t) : update(e.value);
834
- }, applyModelBinding = (e, t) => {
835
- let { el: n, get: i, signal: a } = e, s = { last: void 0 }, write = (e) => {
836
- isNativeFormInput(n) ? syncFormControl(n, e, !0, s) : n.value = e;
837
- }, c = r(() => {
838
- write(a.value);
839
- }), onEvent = () => {
840
- let e = i(n);
841
- Object.is(o(() => a.value), e) || (a.value = e);
879
+ "signal" in e ? signalEffect(e.signal, update) : update(e.value);
880
+ }, applyModelBinding = (e) => {
881
+ let { el: t, get: n, signal: i } = e, o = { last: void 0 }, write = (e) => {
882
+ isNativeFormInput(t) ? syncFormControl(t, e, o) : t.value = e;
842
883
  };
843
- t(() => c.dispose()), t(listen(n, e.event, onEvent));
844
- }, applyRefBinding = (e, t) => {
845
- let { el: n, ref: r } = e;
846
- typeof r == "function" ? (r(n), t(() => r(null))) : (r.value = n, t(() => {
847
- r.value = null;
884
+ r(() => {
885
+ write(i.value);
886
+ });
887
+ let onEvent = () => {
888
+ let e = n(t);
889
+ Object.is(s(() => i.value), e) || (i.value = e);
890
+ };
891
+ a(listen(t, e.event, onEvent));
892
+ }, applyRefBinding = (e) => {
893
+ let { el: t, ref: n } = e;
894
+ typeof n == "function" ? (n(t), a(() => n(null))) : (n.value = t, a(() => {
895
+ n.value = null;
848
896
  }));
849
- }, insertHtmlValues = (e, t, n) => {
850
- let r = [], i = t.parentNode;
851
- invariant(i, "html binding anchor has no parent node");
852
- for (let a of e) if (O(a)) {
853
- let e = Array.from(a.fragment.childNodes);
854
- i.insertBefore(a.fragment, t), a.apply(n), r.push(...e);
855
- } else if (a != null && a !== !1) {
856
- let e = document.createTextNode(String(a));
857
- i.insertBefore(e, t), r.push(e);
897
+ }, insertHtmlValues = (e, t, n = []) => {
898
+ let r = t.parentNode;
899
+ invariant(r, "html binding anchor has no parent node");
900
+ for (let i of e) if (E(i)) {
901
+ i.claim();
902
+ let e = Array.from(i.fragment.childNodes);
903
+ r.insertBefore(i.fragment, t), i.apply(), n.push(...e);
904
+ } else if (i != null && i !== !1) {
905
+ let e = document.createTextNode(String(i));
906
+ r.insertBefore(e, t), n.push(e);
858
907
  }
859
- return r;
860
- }, toHtmlValues = (e) => Array.isArray(e) ? e : [e], applyHtmlBinding = (e, t) => {
861
- let { anchor: n, source: i } = e, a = createReplaceableSlot(), s = r(() => {
862
- let e = toHtmlValues(typeof i == "function" ? i() : i.value);
863
- a.clear(), e != null && e.length !== 0 && o(() => {
864
- a.setNodes(insertHtmlValues(e, n, a.registerCleanup));
908
+ return n;
909
+ }, toHtmlValues = (e) => Array.isArray(e) ? e : [e], applyHtmlBinding = (e) => {
910
+ let { anchor: t, source: n } = e, i = createReplaceableSlot(), o = r(() => {
911
+ let e = toHtmlValues(typeof n == "function" ? n() : n.value);
912
+ e == null || e.length === 0 ? i.clear() : s(() => {
913
+ i.render(() => {
914
+ let n = [];
915
+ try {
916
+ insertHtmlValues(e, t, n);
917
+ } finally {
918
+ i.setNodes(n);
919
+ }
920
+ });
865
921
  });
866
922
  });
867
- t(() => {
868
- s.dispose(), a.clear();
923
+ a(() => {
924
+ o.dispose(), i.clear();
869
925
  });
870
- }, applyDirectiveBinding = (e, t) => {
871
- e.directive.mount(e.anchor, t);
872
- }, applyBinding = (e, t) => {
926
+ }, applyDirectiveBinding = (e) => {
927
+ e.directive.mount(e.anchor);
928
+ }, applyBinding = (e) => {
873
929
  switch (e.type) {
874
930
  case "attr":
875
- applyAttrBinding(e, t);
931
+ applyAttrBinding(e);
876
932
  break;
877
933
  case "directive":
878
- applyDirectiveBinding(e, t);
934
+ applyDirectiveBinding(e);
879
935
  break;
880
936
  case "event":
881
- applyEventBinding(e, t);
937
+ applyEventBinding(e);
882
938
  break;
883
939
  case "html":
884
- applyHtmlBinding(e, t);
940
+ applyHtmlBinding(e);
885
941
  break;
886
942
  case "model":
887
- applyModelBinding(e, t);
943
+ applyModelBinding(e);
888
944
  break;
889
945
  case "prop":
890
- applyPropBinding(e, t);
946
+ applyPropBinding(e);
891
947
  break;
892
- case "ref": applyRefBinding(e, t);
948
+ case "ref": applyRefBinding(e);
893
949
  }
894
- }, createAttrBindingFromValue = (e, n, r, a) => A(a) ? {
895
- el: e,
896
- live: !0,
897
- mode: n,
898
- name: r,
899
- signal: a.source,
900
- type: "attr"
901
- } : typeof a == "function" ? {
950
+ }, createAttrBindingFromValue = (e, n, r, a) => typeof a == "function" ? {
902
951
  el: e,
903
952
  mode: n,
904
953
  name: r,
@@ -932,7 +981,7 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
932
981
  if (t.length === 0) return;
933
982
  let n = {};
934
983
  for (let r of t) {
935
- if (!(r in B)) throw new OreApiError(s.eventModifierUnknown(e, r));
984
+ if (!(r in B)) throw new OreApiError(c.eventModifierUnknown(e, r));
936
985
  n[r] = !0;
937
986
  }
938
987
  return n;
@@ -962,8 +1011,8 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
962
1011
  };
963
1012
  if (t = W.exec(e)) {
964
1013
  let n = t[1];
965
- if (n === "__proto__" || n === "constructor" || n === "prototype") throw new OreApiError(s.propBindingForbiddenName(n));
966
- if (K.has(n.toLowerCase())) throw new OreApiError(s.propBindingHtmlInjectionName(n));
1014
+ if (n === "__proto__" || n === "constructor" || n === "prototype") throw new OreApiError(c.propBindingForbiddenName(n));
1015
+ if (K.has(n.toLowerCase())) throw new OreApiError(c.propBindingHtmlInjectionName(n));
967
1016
  return {
968
1017
  kind: z.PROP,
969
1018
  name: n,
@@ -976,7 +1025,7 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
976
1025
  prefix: e.slice(0, -t[0].length)
977
1026
  };
978
1027
  let n = e.lastIndexOf("<");
979
- if (n > e.lastIndexOf(">") && e[n + 1] !== "/") throw new OreApiError(s.templateInterpolationInTag);
1028
+ if (n > e.lastIndexOf(">") && e[n + 1] !== "/") throw new OreApiError(c.templateInterpolationInTag);
980
1029
  return {
981
1030
  kind: z.NODE,
982
1031
  prefix: e
@@ -1042,11 +1091,12 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1042
1091
  for (let e of t) n = n.childNodes[e];
1043
1092
  return n;
1044
1093
  }, Z = "html`...`: node-slot comment anchor has no parent node", embedStaticResult = (e, t, n) => {
1094
+ e.claim();
1045
1095
  let r = t.parentNode;
1046
1096
  for (invariant(r, Z); e.fragment.firstChild;) r.insertBefore(e.fragment.firstChild, t);
1047
1097
  n.push(e.apply.bind(e));
1048
1098
  }, compileTemplate = (e, n) => {
1049
- let r = getStaticTemplate(e), a = r.element.content.cloneNode(!0), o = [], c = [], l = r.slots.map((e, t) => {
1099
+ let r = getStaticTemplate(e), a = r.element.content.cloneNode(!0), o = [], s = [], l = r.slots.map((e, t) => {
1050
1100
  let i = n[t];
1051
1101
  if (e.kind === z.NODE) {
1052
1102
  let t = e.commentId === void 0 ? void 0 : r.commentPaths.get(e.commentId);
@@ -1065,7 +1115,7 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1065
1115
  });
1066
1116
  for (let { comment: e, el: n, slot: r, value: a } of l) if (r.kind === z.NODE) {
1067
1117
  let t = e;
1068
- if (invariant(t, "compiled template produced a node slot without a comment anchor"), E(a)) {
1118
+ if (invariant(t, "compiled template produced a node slot without a comment anchor"), w(a)) {
1069
1119
  o.push({
1070
1120
  anchor: t,
1071
1121
  directive: a,
@@ -1073,8 +1123,8 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1073
1123
  });
1074
1124
  continue;
1075
1125
  }
1076
- if (O(a)) {
1077
- embedStaticResult(a, t, c), t.remove();
1126
+ if (E(a)) {
1127
+ embedStaticResult(a, t, s), t.remove();
1078
1128
  continue;
1079
1129
  }
1080
1130
  if (typeof a == "function" || i(a)) {
@@ -1086,7 +1136,7 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1086
1136
  continue;
1087
1137
  }
1088
1138
  if (Array.isArray(a)) {
1089
- for (let e of a) if (O(e)) embedStaticResult(e, t, c);
1139
+ for (let e of a) if (E(e)) embedStaticResult(e, t, s);
1090
1140
  else {
1091
1141
  let n = t.parentNode;
1092
1142
  invariant(n, Z), n.insertBefore(document.createTextNode(resolveStaticText(e)), t);
@@ -1141,7 +1191,7 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1141
1191
  type: "ref"
1142
1192
  });
1143
1193
  else if (invariant(r.name, "compiled template produced an attr slot without an attribute name"), M(a)) {
1144
- if (r.mode !== "attr") throw new OreApiError(s.modelRequiresValueBinding(r.name));
1194
+ if (r.mode !== "attr") throw new OreApiError(c.modelRequiresValueBinding(r.name));
1145
1195
  o.push({
1146
1196
  el: n,
1147
1197
  event: a.event ?? modelDefaultEvent(n),
@@ -1150,9 +1200,9 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1150
1200
  type: "model"
1151
1201
  });
1152
1202
  } else o.push(createAttrBindingFromValue(n, r.mode ?? "attr", r.name, a));
1153
- return createHtmlResult(a, (e) => {
1154
- for (let t of o) applyBinding(t, e);
1155
- for (let t of c) t(e);
1203
+ return createHtmlResult(a, () => {
1204
+ for (let e of o) applyBinding(e);
1205
+ for (let e of s) e();
1156
1206
  });
1157
1207
  }, html = (e, ...t) => compileTemplate(e, t), Q = {
1158
1208
  bubbles: !0,
@@ -1168,6 +1218,6 @@ var L = "default", normalizeSlotName = (e) => e || L, createSlots = (e) => {
1168
1218
  return e.dispatchEvent(new CustomEvent(String(t), r));
1169
1219
  });
1170
1220
  }, $ = 0, ee = Math.random().toString(36).slice(2, 6), createId = (e = "id") => `${e}-${ee}${++$}`;
1171
- export { OreApiError, OreError, OreInternalError, OreLifecycleError, bind, classMap, createContext, createId, css, define, each, getHost, html, inject, injectStrict, live, model, onCleanup, onElement, onEvent, onFormReset, onMounted, v as prop, provide, ref, styleMap, unsafeHtml, useEmit, useField, useSlots, watchEffect, when };
1221
+ export { OreApiError, OreError, OreInternalError, OreLifecycleError, bind, classMap, createContext, createId, css, define, each, getHost, html, inject, injectStrict, model, onCleanup, onElement, onEvent, onFormReset, onMounted, x as prop, provide, ref, styleMap, unsafeHtml, useEmit, useField, useSlots, watchEffect, when };
1172
1222
 
1173
1223
  //# sourceMappingURL=ore.js.map