@almadar/ui 6.23.0 → 6.25.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.
package/dist/avl/index.js CHANGED
@@ -7,7 +7,7 @@ import ELK from 'elkjs/lib/elk.bundled.js';
7
7
  import { MarkerType, useReactFlow, Handle, Position, getBezierPath, EdgeLabelRenderer, useNodeId, ReactFlowProvider, BaseEdge, useNodesState, useEdgesState, ReactFlow, Controls, Background, BackgroundVariant } from '@xyflow/react';
8
8
  import { useTranslate } from '@almadar/ui/hooks';
9
9
  import { InMemoryPersistence, StateMachineManager, collectDeclaredConfigDefaults, createServerEffectHandlers, EffectExecutor, LIFECYCLE_EVENTS, createContextFromBindings, createTickScheduler, isValidCronExpression, parseDurationString, normalizeCallSiteConfigToValues, interpolateValue } from '@almadar/runtime';
10
- import { FieldTypeSchema, isInlineTrait, isPageReference, buildResolvedTraitConfigs, collectCallsiteCaptureChildren, schemaToIR, getPage, mergeEntityFrame, isCircuitEvent, applyListenPayloadMapping, walkSExpr, isRenderBindingMarker, containsEntityBinding, isSExpr, isEventPayloadValue, RENDER_BINDING_MARKER, getNestedValue, isFileValue } from '@almadar/core';
10
+ import { UI_SLOTS, FieldTypeSchema, isInlineTrait, isPageReference, buildResolvedTraitConfigs, collectCallsiteCaptureChildren, schemaToIR, getPage, mergeEntityFrame, isCircuitEvent, applyListenPayloadMapping, walkSExpr, isRenderBindingMarker, containsEntityBinding, isSExpr, isEventPayloadValue, RENDER_BINDING_MARKER, getNestedValue, isFileValue } from '@almadar/core';
11
11
  import * as LucideIcons2 from 'lucide-react';
12
12
  import { Loader2, X, Code, FileText, WrapText, Check, Copy, Lightbulb, CheckCircle, List, Printer, ChevronRight, ChevronLeft, GitBranch, Pencil, Eye, Plus, ArrowRight, Trash, RotateCcw, Play, Terminal, XCircle, AlertTriangle, Trash2, Link2, ArrowLeft, ZoomOut, ZoomIn, Download, DollarSign, ChevronDown, Menu as Menu$1, Package, Calendar, MoreHorizontal, Image as Image$1, Upload, HelpCircle, PauseCircle, Search, Bold, Italic, Underline, Strikethrough, Heading1, Heading2, Heading3, ListOrdered, Quote, Link as Link$1, Minus, Eraser, TrendingUp, TrendingDown, AlertCircle, Circle, Clock, CheckCircle2, ChevronUp } from 'lucide-react';
13
13
  import { createPortal } from 'react-dom';
@@ -37264,13 +37264,13 @@ var init_MapView = __esm({
37264
37264
  shadowSize: [41, 41]
37265
37265
  });
37266
37266
  L.Marker.prototype.options.icon = defaultIcon;
37267
- const { useEffect: useEffect71, useRef: useRef70, useCallback: useCallback101, useState: useState109 } = React96__default;
37267
+ const { useEffect: useEffect72, useRef: useRef71, useCallback: useCallback102, useState: useState110 } = React96__default;
37268
37268
  const { Typography: Typography2 } = await Promise.resolve().then(() => (init_Typography(), Typography_exports));
37269
37269
  const { useEventBus: useEventBus2 } = await Promise.resolve().then(() => (init_useEventBus(), useEventBus_exports));
37270
37270
  function MapUpdater({ centerLat, centerLng, zoom }) {
37271
37271
  const map = useMap();
37272
- const prevRef = useRef70({ centerLat, centerLng, zoom });
37273
- useEffect71(() => {
37272
+ const prevRef = useRef71({ centerLat, centerLng, zoom });
37273
+ useEffect72(() => {
37274
37274
  const prev = prevRef.current;
37275
37275
  if (prev.centerLat !== centerLat || prev.centerLng !== centerLng || prev.zoom !== zoom) {
37276
37276
  map.setView([centerLat, centerLng], zoom);
@@ -37281,7 +37281,7 @@ var init_MapView = __esm({
37281
37281
  }
37282
37282
  function MapClickHandler({ onMapClick }) {
37283
37283
  const map = useMap();
37284
- useEffect71(() => {
37284
+ useEffect72(() => {
37285
37285
  if (!onMapClick) return;
37286
37286
  const handler = (e) => {
37287
37287
  onMapClick(e.latlng.lat, e.latlng.lng);
@@ -37309,8 +37309,8 @@ var init_MapView = __esm({
37309
37309
  showAttribution = true
37310
37310
  }) {
37311
37311
  const eventBus = useEventBus2();
37312
- const [clickedPosition, setClickedPosition] = useState109(null);
37313
- const handleMapClick = useCallback101((lat, lng) => {
37312
+ const [clickedPosition, setClickedPosition] = useState110(null);
37313
+ const handleMapClick = useCallback102((lat, lng) => {
37314
37314
  if (showClickedPin) {
37315
37315
  setClickedPosition({ lat, lng });
37316
37316
  }
@@ -37319,7 +37319,7 @@ var init_MapView = __esm({
37319
37319
  eventBus.emit(`UI:${mapClickEvent}`, { latitude: lat, longitude: lng });
37320
37320
  }
37321
37321
  }, [onMapClick, mapClickEvent, eventBus, showClickedPin]);
37322
- const handleMarkerClick = useCallback101((marker) => {
37322
+ const handleMarkerClick = useCallback102((marker) => {
37323
37323
  onMarkerClick?.(marker);
37324
37324
  if (markerClickEvent) {
37325
37325
  eventBus.emit(`UI:${markerClickEvent}`, { ...marker });
@@ -51635,7 +51635,7 @@ function getAllEvents(traits2) {
51635
51635
  function EventDispatcherTab({ traits: traits2, schema }) {
51636
51636
  const eventBus = useEventBus();
51637
51637
  const { t } = useTranslate();
51638
- const [log12, setLog] = React96.useState([]);
51638
+ const [log13, setLog] = React96.useState([]);
51639
51639
  const prevStatesRef = React96.useRef(/* @__PURE__ */ new Map());
51640
51640
  React96.useEffect(() => {
51641
51641
  for (const trait of traits2) {
@@ -51699,9 +51699,9 @@ function EventDispatcherTab({ traits: traits2, schema }) {
51699
51699
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-muted-foreground mb-1", children: t("debug.otherEvents") }),
51700
51700
  /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1", children: unavailableEvents.map((event) => /* @__PURE__ */ jsx(Badge, { variant: "default", size: "sm", className: "opacity-50", children: event }, event)) })
51701
51701
  ] }),
51702
- log12.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
51702
+ log13.length > 0 && /* @__PURE__ */ jsxs("div", { children: [
51703
51703
  /* @__PURE__ */ jsx(Typography, { variant: "small", weight: "medium", className: "text-muted-foreground mb-1", children: t("debug.recentTransitions") }),
51704
- /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log12.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
51704
+ /* @__PURE__ */ jsx(Stack, { gap: "xs", children: log13.map((entry, i) => /* @__PURE__ */ jsxs(Typography, { variant: "small", className: "font-mono text-xs", children: [
51705
51705
  /* @__PURE__ */ jsx("span", { className: "text-primary", children: entry.traitName }),
51706
51706
  " ",
51707
51707
  /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: entry.from }),
@@ -58996,7 +58996,25 @@ function convertFnFormLambdasInProps(props) {
58996
58996
 
58997
58997
  // hooks/index.ts
58998
58998
  init_useEventBus();
58999
- var log8 = createLogger("almadar:ui:shared-entity-store");
58999
+ createLogger("almadar:ui:ui-slots");
59000
+ var ALL_SLOTS2 = UI_SLOTS.filter(
59001
+ (slot) => !slot.includes(".") && slot !== "hud" && slot !== "screen"
59002
+ );
59003
+ ALL_SLOTS2.reduce(
59004
+ (acc, slot) => {
59005
+ acc[slot] = null;
59006
+ return acc;
59007
+ },
59008
+ {}
59009
+ );
59010
+ ALL_SLOTS2.reduce(
59011
+ (acc, slot) => {
59012
+ acc[slot] = {};
59013
+ return acc;
59014
+ },
59015
+ {}
59016
+ );
59017
+ var log9 = createLogger("almadar:ui:shared-entity-store");
59000
59018
  var EMPTY_ENTITY_STATE = {};
59001
59019
  function createSharedEntityStore() {
59002
59020
  const states = /* @__PURE__ */ new Map();
@@ -59026,7 +59044,7 @@ function createSharedEntityStore() {
59026
59044
  try {
59027
59045
  callback();
59028
59046
  } catch (error) {
59029
- log8.error("Shared entity subscriber error", {
59047
+ log9.error("Shared entity subscriber error", {
59030
59048
  entityId,
59031
59049
  error: error instanceof Error ? error : String(error)
59032
59050
  });
@@ -59057,7 +59075,7 @@ function runTickFrame(entityId, orderedWriters, store) {
59057
59075
  store.commit(entityId, scratch);
59058
59076
  return scratch;
59059
59077
  }
59060
- var log9 = createLogger("almadar:ui:effects:client-handlers");
59078
+ var log10 = createLogger("almadar:ui:effects:client-handlers");
59061
59079
  function createClientEffectHandlers(options) {
59062
59080
  const { eventBus, slotSetter, navigate, navigateBack, callService, liveEntity, persistDelegated, callServiceDelegated } = options;
59063
59081
  return {
@@ -59066,7 +59084,7 @@ function createClientEffectHandlers(options) {
59066
59084
  eventBus.emit(prefixedEvent, payload, source);
59067
59085
  },
59068
59086
  persist: async () => {
59069
- log9.debug("persist is server-side only, ignored on client");
59087
+ log10.debug("persist is server-side only, ignored on client");
59070
59088
  },
59071
59089
  // Bridge mode: the server runs every persist and the response
59072
59090
  // carries its outcome — tell the executor so the placeholder above is
@@ -59076,7 +59094,7 @@ function createClientEffectHandlers(options) {
59076
59094
  // @almadar/runtime EffectHandlers.set types value:unknown — should be FieldValue (upstream fix queued)
59077
59095
  set: ((_entityId, field, value) => {
59078
59096
  if (!liveEntity) {
59079
- log9.warn("set is server-side only, ignored on client (no live entity)");
59097
+ log10.warn("set is server-side only, ignored on client (no live entity)");
59080
59098
  return;
59081
59099
  }
59082
59100
  liveEntity[field] = value;
@@ -59112,10 +59130,10 @@ function createClientEffectHandlers(options) {
59112
59130
  window.location.href = path;
59113
59131
  return;
59114
59132
  }
59115
- log9.warn("No navigate handler, ignoring", { path });
59133
+ log10.warn("No navigate handler, ignoring", { path });
59116
59134
  }),
59117
59135
  navigateBack: navigateBack ?? (() => {
59118
- log9.warn("No navigate-back handler, ignoring");
59136
+ log10.warn("No navigate-back handler, ignoring");
59119
59137
  })
59120
59138
  };
59121
59139
  }
@@ -59197,6 +59215,13 @@ function effectsCallOp(effects, ops) {
59197
59215
  }
59198
59216
  return false;
59199
59217
  }
59218
+ function diffDroppedTraitNames(prev, next) {
59219
+ const dropped = [];
59220
+ for (const name of prev) {
59221
+ if (!next.has(name)) dropped.push(name);
59222
+ }
59223
+ return dropped;
59224
+ }
59200
59225
  function classifySharedTick(tick) {
59201
59226
  const writes = effectsCallOp(tick.effects, SHARED_ENTITY_WRITE_OPS);
59202
59227
  const renders = effectsCallOp(tick.effects, SHARED_ENTITY_RENDER_OPS);
@@ -59399,6 +59424,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59399
59424
  const uiSlotsRef = useRef(uiSlots);
59400
59425
  const embeddedTraitsRef = useRef(options?.embeddedTraits);
59401
59426
  const optionsRef = useRef(options);
59427
+ const prevActiveTraitNamesRef = useRef(/* @__PURE__ */ new Set());
59402
59428
  useEffect(() => {
59403
59429
  traitBindingsRef.current = traitBindings;
59404
59430
  }, [traitBindings]);
@@ -59527,6 +59553,18 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59527
59553
  };
59528
59554
  }, [traitBindings]);
59529
59555
  useEffect(() => {
59556
+ const nextActiveTraitNames = new Set(
59557
+ traitBindings.map((b) => b.trait.name).filter((n) => !!n)
59558
+ );
59559
+ const dropped = diffDroppedTraitNames(prevActiveTraitNamesRef.current, nextActiveTraitNames);
59560
+ if (dropped.length > 0) {
59561
+ for (const traitName of dropped) {
59562
+ for (const slot of ALL_SLOTS2) {
59563
+ uiSlotsRef.current.clearBySource(slot, traitName);
59564
+ }
59565
+ }
59566
+ }
59567
+ prevActiveTraitNamesRef.current = nextActiveTraitNames;
59530
59568
  const newManager = managerRef.current;
59531
59569
  newManager.resetAll();
59532
59570
  setTraitStates(newManager.getAllStates());
@@ -59574,7 +59612,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59574
59612
  };
59575
59613
  }, [traitBindings]);
59576
59614
  const executeTransitionEffects = useCallback(async (params) => {
59577
- const { binding, previousState, newState, payload, flushEvent, syncOnly, log: log12, callsitePayload } = params;
59615
+ const { binding, previousState, newState, payload, flushEvent, syncOnly, log: log13, callsitePayload } = params;
59578
59616
  const traitName = binding.trait.name;
59579
59617
  const linkedEntity = binding.linkedEntity || "";
59580
59618
  const entityId = payload?.entityId;
@@ -59711,7 +59749,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59711
59749
  if (sharedKey !== void 0) {
59712
59750
  sharedWrites.push({ field, value });
59713
59751
  }
59714
- log12.debug("set:write", {
59752
+ log13.debug("set:write", {
59715
59753
  traitName,
59716
59754
  field,
59717
59755
  value: JSON.stringify(value),
@@ -59783,7 +59821,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59783
59821
  mergeEntityFrame(sharedEntityStore.getSnapshot(sharedKey), sharedWrites)
59784
59822
  );
59785
59823
  }
59786
- log12.debug("effects:executed", () => ({
59824
+ log13.debug("effects:executed", () => ({
59787
59825
  traitName,
59788
59826
  transition: `${previousState}->${newState}`,
59789
59827
  event: flushEvent,
@@ -59792,26 +59830,31 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59792
59830
  entityAfter: JSON.stringify(liveEntity ?? {}),
59793
59831
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
59794
59832
  }));
59795
- for (const [slot, patterns] of pendingSlots) {
59796
- log12.debug("flush:slot", {
59797
- traitName,
59798
- slot,
59799
- patternCount: patterns.length,
59800
- event: flushEvent,
59801
- transition: `${previousState}->${newState}`,
59802
- cleared: patterns.length === 0
59803
- });
59804
- flushSlot(traitName, slot, patterns, {
59805
- event: flushEvent,
59806
- state: previousState,
59807
- entity: binding.linkedEntity
59808
- });
59833
+ const stillActive = traitBindingsRef.current.some((b) => b.trait.name === traitName);
59834
+ if (!stillActive) {
59835
+ log13.debug("flush:skip-stale-navigation", { traitName, event: flushEvent });
59836
+ } else {
59837
+ for (const [slot, patterns] of pendingSlots) {
59838
+ log13.debug("flush:slot", {
59839
+ traitName,
59840
+ slot,
59841
+ patternCount: patterns.length,
59842
+ event: flushEvent,
59843
+ transition: `${previousState}->${newState}`,
59844
+ cleared: patterns.length === 0
59845
+ });
59846
+ flushSlot(traitName, slot, patterns, {
59847
+ event: flushEvent,
59848
+ state: previousState,
59849
+ entity: binding.linkedEntity
59850
+ });
59851
+ }
59809
59852
  }
59810
59853
  if (didWrite && sharedKey === void 0) {
59811
59854
  publishBindingSnapshot(traitName, liveEntity);
59812
59855
  }
59813
59856
  } catch (error) {
59814
- log12.error("effects:error", {
59857
+ log13.error("effects:error", {
59815
59858
  traitName,
59816
59859
  transition: `${previousState}->${newState}`,
59817
59860
  event: flushEvent,
@@ -59821,7 +59864,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59821
59864
  }
59822
59865
  return { emitted: emittedDuringExec, serverEffectResults };
59823
59866
  }, [eventBus, flushSlot, sharedEntityStore, publishBindingSnapshot, orbitalsByTrait, viewer]);
59824
- const reRenderCallsiteCaptureChildren = useCallback(async (traitName, callsitePayload, entityByTrait, log12, visited = /* @__PURE__ */ new Set()) => {
59867
+ const reRenderCallsiteCaptureChildren = useCallback(async (traitName, callsitePayload, entityByTrait, log13, visited = /* @__PURE__ */ new Set()) => {
59825
59868
  const children = callsiteCaptureChildrenByTrait?.get(traitName);
59826
59869
  if (!children || children.size === 0) return;
59827
59870
  const mgr = managerRef.current;
@@ -59835,7 +59878,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59835
59878
  if (lifecycleEvent === void 0) continue;
59836
59879
  const [entry] = mgr.sendEvent(lifecycleEvent, {}, void 0, entityByTrait, void 0, childName);
59837
59880
  if (!entry || !entry.result.executed) continue;
59838
- log12.debug("callsite-capture-child:rerender", {
59881
+ log13.debug("callsite-capture-child:rerender", {
59839
59882
  referrer: traitName,
59840
59883
  child: childName,
59841
59884
  lifecycleEvent,
@@ -59849,10 +59892,10 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59849
59892
  payload: {},
59850
59893
  flushEvent: lifecycleEvent,
59851
59894
  syncOnly: false,
59852
- log: log12,
59895
+ log: log13,
59853
59896
  callsitePayload
59854
59897
  });
59855
- await reRenderCallsiteCaptureChildren(childName, callsitePayload, entityByTrait, log12, visited);
59898
+ await reRenderCallsiteCaptureChildren(childName, callsitePayload, entityByTrait, log13, visited);
59856
59899
  }
59857
59900
  }, [callsiteCaptureChildrenByTrait, executeTransitionEffects]);
59858
59901
  const runTickEffects = useCallback((tick, binding) => {
@@ -61076,7 +61119,7 @@ init_useEventBus();
61076
61119
  // components/avl/hooks/useCanvasDnd.tsx
61077
61120
  init_useEventBus();
61078
61121
  init_useAlmadarDndCollision();
61079
- var log10 = createLogger("almadar:ui:canvas-dnd");
61122
+ var log11 = createLogger("almadar:ui:canvas-dnd");
61080
61123
  function useCanvasDraggable({
61081
61124
  id,
61082
61125
  payload,
@@ -61114,7 +61157,7 @@ function defaultEmit(eventBus, drop) {
61114
61157
  if (payload.kind === "pattern") {
61115
61158
  const patternType = payload.data["type"];
61116
61159
  if (typeof patternType !== "string") {
61117
- log10.warn("default-emit:pattern:missing-type");
61160
+ log11.warn("default-emit:pattern:missing-type");
61118
61161
  return;
61119
61162
  }
61120
61163
  const out = { patternType, containerNode: target.containerNode };
@@ -61123,26 +61166,26 @@ function defaultEmit(eventBus, drop) {
61123
61166
  out.index = resolved.index;
61124
61167
  }
61125
61168
  eventBus.emit("UI:PATTERN_DROP", out);
61126
- log10.info("default-emit:pattern", { patternType, level: target.level });
61169
+ log11.info("default-emit:pattern", { patternType, level: target.level });
61127
61170
  return;
61128
61171
  }
61129
61172
  if (payload.kind === "behavior") {
61130
61173
  const behaviorName = payload.data["name"];
61131
61174
  if (typeof behaviorName !== "string") {
61132
- log10.warn("default-emit:behavior:missing-name");
61175
+ log11.warn("default-emit:behavior:missing-name");
61133
61176
  return;
61134
61177
  }
61135
61178
  eventBus.emit("UI:BEHAVIOR_DROP", {
61136
61179
  behaviorName,
61137
61180
  containerNode: target.containerNode
61138
61181
  });
61139
- log10.info("default-emit:behavior", { behaviorName, level: target.level });
61182
+ log11.info("default-emit:behavior", { behaviorName, level: target.level });
61140
61183
  return;
61141
61184
  }
61142
61185
  if (payload.kind === "pattern-instance") {
61143
61186
  const fromPath = payload.data["fromPath"];
61144
61187
  if (typeof fromPath !== "string") {
61145
- log10.warn("default-emit:pattern-instance:missing-fromPath");
61188
+ log11.warn("default-emit:pattern-instance:missing-fromPath");
61146
61189
  return;
61147
61190
  }
61148
61191
  const out = { fromPath, loc: payload.data["loc"] };
@@ -61151,10 +61194,10 @@ function defaultEmit(eventBus, drop) {
61151
61194
  out.toIndex = resolved.index;
61152
61195
  }
61153
61196
  eventBus.emit("UI:PATTERN_MOVE", out);
61154
- log10.info("default-emit:pattern-instance", { fromPath, level: target.level });
61197
+ log11.info("default-emit:pattern-instance", { fromPath, level: target.level });
61155
61198
  return;
61156
61199
  }
61157
- log10.debug("default-emit:unhandled-kind", { kind: payload.kind });
61200
+ log11.debug("default-emit:unhandled-kind", { kind: payload.kind });
61158
61201
  }
61159
61202
  function CanvasDndProvider({
61160
61203
  children,
@@ -61177,9 +61220,9 @@ function CanvasDndProvider({
61177
61220
  if (payload) {
61178
61221
  setActivePayload(payload);
61179
61222
  eventBus.emit("UI:DRAG_START", { kind: payload.kind, data: payload.data });
61180
- log10.info("dragStart", { id: e.active.id, kind: payload.kind });
61223
+ log11.info("dragStart", { id: e.active.id, kind: payload.kind });
61181
61224
  } else {
61182
- log10.warn("dragStart:missing-payload", { id: e.active.id });
61225
+ log11.warn("dragStart:missing-payload", { id: e.active.id });
61183
61226
  }
61184
61227
  }, [eventBus, trackPointer]);
61185
61228
  const handleDragEnd = React96__default.useCallback((e) => {
@@ -61190,7 +61233,7 @@ function CanvasDndProvider({
61190
61233
  const overData = e.over?.data.current;
61191
61234
  const target = overData?.target;
61192
61235
  const accepts = overData?.accepts;
61193
- log10.info("dragEnd", {
61236
+ log11.info("dragEnd", {
61194
61237
  activeId: e.active.id,
61195
61238
  overId: e.over?.id,
61196
61239
  hasPayload: !!payload,
@@ -61202,12 +61245,12 @@ function CanvasDndProvider({
61202
61245
  }
61203
61246
  if (!payload || !target) return;
61204
61247
  if (accepts && !accepts.includes(payload.kind)) {
61205
- log10.debug("dragEnd:rejected:kind", { kind: payload.kind, accepts: [...accepts] });
61248
+ log11.debug("dragEnd:rejected:kind", { kind: payload.kind, accepts: [...accepts] });
61206
61249
  return;
61207
61250
  }
61208
61251
  const cursor = lastPointerRef.current;
61209
61252
  const resolved = target.resolvePath && cursor ? target.resolvePath(cursor) : null;
61210
- log10.debug("dragEnd:resolve", {
61253
+ log11.debug("dragEnd:resolve", {
61211
61254
  hasResolver: !!target.resolvePath,
61212
61255
  cursorX: cursor?.x,
61213
61256
  cursorY: cursor?.y,
@@ -61221,7 +61264,7 @@ function CanvasDndProvider({
61221
61264
  const handleDragCancel = React96__default.useCallback(() => {
61222
61265
  setActivePayload(null);
61223
61266
  document.removeEventListener("pointermove", trackPointer);
61224
- log10.info("dragCancel");
61267
+ log11.info("dragCancel");
61225
61268
  }, [trackPointer]);
61226
61269
  return /* @__PURE__ */ jsxs(
61227
61270
  DndContext,
@@ -63280,7 +63323,7 @@ init_AvlTransitionLane();
63280
63323
  init_AvlSwimLane();
63281
63324
  init_avl_atom_types();
63282
63325
  init_avl_elk_layout();
63283
- var log11 = createLogger("almadar:ui:avl:trait-scene");
63326
+ var log12 = createLogger("almadar:ui:avl:trait-scene");
63284
63327
  var SWIM_GUTTER2 = 120;
63285
63328
  var CENTER_W2 = 360;
63286
63329
  var AvlTraitScene = ({
@@ -63293,7 +63336,7 @@ var AvlTraitScene = ({
63293
63336
  const dataKey = useMemo(() => JSON.stringify(data), [data]);
63294
63337
  useEffect(() => {
63295
63338
  computeTraitLayout(data).then(setLayout).catch((error) => {
63296
- log11.error("computeTraitLayout failed", { error: error instanceof Error ? error : String(error) });
63339
+ log12.error("computeTraitLayout failed", { error: error instanceof Error ? error : String(error) });
63297
63340
  });
63298
63341
  }, [dataKey]);
63299
63342
  if (!layout) {