@micheeeeel/yinyangapp 3.0.1 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/dist/bundle.css +1 -0
  2. package/dist/bundle.js +1 -2
  3. package/dist/types/adapters/yasuniCauseAdapter.d.ts +1 -1
  4. package/dist/types/adapters/yinYangAdapter.d.ts +7 -0
  5. package/dist/types/animations/AnimationsMngr.d.ts +69 -15
  6. package/dist/types/animations/FrameScheduler.d.ts +99 -0
  7. package/dist/types/animations/rotationMotion.d.ts +43 -0
  8. package/dist/types/api.d.ts +17 -2
  9. package/dist/types/benchmark/runner.d.ts +20 -0
  10. package/dist/types/benchmark/scenarios.d.ts +55 -6
  11. package/dist/types/components/controller/YinYangController.d.ts +104 -14
  12. package/dist/types/components/controller/action-stack/ActionStackController.d.ts +16 -1
  13. package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +4 -0
  14. package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +13 -2
  15. package/dist/types/components/controller/action-stack/ActionStackState.d.ts +8 -5
  16. package/dist/types/components/controller/action-stack/StackFocusController.d.ts +8 -7
  17. package/dist/types/components/controller/action-stack/stackChromePalette.d.ts +20 -0
  18. package/dist/types/components/controller/actions/ActionProjectionService.d.ts +12 -1
  19. package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +74 -32
  20. package/dist/types/components/controller/actions/KeyEventController.d.ts +78 -70
  21. package/dist/types/components/controller/actions/{CoreEventMenuController.d.ts → KeyEventMenuController.d.ts} +28 -33
  22. package/dist/types/components/controller/actions/radialItemMenu.d.ts +43 -5
  23. package/dist/types/components/controller/children/ChildInteractionController.d.ts +4 -0
  24. package/dist/types/components/controller/children/ChildrenBuilder.d.ts +3 -1
  25. package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +3 -1
  26. package/dist/types/components/controller/children/IdleFacettesController.d.ts +151 -0
  27. package/dist/types/components/controller/children/idleTabLayout.d.ts +95 -0
  28. package/dist/types/components/controller/children/idleTabMorph.d.ts +45 -0
  29. package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +14 -0
  30. package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +3 -3
  31. package/dist/types/components/controller/force-field/ForceFieldCanvasPainter.d.ts +99 -0
  32. package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +9 -0
  33. package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +28 -57
  34. package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +4 -1
  35. package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +16 -1
  36. package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +10 -18
  37. package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +2 -2
  38. package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +2 -0
  39. package/dist/types/components/controller/force-field/keyEventPresentation.d.ts +47 -0
  40. package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +4 -0
  41. package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +4 -2
  42. package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +1 -0
  43. package/dist/types/components/controller/force-field/shieldViewModel.d.ts +6 -2
  44. package/dist/types/components/controller/force-field/types.d.ts +2 -1
  45. package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +7 -0
  46. package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +13 -0
  47. package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +16 -0
  48. package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +6 -0
  49. package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +76 -25
  50. package/dist/types/components/controller/odd/OddHighlightEffects.d.ts +2 -0
  51. package/dist/types/components/controller/odd/OddViewManager.d.ts +7 -3
  52. package/dist/types/components/controller/odd/childHighlightStyles.d.ts +45 -3
  53. package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +8 -5
  54. package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +4 -4
  55. package/dist/types/components/controller/state/ControllerSession.d.ts +3 -3
  56. package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +10 -0
  57. package/dist/types/components/controller/state/YinYangControllerState.d.ts +20 -9
  58. package/dist/types/components/controller/types.d.ts +9 -2
  59. package/dist/types/components/controller/utils/actionCatalog.d.ts +1 -1
  60. package/dist/types/components/controller/utils/eventFieldTargets.d.ts +19 -13
  61. package/dist/types/components/controller/utils/keyEventPropagationContext.d.ts +4 -0
  62. package/dist/types/components/controller/utils/keyEventTargetBreakdowns.d.ts +4 -0
  63. package/dist/types/components/controller/utils/svgTransform.d.ts +16 -0
  64. package/dist/types/components/controls/VizControlsPanel.d.ts +3 -1
  65. package/dist/types/components/panel/PanelManager.d.ts +92 -22
  66. package/dist/types/components/search/GlobalSearchController.d.ts +13 -6
  67. package/dist/types/components/view/BorderDrawer.d.ts +40 -14
  68. package/dist/types/components/view/IdleTabGridDrawer.d.ts +15 -0
  69. package/dist/types/components/view/SpikeDrawer.d.ts +18 -0
  70. package/dist/types/components/view/ViewInitializer.d.ts +45 -7
  71. package/dist/types/components/view/YinYangDrawer.d.ts +132 -30
  72. package/dist/types/components/view/borderColorCycle.d.ts +76 -0
  73. package/dist/types/components/workspace/facetWeightRuleSetting.d.ts +10 -0
  74. package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
  75. package/dist/types/config/animationConfig.d.ts +10 -1
  76. package/dist/types/data/adverse-action-planner.d.ts +3 -3
  77. package/dist/types/data/amplifier-engine.d.ts +6 -6
  78. package/dist/types/data/key-event-effects.d.ts +30 -0
  79. package/dist/types/data/key-event-eligibility.d.ts +24 -0
  80. package/dist/types/data/key-event-propagation.d.ts +13 -0
  81. package/dist/types/data/key-event-types.d.ts +48 -0
  82. package/dist/types/data/key-event-validation.d.ts +11 -0
  83. package/dist/types/data/stability-shield.d.ts +14 -0
  84. package/dist/types/data/yasuni_adverse_key_events.d.ts +1 -1
  85. package/dist/types/data/yasuni_cause.d.ts +7 -0
  86. package/dist/types/data/yasuni_key_events.d.ts +4 -60
  87. package/dist/types/interfaces/ICauseModel.d.ts +10 -1
  88. package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -2
  89. package/dist/types/interfaces/IPropagationGraph.d.ts +14 -0
  90. package/dist/types/interfaces/IViewData.d.ts +10 -0
  91. package/dist/types/interfaces/IYinYangController.d.ts +25 -7
  92. package/dist/types/interfaces/IYinYangInternalModel.d.ts +5 -0
  93. package/dist/types/main.d.ts +0 -1
  94. package/dist/types/utils/actionIconFit.d.ts +23 -0
  95. package/dist/types/utils/actionPropagation.d.ts +6 -4
  96. package/dist/types/utils/causeMetrics.d.ts +29 -11
  97. package/dist/types/utils/chainCardHeight.d.ts +87 -4
  98. package/dist/types/utils/collapseAnimation.d.ts +39 -0
  99. package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +28 -5
  100. package/dist/types/utils/deltaChips.d.ts +0 -4
  101. package/dist/types/utils/exportControls.d.ts +8 -0
  102. package/dist/types/utils/facetWeightLabel.d.ts +6 -4
  103. package/dist/types/utils/facetteImages.d.ts +6 -0
  104. package/dist/types/utils/glowHalo.d.ts +74 -0
  105. package/dist/types/utils/hierBadge.d.ts +1 -1
  106. package/dist/types/utils/keyEventImages.d.ts +1 -1
  107. package/dist/types/utils/menuIconSize.d.ts +17 -0
  108. package/dist/types/utils/spreadAngles.d.ts +8 -0
  109. package/package.json +4 -1
  110. package/dist/bundle.js.LICENSE.txt +0 -1
@@ -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;
@@ -1,5 +1,23 @@
1
1
  import { ViewInitializer } from "./ViewInitializer";
2
2
  import { IYinOrYangPattern } from "../../interfaces/IYinOrYangPattern";
3
+ /**
4
+ * Exécute `draw` en différant l'ajustement des pastilles de poids
5
+ * (fitWeightPill) qu'il demande : toutes les mesures d'abord, toutes les
6
+ * écritures ensuite. Créer les satellites un à un alternait sinon écriture
7
+ * du DOM et getBBox, soit une mise en page complète par satellite.
8
+ */
9
+ export declare function batchWeightPillFits(draw: () => void): void;
10
+ /** Libellé qui reste droit pendant la rotation Yin/Yang (voir
11
+ * YinYangDrawer.getCounterRotatedLabels). */
12
+ export interface CounterRotatedLabel {
13
+ node: Element;
14
+ lobe: "yin" | "yang";
15
+ /** Pivot de la contre-rotation ; nul = origine locale du nœud. */
16
+ pivot: {
17
+ x: number;
18
+ y: number;
19
+ } | null;
20
+ }
3
21
  export declare class YinYangDrawer {
4
22
  private ViewInitializer;
5
23
  private yinYangGroup;
@@ -23,6 +41,9 @@ export declare class YinYangDrawer {
23
41
  * ViewInitializer.ghostDeltaBadgeSizeBoost pour l'agrandissement, réglable
24
42
  * en direct, appliqué au-delà de cette base. */
25
43
  private readonly GHOST_DELTA_BADGE_NUCLEUS_FILL;
44
+ /** Arcs d'onde des ODD et leur générateur, gardés d'une frame à l'autre
45
+ * tant que les entrées, le calque et la géométrie ne changent pas. */
46
+ private categoryArcGhostWaveCache;
26
47
  private categoryArcGhostEntries;
27
48
  private categoryArcGhostFrameId;
28
49
  private readonly CHILD_SCORE_BAND_FRACTION;
@@ -37,17 +58,24 @@ export declare class YinYangDrawer {
37
58
  private outerSparkStartTimeMs;
38
59
  private outerSparkPhaseMs;
39
60
  private outerSparkRotationDurationMs;
40
- private outerSparkCircumference;
61
+ /** Groupe tourné de l'étincelle et centre de sa rotation — lus par le
62
+ * timer, qui survit aux appels suivants de startOuterSparkAnimation. */
63
+ private outerSparkRotor;
64
+ private outerSparkCenter;
41
65
  private outerSparkLastAngleRad;
42
66
  private balanceSparkOnComplete;
43
67
  private readonly balanceSparkInstances;
44
68
  private balanceSparkTadpoleIdSeq;
45
69
  private readonly balanceSparkTadpoles;
46
70
  private balanceSparkTadpoleTimer;
71
+ /** Cible partagée des têtards (bas du conteneur), mesurée au plus toutes
72
+ * les 500 ms — voir tickBalanceSparkTadpoles. */
73
+ private balanceSparkTadpoleTarget;
47
74
  /** Cruising speed (px/ms) and cutoff (as a multiple of the main circle's
48
75
  * radius) for the lone-survivor drift — see the fragment block in
49
76
  * startBalanceSparkAnimation's timer. */
50
77
  private readonly BALANCE_SPARK_DRIFT_SPEED_PX_PER_MS;
78
+ private readonly BALANCE_SPARK_TADPOLE_MAX_AGE_MS;
51
79
  private readonly BALANCE_SPARK_DRIFT_INITIAL_SPEED_PX_PER_MS;
52
80
  private readonly BALANCE_SPARK_DRIFT_SPEED_EASE_MS;
53
81
  private readonly BALANCE_SPARK_DRIFT_TURN_RATE_RAD_PER_MS;
@@ -67,6 +95,14 @@ export declare class YinYangDrawer {
67
95
  private readonly BALANCE_SPARK_EMBER_PHASE_OFFSETS;
68
96
  private activeOddId;
69
97
  private hoverOddId;
98
+ private lobeNodes;
99
+ /** Vrai pendant updateSwitchFrame : les rendus partagés avec le rendu
100
+ * complet (libellés) n'y réordonnent pas leurs calques. */
101
+ private inSwitchFrame;
102
+ /** Suffixe des dégradés de fond des libellés ODD : unique par libellé, un
103
+ * libellé entrant ne doit pas reprendre l'id d'un autre encore en fondu
104
+ * de sortie (url(#id) désigne le premier du document). */
105
+ private oddLabelGradientSeq;
70
106
  /** Callback déclenché quand la souris entre/sort d'un arc ODD (lien inverse
71
107
  * vers les chips de la légende ODD du panneau de détail). */
72
108
  private _onOddArcHoverCb;
@@ -95,13 +131,14 @@ export declare class YinYangDrawer {
95
131
  */
96
132
  drawMainCircle(): void;
97
133
  /**
98
- * Draws and animates a short dash over a full circular stroke.
134
+ * Draws and animates the perimeter spark: a short arc (the spark itself)
135
+ * with its glow pre-rendered as wider translucent copies of the same arc
136
+ * (see glowHalo), all inside a "rotor" group turned by a single transform
137
+ * per frame.
99
138
  *
100
- * Illusion principle:
101
- * - stroke-dasharray is configured as: "visibleDash hiddenRemainder"
102
- * - so only a tiny segment is visible while the rest of the circumference is hidden
103
- * - changing stroke-dashoffset each frame shifts this dash around the perimeter,
104
- * creating a rotating spark without moving the circle itself.
139
+ * It used to be a full circle with a dash shifted by stroke-dashoffset
140
+ * under a double feGaussianBlur filter: every frame re-blurred a filter
141
+ * region five times the size of the whole circle.
105
142
  */
106
143
  private startOuterSparkAnimation;
107
144
  private clearOuterSpark;
@@ -209,10 +246,10 @@ export declare class YinYangDrawer {
209
246
  /** Ticks every still-drifting tadpole from every past shed batch — see
210
247
  * balanceSparkTadpoles' own doc comment — independently of whichever
211
248
  * spark instance(s) happen to be running right now, including none at
212
- * all. Tadpoles never expire — once spawned they keep swimming
213
- * (cruising speed, steering toward the shared target) indefinitely, so
214
- * in practice this timer runs for as long as any have ever been
215
- * shed. */
249
+ * all. Un têtard nage vers la cible partagée (bas du conteneur) et est
250
+ * retiré dès qu'il l'atteint : sans cela, il tournait indéfiniment autour
251
+ * d'elle, et le timer — avec une mesure du conteneur à chaque frame —
252
+ * ne s'arrêtait jamais après le premier lot lâché. */
216
253
  private tickBalanceSparkTadpoles;
217
254
  /**
218
255
  * Draws a semi-circle (black half) within the main Yin Yang circle.
@@ -222,6 +259,32 @@ export declare class YinYangDrawer {
222
259
  * Loops through both Yin and Yang groups and draws the respective symbols (small circles).
223
260
  */
224
261
  drawYinYangSymbols(): void;
262
+ /**
263
+ * Frame d'une transition de facette ou d'ODD
264
+ * (ViewInitializer.startComponentAnimationLoop) : réécrit EN PLACE les
265
+ * attributs interpolés des nœuds posés par le dernier rendu complet —
266
+ * rayon et centre des lobes, masques et dégradés des arcs, zones de clic,
267
+ * noyau, position des libellés ODD et score de la facette. Rien n'est
268
+ * ajouté ni retiré, le <defs> n'est pas purgé, et les libellés ne sont
269
+ * remesurés (getBBox) que si leur texte change.
270
+ *
271
+ * Ce qui ne dépend pas de l'interpolation (illustration idle, poids de la
272
+ * facette sur l'arc de bordure, bordures) reste au rendu complet, rejoué à
273
+ * la dernière frame.
274
+ *
275
+ * Renvoie false si les nœuds ne correspondent plus à la géométrie (autres
276
+ * catégories, nœuds détachés par un rendu complet extérieur, défs
277
+ * disparues…) ; l'appelant refait alors un rendu complet, qui repose tout.
278
+ */
279
+ updateSwitchFrame(): boolean;
280
+ private updateLobeAttributes;
281
+ /**
282
+ * Fond l'opacité d'un libellé vers `target`, sans relancer la transition
283
+ * si elle y va déjà. Relancée à chaque frame (transition de facette), une
284
+ * transition d'opacité ne progresse jamais : le libellé restait invisible
285
+ * tout le long de la bascule.
286
+ */
287
+ private fadeLabelTo;
225
288
  /**
226
289
  * Mode idle (racine, aucune facette sélectionnée) : le cercle principal
227
290
  * n'a aucune donnée pertinente à montrer (le yin/yang de base reste sur
@@ -331,6 +394,14 @@ export declare class YinYangDrawer {
331
394
  private clearGhostVisuals;
332
395
  private getOrCreateGhostMainCircle;
333
396
  private getAdaptiveWaveCount;
397
+ /**
398
+ * Cercles d'ondes d'un groupe ghost, avec les constantes qu'on leur a déjà
399
+ * écrites. Par frame, seuls `cy`, `r` et `stroke-opacity` varient : le reste
400
+ * (cx, fill, stroke, stroke-width) n'est réécrit que s'il change. Les nœuds
401
+ * sont gardés d'une frame à l'autre, et reconstruits depuis le DOM dès que
402
+ * l'un d'eux en est détaché (redessin complet du groupe).
403
+ */
404
+ private ghostWaveCache;
334
405
  private reconcileGhostWaves;
335
406
  private updateBasePulseAnimations;
336
407
  private updateBasePulseAnimationForType;
@@ -360,6 +431,9 @@ export declare class YinYangDrawer {
360
431
  * n'existait nulle part ailleurs et dont le signe était perdu.
361
432
  */
362
433
  private updateGhostDeltaBadge;
434
+ /** Enveloppe (repère local) des lignes du badge, avec la signature du
435
+ * contenu qu'elle mesure. Liée au nœud : elle disparaît avec lui. */
436
+ private ghostDeltaBadgeBoxes;
363
437
  private ghostDeltaBadgeSelector;
364
438
  /** Retire le badge d'un lobe. Nécessaire explicitement depuis que le badge
365
439
  * ne vit plus dans le groupe du ghost : il ne disparaît plus avec lui. */
@@ -369,6 +443,22 @@ export declare class YinYangDrawer {
369
443
  private getCircleNumericAttribute;
370
444
  private lerp;
371
445
  private shouldRenderGhost;
446
+ /** Ids des masques et dégradés posés dans le <defs> partagé par les arcs de
447
+ * catégorie de ce dessinateur. Déterministes (catégorie, lobe, calque), donc
448
+ * bornés ; sert à les retirer quand le satellite est détruit. */
449
+ private readonly ownedDefIds;
450
+ /** Retire du <defs> partagé ce que ce dessinateur y a posé. À appeler quand
451
+ * le satellite est détruit (clearChildren) : sans cela, chaque visite d'une
452
+ * facette laissait ses masques et dégradés dans le <defs>, qui ne
453
+ * redescendait jamais. */
454
+ releaseDefs(): void;
455
+ /**
456
+ * Fin de vie : arrête toutes les boucles du dessinateur (vagues et
457
+ * pulsation du ghost, étincelle du pourtour, étincelles d'équilibre et
458
+ * leurs têtards) et libère ses defs. N'écrit pas dans le DOM du diagramme :
459
+ * son conteneur est vidé par l'appelant.
460
+ */
461
+ destroy(): void;
372
462
  /**
373
463
  * Draws category-specific arcs with gradient fills and masks to represent different ODDs (Sustainable Development Goals).
374
464
  *
@@ -422,27 +512,36 @@ export declare class YinYangDrawer {
422
512
  */
423
513
  private shouldShowFacetteLabels;
424
514
  refreshOddArcLabelsVisibility(): void;
425
- refreshOddArcLabelsOrientation(): void;
515
+ /**
516
+ * Écrit la contre-rotation des labels des deux lobes en attribut, pour une
517
+ * orientation donnée de chaque lobe (en degrés) — à l'arrêt, la position
518
+ * de base. Pendant la rotation, ce sont des animations du navigateur
519
+ * (AnimationsMngr) qui contre-tournent les labels, par-dessus l'attribut.
520
+ */
521
+ refreshOddArcLabelsOrientation(lobeAngles: {
522
+ yin: number;
523
+ yang: number;
524
+ }): void;
525
+ private getLobeNode;
426
526
  private isArcVisibleForLabel;
427
527
  private renderOddArcLabels;
428
- private applyOddArcLabelCounterRotation;
429
- /**
430
- * Contre-tourne le score et le poids affichés en permanence dans le noyau
431
- * du lobe dominant — sur le cercle central (renderFacetteStateLabel/
432
- * renderFacetteWeightLabel) comme sur un satellite (renderChildStateLabel/
433
- * renderChildWeightLabel, un seul des deux paires existe selon isChild) —
434
- * même principe que applyOddArcLabelCounterRotation, mais appliqué
435
- * directement sur l'élément (pivot = sa propre position x/y) plutôt que
436
- * via un groupe wrapper : contrairement aux labels d'arc ODD, ces montants
437
- * sont déjà positionnés par des attributs x/y directs, donc une rotation
438
- * autour de ce même point annule l'orientation héritée du spin du lobe
439
- * sans déplacer le montant. Chaque satellite ayant son propre YinYangDrawer,
440
- * cette méthode tourne indépendamment pour chacun (voir AnimationsMngr, qui
441
- * l'appelle via component.view.yinYangDrawer pour le composant en train de
442
- * tourner, parent ou enfant).
443
- */
444
- private applyFacetteAmountLabelsCounterRotation;
445
- private getRotationAngleFromTransform;
528
+ /** Ce qui fixe le contenu et la taille d'un libellé d'arc ODD. */
529
+ private oddArcLabelKey;
530
+ /**
531
+ * Libellés qui restent droits pendant la rotation Yin/Yang, avec le pivot
532
+ * de leur contre-rotation. Les libellés d'arc ODD tournent autour de leur
533
+ * origine locale (`pivot` nul : leur groupe parent les place). Le score et
534
+ * le poids affichés en permanence dans le noyau du lobe dominant — sur le
535
+ * cercle central (renderFacetteStateLabel) comme sur un satellite
536
+ * (renderChildStateLabel/renderChildWeightLabel) — sont placés par des
537
+ * attributs x/y directs : une rotation autour de ce même point annule
538
+ * l'orientation héritée du spin du lobe sans déplacer le montant. Le poids
539
+ * de la facette n'est plus dans le lobe (voir renderFacetteWeightLabel) :
540
+ * il ne tourne pas, rien à compenser. AnimationsMngr anime chacun en sens
541
+ * inverse de son lobe ; chaque satellite a son propre YinYangDrawer.
542
+ */
543
+ getCounterRotatedLabels(): CounterRotatedLabel[];
544
+ private readLabelPivot;
446
545
  private getDisplayedArcAngles;
447
546
  /**
448
547
  * Ajuste la plaque sombre posée derrière un libellé d'arc à la taille
@@ -490,6 +589,9 @@ export declare class YinYangDrawer {
490
589
  private wrapTextByLines;
491
590
  private getOrCreateInteractiveArcLayer;
492
591
  private drawInteractiveArcZone;
592
+ /** Tracés d'une zone de clic d'arc ODD et de son liseré « actif » —
593
+ * partagés par le rendu complet et la frame de transition. */
594
+ private computeInteractiveArcPaths;
493
595
  /** Callback appelé quand la souris entre/sort d'un arc ODD du diagramme —
494
596
  * permet de surligner en retour le chip correspondant dans la légende ODD. */
495
597
  setOnOddArcHover(cb: (oddId: string | null) => void): void;
@@ -0,0 +1,76 @@
1
+ /** Instant clé du cycle (0..1) et couleurs des deux arrêts animés à cet instant. */
2
+ export type ColorCycleStep = {
3
+ at: number;
4
+ first: string;
5
+ last: string;
6
+ };
7
+ /**
8
+ * Valeurs parcourues par le premier et le dernier arrêt sur un cycle,
9
+ * à intervalles réguliers — les mêmes que l'ancienne animation SMIL : le
10
+ * premier arrêt parcourt les couleurs puis revient à la première ; le dernier
11
+ * suit la même boucle décalée d'un cran (il tient la première couleur sur le
12
+ * premier intervalle).
13
+ */
14
+ export declare function borderColorCycleValues(colors: readonly string[]): {
15
+ first: string[];
16
+ last: string[];
17
+ };
18
+ /** Couleur à l'instant `at` (0..1) d'une suite de valeurs équiréparties,
19
+ * interpolée en sRGB comme le faisait SMIL. */
20
+ export declare function sampleAt(values: readonly string[], at: number): string;
21
+ /**
22
+ * Instants clés du cycle (réunion de ceux des deux arrêts, 0 et 1 compris)
23
+ * et couleurs des deux arrêts à chacun. Le dernier pas (1) a les couleurs du
24
+ * premier (0) : la boucle se referme sans saut.
25
+ */
26
+ export declare function borderColorCycleSteps(colors: readonly string[]): ColorCycleStep[];
27
+ /**
28
+ * Opacités de la copie `k` (k ≥ 1) sur un cycle : invisible avant son fondu,
29
+ * de 0 à 1 entre les instants k − 1 et k, opaque tant qu'elle est le fond du
30
+ * fondu suivant, puis retirée quand la copie k + 1, opaque, la recouvre.
31
+ */
32
+ export declare function colorCycleLayerKeyframes(times: readonly number[], k: number): Keyframe[];
33
+ /**
34
+ * Cycle de couleurs d'un segment actif. Au repos : copies en fondu posées
35
+ * juste sous le segment dans son groupe (le segment garde contour, clics et
36
+ * survol, son propre remplissage est rendu transparent) ; les halos du
37
+ * segment restent dessous, voir `data-fill-under` dans glowHalo.syncShapeGlow.
38
+ * Diagramme actif (FrameScheduler.isActive) : copies retirées, arrêts du
39
+ * dégradé d'origine écrits à chaque image bridée.
40
+ */
41
+ export declare class BorderColorCycle {
42
+ private readonly segment;
43
+ private readonly durationMs;
44
+ readonly key: string;
45
+ private readonly group;
46
+ private readonly paths;
47
+ private animations;
48
+ private readonly times;
49
+ private readonly values;
50
+ private readonly firstStop;
51
+ private readonly lastStop;
52
+ /** Couleurs posées sur les deux arrêts du dégradé d'origine, rendues à la fin. */
53
+ private readonly restingColors;
54
+ private readonly startedAt;
55
+ private mainThreadFrameId;
56
+ private readonly unsubscribe;
57
+ static keyOf(colors: readonly string[], durationMs: number): string;
58
+ constructor(segment: SVGPathElement, gradient: SVGGradientElement, colors: readonly string[], durationMs: number);
59
+ /** Le segment est toujours dans le document (les copies, elles, en sont
60
+ * retirées quand le diagramme est actif). */
61
+ get isConnected(): boolean;
62
+ /** Recopie la forme du segment et réapplique le remplissage du mode courant
63
+ * (à rappeler quand l'appelant a restylé le segment). */
64
+ refresh(): void;
65
+ /** Suit le segment pendant qu'il change de largeur. */
66
+ setPath(d: string): void;
67
+ destroy(): void;
68
+ private syncGeometry;
69
+ /** Phase courante du cycle, en ms depuis son départ. */
70
+ private phaseMs;
71
+ private applyMode;
72
+ private startComposited;
73
+ private stopComposited;
74
+ private startMainThread;
75
+ private stopMainThread;
76
+ }
@@ -0,0 +1,10 @@
1
+ import { type FacetWeightRule } from "../../utils/causeMetrics";
2
+ /** Règle des poids de facette choisie dans le debug de la page standalone
3
+ * (voir `FacetWeightRule`) : mémorisée dans le navigateur, appliquée au
4
+ * démarrage — la lib npm, elle, reste en `mean`. */
5
+ export declare const FACET_WEIGHT_RULE_STORAGE_KEY = "spheres.facetWeightRule";
6
+ /** Lit la règle mémorisée (`mean` à défaut, ou si le stockage est
7
+ * inaccessible), l'applique et la renvoie. */
8
+ export declare function loadFacetWeightRule(): FacetWeightRule;
9
+ /** Mémorise la règle ; renvoie `false` si le stockage est inaccessible. */
10
+ export declare function saveFacetWeightRule(rule: FacetWeightRule): boolean;