@almadar/ui 6.23.0 → 6.24.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,
@@ -59793,7 +59831,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59793
59831
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
59794
59832
  }));
59795
59833
  for (const [slot, patterns] of pendingSlots) {
59796
- log12.debug("flush:slot", {
59834
+ log13.debug("flush:slot", {
59797
59835
  traitName,
59798
59836
  slot,
59799
59837
  patternCount: patterns.length,
@@ -59811,7 +59849,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59811
59849
  publishBindingSnapshot(traitName, liveEntity);
59812
59850
  }
59813
59851
  } catch (error) {
59814
- log12.error("effects:error", {
59852
+ log13.error("effects:error", {
59815
59853
  traitName,
59816
59854
  transition: `${previousState}->${newState}`,
59817
59855
  event: flushEvent,
@@ -59821,7 +59859,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59821
59859
  }
59822
59860
  return { emitted: emittedDuringExec, serverEffectResults };
59823
59861
  }, [eventBus, flushSlot, sharedEntityStore, publishBindingSnapshot, orbitalsByTrait, viewer]);
59824
- const reRenderCallsiteCaptureChildren = useCallback(async (traitName, callsitePayload, entityByTrait, log12, visited = /* @__PURE__ */ new Set()) => {
59862
+ const reRenderCallsiteCaptureChildren = useCallback(async (traitName, callsitePayload, entityByTrait, log13, visited = /* @__PURE__ */ new Set()) => {
59825
59863
  const children = callsiteCaptureChildrenByTrait?.get(traitName);
59826
59864
  if (!children || children.size === 0) return;
59827
59865
  const mgr = managerRef.current;
@@ -59835,7 +59873,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59835
59873
  if (lifecycleEvent === void 0) continue;
59836
59874
  const [entry] = mgr.sendEvent(lifecycleEvent, {}, void 0, entityByTrait, void 0, childName);
59837
59875
  if (!entry || !entry.result.executed) continue;
59838
- log12.debug("callsite-capture-child:rerender", {
59876
+ log13.debug("callsite-capture-child:rerender", {
59839
59877
  referrer: traitName,
59840
59878
  child: childName,
59841
59879
  lifecycleEvent,
@@ -59849,10 +59887,10 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59849
59887
  payload: {},
59850
59888
  flushEvent: lifecycleEvent,
59851
59889
  syncOnly: false,
59852
- log: log12,
59890
+ log: log13,
59853
59891
  callsitePayload
59854
59892
  });
59855
- await reRenderCallsiteCaptureChildren(childName, callsitePayload, entityByTrait, log12, visited);
59893
+ await reRenderCallsiteCaptureChildren(childName, callsitePayload, entityByTrait, log13, visited);
59856
59894
  }
59857
59895
  }, [callsiteCaptureChildrenByTrait, executeTransitionEffects]);
59858
59896
  const runTickEffects = useCallback((tick, binding) => {
@@ -61076,7 +61114,7 @@ init_useEventBus();
61076
61114
  // components/avl/hooks/useCanvasDnd.tsx
61077
61115
  init_useEventBus();
61078
61116
  init_useAlmadarDndCollision();
61079
- var log10 = createLogger("almadar:ui:canvas-dnd");
61117
+ var log11 = createLogger("almadar:ui:canvas-dnd");
61080
61118
  function useCanvasDraggable({
61081
61119
  id,
61082
61120
  payload,
@@ -61114,7 +61152,7 @@ function defaultEmit(eventBus, drop) {
61114
61152
  if (payload.kind === "pattern") {
61115
61153
  const patternType = payload.data["type"];
61116
61154
  if (typeof patternType !== "string") {
61117
- log10.warn("default-emit:pattern:missing-type");
61155
+ log11.warn("default-emit:pattern:missing-type");
61118
61156
  return;
61119
61157
  }
61120
61158
  const out = { patternType, containerNode: target.containerNode };
@@ -61123,26 +61161,26 @@ function defaultEmit(eventBus, drop) {
61123
61161
  out.index = resolved.index;
61124
61162
  }
61125
61163
  eventBus.emit("UI:PATTERN_DROP", out);
61126
- log10.info("default-emit:pattern", { patternType, level: target.level });
61164
+ log11.info("default-emit:pattern", { patternType, level: target.level });
61127
61165
  return;
61128
61166
  }
61129
61167
  if (payload.kind === "behavior") {
61130
61168
  const behaviorName = payload.data["name"];
61131
61169
  if (typeof behaviorName !== "string") {
61132
- log10.warn("default-emit:behavior:missing-name");
61170
+ log11.warn("default-emit:behavior:missing-name");
61133
61171
  return;
61134
61172
  }
61135
61173
  eventBus.emit("UI:BEHAVIOR_DROP", {
61136
61174
  behaviorName,
61137
61175
  containerNode: target.containerNode
61138
61176
  });
61139
- log10.info("default-emit:behavior", { behaviorName, level: target.level });
61177
+ log11.info("default-emit:behavior", { behaviorName, level: target.level });
61140
61178
  return;
61141
61179
  }
61142
61180
  if (payload.kind === "pattern-instance") {
61143
61181
  const fromPath = payload.data["fromPath"];
61144
61182
  if (typeof fromPath !== "string") {
61145
- log10.warn("default-emit:pattern-instance:missing-fromPath");
61183
+ log11.warn("default-emit:pattern-instance:missing-fromPath");
61146
61184
  return;
61147
61185
  }
61148
61186
  const out = { fromPath, loc: payload.data["loc"] };
@@ -61151,10 +61189,10 @@ function defaultEmit(eventBus, drop) {
61151
61189
  out.toIndex = resolved.index;
61152
61190
  }
61153
61191
  eventBus.emit("UI:PATTERN_MOVE", out);
61154
- log10.info("default-emit:pattern-instance", { fromPath, level: target.level });
61192
+ log11.info("default-emit:pattern-instance", { fromPath, level: target.level });
61155
61193
  return;
61156
61194
  }
61157
- log10.debug("default-emit:unhandled-kind", { kind: payload.kind });
61195
+ log11.debug("default-emit:unhandled-kind", { kind: payload.kind });
61158
61196
  }
61159
61197
  function CanvasDndProvider({
61160
61198
  children,
@@ -61177,9 +61215,9 @@ function CanvasDndProvider({
61177
61215
  if (payload) {
61178
61216
  setActivePayload(payload);
61179
61217
  eventBus.emit("UI:DRAG_START", { kind: payload.kind, data: payload.data });
61180
- log10.info("dragStart", { id: e.active.id, kind: payload.kind });
61218
+ log11.info("dragStart", { id: e.active.id, kind: payload.kind });
61181
61219
  } else {
61182
- log10.warn("dragStart:missing-payload", { id: e.active.id });
61220
+ log11.warn("dragStart:missing-payload", { id: e.active.id });
61183
61221
  }
61184
61222
  }, [eventBus, trackPointer]);
61185
61223
  const handleDragEnd = React96__default.useCallback((e) => {
@@ -61190,7 +61228,7 @@ function CanvasDndProvider({
61190
61228
  const overData = e.over?.data.current;
61191
61229
  const target = overData?.target;
61192
61230
  const accepts = overData?.accepts;
61193
- log10.info("dragEnd", {
61231
+ log11.info("dragEnd", {
61194
61232
  activeId: e.active.id,
61195
61233
  overId: e.over?.id,
61196
61234
  hasPayload: !!payload,
@@ -61202,12 +61240,12 @@ function CanvasDndProvider({
61202
61240
  }
61203
61241
  if (!payload || !target) return;
61204
61242
  if (accepts && !accepts.includes(payload.kind)) {
61205
- log10.debug("dragEnd:rejected:kind", { kind: payload.kind, accepts: [...accepts] });
61243
+ log11.debug("dragEnd:rejected:kind", { kind: payload.kind, accepts: [...accepts] });
61206
61244
  return;
61207
61245
  }
61208
61246
  const cursor = lastPointerRef.current;
61209
61247
  const resolved = target.resolvePath && cursor ? target.resolvePath(cursor) : null;
61210
- log10.debug("dragEnd:resolve", {
61248
+ log11.debug("dragEnd:resolve", {
61211
61249
  hasResolver: !!target.resolvePath,
61212
61250
  cursorX: cursor?.x,
61213
61251
  cursorY: cursor?.y,
@@ -61221,7 +61259,7 @@ function CanvasDndProvider({
61221
61259
  const handleDragCancel = React96__default.useCallback(() => {
61222
61260
  setActivePayload(null);
61223
61261
  document.removeEventListener("pointermove", trackPointer);
61224
- log10.info("dragCancel");
61262
+ log11.info("dragCancel");
61225
61263
  }, [trackPointer]);
61226
61264
  return /* @__PURE__ */ jsxs(
61227
61265
  DndContext,
@@ -63280,7 +63318,7 @@ init_AvlTransitionLane();
63280
63318
  init_AvlSwimLane();
63281
63319
  init_avl_atom_types();
63282
63320
  init_avl_elk_layout();
63283
- var log11 = createLogger("almadar:ui:avl:trait-scene");
63321
+ var log12 = createLogger("almadar:ui:avl:trait-scene");
63284
63322
  var SWIM_GUTTER2 = 120;
63285
63323
  var CENTER_W2 = 360;
63286
63324
  var AvlTraitScene = ({
@@ -63293,7 +63331,7 @@ var AvlTraitScene = ({
63293
63331
  const dataKey = useMemo(() => JSON.stringify(data), [data]);
63294
63332
  useEffect(() => {
63295
63333
  computeTraitLayout(data).then(setLayout).catch((error) => {
63296
- log11.error("computeTraitLayout failed", { error: error instanceof Error ? error : String(error) });
63334
+ log12.error("computeTraitLayout failed", { error: error instanceof Error ? error : String(error) });
63297
63335
  });
63298
63336
  }, [dataKey]);
63299
63337
  if (!layout) {