@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
@@ -9,6 +9,8 @@ import { StackFocusController } from "../action-stack/StackFocusController";
9
9
  import { ComponentTitlePresenter } from "../labels/ComponentTitlePresenter";
10
10
  import type { ControllerUiCallbacks } from "../state/ControllerUiCallbacks";
11
11
  import { ChildrenOrbitManager } from "../odd/ChildrenOrbitManager";
12
+ /** Écart (px, repère du motif) entre deux satellites voisins d'un anneau. */
13
+ export declare const SATELLITE_RING_GAP_PX = 6;
12
14
  export type ChildrenBuilderDeps = {
13
15
  animateChildren: (show: boolean) => Promise<void>;
14
16
  applyChildrenOrbitTransforms: (angleOffset: number, orbitData?: ChildrenOrbitEntry[]) => void;
@@ -29,6 +31,8 @@ export type ChildrenBuilderDeps = {
29
31
  getCurrentComponentOrUndefined: () => YinYangInternalModel["components"][number] | undefined;
30
32
  getKey: () => string;
31
33
  renderOppositeChildrenForceField: (orbitData?: ChildrenOrbitEntry[], angleOffset?: number) => void;
34
+ /** Exécute `run` sans rendu du champ de force (les appels sont ignorés). */
35
+ suppressForceFieldRender: (run: () => void) => void;
32
36
  getRotationState: () => {
33
37
  clockWise: boolean;
34
38
  durationMs: number;
@@ -56,28 +60,21 @@ export declare class ChildrenBuilder {
56
60
  * baseline radius, independent of any satellite's own weight-scaled
57
61
  * radius — mirrors ChildActionMenuController's action cluster geometry. */
58
62
  private getChildActionClusterReach;
59
- /** Décalage constant appliqué au poids ET à sa moyenne avant de calculer le
60
- * ratio de taille d'un satellite (voir weightToSizeRatio) : resserre la
61
- * fourchette de tailles (poids min moins minuscule, poids max un peu
62
- * moins dominant) sans changer la taille d'un satellite au poids moyen
63
- * exact (ratio toujours 1 dans ce cas), et sans dépendre du poids moyen
64
- * de la fratrie pour l'ampleur du resserrement. */
65
- private static readonly WEIGHT_SIZE_FLOOR_OFFSET;
66
- /** Ratio de taille d'un satellite (rayon relatif à la baseline uniforme de
67
- * sa facette) à partir de son poids et du poids moyen de sa fratrie —
68
- * voir WEIGHT_SIZE_FLOOR_OFFSET pour le resserrement. */
69
- private static weightToSizeRatio;
70
- /** Ratio of a component's heaviest satellite radius to its own uniform
71
- * baseline radius. Mirrors the per-cutting weight-based scaling applied
72
- * in createYinYangChildren(). */
73
- private getMaxWeightRatio;
74
- /** The container-fit shrink ratio only depends on borderOuterRadius/
75
- * smallCircleRadius/distanceFromChild, which are fixed for the whole
76
- * session once this top-level view is first initialized (they don't get
77
- * recomputed on facette switch) — so this is computed once (on the worst
78
- * case weight ratio across every facette) and cached. That's what keeps
79
- * the whole diagram's size from visibly changing every time the user
80
- * switches facette. */
63
+ /** Ratio de taille d'un satellite (rayon relatif à la taille de base,
64
+ * ViewInitializer.smallCircleRadius) : sur son poids ABSOLU, le même pour
65
+ * la cause et pour la sphère d'un personnage — un satellite de poids 7 a
66
+ * la même taille dans tous les diagrammes, quels que soient ses voisins.
67
+ * `(poids + 1) / (référence + 1)` : 1 au poids de référence (5), 1/6 au
68
+ * poids nul (un satellite vide reste visible), 11/6 au poids maximal. */
69
+ static weightToSizeRatio(weight: number): number;
70
+ /** Ratio de taille du satellite le plus lourd possible (poids maximal). */
71
+ static readonly MAX_SIZE_RATIO: number;
72
+ /** Réduction d'ensemble qui fait tenir l'anneau de satellites dans le
73
+ * conteneur. Elle ne dépend que de la géométrie du motif (rayon, taille
74
+ * de base, orbite), pas des données : elle réserve la place du satellite
75
+ * le plus lourd possible, si bien que le cercle central occupe la même
76
+ * part du conteneur dans tous les diagrammes, et qu'aucune évolution des
77
+ * poids en cours de partie ne fait déborder l'anneau. Calculée une fois. */
81
78
  private cachedGlobalFitShrinkRatio?;
82
79
  private computeGlobalFitShrinkRatio;
83
80
  applyChildrenFitScale(): void;
@@ -32,10 +32,12 @@ export type ComponentSwitchCoordinatorDeps = {
32
32
  cuttingIndex: number;
33
33
  }>;
34
34
  clearActiveChild: () => void;
35
- clearChildren: () => void;
36
35
  createYinYangChildren: () => void;
37
36
  detailsPresenter: ForceFieldDetailsPresenter;
38
37
  disableOuterSpark: () => void;
38
+ /** Réaligne le sous-état Idle (arcs / facettes) : ce chemin quitte Idle
39
+ * sans passer par setChildrenEnabled(). */
40
+ syncIdleView: () => void;
39
41
  eventFieldLifecycleController: EventFieldLifecycleController;
40
42
  eventFieldRenderer: EventFieldRenderer;
41
43
  focusChildByOddCutting: (oddId: string, cuttingIndex: number, forceOpen?: boolean) => void;
@@ -0,0 +1,205 @@
1
+ import { IYinYangView } from "../../../interfaces/IYinYangView";
2
+ import { IYinYangController } from "../../../interfaces/IYinYangController";
3
+ import { IYinYangAppFactory } from "../../../interfaces/IYinYangAppFactory";
4
+ import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
5
+ import { IdleView, YinYangControllerState } from "../state/YinYangControllerState";
6
+ import { FacetModulation, FacetModulationOptions } from "./facetModulation";
7
+ /** Crochets de l'hôte autour du sous-état « tab » — voir
8
+ * `IYinYangController.setIdleTabHooks`. */
9
+ export type IdleTabHooks = {
10
+ /** Avant le calcul de la grille (l'hôte peut agrandir le conteneur du
11
+ * diagramme) ; la grille attend sa résolution. */
12
+ beforeEnter?: () => Promise<void> | void;
13
+ /** Une fois les satellites revenus à leur place radiale. */
14
+ afterLeave?: () => Promise<void> | void;
15
+ };
16
+ export type IdleFacettesControllerDeps = {
17
+ view: IYinYangView;
18
+ state: YinYangControllerState;
19
+ factory: IYinYangAppFactory;
20
+ getKey: () => string;
21
+ getInternalModel: () => YinYangInternalModel;
22
+ setChildrenHiddenState: (children: IYinYangController[], hidden: boolean) => void;
23
+ animateChildren: (children: IYinYangController[], show: boolean) => Promise<void>;
24
+ applyChildrenFitScale: () => void;
25
+ /** Double-clic sur un satellite-facette : ouvre cette Facette, comme son arc. */
26
+ openFacette: (componentIndex: number, componentId: string) => void;
27
+ /** Clic sur un satellite-facette : déploie/replie ses Événements Clés. */
28
+ onSatelliteClick: (componentId: string) => void;
29
+ /** En Idle « tab » : sélectionne la facette pour le titre (sans déployer les bulles). */
30
+ selectKeyEventFacetteForTab: (componentId: string) => void;
31
+ /** Double-clic, juste avant d'ouvrir la Facette : annule l'effet de bord
32
+ * du premier clic sur l'aperçu en cours. */
33
+ onSatelliteDoubleClick: () => void;
34
+ /** Satellites-facettes sortis (fin d'animation) : les bulles et le souffle
35
+ * peuvent s'y accrocher. */
36
+ onSatellitesShown: () => void;
37
+ /** Satellites-facettes rentrés : leurs bulles rentrent avec eux. */
38
+ onSatellitesHidden: () => void;
39
+ onIdleViewChange?: (view: IdleView) => void;
40
+ };
41
+ /**
42
+ * Sous-états Idle « facettes » et « tab » : les arcs de bordure rentrent
43
+ * sous l'illustration, et chaque facette en ressort sous la forme d'un
44
+ * satellite montrant son propre yin/yang, dimensionné selon son poids.
45
+ * - « facettes » : à l'angle du milieu de son arc ;
46
+ * - « tab » : dans une grille régulière (voir idleTabLayout), l'illustration
47
+ * réduite au centre, l'image de la facette en fond de sa case et les
48
+ * facettes d'une même notion parente regroupées (IdleTabGridDrawer).
49
+ *
50
+ * Les satellites sortent toujours à leur place radiale ; « tab » les y
51
+ * reprend pour les faire glisser jusqu'à leur case (idleTabMorph), et
52
+ * inversement — la grille n'est qu'une transformation posée sur eux.
53
+ *
54
+ * Les satellites-facettes vivent à part des satellites de cutting d'une
55
+ * Facette (childControllers) : ni champ de force, ni menu d'action, ni
56
+ * orbite ne les concernent. Les transitions sont sérialisées — chaque étape
57
+ * relit l'état voulu au moment de s'exécuter, de sorte que des bascules
58
+ * rapprochées convergent vers le dernier état demandé sans se chevaucher.
59
+ */
60
+ export declare class IdleFacettesController {
61
+ private deps;
62
+ private satellites;
63
+ private satelliteByComponentId;
64
+ /** Disposition des satellites-facettes actuellement sortis (null : aucun). */
65
+ private shownLayout;
66
+ /** Grille en place (sous-état « tab ») et échelle du motif à rétablir en
67
+ * revenant à la disposition radiale. */
68
+ private tab;
69
+ /** Groupe enveloppe de chaque satellite-facette (porte la grille). */
70
+ private wrappers;
71
+ /** Position et facteur d'échelle posés par la grille, par satellite. */
72
+ private tabPlacement;
73
+ private readonly tabGrid;
74
+ private tabHooks;
75
+ /** Vrai une fois les satellites-facettes arrivés à leur place (fin de
76
+ * l'animation de sortie) : les bulles n'ont de point d'ancrage qu'alors. */
77
+ private settled;
78
+ private queue;
79
+ private escapeListener;
80
+ /** Modulation de la signature par un contact (OBS-UI-01), voir
81
+ * setModulation ; null : chaque satellite montre son propre modèle. */
82
+ private modulation;
83
+ private modulationOptions;
84
+ /** Géométrie radiale de l'anneau, calculée à la sortie sur les poids du
85
+ * MODÈLE (O_f d'une signature) : la modulation change les tailles,
86
+ * jamais les places ni l'échelle. */
87
+ private ring;
88
+ /** Par satellite : clé de son affichage, son diamètre au poids du modèle
89
+ * et son diamètre réel (modulé). */
90
+ private displays;
91
+ /** Fantôme de signature de chaque satellite modulé (dans son enveloppe). */
92
+ private ghosts;
93
+ /** Détruit : les transitions encore en file n'ont plus rien à faire (sans
94
+ * quoi un diagramme démonté puis remonté dans le même conteneur — double
95
+ * montage d'un hôte React en développement — y recevait les satellites
96
+ * du premier, sortis après coup). */
97
+ private destroyed;
98
+ constructor(deps: IdleFacettesControllerDeps);
99
+ setTabHooks(hooks: IdleTabHooks | null): void;
100
+ getView(): IdleView;
101
+ /** Vrai dès qu'un sous-état à satellites-facettes (« facettes » ou
102
+ * « tab ») est l'état visé en Idle (arcs repliés ou en train de l'être). */
103
+ isActive(): boolean;
104
+ setView(requested: IdleView): Promise<void>;
105
+ /** Centre et rayon du satellite-facette d'une facette, une fois sorti. */
106
+ getSatelliteAnchor(componentId: string): {
107
+ center: {
108
+ x: number;
109
+ y: number;
110
+ };
111
+ radius: number;
112
+ } | null;
113
+ toggleView(): Promise<void>;
114
+ /** Aligne l'affichage sur l'état voulu (Idle + sous-état). À appeler à
115
+ * chaque entrée/sortie d'Idle. */
116
+ sync(): Promise<void>;
117
+ private isIdle;
118
+ /** Vrai pour une Cause sans score (signature d'obstacle). */
119
+ private isScorelessModel;
120
+ /**
121
+ * Superpose à la signature la lecture d'un contact (OBS-UI-01) — ou la
122
+ * retire (`null`). Chaque satellite-facette concerné prend le diamètre de
123
+ * W_f et la chance Q_f, à partir de sa taille courante (animation de
124
+ * `durationMs`) ; un fantôme garde le diamètre du poids du modèle (O_f).
125
+ * Les places et l'échelle restent celles du modèle : revenir à la
126
+ * signature puis réappliquer le même contact redonne exactement le même
127
+ * dessin. Appliquée en file avec les bascules de sous-état ; hors
128
+ * « facettes »/« tab », elle est mémorisée pour la prochaine sortie.
129
+ */
130
+ setModulation(modulation: FacetModulation | null, options?: FacetModulationOptions): Promise<void>;
131
+ private applyModulation;
132
+ private displayOf;
133
+ private wantedLayout;
134
+ private applyDesiredState;
135
+ /** Arcs repliés sous l'illustration, puis satellites jaillissant du centre
136
+ * jusqu'à leur place radiale. */
137
+ private show;
138
+ /** Satellites rentrant au centre, puis arcs ressortant jusqu'au bord. */
139
+ private hide;
140
+ /** Les satellites glissent de leur place radiale à leur case ; dans le même
141
+ * mouvement, l'illustration rapetisse, l'anneau d'images s'efface (chaque
142
+ * case porte la sienne) et la grille apparaît. */
143
+ private morphToTab;
144
+ /** Mouvement inverse : chaque satellite regagne sa place radiale. */
145
+ private morphToRadial;
146
+ private morph;
147
+ private patternCenter;
148
+ /** Place radiale d'un satellite, dans le repère du motif. */
149
+ private radialPlace;
150
+ /** Satellites à leur place : les bulles peuvent s'y accrocher. */
151
+ private settle;
152
+ /** Satellites en mouvement : leurs bulles rentrent. */
153
+ private unsettle;
154
+ /** Mise en page de la grille, dans le repère du SVG : sur toute la place
155
+ * que le conteneur du diagramme offre autour de l'illustration (le SVG
156
+ * déborde visiblement), au moins sur le carré du SVG. */
157
+ private computeTabLayout;
158
+ /** Plus grand rectangle centré sur l'illustration qui tienne dans le
159
+ * conteneur du SVG, padding exclu, en unités du SVG (le conteneur peut
160
+ * être mis à l'échelle par l'hôte : on ramène ses dimensions à celles du
161
+ * SVG). */
162
+ private tabArea;
163
+ private fadeImageRing;
164
+ /** Ratio de taille de chaque satellite-facette : sur le poids de sa
165
+ * facette (C_f), ramené à l'échelle d'un satellite [0, WEIGHT_MAX] — tel
166
+ * quel en règle `mean`, divisé par le nombre de satellites en règle `sum`
167
+ * — pour la même règle de taille que les satellites d'une Facette. */
168
+ private computeSizeRatios;
169
+ private createSatellites;
170
+ /** Angles et resserrement de l'anneau, sur les poids du modèle. */
171
+ private computeRing;
172
+ /** Crée le satellite-facette d'une composante, à sa place dans l'anneau,
173
+ * selon son affichage (ordinaire, signature, modulé). */
174
+ private createSatellite;
175
+ /**
176
+ * Remplace un satellite-facette par celui de son nouvel affichage, SUR
177
+ * PLACE : même enveloppe de grille, même centre. Le nouveau part de la
178
+ * taille de l'ancien et gagne la sienne (O_f → W_f, ou retour) pendant
179
+ * que l'ancien s'efface ; sans durée, d'un coup.
180
+ */
181
+ private replaceSatellite;
182
+ /** Fantôme de signature d'un satellite modulé plus petit que son poids
183
+ * de modèle : contour au diamètre de O_f, dans son enveloppe (il suit la
184
+ * grille). Retiré sinon. */
185
+ private refreshGhost;
186
+ /** Glisse un groupe enveloppe entre le satellite et le groupe des enfants
187
+ * du motif : il porte la transformation de la grille, sans interférer
188
+ * avec celles que d'autres posent sur le satellite lui-même. */
189
+ private wrap;
190
+ private attachClickHandler;
191
+ /** Double-clic. Le sous-état « facettes » reste mémorisé : refermer la
192
+ * Facette y ramène.
193
+ * On replie d'abord les satellites-facettes et on redéploie les arcs (la
194
+ * Facette met en valeur l'arc actif), puis on ouvre la Facette. */
195
+ private openFacette;
196
+ /** Détache les satellites-facettes courants (pour les faire rentrer puis
197
+ * les détruire) et prévient que leurs bulles doivent rentrer avec eux. */
198
+ private takeSatellites;
199
+ /** Fin de vie : satellites-facettes détruits sur place (sans animation de
200
+ * rentrée), grille retirée, écouteur Échap détaché. */
201
+ destroy(): void;
202
+ private destroySatellites;
203
+ private attachEscapeListener;
204
+ private detachEscapeListener;
205
+ }
@@ -0,0 +1,49 @@
1
+ import { YinYangComponentNode } from "../../../interfaces/IYinYangInternalModel";
2
+ /**
3
+ * MODULATION d'une signature par un contact (OBS-UI-01) : pour chaque
4
+ * facette (id de composante), le poids W_f que la signature prend face à ce
5
+ * contact (0–10) et la qualité Q_f du contact (0–100), sa chance de
6
+ * réussir cette facette. L'hôte fournit les valeurs : la lib ne fait que
7
+ * les montrer (diamètre sur W_f, pourcentage Q_f, fantôme sur le poids du
8
+ * modèle, O_f).
9
+ */
10
+ export type FacetModulation = {
11
+ weights: Record<string, number>;
12
+ scores: Record<string, number>;
13
+ };
14
+ export type FacetModulationOptions = {
15
+ /** Durée de l'animation des diamètres (ms) ; 0 : immédiat (défaut). */
16
+ durationMs?: number;
17
+ /** Vague entre satellite et fantôme ; à couper en mouvement réduit.
18
+ * Défaut : false. */
19
+ ghostWaves?: boolean;
20
+ };
21
+ /** Ce qu'un satellite-facette montre. */
22
+ export type FacetDisplay =
23
+ /** Ses propres score et poids (diagramme ordinaire). */
24
+ {
25
+ kind: "ordinary";
26
+ }
27
+ /** Poids seul, sans score (signature d'obstacle). */
28
+ | {
29
+ kind: "signature";
30
+ }
31
+ /** Poids modulé W_f et qualité Q_f d'un contact. */
32
+ | {
33
+ kind: "modulated";
34
+ weight: number;
35
+ quality: number;
36
+ };
37
+ /** Poids d'une facette du modèle (O_f pour une signature, C_f sinon). */
38
+ export declare function componentWeight(component: YinYangComponentNode): number;
39
+ /**
40
+ * Affichage d'une facette. Une facette sans exigence (poids nul) d'une
41
+ * signature reste sans score même modulée : W_f y est nul, elle n'entre
42
+ * dans aucun tirage — lui montrer une chance serait faux.
43
+ */
44
+ export declare function resolveFacetDisplay(component: YinYangComponentNode, scoreless: boolean, modulation: FacetModulation | null): FacetDisplay;
45
+ /** Clé d'égalité d'un affichage (un satellite inchangé n'est pas refait). */
46
+ export declare function facetDisplayKey(display: FacetDisplay): string;
47
+ /** La facette portant la qualité Q_f d'un contact : tous ses satellites
48
+ * à la même tension, si bien que sa qualité (moyenne pondérée) vaut Q_f. */
49
+ export declare function withQuality(component: YinYangComponentNode, quality: number): YinYangComponentNode;
@@ -0,0 +1,95 @@
1
+ export type IdleTabFacet = {
2
+ id: string;
3
+ label: string;
4
+ orientation: "yin" | "yang";
5
+ notion?: {
6
+ id: string;
7
+ name: string;
8
+ };
9
+ /** Ratio de taille du satellite (même calcul qu'en Idle « facettes »). */
10
+ sizeRatio: number;
11
+ };
12
+ export type IdleTabRect = {
13
+ x: number;
14
+ y: number;
15
+ width: number;
16
+ height: number;
17
+ };
18
+ export type IdleTabCell = IdleTabRect & {
19
+ facetId: string;
20
+ label: string;
21
+ orientation: "yin" | "yang";
22
+ /** Centre du satellite. */
23
+ satelliteCenter: {
24
+ x: number;
25
+ y: number;
26
+ };
27
+ /** Diamètre du satellite (minEdge, en pixels). */
28
+ satelliteDiameter: number;
29
+ /** Ligne de base du libellé de la facette. */
30
+ labelAnchor: {
31
+ x: number;
32
+ y: number;
33
+ };
34
+ /** La pastille de notion du groupe se pose sur le bord bas (sinon haut) :
35
+ * le libellé de la facette s'écarte alors vers l'intérieur. */
36
+ legendBottom: boolean;
37
+ /** La case borde-t-elle son groupe en haut / en bas (coins arrondis,
38
+ * libellé de la notion posé sur ce bord) ? */
39
+ groupEdges: {
40
+ top: boolean;
41
+ bottom: boolean;
42
+ };
43
+ /** Notion parente du groupe de la case, si elle en a une. */
44
+ notion?: {
45
+ id: string;
46
+ name: string;
47
+ };
48
+ };
49
+ export type IdleTabGroup = IdleTabRect & {
50
+ facetIds: string[];
51
+ /** Notion parente : son libellé se pose sur la bordure du groupe. */
52
+ notion?: {
53
+ id: string;
54
+ name: string;
55
+ };
56
+ /** Bordure qui porte le libellé de la notion (côté extérieur). */
57
+ legendSide: "top" | "bottom";
58
+ };
59
+ export type IdleTabLayout = {
60
+ columns: number;
61
+ rows: number;
62
+ cells: IdleTabCell[];
63
+ groups: IdleTabGroup[];
64
+ center: {
65
+ x: number;
66
+ y: number;
67
+ };
68
+ /** Rayon de l'illustration centrale réduite. */
69
+ centerRadius: number;
70
+ /** Taille de police des libellés de facette (px). */
71
+ labelFontSize: number;
72
+ };
73
+ export type IdleTabLayoutOptions = {
74
+ /** Coin haut-gauche de l'espace disponible (défaut : 0, 0). */
75
+ x?: number;
76
+ y?: number;
77
+ width: number;
78
+ height: number;
79
+ /** Marge autour de la grille. */
80
+ padding?: number;
81
+ /** Écart entre deux groupes voisins. */
82
+ gutter?: number;
83
+ };
84
+ type Unit = {
85
+ facets: IdleTabFacet[];
86
+ notion?: {
87
+ id: string;
88
+ name: string;
89
+ };
90
+ };
91
+ /** Facettes d'une même notion regroupées (ordre de première apparition),
92
+ * yin avant yang au sein d'un groupe. */
93
+ export declare function buildIdleTabUnits(facets: readonly IdleTabFacet[]): Unit[];
94
+ export declare function computeIdleTabLayout(facets: readonly IdleTabFacet[], options: IdleTabLayoutOptions): IdleTabLayout;
95
+ export {};
@@ -0,0 +1,45 @@
1
+ /** Centre et diamètre d'un satellite. */
2
+ export type MorphPoint = {
3
+ x: number;
4
+ y: number;
5
+ d: number;
6
+ };
7
+ export type MorphItem = {
8
+ /** Groupe enveloppe du satellite, qui porte la transformation. */
9
+ wrapper: SVGGElement;
10
+ /** Place radiale du satellite dans le repère du motif (avant réduction). */
11
+ base: MorphPoint;
12
+ /** Départ et arrivée, en pixels du SVG. */
13
+ from: MorphPoint;
14
+ to: MorphPoint;
15
+ };
16
+ type Center = {
17
+ x: number;
18
+ y: number;
19
+ };
20
+ /** Place à l'écran (pixels du SVG) d'un point du motif réduit à `scale`. */
21
+ export declare function toScreen(point: MorphPoint, scale: number, center: Center): MorphPoint;
22
+ /** Transformation de l'enveloppe qui amène le satellite de sa place
23
+ * radiale `base` à `screen`, le motif étant réduit à `scale`. */
24
+ export declare function wrapperTransform(base: MorphPoint, screen: MorphPoint, scale: number, center: Center): {
25
+ x: number;
26
+ y: number;
27
+ k: number;
28
+ transform: string;
29
+ };
30
+ /** Point entre `from` (t = 0) et `to` (t = 1), sur une trajectoire polaire
31
+ * autour de `center`. */
32
+ export declare function polarLerp(from: MorphPoint, to: MorphPoint, t: number, center: Center): MorphPoint;
33
+ /** Joue la bascule : échelle du motif de `fromScale` à `toScale` (posée par
34
+ * `applyScale`), chaque satellite de `from` à `to`. */
35
+ export declare function morphSatellites(options: {
36
+ /** Nœud qui porte la transition (le globalGroup du motif). */
37
+ node: SVGGElement;
38
+ center: Center;
39
+ fromScale: number;
40
+ toScale: number;
41
+ items: readonly MorphItem[];
42
+ durationMs: number;
43
+ applyScale: (scale: number) => void;
44
+ }): Promise<void>;
45
+ export {};
@@ -0,0 +1,10 @@
1
+ import { IYinYangController } from "../../../interfaces/IYinYangController";
2
+ /**
3
+ * Apparence d'un satellite-facette SANS SCORE (signature d'obstacle,
4
+ * OBS-UI-01) : un disque neutre, liseré de la couleur de sa catégorie, et
5
+ * sa pastille de poids — ni lobes yin/yang ni pourcentage, puisqu'un
6
+ * obstacle n'a pas de qualité. Le marquage `data-scoreless` tait le reste
7
+ * (styles/signature.css) ; le disque est posé dans le cœur, qui porte
8
+ * aussi l'animation de sortie du satellite.
9
+ */
10
+ export declare function applyScorelessLook(satellite: IYinYangController): void;
@@ -28,6 +28,18 @@ type EventFieldLifecycleControllerDeps = {
28
28
  center: Point | null;
29
29
  radius: number;
30
30
  };
31
+ /** Vrai en Idle « facettes » : le souffle relie alors le satellite-facette
32
+ * d'origine aux autres satellites-facettes atteints — pas de satellite de
33
+ * cutting à viser, et getComponentBorderTargetPoint résout chaque facette
34
+ * vers son satellite-facette. */
35
+ isIdleFacettesField: () => boolean;
36
+ /** Vrai pendant l'animation de changement de facette (clic sur un arc,
37
+ * navigation RECHERCHE ou pile) — voir refreshTargets. */
38
+ isComponentSwitching: () => boolean;
39
+ /** Vrai quand le champ est piloté par les événements cochés de la pile
40
+ * (mode STACK, aucun aperçu) : seuls les satellites réellement amplifiés
41
+ * sont alors visés (voir buildEventFieldTargets, stackEffects). */
42
+ isStackDrivenField: () => boolean;
31
43
  };
32
44
  /**
33
45
  * Cycle de vie du "Champ d'événement" (souffle cœur → satellites de
@@ -99,6 +111,8 @@ export declare class EventFieldLifecycleController {
99
111
  * frame par startEventFieldAnimation (orbite + pulsation). */
100
112
  private updateEventFieldVisual;
101
113
  private startEventFieldAnimation;
114
+ /** Fin de vie : coupe la boucle du champ d'événement. */
115
+ destroy(): void;
102
116
  private stopEventFieldAnimation;
103
117
  }
104
118
  export {};
@@ -7,8 +7,8 @@ export type Point = {
7
7
  * ce renderer ne fait que dessiner. */
8
8
  export type EventFieldRenderSegment = {
9
9
  end: Point;
10
- /** Bonus de score de l'Événement Clé — pilote l'épaisseur du souffle. */
11
- scoreBonus: number;
10
+ /** Intensité positionnelle commune aux cinq signatures — épaisseur du souffle. */
11
+ intensity: number;
12
12
  };
13
13
  /**
14
14
  * Chorégraphie du "Champ d'événement" : un souffle annulaire. Le cœur du
@@ -34,7 +34,7 @@ export declare class EventFieldRenderer {
34
34
  private coreHalo;
35
35
  /** setTimeout id du fondu de sortie en cours, ou null — voir hide(). */
36
36
  private _hideTimeoutId;
37
- /** requestAnimationFrame id de la rétraction géométrique en cours — voir retractGeometry(). */
37
+ /** Id frameScheduler de la rétraction géométrique en cours — voir retractGeometry(). */
38
38
  private _retractFrameId;
39
39
  hasActiveGroup(): boolean;
40
40
  ensureElements(params: {
@@ -0,0 +1,99 @@
1
+ type Point = {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ export type StopData = Array<{
6
+ color: string;
7
+ opacity: number;
8
+ }>;
9
+ /** Un faisceau, tel que peint sur une image (repère du globalGroup). */
10
+ export type ForceFieldStroke = {
11
+ start: Point;
12
+ end: Point;
13
+ /** Extrémités des dégradés (énergie, comète, cœur). */
14
+ tail: Point;
15
+ head: Point;
16
+ /** Atténuation du faisceau (emphase de l'action en focus), 0..1. */
17
+ emphasis: number;
18
+ glow: {
19
+ color: string;
20
+ alpha: number;
21
+ baseWidth: number;
22
+ };
23
+ /** Cône d'aura : trapèze sur l'axe start → end, demi-largeurs aux deux bouts. */
24
+ cone: {
25
+ sourceHalf: number;
26
+ targetHalf: number;
27
+ fill: string;
28
+ opacity: number;
29
+ };
30
+ energy: {
31
+ stops: StopData;
32
+ width: number;
33
+ opacity: number;
34
+ dashOffset: number;
35
+ };
36
+ flow: {
37
+ width: number;
38
+ opacity: number;
39
+ dashOffset: number;
40
+ };
41
+ core: {
42
+ stops: StopData;
43
+ width: number;
44
+ opacity: number;
45
+ };
46
+ port: {
47
+ r: number;
48
+ width: number;
49
+ color: string;
50
+ opacity: number;
51
+ };
52
+ headAura: {
53
+ r: number;
54
+ fill: string;
55
+ opacity: number;
56
+ };
57
+ headCore: {
58
+ r: number;
59
+ opacity: number;
60
+ };
61
+ };
62
+ export declare const COMET_PERIOD: number;
63
+ export declare class ForceFieldCanvasPainter {
64
+ readonly globalGroup: SVGGElement;
65
+ private readonly host;
66
+ private readonly canvas;
67
+ private readonly ctx;
68
+ private readonly resizeObserver;
69
+ /** Coin haut-gauche de la zone peinte, en unités du globalGroup. */
70
+ private originX;
71
+ private originY;
72
+ /** Pixels du canvas par unité du globalGroup. */
73
+ private pxPerUnit;
74
+ /** Repère pour lequel la zone a été calée ; null = à recaler. */
75
+ private laidOutKey;
76
+ private readonly glowLayersByAlpha;
77
+ constructor(globalGroup: SVGGElement);
78
+ /** Repasse au-dessus des autres enfants du globalGroup. */
79
+ raise(): void;
80
+ /** Opacité de toute la couche, avec une transition CSS éventuelle. */
81
+ setOpacity(value: string, transition?: string): void;
82
+ remove(): void;
83
+ paint(strokes: readonly ForceFieldStroke[]): void;
84
+ private paintStroke;
85
+ /**
86
+ * Empreinte du repère de la zone peinte : transforms du globalGroup et de
87
+ * ses ancêtres jusqu'au <svg>, viewBox, densité d'écran. Quelques
88
+ * getAttribute par image, sans layout forcé ; la taille du <svg> est
89
+ * suivie à part (ResizeObserver).
90
+ */
91
+ private layoutKey;
92
+ private ensureLayout;
93
+ /** Cale la zone peinte sur le <svg> visible. Faux si pas encore mesurable. */
94
+ private layout;
95
+ private glowLayers;
96
+ private line;
97
+ private gradient;
98
+ }
99
+ export {};
@@ -1,8 +1,13 @@
1
+ import type { ActionStackItem } from "../action-stack/ActionStackState";
1
2
  import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
2
3
  import type { CompiledPropagationGraph } from "../../../interfaces/IPropagationGraph";
3
4
  import { ChildrenOrbitEntry } from "../utils/childrenOrbit";
4
5
  import { ForceFieldLink, ForceFieldLinkDetail } from "./types";
5
6
  export declare class ForceFieldComputationService {
7
+ private readonly getEventContextItems;
8
+ constructor(getEventContextItems?: () => ActionStackItem[]);
9
+ eventContextCacheKey(): string;
10
+ private resolveDetails;
6
11
  build(params: {
7
12
  orbitData: ChildrenOrbitEntry[];
8
13
  sourceChildIndex: number;
@@ -15,6 +20,8 @@ export declare class ForceFieldComputationService {
15
20
  allComponents: YinYangInternalModel["components"] | undefined;
16
21
  actionDelta: number;
17
22
  propagationGraph: CompiledPropagationGraph;
23
+ eventContextItems?: ActionStackItem[];
24
+ actionItem?: ActionStackItem;
18
25
  }): {
19
26
  links: ForceFieldLink[];
20
27
  allLinkDetails: ForceFieldLinkDetail[];
@@ -31,6 +38,8 @@ export declare class ForceFieldComputationService {
31
38
  allComponents: YinYangInternalModel["components"] | undefined;
32
39
  actionDelta: number;
33
40
  propagationGraph: CompiledPropagationGraph;
41
+ eventContextItems?: ActionStackItem[];
42
+ actionItem?: ActionStackItem;
34
43
  }): {
35
44
  links: ForceFieldLink[];
36
45
  allLinkDetails: ForceFieldLinkDetail[];