@micheeeeel/yinyangapp 1.0.6 → 2.0.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 (118) hide show
  1. package/README.md +105 -0
  2. package/dist/bundle.js +2 -1
  3. package/dist/bundle.js.LICENSE.txt +1 -0
  4. package/dist/types/adapters/yinYangAdapter.d.ts +10 -0
  5. package/dist/types/animations/AnimationsMngr.d.ts +7 -19
  6. package/dist/types/api-film.d.ts +22 -0
  7. package/dist/types/api.d.ts +48 -0
  8. package/dist/types/benchmark/runner.d.ts +5 -0
  9. package/dist/types/benchmark/scenarios.d.ts +118 -0
  10. package/dist/types/components/action-image/ActionImageModal.d.ts +42 -0
  11. package/dist/types/components/controller/YinYangController.d.ts +946 -18
  12. package/dist/types/components/controller/action-stack/ActionStackController.d.ts +149 -0
  13. package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +111 -0
  14. package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +118 -0
  15. package/dist/types/components/controller/action-stack/ActionStackState.d.ts +169 -0
  16. package/dist/types/components/controller/actions/ActionProjectionService.d.ts +73 -0
  17. package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +83 -0
  18. package/dist/types/components/controller/actions/CoreEventMenuController.d.ts +90 -0
  19. package/dist/types/components/controller/actions/radialItemMenu.d.ts +117 -0
  20. package/dist/types/components/controller/children/ChildInteractionController.d.ts +38 -0
  21. package/dist/types/components/controller/children/ChildrenOrbitService.d.ts +14 -0
  22. package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +104 -0
  23. package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +86 -0
  24. package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +50 -0
  25. package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +639 -0
  26. package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +53 -0
  27. package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +67 -0
  28. package/dist/types/components/controller/force-field/types.d.ts +42 -0
  29. package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +33 -0
  30. package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +155 -0
  31. package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +61 -0
  32. package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +25 -0
  33. package/dist/types/components/controller/odd/OddViewManager.d.ts +44 -0
  34. package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +125 -0
  35. package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +50 -0
  36. package/dist/types/components/controller/state/BlockingAnimationTracker.d.ts +17 -0
  37. package/dist/types/components/controller/state/YinYangControllerState.d.ts +176 -0
  38. package/dist/types/components/controller/utils/actionStackMath.d.ts +13 -0
  39. package/dist/types/components/controller/utils/actionStackReorder.d.ts +7 -0
  40. package/dist/types/components/controller/utils/childrenOrbit.d.ts +18 -0
  41. package/dist/types/components/controller/utils/cuttingLabels.d.ts +9 -0
  42. package/dist/types/components/controller/utils/eventFieldStyle.d.ts +13 -0
  43. package/dist/types/components/controller/utils/eventFieldTargets.d.ts +47 -0
  44. package/dist/types/components/controller/utils/forceFieldMetadata.d.ts +4 -0
  45. package/dist/types/components/controller/utils/forceFieldPresentation.d.ts +9 -0
  46. package/dist/types/components/controller/utils/forceFieldStyle.d.ts +10 -0
  47. package/dist/types/components/controller/utils/labelGeometry.d.ts +5 -0
  48. package/dist/types/components/controller/utils/oddCutting.d.ts +2 -0
  49. package/dist/types/components/controller/utils/svgCoordinates.d.ts +9 -0
  50. package/dist/types/components/controller/utils/svgTransform.d.ts +5 -0
  51. package/dist/types/components/controller/utils/textLayout.d.ts +2 -0
  52. package/dist/types/components/controls/VizControlsPanel.d.ts +14 -0
  53. package/dist/types/components/factory/YinYangAppFactory.d.ts +4 -6
  54. package/dist/types/components/model/YinYangModel.d.ts +4 -30
  55. package/dist/types/components/panel/DiagramPanelBridge.d.ts +34 -0
  56. package/dist/types/components/panel/PanelManager.d.ts +150 -0
  57. package/dist/types/components/search/GlobalSearchController.d.ts +396 -0
  58. package/dist/types/components/stack-nav/StackNavOverlay.d.ts +82 -0
  59. package/dist/types/components/view/BorderDrawer.d.ts +203 -13
  60. package/dist/types/components/view/SpikeDrawer.d.ts +37 -31
  61. package/dist/types/components/view/ViewInitializer.d.ts +438 -2
  62. package/dist/types/components/view/YinYangDrawer.d.ts +414 -11
  63. package/dist/types/config/animationConfig.d.ts +37 -0
  64. package/dist/types/config/deltaColors.d.ts +64 -0
  65. package/dist/types/config/labelStyleConfig.d.ts +50 -0
  66. package/dist/types/data/OddCategoryColors.d.ts +12 -2
  67. package/dist/types/data/adverse-action-planner.d.ts +51 -0
  68. package/dist/types/data/adverse-action-planner.test.d.ts +1 -0
  69. package/dist/types/data/amplifier-engine.d.ts +107 -0
  70. package/dist/types/data/amplifier-engine.test.d.ts +1 -0
  71. package/dist/types/data/combo-engine.d.ts +94 -0
  72. package/dist/types/data/combo-engine.test.d.ts +1 -0
  73. package/dist/types/data/odd_generic_descriptions.d.ts +4 -0
  74. package/dist/types/data/odd_labels.d.ts +5 -0
  75. package/dist/types/data/yasuni_actions.d.ts +47 -0
  76. package/dist/types/data/yasuni_adverse_actions.d.ts +2 -0
  77. package/dist/types/data/yasuni_adverse_key_events.d.ts +2 -0
  78. package/dist/types/data/yasuni_cause.d.ts +33 -0
  79. package/dist/types/data/yasuni_graph.d.ts +22 -0
  80. package/dist/types/data/yasuni_key_events.d.ts +61 -0
  81. package/dist/types/data/yasuni_propagation_layers.d.ts +3 -0
  82. package/dist/types/interfaces/IActions.d.ts +1 -0
  83. package/dist/types/interfaces/ICauseGraph.d.ts +9 -0
  84. package/dist/types/interfaces/ICauseModel.d.ts +33 -0
  85. package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -5
  86. package/dist/types/interfaces/IPropagationLayers.d.ts +27 -0
  87. package/dist/types/interfaces/IViewData.d.ts +12 -0
  88. package/dist/types/interfaces/IYinYangAppFactory.d.ts +3 -3
  89. package/dist/types/interfaces/IYinYangController.d.ts +301 -6
  90. package/dist/types/interfaces/IYinYangGeometry.d.ts +43 -0
  91. package/dist/types/interfaces/IYinYangInternalModel.d.ts +34 -0
  92. package/dist/types/interfaces/IYinYangModel.d.ts +3 -11
  93. package/dist/types/main.d.ts +9 -0
  94. package/dist/types/utils/actionImages.d.ts +14 -0
  95. package/dist/types/utils/actionPropagation.d.ts +74 -0
  96. package/dist/types/utils/appMode.d.ts +5 -0
  97. package/dist/types/utils/causeGraph.d.ts +6 -0
  98. package/dist/types/utils/causeMetrics.d.ts +26 -0
  99. package/dist/types/utils/chainCardHeight.d.ts +27 -0
  100. package/dist/types/utils/d3/D3Element.d.ts +2 -2
  101. package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +21 -4
  102. package/dist/types/utils/deltaChips.d.ts +15 -0
  103. package/dist/types/utils/deltaLabels.d.ts +54 -0
  104. package/dist/types/utils/facetteImages.d.ts +1 -0
  105. package/dist/types/utils/geometryUtils.d.ts +0 -1
  106. package/dist/types/utils/hierBadge.d.ts +44 -0
  107. package/dist/types/utils/idleSphereImage.d.ts +8 -0
  108. package/dist/types/utils/keyEventImages.d.ts +41 -0
  109. package/dist/types/utils/oddLegend.d.ts +30 -0
  110. package/dist/types/utils/positionalEfficiency.d.ts +16 -0
  111. package/dist/types/utils/yinYangWatermark.d.ts +29 -0
  112. package/package.json +27 -12
  113. package/dist/index.html +0 -1
  114. package/dist/types/data/coupe_rase_Orangs-outans/data_Kalimantan.d.ts +0 -3
  115. package/dist/types/data/coupe_rase_Orangs-outans/data_PT_Mayawana_Persada.d.ts +0 -3
  116. package/dist/types/data/data_institu_bancaire.d.ts +0 -3
  117. package/dist/types/interfaces/IOddItem.d.ts +0 -6
  118. package/dist/types/script.d.ts +0 -13
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Tracks how many "blocking" animations (rotation, facette/ODD switch, and any
3
+ * future one) are currently running for a single YinYangController instance.
4
+ * Animation subsystems register themselves via begin()/end() instead of the
5
+ * gate having to know about each animation source individually — a new
6
+ * animation only has to call begin()/end() around its own loop to be covered.
7
+ */
8
+ export declare class BlockingAnimationTracker {
9
+ private active;
10
+ private onChangeCb;
11
+ /** Called whenever the tracker transitions between "nothing active" and
12
+ * "something active" (in either direction). */
13
+ onChange(cb: () => void): void;
14
+ begin(label: string): symbol;
15
+ end(token: symbol): void;
16
+ get isAnyActive(): boolean;
17
+ }
@@ -0,0 +1,176 @@
1
+ import { ChildrenOrbitEntry } from "../utils/childrenOrbit";
2
+ import { ForceFieldLink, ForceFieldLinkDetail } from "../force-field/types";
3
+ import { EventFieldTarget } from "../utils/eventFieldTargets";
4
+ import { ProjectedCuttingState } from "../actions/ActionProjectionService";
5
+ import { BlockingAnimationTracker } from "./BlockingAnimationTracker";
6
+ type GhostState = {
7
+ projectedGhostTensionByOddId: Map<string, number> | null;
8
+ projectedGhostStateByOddId: Map<string, number> | null;
9
+ projectedGhostComponentTension: number | null;
10
+ projectedGhostCuttingStatesByOddId: Map<string, ProjectedCuttingState[]> | null;
11
+ };
12
+ export declare class YinYangControllerState {
13
+ children: {
14
+ enabled: boolean;
15
+ pendingRefresh: boolean;
16
+ activeChildKey: string | null;
17
+ orbitFrameId: number | undefined;
18
+ orbitEnabled: boolean;
19
+ orbitAngle: number;
20
+ orbitSpeed: number;
21
+ orbitRadiusScale: number;
22
+ };
23
+ menu: {
24
+ hasActiveChildAction: boolean;
25
+ activeChildKey: string | null;
26
+ /** Key of the cutting that owns the currently active action (may differ from
27
+ * activeChildKey when the user browses another cutting's buttons while an
28
+ * action is active). */
29
+ actionSourceChildKey: string | null;
30
+ activeActionId: string | null;
31
+ activeActionLabel: string | null;
32
+ itemDistance: number;
33
+ itemScale: number;
34
+ iconFontScale: number;
35
+ /** Ajustement fin (px) de la distance des boutons d'Événement Clé,
36
+ * de part et d'autre de la longueur auto-calculée (voir
37
+ * CoreEventMenuController — offsetDistance dérivé de l'orbite des
38
+ * satellites, pas de contrôle dédié à cette base). */
39
+ coreEventMenuDistanceOffset: number;
40
+ /** Taille des boutons du menu radial des Événements Clés — contrôle dédié
41
+ * ("Taille boutons", groupe "Événements clés"), séparé de itemScale qui
42
+ * ne pilote que les boutons d'action des satellites. */
43
+ coreEventMenuItemScale: number;
44
+ /** Taille des icônes dans les bulles du menu radial des Événements Clés —
45
+ * contrôle dédié ("Taille icônes", groupe "Événements clés"), séparé de
46
+ * iconFontScale qui ne pilote que les icônes d'action des satellites. */
47
+ coreEventIconFontScale: number;
48
+ };
49
+ action: {
50
+ propagationFactor: number;
51
+ delta: number;
52
+ };
53
+ visibility: {
54
+ actionDeltaLabels: boolean;
55
+ childrenContextLabels: boolean;
56
+ allLabelsVisible: boolean;
57
+ };
58
+ /** Réglages "Combos" — voir combo-engine.ts pour la sémantique exacte de
59
+ * chaque plafond levé. Bornés (false) par défaut : comportement actuel. */
60
+ combos: {
61
+ /** Lève le plafond à 1 sur le ratio de performance des prérequis
62
+ * DÉCLENCHEURS (combos non dangereux), ce qui autorise une cascade de
63
+ * combos à dépasser ×2. N'affecte pas les prérequis PROTECTEURS d'un
64
+ * combo dangereux (voir dangerousComboCanBecomeBonus). */
65
+ uncappedChainedPerformance: boolean;
66
+ /** Lève le plafond à 1 sur le ratio de performance des prérequis
67
+ * PROTECTEURS d'un combo dangereux, ce qui permet à m = avgRatio de
68
+ * dépasser ×1 (le risque devient un bonus net). N'affecte pas les
69
+ * combos non dangereux (voir uncappedChainedPerformance). */
70
+ dangerousComboCanBecomeBonus: boolean;
71
+ };
72
+ labels: {
73
+ fontScale: number;
74
+ componentFontScale: number;
75
+ oddFontScale: number;
76
+ facetteFontScale: number;
77
+ facetteSuffixVisible: boolean;
78
+ childStateDeltaFontScale: number;
79
+ childStateDeltaOffset: number;
80
+ childStateDeltaBoxScale: number;
81
+ componentLegendFontScale: number;
82
+ legendLabelsBgEnabled: boolean;
83
+ textShadowEnabled: boolean;
84
+ childMaxLines: number;
85
+ oddMaxLines: number;
86
+ labelShortMaxChars: number;
87
+ childPlacement: "top" | "bottom";
88
+ displayEllipsisForShortLabels: boolean;
89
+ };
90
+ forceField: {
91
+ randomCount: number;
92
+ sourceChildIndex: number;
93
+ sourceChildIndices: number[];
94
+ links: ForceFieldLink[];
95
+ allLinkDetails: ForceFieldLinkDetail[];
96
+ incomingMode: boolean;
97
+ frameId: number | undefined;
98
+ phase: number;
99
+ lastTimestamp: number | undefined;
100
+ orbitData: ChildrenOrbitEntry[] | null;
101
+ revealStartedAt: number | undefined;
102
+ selectedLinkIndex: number | null;
103
+ };
104
+ eventField: {
105
+ targets: EventFieldTarget[];
106
+ frameId: number | undefined;
107
+ phase: number;
108
+ lastTimestamp: number | undefined;
109
+ revealStartedAt: number | undefined;
110
+ };
111
+ ghost: GhostState;
112
+ /** Registers rotation / facette-switch / any future animation that should
113
+ * block ghost display while active. See YinYangController.beginBlockingAnimation. */
114
+ blockingAnimations: BlockingAnimationTracker;
115
+ setActiveChildKey(childKey: string | null): void;
116
+ setChildrenEnabled(isEnabled: boolean): void;
117
+ setChildrenPendingRefresh(isPending: boolean): void;
118
+ setOrbitEnabled(isEnabled: boolean): void;
119
+ setOrbitSpeed(speed: number): void;
120
+ setOrbitRadiusScale(scale: number): void;
121
+ setOrbitFrameId(frameId: number | undefined): void;
122
+ resetOrbitAngle(): void;
123
+ clearMenuActiveSelection(): void;
124
+ setMenuActiveChild(childKey: string | null): void;
125
+ setActionSourceChildKey(childKey: string | null): void;
126
+ setMenuActiveAction(actionId: string | null): void;
127
+ setHasActiveChildAction(isActive: boolean): void;
128
+ setForceFieldSourceChildIndex(index: number): void;
129
+ setForceFieldSourceChildIndices(indices: number[]): void;
130
+ setIncomingForceFieldLinks(links: ForceFieldLink[], allDetails: ForceFieldLinkDetail[]): void;
131
+ setForceFieldRandomCount(count: number): void;
132
+ setActionDeltaLabelsVisible(isVisible: boolean): void;
133
+ setComboUncappedChainedPerformance(isEnabled: boolean): void;
134
+ setComboDangerousCanBecomeBonus(isEnabled: boolean): void;
135
+ setChildrenContextLabelsVisible(isVisible: boolean): void;
136
+ getAllLabelsVisible(): boolean;
137
+ setAllLabelsVisible(isVisible: boolean): void;
138
+ setLabelsFontScale(scale: number): void;
139
+ setLabelsTextShadowEnabled(isEnabled: boolean): void;
140
+ setChildLabelPlacement(position: "top" | "bottom"): void;
141
+ setComponentLabelFontScale(scale: number): void;
142
+ setChildStateDeltaFontScale(scale: number): void;
143
+ setChildStateDeltaOffset(offset: number): void;
144
+ setChildStateDeltaBoxScale(scale: number): void;
145
+ setOddLabelFontScale(scale: number): void;
146
+ setFacetteLabelFontScale(scale: number): void;
147
+ setFacetteLabelSuffixVisible(isVisible: boolean): void;
148
+ setComponentLegendLabelFontScale(scale: number): void;
149
+ setLegendLabelsBgEnabled(enabled: boolean): void;
150
+ setMenuItemDistance(distance: number): void;
151
+ setMenuItemScale(scale: number): void;
152
+ setMenuIconFontScale(scale: number): void;
153
+ setCoreEventMenuDistanceOffset(offset: number): void;
154
+ setCoreEventMenuItemScale(scale: number): void;
155
+ setCoreEventIconFontScale(scale: number): void;
156
+ setChildLabelMaxLines(lines: number): void;
157
+ setOddLabelMaxLines(lines: number): void;
158
+ setLabelShortMaxChars(chars: number): void;
159
+ setDisplayEllipsisForShortLabels(enabled: boolean): void;
160
+ setForceFieldOrbitData(orbitData: ChildrenOrbitEntry[] | null): void;
161
+ setForceFieldFrameId(frameId: number | undefined): void;
162
+ setForceFieldLastTimestamp(timestamp: number | undefined): void;
163
+ setForceFieldSelectedLinkIndex(index: number | null): void;
164
+ setForceFieldRevealStartedAt(timestamp: number | undefined): void;
165
+ setForceFieldLinksAndDetails(links: ForceFieldLink[], allLinkDetails: ForceFieldLinkDetail[]): void;
166
+ setEventFieldTargets(targets: EventFieldTarget[]): void;
167
+ setEventFieldFrameId(frameId: number | undefined): void;
168
+ setEventFieldLastTimestamp(timestamp: number | undefined): void;
169
+ setEventFieldPhase(phase: number): void;
170
+ setEventFieldRevealStartedAt(timestamp: number | undefined): void;
171
+ toggleForceFieldSelection(index: number): boolean;
172
+ applyGhostProjection(ghost: GhostState): void;
173
+ clearForceFieldComputation(): void;
174
+ resetGhostProjection(): void;
175
+ }
176
+ export {};
@@ -0,0 +1,13 @@
1
+ export type StackLayoutMetrics = {
2
+ firstSlotCenterY: number;
3
+ slotSpacing: number;
4
+ compactLength: number;
5
+ };
6
+ export type ClientRectLike = {
7
+ left: number;
8
+ right: number;
9
+ top: number;
10
+ bottom: number;
11
+ };
12
+ export declare function getStackInsertionIndexFromGlobalY(globalY: number, metrics: StackLayoutMetrics | null): number;
13
+ export declare function isPointInsideClientRect(clientX: number, clientY: number, rect: ClientRectLike | null): boolean;
@@ -0,0 +1,7 @@
1
+ export declare function reorderStackItemsByVisibleIndex<T extends {
2
+ id: string;
3
+ }>(params: {
4
+ items: T[];
5
+ itemId: string;
6
+ targetVisibleIndex: number;
7
+ }): T[];
@@ -0,0 +1,18 @@
1
+ import { IYinYangController } from "../../../interfaces/IYinYangController";
2
+ export type ChildrenOrbitEntry = {
3
+ controller: IYinYangController;
4
+ dx: number;
5
+ dy: number;
6
+ radius: number;
7
+ baseAngle: number;
8
+ };
9
+ export declare function buildChildrenOrbitData(params: {
10
+ parentX: number;
11
+ parentY: number;
12
+ childControllers: IYinYangController[];
13
+ radiusScale: number;
14
+ }): ChildrenOrbitEntry[];
15
+ export declare function computeOrbitTranslation(orbitEntry: ChildrenOrbitEntry, angleOffset: number): {
16
+ x: number;
17
+ y: number;
18
+ };
@@ -0,0 +1,9 @@
1
+ import { YinYangComponentNode } from "../../../interfaces/IYinYangInternalModel";
2
+ export declare function getComponentTitle(component: YinYangComponentNode | null | undefined): string;
3
+ export declare function getCuttingLabel(component: YinYangComponentNode | null | undefined, oddId: string, cuttingIndex: number): string;
4
+ export declare function getCuttingShortLabel(params: {
5
+ component: YinYangComponentNode | null | undefined;
6
+ oddId: string;
7
+ cuttingIndex: number;
8
+ maxChars: number;
9
+ }): string;
@@ -0,0 +1,13 @@
1
+ export type EventFieldColors = {
2
+ /** Cordon au repos entre deux souffles — presque éteint. */
3
+ cord: string;
4
+ /** Segment de cordon allumé par le passage d'un anneau. */
5
+ capsule: string;
6
+ /** Anneaux émis par le cœur, et halo général. */
7
+ ring: string;
8
+ glow: string;
9
+ /** Blanc chaud du point d'impact. */
10
+ core: string;
11
+ };
12
+ export declare function getEventFieldColors(): EventFieldColors;
13
+ export declare function getEventFieldCapsuleWidth(scoreBonus: number): number;
@@ -0,0 +1,47 @@
1
+ import type { ActionStackItem } from "../action-stack/ActionStackController";
2
+ import type { KeyEventDefinition } from "../../../data/yasuni_key_events";
3
+ import { IYinYangController } from "../../../interfaces/IYinYangController";
4
+ export type EventFieldTarget = {
5
+ /** Index dans childControllers de la facette active — cible dans la même
6
+ * facette que le cœur émetteur. */
7
+ childIndex?: number;
8
+ /** Id de la facette cible, quand le satellite amplifié vit dans une autre
9
+ * facette — résolu par l'appelant vers le point de bordure de son arc
10
+ * (même mécanisme que ForceFieldRenderer pour les champs de force
11
+ * cross-composante). */
12
+ targetComponentId?: string;
13
+ /** Bonus de score de l'événement pour un satellite réellement amplifié,
14
+ * 0 pour un satellite simplement à portée — pilote l'épaisseur du
15
+ * souffle (voir getEventFieldCapsuleWidth). */
16
+ scoreBonus: number;
17
+ };
18
+ /**
19
+ * Whether `keyEvent`'s static scope (collectReachedSatellites) includes at
20
+ * least one satellite living in `componentId`. Used when the user switches
21
+ * facette to decide whether the active Champ d'événement should keep
22
+ * driving the field in the destination facette (incoming continuation) or
23
+ * be cleared like it is for any unrelated facette — see
24
+ * YinYangController.prepareForComponentSwitch.
25
+ */
26
+ export declare function keyEventReachesComponent(keyEvent: KeyEventDefinition, componentId: string): boolean;
27
+ /**
28
+ * Résout les cibles du "Champ d'événement" pour l'Événement Clé actuellement
29
+ * actif (aperçu ou validé) : sa portée statique, résolue en index de satellite
30
+ * dans la facette courante ou en id de facette distante.
31
+ *
32
+ * L'épaisseur du souffle distingue les satellites RÉELLEMENT amplifiés ici et
33
+ * maintenant — ceux dont une action ciblée est cochée dans la pile — de ceux
34
+ * qui ne sont qu'à portée : les premiers reçoivent le bonus de score de
35
+ * l'événement, les seconds 0 (souffle minimal).
36
+ */
37
+ export declare function buildEventFieldTargets(params: {
38
+ keyEvent: KeyEventDefinition;
39
+ activeItems: ActionStackItem[];
40
+ currentComponentId: string | undefined;
41
+ childControllers: IYinYangController[];
42
+ childOddMap: Map<string, {
43
+ oddId: string;
44
+ score: number;
45
+ cuttingIndex: number;
46
+ }>;
47
+ }): EventFieldTarget[];
@@ -0,0 +1,4 @@
1
+ export declare function getInterOddRationale(componentId: string, fromOddId: string, toOddId: string): string | null;
2
+ export declare function getLayersInvolved(componentId: string, fromOddId: string, toOddId: string): string[];
3
+ export declare function getLocalLayerWeightSummary(componentId: string, fromOddId: string, toOddId: string): string | null;
4
+ export declare function getBridgeLayerWeightSummary(componentId: string, fromOddId: string, toOddId: string): string | null;
@@ -0,0 +1,9 @@
1
+ export type ForceFieldLayerType = "inter" | "intra" | "bridge";
2
+ export type ForceFieldDeltaDetail = {
3
+ layerType: ForceFieldLayerType;
4
+ deltaTo: number;
5
+ };
6
+ export declare function getForceFieldWeightLabel(layerType: ForceFieldLayerType): string;
7
+ export declare function getLayerDisplayName(layerType: ForceFieldLayerType): string;
8
+ export declare function getPropagationCardTitle(layerType: ForceFieldLayerType): string;
9
+ export declare function calculateDisplayedDelta(details: ForceFieldDeltaDetail[]): number;
@@ -0,0 +1,10 @@
1
+ export type ForceFieldColors = {
2
+ aura: string;
3
+ auraGlow: string;
4
+ energy: string;
5
+ energyGlow: string;
6
+ core: string;
7
+ coreGlow: string;
8
+ };
9
+ export declare function getForceFieldThickness(weight: number): number;
10
+ export declare function getForceFieldColors(potentialGain: number): ForceFieldColors;
@@ -0,0 +1,5 @@
1
+ export declare function calculateBestShortLabelPosition(childCenterX: number, childCenterY: number, childRadius: number, parentCenterX: number, parentCenterY: number): {
2
+ x: number;
3
+ y: number;
4
+ angle: number;
5
+ };
@@ -0,0 +1,2 @@
1
+ import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
2
+ export declare function resolveOddCuttingId(component: YinYangInternalModel["components"][number], oddId: string, cuttingIndex: number): number | undefined;
@@ -0,0 +1,9 @@
1
+ export declare function clientPointToGroupCoordinates(params: {
2
+ clientX: number;
3
+ clientY: number;
4
+ group: SVGGElement | null;
5
+ svg: SVGSVGElement | null;
6
+ }): {
7
+ x: number;
8
+ y: number;
9
+ } | null;
@@ -0,0 +1,5 @@
1
+ export declare function parseTranslateTransform(transform: string): {
2
+ x: number;
3
+ y: number;
4
+ found: boolean;
5
+ };
@@ -0,0 +1,2 @@
1
+ export declare function wrapText(text: string, maxLines: number): string[];
2
+ export declare function truncateStackLabel(label: string | undefined, maxWidthPx: number, fontSizePx: number): string;
@@ -0,0 +1,14 @@
1
+ import { YinYangController } from "../controller/YinYangController";
2
+ import { YinYangAppFactory } from "../factory/YinYangAppFactory";
3
+ export interface VizControlsDeps {
4
+ controllerCause: YinYangController;
5
+ factory: YinYangAppFactory;
6
+ layoutState: {
7
+ actionStackColumnWidth: number;
8
+ };
9
+ renderColumnLayouts: () => void;
10
+ animationConfig: {
11
+ rotationDurationMs: number;
12
+ };
13
+ }
14
+ export declare function mountVizControls(deps: VizControlsDeps): void;
@@ -1,11 +1,11 @@
1
1
  import { AnimationsMngr } from "../../animations/AnimationsMngr";
2
- import { IOddItem } from "../../interfaces/IOddItem";
3
2
  import { IYinYangModel } from "../../interfaces/IYinYangModel";
4
3
  import { IYinYangView } from "../../interfaces/IYinYangView";
5
4
  import { IYinYangController } from "../../interfaces/IYinYangController";
6
5
  import { IGraphicsStrategy } from "../../interfaces/IGraphicsStrategy";
7
6
  import { IYinYangAppFactory } from "../../interfaces/IYinYangAppFactory";
8
7
  import { IViewData } from "../../interfaces/IViewData";
8
+ import { YinYangInternalModel } from "../../interfaces/IYinYangInternalModel";
9
9
  export declare class YinYangAppFactory implements IYinYangAppFactory {
10
10
  instances: Map<string, IYinYangController>;
11
11
  private idCounter;
@@ -23,12 +23,11 @@ export declare class YinYangAppFactory implements IYinYangAppFactory {
23
23
  /**
24
24
  * Creates a new YinYang model.
25
25
  *
26
- * @param modelData - Data for the model based on IOddItem.
27
- * @param isEnemy - Indicates if the model is for an enemy (defaults to true).
26
+ * @param modelData - Internal model data for the instance.
28
27
  * @param parentKey - The key of the parent model if any.
29
28
  * @returns A new instance of YinYangModel.
30
29
  */
31
- createModel(modelData: IOddItem[], isEnemy?: boolean, parentKey?: string | null): IYinYangModel;
30
+ createModel(modelData: YinYangInternalModel, parentKey?: string | null): IYinYangModel;
32
31
  /**
33
32
  * Creates a new view for the YinYang diagram.
34
33
  *
@@ -54,9 +53,8 @@ export declare class YinYangAppFactory implements IYinYangAppFactory {
54
53
  *
55
54
  * @param modelData - The data for the model.
56
55
  * @param viewData - The data for the view (e.g., dimensions, container ID).
57
- * @param isEnemy - Indicates whether the entity is an enemy.
58
56
  * @param parentKey - Optional key for a parent instance.
59
57
  * @returns The created YinYangController.
60
58
  */
61
- create(modelData: IOddItem[], viewData: IViewData, isEnemy?: boolean, parentKey?: string | null): IYinYangController;
59
+ create(modelData: YinYangInternalModel, viewData: IViewData, parentKey?: string | null): IYinYangController;
62
60
  }
@@ -1,41 +1,15 @@
1
- import { IOddItem } from "../../interfaces/IOddItem";
1
+ import { YinYangInternalModel } from "../../interfaces/IYinYangInternalModel";
2
2
  import { IYinYangModel } from "../../interfaces/IYinYangModel";
3
- import { ICategory } from "../../interfaces/ICategory";
4
3
  export declare class YinYangModel implements IYinYangModel {
5
- sortedData: IOddItem[];
6
- categories: ICategory[];
4
+ internalModel: YinYangInternalModel;
7
5
  key: string;
8
6
  parentKey: string | null;
9
7
  childCounter: number;
10
8
  borderNb: number;
11
- isEnemy: boolean;
12
- /**
13
- * Constructor for the YinYangModel.
14
- * Sorts the input data, initializes the categories, and sets up the properties.
15
- */
16
- constructor(data: IOddItem[], key: string, parentKey: string | null | undefined, isEnemy: boolean);
9
+ constructor(internalModel: YinYangInternalModel, key: string, parentKey?: string | null);
17
10
  /**
18
11
  * Generates a unique key for child instances.
19
12
  */
20
13
  generateChildKey(): string;
21
- /**
22
- * Calculates the average score from the data.
23
- * @returns The average score rounded to one decimal place.
24
- */
25
- calculateAverageScore(): number;
26
- /**
27
- * Retrieves the small circle data, including score and angle for each item.
28
- * @returns Array of small circle data with score and angle for each item.
29
- */
30
- getSmallCircleData(): {
31
- score: number;
32
- angle: number;
33
- }[];
34
- /**
35
- * Sets up the categories for the YinYang diagram based on the input data.
36
- * Calculates the percentage and angles for each category.
37
- * @param data - Array of items to categorize.
38
- * @returns Array of category objects with their respective data.
39
- */
40
- setupCategories(data: IOddItem[]): ICategory[];
14
+ resetChildCounter(): void;
41
15
  }
@@ -0,0 +1,34 @@
1
+ import { YinYangController } from "../controller/YinYangController";
2
+ import { type Composante } from "../../data/yasuni_cause";
3
+ import { PanelManager } from "./PanelManager";
4
+ export interface DiagramPanelBridgeDeps {
5
+ panelManager: PanelManager;
6
+ controllerCause: YinYangController;
7
+ switchToTab: (id: string) => void;
8
+ yasuniCause: Composante[];
9
+ actionNameMap: Map<string, string>;
10
+ causeOddColors: Record<string, string>;
11
+ /** Called when the user clicks a cutting satellite in the diagram. Used to
12
+ * sync the STACK hierarchy in the other direction (diagram → hierarchy). */
13
+ onDiagramCuttingNav?: (event: {
14
+ componentIndex: number;
15
+ oddId: string;
16
+ cuttingIndex: number;
17
+ }) => void;
18
+ /** Called when the user clicks a composante (Facette) — arc de bordure du diagramme
19
+ * ou navigation indirecte via searchHandleComposanteClick. Sert à synchroniser le
20
+ * chip et l'historique STACK au niveau Facette. */
21
+ onDiagramComposanteNav?: (componentIndex: number) => void;
22
+ /** Called when a diagram action drag intent is detected, after the built-in
23
+ * tab switch logic. Used to e.g. close the stack hierarchy dropdown. */
24
+ onDiagramActionDragIntent?: () => void;
25
+ /** Called when a propagation block fires while in STACK mode, so that card-link
26
+ * navigation (clicking a propagation target in the ANALYSE detail cards) is
27
+ * recorded in the STACK navigation history. */
28
+ onStackPropagationNav?: (compId: string, oddId: string, cutIdx: number) => void;
29
+ }
30
+ export declare class DiagramPanelBridge {
31
+ private readonly deps;
32
+ constructor(deps: DiagramPanelBridgeDeps);
33
+ wire(): void;
34
+ }
@@ -0,0 +1,150 @@
1
+ import { YinYangController } from "../controller/YinYangController";
2
+ import { GlobalSearchController, SearchNavTarget } from "../search/GlobalSearchController";
3
+ import { type Composante } from "../../data/yasuni_cause";
4
+ export interface PanelSlot {
5
+ controller: GlobalSearchController;
6
+ panelEl: HTMLElement;
7
+ headerEl: HTMLElement;
8
+ titleEl: HTMLElement;
9
+ lockEl: HTMLButtonElement;
10
+ backEl: HTMLButtonElement | null;
11
+ forwardEl: HTMLButtonElement | null;
12
+ resizerEl: HTMLElement;
13
+ collapsed: boolean;
14
+ locked: boolean;
15
+ isMaster: boolean;
16
+ _openHeight: number;
17
+ _linkedTitle: boolean;
18
+ _history: Array<() => void>;
19
+ _histIdx: number;
20
+ _histNav: boolean;
21
+ }
22
+ export interface PanelManagerDeps {
23
+ controllerCause: YinYangController;
24
+ yasuniCause: Composante[];
25
+ actionNameMap: Map<string, string>;
26
+ globalSearch: GlobalSearchController;
27
+ switchToTab: (id: string) => void;
28
+ attachAxisResizer: (handle: HTMLDivElement | null, axis: "x" | "y", cursor: string, onStart: () => number, onDelta: (nextValue: number) => void) => void;
29
+ layoutState: {
30
+ rechercheContextHeight: number;
31
+ };
32
+ applyRechercheContextHeight: (h: number) => void;
33
+ resizerRechercheContext: HTMLElement | null;
34
+ }
35
+ export declare class PanelManager {
36
+ private readonly deps;
37
+ readonly panelSlots: (PanelSlot | null)[];
38
+ masterSlotIdx: number | null;
39
+ suppressSatelliteSearchUpdate: boolean;
40
+ pendingNavSourceSlot: number;
41
+ lastPropagationSlot: number;
42
+ masterCuttingPending: boolean;
43
+ masterCuttingHistoryPushed: boolean;
44
+ diagramNavMasterHistLenAtStart: number;
45
+ /** Jeton de génération pour historyBack/historyForward — voir leur commentaire. */
46
+ private navGen;
47
+ oddNavState: {
48
+ componentIndex: number;
49
+ oddId: string;
50
+ mode: "highlight";
51
+ } | null;
52
+ constructor(deps: PanelManagerDeps);
53
+ /** Appelé après le constructeur une fois le DOM prêt. */
54
+ init(): void;
55
+ /** Diagramme → arbre : reflète l'état du menu radial des Événements Clés dans
56
+ * le panneau qui pilote le diagramme (le maître, ou le panneau 1 tant qu'il
57
+ * n'y en a pas — même règle que setOnKeyEventGroupToggle). */
58
+ syncKeyEventGroupFromDiagram(componentIndex: number, open: boolean): void;
59
+ getMasterController(): GlobalSearchController | null;
60
+ private findNextUnlocked;
61
+ setPanelTitle(slotIdx: number, prefix: string, name?: string, badge?: {
62
+ label: string;
63
+ cssClass: string;
64
+ }, rationale?: string, oddColor?: string, stateValue?: number, weightValue?: number, iconUrl?: string): void;
65
+ private redistributeOpenHeights;
66
+ private setPanelCollapsed;
67
+ 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. */
70
+ getMasterSelectedTarget(): SearchNavTarget | null;
71
+ /**
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.
78
+ *
79
+ * Passe par les chemins de RESTAURATION (restoreActionDiagramState,
80
+ * restoreKeyEventDiagramState, forceOpen) et non par ceux d'un clic : l'état
81
+ * est déjà connu, il ne doit ni basculer en toggle-close ni redessiner la
82
+ * 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
+ */
96
+ resyncDiagramToMasterPanel(fallbackTarget?: SearchNavTarget | null): void;
97
+ /**
98
+ * @param forceOpen À passer à true quand target restaure un état déjà connu
99
+ * (rejeu d'historique back/forward, panneau qui redevient maître) plutôt
100
+ * qu'un vrai clic utilisateur. searchNavigateToCutting bascule sinon en
101
+ * toggle-close si le satellite ciblé est encore celui dont le menu est
102
+ * flaggé actif (state.menu.activeChildKey périmé) — symptôme observé :
103
+ * la mise à jour ne se faisait qu'un clic Retour/Suivant sur deux.
104
+ */
105
+ syncDiagramToTarget(target: SearchNavTarget, forceOpen?: boolean): void;
106
+ private setMaster;
107
+ private setPanelLocked;
108
+ openPanel(slotIdx: number, skipSync?: boolean): void;
109
+ private closePanel;
110
+ activateLinkedPanel(slotIdx: number): void;
111
+ resolveTargetSlot(): {
112
+ idx: number;
113
+ isLinked: boolean;
114
+ src: number;
115
+ };
116
+ wrapAttachHandlersForSlot(originalAttach: (c: HTMLElement) => void, slotIdx: number): (c: HTMLElement) => void;
117
+ private wireSlotNavigation;
118
+ private buildContextPanelDOM;
119
+ ensureSlot(slotIdx: number): PanelSlot;
120
+ pushHistory(slotIdx: number, restore: () => void): void;
121
+ private updateHistoryBtns;
122
+ /**
123
+ * Rejoue l'entrée d'historique courante du slot, en attendant qu'un éventuel
124
+ * switch de composante en cours (déclenché par un clic Retour/Suivant précédent,
125
+ * animation ~800ms) se termine avant d'appliquer la restauration. Sans ce garde,
126
+ * un clic rapide pendant l'animation faisait avancer _histIdx alors que la
127
+ * closure de restauration s'exécutait quand même sur un diagramme "occupé" —
128
+ * certains de ses effets (syncDiagramToTarget -> searchHandleComposanteClick)
129
+ * sont silencieusement ignorés par le guard isComponentSwitching interne,
130
+ * désynchronisant diagramme/panneau/hiérarchie de la position réelle de
131
+ * l'historique. gen permet d'abandonner si une navigation plus récente a
132
+ * entretemps pris le dessus (même slot ou un autre, le diagramme étant partagé).
133
+ */
134
+ private replayHistoryEntry;
135
+ private historyBack;
136
+ private historyForward;
137
+ makeActionRestoreFn(idx: number, compId: string, oddId: string, cutIdx: number, actionId: string, cardsHtml: string, attachHandlers: (c: HTMLElement) => void, src: number, actionName: string, titlePrefix?: string, linkedTitle?: boolean): () => void;
138
+ makePropRestoreFn(idx: number, compId: string, oddId: string, cutIdx: number, html: string, attachHandlers: (c: HTMLElement) => void, src: number, sourceDesc: {
139
+ breadcrumb: string;
140
+ title: string;
141
+ description: string;
142
+ } | undefined, rationale: string | undefined, isLinked: boolean): () => void;
143
+ private wireSlotInteraction;
144
+ private initPanel1;
145
+ private initPanel2;
146
+ updateStackBadge(): void;
147
+ private wireSearchDrag;
148
+ /** Initialise le master et les hauteurs apres rendu. */
149
+ initMasterAndHeights(): void;
150
+ }