@almadar/ui 6.24.0 → 6.26.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.
@@ -59906,20 +59906,25 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59906
59906
  entityAfter: JSON.stringify(liveEntity ?? {}),
59907
59907
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
59908
59908
  }));
59909
- for (const [slot, patterns] of pendingSlots) {
59910
- log13.debug("flush:slot", {
59911
- traitName,
59912
- slot,
59913
- patternCount: patterns.length,
59914
- event: flushEvent,
59915
- transition: `${previousState}->${newState}`,
59916
- cleared: patterns.length === 0
59917
- });
59918
- flushSlot(traitName, slot, patterns, {
59919
- event: flushEvent,
59920
- state: previousState,
59921
- entity: binding.linkedEntity
59922
- });
59909
+ const stillActive = traitBindingsRef.current.some((b) => b.trait.name === traitName);
59910
+ if (!stillActive) {
59911
+ log13.debug("flush:skip-stale-navigation", { traitName, event: flushEvent });
59912
+ } else {
59913
+ for (const [slot, patterns] of pendingSlots) {
59914
+ log13.debug("flush:slot", {
59915
+ traitName,
59916
+ slot,
59917
+ patternCount: patterns.length,
59918
+ event: flushEvent,
59919
+ transition: `${previousState}->${newState}`,
59920
+ cleared: patterns.length === 0
59921
+ });
59922
+ flushSlot(traitName, slot, patterns, {
59923
+ event: flushEvent,
59924
+ state: previousState,
59925
+ entity: binding.linkedEntity
59926
+ });
59927
+ }
59923
59928
  }
59924
59929
  if (didWrite && sharedKey === void 0) {
59925
59930
  publishBindingSnapshot(traitName, liveEntity);
@@ -60593,6 +60598,10 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60593
60598
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
60594
60599
  [traits2]
60595
60600
  );
60601
+ const activeTraitNamesRef = React96.useRef(activeTraitNames);
60602
+ React96.useEffect(() => {
60603
+ activeTraitNamesRef.current = activeTraitNames;
60604
+ }, [activeTraitNames]);
60596
60605
  const withActiveTraits = React96.useCallback(
60597
60606
  (payload) => {
60598
60607
  if (!serverActiveTraits || serverActiveTraits.size === 0) return payload;
@@ -60617,7 +60626,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60617
60626
  }
60618
60627
  void bridge.sendEvent(name, event, withActiveTraits(payload), void 0, void 0, locallyEmitted, results, entityByTrait).then(({ effects, meta }) => {
60619
60628
  recordServerResponse(name, event, { ...meta, effectResults: effectResultsToTraces(meta.effectResults) });
60620
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
60629
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
60621
60630
  });
60622
60631
  }
60623
60632
  }, [bridge.connected, bridge.sendEvent, orbitalNames, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits]);
@@ -60680,7 +60689,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60680
60689
  effects: effectTraces,
60681
60690
  timestamp: Date.now()
60682
60691
  });
60683
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
60692
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
60684
60693
  }
60685
60694
  })();
60686
60695
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
package/dist/avl/index.js CHANGED
@@ -59830,20 +59830,25 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
59830
59830
  entityAfter: JSON.stringify(liveEntity ?? {}),
59831
59831
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
59832
59832
  }));
59833
- for (const [slot, patterns] of pendingSlots) {
59834
- log13.debug("flush:slot", {
59835
- traitName,
59836
- slot,
59837
- patternCount: patterns.length,
59838
- event: flushEvent,
59839
- transition: `${previousState}->${newState}`,
59840
- cleared: patterns.length === 0
59841
- });
59842
- flushSlot(traitName, slot, patterns, {
59843
- event: flushEvent,
59844
- state: previousState,
59845
- entity: binding.linkedEntity
59846
- });
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
+ }
59847
59852
  }
59848
59853
  if (didWrite && sharedKey === void 0) {
59849
59854
  publishBindingSnapshot(traitName, liveEntity);
@@ -60517,6 +60522,10 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60517
60522
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
60518
60523
  [traits2]
60519
60524
  );
60525
+ const activeTraitNamesRef = useRef(activeTraitNames);
60526
+ useEffect(() => {
60527
+ activeTraitNamesRef.current = activeTraitNames;
60528
+ }, [activeTraitNames]);
60520
60529
  const withActiveTraits = useCallback(
60521
60530
  (payload) => {
60522
60531
  if (!serverActiveTraits || serverActiveTraits.size === 0) return payload;
@@ -60541,7 +60550,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60541
60550
  }
60542
60551
  void bridge.sendEvent(name, event, withActiveTraits(payload), void 0, void 0, locallyEmitted, results, entityByTrait).then(({ effects, meta }) => {
60543
60552
  recordServerResponse(name, event, { ...meta, effectResults: effectResultsToTraces(meta.effectResults) });
60544
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
60553
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
60545
60554
  });
60546
60555
  }
60547
60556
  }, [bridge.connected, bridge.sendEvent, orbitalNames, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits]);
@@ -60604,7 +60613,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
60604
60613
  effects: effectTraces,
60605
60614
  timestamp: Date.now()
60606
60615
  });
60607
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
60616
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
60608
60617
  }
60609
60618
  })();
60610
60619
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
@@ -54030,20 +54030,25 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
54030
54030
  entityAfter: JSON.stringify(liveEntity ?? {}),
54031
54031
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
54032
54032
  }));
54033
- for (const [slot, patterns] of pendingSlots) {
54034
- log12.debug("flush:slot", {
54035
- traitName,
54036
- slot,
54037
- patternCount: patterns.length,
54038
- event: flushEvent,
54039
- transition: `${previousState}->${newState}`,
54040
- cleared: patterns.length === 0
54041
- });
54042
- flushSlot(traitName, slot, patterns, {
54043
- event: flushEvent,
54044
- state: previousState,
54045
- entity: binding.linkedEntity
54046
- });
54033
+ const stillActive = traitBindingsRef.current.some((b) => b.trait.name === traitName);
54034
+ if (!stillActive) {
54035
+ log12.debug("flush:skip-stale-navigation", { traitName, event: flushEvent });
54036
+ } else {
54037
+ for (const [slot, patterns] of pendingSlots) {
54038
+ log12.debug("flush:slot", {
54039
+ traitName,
54040
+ slot,
54041
+ patternCount: patterns.length,
54042
+ event: flushEvent,
54043
+ transition: `${previousState}->${newState}`,
54044
+ cleared: patterns.length === 0
54045
+ });
54046
+ flushSlot(traitName, slot, patterns, {
54047
+ event: flushEvent,
54048
+ state: previousState,
54049
+ entity: binding.linkedEntity
54050
+ });
54051
+ }
54047
54052
  }
54048
54053
  if (didWrite && sharedKey === void 0) {
54049
54054
  publishBindingSnapshot(traitName, liveEntity);
@@ -54820,6 +54825,10 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54820
54825
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
54821
54826
  [traits2]
54822
54827
  );
54828
+ const activeTraitNamesRef = React87.useRef(activeTraitNames);
54829
+ React87.useEffect(() => {
54830
+ activeTraitNamesRef.current = activeTraitNames;
54831
+ }, [activeTraitNames]);
54823
54832
  const withActiveTraits = React87.useCallback(
54824
54833
  (payload) => {
54825
54834
  if (!serverActiveTraits || serverActiveTraits.size === 0) return payload;
@@ -54844,7 +54853,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54844
54853
  }
54845
54854
  void bridge.sendEvent(name, event, withActiveTraits(payload), void 0, void 0, locallyEmitted, results, entityByTrait).then(({ effects, meta }) => {
54846
54855
  recordServerResponse(name, event, { ...meta, effectResults: effectResultsToTraces(meta.effectResults) });
54847
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
54856
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
54848
54857
  });
54849
54858
  }
54850
54859
  }, [bridge.connected, bridge.sendEvent, orbitalNames, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits]);
@@ -54907,7 +54916,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54907
54916
  effects: effectTraces,
54908
54917
  timestamp: Date.now()
54909
54918
  });
54910
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
54919
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
54911
54920
  }
54912
54921
  })();
54913
54922
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
@@ -53956,20 +53956,25 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
53956
53956
  entityAfter: JSON.stringify(liveEntity ?? {}),
53957
53957
  slotsTouched: Array.from(pendingSlots.keys()).join(",")
53958
53958
  }));
53959
- for (const [slot, patterns] of pendingSlots) {
53960
- log12.debug("flush:slot", {
53961
- traitName,
53962
- slot,
53963
- patternCount: patterns.length,
53964
- event: flushEvent,
53965
- transition: `${previousState}->${newState}`,
53966
- cleared: patterns.length === 0
53967
- });
53968
- flushSlot(traitName, slot, patterns, {
53969
- event: flushEvent,
53970
- state: previousState,
53971
- entity: binding.linkedEntity
53972
- });
53959
+ const stillActive = traitBindingsRef.current.some((b) => b.trait.name === traitName);
53960
+ if (!stillActive) {
53961
+ log12.debug("flush:skip-stale-navigation", { traitName, event: flushEvent });
53962
+ } else {
53963
+ for (const [slot, patterns] of pendingSlots) {
53964
+ log12.debug("flush:slot", {
53965
+ traitName,
53966
+ slot,
53967
+ patternCount: patterns.length,
53968
+ event: flushEvent,
53969
+ transition: `${previousState}->${newState}`,
53970
+ cleared: patterns.length === 0
53971
+ });
53972
+ flushSlot(traitName, slot, patterns, {
53973
+ event: flushEvent,
53974
+ state: previousState,
53975
+ entity: binding.linkedEntity
53976
+ });
53977
+ }
53973
53978
  }
53974
53979
  if (didWrite && sharedKey === void 0) {
53975
53980
  publishBindingSnapshot(traitName, liveEntity);
@@ -54746,6 +54751,10 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54746
54751
  () => new Set(traits2.map((b) => b.trait.name).filter((n) => !!n)),
54747
54752
  [traits2]
54748
54753
  );
54754
+ const activeTraitNamesRef = useRef(activeTraitNames);
54755
+ useEffect(() => {
54756
+ activeTraitNamesRef.current = activeTraitNames;
54757
+ }, [activeTraitNames]);
54749
54758
  const withActiveTraits = useCallback(
54750
54759
  (payload) => {
54751
54760
  if (!serverActiveTraits || serverActiveTraits.size === 0) return payload;
@@ -54770,7 +54779,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54770
54779
  }
54771
54780
  void bridge.sendEvent(name, event, withActiveTraits(payload), void 0, void 0, locallyEmitted, results, entityByTrait).then(({ effects, meta }) => {
54772
54781
  recordServerResponse(name, event, { ...meta, effectResults: effectResultsToTraces(meta.effectResults) });
54773
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
54782
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
54774
54783
  });
54775
54784
  }
54776
54785
  }, [bridge.connected, bridge.sendEvent, orbitalNames, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits]);
@@ -54833,7 +54842,7 @@ function TraitInitializer({ traits: traits2, routeParams, orbitalNames, onNaviga
54833
54842
  effects: effectTraces,
54834
54843
  timestamp: Date.now()
54835
54844
  });
54836
- applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNames, onNavigateBack);
54845
+ applyServerEffects(effects, uiSlots, onNavigate, embeddedTraits, activeTraitNamesRef.current, onNavigateBack);
54837
54846
  }
54838
54847
  })();
54839
54848
  }, [bridge.connected, orbitalNames, bridge.sendEvent, uiSlots, onNavigate, onNavigateBack, embeddedTraits, activeTraitNames, withActiveTraits, routeParams]);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "6.24.0",
3
+ "version": "6.26.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [