@marko/runtime-tags 6.1.18 → 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) {
@@ -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) {
@@ -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}>`);
@@ -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) => {
@@ -182,14 +182,7 @@ function push(opt, item) {
182
182
  //#endregion
183
183
  //#region src/dom/event.ts
184
184
  function _on(element, type, handler) {
185
- element["$" + type] === void 0 && defaultDelegator(element, type, handleDelegated), element["$" + type] = handler || null;
186
- }
187
- /* @__NO_SIDE_EFFECTS__ */
188
- function createDelegator() {
189
- let kEvents = Symbol();
190
- return function(node, type, handler) {
191
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, !0), 1);
192
- };
185
+ element["$" + type] === void 0 && delegate(type, handleDelegated), element["$" + type] = handler || null;
193
186
  }
194
187
  function handleDelegated(ev) {
195
188
  let target = !rendering && ev.target;
@@ -577,7 +570,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
577
570
  let checkedValueChange = scope["E" + nodeAccessor];
578
571
  if (checkedValueChange) {
579
572
  let oldValue = scope["G" + nodeAccessor], newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
580
- 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);
581
574
  else el.checked = !el.checked;
582
575
  checkedValueChange(newValue), run();
583
576
  }
@@ -603,7 +596,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
603
596
  }
604
597
  function setInputValue(el, value) {
605
598
  if (el.value !== value) {
606
- 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);
607
600
  ~updatedPosition && el.setSelectionRange(updatedPosition, updatedPosition);
608
601
  }
609
602
  }
@@ -675,7 +668,7 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
675
668
  });
676
669
  }
677
670
  function syncControllableFormInput(el, hasChanged, onChange) {
678
- 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);
679
672
  }
680
673
  function handleChange(ev) {
681
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) => {
@@ -181,14 +181,7 @@ function push(opt, item) {
181
181
  //#endregion
182
182
  //#region src/dom/event.ts
183
183
  function _on(element, type, handler) {
184
- element["$" + type] === void 0 && defaultDelegator(element, type, handleDelegated), element["$" + type] = handler || null;
185
- }
186
- /* @__NO_SIDE_EFFECTS__ */
187
- function createDelegator() {
188
- let kEvents = Symbol();
189
- return function(node, type, handler) {
190
- ((node = node.getRootNode())[kEvents] ||= {})[type] ||= (node.addEventListener(type, handler, !0), 1);
191
- };
184
+ element["$" + type] === void 0 && delegate(type, handleDelegated), element["$" + type] = handler || null;
192
185
  }
193
186
  function handleDelegated(ev) {
194
187
  let target = !rendering && ev.target;
@@ -576,7 +569,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
576
569
  let checkedValueChange = scope["E" + nodeAccessor];
577
570
  if (checkedValueChange) {
578
571
  let oldValue = scope["G" + nodeAccessor], newValue = Array.isArray(oldValue) ? updateList(oldValue, el.value, el.checked) : el.checked ? el.value : void 0;
579
- 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);
580
573
  else el.checked = !el.checked;
581
574
  checkedValueChange(newValue), run();
582
575
  }
@@ -602,7 +595,7 @@ function _attr_input_value_script(scope, nodeAccessor) {
602
595
  }
603
596
  function setInputValue(el, value) {
604
597
  if (el.value !== value) {
605
- 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);
606
599
  ~updatedPosition && el.setSelectionRange(updatedPosition, updatedPosition);
607
600
  }
608
601
  }
@@ -674,7 +667,7 @@ function _attr_details_or_dialog_open_script(scope, nodeAccessor) {
674
667
  });
675
668
  }
676
669
  function syncControllableFormInput(el, hasChanged, onChange) {
677
- 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);
678
671
  }
679
672
  function handleChange(ev) {
680
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) {
@@ -2017,25 +2017,25 @@ function _attr_option_value(value) {
2017
2017
  return valueAttr;
2018
2018
  }
2019
2019
  const kSelectedValue = Symbol("selectedValue");
2020
- function _attr_select_value(scopeId, nodeAccessor, value, valueChange, content) {
2021
- 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);
2022
2022
  if (content) withContext(kSelectedValue, value, content);
2023
2023
  }
2024
- function _attr_textarea_value(scopeId, nodeAccessor, value, valueChange) {
2025
- 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);
2026
2026
  return _escape(value);
2027
2027
  }
2028
- function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2029
- 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);
2030
2030
  return _attr("value", value);
2031
2031
  }
2032
- function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2033
- 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);
2034
2034
  return isNotVoid(checked) ? " checked" : "";
2035
2035
  }
2036
- function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2036
+ function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value, serializeType) {
2037
2037
  const valueAttr = _attr("value", value);
2038
- if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange);
2038
+ if (checkedValueChange) writeControlledScope(1, scopeId, nodeAccessor, getCheckedValueRef(checkedValue), checkedValueChange, serializeType);
2039
2039
  return normalizedValueMatches(checkedValue, value) ? valueAttr + " checked" : valueAttr;
2040
2040
  }
2041
2041
  const checkedValuesRefs = /* @__PURE__ */ new WeakMap();
@@ -2049,9 +2049,9 @@ function getCheckedValueRef(checkedValue) {
2049
2049
  return ref;
2050
2050
  }
2051
2051
  }
2052
- function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2052
+ function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange, serializeType) {
2053
2053
  const normalizedOpen = isNotVoid(open);
2054
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2054
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange, serializeType);
2055
2055
  return normalizedOpen ? " open" : "";
2056
2056
  }
2057
2057
  function _attr(name, value) {
@@ -2063,9 +2063,9 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2063
2063
  let events;
2064
2064
  switch (tagName) {
2065
2065
  case "input":
2066
- if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2067
- else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2068
- 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);
2069
2069
  else break;
2070
2070
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2071
2071
  break;
@@ -2082,7 +2082,7 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2082
2082
  case "details":
2083
2083
  case "dialog":
2084
2084
  if (data.openChange) {
2085
- 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);
2086
2086
  skip = /^open(?:Change)?$|[\s/>"'=]/;
2087
2087
  }
2088
2088
  break;
@@ -2109,11 +2109,14 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2109
2109
  }
2110
2110
  return result;
2111
2111
  }
2112
- function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange) {
2113
- writeScope(scopeId, {
2112
+ function writeControlledScope(type, scopeId, nodeAccessor, value, valueChange, serializeType) {
2113
+ writeScope(scopeId, serializeType ? {
2114
2114
  ["ControlledType:" + nodeAccessor]: type,
2115
2115
  ["ControlledValue:" + nodeAccessor]: value,
2116
2116
  ["ControlledHandler:" + nodeAccessor]: valueChange
2117
+ } : {
2118
+ ["ControlledValue:" + nodeAccessor]: value,
2119
+ ["ControlledHandler:" + nodeAccessor]: valueChange
2117
2120
  });
2118
2121
  }
2119
2122
  function stringAttr(name, value) {
@@ -2175,10 +2178,10 @@ let _dynamic_tag = (scopeId, accessor, tag, inputOrArgs, content, inputIsArgs, s
2175
2178
  _html(`<${renderer}${_attrs(input, "a", branchId, renderer)}>`);
2176
2179
  if (!voidElementsReg.test(renderer)) {
2177
2180
  const renderContent = content || normalizeDynamicRenderer(input.content);
2178
- 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));
2179
2182
  else if (renderContent) {
2180
2183
  if (typeof renderContent !== "function") throw new Error(`Body content is not supported for the \`<${renderer}>\` tag.`);
2181
- 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);
2182
2185
  else _dynamic_tag(branchId, "a", renderContent, void 0, 0, void 0, serializeReason);
2183
2186
  }
2184
2187
  _html(`</${renderer}>`);
@@ -4418,7 +4421,8 @@ var native_tag_default = {
4418
4421
  tag.insertBefore(_marko_compiler.types.variableDeclaration("const", [_marko_compiler.types.variableDeclarator(spreadIdentifier, spreadExpression)]));
4419
4422
  htmlSelectArgs.set(tag.node, {
4420
4423
  value: _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("value")),
4421
- 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)
4422
4426
  });
4423
4427
  spreadExpression = spreadIdentifier;
4424
4428
  }
@@ -4435,7 +4439,7 @@ var native_tag_default = {
4435
4439
  valueChange = _marko_compiler.types.memberExpression(spreadIdentifier, _marko_compiler.types.identifier("valueChange"));
4436
4440
  spreadExpression = spreadIdentifier;
4437
4441
  }
4438
- 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));
4439
4443
  else if (value) writeAtStartOfBody = callRuntime("_escape", value);
4440
4444
  }
4441
4445
  for (const attr of staticAttrs) {
@@ -4495,7 +4499,7 @@ var native_tag_default = {
4495
4499
  if (selectArgs) {
4496
4500
  if (!tagExtra[kSkipEndTag]) write`</${tagName}>`;
4497
4501
  flushInto(tag);
4498
- 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)));
4499
4503
  } else if (isTextOnly) {
4500
4504
  for (const child of tag.node.body.body) if (_marko_compiler.types.isMarkoText(child)) write`${child.value}`;
4501
4505
  else if (_marko_compiler.types.isMarkoPlaceholder(child)) write`${callRuntime(getTextOnlyEscapeHelper(tagName), child.value)}`;
@@ -8774,7 +8778,8 @@ var dynamic_tag_default = {
8774
8778
  let tagExpression = node.name;
8775
8779
  if (isClassAPI) {
8776
8780
  const classTagTemplate = (0, _marko_compiler_babel_utils.getTagTemplate)(tag);
8777
- const classHydration = (classTagTemplate ? (0, _marko_compiler_babel_utils.loadFileForTag)(tag) : void 0)?.metadata.marko.classHydration;
8781
+ const classFile = classTagTemplate ? (0, _marko_compiler_babel_utils.loadFileForTag)(tag) : void 0;
8782
+ const classHydration = classFile?.metadata.marko.classHydration;
8778
8783
  if (!isOutputHTML() && isOptimize() && classTagTemplate && !tagsSerializeReason && !classHydration) {
8779
8784
  tag.remove();
8780
8785
  return;
@@ -8782,8 +8787,8 @@ var dynamic_tag_default = {
8782
8787
  ((0, _marko_compiler_babel_utils.getProgram)().node.extra ??= {}).needsCompat = true;
8783
8788
  if (_marko_compiler.types.isStringLiteral(tagExpression)) tagExpression = (0, _marko_compiler_babel_utils.importDefault)(tag.hub.file, getTagRelativePath(tag), tagExpression.value);
8784
8789
  if (classTagTemplate) {
8785
- const preserveBoundary = classHydration === "descendant" && !tagsSerializeReason;
8786
- if (isOutputHTML() ? serializeReason || preserveBoundary : 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"), [
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"), [
8787
8792
  _marko_compiler.types.stringLiteral((0, _marko_compiler_babel_utils.loadFileForTag)(tag).metadata.marko.id),
8788
8793
  _marko_compiler.types.identifier(tagExpression.name),
8789
8794
  ...preserveBoundary ? [_marko_compiler.types.stringLiteral("preserve")] : []
@@ -10,6 +10,7 @@ declare enum ClassHydration {
10
10
  declare module "@marko/compiler" {
11
11
  interface MarkoMeta {
12
12
  classHydration?: ClassHydration;
13
+ hasComponentBrowser?: boolean;
13
14
  }
14
15
  }
15
16
  declare module "@marko/compiler/dist/types" {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marko/runtime-tags",
3
- "version": "6.1.18",
3
+ "version": "6.1.19",
4
4
  "description": "Optimized runtime for Marko templates.",
5
5
  "keywords": [
6
6
  "api",