octane 0.2.16 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cjs/context-identity.cjs +43 -0
  2. package/dist/cjs/index.cjs +2 -0
  3. package/dist/cjs/internal/client.cjs +4 -1
  4. package/dist/cjs/internal/context.cjs +30 -0
  5. package/dist/cjs/internal/server.cjs +9 -0
  6. package/dist/cjs/runtime.cjs +269 -365
  7. package/dist/cjs/runtime.server.cjs +2 -1
  8. package/dist/cjs/signals/graph.cjs +2 -0
  9. package/dist/cjs/signals/transition-coordinator.cjs +279 -0
  10. package/dist/cjs/signals/transition-state.cjs +8 -0
  11. package/dist/cjs/version.cjs +1 -1
  12. package/dist/compiler/bundler.js +11 -1
  13. package/dist/compiler/compile-universal.js +17 -5
  14. package/dist/compiler/compile.js +172 -32
  15. package/dist/compiler/context-provider.js +196 -0
  16. package/dist/compiler/local-void-roots.js +154 -0
  17. package/dist/compiler/slot-hooks.js +121 -8
  18. package/dist/context-identity.d.ts +2 -0
  19. package/dist/context-identity.js +18 -0
  20. package/dist/index.d.ts +1 -1
  21. package/dist/index.js +2 -0
  22. package/dist/internal/client.d.ts +1 -0
  23. package/dist/internal/client.js +3 -1
  24. package/dist/internal/context.d.ts +1 -0
  25. package/dist/internal/context.js +5 -0
  26. package/dist/internal/server.d.ts +1 -0
  27. package/dist/internal/server.js +4 -0
  28. package/dist/public-types.d.ts +1 -1
  29. package/dist/runtime.d.ts +19 -8
  30. package/dist/runtime.js +269 -365
  31. package/dist/runtime.server.d.ts +0 -4
  32. package/dist/runtime.server.js +2 -1
  33. package/dist/signals/graph.js +3 -0
  34. package/dist/signals/transition-coordinator.d.ts +139 -0
  35. package/dist/signals/transition-coordinator.js +255 -0
  36. package/dist/signals/transition-state.d.ts +4 -0
  37. package/dist/signals/transition-state.js +6 -0
  38. package/dist/universal-core.js +21 -0
  39. package/dist/universal-native.d.ts +0 -1
  40. package/dist/universal-native.js +2 -1
  41. package/dist/version.js +1 -1
  42. package/package.json +7 -1
@@ -32,6 +32,7 @@ __export(runtime_exports, {
32
32
  ViewTransition: () => ViewTransition,
33
33
  ViewTransitionPseudoElement: () => ViewTransitionPseudoElement,
34
34
  __createVoidRoot: () => __createVoidRoot,
35
+ __hydrateVoidRoot: () => __hydrateVoidRoot,
35
36
  __useLinkedStateWithGetter: () => __useLinkedStateWithGetter,
36
37
  __useReducerWithGetter: () => __useReducerWithGetter,
37
38
  __useStateWithGetter: () => __useStateWithGetter,
@@ -342,6 +343,7 @@ var import_dom_binding_protocol = require("./dom-binding-protocol.cjs");
342
343
  var import_dom_focused_move = require("./dom-focused-move.cjs");
343
344
  var import_stream_protocol = require("./stream-protocol.cjs");
344
345
  var import_renderer_bridge = require("./renderer-bridge.cjs");
346
+ var import_context_identity = require("./context-identity.cjs");
345
347
  var import_native_read_client = require("./signals/native-read-client.cjs");
346
348
  var import_native_read_collector = require("./signals/native-read-collector.cjs");
347
349
  var import_native_read_retry = require("./signals/native-read-retry.cjs");
@@ -1199,251 +1201,21 @@ function ensureTransitionSwapDriver() {
1199
1201
  rebaseHeld: rebaseHeldTransitionUpdate
1200
1202
  };
1201
1203
  }
1202
- let NATIVE_TRANSITION_QUEUE = null;
1204
+ let NATIVE_TRANSITION_DRIVER = null;
1203
1205
  let NATIVE_TRANSITION_ATTEMPT = null;
1204
1206
  function queueNativeTransition(batch) {
1205
- (NATIVE_TRANSITION_QUEUE ??= /* @__PURE__ */ new Set()).add(batch);
1206
- if (!scheduled && !syncFlush) {
1207
- scheduled = true;
1208
- queueMicrotask(flush);
1209
- }
1207
+ NATIVE_TRANSITION_DRIVER.queue(batch);
1210
1208
  }
1211
1209
  function prepareNativeTransitionBlock(block) {
1212
- const admission = NATIVE_TRANSITION_ATTEMPT;
1213
- if (block.disposed || admission.blocks.has(block)) return;
1214
- const hidden = SCHEDULED_VISIBILITY_DRIVER?.find(block, false);
1215
- if (hidden?.nativeTransition !== void 0 && hidden.tryBlock !== null) block = hidden.tryBlock;
1216
- if (admission.blocks.has(block)) return;
1217
- const owner = block.idState.renderOwner;
1218
- if (owner === void 0 || owner.disposed) return;
1219
- const retired = owner.transaction?.retired;
1220
- if (retired !== void 0 && retired !== null) {
1221
- for (let current = block; current !== null; current = current.parentBlock)
1222
- if (retired.has(current)) return;
1223
- }
1224
- admission.blocks.add(block);
1225
- const root = beginRootRender(owner);
1226
- admission.transactions.add(owner.transaction);
1227
- const mode = block.pendingMode;
1228
- block.pendingMode = "transition";
1229
- const attempt = beginTransitionAttempt(block);
1230
- if (attempt !== null) admission.attempts.push(attempt);
1231
- try {
1232
- invalidateRender(block, block);
1233
- if (hidden?.nativeTransition !== void 0) {
1234
- journalObjectOnce(hidden);
1235
- journalRootProperty(block, "inactive", block.inactive);
1236
- SCHEDULED_VISIBILITY_DRIVER.reveal(hidden, "transition");
1237
- } else renderBlock(block);
1238
- } catch (error) {
1239
- if (isSuspenseException(error)) {
1240
- for (let owner2 = block; owner2 !== null; owner2 = owner2.parentBlock) {
1241
- const handler = owner2.__suspenseHandler;
1242
- if (handler) {
1243
- try {
1244
- handler(error.thenable, block);
1245
- } catch (suspension) {
1246
- if (!isSuspenseException(suspension)) throw suspension;
1247
- }
1248
- break;
1249
- }
1250
- }
1251
- throw error.thenable;
1252
- }
1253
- admission.errorBlock ??= block;
1254
- throw error;
1255
- } finally {
1256
- endTransitionAttempt(attempt);
1257
- block.pendingMode = mode;
1258
- endRootRender(root);
1259
- }
1260
- }
1261
- function finishNativeTransition(batch) {
1262
- batch.nativeWake?.();
1263
- batch.nativeWake = void 0;
1264
- batch.native = void 0;
1265
- for (const block of batch.nativeBlocks ?? [])
1266
- block.idState.renderOwner?.nativeTransitions?.delete(batch);
1267
- batch.nativeBlocks = void 0;
1268
- for (const state of batch.nativeBoundaries?.keys() ?? []) {
1269
- if (state.nativeTransition !== batch) continue;
1270
- state.nativeTransition = void 0;
1271
- if (state.transitionTimeoutId !== null) {
1272
- clearTimeout(state.transitionTimeoutId);
1273
- state.transitionTimeoutId = null;
1274
- }
1275
- }
1276
- batch.nativeBoundaries = void 0;
1277
- NATIVE_TRANSITION_QUEUE?.delete(batch);
1278
- if (NATIVE_TRANSITION_QUEUE?.size === 0) NATIVE_TRANSITION_QUEUE = null;
1279
- releaseTransitionHookHolder(batch);
1210
+ NATIVE_TRANSITION_DRIVER.prepare(block);
1280
1211
  }
1281
1212
  function retireNativeTransitionBlock(block) {
1282
- if (ROOT_RENDER_ROLLBACK) return;
1283
- for (const batch of block.idState.renderOwner?.nativeTransitions ?? []) {
1284
- if (!batch.nativeBlocks?.has(block)) continue;
1285
- queueNativeTransition(batch);
1286
- }
1213
+ NATIVE_TRANSITION_DRIVER?.retire(block);
1287
1214
  }
1288
- function prepareNativeTransitionUpdates(batch) {
1289
- for (const update of batch.updates.values()) {
1290
- const { block, slot, state, reducer } = update;
1291
- const owner = block.idState.renderOwner;
1292
- if (block.disposed || owner === void 0 || owner.disposed) continue;
1293
- const frame = beginRootRender(owner);
1294
- NATIVE_TRANSITION_ATTEMPT.transactions.add(owner.transaction);
1295
- try {
1296
- journalObjectOnce(slot);
1297
- if (state !== void 0) {
1298
- state.renderTransition = update;
1299
- state.updates = void 0;
1300
- } else if (reducer !== void 0) {
1301
- reducer.renderTransition = update;
1302
- reducer.renderPhaseActions = void 0;
1303
- } else slot.value = rebaseTransitionActionUpdate(update);
1304
- if (slot.pendingActionBatch === batch) {
1305
- slot.pendingActionBatch = void 0;
1306
- slot.pendingActionValue = void 0;
1307
- }
1308
- } finally {
1309
- endRootRender(frame);
1310
- }
1311
- }
1312
- }
1313
- function prepareNativeTransitionHook(batch, hook) {
1314
- const owner = hook.block.idState.renderOwner;
1315
- if (hook.block.disposed || owner === void 0 || owner.disposed) return;
1316
- const frame = beginRootRender(owner);
1317
- NATIVE_TRANSITION_ATTEMPT.transactions.add(owner.transaction);
1318
- try {
1319
- if (batch.hooksPending && hook.pendingBatches === 1) {
1320
- journalObjectOnce(hook);
1321
- hook.isPending = false;
1322
- }
1323
- } finally {
1324
- endRootRender(frame);
1325
- }
1326
- prepareNativeTransitionBlock(hook.block);
1327
- }
1328
- function flushNativeTransitions() {
1329
- const queue = NATIVE_TRANSITION_QUEUE;
1330
- if (queue === null) return;
1331
- NATIVE_TRANSITION_QUEUE = null;
1332
- for (const batch of queue) {
1333
- const candidate = batch.native;
1334
- if (candidate === void 0) continue;
1335
- batch.nativeWake?.();
1336
- batch.nativeWake = void 0;
1337
- try {
1338
- if (!candidate.validate()) candidate.rebase();
1339
- } catch {
1340
- candidate.discard();
1341
- finishNativeTransition(batch);
1342
- flushTransitionActionBatch(batch);
1343
- continue;
1344
- }
1345
- if (!candidate.hasWrites()) {
1346
- candidate.discard();
1347
- finishNativeTransition(batch);
1348
- flushTransitionActionBatch(batch);
1349
- continue;
1350
- }
1351
- const admission = {
1352
- blocks: /* @__PURE__ */ new Set(),
1353
- transactions: /* @__PURE__ */ new Set(),
1354
- attempts: [],
1355
- presentations: [],
1356
- suspensions: /* @__PURE__ */ new Map()
1357
- };
1358
- NATIVE_TRANSITION_ATTEMPT = admission;
1359
- let outcome;
1360
- try {
1361
- outcome = candidate.prepare([
1362
- () => prepareNativeTransitionUpdates(batch),
1363
- ...batch.hook === null ? [] : [() => prepareNativeTransitionHook(batch, batch.hook)],
1364
- ...(batch.hooks ?? []).map((hook) => () => prepareNativeTransitionHook(batch, hook)),
1365
- ...[...batch.updates.values()].map(
1366
- (update) => () => prepareNativeTransitionBlock(update.block)
1367
- ),
1368
- ...candidate.consumers().filter((consumer) => consumer.active()).map((consumer) => () => {
1369
- const presentation = consumer.prepare();
1370
- if (presentation !== void 0) admission.presentations.push(presentation);
1371
- })
1372
- ]);
1373
- } finally {
1374
- NATIVE_TRANSITION_ATTEMPT = null;
1375
- }
1376
- for (const block of batch.nativeBlocks ?? [])
1377
- block.idState.renderOwner?.nativeTransitions?.delete(batch);
1378
- batch.nativeBlocks = admission.blocks;
1379
- for (const transaction of admission.transactions)
1380
- (transaction.owner.nativeTransitions ??= /* @__PURE__ */ new Set()).add(batch);
1381
- const valid = outcome.status === "ready" && admission.presentations.every((presentation) => presentation.validate()) && [...admission.transactions].every(
1382
- (transaction) => !transaction.aborted && !transaction.owner.disposed && currentPresentations(transaction.capture) && (NATIVE_READ_DRIVER === null || NATIVE_READ_DRIVER.validateCapture(transaction.capture))
1383
- );
1384
- if (valid && outcome.status === "ready" && outcome.receipt.publish(() => {
1385
- for (const transaction of admission.transactions) {
1386
- transaction.nativeAdmitted = true;
1387
- acceptNativeCapture(transaction.capture, transaction.owner, true);
1388
- }
1389
- batch.flushed = true;
1390
- batch.updates.clear();
1391
- finishNativeTransition(batch);
1392
- for (const presentation of admission.presentations) presentation.commit();
1393
- commitRootRenders();
1394
- })) {
1395
- continue;
1396
- }
1397
- for (const transaction of admission.transactions) rollbackRootRender(transaction);
1398
- for (const presentation of admission.presentations) presentation.discard();
1399
- for (let i = admission.attempts.length - 1; i >= 0; i--) {
1400
- const swaps = admission.attempts[i].memoSwaps;
1401
- if (swaps !== null)
1402
- for (let j = swaps.length - 1; j >= 0; j--) applyTransitionMemoSwap(swaps[j], false);
1403
- }
1404
- commitRootRenders();
1405
- if (outcome.status === "pending") {
1406
- for (const state of batch.nativeBoundaries?.keys() ?? []) {
1407
- if (admission.suspensions.has(state)) continue;
1408
- if (state.nativeTransition === batch) state.nativeTransition = void 0;
1409
- if (state.transitionTimeoutId !== null) {
1410
- clearTimeout(state.transitionTimeoutId);
1411
- state.transitionTimeoutId = null;
1412
- }
1413
- }
1414
- for (const [state, thenable] of admission.suspensions) {
1415
- state.nativeTransition = batch;
1416
- if (state.hasResolved && state.branch === 1 && state.pendingBody !== null && TRANSITION_FALLBACK_TIMEOUT_MS !== Infinity && TRANSITION_FALLBACK_TIMEOUT_MS >= 0 && (state.transitionTimeoutId === null || batch.nativeBoundaries?.get(state) !== thenable)) {
1417
- if (state.transitionTimeoutId !== null) clearTimeout(state.transitionTimeoutId);
1418
- state.transitionTimeoutId = setTimeout(() => {
1419
- state.transitionTimeoutId = null;
1420
- if (state.nativeTransition === batch && !state.parentBlock.disposed && state.branch === 1)
1421
- SCHEDULED_VISIBILITY_DRIVER.hidePending(state);
1422
- }, TRANSITION_FALLBACK_TIMEOUT_MS);
1423
- }
1424
- }
1425
- batch.nativeBoundaries = admission.suspensions;
1426
- batch.nativeWake = candidate.watchPreparation(outcome, () => queueNativeTransition(batch));
1427
- } else if (outcome.status === "ready" || outcome.status === "invalid" && outcome.reason === "stale") {
1428
- queueNativeTransition(batch);
1429
- } else {
1430
- candidate.discard();
1431
- finishNativeTransition(batch);
1432
- for (const update of batch.updates.values()) {
1433
- if (update.slot.pendingActionBatch === batch) {
1434
- update.slot.pendingActionBatch = void 0;
1435
- update.slot.pendingActionValue = void 0;
1436
- }
1437
- }
1438
- batch.updates.clear();
1439
- batch.flushed = true;
1440
- if (outcome.status === "error") {
1441
- if (admission.errorBlock !== void 0 && !admission.errorBlock.disposed)
1442
- handleResumeError(admission.errorBlock, outcome.error);
1443
- else reportTransitionError(outcome.error, batch.hook ?? void 0);
1444
- } else if (outcome.status === "invalid")
1445
- reportTransitionError(new TypeError((0, import_error_codes_client_generated.formatClientError)(79)), batch.hook ?? void 0);
1446
- }
1215
+ function scheduleNativeTransitionFlush() {
1216
+ if (!scheduled && !syncFlush) {
1217
+ scheduled = true;
1218
+ queueMicrotask(flush);
1447
1219
  }
1448
1220
  }
1449
1221
  let ACTIVE_TRANSITION_ACTION_BATCH = null;
@@ -1458,7 +1230,49 @@ function nativeCandidateForAction(batch) {
1458
1230
  candidate = void 0;
1459
1231
  }
1460
1232
  }
1461
- return candidate ?? (batch.native = (0, import_transition_state.createSignalActionFrame)?.());
1233
+ candidate ??= batch.native = (0, import_transition_state.createSignalActionFrame)?.();
1234
+ if (candidate !== void 0 && NATIVE_TRANSITION_DRIVER === null) {
1235
+ NATIVE_TRANSITION_DRIVER = (0, import_transition_state.createSignalTransitionCoordinator)({
1236
+ get attempt() {
1237
+ return NATIVE_TRANSITION_ATTEMPT;
1238
+ },
1239
+ set attempt(admission) {
1240
+ NATIVE_TRANSITION_ATTEMPT = admission;
1241
+ },
1242
+ get visibility() {
1243
+ return SCHEDULED_VISIBILITY_DRIVER;
1244
+ },
1245
+ get rollback() {
1246
+ return ROOT_RENDER_ROLLBACK;
1247
+ },
1248
+ get fallbackTimeout() {
1249
+ return TRANSITION_FALLBACK_TIMEOUT_MS;
1250
+ },
1251
+ schedule: scheduleNativeTransitionFlush,
1252
+ beginRoot: beginRootRender,
1253
+ endRoot: endRootRender,
1254
+ beginAttempt: beginTransitionAttempt,
1255
+ endAttempt: endTransitionAttempt,
1256
+ invalidate: invalidateRender,
1257
+ render: renderBlock,
1258
+ journal: journalObjectOnce,
1259
+ journalProperty: journalRootProperty,
1260
+ isSuspense: isSuspenseException,
1261
+ releaseHookHolder: releaseTransitionHookHolder,
1262
+ rebaseUpdate: rebaseTransitionActionUpdate,
1263
+ flushBatch: flushTransitionActionBatch,
1264
+ currentPresentations,
1265
+ validateCapture: (capture) => NATIVE_READ_DRIVER === null || NATIVE_READ_DRIVER.validateCapture(capture),
1266
+ acceptCapture: acceptNativeCapture,
1267
+ commitRoots: commitRootRenders,
1268
+ rollbackRoot: rollbackRootRender,
1269
+ applyMemoSwap: applyTransitionMemoSwap,
1270
+ handleError: handleResumeError,
1271
+ reportError: reportTransitionError,
1272
+ unsupportedError: () => new TypeError((0, import_error_codes_client_generated.formatClientError)(79))
1273
+ });
1274
+ }
1275
+ return candidate;
1462
1276
  }
1463
1277
  function ensureNativeActionResolver() {
1464
1278
  if (nativeActionResolverInstalled) return;
@@ -2108,6 +1922,7 @@ const JOURNAL_RENDER = 5;
2108
1922
  const JOURNAL_UNDO = 6;
2109
1923
  const JOURNAL_RETIRED = 7;
2110
1924
  const JOURNAL_INPUTS = 8;
1925
+ const JOURNAL_EVENT_OWNER = 9;
2111
1926
  let TRANSITION_JOURNAL = null;
2112
1927
  let TRANSITION_JOURNAL_BAGS = null;
2113
1928
  let TRANSITION_JOURNAL_CHECKPOINT = 0;
@@ -2414,6 +2229,13 @@ function rollbackRootRender(transaction) {
2414
2229
  undoCreatedInRootRender(transaction.log[i + 1], transaction.log[i + 2]);
2415
2230
  else if (transaction.log[i] === JOURNAL_RETIRED)
2416
2231
  transaction.log[i + 1].delete(transaction.log[i + 2]);
2232
+ else if (transaction.log[i] === JOURNAL_EVENT_OWNER) {
2233
+ const owners = transaction.log[i + 1];
2234
+ const el = transaction.log[i + 2];
2235
+ const previous = transaction.log[i + 3];
2236
+ if (previous === void 0) owners.delete(el);
2237
+ else owners.set(el, previous);
2238
+ }
2417
2239
  }
2418
2240
  transaction.log.length = 0;
2419
2241
  }
@@ -3039,6 +2861,10 @@ function rollbackTransitionJournal(checkpoint, owner) {
3039
2861
  case JOURNAL_UNDO:
3040
2862
  target();
3041
2863
  break;
2864
+ case JOURNAL_EVENT_OWNER:
2865
+ if (b === void 0) target.delete(a);
2866
+ else target.set(a, b);
2867
+ break;
3042
2868
  default:
3043
2869
  for (const key of Reflect.ownKeys(target)) {
3044
2870
  if (!Object.prototype.hasOwnProperty.call(a, key) && Object.prototype.propertyIsEnumerable.call(target, key))
@@ -4348,7 +4174,7 @@ function drainQueue() {
4348
4174
  for (const activity of activitiesToRehide) SCHEDULED_VISIBILITY_DRIVER.rehide(activity);
4349
4175
  }
4350
4176
  commitRootRenders();
4351
- flushNativeTransitions();
4177
+ NATIVE_TRANSITION_DRIVER?.flush();
4352
4178
  return pendingError;
4353
4179
  }
4354
4180
  function flush() {
@@ -6235,7 +6061,7 @@ function drainPassiveEffects() {
6235
6061
  drainPassivePhase();
6236
6062
  }
6237
6063
  function hasPendingWork() {
6238
- return QUEUE.length > 0 || ROOT_RENDER_TRANSACTIONS.length > 0 || NATIVE_TRANSITION_QUEUE !== null || effectEventQueue.length > 0 || effectEventCommitActions.length > 0 || effectQueues[INSERTION].length > 0 || effectQueues[LAYOUT].length > 0 || effectQueues[PASSIVE].length > 0 || pendingPassiveUnmounts.length > 0 || storeSyncQueue.length > 0 || NATIVE_ADOPTION_RELEASES !== null || hasControlledSyncs();
6064
+ return QUEUE.length > 0 || ROOT_RENDER_TRANSACTIONS.length > 0 || NATIVE_TRANSITION_DRIVER?.hasWork() === true || effectEventQueue.length > 0 || effectEventCommitActions.length > 0 || effectQueues[INSERTION].length > 0 || effectQueues[LAYOUT].length > 0 || effectQueues[PASSIVE].length > 0 || pendingPassiveUnmounts.length > 0 || storeSyncQueue.length > 0 || NATIVE_ADOPTION_RELEASES !== null || hasControlledSyncs();
6239
6065
  }
6240
6066
  function drainEffectEventUpdates() {
6241
6067
  if (effectEventQueue.length === 0) return;
@@ -8584,7 +8410,7 @@ function createContext(defaultValue) {
8584
8410
  ctx.$$kind = CONTEXT_TAG;
8585
8411
  ctx.defaultValue = defaultValue;
8586
8412
  ctx.$$version = 0;
8587
- ctx.Provider = ctx;
8413
+ (0, import_context_identity.registerContext)(ctx);
8588
8414
  if (process.env.NODE_ENV !== "production") {
8589
8415
  let consumerWarned = false;
8590
8416
  Object.defineProperty(ctx, "Consumer", {
@@ -12269,7 +12095,7 @@ function preparePresentationSignalBinding(args, frame, text = false) {
12269
12095
  const value = args[text ? 3 : 4];
12270
12096
  const site = args[text ? 4 : 5];
12271
12097
  const attributeKind = text ? void 0 : args[6] ?? "attr";
12272
- const kind = text ? args[5] ? "textOnlyChild" : "text" : "attribute";
12098
+ const policy = text ? args[5] ? DIRECT_SIGNAL_TEXT_ONLY_POLICY : DIRECT_SIGNAL_TEXT_POLICY : DIRECT_SIGNAL_ATTRIBUTE_POLICY;
12273
12099
  return runWithBlockSignalOwner(scope, () => {
12274
12100
  const handle = isSignalHandle(value) ? value : null;
12275
12101
  const witness = handle !== null && frame.lease.host !== void 0 ? beginNativeReadWitness(true) : -1;
@@ -12294,17 +12120,17 @@ function preparePresentationSignalBinding(args, frame, text = false) {
12294
12120
  frame,
12295
12121
  element,
12296
12122
  name,
12297
- () => writeDirectSignalScalar(element, prepared, "attribute", previous, name, attributeKind)
12123
+ () => writeDirectSignalAttribute(element, prepared, "attribute", previous, name, attributeKind)
12298
12124
  );
12299
12125
  return value;
12300
12126
  }
12301
12127
  const prior = previous;
12302
- const reusable = prior?.[DIRECT_SIGNAL_BINDING] === true && !prior.disposed && prior.unsubscribe === void 0 && prior.handle === handle && prior.target === element && prior.kind === kind && prior.site === site && prior.name === name && prior.attributeKind === attributeKind;
12128
+ const reusable = prior?.[DIRECT_SIGNAL_BINDING] === true && !prior.disposed && prior.unsubscribe === void 0 && prior.handle === handle && prior.target === element && prior.policy === policy && prior.site === site && prior.name === name && prior.attributeKind === attributeKind;
12303
12129
  const binding = reusable ? prior : {
12304
12130
  [DIRECT_SIGNAL_BINDING]: true,
12305
12131
  scope,
12306
12132
  target: element,
12307
- kind,
12133
+ policy,
12308
12134
  site,
12309
12135
  name,
12310
12136
  attributeKind,
@@ -12318,7 +12144,7 @@ function preparePresentationSignalBinding(args, frame, text = false) {
12318
12144
  preparePresentationOperation(frame, element, name ?? "signalText", () => {
12319
12145
  if (binding.disposed) return;
12320
12146
  if (!text)
12321
- writeDirectSignalScalar(element, prepared, "attribute", previous, name, attributeKind);
12147
+ writeDirectSignalAttribute(element, prepared, "attribute", previous, name, attributeKind);
12322
12148
  binding.value = current;
12323
12149
  runWithBlockSignalOwner(scope, () => activateDirectSignalBinding(binding, void 0));
12324
12150
  });
@@ -12338,12 +12164,12 @@ function preparePresentationSignalValue(args, frame) {
12338
12164
  const valid = (retired = false) => owner.bindingContainer.contains(element) && (!retired || frame.lease.valid?.() !== false) && (lease !== void 0 && !retired ? lease.owner === owner && lease.active() && runWithBlockSignalOwner(scope, () => lease.matches(handle)) : !(0, import_control_handoff.hasSignalControlBinding)(element, "value") && !(0, import_early_values.hasHydrationControlSignalWriter)(element, "value"));
12339
12165
  if (!valid()) presentationMiss(false);
12340
12166
  const prior = previous;
12341
- const reusable = prior?.[DIRECT_SIGNAL_BINDING] === true && !prior.disposed && prior.input === void 0 && prior.handle === handle && prior.target === element && prior.kind === "value" && prior.site === site;
12167
+ const reusable = prior?.[DIRECT_SIGNAL_BINDING] === true && !prior.disposed && prior.input === void 0 && prior.handle === handle && prior.target === element && prior.policy === DIRECT_SIGNAL_VALUE_POLICY && prior.site === site;
12342
12168
  const binding = reusable ? prior : {
12343
12169
  [DIRECT_SIGNAL_BINDING]: true,
12344
12170
  scope,
12345
12171
  target: element,
12346
- kind: "value",
12172
+ policy: DIRECT_SIGNAL_VALUE_POLICY,
12347
12173
  site,
12348
12174
  handle,
12349
12175
  value,
@@ -12728,7 +12554,7 @@ function disposeDirectSignalBinding(binding) {
12728
12554
  }
12729
12555
  }
12730
12556
  function directSignalControlValue(binding, snapshot) {
12731
- if (binding.kind === "checked") return snapshot.checked ?? false;
12557
+ if (binding.policy.kind === "checked") return snapshot.checked ?? false;
12732
12558
  return snapshot.selectedValues ?? snapshot.value;
12733
12559
  }
12734
12560
  function validateDirectSignalControl(element, site) {
@@ -12743,77 +12569,116 @@ function validateDirectSignalControl(element, site) {
12743
12569
  }
12744
12570
  function writeDirectSignalBinding(binding, value) {
12745
12571
  if (TRANSITION_JOURNAL !== null) journalObjectOnce(binding);
12746
- if (binding.kind === "text" || binding.kind === "textOnlyChild") {
12747
- if (binding.text === void 0) {
12748
- binding.text = binding.kind === "textOnlyChild" ? htext(binding.target, value) : htextSwap(binding.target, value);
12749
- } else {
12750
- setText(binding.text, value);
12751
- }
12752
- } else if (binding.kind === "attribute") {
12753
- const element = binding.target;
12754
- switch (binding.attributeKind) {
12755
- case "class":
12756
- if (element.namespaceURI === HTML_NS) setClassName(element, value);
12757
- else setClassAttr(element, value);
12758
- break;
12759
- case "booleanAttr":
12760
- setBooleanAttribute(element, binding.name, value);
12761
- break;
12762
- case "ariaAttr":
12763
- setAriaAttribute(element, binding.name, value);
12764
- break;
12765
- case "stringData":
12766
- setStringData(element, binding.name, value);
12767
- break;
12768
- default:
12769
- setAttribute(element, binding.name, value);
12770
- }
12771
- } else if (binding.kind === "value") {
12772
- const element = binding.target;
12773
- const tag = element.localName;
12774
- if (tag === "select") setSelectValue(element, value);
12775
- else setValue(element, value, tag === "textarea" && isWritableSignal(binding.handle));
12572
+ binding.policy.writeBinding(binding, value);
12573
+ binding.value = value;
12574
+ }
12575
+ function writeDirectSignalBoundText(binding, value) {
12576
+ if (binding.text === void 0) {
12577
+ binding.text = binding.policy.kind === "textOnlyChild" ? htext(binding.target, value) : htextSwap(binding.target, value);
12776
12578
  } else {
12777
- setChecked(binding.target, value);
12579
+ setText(binding.text, value);
12778
12580
  }
12779
- binding.value = value;
12780
12581
  }
12781
- function writeDirectSignalScalar(target, value, kind, previous, name, attributeKind) {
12782
- if (kind === "text" || kind === "textOnlyChild") {
12783
- if (previous instanceof Text) {
12784
- setText(previous, value);
12785
- return previous;
12786
- }
12787
- return kind === "textOnlyChild" ? htext(target, value) : htextSwap(target, value);
12582
+ function writeDirectSignalBoundAttribute(binding, value) {
12583
+ writeDirectSignalAttribute(
12584
+ binding.target,
12585
+ value,
12586
+ "attribute",
12587
+ void 0,
12588
+ binding.name,
12589
+ binding.attributeKind
12590
+ );
12591
+ }
12592
+ function writeDirectSignalBoundValue(binding, value) {
12593
+ const element = binding.target;
12594
+ const tag = element.localName;
12595
+ if (tag === "select") setSelectValue(element, value);
12596
+ else setValue(element, value, tag === "textarea" && isWritableSignal(binding.handle));
12597
+ }
12598
+ function writeDirectSignalBoundChecked(binding, value) {
12599
+ setChecked(binding.target, value);
12600
+ }
12601
+ function writeDirectSignalText(target, value, kind, previous) {
12602
+ if (previous instanceof Text) {
12603
+ setText(previous, value);
12604
+ return previous;
12788
12605
  }
12789
- if (kind === "attribute") {
12790
- const element = target;
12791
- switch (attributeKind) {
12792
- case "class":
12793
- if (element.namespaceURI === HTML_NS) setClassName(element, value);
12794
- else setClassAttr(element, value);
12795
- break;
12796
- case "booleanAttr":
12797
- setBooleanAttribute(element, name, value);
12798
- break;
12799
- case "ariaAttr":
12800
- setAriaAttribute(element, name, value);
12801
- break;
12802
- case "stringData":
12803
- setStringData(element, name, value);
12804
- break;
12805
- default:
12806
- setAttribute(element, name, value);
12807
- }
12808
- } else if (kind === "value") {
12809
- const element = target;
12810
- if (element.localName === "select") setSelectValue(element, value);
12811
- else setValue(element, value);
12812
- } else {
12813
- setChecked(target, value);
12606
+ return kind === "textOnlyChild" ? htext(target, value) : htextSwap(target, value);
12607
+ }
12608
+ function writeDirectSignalAttribute(target, value, _kind, _previous, name, attributeKind) {
12609
+ const element = target;
12610
+ switch (attributeKind) {
12611
+ case "class":
12612
+ if (element.namespaceURI === HTML_NS) setClassName(element, value);
12613
+ else setClassAttr(element, value);
12614
+ break;
12615
+ case "booleanAttr":
12616
+ setBooleanAttribute(element, name, value);
12617
+ break;
12618
+ case "ariaAttr":
12619
+ setAriaAttribute(element, name, value);
12620
+ break;
12621
+ case "stringData":
12622
+ setStringData(element, name, value);
12623
+ break;
12624
+ default:
12625
+ setAttribute(element, name, value);
12814
12626
  }
12815
12627
  return value;
12816
12628
  }
12629
+ function writeDirectSignalValue(target, value, _kind, _previous, _name, _attributeKind) {
12630
+ const element = target;
12631
+ if (element.localName === "select") setSelectValue(element, value);
12632
+ else setValue(element, value);
12633
+ return value;
12634
+ }
12635
+ function writeDirectSignalChecked(target, value) {
12636
+ setChecked(target, value);
12637
+ return value;
12638
+ }
12639
+ const DIRECT_SIGNAL_TEXT_POLICY = {
12640
+ kind: "text",
12641
+ writeBinding: writeDirectSignalBoundText,
12642
+ write: writeDirectSignalText
12643
+ };
12644
+ const DIRECT_SIGNAL_TEXT_ONLY_POLICY = {
12645
+ kind: "textOnlyChild",
12646
+ writeBinding: writeDirectSignalBoundText,
12647
+ write: writeDirectSignalText
12648
+ };
12649
+ const DIRECT_SIGNAL_ATTRIBUTE_POLICY = {
12650
+ kind: "attribute",
12651
+ writeBinding: writeDirectSignalBoundAttribute,
12652
+ write: writeDirectSignalAttribute
12653
+ };
12654
+ const DIRECT_SIGNAL_CONTROL_POLICY = {
12655
+ validateNew(scope, target, kind) {
12656
+ if (kind === "value" && scope.block.idState.renderOwner?.controlLeases?.has(target))
12657
+ presentationMiss(false);
12658
+ },
12659
+ snapshot(target, site) {
12660
+ const snapshot = (0, import_event_capture.snapshotHydrationControl)(target);
12661
+ if (snapshot !== null) validateDirectSignalControl(target, site);
12662
+ return snapshot;
12663
+ },
12664
+ activate(binding, revision) {
12665
+ installDirectSignalControl(binding);
12666
+ if (!binding.pendingControl) (0, import_event_capture.consumeHydrationControl)(binding.target, revision);
12667
+ },
12668
+ adopt: queueDirectSignalControlAdoption
12669
+ };
12670
+ const DIRECT_SIGNAL_VALUE_POLICY = {
12671
+ kind: "value",
12672
+ writeBinding: writeDirectSignalBoundValue,
12673
+ write: writeDirectSignalValue,
12674
+ control: DIRECT_SIGNAL_CONTROL_POLICY
12675
+ };
12676
+ const DIRECT_SIGNAL_CHECKED_POLICY = {
12677
+ kind: "checked",
12678
+ writeBinding: writeDirectSignalBoundChecked,
12679
+ write: writeDirectSignalChecked,
12680
+ control: DIRECT_SIGNAL_CONTROL_POLICY
12681
+ };
12817
12682
  function updateDirectSignalBinding(binding) {
12818
12683
  if (binding.disposed || binding.pendingControl || binding.handle === null || binding.scope.block.disposed)
12819
12684
  return;
@@ -12848,7 +12713,7 @@ function installDirectSignalControl(binding) {
12848
12713
  (STAGED_DOM?.view(element) ?? element).addEventListener("input", input);
12849
12714
  binding.controlWriterCleanup = (0, import_early_values.registerHydrationControlSignalWriter)(
12850
12715
  element,
12851
- binding.kind === "checked" ? "checked" : "value",
12716
+ binding.policy.kind === "checked" ? "checked" : "value",
12852
12717
  (value) => (0, import_transition_state.withoutSignalCandidate)(
12853
12718
  () => runWithBlockSignalOwner(binding.scope, () => {
12854
12719
  if (!binding.disposed && !binding.pendingControl && isWritableSignal(binding.handle))
@@ -12884,19 +12749,15 @@ function activateDirectSignalBinding(binding, revision) {
12884
12749
  binding.unsubscribe = binding.handle[import_types.SIGNAL_BINDING_SUBSCRIBE](
12885
12750
  nativeTransitionBindingNotify(binding, () => updateDirectSignalBinding(binding))
12886
12751
  );
12887
- if (revision !== void 0) {
12888
- installDirectSignalControl(binding);
12889
- if (!binding.pendingControl) (0, import_event_capture.consumeHydrationControl)(binding.target, revision);
12890
- }
12752
+ if (revision !== void 0) binding.policy.control.activate(binding, revision);
12891
12753
  }
12892
- function createDirectSignalBinding(scope, target, value, site, kind, name, attributeKind, text) {
12893
- if (kind === "value" && scope.block.idState.renderOwner?.controlLeases?.has(target))
12894
- presentationMiss(false);
12754
+ function createDirectSignalBinding(scope, target, value, site, policy, name, attributeKind, text) {
12755
+ policy.control?.validateNew(scope, target, policy.kind);
12895
12756
  const handle = isSignalHandle(value) ? value : null;
12896
12757
  const binding = {
12897
12758
  [DIRECT_SIGNAL_BINDING]: true,
12898
12759
  scope,
12899
- kind,
12760
+ policy,
12900
12761
  target,
12901
12762
  site,
12902
12763
  name,
@@ -12906,8 +12767,7 @@ function createDirectSignalBinding(scope, target, value, site, kind, name, attri
12906
12767
  disposed: false
12907
12768
  };
12908
12769
  if (text !== void 0) binding.text = text;
12909
- const controlSnapshot = kind === "value" || kind === "checked" ? (0, import_event_capture.snapshotHydrationControl)(target) : null;
12910
- if (controlSnapshot !== null) validateDirectSignalControl(target, site);
12770
+ const controlSnapshot = policy.control?.snapshot(target, site) ?? null;
12911
12771
  binding.pendingControl = activeHydration() !== null && isWritableSignal(handle) && controlSnapshot !== null && controlSnapshot.editRevision > 0;
12912
12772
  const initial = handle === null ? value : readSignalBinding(handle);
12913
12773
  if (!binding.pendingControl) writeDirectSignalBinding(binding, initial);
@@ -12920,18 +12780,19 @@ function createDirectSignalBinding(scope, target, value, site, kind, name, attri
12920
12780
  updateDirectSignalBinding(binding);
12921
12781
  });
12922
12782
  } else activateDirectSignalBinding(binding, controlSnapshot?.revision);
12923
- if (binding.pendingControl) queueDirectSignalControlAdoption(binding);
12783
+ if (binding.pendingControl) policy.control.adopt(binding);
12924
12784
  registerHookCleanup(scope, () => disposeDirectSignalBinding(binding));
12925
12785
  return binding;
12926
12786
  }
12927
- function bindDirectSignal(scope, previous, target, value, site, kind, name, attributeKind) {
12787
+ function bindDirectSignal(scope, previous, target, value, site, policy, name, attributeKind) {
12788
+ const kind = policy.kind;
12928
12789
  const prior = typeof previous === "object" && previous !== null && previous[DIRECT_SIGNAL_BINDING] === true ? previous : null;
12929
12790
  const handle = isSignalHandle(value) ? value : null;
12930
12791
  if (handle !== null && (!import_document_owner.signalDocumentEnabled || (0, import_owner_context.currentSignalOwner)() !== SCOPE_SIGNAL_OWNERS.get(scope))) {
12931
12792
  if (!import_document_owner.signalDocumentEnabled) enableSignalBindings();
12932
12793
  return runWithBlockSignalOwner(
12933
12794
  scope,
12934
- () => bindDirectSignal(scope, previous, target, value, site, kind, name, attributeKind)
12795
+ () => bindDirectSignal(scope, previous, target, value, site, policy, name, attributeKind)
12935
12796
  );
12936
12797
  }
12937
12798
  if (handle === null && prior === null) {
@@ -12941,11 +12802,11 @@ function bindDirectSignal(scope, previous, target, value, site, kind, name, attr
12941
12802
  }
12942
12803
  if (TRANSITION_JOURNAL !== null) journalBag();
12943
12804
  const scalarTarget = (kind === "text" || kind === "textOnlyChild") && previous instanceof Text ? previous : target;
12944
- return writeDirectSignalScalar(scalarTarget, value, kind, previous, name, attributeKind);
12805
+ return policy.write(scalarTarget, value, kind, previous, name, attributeKind);
12945
12806
  }
12946
- if (prior !== null && !prior.disposed && prior.target === target && prior.kind === kind && prior.site === site && prior.name === name && prior.attributeKind === attributeKind && prior.handle === handle) {
12807
+ if (prior !== null && !prior.disposed && prior.target === target && prior.policy === policy && prior.site === site && prior.name === name && prior.attributeKind === attributeKind && prior.handle === handle) {
12947
12808
  if (prior.pendingControl) {
12948
- queueDirectSignalControlAdoption(prior);
12809
+ policy.control.adopt(prior);
12949
12810
  return prior;
12950
12811
  }
12951
12812
  const next = readSignalBinding(handle);
@@ -12955,7 +12816,7 @@ function bindDirectSignal(scope, previous, target, value, site, kind, name, attr
12955
12816
  if (TRANSITION_JOURNAL !== null) journalBag();
12956
12817
  if (handle === null) {
12957
12818
  const scalarTarget = kind === "text" || kind === "textOnlyChild" ? prior?.text ?? prior?.target ?? target : target;
12958
- const token = writeDirectSignalScalar(
12819
+ const token = policy.write(
12959
12820
  scalarTarget,
12960
12821
  value,
12961
12822
  kind,
@@ -12978,7 +12839,7 @@ function bindDirectSignal(scope, previous, target, value, site, kind, name, attr
12978
12839
  signalTarget,
12979
12840
  value,
12980
12841
  site,
12981
- kind,
12842
+ policy,
12982
12843
  name,
12983
12844
  attributeKind,
12984
12845
  kind === "text" || kind === "textOnlyChild" ? prior?.text ?? (previous instanceof Text ? previous : void 0) : void 0
@@ -13012,17 +12873,26 @@ function bindSignalText(scope, previous, position, value, site, onlyChild = fals
13012
12873
  prior?.target ?? (previous instanceof Text ? previous : position),
13013
12874
  value,
13014
12875
  site,
13015
- onlyChild ? "textOnlyChild" : "text"
12876
+ onlyChild ? DIRECT_SIGNAL_TEXT_ONLY_POLICY : DIRECT_SIGNAL_TEXT_POLICY
13016
12877
  );
13017
12878
  }
13018
12879
  function bindSignalAttribute(scope, previous, element, name, value, site, attributeKind = "attr") {
13019
- return bindDirectSignal(scope, previous, element, value, site, "attribute", name, attributeKind);
12880
+ return bindDirectSignal(
12881
+ scope,
12882
+ previous,
12883
+ element,
12884
+ value,
12885
+ site,
12886
+ DIRECT_SIGNAL_ATTRIBUTE_POLICY,
12887
+ name,
12888
+ attributeKind
12889
+ );
13020
12890
  }
13021
12891
  function bindSignalValue(scope, previous, element, value, site) {
13022
- return bindDirectSignal(scope, previous, element, value, site, "value");
12892
+ return bindDirectSignal(scope, previous, element, value, site, DIRECT_SIGNAL_VALUE_POLICY);
13023
12893
  }
13024
12894
  function bindSignalChecked(scope, previous, element, value, site) {
13025
- return bindDirectSignal(scope, previous, element, value, site, "checked");
12895
+ return bindDirectSignal(scope, previous, element, value, site, DIRECT_SIGNAL_CHECKED_POLICY);
13026
12896
  }
13027
12897
  function setAttributeIfChanged(value, previous, el, name) {
13028
12898
  if (previous === value) return previous;
@@ -15299,31 +15169,40 @@ function isUsableEventSlot(slot) {
15299
15169
  const EMPTY_ARGS = [];
15300
15170
  let SIGNAL_EVENT_OWNERS = null;
15301
15171
  function setEventHandler(el, key, handler) {
15302
- if (TRANSITION_JOURNAL !== null) {
15303
- TRANSITION_JOURNAL.push(
15304
- JOURNAL_PROP,
15305
- el,
15306
- key,
15307
- (STAGED_DOM?.view(el) ?? el)[key]
15308
- );
15309
- journalBag();
15172
+ if (key !== void 0) {
15173
+ if (TRANSITION_JOURNAL !== null) {
15174
+ TRANSITION_JOURNAL.push(
15175
+ JOURNAL_PROP,
15176
+ el,
15177
+ key,
15178
+ (STAGED_DOM?.view(el) ?? el)[key]
15179
+ );
15180
+ journalBag();
15181
+ }
15182
+ (STAGED_DOM?.view(el) ?? el)[key] = handler;
15310
15183
  }
15311
- (STAGED_DOM?.view(el) ?? el)[key] = handler;
15312
- if (SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled) {
15313
- const owner = (import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 ? (0, import_owner_context.currentExplicitSignalOwner)() : null) ?? (import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 ? CURRENT_SCOPE === null ? (0, import_owner_context.currentSignalOwner)() : SCOPE_SIGNAL_OWNERS.get(CURRENT_SCOPE) || CURRENT_SCOPE : CURRENT_SCOPE);
15184
+ const explicitOwner = import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 ? (0, import_owner_context.currentExplicitSignalOwner)() : null;
15185
+ if (SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled || explicitOwner !== null || SIGNAL_EVENT_OWNERS !== null) {
15186
+ const owner = explicitOwner ?? (import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 ? CURRENT_SCOPE === null ? (0, import_owner_context.currentSignalOwner)() : SCOPE_SIGNAL_OWNERS.get(CURRENT_SCOPE) || CURRENT_SCOPE : CURRENT_SCOPE);
15314
15187
  if (owner !== null) {
15315
15188
  if ((owner instanceof ScopeImpl || owner instanceof BlockImpl) && SCOPE_SIGNAL_OWNERS.get(owner) === void 0)
15316
15189
  SCOPE_SIGNAL_OWNERS.set(owner, false);
15190
+ const owners = SIGNAL_EVENT_OWNERS ??= /* @__PURE__ */ new WeakMap();
15317
15191
  if (STAGED_COMMIT_CAPTURE !== null)
15318
- DEFERRED_LAYOUT_DRIVER.stageAction(
15319
- () => (SIGNAL_EVENT_OWNERS ??= /* @__PURE__ */ new WeakMap()).set(el, owner)
15320
- );
15321
- else (SIGNAL_EVENT_OWNERS ??= /* @__PURE__ */ new WeakMap()).set(el, owner);
15192
+ DEFERRED_LAYOUT_DRIVER.stageAction(() => owners.set(el, owner));
15193
+ else {
15194
+ if (TRANSITION_JOURNAL !== null) {
15195
+ const previous = owners.get(el);
15196
+ if (previous !== owner)
15197
+ TRANSITION_JOURNAL.push(JOURNAL_EVENT_OWNER, owners, el, previous);
15198
+ }
15199
+ owners.set(el, owner);
15200
+ }
15322
15201
  }
15323
15202
  }
15324
15203
  }
15325
15204
  function evt0(el, key, fn) {
15326
- const d = { fn, args: EMPTY_ARGS, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15205
+ const d = { fn, args: EMPTY_ARGS, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15327
15206
  setEventHandler(el, key, d);
15328
15207
  return d;
15329
15208
  }
@@ -15332,9 +15211,11 @@ function evt0u(d, fn) {
15332
15211
  if (_dispatchDepth !== 0) preserveDispatchedBundle(d);
15333
15212
  if (TRANSITION_JOURNAL !== null) journalObjectOnce(d);
15334
15213
  d.fn = fn;
15214
+ if ((SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled || import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || SIGNAL_EVENT_OWNERS !== null) && (import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || STAGED_COMMIT_CAPTURE !== null || import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 || SIGNAL_EVENT_OWNERS?.get(d.el) !== CURRENT_SCOPE))
15215
+ setEventHandler(d.el);
15335
15216
  }
15336
15217
  function evt1(el, key, fn, a0) {
15337
- const d = { fn, args: 1, a0, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15218
+ const d = { fn, args: 1, a0, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15338
15219
  setEventHandler(el, key, d);
15339
15220
  return d;
15340
15221
  }
@@ -15344,9 +15225,11 @@ function evt1u(d, fn, a0) {
15344
15225
  if (TRANSITION_JOURNAL !== null) journalObjectOnce(d);
15345
15226
  d.fn = fn;
15346
15227
  d.a0 = a0;
15228
+ if ((SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled || import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || SIGNAL_EVENT_OWNERS !== null) && (import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || STAGED_COMMIT_CAPTURE !== null || import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 || SIGNAL_EVENT_OWNERS?.get(d.el) !== CURRENT_SCOPE))
15229
+ setEventHandler(d.el);
15347
15230
  }
15348
15231
  function evt2(el, key, fn, a0, a1) {
15349
- const d = { fn, args: 2, a0, a1, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15232
+ const d = { fn, args: 2, a0, a1, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15350
15233
  setEventHandler(el, key, d);
15351
15234
  return d;
15352
15235
  }
@@ -15357,19 +15240,21 @@ function evt2u(d, fn, a0, a1) {
15357
15240
  d.fn = fn;
15358
15241
  d.a0 = a0;
15359
15242
  d.a1 = a1;
15243
+ if ((SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled || import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || SIGNAL_EVENT_OWNERS !== null) && (import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || STAGED_COMMIT_CAPTURE !== null || import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 || SIGNAL_EVENT_OWNERS?.get(d.el) !== CURRENT_SCOPE))
15244
+ setEventHandler(d.el);
15360
15245
  }
15361
15246
  function evt1e(el, key, fn, a0) {
15362
- const d = { fn, args: -1, a0, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15247
+ const d = { fn, args: -1, a0, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15363
15248
  setEventHandler(el, key, d);
15364
15249
  return d;
15365
15250
  }
15366
15251
  function evt2e(el, key, fn, a0, a1) {
15367
- const d = { fn, args: -2, a0, a1, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15252
+ const d = { fn, args: -2, a0, a1, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15368
15253
  setEventHandler(el, key, d);
15369
15254
  return d;
15370
15255
  }
15371
15256
  function evtN(el, key, fn, args) {
15372
- const d = { fn, args, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15257
+ const d = { fn, args, el, [EVENT_SLOT_KIND]: HANDLER_BUNDLE_KIND };
15373
15258
  setEventHandler(el, key, d);
15374
15259
  return d;
15375
15260
  }
@@ -15379,6 +15264,8 @@ function evtNu(d, fn, args) {
15379
15264
  if (TRANSITION_JOURNAL !== null) journalObjectOnce(d);
15380
15265
  d.fn = fn;
15381
15266
  d.args = args;
15267
+ if ((SIGNAL_BINDINGS_ENABLED || import_document_owner.signalDocumentEnabled || import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || SIGNAL_EVENT_OWNERS !== null) && (import_owner_context.activeSynchronousSignalOwner !== null || import_owner_context.activeSignalOwnerEnvironment !== void 0 || STAGED_COMMIT_CAPTURE !== null || import_document_owner.signalDocumentEnabled || CURRENT_SCOPE?.block.idState.renderOwner?.signalOwner !== void 0 || SIGNAL_EVENT_OWNERS?.get(d.el) !== CURRENT_SCOPE))
15268
+ setEventHandler(d.el);
15382
15269
  }
15383
15270
  const EVENT_BUBBLE = 1;
15384
15271
  const EVENT_CAPTURE = 2;
@@ -15763,6 +15650,7 @@ const CURRENT_TARGET_DESCRIPTOR = {
15763
15650
  };
15764
15651
  const CAPTURE_PATH = [];
15765
15652
  const CAPTURE_SLOTS = [];
15653
+ let CAPTURE_OWNERS = null;
15766
15654
  function snapshotDelegatedSlots(base, type, capture) {
15767
15655
  const key = capture ? type.captureKey : type.bubbleKey;
15768
15656
  const suppressDisabled = (type.flags & EVENT_DISABLED_MOUSE) !== 0 || !capture && (type.flags & EVENT_DISABLED_ENTER) !== 0;
@@ -15770,6 +15658,8 @@ function snapshotDelegatedSlots(base, type, capture) {
15770
15658
  const node = CAPTURE_PATH[index];
15771
15659
  const slot = node[key];
15772
15660
  CAPTURE_SLOTS[index] = slot != null && suppressDisabled && node.disabled && (node.localName === "button" || node.localName === "input" || node.localName === "select" || node.localName === "textarea") ? null : slot;
15661
+ if (SIGNAL_EVENT_OWNERS !== null && CAPTURE_SLOTS[index] != null)
15662
+ (CAPTURE_OWNERS ??= [])[index] = SIGNAL_EVENT_OWNERS.get(node);
15773
15663
  }
15774
15664
  }
15775
15665
  function preserveDispatchedBundle(bundle) {
@@ -15914,7 +15804,7 @@ function buildDelegatedPath(event, listener, path = event.composedPath()) {
15914
15804
  rebaseRootAtStart = true;
15915
15805
  }
15916
15806
  }
15917
- function fireEventSlot(slot, event, currentTarget) {
15807
+ function fireEventSlot(slot, event, recorded) {
15918
15808
  const previousScope = CURRENT_SCOPE;
15919
15809
  const previousBlock = CURRENT_BLOCK;
15920
15810
  CURRENT_SCOPE = null;
@@ -15959,7 +15849,6 @@ function fireEventSlot(slot, event, currentTarget) {
15959
15849
  invokeInvalidEventListener(`${event.type} event`, slot, event);
15960
15850
  };
15961
15851
  try {
15962
- const recorded = SIGNAL_EVENT_OWNERS?.get(currentTarget);
15963
15852
  const owner = recorded instanceof ScopeImpl || recorded instanceof BlockImpl ? scopeSignalOwner(recorded) : recorded;
15964
15853
  if (owner === void 0 || (0, import_owner_context.currentSignalOwner)() === owner) invoke();
15965
15854
  else (0, import_owner_context.runWithSignalOwner)(owner, invoke);
@@ -16063,7 +15952,7 @@ function dispatchDelegated(event) {
16063
15952
  const slot = CAPTURE_SLOTS[i];
16064
15953
  if (slot != null && !(0, import_dom_binding_handoff.consumeBindingEvent)(event, current, false)) {
16065
15954
  setCurrentTarget(event, current, frame);
16066
- fireEventSlot(slot, event, current);
15955
+ fireEventSlot(slot, event, CAPTURE_OWNERS?.[i]);
16067
15956
  if ((frame.flags & 1) !== 0) break;
16068
15957
  }
16069
15958
  if (targetOnly) break;
@@ -16074,6 +15963,7 @@ function dispatchDelegated(event) {
16074
15963
  } finally {
16075
15964
  CAPTURE_PATH.length = pathBase;
16076
15965
  CAPTURE_SLOTS.length = pathBase;
15966
+ if (CAPTURE_OWNERS !== null) CAPTURE_OWNERS.length = pathBase;
16077
15967
  if (propagationStarted) endDelegatedPropagation(event, stop, null);
16078
15968
  if (submitRec !== null) {
16079
15969
  ACTIVE_SUBMIT_DISPATCH = prevSubmitRec;
@@ -16110,7 +16000,7 @@ function dispatchDelegatedCapture(event, path, type = _delegated.get(event.type)
16110
16000
  const slot = CAPTURE_SLOTS[i];
16111
16001
  if (slot != null && !(0, import_dom_binding_handoff.consumeBindingEvent)(event, CAPTURE_PATH[i], true)) {
16112
16002
  setCurrentTarget(event, CAPTURE_PATH[i], frame);
16113
- fireEventSlot(slot, event, CAPTURE_PATH[i]);
16003
+ fireEventSlot(slot, event, CAPTURE_OWNERS?.[i]);
16114
16004
  if ((frame.flags & 1) !== 0) break;
16115
16005
  }
16116
16006
  }
@@ -16118,6 +16008,7 @@ function dispatchDelegatedCapture(event, path, type = _delegated.get(event.type)
16118
16008
  stopped = frame?.flags !== 0 || !wasCancelled && event.cancelBubble;
16119
16009
  CAPTURE_PATH.length = pathBase;
16120
16010
  CAPTURE_SLOTS.length = pathBase;
16011
+ if (CAPTURE_OWNERS !== null) CAPTURE_OWNERS.length = pathBase;
16121
16012
  endDelegatedPropagation(event, stop, immediate);
16122
16013
  clearCurrentTarget(event);
16123
16014
  try {
@@ -27406,6 +27297,18 @@ function __createVoidRoot(container, options) {
27406
27297
  return createRootWithOutputHandler(container, options, null);
27407
27298
  }
27408
27299
  function hydrateRoot(container, bodyOrElement, propsOrOptions, rootOptions) {
27300
+ return hydrateRootWithOutputHandler(
27301
+ container,
27302
+ bodyOrElement,
27303
+ propsOrOptions,
27304
+ rootOptions,
27305
+ renderReturnedValue
27306
+ );
27307
+ }
27308
+ function __hydrateVoidRoot(container, body, props, options) {
27309
+ return hydrateRootWithOutputHandler(container, body, props, options, null);
27310
+ }
27311
+ function hydrateRootWithOutputHandler(container, bodyOrElement, propsOrOptions, rootOptions, outputHandler) {
27409
27312
  assertValidRootContainer(container);
27410
27313
  let body;
27411
27314
  let props;
@@ -27468,7 +27371,7 @@ function hydrateRoot(container, bodyOrElement, propsOrOptions, rootOptions) {
27468
27371
  body,
27469
27372
  props,
27470
27373
  void 0,
27471
- renderReturnedValue
27374
+ outputHandler
27472
27375
  );
27473
27376
  if (typeof __OCTANE_PROFILE_ENABLED__ !== "undefined" && __OCTANE_PROFILE_ENABLED__)
27474
27377
  (0, import_profiling.__profileTrackComponent)(rootBlock, body);
@@ -27507,7 +27410,7 @@ function hydrateRoot(container, bodyOrElement, propsOrOptions, rootOptions) {
27507
27410
  body,
27508
27411
  rootKey,
27509
27412
  idState,
27510
- renderReturnedValue,
27413
+ outputHandler,
27511
27414
  ownerToken,
27512
27415
  rootOptions?.signalOwner ?? (import_document_owner.signalDocumentEnabled ? (0, import_document_owner.documentSignalOwner)(container) : void 0),
27513
27416
  rootOptions
@@ -27534,7 +27437,7 @@ function hydrateRoot(container, bodyOrElement, propsOrOptions, rootOptions) {
27534
27437
  body,
27535
27438
  props,
27536
27439
  void 0,
27537
- renderReturnedValue
27440
+ outputHandler
27538
27441
  );
27539
27442
  rootBlock.idState = idState;
27540
27443
  registerRootErrorHandlers(rootBlock, rootOptions);
@@ -28057,6 +27960,7 @@ function scriptResource(attrs) {
28057
27960
  ViewTransition,
28058
27961
  ViewTransitionPseudoElement,
28059
27962
  __createVoidRoot,
27963
+ __hydrateVoidRoot,
28060
27964
  __useLinkedStateWithGetter,
28061
27965
  __useReducerWithGetter,
28062
27966
  __useStateWithGetter,