@micheeeeel/yinyangapp 3.0.0 → 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 +3 -0
  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 +16 -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 +53 -13
  71. package/dist/types/components/view/YinYangDrawer.d.ts +139 -40
  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 +12 -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 +50 -0
  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 +13 -0
  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
@@ -9,6 +9,7 @@ type GhostState = {
9
9
  projectedGhostComponentTension: number | null;
10
10
  projectedGhostCuttingStatesByOddId: Map<string, ProjectedCuttingState[]> | null;
11
11
  };
12
+ export type IdleView = "arcs" | "facettes" | "tab";
12
13
  export declare class YinYangControllerState {
13
14
  children: {
14
15
  enabled: boolean;
@@ -20,6 +21,15 @@ export declare class YinYangControllerState {
20
21
  orbitSpeed: number;
21
22
  orbitRadiusScale: number;
22
23
  };
24
+ /** Sous-état d'Idle (children.enabled === false) : « arcs » montre les
25
+ * arcs pondérés des facettes autour de l'illustration, « facettes »
26
+ * remplace ces arcs par un satellite par facette (son yin/yang), « tab »
27
+ * range ces mêmes satellites dans une grille régulière autour d'une
28
+ * illustration réduite, pour comparer leurs poids. Mémorisé
29
+ * quand une Facette s'ouvre : la refermer ramène au même sous-état. */
30
+ idle: {
31
+ view: IdleView;
32
+ };
23
33
  menu: {
24
34
  hasActiveChildAction: boolean;
25
35
  activeChildKey: string | null;
@@ -34,17 +44,17 @@ export declare class YinYangControllerState {
34
44
  iconFontScale: number;
35
45
  /** Ajustement fin (px) de la distance des boutons d'Événement Clé,
36
46
  * de part et d'autre de la longueur auto-calculée (voir
37
- * CoreEventMenuController — offsetDistance dérivé de l'orbite des
47
+ * KeyEventMenuController — offsetDistance dérivé de l'orbite des
38
48
  * satellites, pas de contrôle dédié à cette base). */
39
- coreEventMenuDistanceOffset: number;
49
+ keyEventMenuDistanceOffset: number;
40
50
  /** Taille des boutons du menu radial des Événements Clés — contrôle dédié
41
51
  * ("Taille boutons", groupe "Événements clés"), séparé de itemScale qui
42
52
  * ne pilote que les boutons d'action des satellites. */
43
- coreEventMenuItemScale: number;
53
+ keyEventMenuItemScale: number;
44
54
  /** Taille des icônes dans les bulles du menu radial des Événements Clés —
45
55
  * contrôle dédié ("Taille icônes", groupe "Événements clés"), séparé de
46
56
  * iconFontScale qui ne pilote que les icônes d'action des satellites. */
47
- coreEventIconFontScale: number;
57
+ keyEventIconFontScale: number;
48
58
  };
49
59
  action: {
50
60
  delta: number;
@@ -99,8 +109,8 @@ export declare class YinYangControllerState {
99
109
  orbitData: ChildrenOrbitEntry[] | null;
100
110
  revealStartedAt: number | undefined;
101
111
  selectedLinkIndex: number | null;
102
- /** Item de pile en focus — persistant, posé par le clic sur l'en-tête
103
- * d'un bloc du panneau de description. Survit à la navigation entre
112
+ /** Item de pile en focus — persistant, posé par le clic sur son libellé
113
+ * dans la pile. Survit à la navigation entre
104
114
  * satellites et facettes ; effacé quand l'item quitte la pile active. */
105
115
  focusedStackItemId: string | null;
106
116
  /** Aperçu temporaire (survol d'un bloc du panneau ou d'un item de la
@@ -120,6 +130,7 @@ export declare class YinYangControllerState {
120
130
  blockingAnimations: BlockingAnimationTracker;
121
131
  setActiveChildKey(childKey: string | null): void;
122
132
  setChildrenEnabled(isEnabled: boolean): void;
133
+ setIdleView(view: IdleView): void;
123
134
  setChildrenPendingRefresh(isPending: boolean): void;
124
135
  setOrbitEnabled(isEnabled: boolean): void;
125
136
  setOrbitSpeed(speed: number): void;
@@ -167,9 +178,9 @@ export declare class YinYangControllerState {
167
178
  setMenuItemDistance(distance: number): void;
168
179
  setMenuItemScale(scale: number): void;
169
180
  setMenuIconFontScale(scale: number): void;
170
- setCoreEventMenuDistanceOffset(offset: number): void;
171
- setCoreEventMenuItemScale(scale: number): void;
172
- setCoreEventIconFontScale(scale: number): void;
181
+ setKeyEventMenuDistanceOffset(offset: number): void;
182
+ setKeyEventMenuItemScale(scale: number): void;
183
+ setKeyEventIconFontScale(scale: number): void;
173
184
  setChildLabelMaxLines(lines: number): void;
174
185
  setOddLabelMaxLines(lines: number): void;
175
186
  setLabelShortMaxChars(chars: number): void;
@@ -1,6 +1,8 @@
1
+ import type { KeyEventActionEffects } from "../../data/key-event-effects";
2
+ import type { EventTargetBreakdown } from "./force-field/keyEventPresentation";
1
3
  import type { ForceFieldLinkDetail } from "./force-field/types";
2
4
  import type { ComboResult } from "../../data/combo-engine";
3
- import type { AmplifierResult, AmplifierTargetBreakdown } from "../../data/amplifier-engine";
5
+ import type { AmplifierResult } from "../../data/amplifier-engine";
4
6
  import type { AbsorptionBreakdown, ActiveShield } from "./force-field/shieldViewModel";
5
7
  /**
6
8
  * Bloc "action" de la vue cumulative (mode STACK) : "source" = action jouée
@@ -27,6 +29,7 @@ export type ActionCumulativeBlock = {
27
29
  detailRows: ForceFieldLinkDetail[];
28
30
  comboResults?: ComboResult[];
29
31
  amplifierResults?: AmplifierResult[];
32
+ eventEffects?: KeyEventActionEffects;
30
33
  stackItemId?: string;
31
34
  color?: string;
32
35
  /** This item's own propagation edges from the real sequential
@@ -51,6 +54,10 @@ export type ActionCumulativeBlock = {
51
54
  /** Réduction appliquée par le bouclier du satellite en focus à la
52
55
  * contribution négative de ce bloc — journal de résolution. */
53
56
  shieldAbsorption?: AbsorptionBreakdown;
57
+ directionalAbsorptions?: Array<{
58
+ active?: ActiveShield;
59
+ breakdown: AbsorptionBreakdown;
60
+ }>;
54
61
  };
55
62
  /**
56
63
  * Bloc "keyEvent" de la vue cumulative : un Événement Clé joué (kind="keyEvent"
@@ -72,7 +79,7 @@ export type KeyEventCumulativeBlock = {
72
79
  id: string;
73
80
  name: string;
74
81
  }>;
75
- breakdowns?: AmplifierTargetBreakdown[];
82
+ breakdowns?: EventTargetBreakdown[];
76
83
  };
77
84
  /**
78
85
  * Un bloc de la vue cumulative (mode STACK). Hissé au niveau module (au lieu
@@ -6,7 +6,7 @@ export declare const actionMap: Map<string, ActionDefinition>;
6
6
  * Cibles d'un Événement Clé prêtes pour buildKeyEventCardHtml : id + nom,
7
7
  * la carte affichant pour chacune le seul bonus ajouté par l'effet (pas de
8
8
  * deltas du catalogue à charrier jusque-là). Les deux points d'appel (clic
9
- * sur le cercle central, cartes cumulées du panneau) passent par ici — une
9
+ * sur le satellite-facette, cartes cumulées du panneau) passent par ici — une
10
10
  * seule définition de la forme attendue.
11
11
  */
12
12
  export declare function buildKeyEventTargets(keyEvent: KeyEventDefinition): Array<{
@@ -10,20 +10,18 @@ export type EventFieldTarget = {
10
10
  * (même mécanisme que ForceFieldRenderer pour les champs de force
11
11
  * cross-composante). */
12
12
  targetComponentId?: string;
13
- /** Bonus de score de l'événement pour un satellite réellement amplifié,
14
- * 0 pour un satellite simplement à portée — pilote l'épaisseur du
15
- * souffle (voir getEventFieldCapsuleWidth). */
16
- scoreBonus: number;
13
+ /** Shared eligibility strength, purely visual; zero for potential targets. */
14
+ intensity: number;
17
15
  };
18
- /**
19
- * Whether `keyEvent`'s static scope (collectReachedSatellites) includes at
20
- * least one satellite living in `componentId`. Used when the user switches
21
- * facette to decide whether the active Champ d'événement should keep
22
- * driving the field in the destination facette (incoming continuation) or
23
- * be cleared like it is for any unrelated facette — see
24
- * YinYangController.prepareForComponentSwitch.
25
- */
26
- export declare function keyEventReachesComponent(keyEvent: KeyEventDefinition, componentId: string): boolean;
16
+ /** Vrai si l'événement amplifie réellement au moins un satellite — une
17
+ * action ciblée cochée, jouée après lui et dans sa fenêtre (voir
18
+ * collectEligibleStrengths). Sert, en mode STACK, à écarter les événements
19
+ * cochés qui n'ont encore aucun effet. */
20
+ export declare function keyEventAffectsAny(keyEvent: KeyEventDefinition, activeItems: ActionStackItem[]): boolean;
21
+ /** Vrai si l'événement amplifie réellement au moins un satellite de
22
+ * `componentId` — choisit, en mode STACK, l'événement distant dont le
23
+ * souffle entre dans la facette courante. */
24
+ export declare function keyEventAffectsComponent(keyEvent: KeyEventDefinition, componentId: string, activeItems: ActionStackItem[]): boolean;
27
25
  /**
28
26
  * Résout les cibles du "Champ d'événement" pour l'Événement Clé actuellement
29
27
  * actif (aperçu ou validé) : sa portée statique, résolue en index de satellite
@@ -33,6 +31,13 @@ export declare function keyEventReachesComponent(keyEvent: KeyEventDefinition, c
33
31
  * maintenant — ceux dont une action ciblée est cochée dans la pile — de ceux
34
32
  * qui ne sont qu'à portée : les premiers reçoivent le bonus de score de
35
33
  * l'événement, les seconds 0 (souffle minimal).
34
+ *
35
+ * `stackEffects` (mode STACK, événements cochés de la pile) : la pile ne
36
+ * montre que des effets réels, donc seuls les satellites amplifiés reçoivent
37
+ * un cordon — et une facette distante seulement si elle en abrite un — et
38
+ * leur épaisseur suit le bonus EFFECTIF, réduit selon la position de
39
+ * l'action dans la fenêtre. L'aperçu (RECHERCHE ou bulle) garde la portée
40
+ * complète et le bonus nominal : il montre jusqu'où l'événement PEUT porter.
36
41
  */
37
42
  export declare function buildEventFieldTargets(params: {
38
43
  keyEvent: KeyEventDefinition;
@@ -44,4 +49,5 @@ export declare function buildEventFieldTargets(params: {
44
49
  score: number;
45
50
  cuttingIndex: number;
46
51
  }>;
52
+ stackEffects?: boolean;
47
53
  }): EventFieldTarget[];
@@ -0,0 +1,4 @@
1
+ import type { ActionStackItem } from "../action-stack/ActionStackState";
2
+ import type { KeyEventPropagationContext } from "../../../data/key-event-propagation";
3
+ /** Same event matches as delta/shield resolution, with actual source applicability. */
4
+ export declare function keyEventPropagationContext(item: ActionStackItem | undefined, items: ActionStackItem[]): KeyEventPropagationContext | undefined;
@@ -0,0 +1,4 @@
1
+ import type { ActionStackItem } from "../action-stack/ActionStackState";
2
+ import type { KeyEventDefinition } from "../../../data/key-event-types";
3
+ import { type EventTargetBreakdown } from "../force-field/keyEventPresentation";
4
+ export declare function keyEventTargetBreakdowns(event: KeyEventDefinition, items: ActionStackItem[]): EventTargetBreakdown[];
@@ -3,3 +3,19 @@ export declare function parseTranslateTransform(transform: string): {
3
3
  y: number;
4
4
  found: boolean;
5
5
  };
6
+ type TransformTarget = {
7
+ setAttribute: (name: string, value: string) => unknown;
8
+ };
9
+ /** Translation d'orbite, sur l'enveloppe d'orbite du satellite
10
+ * (viewInitializer.orbitGroup) — en plein mouvement, une animation du
11
+ * navigateur la recouvre (ChildrenOrbitManager). */
12
+ export declare function setSatelliteTranslation(target: TransformTarget, x: number, y: number): void;
13
+ /** Respiration du weightDelta (WeightPreviewRingRenderer), sur le
14
+ * globalGroup du satellite : scale autour de son centre. Séparée de
15
+ * l'orbite, qui est posée sur l'enveloppe. `scale` 1 (ou null) la retire. */
16
+ export declare function setSatellitePulseScale(target: TransformTarget, pulse: {
17
+ scale: number;
18
+ cx: number;
19
+ cy: number;
20
+ } | null): void;
21
+ export {};
@@ -13,4 +13,6 @@ export interface VizControlsDeps {
13
13
  orbitRampMs: number;
14
14
  };
15
15
  }
16
- export declare function mountVizControls(deps: VizControlsDeps): void;
16
+ /** Retourne la fonction de démontage : désabonne les veilles d'inactivité
17
+ * (sinon elles relanceraient la rotation / l'orbite d'un diagramme détruit). */
18
+ export declare function mountVizControls(deps: VizControlsDeps): () => void;
@@ -42,6 +42,15 @@ export declare class PanelManager {
42
42
  masterCuttingPending: boolean;
43
43
  masterCuttingHistoryPushed: boolean;
44
44
  diagramNavMasterHistLenAtStart: number;
45
+ /** Vrai pendant qu'une sélection mémorisée est rejouée sur le diagramme
46
+ * (bascule RECHERCHE ↔ STACK) : les rappels du diagramme n'écrivent alors
47
+ * pas dans le panneau RECHERCHE — voir isRecherchePanelMuted. */
48
+ private restoringModeSelection;
49
+ /** Sélection propre à chaque mode, photographiée au moment de le quitter.
50
+ * Les deux modes sont hermétiques : chacun retrouve la sienne au retour,
51
+ * et un mode jamais visité démarre sans sélection (vue Sphère). */
52
+ private rechercheSelection;
53
+ private stackSelection;
45
54
  /** Jeton de génération pour historyBack/historyForward — voir leur commentaire. */
46
55
  private navGen;
47
56
  oddNavState: {
@@ -65,35 +74,46 @@ export declare class PanelManager {
65
74
  private redistributeOpenHeights;
66
75
  private setPanelCollapsed;
67
76
  private updateLockButton;
68
- /** Cible actuellement sélectionnée dans l'arbre du panneau maître, ou null.
69
- * À lire AVANT de quitter RECHERCHE : voir resyncDiagramToMasterPanel. */
77
+ /** Cible actuellement sélectionnée dans l'arbre du panneau maître, ou null. */
70
78
  getMasterSelectedTarget(): SearchNavTarget | null;
71
79
  /**
72
- * Rejoue sur le diagramme ce que le panneau MAÎTRE montre déjà — appelé au
73
- * retour en mode RECHERCHE, où l'onglet réaffiche le dernier élément
74
- * sélectionné alors que le diagramme, lui, vient d'être vidé des champs de
75
- * la pile (clearForceFieldForModeSwitch). Les deux côtés doivent montrer la
76
- * même chose quel que soit le mode ; sans ça, il fallait recliquer sur
77
- * l'élément déjà affiché pour retrouver ses champs.
80
+ * Le panneau RECHERCHE n'écoute pas le diagramme : en mode STACK (les deux
81
+ * modes sont hermétiques — la navigation STACK ne touche ni l'arbre ni
82
+ * l'historique RECHERCHE), et pendant qu'une sélection mémorisée est
83
+ * rejouée (le panneau montre déjà ce qu'il faut).
84
+ */
85
+ isRecherchePanelMuted(): boolean;
86
+ /** À appeler AVANT de quitter RECHERCHE (clic d'onglet ou bascule
87
+ * programmatique) : le passage en STACK peut effacer la sélection de
88
+ * l'arbre (le rendu des champs cumulés de la pile repasse par les blocs de
89
+ * détail du panneau). */
90
+ rememberRechercheSelection(): void;
91
+ /** À appeler AVANT de quitter STACK : sa sélection ne vit que dans le
92
+ * diagramme, qui va être réécrit par celle de RECHERCHE. */
93
+ rememberStackSelection(): void;
94
+ /**
95
+ * Retour en RECHERCHE : rejoue sur le diagramme la sélection mémorisée en
96
+ * quittant RECHERCHE. Le panneau maître, lui, n'a pas bougé pendant STACK
97
+ * (isRecherchePanelMuted) ; il n'est resynchronisé que si sa sélection a
98
+ * malgré tout été perdue en route.
78
99
  *
79
100
  * Passe par les chemins de RESTAURATION (restoreActionDiagramState,
80
101
  * restoreKeyEventDiagramState, forceOpen) et non par ceux d'un clic : l'état
81
102
  * est déjà connu, il ne doit ni basculer en toggle-close ni redessiner la
82
103
  * carte du panneau ni pousser une entrée d'historique.
83
- *
84
- * Ne traite que les niveaux qui portent un champ dans le diagramme (action,
85
- * cutting, Événement Clé). Une facette ou un ODD n'en ont pas : les rejouer
86
- * ne ferait que risquer un toggle de la vue ODD pour rien.
87
- *
88
- * @param fallbackTarget cible mémorisée au moment de QUITTER RECHERCHE.
89
- * Le passage en STACK peut effacer la sélection de l'arbre (le rendu des
90
- * champs cumulés de la pile repasse par les blocs de détail du panneau)
91
- * ou la réécrire au niveau facette (navigation d'arc de bordure pendant
92
- * STACK) : dans les deux cas c'est cette photographie qui dit quel
93
- * élément l'utilisateur consultait, et sa restauration inclut le switch
94
- * de facette si le diagramme est parti ailleurs entre temps.
95
104
  */
96
- resyncDiagramToMasterPanel(fallbackTarget?: SearchNavTarget | null): void;
105
+ restoreRechercheSelection(): void;
106
+ /** Retour en STACK : rejoue sur le diagramme la sélection mémorisée en
107
+ * quittant STACK (aucune au premier passage). Le chip et l'historique
108
+ * STACK suivent par les rappels habituels du diagramme. */
109
+ restoreStackSelection(): void;
110
+ /**
111
+ * Remet le diagramme à blanc puis y rejoue `target` (null : vue Sphère),
112
+ * panneau RECHERCHE muet jusqu'à la fin d'un éventuel changement de facette
113
+ * — la navigation reportée après l'animation repasse elle aussi par les
114
+ * rappels du diagramme.
115
+ */
116
+ private replayDiagramSelection;
97
117
  /**
98
118
  * @param forceOpen À passer à true quand target restaure un état déjà connu
99
119
  * (rejeu d'historique back/forward, panneau qui redevient maître) plutôt
@@ -103,10 +123,58 @@ export declare class PanelManager {
103
123
  * la mise à jour ne se faisait qu'un clic Retour/Suivant sur deux.
104
124
  */
105
125
  syncDiagramToTarget(target: SearchNavTarget, forceOpen?: boolean): void;
126
+ /** Le panneau qui devient maître impose au diagramme l'élément qu'il
127
+ * mémorise, et lui seul : chaque panneau déverrouillé reste isolé des
128
+ * autres. Une action se rétablit sans bascule (re-sélectionner l'action
129
+ * déjà active la désactiverait) et sans redessiner le bloc, que le
130
+ * panneau affiche déjà. Sous verrou, l'action source reste celle du
131
+ * panneau verrouillé : on n'en montre que la propagation sur le
132
+ * satellite de ce panneau. */
133
+ private syncDiagramToMasterTarget;
106
134
  private setMaster;
107
135
  private setPanelLocked;
136
+ private noticeEl;
137
+ private noticeTimer;
138
+ /** Index d'un panneau verrouillé sur une action, ou -1. Cette action est
139
+ * l'action source du multi-blocs : ses champs de force et sa bulle
140
+ * restent affichés, en sélectionner une autre les remplacerait. */
141
+ private findActionLockedSlot;
142
+ isActionSelectionLocked(): boolean;
143
+ /** Estompe les actions de l'arbre des panneaux non verrouillés. */
144
+ private applyActionLockClasses;
145
+ /** Garde de l'arbre d'un panneau : refuse la sélection d'une action tant
146
+ * qu'un panneau est verrouillé sur une autre. */
147
+ private guardActionNav;
148
+ /** Panneau verrouillé autre que `exceptIdx`, ou -1. */
149
+ private findLockedSlot;
150
+ /** Clic refusé sur une action : bandeau sous l'en-tête du panneau maître,
151
+ * qui propose de déverrouiller puis de rejouer ce clic. */
152
+ showActionLockNotice(retry: () => void): void;
153
+ /** Verrou refusé : un autre panneau l'est déjà. Bandeau ancré sous le
154
+ * bouton verrou — en position fixe, car un panneau replié rognerait un
155
+ * bandeau qu'il contiendrait. */
156
+ private showSecondLockNotice;
157
+ /** Place un bandeau (posé sur body) sous `anchor`, aligné à sa droite —
158
+ * au-dessus s'il déborderait du bas de l'écran. */
159
+ private anchorNotice;
160
+ /** Bandeau de refus (un seul à la fois) : texte + bouton « Déverrouiller »
161
+ * qui exécute `onUnlock`. Disparaît seul au bout de 6 s. */
162
+ private showNotice;
163
+ private hideNotice;
164
+ /** Déverrouille les panneaux qui figent l'action source. Le panneau
165
+ * maître garde la main ; les panneaux libérés mémorisent leur action. */
166
+ private unlockActionLockedSlots;
108
167
  openPanel(slotIdx: number, skipSync?: boolean): void;
109
- private closePanel;
168
+ private compareMode;
169
+ /** Hors mode Comparer, replie les blocs déverrouillés ouverts autres que
170
+ * `keepIdx` (null : aucun n'est gardé). */
171
+ private enforceSingleOpen;
172
+ private wireCompareToggle;
173
+ /** Clic sur l'en-tête : replie/déplie le bloc, rien d'autre. Ni bascule
174
+ * de maître (seul un clic dans le bloc la fait, voir wireSlotInteraction)
175
+ * ni repli des autres blocs, qu'on peut ainsi comparer ouverts ensemble.
176
+ * Un maître replié reste maître : le diagramme ne bouge pas. */
177
+ private togglePanelFromHeader;
110
178
  activateLinkedPanel(slotIdx: number): void;
111
179
  resolveTargetSlot(): {
112
180
  idx: number;
@@ -140,6 +208,8 @@ export declare class PanelManager {
140
208
  title: string;
141
209
  description: string;
142
210
  } | undefined, rationale: string | undefined, isLinked: boolean): () => void;
211
+ private lockSlot;
212
+ private unlockSlot;
143
213
  private wireSlotInteraction;
144
214
  private initPanel1;
145
215
  private initPanel2;
@@ -49,7 +49,8 @@ export interface GlobalSearchControllerOptions {
49
49
  /** Appelé au dépli/repli du groupe "Événements Clés" d'une facette. Le groupe
50
50
  * n'est pas une cible de navigation (pas de data-nav-key, rien à
51
51
  * sélectionner) mais il a bien un pendant dans le diagramme : le menu radial
52
- * des Événements Clés, déployé depuis le cœur du yin/yang. */
52
+ * des Événements Clés, déployé autour du satellite-facette (Idle
53
+ * « facettes »). */
53
54
  onKeyEventGroupToggle?: (componentIndex: number, open: boolean) => void;
54
55
  }
55
56
  export declare class GlobalSearchController {
@@ -264,7 +265,8 @@ export declare class GlobalSearchController {
264
265
  /**
265
266
  * Diagramme → arbre : reflète l'état réel du menu radial des Événements Clés.
266
267
  * Le diagramme referme ces bulles de lui-même dans plusieurs cas (ouverture
267
- * du menu d'un Satellite, fermeture ou changement de facette) ; sans ce
268
+ * du menu d'un Satellite, bulles d'un autre satellite-facette, sortie du
269
+ * sous-état Idle « facettes ») ; sans ce
268
270
  * miroir, le groupe resterait déplié au-dessus d'un diagramme vide et il
269
271
  * aurait fallu deux clics pour le rouvrir (le premier ne faisant que
270
272
  * rattraper le décalage). DOM seul — n'émet jamais vers le diagramme.
@@ -295,6 +297,13 @@ export declare class GlobalSearchController {
295
297
  private setSelectedNavKey;
296
298
  private restoreSelectedRow;
297
299
  private _syncImpactBlockVisibility;
300
+ /** Garde de sélection d'action (multi-blocs, voir setActionNavGuard). */
301
+ private _actionNavGuard;
302
+ /** Multi-blocs : tant qu'un panneau est verrouillé sur une action, le garde
303
+ * refuse toute sélection d'action (retourne false) ; `retry` rejoue la
304
+ * sélection une fois le panneau déverrouillé. */
305
+ setActionNavGuard(guard: ((target: SearchNavTarget, retry: () => void) => boolean) | null): void;
306
+ /** Retourne false si la navigation a été refusée. */
298
307
  private emitNav;
299
308
  /** Lie le panneau de détail à droite de l'arbre de recherche. */
300
309
  setDetailPanel(el: HTMLElement): void;
@@ -398,15 +407,13 @@ export declare class GlobalSearchController {
398
407
  * placeholder (voir _syncPlaceholder).
399
408
  */
400
409
  resetToSphereView(): void;
410
+ /** Verrouille ou déverrouille le panneau : bloque la navigation utilisateur et le bloc d'impact. */
411
+ setLocked(locked: boolean): void;
401
412
  /**
402
413
  * Injecte le HTML des cartes d'impact directement sous la ligne action dans l'arbre,
403
414
  * comme élément frère suivant le <li class="gs-tree-action"> de l'action sélectionnée.
404
415
  * Ré-utilisé après chaque renderTree pour que le bloc survive aux reconstructions DOM.
405
416
  */
406
- private _markActionBeacon;
407
- private _clearActionBeacon;
408
- /** Verrouille ou déverrouille le panneau : bloque la navigation utilisateur et le bloc d'impact. */
409
- setLocked(locked: boolean): void;
410
417
  private _injectImpactBlockIfActive;
411
418
  /** Anime la fermeture d'un bloc puis appelle onDone une seule fois. */
412
419
  private _animateBlockOut;
@@ -21,10 +21,6 @@ export declare class BorderDrawer {
21
21
  private readonly facetteImageElements;
22
22
  private readonly facetteImagePositions;
23
23
  private revealedFacetteImageIndex;
24
- /** Default "voile terne" filter applied to every facette image — lifted
25
- * (see revealFacetteImage) only for the facette the outer spark is
26
- * currently sweeping over. */
27
- private readonly facetteImageVeilFilter;
28
24
  private _hoverSegmentIndex;
29
25
  /** Segment currently under the mouse pointer, tracked separately from
30
26
  * _hoverSegmentIndex (which comes from the Recherche tree) so neither
@@ -43,8 +39,14 @@ export declare class BorderDrawer {
43
39
  private readonly sourceBeaconColor;
44
40
  private borderGhostGroupNode;
45
41
  private borderGhostEntries;
42
+ /** Arcs d'onde du ghost des bordures et leur générateur, gardés d'une frame
43
+ * à l'autre tant que les entrées et la géométrie ne changent pas. */
44
+ private borderGhostWaveCache;
46
45
  private borderGhostFrameId;
46
+ private facetteRevealFrameId;
47
47
  constructor(ViewInitializer: ViewInitializer);
48
+ /** Fin de vie : arrête la vague du ghost et le fondu d'image en attente. */
49
+ destroy(): void;
48
50
  /**
49
51
  * Initializes the properties needed for drawing borders based on the ViewInitializer data.
50
52
  * Uses borderArcsGroup for the persistent per-component border arcs.
@@ -143,16 +145,16 @@ export declare class BorderDrawer {
143
145
  * (margin, fade start/opacity — see the "Images facette" dev controls) take
144
146
  * effect immediately. */
145
147
  rebuildFacetteImageRing(): void;
146
- /** Lifts the "voile terne" on one facette's image, veiling every other one
147
- * — only one can be unveiled at a time. Driven by the outer spark
148
+ /** Lifts the "voile terne" on one facette's image (fade-in of its color
149
+ * version over the pre-rendered veiled one), veiling every other one —
150
+ * only one can be unveiled at a time. Driven by the outer spark
148
151
  * sweeping across border arcs. Veils *all* others rather than just the
149
152
  * previously-tracked index, so the single-spotlight invariant holds
150
153
  * whatever state the ring was left in. */
151
154
  revealFacetteImage(segmentIndex: number): void;
152
155
  /** Thumbnails often overlap: SVG has no z-index, so the unveiled image's
153
156
  * group is moved last in the ring to be painted above its neighbours.
154
- * Style is flushed after the move so the filter transition still plays
155
- * (a re-inserted node would otherwise jump straight to its new filter). */
157
+ * Returns whether the group was actually moved. */
156
158
  private bringFacetteImageToFront;
157
159
  /** Center + radius (pre-scale coordinate space) of a facette's image
158
160
  * thumbnail, so labels can be anchored onto the image instead of
@@ -162,6 +164,9 @@ export declare class BorderDrawer {
162
164
  y: number;
163
165
  radius: number;
164
166
  } | undefined;
167
+ /** Angle du milieu de l'arc de chaque facette (convention d3.arc : 0 = midi,
168
+ * sens horaire), indexé par id de facette. */
169
+ getSegmentMidAngles(): Map<string, number>;
165
170
  private getSegmentMidAngle;
166
171
  private getPointOnAngle;
167
172
  /**
@@ -194,7 +199,9 @@ export declare class BorderDrawer {
194
199
  clearSourceBeacon(): void;
195
200
  /**
196
201
  * Applique un survol léger sur un segment de bordure (hover depuis l'arbre Recherche).
197
- * N'affecte pas l'index actif — simple classe CSS ajoutée/retirée.
202
+ * N'affecte pas l'index actif : une classe sur le groupe wrapper (marqueur
203
+ * d'état) et un halo cyan pré-rendu sous l'arc (emplacement "hover",
204
+ * indépendant de ceux de l'état actif et du beacon).
198
205
  */
199
206
  setHoverSegment(segmentIndex: number | null): void;
200
207
  /** Rebuilds every border segment so the live-tuned shape parameters (corner
@@ -202,6 +209,22 @@ export declare class BorderDrawer {
202
209
  * are otherwise built exactly once, at init. Mirrors
203
210
  * rebuildFacetteImageRing. The active/beacon state is re-applied at the
204
211
  * end so a rebuild is visually invisible apart from the tuned parameter. */
212
+ /** Échelle des arcs repliés : assez petite pour que l'anneau passe
213
+ * entièrement sous l'illustration centrale, qui le
214
+ * recouvre — d'où l'effet d'arcs « rentrant » dans le cercle global. */
215
+ private static readonly RETRACTED_ARCS_SCALE;
216
+ private segmentsRetracted;
217
+ areSegmentsRetracted(): boolean;
218
+ /**
219
+ * Sous-état Idle « facettes » : replie (ou redéploie) l'anneau des arcs de
220
+ * bordure vers le centre. Mouvement mécanique
221
+ * plutôt qu'un fondu : léger recul puis plongée sous l'illustration au
222
+ * repli (easeBackIn), sortie avec un léger dépassement du bord au
223
+ * redéploiement (easeBackOut). On anime le groupe conteneur des arcs, qui
224
+ * persiste à travers leurs reconstructions.
225
+ * Les arcs ne sont plus cliquables tant qu'ils sont repliés.
226
+ */
227
+ setSegmentsRetracted(retracted: boolean, durationMs?: number): Promise<void>;
205
228
  rebuildBorderSegments(): void;
206
229
  /**
207
230
  * Updates the style of border segments based on active index (lightweight, no redraw)
@@ -211,20 +234,23 @@ export declare class BorderDrawer {
211
234
  private applySegmentStyle;
212
235
  private getTotalBordersGroup;
213
236
  /**
214
- * Applies color animation to a segment's gradient, making it cycle through category colors
237
+ * Makes an active segment cycle through its ODD colours (see
238
+ * borderColorCycle: composed by the browser while the diagram is at rest,
239
+ * written on the main thread while a frame loop runs). Idempotent — the
240
+ * same colours and duration keep the running cycle and its phase. No cycle
241
+ * when the duration is 0 (film bake): the static gradient stays.
215
242
  */
216
243
  private applySegmentColorAnimation;
217
- /**
218
- * Removes color animation from a segment's gradient
219
- */
244
+ /** Stops an inactive segment's colour cycle; its own fill is restored by
245
+ * the caller (fill-opacity of the inactive style). */
220
246
  private removeSegmentColorAnimation;
247
+ private stopSegmentColorCycles;
221
248
  /**
222
249
  * Applies an animation that only increases the segment outer radius.
223
250
  * The inner radius remains unchanged.
224
251
  */
225
252
  private applySegmentOuterWidthAnimation;
226
253
  private startBeaconPulse;
227
- private toRgba;
228
254
  /**
229
255
  * Builds the ODD gradient painted inside one facette's arc.
230
256
  *
@@ -0,0 +1,15 @@
1
+ import type { IdleTabLayout } from "../controller/children/idleTabLayout";
2
+ export declare class IdleTabGridDrawer {
3
+ private readonly getSvgRoot;
4
+ /** Nœud devant lequel le tableau s'insère (le globalGroup du diagramme). */
5
+ private readonly getBeforeNode;
6
+ private readonly getIdPrefix;
7
+ private group;
8
+ constructor(getSvgRoot: () => SVGSVGElement | null,
9
+ /** Nœud devant lequel le tableau s'insère (le globalGroup du diagramme). */
10
+ getBeforeNode: () => Element | null, getIdPrefix: () => string);
11
+ show(layout: IdleTabLayout, durationMs: number): Promise<void>;
12
+ hide(durationMs: number): Promise<void>;
13
+ removeNow(): void;
14
+ private draw;
15
+ }
@@ -6,6 +6,9 @@ export declare class SpikeDrawer {
6
6
  private key;
7
7
  private graphicStrategy;
8
8
  spikesEnabled: boolean;
9
+ /** Points d'onde des spikes, gardés d'une frame à l'autre tant que les
10
+ * entrées et le calque ne changent pas. */
11
+ private spikeGhostWaveCache;
9
12
  private spikeGhostEntries;
10
13
  private spikeGhostFrameId;
11
14
  /** ODD actuellement sélectionné dans le cercle central (clic sur un arc) :
@@ -15,6 +18,10 @@ export declare class SpikeDrawer {
15
18
  private oddSpikeHighlight;
16
19
  private oddCometEntries;
17
20
  private oddCometFrameId;
21
+ /** Lignes et dégradés posés par le dernier drawSpikes, dans l'ordre de
22
+ * geometry.spikes : une frame de transition de facette n'en réécrit que
23
+ * les coordonnées et la couleur (updateSpikePositions). */
24
+ private spikeNodes;
18
25
  constructor(ViewInitializer: ViewInitializer);
19
26
  /**
20
27
  * Initializes the necessary data for drawing spikes.
@@ -32,6 +39,15 @@ export declare class SpikeDrawer {
32
39
  private clearSpikes;
33
40
  private drawSpikes;
34
41
  private drawSpike;
42
+ private spikeGradientId;
43
+ /**
44
+ * Frame de transition de facette : replace en place les spikes du dernier
45
+ * drawSpikes (extrémités de la ligne et de son dégradé, couleur de l'ODD),
46
+ * sans retirer ni recréer ni ligne ni dégradé — la mise en avant d'un ODD
47
+ * sélectionné et ses comètes restent donc posées dessus. Renvoie false si
48
+ * les spikes ne sont plus les mêmes (l'appelant refait un rendu complet).
49
+ */
50
+ updateSpikePositions(): boolean;
35
51
  /**
36
52
  * Draws the weightDelta ghost overlay from ViewInitializer.spikesGhost on
37
53
  * both yin and yang: a dashed gold line to each targeted spike's projected
@@ -47,6 +63,8 @@ export declare class SpikeDrawer {
47
63
  private drawSpikeGhostsForType;
48
64
  private drawSpikeGhostLines;
49
65
  private ensureSpikeGhostLoop;
66
+ /** Fin de vie : arrête la vague du ghost et les comètes d'ODD. */
67
+ destroy(): void;
50
68
  private stopSpikeGhostLoop;
51
69
  /** Dot that travels between a spike's real tip and its projected tip, on
52
70
  * the same lap duration/easing as the border-segment and ODD-arc ghost