@micheeeeel/yinyangapp 3.0.1 → 3.1.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 (110) hide show
  1. package/dist/bundle.css +1 -0
  2. package/dist/bundle.js +1 -2
  3. package/dist/types/adapters/yasuniCauseAdapter.d.ts +1 -1
  4. package/dist/types/adapters/yinYangAdapter.d.ts +7 -0
  5. package/dist/types/animations/AnimationsMngr.d.ts +69 -15
  6. package/dist/types/animations/FrameScheduler.d.ts +99 -0
  7. package/dist/types/animations/rotationMotion.d.ts +43 -0
  8. package/dist/types/api.d.ts +17 -2
  9. package/dist/types/benchmark/runner.d.ts +20 -0
  10. package/dist/types/benchmark/scenarios.d.ts +55 -6
  11. package/dist/types/components/controller/YinYangController.d.ts +104 -14
  12. package/dist/types/components/controller/action-stack/ActionStackController.d.ts +16 -1
  13. package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +4 -0
  14. package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +13 -2
  15. package/dist/types/components/controller/action-stack/ActionStackState.d.ts +8 -5
  16. package/dist/types/components/controller/action-stack/StackFocusController.d.ts +8 -7
  17. package/dist/types/components/controller/action-stack/stackChromePalette.d.ts +20 -0
  18. package/dist/types/components/controller/actions/ActionProjectionService.d.ts +12 -1
  19. package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +74 -32
  20. package/dist/types/components/controller/actions/KeyEventController.d.ts +78 -70
  21. package/dist/types/components/controller/actions/{CoreEventMenuController.d.ts → KeyEventMenuController.d.ts} +28 -33
  22. package/dist/types/components/controller/actions/radialItemMenu.d.ts +43 -5
  23. package/dist/types/components/controller/children/ChildInteractionController.d.ts +4 -0
  24. package/dist/types/components/controller/children/ChildrenBuilder.d.ts +3 -1
  25. package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +3 -1
  26. package/dist/types/components/controller/children/IdleFacettesController.d.ts +151 -0
  27. package/dist/types/components/controller/children/idleTabLayout.d.ts +95 -0
  28. package/dist/types/components/controller/children/idleTabMorph.d.ts +45 -0
  29. package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +14 -0
  30. package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +3 -3
  31. package/dist/types/components/controller/force-field/ForceFieldCanvasPainter.d.ts +99 -0
  32. package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +9 -0
  33. package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +28 -57
  34. package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +4 -1
  35. package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +16 -1
  36. package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +10 -18
  37. package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +2 -2
  38. package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +2 -0
  39. package/dist/types/components/controller/force-field/keyEventPresentation.d.ts +47 -0
  40. package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +4 -0
  41. package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +4 -2
  42. package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +1 -0
  43. package/dist/types/components/controller/force-field/shieldViewModel.d.ts +6 -2
  44. package/dist/types/components/controller/force-field/types.d.ts +2 -1
  45. package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +7 -0
  46. package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +13 -0
  47. package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +16 -0
  48. package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +6 -0
  49. package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +76 -25
  50. package/dist/types/components/controller/odd/OddHighlightEffects.d.ts +2 -0
  51. package/dist/types/components/controller/odd/OddViewManager.d.ts +7 -3
  52. package/dist/types/components/controller/odd/childHighlightStyles.d.ts +45 -3
  53. package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +8 -5
  54. package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +4 -4
  55. package/dist/types/components/controller/state/ControllerSession.d.ts +3 -3
  56. package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +10 -0
  57. package/dist/types/components/controller/state/YinYangControllerState.d.ts +20 -9
  58. package/dist/types/components/controller/types.d.ts +9 -2
  59. package/dist/types/components/controller/utils/actionCatalog.d.ts +1 -1
  60. package/dist/types/components/controller/utils/eventFieldTargets.d.ts +19 -13
  61. package/dist/types/components/controller/utils/keyEventPropagationContext.d.ts +4 -0
  62. package/dist/types/components/controller/utils/keyEventTargetBreakdowns.d.ts +4 -0
  63. package/dist/types/components/controller/utils/svgTransform.d.ts +16 -0
  64. package/dist/types/components/controls/VizControlsPanel.d.ts +3 -1
  65. package/dist/types/components/panel/PanelManager.d.ts +92 -22
  66. package/dist/types/components/search/GlobalSearchController.d.ts +13 -6
  67. package/dist/types/components/view/BorderDrawer.d.ts +40 -14
  68. package/dist/types/components/view/IdleTabGridDrawer.d.ts +15 -0
  69. package/dist/types/components/view/SpikeDrawer.d.ts +18 -0
  70. package/dist/types/components/view/ViewInitializer.d.ts +45 -7
  71. package/dist/types/components/view/YinYangDrawer.d.ts +132 -30
  72. package/dist/types/components/view/borderColorCycle.d.ts +76 -0
  73. package/dist/types/components/workspace/facetWeightRuleSetting.d.ts +10 -0
  74. package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
  75. package/dist/types/config/animationConfig.d.ts +10 -1
  76. package/dist/types/data/adverse-action-planner.d.ts +3 -3
  77. package/dist/types/data/amplifier-engine.d.ts +6 -6
  78. package/dist/types/data/key-event-effects.d.ts +30 -0
  79. package/dist/types/data/key-event-eligibility.d.ts +24 -0
  80. package/dist/types/data/key-event-propagation.d.ts +13 -0
  81. package/dist/types/data/key-event-types.d.ts +48 -0
  82. package/dist/types/data/key-event-validation.d.ts +11 -0
  83. package/dist/types/data/stability-shield.d.ts +14 -0
  84. package/dist/types/data/yasuni_adverse_key_events.d.ts +1 -1
  85. package/dist/types/data/yasuni_cause.d.ts +7 -0
  86. package/dist/types/data/yasuni_key_events.d.ts +4 -60
  87. package/dist/types/interfaces/ICauseModel.d.ts +10 -1
  88. package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -2
  89. package/dist/types/interfaces/IPropagationGraph.d.ts +14 -0
  90. package/dist/types/interfaces/IViewData.d.ts +10 -0
  91. package/dist/types/interfaces/IYinYangController.d.ts +25 -7
  92. package/dist/types/interfaces/IYinYangInternalModel.d.ts +5 -0
  93. package/dist/types/main.d.ts +0 -1
  94. package/dist/types/utils/actionIconFit.d.ts +23 -0
  95. package/dist/types/utils/actionPropagation.d.ts +6 -4
  96. package/dist/types/utils/causeMetrics.d.ts +29 -11
  97. package/dist/types/utils/chainCardHeight.d.ts +87 -4
  98. package/dist/types/utils/collapseAnimation.d.ts +39 -0
  99. package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +28 -5
  100. package/dist/types/utils/deltaChips.d.ts +0 -4
  101. package/dist/types/utils/exportControls.d.ts +8 -0
  102. package/dist/types/utils/facetWeightLabel.d.ts +6 -4
  103. package/dist/types/utils/facetteImages.d.ts +6 -0
  104. package/dist/types/utils/glowHalo.d.ts +74 -0
  105. package/dist/types/utils/hierBadge.d.ts +1 -1
  106. package/dist/types/utils/keyEventImages.d.ts +1 -1
  107. package/dist/types/utils/menuIconSize.d.ts +17 -0
  108. package/dist/types/utils/spreadAngles.d.ts +8 -0
  109. package/package.json +4 -1
  110. package/dist/bundle.js.LICENSE.txt +0 -1
@@ -75,6 +75,8 @@ export declare class ActionStackController {
75
75
  * ActionStackState.addItem, sans muter la pile. null hors zone de dépôt.
76
76
  */
77
77
  getPriorIdsIfInsertedAtPreview(anchorItemId: string, insertedActionId: string): string[] | null;
78
+ /** Projection d'une insertion externe, sans mutation de la pile ni de l'historique. */
79
+ getItemsIfInsertedAtPreview(inserted: ActionStackItem): ActionStackItem[] | null;
78
80
  /** Fin du glisser (dépôt ou abandon). Les barres restent affichées ; un
79
81
  * dépôt consomme le guide, un abandon le garde pour un nouvel essai. */
80
82
  endPrereqDragGuide(dropped: boolean): void;
@@ -100,6 +102,15 @@ export declare class ActionStackController {
100
102
  */
101
103
  private _hitboxEmphasisStyle;
102
104
  private _applyHitboxEmphasisStyles;
105
+ /** Couleur du libellé d'un item — éclairci pour l'item en focus. */
106
+ private _stackLabelFill;
107
+ /**
108
+ * Marques propres à l'item en focus, indépendantes du cadre : liseré plein
109
+ * à sa couleur sur le bord gauche (pendant du border-left du bloc
110
+ * .ff-block--focused dans le panneau) et libellé éclairci en gras. Elles
111
+ * restent visibles quand le survol lié prend la main sur le cadre.
112
+ */
113
+ private _applyFocusMarks;
103
114
  /**
104
115
  * Affiche temporairement le highlight combo (cercles de fenêtre) pendant ~1.8 s.
105
116
  * Sans effet si un highlight permanent est déjà actif.
@@ -142,7 +153,7 @@ export declare class ActionStackController {
142
153
  * ActionStackState.addItemAtSlot. Même remise à zéro de l'aperçu de
143
154
  * glisser qu'addItem, pour la même raison (rendu synchrone dans
144
155
  * state.addItemAtSlot). */
145
- addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem;
156
+ addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem | null;
146
157
  syncActiveAction(sourceChildKey: string | null, actionId: string | null): void;
147
158
  setExternalDragActive(active: boolean): void;
148
159
  clearDropPreview(): void;
@@ -195,5 +206,9 @@ export declare class ActionStackController {
195
206
  copyRangeToClipboard(): void;
196
207
  /** Pastes the clipboard at the top of the currently active stack. */
197
208
  pasteClipboard(): void;
209
+ /** Fin de vie : observer déconnecté, minuterie du flash et écouteur
210
+ * clavier retirés. */
211
+ destroy(): void;
212
+ private keydownHandler;
198
213
  private ensureKeyboardListeners;
199
214
  }
@@ -83,6 +83,10 @@ export declare class ActionStackDragHandler {
83
83
  compactLength: number;
84
84
  }): void;
85
85
  clearDropPreview(): void;
86
+ /** Zone de dépôt relue à l'instant : un glisser venu du diagramme ou de
87
+ * RECHERCHE bascule en mode STACK, dont le panneau entre alors en glissant
88
+ * depuis la gauche — la géométrie du dernier rendu serait périmée. */
89
+ private liveDropZone;
86
90
  updateDropPreview(clientX: number, clientY: number, _localY: number): boolean;
87
91
  isDropZoneHit(clientX: number, clientY: number): boolean;
88
92
  getInsertionPreviewIndex(): number | null;
@@ -41,7 +41,7 @@ type ActionStackManagerDeps = {
41
41
  prepareForComponentSwitch: (targetComponentId: string) => void;
42
42
  animateChildrenHide: () => void;
43
43
  recomputeIncomingForceFieldForItems: (items: ActionStackItem[], sourceComponentId: string, currentComponentId: string) => boolean;
44
- buildProjectionActionsFromStackItems: (items: ActionStackItem[]) => SequentialActionProjectionInput[];
44
+ buildProjectionActionsFromStackItems: (items: ActionStackItem[], eventContextItems?: ActionStackItem[]) => SequentialActionProjectionInput[];
45
45
  buildForceFieldSourceIndicesFromStackItems: (items: ActionStackItem[]) => number[];
46
46
  clearProjectedActionState: (options?: {
47
47
  deselect?: boolean;
@@ -119,7 +119,18 @@ export declare class ActionStackManager {
119
119
  * ODD, métadonnées de son cutting. Null si le satellite est inconnu. */
120
120
  private buildActionStackItem;
121
121
  activateActionFromChild(childController: IYinYangController, actionId?: string, label?: string, clearStack?: boolean): void;
122
- applyProjectedGhostFromStackItems(items: ActionStackItem[]): void;
122
+ private panelsRefreshFrameId;
123
+ /** Rend, à la frame suivante, les panneaux dépendants de l'action active :
124
+ * détails du ghost, deltas des satellites, puis le menu radial en dernier
125
+ * (il rebranche ses closures de clic sur l'activeActionId posé par
126
+ * l'activation, voir refreshChildActionMenu). Plusieurs activations dans la
127
+ * même frame se fondent en un seul rendu. Si l'action n'est plus active à
128
+ * l'échéance (désactivée, ou remplacée), le flux qui l'a remplacée a rendu
129
+ * son propre état : rien à faire. */
130
+ /** Fin de vie : annule le rendu différé des panneaux. */
131
+ destroy(): void;
132
+ private schedulePanelsRefresh;
133
+ applyProjectedGhostFromStackItems(items: ActionStackItem[], eventContextItems?: ActionStackItem[]): void;
123
134
  onStackItemVisibilityToggle(activeItems: ActionStackItem[]): void;
124
135
  private updateProjectedGhostTensions;
125
136
  private applyEmptyGhostProjectionState;
@@ -2,8 +2,7 @@ export type ActionStackItem = {
2
2
  id: string;
3
3
  /**
4
4
  * Nature de l'item — "action" (par défaut) pour une action satellite
5
- * classique, "keyEvent" pour un Événement Clé joué depuis le cercle
6
- * central d'une facette. Un keyEvent n'a pas de satellite cible (les
5
+ * classique, "keyEvent" pour un Événement Clé joué depuis le satellite-facette. Un keyEvent n'a pas de satellite cible (les
7
6
  * champs source* ci-dessous sont des sentinels dans ce cas) ni de delta
8
7
  * propre (effectiveDelta reste 0) — son seul effet est d'amplifier les
9
8
  * actions listées dans sa définition, si elles sont jouées après lui
@@ -31,6 +30,7 @@ export type ActionStackItem = {
31
30
  comboResults?: import("../../../data/combo-engine").ComboResult[];
32
31
  /** Index du slot occupé dans la pile (0 = en bas, croissant vers le haut). */
33
32
  slotIndex: number;
33
+ unrecognized?: boolean;
34
34
  };
35
35
  /** Champs persistants d'un item copié — sans id/validatedAt/slotIndex, qui sont
36
36
  * réattribués à l'insertion (dans la même pile ou une autre, via un bookmark). */
@@ -61,6 +61,7 @@ export type ActionStackSnapshot = StackState & {
61
61
  export declare class ActionStackState {
62
62
  private readonly onActiveItemsChange;
63
63
  private readonly onClear?;
64
+ private readonly isKnownItem?;
64
65
  readonly ACTION_STACK_MAX_ITEMS = 30;
65
66
  readonly HISTORY_LIMIT = 120;
66
67
  readonly CONFIG_BOOKMARKS_MAX = 4;
@@ -76,7 +77,7 @@ export declare class ActionStackState {
76
77
  stackClipboard: StackClipboardEntry[] | null;
77
78
  configBookmarks: ConfigBookmark[];
78
79
  activeBookmarkIndex: number;
79
- constructor(onActiveItemsChange: (activeItems: ActionStackItem[]) => void, onClear?: (() => void) | undefined);
80
+ constructor(onActiveItemsChange: (activeItems: ActionStackItem[]) => void, onClear?: (() => void) | undefined, isKnownItem?: ((item: ActionStackItem) => boolean) | undefined);
80
81
  canUndo(): boolean;
81
82
  canRedo(): boolean;
82
83
  getItemById(id: string): ActionStackItem | undefined;
@@ -106,7 +107,7 @@ export declare class ActionStackState {
106
107
  * @param compactLength Current number of visible slots (from render context).
107
108
  * Null when called without a specific insertion index.
108
109
  */
109
- addItem(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, insertAtVisibleIndex: number | null, compactLength: number | null): ActionStackItem;
110
+ addItem(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, insertAtVisibleIndex: number | null, compactLength: number | null): ActionStackItem | null;
110
111
  /**
111
112
  * Insère à un slot ABSOLU (0 = bas de pile), en décalant d'un cran tout
112
113
  * item situé à ce slot ou au-dessus — inconditionnellement, même si le
@@ -115,8 +116,10 @@ export declare class ActionStackState {
115
116
  * insertion. addItem, lui, n'a pas cette garantie (il ne décale qu'en
116
117
  * présence d'un occupant, et raisonne en index visible).
117
118
  */
118
- addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem;
119
+ addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem | null;
119
120
  private pushItemAtSlot;
121
+ /** Unicité par carte sur toute la STAC, y compris les items décochés. */
122
+ private hasKeyEvent;
120
123
  removeItem(itemId: string): void;
121
124
  clearAll(): void;
122
125
  deselectAllItems(): void;
@@ -45,9 +45,11 @@ export declare class StackFocusController {
45
45
  setStackItemEmphasisPreview(stackItemId: string | null): void;
46
46
  /**
47
47
  * Point d'accroche unique de la mise en valeur du satellite source de
48
- * l'action portant l'emphase (aperçu ?? focus). Réutilise pour l'instant
49
- * le glow de highlightOddByStackItemId (ou le segment de bordure si la
50
- * source est dans une autre facette) — l'anneau animé viendra ici.
48
+ * l'action portant l'emphase (aperçu ?? focus) : pour l'action en focus,
49
+ * la même mise en lumière que le satellite sélectionné en RECHERCHE
50
+ * (anneaux de visée, pings, onde de scan) ; pour un simple aperçu au
51
+ * survol, le glow doux. Segment de bordure si la source est dans une
52
+ * autre facette.
51
53
  * `clearIfNone` : sans emphase, efface la mise en valeur (sorties de
52
54
  * survol, défocus) ; false pour les simples re-applications (satellites
53
55
  * recréés, fin d'un survol de satellite) afin de ne pas écraser d'autres
@@ -89,10 +91,9 @@ export declare class StackFocusController {
89
91
  sourceIndex: number;
90
92
  } | null;
91
93
  /**
92
- * Point de départ « bulle » du champ de force de l'action en focus : la
93
- * bulle de son action dans le menu radial si le satellite source est celui
94
- * sélectionné, sinon la bulle détachée posée sur la source. null si
95
- * aucune bulle n'est visible (le champ démarre alors au satellite).
94
+ * Point de départ « bulle » du champ de force de l'action en focus : sa
95
+ * bulle détachée, posée sur le satellite source. null si aucune bulle
96
+ * n'est visible (le champ démarre alors au satellite).
96
97
  */
97
98
  resolveFocusBubbleStub(): {
98
99
  sourceChildIndex: number;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Habillage ambre de la pile (mode STACK) — pendant SVG des variables
3
+ * --stack-* de layout.css. Ne couvre que le décor (bordures, en-tête,
4
+ * boutons, frise temporelle) : les couleurs porteuses d'état (configurations
5
+ * A/B/C/D, placeholder de dépôt, phases, items actifs) restent les leurs.
6
+ */
7
+ export declare const STACK_CHROME: {
8
+ readonly line: "#3a2f1e";
9
+ readonly headerText: "#e8c07a";
10
+ readonly buttonStroke: "#6a5028";
11
+ readonly buttonIcon: "#e8c07a";
12
+ readonly ghostSlotDots: "rgba(130, 98, 48, 0.55)";
13
+ readonly ghostSlotNumber: "rgba(120, 90, 45, 0.50)";
14
+ readonly timelineBandFill: "rgba(232, 168, 64, 0.06)";
15
+ readonly timelineBandStroke: "rgba(232, 168, 64, 0.18)";
16
+ readonly timelineAxis: "rgba(232, 168, 64, 0.50)";
17
+ readonly timelineArrow: "rgba(232, 168, 64, 0.65)";
18
+ readonly timelineTickOccupied: "rgba(240, 195, 110, 0.75)";
19
+ readonly timelineTick: "rgba(232, 168, 64, 0.40)";
20
+ };
@@ -1,5 +1,7 @@
1
+ import type { KeyEventPropagationContext } from "../../../data/key-event-propagation";
1
2
  import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
2
3
  import { type PropagatedActionEdge, type PropagationTruncation } from "../../../utils/actionPropagation";
4
+ import { type StabilityProtection, type ProtectedSign, type DirectionalShield } from "../../../data/stability-shield";
3
5
  import { ForceFieldLink } from "../force-field/types";
4
6
  export type ProjectedCuttingState = {
5
7
  cuttingId: number;
@@ -15,6 +17,7 @@ export type GhostProjectionResult = {
15
17
  projectedGhostCuttingStatesByOddId: Map<string, ProjectedCuttingState[]>;
16
18
  };
17
19
  export type SequentialActionProjectionInput = {
20
+ eventPropagation?: KeyEventPropagationContext;
18
21
  sourceOddId: string;
19
22
  sourceCuttingIndex: number;
20
23
  /** Bouclier de stabilité (points d'état) que cette action crée sur son
@@ -23,6 +26,7 @@ export type SequentialActionProjectionInput = {
23
26
  * résolutions suivantes de la séquence, jamais consommé ; le plus fort
24
27
  * remplace le précédent sur un même satellite. */
25
28
  shield?: number;
29
+ protectedSign?: ProtectedSign;
26
30
  };
27
31
  export type EmptyGhostProjectionState = {
28
32
  projectedGhostTensionByOddId: null;
@@ -45,6 +49,7 @@ export type ShieldAbsorption = {
45
49
  shield: number;
46
50
  aggregated: number;
47
51
  applied: number;
52
+ protectedSign?: ProtectedSign;
48
53
  };
49
54
  /**
50
55
  * Bouclier de stabilité sur UNE résolution : pour chaque satellite protégé,
@@ -53,11 +58,16 @@ export type ShieldAbsorption = {
53
58
  * total une seule fois — jamais chaque contribution séparément, jamais
54
59
  * au-delà de 0. Mute `projectedStates` et rend les réductions appliquées.
55
60
  */
56
- export declare function applyStabilityShieldsToResolution(startStates: Record<string, Record<number, number>>, projectedStates: Record<string, Record<number, number>>, activeShields: Map<string, Map<number, number>>): ShieldAbsorption[];
61
+ export type SignedResolutionContributions = Record<string, Record<number, {
62
+ positive: number;
63
+ negative: number;
64
+ }>>;
65
+ export declare function applyStabilityShieldsToResolution(startStates: Record<string, Record<number, number>>, projectedStates: Record<string, Record<number, number>>, activeShields: Map<string, Map<number, StabilityProtection>>, contributions?: SignedResolutionContributions): ShieldAbsorption[];
57
66
  export type ActionSequenceStepInfo = {
58
67
  actionIndex: number;
59
68
  action: SequentialActionProjectionInput;
60
69
  effectiveDelta: number;
70
+ createdProtection?: DirectionalShield;
61
71
  /** Boucliers ayant réduit une contribution négative de cette étape — vide
62
72
  * si aucun satellite protégé n'a été touché négativement. */
63
73
  shieldAbsorptions: ShieldAbsorption[];
@@ -97,6 +107,7 @@ export declare function projectGhostStateForComponent(params: {
97
107
  sourceOddId: string | undefined;
98
108
  sourceCuttingIndex: number;
99
109
  actionDelta: number;
110
+ eventPropagation?: KeyEventPropagationContext;
100
111
  }): GhostProjectionResult | null;
101
112
  /** Tension projetée de la facette : même règle que sa tension courante
102
113
  * (`facetTensionFromOdds`, moyenne pondérée sur tous ses satellites), sur
@@ -3,16 +3,31 @@ import { IYinYangView } from "../../../interfaces/IYinYangView";
3
3
  import { type ActionDefinition } from "../../../data/yasuni_actions";
4
4
  import { ChildrenOrbitEntry } from "../utils/childrenOrbit";
5
5
  import { type Point } from "./radialItemMenu";
6
+ /** Mise en scène d'une bulle détachée : "focus" = l'action regardée (style
7
+ * ambre, faisceau pulsé) ; "plain" = pleine, style ordinaire (aucune action
8
+ * en focus) ; "dimmed" = translucide (une autre action est en focus). */
9
+ export type DetachedBubbleEmphasis = "focus" | "plain" | "dimmed";
10
+ export type DetachedBubble = {
11
+ /** Identité stable de la bulle (id de l'item de pile, par exemple) : une
12
+ * bulle qui ne change que d'emphase est restylée, pas rejouée. */
13
+ key: string;
14
+ /** Satellite source porteur de la bulle. */
15
+ sourceChildKey: string;
16
+ action: ActionDefinition;
17
+ /** Actions du menu RECHERCHE de la source dans le mode de l'action : la
18
+ * bulle reprend sa place (son angle) dans cet éventail, pour apparaître
19
+ * exactement où l'utilisateur l'a trouvée. */
20
+ menuActions: ActionDefinition[];
21
+ emphasis: DetachedBubbleEmphasis;
22
+ };
6
23
  type DetachedBubbleContext = {
7
24
  orbitData: ChildrenOrbitEntry[];
8
- /** Satellite source porteur de la bulle — null = aucune bulle détachée. */
9
- sourceChildKey: string | null;
10
- action: ActionDefinition | null;
25
+ /** Bulles à afficher — [] les replie toutes. */
26
+ bubbles: DetachedBubble[];
11
27
  childActionMenuItemDistance: number;
12
28
  childActionMenuItemScale: number;
13
29
  childActionIconFontScale: number;
14
- /** Clic sur la bulle : typiquement, sélectionner le satellite source. */
15
- onClick: (sourceChildKey: string, actionId: string) => void;
30
+ onClick: (bubble: DetachedBubble) => void;
16
31
  };
17
32
  type ChildActionMenuContext = {
18
33
  orbitData: ChildrenOrbitEntry[];
@@ -23,10 +38,10 @@ type ChildActionMenuContext = {
23
38
  childActionIconFontScale: number;
24
39
  /** Actions filtrées pour le cutting actif (depuis yasuniCause + actionMap). */
25
40
  actionsForActiveChild: ActionDefinition[];
26
- /** Mode STACK : la seule bulle déployée est celle de l'item en focus, et
27
- * son clic vaut clic sur le libellé de cet item dans la pile (ni aperçu,
28
- * ni glisser). null hors STACK. */
29
- onStackBubbleClick: (() => void) | null;
41
+ /** RECHERCHE multi-blocs : un panneau verrouillé fige l'action source.
42
+ * Les autres bulles s'estompent, et tout clic passe par ce refus, qui
43
+ * peut rejouer le clic (`retry`) une fois déverrouillé. null sinon. */
44
+ onBlockedActionClick: ((retry: () => void) => void) | null;
30
45
  };
31
46
  export declare class ChildActionMenuController {
32
47
  private readonly view;
@@ -34,6 +49,9 @@ export declare class ChildActionMenuController {
34
49
  private readonly refreshActionStackVisual;
35
50
  /** Aperçu — clic sur une action : affiche sa carte, ne joue rien. */
36
51
  private readonly activateActionFromChild;
52
+ /** Re-clic sur l'action déjà active : la désélectionne et replie ses
53
+ * champs de force, comme un re-clic dans la hiérarchie RECHERCHE. */
54
+ private readonly deactivateActionFromChild;
37
55
  /** Validation — dépôt d'une bulle glissée sur la pile : l'y ajoute. */
38
56
  private readonly validateActionSelection;
39
57
  /** Glisser une bulle vers une position précise de la pile — cœur partagé
@@ -46,7 +64,7 @@ export declare class ChildActionMenuController {
46
64
  /** Groupe séparé pour les traits satellite → bulle, repositionné à chaque
47
65
  * update() juste devant children-group (voir ensureLineLayer) pour
48
66
  * qu'ils s'affichent derrière les satellites plutôt que par-dessus —
49
- * même technique que CoreEventMenuController.coreEventLineLayer. */
67
+ * même technique que KeyEventMenuController.coreEventLineLayer. */
50
68
  private childActionLineLayer;
51
69
  private lastChildActionMenuSourceCenter;
52
70
  /** Poignée d'annulation du glisser-déposer en cours (voir startActionDrag),
@@ -59,21 +77,28 @@ export declare class ChildActionMenuController {
59
77
  * le contexte courant) et rejoué au survol : rallumer une impulsion ne
60
78
  * doit pas relancer la chorégraphie d'ouverture. */
61
79
  private linkStyleGetter;
62
- /** Positions du dernier update() — exposées au champ de force (le segment
63
- * « bulle → source » démarre au centre de la bulle de l'action en focus). */
64
- private lastPositions;
80
+ /** Réglages de la dernière passe de rendu, pour retailler les icônes
81
+ * affichées quand une mesure abaisse le facteur admissible. */
82
+ private iconScaleSetting;
83
+ private iconActiveActionId;
65
84
  private detachedGroup;
66
85
  private detachedLineLayer;
67
- private lastDetachedCenter;
68
- private lastDetachedPosition;
69
- /** Centre (coordonnées du globalGroup) de la bulle `actionId` du menu radial
70
- * ouvert, ou null si elle n'y est pas. */
71
- getItemCenter(actionId: string): Point | null;
72
- /** Centre de la bulle détachée si elle porte `actionId`, sinon null. */
73
- getDetachedCenter(actionId: string): Point | null;
86
+ /** Bulles détachées affichées, par uniqueKey de position — relu pour faire
87
+ * rentrer une bulle sortante dans SON satellite source. */
88
+ private detachedMeta;
89
+ private detachedPositions;
90
+ /** Dernière mise en page rendue, relue par followOrbit. null : rien à
91
+ * suivre (menu fermé, ou bulles détachées repliées). */
92
+ private menuLayout;
93
+ private detachedContext;
94
+ /** Centre de la bulle détachée de clé `bubbleKey`, ou null si absente. */
95
+ getDetachedCenter(bubbleKey: string): Point | null;
74
96
  constructor(view: IYinYangView, getChildRenderedCenter: (childController: IYinYangController) => Point | null, refreshActionStackVisual: () => void,
75
97
  /** Aperçu — clic sur une action : affiche sa carte, ne joue rien. */
76
98
  activateActionFromChild: (childController: IYinYangController, actionId: string, label?: string) => void,
99
+ /** Re-clic sur l'action déjà active : la désélectionne et replie ses
100
+ * champs de force, comme un re-clic dans la hiérarchie RECHERCHE. */
101
+ deactivateActionFromChild: (childController: IYinYangController, actionId: string) => void,
77
102
  /** Validation — dépôt d'une bulle glissée sur la pile : l'y ajoute. */
78
103
  validateActionSelection: (childController: IYinYangController, actionId: string, label: string, insertAtVisibleIndex?: number | null, entryOrigin?: Point) => void,
79
104
  /** Glisser une bulle vers une position précise de la pile — cœur partagé
@@ -87,8 +112,8 @@ export declare class ChildActionMenuController {
87
112
  setOnActionHover(cb: (actionId: string | null, activeChildKey: string) => void): void;
88
113
  /**
89
114
  * Applique un highlight de survol sur le cercle d'action identifié, ou le retire si null.
90
- * Le highlight est posé sur le <g> wrapper (pas sur le <circle>) pour éviter le conflit
91
- * avec le filtre inline déjà présent sur le cercle.
115
+ * Halo blanc à la place de la lueur de la bulle (voir setRadialItemHaloHighlight) :
116
+ * pas de filtre, la bulle suit l'orbite de son satellite.
92
117
  */
93
118
  highlightActionById(actionId: string | null): void;
94
119
  /** Restyle les seuls liens (impulsion allumée/éteinte), sans toucher à leur
@@ -96,8 +121,8 @@ export declare class ChildActionMenuController {
96
121
  private setHoveredAction;
97
122
  retractAndDispose(): void;
98
123
  clearImmediately(): void;
99
- /** Retire la bulle détachée et son faisceau, tout de suite (0) ou après un
100
- * délai (fin d'une transition de facette). */
124
+ /** Retire les bulles détachées et leurs faisceaux, tout de suite (0) ou
125
+ * après un délai (fin d'une transition de facette). */
101
126
  private disposeDetached;
102
127
  /**
103
128
  * Starts the fold-out animation on the visible action buttons, then removes
@@ -106,19 +131,36 @@ export declare class ChildActionMenuController {
106
131
  * that follows is a no-op and won't cancel the in-flight transition.
107
132
  */
108
133
  animateClose(): void;
109
- /** Replie la bulle détachée (chorégraphie de fermeture), groupes conservés. */
134
+ /** Replie les bulles détachées (chorégraphie de fermeture), groupes
135
+ * conservés. */
110
136
  private closeDetached;
111
137
  /**
112
- * Bulle détachée de l'action en focus : quand un bloc de propagation est
113
- * en focus, le satellite sélectionné n'est pas la source et son menu ne
114
- * montre donc pas la bulle de l'action. On pose alors, sur le satellite
115
- * source, la seule bulle de cette action (pas ses sœurs), en style
116
- * « regardée », avec son faisceau — le champ de force peut ainsi toujours
117
- * démarrer à la bulle. Un clic sélectionne le satellite source (le menu
118
- * complet prend alors le relais et la bulle détachée se replie).
138
+ * Bulles détachées : la seule bulle d'une action (pas ses sœurs), posée sur
139
+ * son satellite source avec son faisceau, hors de tout menu radial.
140
+ * - STACK : une par action activée de la pile — celle en focus en style
141
+ * « regardée », les autres translucides comme leurs champs de force,
142
+ * toutes pleines sans focus. Le champ de l'action en focus démarre à sa
143
+ * bulle.
144
+ * - RECHERCHE multi-blocs : celle de l'action source du panneau
145
+ * verrouillé, quand on consulte un autre satellite.
146
+ * Chaque bulle garde la place qu'elle occupe dans le menu RECHERCHE de
147
+ * sa source (voir DetachedBubble.menuActions) : deux actions d'un même
148
+ * satellite ne s'y chevauchent donc pas.
119
149
  * Cluster indépendant du menu radial : update() n'en sait rien.
120
150
  */
121
151
  updateDetached(context: DetachedBubbleContext): void;
152
+ /**
153
+ * Frame d'orbite : recale le menu radial et les bulles détachées déjà
154
+ * affichés sur la position courante de leur satellite, avec la mise en
155
+ * page de leur dernier rendu. Ni data join, ni transition, ni listeners :
156
+ * leur contenu ne change que par update() / updateDetached().
157
+ */
158
+ followOrbit(orbitData: ChildrenOrbitEntry[]): void;
159
+ private computeDetachedLayout;
160
+ /** Retaille les icônes déjà affichées (menu et bulle détachée) sans
161
+ * repasser par update() : un simple satellite sélectionné, sans action
162
+ * active, ne déclencherait pas de rendu via le réglage du debug. */
163
+ private refitActionIcons;
122
164
  private ensureDetachedGroups;
123
165
  update(context: ChildActionMenuContext): void;
124
166
  private ensureChildActionMenuGroup;