@micheeeeel/yinyangapp 3.0.1 → 3.1.1

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 (117) hide show
  1. package/dist/bundle.css +1 -0
  2. package/dist/bundle.js +1 -2
  3. package/dist/types/adapters/yasuniCauseAdapter.d.ts +13 -2
  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 +31 -3
  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 +109 -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 +19 -22
  25. package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +3 -1
  26. package/dist/types/components/controller/children/IdleFacettesController.d.ts +205 -0
  27. package/dist/types/components/controller/children/facetModulation.d.ts +49 -0
  28. package/dist/types/components/controller/children/idleTabLayout.d.ts +95 -0
  29. package/dist/types/components/controller/children/idleTabMorph.d.ts +45 -0
  30. package/dist/types/components/controller/children/signatureLook.d.ts +10 -0
  31. package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +14 -0
  32. package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +3 -3
  33. package/dist/types/components/controller/force-field/ForceFieldCanvasPainter.d.ts +99 -0
  34. package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +9 -0
  35. package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +28 -57
  36. package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +4 -1
  37. package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +16 -1
  38. package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +10 -18
  39. package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +2 -2
  40. package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +2 -0
  41. package/dist/types/components/controller/force-field/keyEventPresentation.d.ts +47 -0
  42. package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +4 -0
  43. package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +4 -2
  44. package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +1 -0
  45. package/dist/types/components/controller/force-field/shieldViewModel.d.ts +6 -2
  46. package/dist/types/components/controller/force-field/types.d.ts +2 -1
  47. package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +7 -0
  48. package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +13 -0
  49. package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +16 -0
  50. package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +33 -0
  51. package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +76 -25
  52. package/dist/types/components/controller/odd/OddHighlightEffects.d.ts +2 -0
  53. package/dist/types/components/controller/odd/OddViewManager.d.ts +7 -3
  54. package/dist/types/components/controller/odd/childHighlightStyles.d.ts +45 -3
  55. package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +8 -5
  56. package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +4 -4
  57. package/dist/types/components/controller/state/ControllerSession.d.ts +3 -3
  58. package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +10 -0
  59. package/dist/types/components/controller/state/YinYangControllerState.d.ts +20 -9
  60. package/dist/types/components/controller/types.d.ts +9 -2
  61. package/dist/types/components/controller/utils/actionCatalog.d.ts +1 -1
  62. package/dist/types/components/controller/utils/eventFieldTargets.d.ts +19 -13
  63. package/dist/types/components/controller/utils/keyEventPropagationContext.d.ts +4 -0
  64. package/dist/types/components/controller/utils/keyEventTargetBreakdowns.d.ts +4 -0
  65. package/dist/types/components/controller/utils/svgTransform.d.ts +16 -0
  66. package/dist/types/components/controls/ObstacleDemoControl.d.ts +3 -0
  67. package/dist/types/components/controls/VizControlsPanel.d.ts +3 -1
  68. package/dist/types/components/panel/PanelManager.d.ts +92 -22
  69. package/dist/types/components/search/GlobalSearchController.d.ts +13 -6
  70. package/dist/types/components/view/BorderDrawer.d.ts +40 -14
  71. package/dist/types/components/view/IdleTabGridDrawer.d.ts +15 -0
  72. package/dist/types/components/view/SpikeDrawer.d.ts +18 -0
  73. package/dist/types/components/view/ViewInitializer.d.ts +45 -7
  74. package/dist/types/components/view/YinYangDrawer.d.ts +132 -30
  75. package/dist/types/components/view/borderColorCycle.d.ts +76 -0
  76. package/dist/types/components/workspace/facetWeightRuleSetting.d.ts +10 -0
  77. package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
  78. package/dist/types/config/animationConfig.d.ts +10 -1
  79. package/dist/types/data/activeDiagram.d.ts +6 -2
  80. package/dist/types/data/adverse-action-planner.d.ts +3 -3
  81. package/dist/types/data/amplifier-engine.d.ts +6 -6
  82. package/dist/types/data/contacts/demoObstacle.d.ts +3 -0
  83. package/dist/types/data/contacts/index.d.ts +3 -0
  84. package/dist/types/data/contacts/obstacleSignature.d.ts +56 -0
  85. package/dist/types/data/key-event-effects.d.ts +30 -0
  86. package/dist/types/data/key-event-eligibility.d.ts +24 -0
  87. package/dist/types/data/key-event-propagation.d.ts +13 -0
  88. package/dist/types/data/key-event-types.d.ts +48 -0
  89. package/dist/types/data/key-event-validation.d.ts +11 -0
  90. package/dist/types/data/stability-shield.d.ts +14 -0
  91. package/dist/types/data/yasuni_adverse_key_events.d.ts +1 -1
  92. package/dist/types/data/yasuni_cause.d.ts +7 -0
  93. package/dist/types/data/yasuni_key_events.d.ts +4 -60
  94. package/dist/types/interfaces/ICauseModel.d.ts +16 -1
  95. package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -2
  96. package/dist/types/interfaces/IPropagationGraph.d.ts +14 -0
  97. package/dist/types/interfaces/IViewData.d.ts +19 -3
  98. package/dist/types/interfaces/IYinYangController.d.ts +35 -7
  99. package/dist/types/interfaces/IYinYangInternalModel.d.ts +7 -0
  100. package/dist/types/main.d.ts +1 -1
  101. package/dist/types/utils/actionIconFit.d.ts +23 -0
  102. package/dist/types/utils/actionPropagation.d.ts +6 -4
  103. package/dist/types/utils/causeMetrics.d.ts +29 -11
  104. package/dist/types/utils/chainCardHeight.d.ts +87 -4
  105. package/dist/types/utils/collapseAnimation.d.ts +39 -0
  106. package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +28 -5
  107. package/dist/types/utils/deltaChips.d.ts +0 -4
  108. package/dist/types/utils/exportControls.d.ts +8 -0
  109. package/dist/types/utils/facetWeightLabel.d.ts +6 -4
  110. package/dist/types/utils/facetteImages.d.ts +6 -0
  111. package/dist/types/utils/glowHalo.d.ts +74 -0
  112. package/dist/types/utils/hierBadge.d.ts +1 -1
  113. package/dist/types/utils/keyEventImages.d.ts +1 -1
  114. package/dist/types/utils/menuIconSize.d.ts +17 -0
  115. package/dist/types/utils/spreadAngles.d.ts +17 -0
  116. package/package.json +4 -1
  117. package/dist/bundle.js.LICENSE.txt +0 -1
@@ -6,50 +6,83 @@ type ChildrenOrbitManagerDeps = {
6
6
  view: IYinYangView;
7
7
  getChildControllers: () => IYinYangController[];
8
8
  state: YinYangControllerState;
9
+ /** Rendu complet (menu, labels, panneaux, champ de force) : seulement
10
+ * quand l'état de l'orbite change (démarrage, arrêt, repos). */
9
11
  renderOppositeChildrenForceField: (orbitData: ChildrenOrbitEntry[]) => void;
12
+ /** Rendu par frame pendant que l'orbite tourne : uniquement ce qui suit
13
+ * la position des satellites (bulles, libellés, liens du champ de force). */
14
+ updateOrbitFrame: (orbitData: ChildrenOrbitEntry[]) => void;
10
15
  };
16
+ /**
17
+ * Orbite des satellites, jouée par le navigateur (PERF-18). Le mouvement est
18
+ * décrit en tronçons à accélération constante (`rotationMotion.ts`, ici en
19
+ * radians et rad/ms) ; chaque satellite reçoit une animation Web Animations
20
+ * par tronçon sur l'enveloppe d'orbite (`viewInitializer.orbitGroup`), calée
21
+ * sur `document.timeline` : le contenu du satellite n'est plus re-rasterisé.
22
+ *
23
+ * Ce qui suit les satellites (bulles, libellés, champ de force) reste en JS :
24
+ * une boucle par image recalcule l'angle sur la même horloge et le même
25
+ * modèle (`evaluateMotion`), d'où la même position que celle affichée.
26
+ * Les positions lues ailleurs passent par `getChildTranslation`, l'attribut
27
+ * `transform` n'étant plus à jour pendant le mouvement.
28
+ */
11
29
  export declare class ChildrenOrbitManager {
12
30
  private deps;
13
31
  private readonly orbitService;
14
32
  private cachedOrbitData;
15
- /** Temps de rampe (ms) courant pour l'accélération/décélération de la
16
- * boucle active — mémorisé pour que setSpeed() (vitesse changée en vol)
17
- * et la boucle elle-même s'y réfèrent sans avoir à le repasser partout. */
33
+ /** Temps de rampe (ms) courant pour l'accélération/décélération —
34
+ * mémorisé pour que setSpeed() (vitesse changée en vol) s'y réfère sans
35
+ * avoir à le repasser partout. */
18
36
  private rampMs;
19
- /** Vitesse angulaire instantanée (rad/ms, signée) — chasse la vitesse
20
- * cible (state.children.orbitSpeed, en rad/s) au rythme imposé par
21
- * rampMs. */
22
- private currentOmega;
23
- private lastTimestamp;
24
- /** Présent tant qu'un arrêt "retour à la position de base" est en cours :
25
- * l'orbite continue sa course pour s'arrêter exactement sur un multiple
26
- * de 2π (donc visuellement sur la position de base), plutôt que de couper
27
- * la vitesse puis sauter à angle 0. Même principe que AnimationsMngr :
28
- * `beginHomingStop` (mode "normal") décélère à taux constant, avec un tour
29
- * de plus si besoin de confort ; `beginFastHomingStop` (mode "Accéléré")
30
- * rejoint TOUJOURS le prochain passage par la position de base dans une
31
- * durée fixe choisie par l'utilisateur — voir `fastHomingStop.ts`. */
32
- private homeBrake?;
37
+ /** Mouvement en cours (vide à l'arrêt). Angles absolus, ajoutés à l'angle
38
+ * de base de chaque satellite. */
39
+ private motion;
40
+ /** Mouvement en cours = arrêt "retour à la position de base" : l'orbite
41
+ * continue sa course pour s'arrêter exactement sur un multiple de 2π,
42
+ * plutôt que de couper la vitesse puis sauter à angle 0. Même principe
43
+ * que AnimationsMngr : `beginHomingStop` (mode "normal") décélère à taux
44
+ * constant, avec un tour de plus si besoin de confort ;
45
+ * `beginFastHomingStop` (mode "Accéléré") rejoint TOUJOURS le prochain
46
+ * passage par la position de base dans une durée fixe choisie par
47
+ * l'utilisateur — voir `fastHomingStop.ts`. */
48
+ private homing;
49
+ /** Satellites et géométrie de la dernière pose (statique ou animée). */
50
+ private appliedOrbitData;
51
+ /** Angle de la dernière pose statique. */
52
+ private appliedAngle;
53
+ /** Animations posées, par enveloppe d'orbite. */
54
+ private tracks;
55
+ /** Satellites recréés pendant le mouvement : animations à reposer. */
56
+ private tracksStale;
33
57
  constructor(deps: ChildrenOrbitManagerDeps);
34
58
  invalidateCache(): void;
35
59
  buildOrbitData(): ChildrenOrbitEntry[];
60
+ /** Pose statique (orbite à l'arrêt ou au repos) et rendu complet. */
36
61
  applyTransforms(angleOffset: number, orbitData?: ChildrenOrbitEntry[]): void;
62
+ /** Translation affichée du satellite (repère du parent), y compris en
63
+ * plein mouvement : calculée à l'instant de l'image courante. */
64
+ getChildTranslation(controller: IYinYangController): {
65
+ x: number;
66
+ y: number;
67
+ };
68
+ private writeTranslations;
37
69
  setEnabled(isEnabled: boolean, rampMs?: number): void;
38
- /** Change la vitesse cible. Si une boucle est déjà active, elle relit
39
- * orbitSpeed à chaque frame et y converge au rythme de sa rampe en cours
40
- * (pas besoin de la redémarrer) — un changement de vitesse en vol est
41
- * donc lui aussi progressif plutôt que d'un coup. */
70
+ /** Change la vitesse cible : en vol, le mouvement repart de l'état
71
+ * courant et y converge au rythme de la rampe en cours — un changement
72
+ * de vitesse est donc lui aussi progressif plutôt que d'un coup. */
42
73
  setSpeed(speed: number): void;
43
74
  setRadiusScale(scale: number): void;
44
75
  /**
45
76
  * Démarre (ou modifie en vol) l'orbite. Avec `rampMs > 0`, la vitesse
46
- * angulaire part de sa valeur courante (0 si à l'arrêt) et chasse
47
- * progressivement `state.children.orbitSpeed` (relu à chaque frame — un
48
- * arrêt en cours de freinage repris ici ré-accélère en douceur depuis la
49
- * vitesse déjà atteinte). `rampMs` omis (0) → vitesse cible appliquée
77
+ * angulaire part de sa valeur courante (0 si à l'arrêt) et rejoint
78
+ * `state.children.orbitSpeed` à accélération constante — un arrêt en
79
+ * cours de freinage repris ici ré-accélère en douceur depuis la vitesse
80
+ * déjà atteinte. `rampMs` omis (0) → vitesse cible appliquée
50
81
  * instantanément, comportement historique.
51
82
  */
52
83
  start(_targetSpeed: number, rampMs?: number): void;
84
+ /** Fin de vie : coupe l'orbite sans rien écrire dans le DOM. */
85
+ destroy(): void;
53
86
  /**
54
87
  * Arrête l'orbite. Avec `rampMs > 0` et une orbite en cours, les satellites
55
88
  * continuent leur course et décélèrent à taux constant pour s'arrêter
@@ -68,6 +101,24 @@ export declare class ChildrenOrbitManager {
68
101
  private computeRemainingToZero;
69
102
  private beginHomingStop;
70
103
  private beginFastHomingStop;
104
+ /** Angle et vitesse à l'instant `now`, mouvement en cours ou non. */
105
+ private currentMotionState;
106
+ private play;
107
+ /**
108
+ * Image d'orbite en vol : les satellites sont déplacés par le navigateur ;
109
+ * ici, seulement ce qui les suit. Le temps de l'image (rAF) est celui de
110
+ * `document.timeline` : même angle que celui affiché.
111
+ */
112
+ private readonly onFrame;
113
+ /** (Re)pose une animation par tronçon sur l'enveloppe de chaque satellite. */
114
+ private syncTracks;
115
+ private cancelTracks;
116
+ private cancelFrameLoop;
117
+ /** Repos à `angle` : pose statique écrite AVANT de retirer les
118
+ * animations (même tâche, aucune image entre les deux). */
119
+ private settle;
71
120
  private finalizeStop;
121
+ /** Horloge des animations (temps de l'image courante). */
122
+ private now;
72
123
  }
73
124
  export {};
@@ -63,6 +63,8 @@ export declare class OddHighlightEffects {
63
63
  * rejouerait l'onde à chaque retour sur la sélection.
64
64
  */
65
65
  clear(keepOddMemory?: boolean): void;
66
+ /** Fin de vie : coupe la boucle et retire les couches. */
67
+ destroy(): void;
66
68
  private ensureLayer;
67
69
  private ensureLoop;
68
70
  private stopLoop;
@@ -47,8 +47,10 @@ export declare class OddViewManager {
47
47
  /** Satellite sélectionné (menu d'action ouvert) — il porte la même mise en
48
48
  * valeur que celle d'un ODD, mais resserrée sur lui seul. */
49
49
  private selectedChildKey;
50
- /** Aperçu transitoire au survol d'un item de la pile — prioritaire tant
51
- * qu'il dure, et sans effets de sélection. */
50
+ /** Satellite source d'un item de la pile — prioritaire tant qu'il dure.
51
+ * "soft" : aperçu au survol, sans effets de sélection. "full" : action en
52
+ * focus en STACK, même mise en lumière qu'un satellite sélectionné en
53
+ * RECHERCHE. */
52
54
  private stackPreviewKeys;
53
55
  /** Laquelle des deux sélections délibérées — un ODD, ou un satellite — est
54
56
  * la plus récente. Elles peuvent coexister (le menu d'un satellite reste
@@ -96,11 +98,13 @@ export declare class OddViewManager {
96
98
  * de visée + pings + onde de scan, et spikes énergisés avec leurs
97
99
  * comètes. */
98
100
  private syncFullHighlightEffects;
101
+ /** Fin de vie : coupe la boucle des effets de mise en valeur. */
102
+ destroy(): void;
99
103
  /** Relu à chaque frame par OddHighlightEffects : les satellites orbitent
100
104
  * sous les anneaux, et peuvent disparaître (satellites masqués, facette
101
105
  * changée) sans que la mise en valeur soit repassée. */
102
106
  private buildHighlightTargets;
103
- highlightOddByStackItemId(stackItemId: string | null): void;
107
+ highlightOddByStackItemId(stackItemId: string | null, intensity?: OddHighlightIntensity): void;
104
108
  cancelOddHighlight(): void;
105
109
  showOddInfo(oddId: string): void;
106
110
  showComposanteInfo(): void;
@@ -44,10 +44,24 @@ export declare const HALO_RING: Record<OddHighlightIntensity, {
44
44
  glowOpacity: number;
45
45
  }>;
46
46
  /** Satellite dont le menu d'action est ouvert : blanc pur et plus large, pour
47
- * ne pas se confondre avec un membre de l'ODD mis en valeur. */
48
- export declare const ACTIVE_CHILD_FILTER = "drop-shadow(0 0 12px rgba(255, 255, 255, 0.9)) brightness(1.1)";
47
+ * ne pas se confondre avec un membre de l'ODD mis en valeur. La lueur est
48
+ * l'anneau ACTIVE_CHILD_GLOW (voir setChildGlowRing), pas un drop-shadow :
49
+ * le satellite est en orbite, le flou serait recalculé à chaque image. */
50
+ export declare const ACTIVE_CHILD_FILTER = "brightness(1.1)";
49
51
  /** Survol direct d'un satellite — aperçu par-dessus tout le reste. */
50
- export declare const HOVERED_CHILD_FILTER = "brightness(1.3) drop-shadow(0 0 7px rgba(255,255,255,0.4))";
52
+ export declare const HOVERED_CHILD_FILTER = "brightness(1.3)";
53
+ /** Survol d'un satellite depuis l'arbre Recherche. */
54
+ export declare const SEARCH_HOVERED_CHILD_FILTER = "brightness(1.5)";
55
+ /** Lueur d'un satellite, équivalent de `drop-shadow(0 0 ${blur}px color)`
56
+ * (alpha compris dans `alpha`). */
57
+ export type ChildGlow = {
58
+ color: string;
59
+ blur: number;
60
+ alpha: number;
61
+ };
62
+ export declare const ACTIVE_CHILD_GLOW: readonly ChildGlow[];
63
+ export declare const HOVERED_CHILD_GLOW: readonly ChildGlow[];
64
+ export declare const SEARCH_HOVERED_CHILD_GLOW: readonly ChildGlow[];
51
65
  /** Aucun ODD mis en valeur et satellite ni actif ni survolé. */
52
66
  export declare const IDLE_CHILD_FILTER = "brightness(0.85)";
53
67
  /** Sans transition, l'extinction des non-membres se lit comme un
@@ -77,3 +91,31 @@ export declare function resolveChildFilter(params: {
77
91
  isPropagationTarget: boolean;
78
92
  highlight: ChildHighlightState;
79
93
  }): string;
94
+ /** Lueur d'état du satellite (actif), dans le même ordre de priorité que
95
+ * resolveChildFilter : seul le satellite actif hors mise en valeur d'ODD en
96
+ * a une — les membres ont leur anneau coloré (HALO_RING). */
97
+ export declare function resolveChildGlow(params: {
98
+ isMember: boolean;
99
+ isActiveChild: boolean;
100
+ highlight: ChildHighlightState;
101
+ }): readonly ChildGlow[] | null;
102
+ /**
103
+ * Pose (ou retire, `glows` null) l'anneau de lueur d'un satellite : des
104
+ * cercles concentriques translucides juste au-delà de son bord (voir
105
+ * glowHalo.glowStrokeLayers), dans son globalGroup — ils suivent donc son
106
+ * orbite sans aucun travail par image, là où un drop-shadow sur le groupe
107
+ * était recalculé à chaque déplacement.
108
+ */
109
+ export declare function setChildGlowRing(childController: {
110
+ view: {
111
+ viewInitializer: {
112
+ globalGroup: {
113
+ node: () => unknown;
114
+ };
115
+ positionX: number;
116
+ positionY: number;
117
+ borderOuterRadius: number;
118
+ borderInnerRadius: number;
119
+ };
120
+ };
121
+ }, glows: readonly ChildGlow[] | null): void;
@@ -83,9 +83,12 @@ type SearchPanelSynchronizerDeps = {
83
83
  x: number;
84
84
  y: number;
85
85
  } | null;
86
- /** Glisser guidé d'un prérequis : réaffiche dans le panneau STACK les
87
- * blocs de l'item de pile portant le combo. */
88
- showStackItemBlocksForDrag: (stackItemId: string) => void;
86
+ /** Affiche le combo source, ou l'action ciblée si le guide vient d'un événement. */
87
+ showStackItemBlocksForDrag: (stackItemId: string, action: {
88
+ actionId: string;
89
+ oddId: string;
90
+ cuttingIndex: number;
91
+ }) => void;
89
92
  /** Glisser guidé : aperçu en direct des cartes combo selon l'emplacement
90
93
  * survolé (restaure le contenu d'origine hors glisser guidé). */
91
94
  refreshGuidedComboPreview: () => void;
@@ -128,8 +131,8 @@ export declare class SearchPanelSynchronizer {
128
131
  * Cœur partagé du glisser-déposer vers la pile — entièrement générique
129
132
  * (ne connaît ni action ni Événement Clé), utilisé par startSearchActionDrag
130
133
  * (hiérarchie RECHERCHE), par ChildActionMenuController (bulle satellite du
131
- * diagramme) et par CoreEventMenuController (bulle Événement Clé du cercle
132
- * central) : chaque appelant fournit l'icône du fantôme de glisser et un
134
+ * diagramme) et par KeyEventMenuController (bulle Événement Clé d'un
135
+ * satellite-facette) : chaque appelant fournit l'icône du fantôme de glisser et un
133
136
  * `onDrop` qui sait construire l'item de pile approprié. Retourne `cleanup`
134
137
  * comme poignée d'annulation, pour permettre à un appelant de stopper
135
138
  * proprement un glisser en cours (ex. fermeture du menu radial en plein
@@ -8,7 +8,7 @@ type ControllerSettingsApplierDeps = {
8
8
  getOrbitData: () => ChildrenOrbitEntry[];
9
9
  updateContextLabels: (orbitData: ChildrenOrbitEntry[]) => void;
10
10
  updateChildActionMenu: (orbitData: ChildrenOrbitEntry[]) => void;
11
- updateCoreEventMenu: () => void;
11
+ updateKeyEventMenu: () => void;
12
12
  applyChildrenFitScale: () => void;
13
13
  clearForceFieldComputationState: () => void;
14
14
  renderOppositeChildrenForceField: () => void;
@@ -35,10 +35,10 @@ export declare class ControllerSettingsApplier {
35
35
  setOddLabelsCompact(compact: boolean): void;
36
36
  setChildActionMenuItemDistance(distance: number): void;
37
37
  setChildActionMenuItemScale(scale: number): void;
38
- setCoreEventMenuDistanceOffset(offset: number): void;
39
- setCoreEventMenuItemScale(scale: number): void;
38
+ setKeyEventMenuDistanceOffset(offset: number): void;
39
+ setKeyEventMenuItemScale(scale: number): void;
40
40
  setChildActionIconFontScale(scale: number): void;
41
- setCoreEventIconFontScale(scale: number): void;
41
+ setKeyEventIconFontScale(scale: number): void;
42
42
  setChildLabelMaxLines(lines: number): void;
43
43
  setOddLabelMaxLines(lines: number): void;
44
44
  setFacetteLabelFontScale(scale: number): void;
@@ -94,9 +94,9 @@ export declare class ControllerSession {
94
94
  cuttingIndex: number;
95
95
  forceOpen: boolean;
96
96
  } | null;
97
- /** Menu cœur à déployer à l'arrivée sur la facette (voir searchSetKeyEventMenuOpen). */
98
- pendingKeyEventMenuAfterSwitch: boolean;
99
- isCoreEventMenuOpen: boolean;
97
+ /** Facette dont le satellite-facette (Idle « facettes ») a ses bulles
98
+ * d'Événements Clés déployées, ou null. */
99
+ keyEventMenuFacetteId: string | null;
100
100
  /** Id de l'Événement Clé actuellement en aperçu (carte affichée), ou null. */
101
101
  activeKeyEventId: string | null;
102
102
  /** Quand vrai, le prochain appel à onShowDirectActionBlock est routé vers le panneau B. */
@@ -46,6 +46,16 @@ export type ControllerUiCallbacks = {
46
46
  * or when an ODD-level interaction deselects it — componentIndex lets the listener
47
47
  * restore its detail panel to the facette view rather than clearing it entirely. */
48
48
  onDiagramSatelliteDeselect?: (componentIndex: number) => void;
49
+ /** Vrai si au moins un panneau RECHERCHE est verrouillé (multi-blocs) : seul
50
+ * ce cas garde l'action active quand on sélectionne un autre satellite, pour
51
+ * en consulter la propagation dans le panneau suivant. */
52
+ isAnyRecherchePanelLocked?: () => boolean;
53
+ /** Vrai si un panneau RECHERCHE est verrouillé sur une action : elle reste
54
+ * l'action source du multi-blocs, aucune autre ne se sélectionne. */
55
+ isActionSelectionLocked?: () => boolean;
56
+ /** Clic sur une action alors que la sélection est verrouillée : `retry`
57
+ * rejoue ce clic une fois le panneau déverrouillé. */
58
+ onActionSelectionBlocked?: (retry: () => void) => void;
49
59
  /** Fired when the user clicks the current composante's border arc to hide its satellites. */
50
60
  onDiagramComposanteDeselect?: () => void;
51
61
  /** Vers le panneau Recherche quand la souris entre/sort d'un satellite dans le diagramme. */
@@ -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 {};
@@ -0,0 +1,3 @@
1
+ import type { YinYangController } from "../controller/YinYangController";
2
+ /** Câble le groupe #debug-obstacle-group (affiché pour l'obstacle seul). */
3
+ export declare function mountObstacleDemoControl(controller: YinYangController): void;
@@ -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;