@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
@@ -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
@@ -11,6 +11,12 @@ export declare class ViewInitializer {
11
11
  graphicContainer: IGraphicElement;
12
12
  graphicStrategy: IGraphicsStrategy;
13
13
  globalGroup: IGraphicElement;
14
+ /** Enveloppe du globalGroup d'un satellite, sous le children-group du
15
+ * parent : porte la seule translation d'orbite, jouée par le navigateur
16
+ * (ChildrenOrbitManager), sans toucher aux transforms que d'autres posent
17
+ * sur le globalGroup (respiration du poids). C'est le nœud à retirer pour
18
+ * supprimer le satellite. Pour le parent : son globalGroup. */
19
+ orbitGroup: IGraphicElement;
14
20
  yinOrYangGroup: {
15
21
  yin: IYinOrYangPattern;
16
22
  yang: IYinOrYangPattern;
@@ -20,6 +26,11 @@ export declare class ViewInitializer {
20
26
  yang: IYinOrYangPattern;
21
27
  };
22
28
  yinYangGroup: IGraphicElement;
29
+ /** Rappelé, une fois par tâche, quand ce qui suit la rotation Yin/Yang
30
+ * change : géométrie des lobes, libellés contre-tournés redessinés.
31
+ * AnimationsMngr y refait ses animations pendant une rotation. */
32
+ onRotationTargetsChanged: (() => void) | null;
33
+ private rotationTargetsChangePending;
23
34
  childrenGroup: IGraphicElement;
24
35
  facetteImageBackgroundGroup: IGraphicElement;
25
36
  borderArcsGroup: IGraphicElement;
@@ -220,6 +231,8 @@ export declare class ViewInitializer {
220
231
  private currentComponentIndex;
221
232
  private animationSequence;
222
233
  private isAnimationRunning;
234
+ private transitionFrameId;
235
+ private observedRoot;
223
236
  private isDisplayingOddMode;
224
237
  /**
225
238
  * Returns whether the view is currently in ODD display mode.
@@ -285,6 +298,18 @@ export declare class ViewInitializer {
285
298
  * Keeps yinYangGroup intact while refreshing symbol groups and spikes.
286
299
  */
287
300
  private redrawYinYangGeometry;
301
+ /**
302
+ * Frame d'une transition de facette ou d'ODD : quand les nœuds du dernier
303
+ * rendu complet couvrent déjà les catégories de la frame, seuls leurs
304
+ * attributs sont réécrits (YinYangDrawer.updateSwitchFrame,
305
+ * SpikeDrawer.updateSpikePositions) ; sinon — typiquement la première
306
+ * frame, où les catégories entrantes rejoignent les sortantes — rendu
307
+ * complet. Bordures, poids de la facette et illustration idle ne dépendent
308
+ * pas de l'interpolation : ils attendent la dernière frame, toujours rendue
309
+ * en entier pour que l'état final soit exactement celui d'un rendu complet.
310
+ */
311
+ private renderTransitionFrame;
312
+ private updateGeometryInPlace;
288
313
  /**
289
314
  * Redraws the ghost Yin/Yang geometry without touching borders or spikes.
290
315
  */
@@ -306,11 +331,10 @@ export declare class ViewInitializer {
306
331
  getAverageTension(): number;
307
332
  getAverageState(): number;
308
333
  /** Poids C_f de la facette courante : moyenne des poids de tous ses
309
- * satellites (`meanWeight`, même règle que `perimeterWeight`, qui fixe la
334
+ * satellites (`facetWeight`, même règle que `perimeterWeight`, qui fixe la
310
335
  * taille de son arc de bordure). */
311
336
  getFacetteWeight(): number;
312
- /** Plafond du poids C_f : WEIGHT_MAX, quel que soit le nombre de
313
- * satellites. */
337
+ /** Plafond du poids de la facette courante (`facetWeightMax`). */
314
338
  getFacetteWeightMax(): number;
315
339
  /** getFacetteWeight pour une facette quelconque (poids de chaque arc de
316
340
  * bordure quand "Afficher libellés" est actif). */
@@ -321,9 +345,9 @@ export declare class ViewInitializer {
321
345
  /**
322
346
  * Centre courant (écran, repère de `globalGroup`) du sous-cercle yin ou
323
347
  * yang, en tenant compte d'une éventuelle rotation Yin/Yang en cours
324
- * (AnimationsMngr écrit un `transform` orbite+spin directement sur
325
- * `yinOrYangGroup[orientation].graphElementGroup` à chaque frame, sans
326
- * jamais toucher `geometry`). Résolu via le CTM plutôt qu'en rejouant la
348
+ * (AnimationsMngr anime, par Web Animations, un `transform` orbite+spin
349
+ * sur `yinOrYangGroup[orientation].graphElementGroup`, sans jamais
350
+ * toucher `geometry` ; le CTM reflète la valeur animée courante). Résolu via le CTM plutôt qu'en rejouant la
327
351
  * formule d'orbite d'AnimationsMngr : le point transformé est le centre
328
352
  * CANONIQUE du lobe, qui est aussi le pivot de sa rotation locale — une
329
353
  * rotation autour de son propre point fixe n'a par construction aucun
@@ -406,6 +430,10 @@ export declare class ViewInitializer {
406
430
  */
407
431
  private interpolateCategoriesRGB;
408
432
  private startCategoryAnimation;
433
+ private requestTransitionFrame;
434
+ /** Fin de vie : coupe la transition de facette en cours, le suivi de
435
+ * visibilité du diagramme et le rappel de rotation. */
436
+ destroy(): void;
409
437
  private startComponentAnimationLoop;
410
438
  private getAnimationCurrentState;
411
439
  private getComponentAnimationState;
@@ -442,7 +470,14 @@ export declare class ViewInitializer {
442
470
  private buildGhostOddSpikes;
443
471
  private buildGhostComponentSpikes;
444
472
  private areCategoriesEqual;
445
- private clearGroupChildren;
473
+ /**
474
+ * Vide un lobe avant son rendu complet, sauf ses libellés (calque des
475
+ * libellés d'arc ODD, score de la facette) : leurs rendus les mettent à
476
+ * jour par jointure, ce qui les garde visibles d'un rendu à l'autre. Les
477
+ * recréer à chaque rendu les faisait repartir d'une opacité nulle — et les
478
+ * laissait invisibles pendant toute une transition de facette.
479
+ */
480
+ private clearLobeGroup;
446
481
  /**
447
482
  * Converts hex color to RGB object.
448
483
  * @param hex Hex color (e.g., "#FF0000")
@@ -473,6 +508,9 @@ export declare class ViewInitializer {
473
508
  */
474
509
  private createYinOrYangGroups;
475
510
  private updateYinOrYangGroup;
511
+ /** Signale (en fin de tâche, après le rendu en cours) que les cibles de
512
+ * la rotation ont changé — voir onRotationTargetsChanged. */
513
+ notifyRotationTargetsChanged(): void;
476
514
  private applyGhostOverlapRules;
477
515
  private buildGeometry;
478
516
  private buildSpikes;