@marko/runtime-tags 6.1.17 → 6.1.19

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/debug/dom.js CHANGED
@@ -230,19 +230,12 @@ function push(opt, item) {
230
230
  }
231
231
  //#endregion
232
232
  //#region src/dom/event.ts
233
- const defaultDelegator = /* @__PURE__ */ createDelegator();
234
233
  function _on(element, type, handler) {
235
234
  assertHandlerIsFunction("on" + type[0].toUpperCase() + type.slice(1), handler);
236
- if (element["$" + type] === void 0) defaultDelegator(element, type, handleDelegated);
235
+ if (element["$" + type] === void 0) delegate(type, handleDelegated);
237
236
  element["$" + type] = handler || null;
238
237
  }
239
- /* @__NO_SIDE_EFFECTS__ */
240
- function createDelegator() {
241
- const kEvents = Symbol();
242
- return function ensureDelegated(node, type, handler) {
243
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, true), 1);
244
- };
245
- }
238
+ const delegate = (type, handler) => handler[type] ||= (document.addEventListener(type, handler, true), 1);
246
239
  function handleDelegated(ev) {
247
240
  let target = !rendering && ev.target;
248
241
  Object.defineProperty(ev, "currentTarget", {
@@ -867,7 +860,6 @@ function _el(id, accessor) {
867
860
  //#endregion
868
861
  //#region src/dom/controllable.ts
869
862
  let inputType = "";
870
- const controllableDelegate = /* @__PURE__ */ createDelegator();
871
863
  function _attr_input_checked_default(scope, nodeAccessor, checked) {
872
864
  const el = scope[nodeAccessor];
873
865
  const normalizedChecked = isNotVoid(checked);
@@ -927,7 +919,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
927
919
  const oldValue = scope["ControlledValue:" + nodeAccessor];
928
920
  const newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
929
921
  if (el.name && el.type[0] === "r") {
930
- for (const radio of el.getRootNode().querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) if (radio.form === el.form) radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value;
922
+ for (const radio of document.querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) if (radio.form === el.form) radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value;
931
923
  } else el.checked = !el.checked;
932
924
  checkedValueChange(newValue);
933
925
  run();
@@ -969,7 +961,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
969
961
  }
970
962
  function setInputValue(el, value) {
971
963
  if (el.value !== value) {
972
- const updatedPosition = resolveCursorPosition(inputType, el.getRootNode().activeElement === el && el.selectionStart, el.value, el.value = value);
964
+ const updatedPosition = resolveCursorPosition(inputType, document.activeElement === el && el.selectionStart, el.value, el.value = value);
973
965
  if (~updatedPosition) el.setSelectionRange(updatedPosition, updatedPosition);
974
966
  }
975
967
  }
@@ -1076,8 +1068,8 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
1076
1068
  }
1077
1069
  function syncControllableFormInput(el, hasChanged, onChange) {
1078
1070
  el._ = onChange;
1079
- controllableDelegate(el, "input", handleChange);
1080
- if (el.form) controllableDelegate(el.form, "reset", handleFormReset);
1071
+ delegate("input", handleChange);
1072
+ if (el.form) delegate("reset", handleFormReset);
1081
1073
  if (isResuming && hasChanged(el)) queueMicrotask(onChange);
1082
1074
  }
1083
1075
  function handleChange(ev) {
@@ -1900,6 +1892,9 @@ const compat = {
1900
1892
  getStartNode(branch) {
1901
1893
  return branch["#StartNode"];
1902
1894
  },
1895
+ getEndNode(branch) {
1896
+ return branch["#EndNode"];
1897
+ },
1903
1898
  setScopeNodes(branch, startNode, endNode) {
1904
1899
  branch["#StartNode"] = startNode;
1905
1900
  branch["#EndNode"] = endNode;
@@ -228,19 +228,12 @@ function push(opt, item) {
228
228
  }
229
229
  //#endregion
230
230
  //#region src/dom/event.ts
231
- const defaultDelegator = /* @__PURE__ */ createDelegator();
232
231
  function _on(element, type, handler) {
233
232
  assertHandlerIsFunction("on" + type[0].toUpperCase() + type.slice(1), handler);
234
- if (element["$" + type] === void 0) defaultDelegator(element, type, handleDelegated);
233
+ if (element["$" + type] === void 0) delegate(type, handleDelegated);
235
234
  element["$" + type] = handler || null;
236
235
  }
237
- /* @__NO_SIDE_EFFECTS__ */
238
- function createDelegator() {
239
- const kEvents = Symbol();
240
- return function ensureDelegated(node, type, handler) {
241
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, true), 1);
242
- };
243
- }
236
+ const delegate = (type, handler) => handler[type] ||= (document.addEventListener(type, handler, true), 1);
244
237
  function handleDelegated(ev) {
245
238
  let target = !rendering && ev.target;
246
239
  Object.defineProperty(ev, "currentTarget", {
@@ -865,7 +858,6 @@ function _el(id, accessor) {
865
858
  //#endregion
866
859
  //#region src/dom/controllable.ts
867
860
  let inputType = "";
868
- const controllableDelegate = /* @__PURE__ */ createDelegator();
869
861
  function _attr_input_checked_default(scope, nodeAccessor, checked) {
870
862
  const el = scope[nodeAccessor];
871
863
  const normalizedChecked = isNotVoid(checked);
@@ -925,7 +917,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
925
917
  const oldValue = scope["ControlledValue:" + nodeAccessor];
926
918
  const newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
927
919
  if (el.name && el.type[0] === "r") {
928
- for (const radio of el.getRootNode().querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) if (radio.form === el.form) radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value;
920
+ for (const radio of document.querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) if (radio.form === el.form) radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value;
929
921
  } else el.checked = !el.checked;
930
922
  checkedValueChange(newValue);
931
923
  run();
@@ -967,7 +959,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
967
959
  }
968
960
  function setInputValue(el, value) {
969
961
  if (el.value !== value) {
970
- const updatedPosition = resolveCursorPosition(inputType, el.getRootNode().activeElement === el && el.selectionStart, el.value, el.value = value);
962
+ const updatedPosition = resolveCursorPosition(inputType, document.activeElement === el && el.selectionStart, el.value, el.value = value);
971
963
  if (~updatedPosition) el.setSelectionRange(updatedPosition, updatedPosition);
972
964
  }
973
965
  }
@@ -1074,8 +1066,8 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
1074
1066
  }
1075
1067
  function syncControllableFormInput(el, hasChanged, onChange) {
1076
1068
  el._ = onChange;
1077
- controllableDelegate(el, "input", handleChange);
1078
- if (el.form) controllableDelegate(el.form, "reset", handleFormReset);
1069
+ delegate("input", handleChange);
1070
+ if (el.form) delegate("reset", handleFormReset);
1079
1071
  if (isResuming && hasChanged(el)) queueMicrotask(onChange);
1080
1072
  }
1081
1073
  function handleChange(ev) {
@@ -1898,6 +1890,9 @@ const compat = {
1898
1890
  getStartNode(branch) {
1899
1891
  return branch["#StartNode"];
1900
1892
  },
1893
+ getEndNode(branch) {
1894
+ return branch["#EndNode"];
1895
+ },
1901
1896
  setScopeNodes(branch, startNode, endNode) {
1902
1897
  branch["#StartNode"] = startNode;
1903
1898
  branch["#EndNode"] = endNode;
@@ -2475,29 +2475,29 @@ function _attr_option_value(value) {
2475
2475
  }
2476
2476
  const kSelectedValue = Symbol("selectedValue");
2477
2477
  const kSelectedValueMatched = Symbol("selectedValueMatched");
2478
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
2479
- if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange);
2478
+ function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content, serializeType) {
2479
+ if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2480
2480
  if (content) if (valueChange) {
2481
2481
  const matched = { value: false };
2482
2482
  withContext(kSelectedValue, value, () => withContext(kSelectedValueMatched, matched, content));
2483
2483
  if (!matched.value && (Array.isArray(value) ? value.some((v) => normalizeStrAttrValue(v) !== "") : normalizeStrAttrValue(value) !== "")) console.error("A controlled `<select>`'s `value` has no matching `<option>`:", value);
2484
2484
  } else withContext(kSelectedValue, value, content);
2485
2485
  }
2486
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
2487
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2486
+ function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2487
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2488
2488
  return _escape(value);
2489
2489
  }
2490
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2491
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2490
+ function _attr_input_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2491
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2492
2492
  return _attr("value", value);
2493
2493
  }
2494
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2495
- if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange);
2494
+ function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange, serializeType) {
2495
+ if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange, serializeType);
2496
2496
  return isNotVoid(checked) ? " checked" : "";
2497
2497
  }
2498
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2498
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
2499
2499
  const valueAttr = _attr("value", value);
2500
- if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange);
2500
+ if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType);
2501
2501
  return normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
2502
2502
  }
2503
2503
  const checkedValuesRefs = /* @__PURE__ */ new WeakMap();
@@ -2511,9 +2511,9 @@ function getCheckedValueRef(checkedValue) {
2511
2511
  return ref;
2512
2512
  }
2513
2513
  }
2514
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2514
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
2515
2515
  const normalizedOpen = isNotVoid(open);
2516
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2516
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType);
2517
2517
  return normalizedOpen ? " open" : "";
2518
2518
  }
2519
2519
  function _attr_nonce() {
@@ -2529,9 +2529,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2529
2529
  switch (tagName) {
2530
2530
  case "input":
2531
2531
  assertExclusiveAttrs(data);
2532
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2533
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2534
- else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
2532
+ if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange, 1);
2533
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value, 1);
2534
+ else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange, 1);
2535
2535
  else break;
2536
2536
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2537
2537
  break;
@@ -2548,7 +2548,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2548
2548
  case "details":
2549
2549
  case "dialog":
2550
2550
  if (data.openChange) {
2551
- result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange);
2551
+ result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange, 1);
2552
2552
  skip = /^open(?:Change)?$|[\s/>"'=]/;
2553
2553
  }
2554
2554
  break;
@@ -2594,12 +2594,15 @@ function _attrs_partial_content(data, skip, nodeAccessor, scopeId, tagName, seri
2594
2594
  _html(`${_attrs_partial(data, skip, nodeAccessor, scopeId, tagName)}>`);
2595
2595
  _attr_content(nodeAccessor, scopeId, data?.content, serializeReason);
2596
2596
  }
2597
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
2597
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
2598
2598
  assertHandlerIsFunction("valueChange", valueChange);
2599
- writeScope(scopeId, {
2599
+ writeScope(scopeId, serializeType ? {
2600
2600
  ["ControlledType:" + nodeAccessor]: type,
2601
2601
  ["ControlledValue:" + nodeAccessor]: value,
2602
2602
  ["ControlledHandler:" + nodeAccessor]: valueChange
2603
+ } : {
2604
+ ["ControlledValue:" + nodeAccessor]: value,
2605
+ ["ControlledHandler:" + nodeAccessor]: valueChange
2603
2606
  });
2604
2607
  }
2605
2608
  function stringAttr(name, value) {
@@ -2665,10 +2668,10 @@ let _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2665
2668
  const renderContent = content || normalizeDynamicRenderer(input.content);
2666
2669
  if (renderer === "textarea") {
2667
2670
  if (renderContent) throw new Error("A dynamic tag rendering a `<textarea>` cannot have `content` and must use the `value` attribute instead.");
2668
- _html(_attr_textarea_value(branchId, `#${renderer}/0`, input.value, input.valueChange));
2671
+ _html(_attr_textarea_value(branchId, `#${renderer}/0`, input.value, input.valueChange, 1));
2669
2672
  } else if (renderContent) {
2670
2673
  if (typeof renderContent !== "function") throw new Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
2671
- if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, `#${renderer}/0`, input.value, input.valueChange, renderContent);
2674
+ if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, `#${renderer}/0`, input.value, input.valueChange, renderContent, 1);
2672
2675
  else _dynamic_tag(branchId, `#${renderer}/0`, renderContent, void 0, 0, void 0, serializeReason);
2673
2676
  }
2674
2677
  _html(`</${renderer}>`);
@@ -2473,29 +2473,29 @@ function _attr_option_value(value) {
2473
2473
  }
2474
2474
  const kSelectedValue = Symbol("selectedValue");
2475
2475
  const kSelectedValueMatched = Symbol("selectedValueMatched");
2476
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
2477
- if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange);
2476
+ function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content, serializeType) {
2477
+ if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2478
2478
  if (content) if (valueChange) {
2479
2479
  const matched = { value: false };
2480
2480
  withContext(kSelectedValue, value, () => withContext(kSelectedValueMatched, matched, content));
2481
2481
  if (!matched.value && (Array.isArray(value) ? value.some((v) => normalizeStrAttrValue(v) !== "") : normalizeStrAttrValue(value) !== "")) console.error("A controlled `<select>`'s `value` has no matching `<option>`:", value);
2482
2482
  } else withContext(kSelectedValue, value, content);
2483
2483
  }
2484
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
2485
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2484
+ function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2485
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2486
2486
  return _escape(value);
2487
2487
  }
2488
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2489
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2488
+ function _attr_input_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2489
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2490
2490
  return _attr("value", value);
2491
2491
  }
2492
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2493
- if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange);
2492
+ function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange, serializeType) {
2493
+ if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange, serializeType);
2494
2494
  return isNotVoid(checked) ? " checked" : "";
2495
2495
  }
2496
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2496
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
2497
2497
  const valueAttr = _attr("value", value);
2498
- if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange);
2498
+ if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType);
2499
2499
  return normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
2500
2500
  }
2501
2501
  const checkedValuesRefs = /* @__PURE__ */ new WeakMap();
@@ -2509,9 +2509,9 @@ function getCheckedValueRef(checkedValue) {
2509
2509
  return ref;
2510
2510
  }
2511
2511
  }
2512
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2512
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
2513
2513
  const normalizedOpen = isNotVoid(open);
2514
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2514
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType);
2515
2515
  return normalizedOpen ? " open" : "";
2516
2516
  }
2517
2517
  function _attr_nonce() {
@@ -2527,9 +2527,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2527
2527
  switch (tagName) {
2528
2528
  case "input":
2529
2529
  assertExclusiveAttrs(data);
2530
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2531
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2532
- else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
2530
+ if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange, 1);
2531
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value, 1);
2532
+ else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange, 1);
2533
2533
  else break;
2534
2534
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2535
2535
  break;
@@ -2546,7 +2546,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2546
2546
  case "details":
2547
2547
  case "dialog":
2548
2548
  if (data.openChange) {
2549
- result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange);
2549
+ result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange, 1);
2550
2550
  skip = /^open(?:Change)?$|[\s/>"'=]/;
2551
2551
  }
2552
2552
  break;
@@ -2592,12 +2592,15 @@ function _attrs_partial_content(data, skip, nodeAccessor, scopeId, tagName, seri
2592
2592
  _html(`${_attrs_partial(data, skip, nodeAccessor, scopeId, tagName)}>`);
2593
2593
  _attr_content(nodeAccessor, scopeId, data?.content, serializeReason);
2594
2594
  }
2595
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
2595
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
2596
2596
  assertHandlerIsFunction("valueChange", valueChange);
2597
- writeScope(scopeId, {
2597
+ writeScope(scopeId, serializeType ? {
2598
2598
  ["ControlledType:" + nodeAccessor]: type,
2599
2599
  ["ControlledValue:" + nodeAccessor]: value,
2600
2600
  ["ControlledHandler:" + nodeAccessor]: valueChange
2601
+ } : {
2602
+ ["ControlledValue:" + nodeAccessor]: value,
2603
+ ["ControlledHandler:" + nodeAccessor]: valueChange
2601
2604
  });
2602
2605
  }
2603
2606
  function stringAttr(name, value) {
@@ -2663,10 +2666,10 @@ let _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2663
2666
  const renderContent = content || normalizeDynamicRenderer(input.content);
2664
2667
  if (renderer === "textarea") {
2665
2668
  if (renderContent) throw new Error("A dynamic tag rendering a `<textarea>` cannot have `content` and must use the `value` attribute instead.");
2666
- _html(_attr_textarea_value(branchId, `#${renderer}/0`, input.value, input.valueChange));
2669
+ _html(_attr_textarea_value(branchId, `#${renderer}/0`, input.value, input.valueChange, 1));
2667
2670
  } else if (renderContent) {
2668
2671
  if (typeof renderContent !== "function") throw new Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
2669
- if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, `#${renderer}/0`, input.value, input.valueChange, renderContent);
2672
+ if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, `#${renderer}/0`, input.value, input.valueChange, renderContent, 1);
2670
2673
  else _dynamic_tag(branchId, `#${renderer}/0`, renderContent, void 0, 0, void 0, serializeReason);
2671
2674
  }
2672
2675
  _html(`</${renderer}>`);
@@ -10,6 +10,7 @@ export declare const compat: {
10
10
  setRendererId(renderer: any, id: unknown): void;
11
11
  isRenderer(renderer: any): any;
12
12
  getStartNode(branch: any): any;
13
+ getEndNode(branch: any): any;
13
14
  setScopeNodes(branch: any, startNode: Node, endNode: Node): void;
14
15
  runComponentEffects(this: any): void;
15
16
  runComponentDestroy(this: any): void;
@@ -1,4 +1,4 @@
1
1
  type EventNames = keyof GlobalEventHandlersEventMap;
2
2
  export declare function _on<T extends EventNames, H extends false | null | undefined | ((ev: GlobalEventHandlersEventMap[T], target: Element) => void)>(element: Element, type: T, handler: H): void;
3
- export declare function createDelegator(): (node: Node, type: string, handler: EventListener) => void;
3
+ export declare const delegate: (type: string, handler: EventListener) => any;
4
4
  export {};
package/dist/dom.js CHANGED
@@ -4,7 +4,7 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
4
4
  else if (Array.isArray(val)) for (let v of val) part = toDelimitedString(v, delimiter, stringify), part && (str += sep + part, sep = delimiter);
5
5
  else for (let name in val) part = stringify(name, val[name]), part && (str += sep + part, sep = delimiter);
6
6
  return str;
7
- }, decodeAccessor = (num) => (num + (num < 26 ? 10 : num < 962 ? 334 : 11998)).toString(36), defaultDelegator = /* @__PURE__ */ createDelegator(), R = /[^\p{L}\p{N}]/gu, parsers = {}, nextScopeId = 1e6, collectingScopes, destroyNestedScopes = function destroyNestedScopes(scope) {
7
+ }, decodeAccessor = (num) => (num + (num < 26 ? 10 : num < 962 ? 334 : 11998)).toString(36), delegate = (type, handler) => handler[type] ||= (document.addEventListener(type, handler, !0), 1), R = /[^\p{L}\p{N}]/gu, parsers = {}, nextScopeId = 1e6, collectingScopes, destroyNestedScopes = function destroyNestedScopes(scope) {
8
8
  scope.H = 0, scope.D?.forEach(destroyNestedScopes), scope.B?.forEach(resetControllers);
9
9
  }, isScheduled, channel, _return = (scope, value) => scope.T?.(value), _var_change = (scope, value) => scope.U?.(value), tagIdsByGlobal = /* @__PURE__ */ new WeakMap(), walker = /* @__PURE__ */ document.createTreeWalker(document), walkInternal = function walkInternal(currentWalkIndex, walkCodes, scope) {
10
10
  let value, currentMultiplier, storedMultiplier = 0, currentScopeIndex = 0;
@@ -20,7 +20,7 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
20
20
  for (value = 10 * currentMultiplier + value - 107; value--;) walker.parentNode();
21
21
  walker.nextSibling();
22
22
  } else storedMultiplier = currentMultiplier * 10 + value - 117;
23
- }, cloneCache = {}, registeredValues = {}, curRenders, branchesEnabled, embedRenders, readyIds, isResuming, inputType = "", controllableDelegate = /* @__PURE__ */ createDelegator(), _dynamic_tag = function(nodeAccessor, getContent, getTagVar, inputIsArgs) {
23
+ }, cloneCache = {}, registeredValues = {}, curRenders, branchesEnabled, embedRenders, readyIds, isResuming, inputType = "", _dynamic_tag = function(nodeAccessor, getContent, getTagVar, inputIsArgs) {
24
24
  nodeAccessor = decodeAccessor(nodeAccessor);
25
25
  let childScopeAccessor = "A" + nodeAccessor, rendererAccessor = "D" + nodeAccessor;
26
26
  return enableBranches(), (scope, newRenderer, getInput) => {
@@ -74,6 +74,9 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
74
74
  getStartNode(branch) {
75
75
  return branch.S;
76
76
  },
77
+ getEndNode(branch) {
78
+ return branch.K;
79
+ },
77
80
  setScopeNodes(branch, startNode, endNode) {
78
81
  branch.S = startNode, branch.K = endNode;
79
82
  },
@@ -179,14 +182,7 @@ function push(opt, item) {
179
182
  //#endregion
180
183
  //#region src/dom/event.ts
181
184
  function _on(element, type, handler) {
182
- element["$" + type] === void 0 && defaultDelegator(element, type, handleDelegated), element["$" + type] = handler || null;
183
- }
184
- /* @__NO_SIDE_EFFECTS__ */
185
- function createDelegator() {
186
- let kEvents = Symbol();
187
- return function(node, type, handler) {
188
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, !0), 1);
189
- };
185
+ element["$" + type] === void 0 && delegate(type, handleDelegated), element["$" + type] = handler || null;
190
186
  }
191
187
  function handleDelegated(ev) {
192
188
  let target = !rendering && ev.target;
@@ -574,7 +570,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
574
570
  let checkedValueChange = scope["E" + nodeAccessor];
575
571
  if (checkedValueChange) {
576
572
  let oldValue = scope["G" + nodeAccessor], newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
577
- if (el.name && el.type[0] === "r") for (let radio of el.getRootNode().querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) radio.form === el.form && (radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value);
573
+ if (el.name && el.type[0] === "r") for (let radio of document.querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) radio.form === el.form && (radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value);
578
574
  else el.checked = !el.checked;
579
575
  checkedValueChange(newValue), run();
580
576
  }
@@ -600,7 +596,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
600
596
  }
601
597
  function setInputValue(el, value) {
602
598
  if (el.value !== value) {
603
- let updatedPosition = resolveCursorPosition(inputType, el.getRootNode().activeElement === el && el.selectionStart, el.value, el.value = value);
599
+ let updatedPosition = resolveCursorPosition(inputType, document.activeElement === el && el.selectionStart, el.value, el.value = value);
604
600
  ~updatedPosition && el.setSelectionRange(updatedPosition, updatedPosition);
605
601
  }
606
602
  }
@@ -672,7 +668,7 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
672
668
  });
673
669
  }
674
670
  function syncControllableFormInput(el, hasChanged, onChange) {
675
- el._ = onChange, controllableDelegate(el, "input", handleChange), el.form && controllableDelegate(el.form, "reset", handleFormReset), isResuming && hasChanged(el) && queueMicrotask(onChange);
671
+ el._ = onChange, delegate("input", handleChange), el.form && delegate("reset", handleFormReset), isResuming && hasChanged(el) && queueMicrotask(onChange);
676
672
  }
677
673
  function handleChange(ev) {
678
674
  ev.target._?.(ev);
package/dist/dom.mjs CHANGED
@@ -4,7 +4,7 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
4
4
  else if (Array.isArray(val)) for (let v of val) part = toDelimitedString(v, delimiter, stringify), part && (str += sep + part, sep = delimiter);
5
5
  else for (let name in val) part = stringify(name, val[name]), part && (str += sep + part, sep = delimiter);
6
6
  return str;
7
- }, decodeAccessor = (num) => (num + (num < 26 ? 10 : num < 962 ? 334 : 11998)).toString(36), defaultDelegator = /* @__PURE__ */ createDelegator(), R = /[^\p{L}\p{N}]/gu, parsers = {}, nextScopeId = 1e6, collectingScopes, destroyNestedScopes = function destroyNestedScopes(scope) {
7
+ }, decodeAccessor = (num) => (num + (num < 26 ? 10 : num < 962 ? 334 : 11998)).toString(36), delegate = (type, handler) => handler[type] ||= (document.addEventListener(type, handler, !0), 1), R = /[^\p{L}\p{N}]/gu, parsers = {}, nextScopeId = 1e6, collectingScopes, destroyNestedScopes = function destroyNestedScopes(scope) {
8
8
  scope.H = 0, scope.D?.forEach(destroyNestedScopes), scope.B?.forEach(resetControllers);
9
9
  }, isScheduled, channel, _return = (scope, value) => scope.T?.(value), _var_change = (scope, value) => scope.U?.(value), tagIdsByGlobal = /* @__PURE__ */ new WeakMap(), walker = /* @__PURE__ */ document.createTreeWalker(document), walkInternal = function walkInternal(currentWalkIndex, walkCodes, scope) {
10
10
  let value, currentMultiplier, storedMultiplier = 0, currentScopeIndex = 0;
@@ -20,7 +20,7 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
20
20
  for (value = 10 * currentMultiplier + value - 107; value--;) walker.parentNode();
21
21
  walker.nextSibling();
22
22
  } else storedMultiplier = currentMultiplier * 10 + value - 117;
23
- }, cloneCache = {}, registeredValues = {}, curRenders, branchesEnabled, embedRenders, readyIds, isResuming, inputType = "", controllableDelegate = /* @__PURE__ */ createDelegator(), _dynamic_tag = function(nodeAccessor, getContent, getTagVar, inputIsArgs) {
23
+ }, cloneCache = {}, registeredValues = {}, curRenders, branchesEnabled, embedRenders, readyIds, isResuming, inputType = "", _dynamic_tag = function(nodeAccessor, getContent, getTagVar, inputIsArgs) {
24
24
  nodeAccessor = decodeAccessor(nodeAccessor);
25
25
  let childScopeAccessor = "A" + nodeAccessor, rendererAccessor = "D" + nodeAccessor;
26
26
  return enableBranches(), (scope, newRenderer, getInput) => {
@@ -74,6 +74,9 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
74
74
  getStartNode(branch) {
75
75
  return branch.S;
76
76
  },
77
+ getEndNode(branch) {
78
+ return branch.K;
79
+ },
77
80
  setScopeNodes(branch, startNode, endNode) {
78
81
  branch.S = startNode, branch.K = endNode;
79
82
  },
@@ -178,14 +181,7 @@ function push(opt, item) {
178
181
  //#endregion
179
182
  //#region src/dom/event.ts
180
183
  function _on(element, type, handler) {
181
- element["$" + type] === void 0 && defaultDelegator(element, type, handleDelegated), element["$" + type] = handler || null;
182
- }
183
- /* @__NO_SIDE_EFFECTS__ */
184
- function createDelegator() {
185
- let kEvents = Symbol();
186
- return function(node, type, handler) {
187
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, !0), 1);
188
- };
184
+ element["$" + type] === void 0 && delegate(type, handleDelegated), element["$" + type] = handler || null;
189
185
  }
190
186
  function handleDelegated(ev) {
191
187
  let target = !rendering && ev.target;
@@ -573,7 +569,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
573
569
  let checkedValueChange = scope["E" + nodeAccessor];
574
570
  if (checkedValueChange) {
575
571
  let oldValue = scope["G" + nodeAccessor], newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
576
- if (el.name && el.type[0] === "r") for (let radio of el.getRootNode().querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) radio.form === el.form && (radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value);
572
+ if (el.name && el.type[0] === "r") for (let radio of document.querySelectorAll(`[type=radio][name=${CSS.escape(el.name)}]`)) radio.form === el.form && (radio.checked = Array.isArray(oldValue) ? oldValue.includes(radio.value) : oldValue === radio.value);
577
573
  else el.checked = !el.checked;
578
574
  checkedValueChange(newValue), run();
579
575
  }
@@ -599,7 +595,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
599
595
  }
600
596
  function setInputValue(el, value) {
601
597
  if (el.value !== value) {
602
- let updatedPosition = resolveCursorPosition(inputType, el.getRootNode().activeElement === el && el.selectionStart, el.value, el.value = value);
598
+ let updatedPosition = resolveCursorPosition(inputType, document.activeElement === el && el.selectionStart, el.value, el.value = value);
603
599
  ~updatedPosition && el.setSelectionRange(updatedPosition, updatedPosition);
604
600
  }
605
601
  }
@@ -671,7 +667,7 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
671
667
  });
672
668
  }
673
669
  function syncControllableFormInput(el, hasChanged, onChange) {
674
- el._ = onChange, controllableDelegate(el, "input", handleChange), el.form && controllableDelegate(el.form, "reset", handleFormReset), isResuming && hasChanged(el) && queueMicrotask(onChange);
670
+ el._ = onChange, delegate("input", handleChange), el.form && delegate("reset", handleFormReset), isResuming && hasChanged(el) && queueMicrotask(onChange);
675
671
  }
676
672
  function handleChange(ev) {
677
673
  ev.target._?.(ev);
@@ -2,12 +2,12 @@ import { type Accessor } from "../common/types";
2
2
  export declare function _attr_class(value: unknown): string;
3
3
  export declare function _attr_style(value: unknown): string;
4
4
  export declare function _attr_option_value(value: unknown): string;
5
- export declare function _attr_select_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown, content?: () => void): void;
6
- export declare function _attr_textarea_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown): string;
7
- export declare function _attr_input_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown): string;
8
- export declare function _attr_input_checked(scopeId: number, nodeAccessor: Accessor, checked: unknown, checkedChange: unknown): "" | " checked";
9
- export declare function _attr_input_checkedValue(scopeId: number, nodeAccessor: Accessor, checkedValue: unknown, checkedValueChange: unknown, value: unknown): string;
10
- export declare function _attr_details_or_dialog_open(scopeId: number, nodeAccessor: Accessor, open: unknown, openChange: unknown): "" | " open";
5
+ export declare function _attr_select_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown, content?: () => void, serializeType?: 1): void;
6
+ export declare function _attr_textarea_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown, serializeType?: 1): string;
7
+ export declare function _attr_input_value(scopeId: number, nodeAccessor: Accessor, value: unknown, valueChange: unknown, serializeType?: 1): string;
8
+ export declare function _attr_input_checked(scopeId: number, nodeAccessor: Accessor, checked: unknown, checkedChange: unknown, serializeType?: 1): "" | " checked";
9
+ export declare function _attr_input_checkedValue(scopeId: number, nodeAccessor: Accessor, checkedValue: unknown, checkedValueChange: unknown, value: unknown, serializeType?: 1): string;
10
+ export declare function _attr_details_or_dialog_open(scopeId: number, nodeAccessor: Accessor, open: unknown, openChange: unknown, serializeType?: 1): "" | " open";
11
11
  export declare function _attr_nonce(): string;
12
12
  export declare function _attr(name: string, value: unknown): string;
13
13
  export declare function _attrs(data: Record<string, unknown>, nodeAccessor: Accessor, scopeId: number, tagName: string): string;
package/dist/html.js CHANGED
@@ -247,10 +247,10 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
247
247
  let input = (inputIsArgs ? inputOrArgs[0] : inputOrArgs) || {};
248
248
  if (rendered = !0, _scope_id(), _html(`<${renderer}${_attrs(input, "a", branchId, renderer)}>`), !voidElementsReg.test(renderer)) {
249
249
  let renderContent = content || normalizeDynamicRenderer(input.content);
250
- if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange));
250
+ if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange, 1));
251
251
  else if (renderContent) {
252
252
  if (typeof renderContent != "function") throw Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
253
- renderer === "select" && ("value" in input || "valueChange" in input) ? _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent) : _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
253
+ renderer === "select" && ("value" in input || "valueChange" in input) ? _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent, 1) : _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
254
254
  }
255
255
  _html(`</${renderer}>`);
256
256
  }
@@ -1614,21 +1614,21 @@ function _attr_option_value(value) {
1614
1614
  let valueAttr = _attr("value", value);
1615
1615
  return normalizedValueMatches(getContext(kSelectedValue), value) ? valueAttr + " selected" : valueAttr;
1616
1616
  }
1617
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
1618
- valueChange && writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange), content && withContext(kSelectedValue, value, content);
1617
+ function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content, serializeType) {
1618
+ valueChange && writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange, serializeType), content && withContext(kSelectedValue, value, content);
1619
1619
  }
1620
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
1621
- return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange), _escape(value);
1620
+ function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
1621
+ return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType), _escape(value);
1622
1622
  }
1623
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
1624
- return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange), _attr("value", value);
1623
+ function _attr_input_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
1624
+ return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType), _attr("value", value);
1625
1625
  }
1626
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
1627
- return checkedChange && writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange), isNotVoid(checked) ? " checked" : "";
1626
+ function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange, serializeType) {
1627
+ return checkedChange && writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange, serializeType), isNotVoid(checked) ? " checked" : "";
1628
1628
  }
1629
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
1629
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
1630
1630
  let valueAttr = _attr("value", value);
1631
- return checkedValueChange && writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange), normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
1631
+ return checkedValueChange && writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType), normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
1632
1632
  }
1633
1633
  function getCheckedValueRef(checkedValue) {
1634
1634
  if (Array.isArray(checkedValue)) {
@@ -1636,9 +1636,9 @@ function getCheckedValueRef(checkedValue) {
1636
1636
  return ref || (ref = [], checkedValuesRefs.set(checkedValue, ref)), ref;
1637
1637
  }
1638
1638
  }
1639
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
1639
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
1640
1640
  let normalizedOpen = isNotVoid(open);
1641
- return openChange && writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange), normalizedOpen ? " open" : "";
1641
+ return openChange && writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType), normalizedOpen ? " open" : "";
1642
1642
  }
1643
1643
  function _attr_nonce() {
1644
1644
  return getChunk().boundary.state.nonceAttr;
@@ -1650,9 +1650,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
1650
1650
  let result = "", skip = /[\s/>"'=]/, events;
1651
1651
  switch (tagName) {
1652
1652
  case "input":
1653
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
1654
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
1655
- else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
1653
+ if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange, 1);
1654
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value, 1);
1655
+ else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange, 1);
1656
1656
  else break;
1657
1657
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
1658
1658
  break;
@@ -1665,7 +1665,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
1665
1665
  break;
1666
1666
  case "details":
1667
1667
  case "dialog":
1668
- data.openChange && (result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange), skip = /^open(?:Change)?$|[\s/>"'=]/);
1668
+ data.openChange && (result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange, 1), skip = /^open(?:Change)?$|[\s/>"'=]/);
1669
1669
  break;
1670
1670
  }
1671
1671
  for (let name in data) {
@@ -1698,11 +1698,14 @@ function _attrs_partial(data, skip, nodeAccessor, scopeId, tagName) {
1698
1698
  function _attrs_partial_content(data, skip, nodeAccessor, scopeId, tagName, serializeReason) {
1699
1699
  _html(`${_attrs_partial(data, skip, nodeAccessor, scopeId, tagName)}>`), _attr_content(nodeAccessor, scopeId, data?.content, serializeReason);
1700
1700
  }
1701
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
1702
- writeScope(scopeId, {
1701
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
1702
+ writeScope(scopeId, serializeType ? {
1703
1703
  ["F" + nodeAccessor]: type,
1704
1704
  ["G" + nodeAccessor]: value,
1705
1705
  ["E" + nodeAccessor]: valueChange
1706
+ } : {
1707
+ ["G" + nodeAccessor]: value,
1708
+ ["E" + nodeAccessor]: valueChange
1706
1709
  });
1707
1710
  }
1708
1711
  function stringAttr(name, value) {
package/dist/html.mjs CHANGED
@@ -247,10 +247,10 @@ let empty = [], rest = Symbol(), toDelimitedString = function toDelimitedString(
247
247
  let input = (inputIsArgs ? inputOrArgs[0] : inputOrArgs) || {};
248
248
  if (rendered = !0, _scope_id(), _html(`<${renderer}${_attrs(input, "a", branchId, renderer)}>`), !voidElementsReg.test(renderer)) {
249
249
  let renderContent = content || normalizeDynamicRenderer(input.content);
250
- if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange));
250
+ if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange, 1));
251
251
  else if (renderContent) {
252
252
  if (typeof renderContent != "function") throw Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
253
- renderer === "select" && ("value" in input || "valueChange" in input) ? _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent) : _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
253
+ renderer === "select" && ("value" in input || "valueChange" in input) ? _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent, 1) : _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
254
254
  }
255
255
  _html(`</${renderer}>`);
256
256
  }
@@ -1613,21 +1613,21 @@ function _attr_option_value(value) {
1613
1613
  let valueAttr = _attr("value", value);
1614
1614
  return normalizedValueMatches(getContext(kSelectedValue), value) ? valueAttr + " selected" : valueAttr;
1615
1615
  }
1616
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
1617
- valueChange && writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange), content && withContext(kSelectedValue, value, content);
1616
+ function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content, serializeType) {
1617
+ valueChange && writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange, serializeType), content && withContext(kSelectedValue, value, content);
1618
1618
  }
1619
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
1620
- return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange), _escape(value);
1619
+ function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
1620
+ return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType), _escape(value);
1621
1621
  }
1622
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
1623
- return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange), _attr("value", value);
1622
+ function _attr_input_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
1623
+ return valueChange && writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType), _attr("value", value);
1624
1624
  }
1625
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
1626
- return checkedChange && writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange), isNotVoid(checked) ? " checked" : "";
1625
+ function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange, serializeType) {
1626
+ return checkedChange && writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange, serializeType), isNotVoid(checked) ? " checked" : "";
1627
1627
  }
1628
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
1628
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
1629
1629
  let valueAttr = _attr("value", value);
1630
- return checkedValueChange && writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange), normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
1630
+ return checkedValueChange && writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType), normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
1631
1631
  }
1632
1632
  function getCheckedValueRef(checkedValue) {
1633
1633
  if (Array.isArray(checkedValue)) {
@@ -1635,9 +1635,9 @@ function getCheckedValueRef(checkedValue) {
1635
1635
  return ref || (ref = [], checkedValuesRefs.set(checkedValue, ref)), ref;
1636
1636
  }
1637
1637
  }
1638
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
1638
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
1639
1639
  let normalizedOpen = isNotVoid(open);
1640
- return openChange && writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange), normalizedOpen ? " open" : "";
1640
+ return openChange && writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType), normalizedOpen ? " open" : "";
1641
1641
  }
1642
1642
  function _attr_nonce() {
1643
1643
  return getChunk().boundary.state.nonceAttr;
@@ -1649,9 +1649,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
1649
1649
  let result = "", skip = /[\s/>"'=]/, events;
1650
1650
  switch (tagName) {
1651
1651
  case "input":
1652
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
1653
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
1654
- else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
1652
+ if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange, 1);
1653
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value, 1);
1654
+ else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange, 1);
1655
1655
  else break;
1656
1656
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
1657
1657
  break;
@@ -1664,7 +1664,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
1664
1664
  break;
1665
1665
  case "details":
1666
1666
  case "dialog":
1667
- data.openChange && (result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange), skip = /^open(?:Change)?$|[\s/>"'=]/);
1667
+ data.openChange && (result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange, 1), skip = /^open(?:Change)?$|[\s/>"'=]/);
1668
1668
  break;
1669
1669
  }
1670
1670
  for (let name in data) {
@@ -1697,11 +1697,14 @@ function _attrs_partial(data, skip, nodeAccessor, scopeId, tagName) {
1697
1697
  function _attrs_partial_content(data, skip, nodeAccessor, scopeId, tagName, serializeReason) {
1698
1698
  _html(`${_attrs_partial(data, skip, nodeAccessor, scopeId, tagName)}>`), _attr_content(nodeAccessor, scopeId, data?.content, serializeReason);
1699
1699
  }
1700
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
1701
- writeScope(scopeId, {
1700
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
1701
+ writeScope(scopeId, serializeType ? {
1702
1702
  ["F" + nodeAccessor]: type,
1703
1703
  ["G" + nodeAccessor]: value,
1704
1704
  ["E" + nodeAccessor]: valueChange
1705
+ } : {
1706
+ ["G" + nodeAccessor]: value,
1707
+ ["E" + nodeAccessor]: valueChange
1705
1708
  });
1706
1709
  }
1707
1710
  function stringAttr(name, value) {
@@ -1348,7 +1348,6 @@ function analyzeTagNameType(tag, allowDynamic) {
1348
1348
  extra.tagNameType = 2;
1349
1349
  extra.tagNameDynamic = true;
1350
1350
  extra.featureType = "class";
1351
- ((0, _marko_compiler_babel_utils.getProgram)().node.extra ??= {}).needsCompat = true;
1352
1351
  } else if (!childFile) {
1353
1352
  extra.tagNameType = 2;
1354
1353
  extra.tagNameDynamic = true;
@@ -2018,25 +2017,25 @@ function _attr_option_value(value) {
2018
2017
  return valueAttr;
2019
2018
  }
2020
2019
  const kSelectedValue = Symbol("selectedValue");
2021
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
2022
- if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange);
2020
+ function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content, serializeType) {
2021
+ if (valueChange) writeControlledScope(3, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2023
2022
  if (content) withContext(kSelectedValue, value, content);
2024
2023
  }
2025
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
2026
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2024
+ function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2025
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2027
2026
  return _escape(value);
2028
2027
  }
2029
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2030
- if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange);
2028
+ function _attr_input_value(scopeId, nodeAccessor, value, valueChange, serializeType) {
2029
+ if (valueChange) writeControlledScope(2, scopeId, nodeAccessor, void 0, valueChange, serializeType);
2031
2030
  return _attr("value", value);
2032
2031
  }
2033
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2034
- if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange);
2032
+ function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange, serializeType) {
2033
+ if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange, serializeType);
2035
2034
  return isNotVoid(checked) ? " checked" : "";
2036
2035
  }
2037
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2036
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
2038
2037
  const valueAttr = _attr("value", value);
2039
- if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange);
2038
+ if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType);
2040
2039
  return normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
2041
2040
  }
2042
2041
  const checkedValuesRefs = /* @__PURE__ */ new WeakMap();
@@ -2050,9 +2049,9 @@ function getCheckedValueRef(checkedValue) {
2050
2049
  return ref;
2051
2050
  }
2052
2051
  }
2053
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2052
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
2054
2053
  const normalizedOpen = isNotVoid(open);
2055
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2054
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType);
2056
2055
  return normalizedOpen ? " open" : "";
2057
2056
  }
2058
2057
  function _attr(name, value) {
@@ -2064,9 +2063,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2064
2063
  let events;
2065
2064
  switch (tagName) {
2066
2065
  case "input":
2067
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2068
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2069
- else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
2066
+ if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange, 1);
2067
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value, 1);
2068
+ else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange, 1);
2070
2069
  else break;
2071
2070
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2072
2071
  break;
@@ -2083,7 +2082,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2083
2082
  case "details":
2084
2083
  case "dialog":
2085
2084
  if (data.openChange) {
2086
- result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange);
2085
+ result += _attr_details_or_dialog_open(scopeId, nodeAccessor, data.open, data.openChange, 1);
2087
2086
  skip = /^open(?:Change)?$|[\s/>"'=]/;
2088
2087
  }
2089
2088
  break;
@@ -2110,11 +2109,14 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2110
2109
  }
2111
2110
  return result;
2112
2111
  }
2113
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
2114
- writeScope(scopeId, {
2112
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
2113
+ writeScope(scopeId, serializeType ? {
2115
2114
  ["ControlledType:" + nodeAccessor]: type,
2116
2115
  ["ControlledValue:" + nodeAccessor]: value,
2117
2116
  ["ControlledHandler:" + nodeAccessor]: valueChange
2117
+ } : {
2118
+ ["ControlledValue:" + nodeAccessor]: value,
2119
+ ["ControlledHandler:" + nodeAccessor]: valueChange
2118
2120
  });
2119
2121
  }
2120
2122
  function stringAttr(name, value) {
@@ -2176,10 +2178,10 @@ let _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2176
2178
  _html(`<${renderer}${_attrs(input, "a", branchId, renderer)}>`);
2177
2179
  if (!voidElementsReg.test(renderer)) {
2178
2180
  const renderContent = content || normalizeDynamicRenderer(input.content);
2179
- if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange));
2181
+ if (renderer === "textarea") _html(_attr_textarea_value(branchId, "a", input.value, input.valueChange, 1));
2180
2182
  else if (renderContent) {
2181
2183
  if (typeof renderContent !== "function") throw new Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
2182
- if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent);
2184
+ if (renderer === "select" && ("value" in input || "valueChange" in input)) _attr_select_value(branchId, "a", input.value, input.valueChange, renderContent, 1);
2183
2185
  else _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
2184
2186
  }
2185
2187
  _html(`</${renderer}>`);
@@ -4419,7 +4421,8 @@ var native_tag_default = {
4419
4421
  tag.insertBefore(_marko_compiler.types.variableDeclaration("const", [_marko_compiler.types.variableDeclarator(spreadIdentifier, spreadExpression)]));
4420
4422
  htmlSelectArgs.set(tag.node, {
4421
4423
  value: _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("value")),
4422
- valueChange: _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("valueChange"))
4424
+ valueChange: _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("valueChange")),
4425
+ serializeType: _marko_compiler.types.numericLiteral(1)
4423
4426
  });
4424
4427
  spreadExpression = spreadIdentifier;
4425
4428
  }
@@ -4436,7 +4439,7 @@ var native_tag_default = {
4436
4439
  valueChange = _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("valueChange"));
4437
4440
  spreadExpression = spreadIdentifier;
4438
4441
  }
4439
- if (valueChange) writeAtStartOfBody = callRuntime("_attr_textarea_value", getScopeIdIdentifier(tagSection), visitAccessor, value, valueChange);
4442
+ if (valueChange) writeAtStartOfBody = callRuntime("_attr_textarea_value", getScopeIdIdentifier(tagSection), visitAccessor, value, valueChange, staticControllable ? void 0 : _marko_compiler.types.numericLiteral(1));
4440
4443
  else if (value) writeAtStartOfBody = callRuntime("_escape", value);
4441
4444
  }
4442
4445
  for (const attr of staticAttrs) {
@@ -4496,7 +4499,7 @@ var native_tag_default = {
4496
4499
  if (selectArgs) {
4497
4500
  if (!tagExtra[kSkipEndTag]) write`</${tagName}>`;
4498
4501
  flushInto(tag);
4499
- tag.insertBefore(_marko_compiler.types.expressionStatement(callRuntime("_attr_select_value", getScopeIdIdentifier(tagSection), nodeBinding && getScopeAccessorLiteral(nodeBinding), selectArgs.value, selectArgs.valueChange, _marko_compiler.types.arrowFunctionExpression([], _marko_compiler.types.blockStatement(tag.node.body.body)))));
4502
+ tag.insertBefore(_marko_compiler.types.expressionStatement(callRuntime("_attr_select_value", getScopeIdIdentifier(tagSection), nodeBinding && getScopeAccessorLiteral(nodeBinding), selectArgs.value, selectArgs.valueChange, _marko_compiler.types.arrowFunctionExpression([], _marko_compiler.types.blockStatement(tag.node.body.body)), selectArgs.serializeType)));
4500
4503
  } else if (isTextOnly) {
4501
4504
  for (const child of tag.node.body.body) if (_marko_compiler.types.isMarkoText(child)) write`${child.value}`;
4502
4505
  else if (_marko_compiler.types.isMarkoPlaceholder(child)) write`${callRuntime(getTextOnlyEscapeHelper(tagName), child.value)}`;
@@ -8770,12 +8773,28 @@ var dynamic_tag_default = {
8770
8773
  const tagExtra = node.extra;
8771
8774
  const nodeBinding = tagExtra[kDOMBinding];
8772
8775
  const isClassAPI = tagExtra.featureType === "class";
8776
+ const tagsSerializeReason = getSerializeReason(tagSection, nodeBinding);
8777
+ const serializeReason = tagsSerializeReason;
8773
8778
  let tagExpression = node.name;
8774
- if (_marko_compiler.types.isStringLiteral(tagExpression)) tagExpression = (0, _marko_compiler_babel_utils.importDefault)(tag.hub.file, getTagRelativePath(tag), tagExpression.value);
8775
- if (isClassAPI) if ((0, _marko_compiler_babel_utils.getTagTemplate)(tag)) {
8776
- if (getSerializeReason(tagSection, nodeBinding)) if (isOutputHTML()) (0, _marko_compiler_babel_utils.getProgram)().node.body.push(_marko_compiler.types.markoScriptlet([_marko_compiler.types.expressionStatement(_marko_compiler.types.callExpression((0, _marko_compiler_babel_utils.importNamed)(tag.hub.file, getCompatRuntimeFile(), "s"), [_marko_compiler.types.stringLiteral((0, _marko_compiler_babel_utils.loadFileForTag)(tag).metadata.marko.id), _marko_compiler.types.identifier(tagExpression.name)]))], true));
8777
- else (0, _marko_compiler_babel_utils.getProgram)().node.body.push(_marko_compiler.types.expressionStatement(callRuntime("_resume", _marko_compiler.types.stringLiteral((0, _marko_compiler_babel_utils.loadFileForTag)(tag).metadata.marko.id), _marko_compiler.types.identifier(tagExpression.name))));
8778
- } else (0, _marko_compiler_babel_utils.getProgram)().node.body.push(_marko_compiler.types.markoScriptlet([_marko_compiler.types.expressionStatement(_marko_compiler.types.assignmentExpression("??=", _marko_compiler.types.memberExpression(_marko_compiler.types.identifier(tagExpression.name), _marko_compiler.types.identifier("_")), _marko_compiler.types.identifier(tagExpression.name)))], true));
8779
+ if (isClassAPI) {
8780
+ const classTagTemplate = (0, _marko_compiler_babel_utils.getTagTemplate)(tag);
8781
+ const classFile = classTagTemplate ? (0, _marko_compiler_babel_utils.loadFileForTag)(tag) : void 0;
8782
+ const classHydration = classFile?.metadata.marko.classHydration;
8783
+ if (!isOutputHTML() && isOptimize() && classTagTemplate && !tagsSerializeReason && !classHydration) {
8784
+ tag.remove();
8785
+ return;
8786
+ }
8787
+ ((0, _marko_compiler_babel_utils.getProgram)().node.extra ??= {}).needsCompat = true;
8788
+ if (_marko_compiler.types.isStringLiteral(tagExpression)) tagExpression = (0, _marko_compiler_babel_utils.importDefault)(tag.hub.file, getTagRelativePath(tag), tagExpression.value);
8789
+ if (classTagTemplate) {
8790
+ const preserveBoundary = !tagsSerializeReason && (classHydration === "descendant" || classHydration === "self" && !!classFile?.metadata.marko.hasComponentBrowser);
8791
+ if (isOutputHTML() ? serializeReason || classHydration : serializeReason) (0, _marko_compiler_babel_utils.getProgram)().node.body.push(isOutputHTML() ? _marko_compiler.types.markoScriptlet([_marko_compiler.types.expressionStatement(_marko_compiler.types.callExpression((0, _marko_compiler_babel_utils.importNamed)(tag.hub.file, getCompatRuntimeFile(), "s"), [
8792
+ _marko_compiler.types.stringLiteral((0, _marko_compiler_babel_utils.loadFileForTag)(tag).metadata.marko.id),
8793
+ _marko_compiler.types.identifier(tagExpression.name),
8794
+ ...preserveBoundary ? [_marko_compiler.types.stringLiteral("preserve")] : []
8795
+ ]))], true) : _marko_compiler.types.expressionStatement(callRuntime("_resume", _marko_compiler.types.stringLiteral((0, _marko_compiler_babel_utils.loadFileForTag)(tag).metadata.marko.id), _marko_compiler.types.identifier(tagExpression.name))));
8796
+ } else (0, _marko_compiler_babel_utils.getProgram)().node.body.push(_marko_compiler.types.markoScriptlet([_marko_compiler.types.expressionStatement(_marko_compiler.types.assignmentExpression("??=", _marko_compiler.types.memberExpression(_marko_compiler.types.identifier(tagExpression.name), _marko_compiler.types.identifier("_")), _marko_compiler.types.identifier(tagExpression.name)))], true));
8797
+ } else if (_marko_compiler.types.isStringLiteral(tagExpression)) tagExpression = (0, _marko_compiler_babel_utils.importDefault)(tag.hub.file, getTagRelativePath(tag), tagExpression.value);
8779
8798
  const { properties, statements } = translateAttrs(tag, void 0, void 0, void 0, isClassAPI ? "renderBody" : "content");
8780
8799
  const args = [];
8781
8800
  let hasTagArgs = false;
@@ -8793,7 +8812,7 @@ var dynamic_tag_default = {
8793
8812
  if (isOutputHTML()) {
8794
8813
  flushInto(tag);
8795
8814
  writeHTMLResumeStatements(tag.get("body"));
8796
- const serializeArg = getSerializeGuard(tagSection, getSerializeReason(tagSection, nodeBinding), true);
8815
+ const serializeArg = getSerializeGuard(tagSection, serializeReason, true);
8797
8816
  const dynamicTagExpr = hasTagArgs ? callRuntime("_dynamic_tag", getScopeIdIdentifier(tagSection), getScopeAccessorLiteral(nodeBinding), tagExpression, _marko_compiler.types.arrayExpression(args), _marko_compiler.types.numericLiteral(0), _marko_compiler.types.numericLiteral(1), serializeArg) : callRuntime("_dynamic_tag", getScopeIdIdentifier(tagSection), getScopeAccessorLiteral(nodeBinding), tagExpression, args[0], args[1] || (serializeArg ? _marko_compiler.types.numericLiteral(0) : void 0), serializeArg ? _marko_compiler.types.numericLiteral(0) : void 0, serializeArg);
8798
8817
  if (node.var) {
8799
8818
  const dynamicScopeIdentifier = generateUidIdentifier(tag.get("name").toString() + "_scope");
@@ -8826,7 +8845,7 @@ var dynamic_tag_default = {
8826
8845
  const argsOrInput = hasTagArgs ? _marko_compiler.types.arrayExpression(args) : args[0];
8827
8846
  if (!_marko_compiler.types.isObjectExpression(argsOrInput) || argsOrInput.properties.length) signal.extraArgs = [_marko_compiler.types.arrowFunctionExpression([], statements.length ? _marko_compiler.types.blockStatement(statements.concat(_marko_compiler.types.returnStatement(argsOrInput))) : argsOrInput)];
8828
8847
  }
8829
- enableDynamicTagResume(tag);
8848
+ if (!isClassAPI) enableDynamicTagResume(tag);
8830
8849
  addValue(section, tagExtra.referencedBindings, signal, tagExpression);
8831
8850
  tag.remove();
8832
8851
  }
@@ -3,6 +3,16 @@ import { type Binding } from "../../util/references";
3
3
  import { type Section } from "../../util/sections";
4
4
  declare const kDOMBinding: unique symbol;
5
5
  declare const kChildOffsetScopeBinding: unique symbol;
6
+ declare enum ClassHydration {
7
+ Self = "self",
8
+ Descendant = "descendant"
9
+ }
10
+ declare module "@marko/compiler" {
11
+ interface MarkoMeta {
12
+ classHydration?: ClassHydration;
13
+ hasComponentBrowser?: boolean;
14
+ }
15
+ }
6
16
  declare module "@marko/compiler/dist/types" {
7
17
  interface MarkoTagExtra {
8
18
  [kDOMBinding]?: Binding;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marko/runtime-tags",
3
- "version": "6.1.17",
3
+ "version": "6.1.19",
4
4
  "description": "Optimized runtime for Marko templates.",
5
5
  "keywords": [
6
6
  "api",