@weasel-js/routing 1.12.0 → 1.13.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.
@@ -4,7 +4,7 @@ import { RESERVED_ID_PREFIXES, RESERVED_ID_NAMES, isApplePlatform, bindingSpec,
4
4
  export { GESTURE_DESCRIPTORS, LONG_PRESS_MS, RESERVED_ID_NAMES, RESERVED_ID_PREFIXES, ROUTE_FIELD_DEFINITIONS, ROUTE_TERMS, activatesFocusedControl, canonicalModifiers, collapseShiftPairs, describeRoute, describeRouteParts, focusedControlOwnsKey, formatPhaseAtom, formatRoute, getGestureDescriptor, isEditableTarget, isKnownGestureName, matchKey, matchModifiers, matchPhase, matchSpec, matchTarget, parseRoute, routeGestureForSpecKind, specKindForRouteGesture, specificity } from '@weasel-js/gestures';
5
5
  import { activeModeOf, NORMAL, DEFAULT_MODES, capabilitiesAllowed } from '@weasel-js/modes';
6
6
  import { resolveCursor } from '@weasel-js/cursor';
7
- import { prefIsShown, prefIsEnabled, isPrefLeaf, prefAliasTarget, prefLeafAt, prefAliasedLeaf, prefNumberAt, resolvePrefUnit, prefDisplayBounds, prefUnitAccepts, prefValueAtPath } from '@weasel-js/prefs';
7
+ import { isPrefLeaf, prefScopeIn, prefScopeUnder, prefConditionHolds, prefAliasTarget, prefLeafAt, prefAliasedLeaf, prefNumberAt, resolvePrefUnit, prefDisplayBounds, prefUnitAccepts, PREF_SCOPE, prefValueAtPath } from '@weasel-js/prefs';
8
8
  import { endlessAllows } from '@weasel-js/quantity';
9
9
 
10
10
  // src/interactions/actions/actionItems.ts
@@ -510,6 +510,122 @@ function overrideActionBindings(action, overrides) {
510
510
  return { ...action, defaultBinding: kept };
511
511
  }
512
512
 
513
+ // src/interactions/dispatcher/inputFacts.ts
514
+ function modifierStateOf(e) {
515
+ return { alt: e.altKey, ctrl: e.ctrlKey, meta: e.metaKey, shift: e.shiftKey };
516
+ }
517
+ function worldPointOf(event) {
518
+ switch (event.kind) {
519
+ case "pointerdown":
520
+ case "hover":
521
+ case "longpress":
522
+ case "click":
523
+ case "doubleclick":
524
+ case "contextmenu":
525
+ return event.x !== void 0 && event.y !== void 0 ? { x: event.x, y: event.y } : void 0;
526
+ case "carry":
527
+ return { x: event.x, y: event.y };
528
+ default:
529
+ return void 0;
530
+ }
531
+ }
532
+ function carriedBy(event) {
533
+ if (event.kind === "carry") return { items: [], carry: { type: event.type, value: event.value } };
534
+ return event.kind === "drop" || event.kind === "paste" ? { items: event.items } : void 0;
535
+ }
536
+ function immediateParams(event, resolved) {
537
+ switch (event.kind) {
538
+ case "wheel":
539
+ return {
540
+ deltaX: event.deltaX,
541
+ deltaY: event.deltaY,
542
+ clientX: event.clientX,
543
+ clientY: event.clientY,
544
+ affordance: event.affordance,
545
+ ...resolved
546
+ };
547
+ case "pinch":
548
+ return {
549
+ scale: event.scale,
550
+ rotation: event.rotation,
551
+ clientX: event.clientX,
552
+ clientY: event.clientY,
553
+ affordance: event.affordance,
554
+ ...resolved
555
+ };
556
+ case "click":
557
+ case "doubleclick":
558
+ return {
559
+ worldX: event.x,
560
+ worldY: event.y,
561
+ affordance: event.affordance,
562
+ // The press point too: an action that places geometry at the click wants it.
563
+ ...event.kind === "click" ? { pressX: event.pressX, pressY: event.pressY } : {},
564
+ mods: modifierStateOf(event),
565
+ ...resolved
566
+ };
567
+ // Only a `stage: 'press'` pointerdown reaches an immediate invoker: the
568
+ // buffered copy matches `drag` specs, which are ongoing.
569
+ case "contextmenu":
570
+ return {
571
+ worldX: event.x,
572
+ worldY: event.y,
573
+ clientX: event.clientX,
574
+ clientY: event.clientY,
575
+ affordance: event.affordance,
576
+ bodyTarget: event.bodyTarget,
577
+ bodyKind: event.bodyKind,
578
+ mods: modifierStateOf(event),
579
+ ...resolved
580
+ };
581
+ case "pointerdown":
582
+ case "longpress":
583
+ return {
584
+ worldX: event.x,
585
+ worldY: event.y,
586
+ affordance: event.affordance,
587
+ bodyTarget: event.bodyTarget,
588
+ mods: modifierStateOf(event),
589
+ ...resolved
590
+ };
591
+ case "hover":
592
+ return {
593
+ worldX: event.x,
594
+ worldY: event.y,
595
+ clientX: event.clientX,
596
+ clientY: event.clientY,
597
+ affordance: event.affordance,
598
+ bodyTarget: event.bodyTarget,
599
+ mods: modifierStateOf(event),
600
+ held: event.held === true,
601
+ ...resolved
602
+ };
603
+ case "carry":
604
+ return {
605
+ worldX: event.x,
606
+ worldY: event.y,
607
+ clientX: event.clientX,
608
+ clientY: event.clientY,
609
+ carry: { type: event.type, value: event.value },
610
+ affordance: event.affordance,
611
+ bodyTarget: event.bodyTarget,
612
+ bodyKind: event.bodyKind,
613
+ mods: modifierStateOf(event),
614
+ ...resolved
615
+ };
616
+ case "drop":
617
+ case "paste":
618
+ return {
619
+ items: event.items,
620
+ via: event.kind,
621
+ ...event.kind === "drop" && event.x !== void 0 ? { worldX: event.x, worldY: event.y } : {},
622
+ ...resolved
623
+ };
624
+ default:
625
+ return resolved;
626
+ }
627
+ }
628
+
513
629
  // src/interactions/actions/toolOffhand.ts
514
630
  var TOOL_OFFHAND_ID = "tool.offhand";
515
631
  function offhandKeyFor(trigger) {
@@ -1123,122 +1239,6 @@ function createDispatchTrace(limit, dev) {
1123
1239
  };
1124
1240
  }
1125
1241
 
1126
- // src/interactions/dispatcher/inputFacts.ts
1127
- function modifiersOf(e) {
1128
- return { alt: e.altKey, ctrl: e.ctrlKey, meta: e.metaKey, shift: e.shiftKey };
1129
- }
1130
- function worldPointOf(event) {
1131
- switch (event.kind) {
1132
- case "pointerdown":
1133
- case "hover":
1134
- case "longpress":
1135
- case "click":
1136
- case "doubleclick":
1137
- case "contextmenu":
1138
- return event.x !== void 0 && event.y !== void 0 ? { x: event.x, y: event.y } : void 0;
1139
- case "carry":
1140
- return { x: event.x, y: event.y };
1141
- default:
1142
- return void 0;
1143
- }
1144
- }
1145
- function carriedBy(event) {
1146
- if (event.kind === "carry") return { items: [], carry: { type: event.type, value: event.value } };
1147
- return event.kind === "drop" || event.kind === "paste" ? { items: event.items } : void 0;
1148
- }
1149
- function immediateParams(event, resolved) {
1150
- switch (event.kind) {
1151
- case "wheel":
1152
- return {
1153
- deltaX: event.deltaX,
1154
- deltaY: event.deltaY,
1155
- clientX: event.clientX,
1156
- clientY: event.clientY,
1157
- affordance: event.affordance,
1158
- ...resolved
1159
- };
1160
- case "pinch":
1161
- return {
1162
- scale: event.scale,
1163
- rotation: event.rotation,
1164
- clientX: event.clientX,
1165
- clientY: event.clientY,
1166
- affordance: event.affordance,
1167
- ...resolved
1168
- };
1169
- case "click":
1170
- case "doubleclick":
1171
- return {
1172
- worldX: event.x,
1173
- worldY: event.y,
1174
- affordance: event.affordance,
1175
- // The press point too: an action that places geometry at the click wants it.
1176
- ...event.kind === "click" ? { pressX: event.pressX, pressY: event.pressY } : {},
1177
- mods: modifiersOf(event),
1178
- ...resolved
1179
- };
1180
- // Only a `stage: 'press'` pointerdown reaches an immediate invoker: the
1181
- // buffered copy matches `drag` specs, which are ongoing.
1182
- case "contextmenu":
1183
- return {
1184
- worldX: event.x,
1185
- worldY: event.y,
1186
- clientX: event.clientX,
1187
- clientY: event.clientY,
1188
- affordance: event.affordance,
1189
- bodyTarget: event.bodyTarget,
1190
- bodyKind: event.bodyKind,
1191
- mods: modifiersOf(event),
1192
- ...resolved
1193
- };
1194
- case "pointerdown":
1195
- case "longpress":
1196
- return {
1197
- worldX: event.x,
1198
- worldY: event.y,
1199
- affordance: event.affordance,
1200
- bodyTarget: event.bodyTarget,
1201
- mods: modifiersOf(event),
1202
- ...resolved
1203
- };
1204
- case "hover":
1205
- return {
1206
- worldX: event.x,
1207
- worldY: event.y,
1208
- clientX: event.clientX,
1209
- clientY: event.clientY,
1210
- affordance: event.affordance,
1211
- bodyTarget: event.bodyTarget,
1212
- mods: modifiersOf(event),
1213
- held: event.held === true,
1214
- ...resolved
1215
- };
1216
- case "carry":
1217
- return {
1218
- worldX: event.x,
1219
- worldY: event.y,
1220
- clientX: event.clientX,
1221
- clientY: event.clientY,
1222
- carry: { type: event.type, value: event.value },
1223
- affordance: event.affordance,
1224
- bodyTarget: event.bodyTarget,
1225
- bodyKind: event.bodyKind,
1226
- mods: modifiersOf(event),
1227
- ...resolved
1228
- };
1229
- case "drop":
1230
- case "paste":
1231
- return {
1232
- items: event.items,
1233
- via: event.kind,
1234
- ...event.kind === "drop" && event.x !== void 0 ? { worldX: event.x, worldY: event.y } : {},
1235
- ...resolved
1236
- };
1237
- default:
1238
- return resolved;
1239
- }
1240
- }
1241
-
1242
1242
  // src/interactions/dispatcher/ranking.ts
1243
1243
  function liveInView(binding, view) {
1244
1244
  const views = binding.opts?.views;
@@ -1358,7 +1358,7 @@ function buildDispatchRecord(r, walked, event, ctx, predicted, outcome) {
1358
1358
  input: {
1359
1359
  eventKind: event.kind,
1360
1360
  ...eventKey !== void 0 ? { key: eventKey } : {},
1361
- modifiers: modifiersOf(event),
1361
+ modifiers: modifierStateOf(event),
1362
1362
  viewId: view,
1363
1363
  ...world !== void 0 ? { world } : {},
1364
1364
  ...r.ruleCtx !== void 0 ? { mode: r.ruleCtx.mode } : {}
@@ -2930,7 +2930,7 @@ function settingsOf(ctx, it, key, label, off, access) {
2930
2930
  root: settings.schema,
2931
2931
  read: (path, from) => from === "item" ? void 0 : values(path)
2932
2932
  };
2933
- const entries = state ? tidy(groupRows(form, settings.schema, "", false)) : [];
2933
+ const entries = state ? tidy(groupRows(form, settings.schema, "", ROOT)) : [];
2934
2934
  return {
2935
2935
  kind: "submenu",
2936
2936
  key,
@@ -3087,21 +3087,27 @@ function leafRows(ctx, leaf, key, path, off) {
3087
3087
  return [];
3088
3088
  }
3089
3089
  }
3090
- function groupRows(ctx, group, prefix, off) {
3090
+ var ROOT = { node: {}, scope: PREF_SCOPE, above: PREF_SCOPE };
3091
+ function groupRows(ctx, group, prefix, owner) {
3092
+ const { read: read2 } = ctx;
3093
+ const holds = (condition) => read2 === void 0 || prefConditionHolds(condition, read2);
3091
3094
  const out = [];
3092
3095
  for (const [k, node] of Object.entries(group.children)) {
3093
3096
  const path = prefix ? `${prefix}.${k}` : k;
3094
- if (ctx.read && !prefIsShown(node, ctx.read)) continue;
3095
- const disabled = off || ctx.read !== void 0 && !prefIsEnabled(node, ctx.read);
3097
+ const sits = isPrefLeaf(node) ? prefScopeIn(owner, path, holds) : owner.scope;
3098
+ const scope = prefScopeUnder(sits, node, holds);
3099
+ if (!scope.shown) continue;
3100
+ const disabled = !scope.enabled;
3101
+ const inner = { node, scope, above: sits };
3096
3102
  if (isPrefLeaf(node)) {
3097
3103
  out.push(...leafRows(ctx, node, path, path, disabled));
3098
3104
  } else if (node.as !== void 0 && SUBMENU_AS.has(node.as)) {
3099
- const entries = tidy(groupRows(ctx, node, path, disabled));
3105
+ const entries = tidy(groupRows(ctx, node, path, inner));
3100
3106
  if (entries.length) {
3101
3107
  out.push({ kind: "submenu", key: path, label: node.name, ...node.icon ? { icon: node.icon } : {}, ...withAccess(node.access), entries });
3102
3108
  }
3103
3109
  } else {
3104
- out.push(sep(`${path}/<`), ...groupRows(ctx, node, path, disabled), sep(`${path}/>`));
3110
+ out.push(sep(`${path}/<`), ...groupRows(ctx, node, path, inner), sep(`${path}/>`));
3105
3111
  }
3106
3112
  }
3107
3113
  return out;
@@ -3125,7 +3131,7 @@ function resolveSchemaMenu(schema, src, at, params) {
3125
3131
  at,
3126
3132
  params
3127
3133
  };
3128
- return tidy(groupRows(ctx, schema, "", false));
3134
+ return tidy(groupRows(ctx, schema, "", ROOT));
3129
3135
  }
3130
3136
  function resolveMenu(def, src, at, params) {
3131
3137
  return resolveSchemaMenu(def.menu, src, at, params);
@@ -3171,7 +3177,7 @@ function createMenuHost(src) {
3171
3177
  client: req.client,
3172
3178
  world: req.world,
3173
3179
  ...req.under ? { under: req.under } : {},
3174
- ...req.above ? { above: true } : {},
3180
+ ...req.side ? { side: req.side } : {},
3175
3181
  source: req.source ?? "pointer"
3176
3182
  };
3177
3183
  emit();
@@ -3189,6 +3195,6 @@ function createMenuHost(src) {
3189
3195
  };
3190
3196
  }
3191
3197
 
3192
- export { ALWAYS, ActionDisabledReason, COARSE_TARGET_SCALE, DEFAULT_ALLOWED_CAPABILITIES, DEFAULT_DEVICE_PROFILE, DepNode, INGEST_STRING_MIMES, KEYMAP_HOLD, LONG_PRESS_HAPTIC_MS, NEVER, NO_OVERRIDES, PREDICATE_TARGET, ScopeNode, TOOL_OFFHAND_ID, actionBindings, actionCursor, actionItemTitle, actionItems, actionSettingsParams, actionShortcuts, addCarrySurface, admitIngestMime, anyBinding, assembleEntries, bindingId, buildDepsFromRequires, buildRouteRegistry, buildRuleCtx, buildToolOffhandBindings, carryGestureId, clientToCanvas, clientToCanvasRect, createDepRegistry, createDispatchTrace, createDispatcher, createKeymapStack, createLongPressStore, createMenuHost, createTraceRing, depNodeOf, describeKeymap, describeRule, dlog, dwarn, evaluate, evaluateActive, evaluateEnabled, findConflicts, heldKeySpec, historyKey, isDebugEnabled, isTool, itemTypesFromDataTransfer, itemsFromClipboardData, itemsFromDataTransfer, itemsFromFiles, keySpecShortcut, keymapContribution, keymapLeaderBindingId, keymapLeaderId, keymapShortcuts, keysHeld, liveScope, makeToolOffhandAction, matchBest, matchSorted, matchSortedWithBarred, matchesKeyBinding, mergeMenuDefs, multiTouchGestureId, offhandKeyFor, openPointerSession, overriddenBindings, overrideActionBindings, pickMenu, pointerGestureId, pushOwner, readActionSettings, reportRouteConflicts, resolveBindingOverrides, resolveDeviceProfile, resolveMenu, resolveParams, resolveSchemaMenu, roleReader, routesForSpec, ruleCanHoldIn, rulesExclusive, scopeBindings, startCarry, targetConsultsAffordance, tuneAction, tunedParams, validateActionDefaultBinding, validateActionId };
3193
- //# sourceMappingURL=chunk-ARDHI47M.js.map
3194
- //# sourceMappingURL=chunk-ARDHI47M.js.map
3198
+ export { ALWAYS, ActionDisabledReason, COARSE_TARGET_SCALE, DEFAULT_ALLOWED_CAPABILITIES, DEFAULT_DEVICE_PROFILE, DepNode, INGEST_STRING_MIMES, KEYMAP_HOLD, LONG_PRESS_HAPTIC_MS, NEVER, NO_OVERRIDES, PREDICATE_TARGET, ScopeNode, TOOL_OFFHAND_ID, actionBindings, actionCursor, actionItemTitle, actionItems, actionSettingsParams, actionShortcuts, addCarrySurface, admitIngestMime, anyBinding, assembleEntries, bindingId, buildDepsFromRequires, buildRouteRegistry, buildRuleCtx, buildToolOffhandBindings, carryGestureId, clientToCanvas, clientToCanvasRect, createDepRegistry, createDispatchTrace, createDispatcher, createKeymapStack, createLongPressStore, createMenuHost, createTraceRing, depNodeOf, describeKeymap, describeRule, dlog, dwarn, evaluate, evaluateActive, evaluateEnabled, findConflicts, heldKeySpec, historyKey, isDebugEnabled, isTool, itemTypesFromDataTransfer, itemsFromClipboardData, itemsFromDataTransfer, itemsFromFiles, keySpecShortcut, keymapContribution, keymapLeaderBindingId, keymapLeaderId, keymapShortcuts, keysHeld, liveScope, makeToolOffhandAction, matchBest, matchSorted, matchSortedWithBarred, matchesKeyBinding, mergeMenuDefs, modifierStateOf, multiTouchGestureId, offhandKeyFor, openPointerSession, overriddenBindings, overrideActionBindings, pickMenu, pointerGestureId, pushOwner, readActionSettings, reportRouteConflicts, resolveBindingOverrides, resolveDeviceProfile, resolveMenu, resolveParams, resolveSchemaMenu, roleReader, routesForSpec, ruleCanHoldIn, rulesExclusive, scopeBindings, startCarry, targetConsultsAffordance, tuneAction, tunedParams, validateActionDefaultBinding, validateActionId };
3199
+ //# sourceMappingURL=chunk-XVWEZTUX.js.map
3200
+ //# sourceMappingURL=chunk-XVWEZTUX.js.map