@micheeeeel/yinyangapp 2.5.1 → 2.6.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.
- package/dist/bundle.js +1 -1
- package/dist/types/adapters/yasuniCauseAdapter.d.ts +31 -5
- package/dist/types/api.d.ts +5 -1
- package/dist/types/components/controller/YinYangController.d.ts +63 -679
- package/dist/types/components/controller/action-stack/ActionStackController.d.ts +35 -0
- package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +9 -0
- package/dist/types/components/controller/action-stack/StackFocusController.d.ts +105 -0
- package/dist/types/components/controller/actions/ActionProjectionService.d.ts +32 -3
- package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +8 -4
- package/dist/types/components/controller/actions/CoreEventMenuController.d.ts +13 -13
- package/dist/types/components/controller/actions/KeyEventController.d.ts +192 -0
- package/dist/types/components/controller/actions/radialItemMenu.d.ts +0 -9
- package/dist/types/components/controller/children/ChildrenBuilder.d.ts +95 -0
- package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +80 -0
- package/dist/types/components/controller/debug/ControllerDebugTools.d.ts +81 -0
- package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +3 -15
- package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +120 -66
- package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +139 -0
- package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +0 -8
- package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +53 -0
- package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +56 -0
- package/dist/types/components/controller/force-field/edgeIdentity.d.ts +28 -0
- package/dist/types/components/controller/force-field/incomingContinuation.d.ts +22 -0
- package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +60 -0
- package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +51 -0
- package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +60 -0
- package/dist/types/components/controller/force-field/propagationTree.d.ts +32 -0
- package/dist/types/components/controller/force-field/shieldViewModel.d.ts +79 -0
- package/dist/types/components/controller/force-field/types.d.ts +37 -10
- package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +99 -0
- package/dist/types/components/controller/navigation/DiagramNavigator.d.ts +64 -0
- package/dist/types/components/controller/odd/OddViewManager.d.ts +1 -1
- package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +9 -0
- package/dist/types/components/controller/state/ControllerSession.d.ts +107 -0
- package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +60 -0
- package/dist/types/components/controller/state/YinYangControllerState.d.ts +4 -5
- package/dist/types/components/controller/types.d.ts +103 -0
- package/dist/types/components/controller/utils/actionCatalog.d.ts +15 -0
- package/dist/types/components/controller/utils/forceFieldPresentation.d.ts +14 -8
- package/dist/types/components/search/GlobalSearchController.d.ts +68 -9
- package/dist/types/components/view/BorderDrawer.d.ts +5 -0
- package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
- package/dist/types/config/propagationCometConfig.d.ts +9 -36
- package/dist/types/config/propagationCometVizConfig.d.ts +34 -0
- package/dist/types/data/activeDiagram.d.ts +4 -6
- package/dist/types/data/adverse-action-planner.d.ts +22 -0
- package/dist/types/data/catalogue-coverage.d.ts +26 -0
- package/dist/types/data/combo-engine.d.ts +76 -21
- package/dist/types/data/contacts/buildContactSphere.d.ts +23 -4
- package/dist/types/data/contacts/index.d.ts +6 -3
- package/dist/types/data/propagation-graph.d.ts +16 -0
- package/dist/types/data/stability-shield.d.ts +21 -0
- package/dist/types/data/yasuni_actions.d.ts +38 -5
- package/dist/types/data/yasuni_cause.d.ts +7 -0
- package/dist/types/data/yasuni_key_events.d.ts +3 -2
- package/dist/types/interfaces/IPropagationGraph.d.ts +39 -0
- package/dist/types/interfaces/IYinYangController.d.ts +2 -2
- package/dist/types/utils/actionPropagation.d.ts +104 -32
- package/dist/types/utils/adverseMode.d.ts +14 -0
- package/package.json +4 -2
- package/dist/types/components/controller/utils/forceFieldMetadata.d.ts +0 -4
- package/dist/types/data/yasuni_graph.d.ts +0 -22
- package/dist/types/data/yasuni_propagation_layers.d.ts +0 -3
- package/dist/types/interfaces/ICauseGraph.d.ts +0 -9
- package/dist/types/interfaces/IPropagationLayers.d.ts +0 -27
- package/dist/types/utils/causeGraph.d.ts +0 -6
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { IYinYangView } from "../../../interfaces/IYinYangView";
|
|
2
|
+
import { IYinYangController } from "../../../interfaces/IYinYangController";
|
|
3
|
+
import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
|
|
4
|
+
import { type ComboResult } from "../../../data/combo-engine";
|
|
5
|
+
import { ChildrenOrbitEntry } from "../utils/childrenOrbit";
|
|
6
|
+
import { SequentialActionProjectionInput } from "../actions/ActionProjectionService";
|
|
7
|
+
import { ActionStackController, ActionStackItem } from "../action-stack/ActionStackController";
|
|
8
|
+
import { ForceFieldDetailsPanel } from "./ForceFieldDetailsPanel";
|
|
9
|
+
import { YinYangControllerState } from "../state/YinYangControllerState";
|
|
10
|
+
import { DiagramNavigator } from "../navigation/DiagramNavigator";
|
|
11
|
+
import { ComponentTitlePresenter } from "../labels/ComponentTitlePresenter";
|
|
12
|
+
import { PropagationAnimator } from "./PropagationAnimator";
|
|
13
|
+
import { ControllerSession } from "../state/ControllerSession";
|
|
14
|
+
import type { ControllerUiCallbacks } from "../state/ControllerUiCallbacks";
|
|
15
|
+
import { ForceFieldComputationService } from "./ForceFieldComputationService";
|
|
16
|
+
import { ActionStackManager } from "../action-stack/ActionStackManager";
|
|
17
|
+
import type { CumulativeBlock } from "../types";
|
|
18
|
+
export type ForceFieldDetailsPresenterDeps = {
|
|
19
|
+
actionStackController: ActionStackController;
|
|
20
|
+
actionStackManager: ActionStackManager;
|
|
21
|
+
applyOddStateForCutting: (oddId: string) => void;
|
|
22
|
+
buildChildrenOrbitData: () => ChildrenOrbitEntry[];
|
|
23
|
+
buildProjectionActionsFromStackItems: (items: ActionStackItem[]) => SequentialActionProjectionInput[];
|
|
24
|
+
getChildControllers: () => IYinYangController[];
|
|
25
|
+
childOddMap: Map<string, {
|
|
26
|
+
oddId: string;
|
|
27
|
+
score: number;
|
|
28
|
+
cuttingIndex: number;
|
|
29
|
+
}>;
|
|
30
|
+
forceFieldComputationService: ForceFieldComputationService;
|
|
31
|
+
forceFieldDetailsPanel: ForceFieldDetailsPanel;
|
|
32
|
+
getAllComponents: () => YinYangInternalModel["components"];
|
|
33
|
+
getCurrentComponent: () => YinYangInternalModel["components"][number] | null;
|
|
34
|
+
getCurrentComponentOrUndefined: () => YinYangInternalModel["components"][number] | undefined;
|
|
35
|
+
navigator: DiagramNavigator;
|
|
36
|
+
propagationAnimator: PropagationAnimator;
|
|
37
|
+
session: ControllerSession;
|
|
38
|
+
setActiveChild: (childKey: string) => void;
|
|
39
|
+
state: YinYangControllerState;
|
|
40
|
+
titlePresenter: ComponentTitlePresenter;
|
|
41
|
+
ui: ControllerUiCallbacks;
|
|
42
|
+
updateChildActionMenu: (orbitData: ChildrenOrbitEntry[]) => void;
|
|
43
|
+
view: IYinYangView;
|
|
44
|
+
};
|
|
45
|
+
/** Contenu du panneau de détails du champ de force : action directe, action
|
|
46
|
+
* propagée, vue cumulative de la pile (mode STACK) et blocs d'Événements Clés. */
|
|
47
|
+
export declare class ForceFieldDetailsPresenter {
|
|
48
|
+
private deps;
|
|
49
|
+
constructor(deps: ForceFieldDetailsPresenterDeps);
|
|
50
|
+
/**
|
|
51
|
+
* Construit le bloc d'action directe pour un emplacement connu (compId/oddId/cutIdx/actionId)
|
|
52
|
+
* sans naviguer le diagramme, et fire le callback avec (compId, oddId, cutIdx, actionId, html, attachHandlers).
|
|
53
|
+
* Utilisé par les panneaux contextuels pour afficher le bloc d'une action cliquée dans leur arbre.
|
|
54
|
+
*/
|
|
55
|
+
/**
|
|
56
|
+
* Déclenche l'affichage du bloc de propagation dans un panneau contextuel lorsque
|
|
57
|
+
* l'utilisateur clique sur un cutting dans l'arbre de ce panneau.
|
|
58
|
+
* Retourne true si le cutting est effectivement impacté par l'action active (bloc affiché),
|
|
59
|
+
* false sinon (aucun changement).
|
|
60
|
+
*/
|
|
61
|
+
showPropagationForContextCutting(componentId: string, oddId: string, cuttingIndex: number): boolean;
|
|
62
|
+
buildDirectActionBlockForContext(compId: string, oddId: string, cutIdx: number, actionId: string, onReady: (compId: string, oddId: string, cutIdx: number, actionId: string, html: string, attachHandlers: (container: HTMLElement) => void) => void): void;
|
|
63
|
+
clearGhostDetails(): void;
|
|
64
|
+
renderGhostDetailsForActiveAction(): void;
|
|
65
|
+
clearForceFieldDetails(): void;
|
|
66
|
+
renderActionPropagationTable(): void;
|
|
67
|
+
/**
|
|
68
|
+
* Calcule les ComboResult pour une action donnée.
|
|
69
|
+
* Priorité : résultats pré-calculés du stack item → évaluation à la volée.
|
|
70
|
+
* Utilisé par le panneau principal et tous les panneaux contextuels.
|
|
71
|
+
*/
|
|
72
|
+
computeComboResultsForAction(actionId: string): ComboResult[] | undefined;
|
|
73
|
+
renderSourceActionDetailsForCurrentSource(opts?: {
|
|
74
|
+
deltaOverride?: number;
|
|
75
|
+
comboResults?: ComboResult[];
|
|
76
|
+
}): void;
|
|
77
|
+
private _mergeAllComponentLinkDetails;
|
|
78
|
+
/**
|
|
79
|
+
* Pour chaque ligne de la composante courante qui vise une autre
|
|
80
|
+
* composante, les sauts qu'elle produit dans la composante cible. Ces
|
|
81
|
+
* lignes ne vivent dans l'état de la cible qu'après bascule ; on
|
|
82
|
+
* les calcule ici avec la même fonction que restoreIncomingForceFieldContext
|
|
83
|
+
* (buildIncomingContinuationHops, PROP-03), donc avec le même résultat.
|
|
84
|
+
*/
|
|
85
|
+
private _computeCrossComponentCascadeRows;
|
|
86
|
+
renderForceFieldDetails(linkIndex: number): void;
|
|
87
|
+
private getActiveActionMeta;
|
|
88
|
+
/**
|
|
89
|
+
* Per active stack item sourced from the CURRENT component: its marginal
|
|
90
|
+
* contribution (state units, 0..100) to (oddId, cuttingId), and its own
|
|
91
|
+
* detailed propagation edges — both produced by the real sequential
|
|
92
|
+
* simulation (projectGhostStateForActionSequence), the same one that
|
|
93
|
+
* drives the diagram's displayed Δ.
|
|
94
|
+
*
|
|
95
|
+
* - marginalDeltaAtFocus: summing this across items equals the diagram's Δ
|
|
96
|
+
* exactly, by construction (telescoping sum over the fractional
|
|
97
|
+
* accumulator). Used as the authoritative block total.
|
|
98
|
+
* - detailPool: this item's OWN propagation edges (absorption/gap/cascade),
|
|
99
|
+
* for the whole resolution — including what it carries on into other
|
|
100
|
+
* facets — with stable identities (edgeId / parentEdgeId),
|
|
101
|
+
* from the exact same single-pass computation (computeActionPropagationDetails,
|
|
102
|
+
* via onStep) that produced marginalDeltaAtFocus — not a second, separately
|
|
103
|
+
* re-run propagation — against the exact rolled-forward state this item
|
|
104
|
+
* saw at its point in the stack, not the pristine base state. Used so the
|
|
105
|
+
* panel's descriptive breakdown badges match the authoritative total
|
|
106
|
+
* instead of an isolated estimate.
|
|
107
|
+
*
|
|
108
|
+
* Items sourced from a DIFFERENT component are absent from the map: they
|
|
109
|
+
* don't participate in this component's rolling simulation (their effect
|
|
110
|
+
* is merged separately via the cross-component incoming-links path).
|
|
111
|
+
* Callers must fall back to the isolated per-source estimate for those.
|
|
112
|
+
*/
|
|
113
|
+
private computeSequentialStackContributionsAtFocus;
|
|
114
|
+
/**
|
|
115
|
+
* Blocs "keyEvent" pour la vue cumulative : un Événement Clé actif (coché
|
|
116
|
+
* dans la pile) dont la Facette d'origine (originComposanteId) correspond à
|
|
117
|
+
* `component` — indépendamment du satellite précis sélectionné, et même si
|
|
118
|
+
* aucune de ses actions ciblées n'est jouée (voir isKeyEventCurrentlyActive
|
|
119
|
+
* pour le seul état visuel actif/inactif). Réutilisé par
|
|
120
|
+
* renderCumulativeDetailsForCutting (satellite sélectionné) et par les
|
|
121
|
+
* appelants de renderComposanteInfo (Facette sélectionnée, aucun satellite).
|
|
122
|
+
*/
|
|
123
|
+
buildKeyEventBlocksForComponent(component: {
|
|
124
|
+
id: string;
|
|
125
|
+
}): CumulativeBlock[];
|
|
126
|
+
renderCumulativeDetailsForCutting(oddId: string, cuttingId: number | undefined): boolean;
|
|
127
|
+
/** Une action active de cette Facette a-t-elle pour source le satellite
|
|
128
|
+
* (oddId, cuttingId) ? Même résolution que le bloc "source" de
|
|
129
|
+
* renderCumulativeDetailsForCutting (isDirectMatch). */
|
|
130
|
+
private hasActiveActionSourcedAt;
|
|
131
|
+
/**
|
|
132
|
+
* Arrivées d'un ensemble de lignes (une ou plusieurs résolutions d'une même
|
|
133
|
+
* action) sur le satellite cible, et leurs ancêtres dans l'arbre des
|
|
134
|
+
* arrivées : tout ce qui, dans ces lignes, mène à la cible — quels que
|
|
135
|
+
* soient le nombre de sauts, d'ODD ou de facettes traversés, les
|
|
136
|
+
* convergences ou les retours cycliques.
|
|
137
|
+
*/
|
|
138
|
+
private collectDetailRowsForTarget;
|
|
139
|
+
}
|
|
@@ -10,18 +10,10 @@ export declare class ForceFieldRenderer {
|
|
|
10
10
|
private forceFieldDefs;
|
|
11
11
|
private forceFieldLayers;
|
|
12
12
|
private readonly gradientPrefix;
|
|
13
|
-
/** Active pulse overrides: linkIndex → { startMs, durationMs }. Cleared on arc end. */
|
|
14
|
-
private readonly _pulsedLinks;
|
|
15
13
|
/** setTimeout id du fondu de sortie en cours, ou null — voir hide(). */
|
|
16
14
|
private _hideTimeoutId;
|
|
17
15
|
/** requestAnimationFrame id de la rétraction géométrique en cours — voir retractGeometry(). */
|
|
18
16
|
private _retractFrameId;
|
|
19
|
-
/**
|
|
20
|
-
* Temporarily boost the visual intensity of a force-field link.
|
|
21
|
-
* Opacity and aura stroke-width are amplified with a sin envelope over `durationMs`.
|
|
22
|
-
* Called by YinYangController while the propagation arc travels the matching segment.
|
|
23
|
-
*/
|
|
24
|
-
pulseLink(linkIndex: number, durationMs: number): void;
|
|
25
17
|
/** Horodatage du dernier updateVisual — updateVisual ne reçoit pas de Δt,
|
|
26
18
|
* on le dérive ici pour le lissage de l'emphase. */
|
|
27
19
|
private _lastVisualNow;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
|
|
2
|
+
import { ChildrenOrbitEntry } from "../utils/childrenOrbit";
|
|
3
|
+
import { SequentialActionProjectionInput } from "../actions/ActionProjectionService";
|
|
4
|
+
import { ActionStackItem } from "../action-stack/ActionStackController";
|
|
5
|
+
import { ForceFieldLinkDetail } from "./types";
|
|
6
|
+
import { YinYangControllerState } from "../state/YinYangControllerState";
|
|
7
|
+
import { ComponentTitlePresenter } from "../labels/ComponentTitlePresenter";
|
|
8
|
+
import { ControllerSession } from "../state/ControllerSession";
|
|
9
|
+
import { ForceFieldComputationService } from "./ForceFieldComputationService";
|
|
10
|
+
export type IncomingForceFieldServiceDeps = {
|
|
11
|
+
applyProjectedGhostFromStackItems: (items: ActionStackItem[]) => void;
|
|
12
|
+
buildChildrenOrbitData: () => ChildrenOrbitEntry[];
|
|
13
|
+
buildForceFieldSourceIndicesFromStackItems: (items: ActionStackItem[]) => number[];
|
|
14
|
+
buildProjectionActionsFromStackItems: (items: ActionStackItem[]) => SequentialActionProjectionInput[];
|
|
15
|
+
childOddMap: Map<string, {
|
|
16
|
+
oddId: string;
|
|
17
|
+
score: number;
|
|
18
|
+
cuttingIndex: number;
|
|
19
|
+
}>;
|
|
20
|
+
forceFieldComputationService: ForceFieldComputationService;
|
|
21
|
+
getAllComponents: () => YinYangInternalModel["components"];
|
|
22
|
+
getCurrentComponentOrUndefined: () => YinYangInternalModel["components"][number] | undefined;
|
|
23
|
+
renderOppositeChildrenForceField: (orbitData?: ChildrenOrbitEntry[], angleOffset?: number) => void;
|
|
24
|
+
restoreIncomingForceFieldContext: (context: {
|
|
25
|
+
type: "incoming";
|
|
26
|
+
sourceComponentId: string;
|
|
27
|
+
linksByOddId: Map<string, {
|
|
28
|
+
toOddId: string;
|
|
29
|
+
thickness: number;
|
|
30
|
+
potentialGain: number;
|
|
31
|
+
detail: ForceFieldLinkDetail;
|
|
32
|
+
sourceOriginKey?: string;
|
|
33
|
+
}>;
|
|
34
|
+
}) => void;
|
|
35
|
+
session: ControllerSession;
|
|
36
|
+
state: YinYangControllerState;
|
|
37
|
+
titlePresenter: ComponentTitlePresenter;
|
|
38
|
+
};
|
|
39
|
+
/** Recalcule le champ de force entrant d'une facette à partir des éléments
|
|
40
|
+
* de pile actifs (liens issus d'autres facettes). */
|
|
41
|
+
export declare class IncomingForceFieldService {
|
|
42
|
+
private deps;
|
|
43
|
+
constructor(deps: IncomingForceFieldServiceDeps);
|
|
44
|
+
/**
|
|
45
|
+
* Recomputes the incoming force-field view for `currentComponentId` based on
|
|
46
|
+
* the subset of source actions provided by `items`, using the source links saved
|
|
47
|
+
* when the user originally switched away from the source component.
|
|
48
|
+
* Returns true if matching cross-component links were found and the view was
|
|
49
|
+
* updated; returns false if no links target the current component (caller should
|
|
50
|
+
* fall back to switching to the source component instead).
|
|
51
|
+
*/
|
|
52
|
+
recomputeIncomingForceFieldForItems(items: ActionStackItem[], sourceComponentId: string, currentComponentId: string): boolean;
|
|
53
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
|
|
2
|
+
import { ActionStackController, ActionStackItem } from "../action-stack/ActionStackController";
|
|
3
|
+
import { YinYangControllerState } from "../state/YinYangControllerState";
|
|
4
|
+
import type { ForceFieldLinkDetail } from "./types";
|
|
5
|
+
import type { PropagationCometPlayer } from "./propagation-viz/PropagationCometPlayer";
|
|
6
|
+
export type PropagationAnimatorDeps = {
|
|
7
|
+
stackItemSourceOriginKey: (item: ActionStackItem) => string | null;
|
|
8
|
+
actionStackController: ActionStackController;
|
|
9
|
+
getCurrentComponentOrUndefined: () => YinYangInternalModel["components"][number] | undefined;
|
|
10
|
+
resolveFocusBubbleStub: () => {
|
|
11
|
+
sourceChildIndex: number;
|
|
12
|
+
center: {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
};
|
|
16
|
+
} | null;
|
|
17
|
+
/** Arrivées de la résolution d'un item dont le bloc est affiché (celles
|
|
18
|
+
* de ses listes Source / Bilan). */
|
|
19
|
+
getStackItemResolutionPool: (stackItemId: string) => readonly ForceFieldLinkDetail[] | undefined;
|
|
20
|
+
/** Lecteur dédié à la boucle (réglages propagationCometConfig). */
|
|
21
|
+
cometPlayer: PropagationCometPlayer;
|
|
22
|
+
state: YinYangControllerState;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Boucle de l'action en focus : tant qu'une action est en focus, sa
|
|
26
|
+
* propagation est rejouée en boucle, séparée par une pause réglable — c'est
|
|
27
|
+
* ce qui, dans un diagramme saturé, désigne sans ambiguïté les champs du
|
|
28
|
+
* bloc sélectionné.
|
|
29
|
+
*
|
|
30
|
+
* Trajets et rendu sont ceux de la comète des listes Source / Bilan
|
|
31
|
+
* (propagationVizModel.resolutionCometTrees, PropagationCometPlayer) : la
|
|
32
|
+
* passe suit les arrivées réelles du moteur, depuis la cible de l'action
|
|
33
|
+
* (ou depuis l'arc de la facette d'où arrive sa suite) jusqu'au dernier
|
|
34
|
+
* satellite impacté, en se divisant à chaque embranchement. Une passe est
|
|
35
|
+
* sautée (et re-tentée peu après) quand un aperçu par survol porte sur une
|
|
36
|
+
* autre action, ou hors mode STACK.
|
|
37
|
+
*/
|
|
38
|
+
export declare class PropagationAnimator {
|
|
39
|
+
private deps;
|
|
40
|
+
constructor(deps: PropagationAnimatorDeps);
|
|
41
|
+
private _focusLoopTimer;
|
|
42
|
+
/** Pause entre deux passes (propagationCometConfig.loopGapMs, panneau
|
|
43
|
+
* Debug). Un timer en attente est reposé avec la nouvelle valeur pour que
|
|
44
|
+
* le réglage se sente tout de suite. */
|
|
45
|
+
setFocusPropagationLoopGapMs(ms: number): void;
|
|
46
|
+
restartFocusPropagationLoop(): void;
|
|
47
|
+
private stopFocusPropagationLoop;
|
|
48
|
+
private _runFocusPropagationLoopPass;
|
|
49
|
+
/** Joue une passe pour l'item ; retourne sa durée (0 si rien à jouer). */
|
|
50
|
+
private _playFocusedItem;
|
|
51
|
+
/** Arrivées de la résolution de l'item : celles de son bloc dans le
|
|
52
|
+
* panneau quand il est affiché (mêmes trajets que ses listes), sinon
|
|
53
|
+
* celles de ses champs de force dans l'état du diagramme (même filtre
|
|
54
|
+
* que ForceFieldDetailsPresenter pour le pool d'un bloc). */
|
|
55
|
+
private _resolutionPool;
|
|
56
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { PropagatedActionEdge } from "../../../utils/actionPropagation";
|
|
2
|
+
import type { ForceFieldLinkDetail } from "./types";
|
|
3
|
+
export declare function edgeIdOf(resolutionId: string, index: number): string;
|
|
4
|
+
/** Résolution d'un champ de force calculé depuis un satellite source. */
|
|
5
|
+
export declare function sourceResolutionId(componentId: string, oddId: string, cuttingId: number | undefined): string;
|
|
6
|
+
/** Résolution isolée d'un élément de pile joué depuis une autre facette que
|
|
7
|
+
* celle affichée (ses arrivées dans cette facette, puis leur suite). */
|
|
8
|
+
export declare function remoteResolutionId(stackItemId: string): string;
|
|
9
|
+
/** Résolution d'un bloc de la pile (simulation séquentielle). */
|
|
10
|
+
export declare function stackResolutionId(stackItemId: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Lignes d'affichage d'une résolution complète. Les identifiants sont fixés
|
|
13
|
+
* sur les index d'origine AVANT le filtre `keep` : une ligne gardée dont le
|
|
14
|
+
* parent est écarté conserve son `parentEdgeId` (elle devient une racine
|
|
15
|
+
* pour cet affichage, sans changer d'identité).
|
|
16
|
+
*/
|
|
17
|
+
export declare function detailsFromResolution(edges: readonly PropagatedActionEdge[], resolutionId: string, keep?: (edge: PropagatedActionEdge) => boolean): ForceFieldLinkDetail[];
|
|
18
|
+
/**
|
|
19
|
+
* Lignes d'une suite calculée à partir d'une arrivée (`entry`), par exemple
|
|
20
|
+
* dans la facette cible d'une arête inter-facettes : même résolution que
|
|
21
|
+
* l'arrivée, identifiants dérivés du sien ; les sorties du satellite
|
|
22
|
+
* d'arrivée ont l'arrivée pour parent.
|
|
23
|
+
*/
|
|
24
|
+
export declare function detailsFromContinuation(edges: readonly PropagatedActionEdge[], entry: Pick<ForceFieldLinkDetail, "resolutionId" | "edgeId">): ForceFieldLinkDetail[];
|
|
25
|
+
/** Arêtes d'une résolution visibles depuis une facette : celles qui en
|
|
26
|
+
* partent ou y arrivent. Les sauts entièrement dans une autre facette en
|
|
27
|
+
* sont la suite et s'affichent depuis cette facette. */
|
|
28
|
+
export declare function isVisibleFromComponent(edge: Pick<PropagatedActionEdge, "fromComponentId" | "toComponentId">, componentId: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { YinYangComponentNode } from "../../../interfaces/IYinYangInternalModel";
|
|
2
|
+
import { PropagatedActionEdge } from "../../../utils/actionPropagation";
|
|
3
|
+
import { ForceFieldLinkDetail } from "./types";
|
|
4
|
+
/** Saut d'une suite entrante, prêt pour l'affichage. */
|
|
5
|
+
export type IncomingContinuationHop = {
|
|
6
|
+
edge: PropagatedActionEdge;
|
|
7
|
+
detail: ForceFieldLinkDetail;
|
|
8
|
+
/** Profondeur dans l'arbre des arrivées : 0 pour les sorties du satellite
|
|
9
|
+
* d'arrivée, parent + 1 ensuite. */
|
|
10
|
+
chainDepth: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Suite, dans la composante cible, d'une arête venue d'une autre composante.
|
|
14
|
+
* Le calcul est celui du moteur (computeIncomingLocalContinuation, mêmes
|
|
15
|
+
* sauts que la résolution complète dans cette composante) ; cette fonction ne
|
|
16
|
+
* fait que le traduire en lignes de détail, rattachées à l'arrivée `incoming`
|
|
17
|
+
* (même résolution, `parentEdgeId` pour les sorties de son satellite).
|
|
18
|
+
* Partagée par la vue de la composante cible (restoreIncomingForceFieldContext)
|
|
19
|
+
* et par le panneau vu depuis la source (_computeCrossComponentCascadeRows),
|
|
20
|
+
* qui affichent donc les mêmes sauts.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildIncomingContinuationHops(targetComponent: YinYangComponentNode, incoming: ForceFieldLinkDetail): IncomingContinuationHop[];
|
package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { IYinYangController } from "../../../../interfaces/IYinYangController";
|
|
2
|
+
import type { YinYangInternalModel } from "../../../../interfaces/IYinYangInternalModel";
|
|
3
|
+
import { type PropagationCometVizConfig } from "../../../../config/propagationCometVizConfig";
|
|
4
|
+
import type { CometNode } from "./propagationVizModel";
|
|
5
|
+
export type PropagationCometPlayerDeps = {
|
|
6
|
+
getCurrentComponent: () => YinYangInternalModel["components"][number] | null;
|
|
7
|
+
getChildControllers: () => IYinYangController[];
|
|
8
|
+
childOddMap: Map<string, {
|
|
9
|
+
oddId: string;
|
|
10
|
+
cuttingIndex: number;
|
|
11
|
+
}>;
|
|
12
|
+
getChildRenderedCenter: (controller: IYinYangController) => {
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
} | null;
|
|
16
|
+
getComponentBorderTargetPoint: (componentId: string) => {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
} | null;
|
|
20
|
+
getGlobalGroup: () => SVGGElement | null;
|
|
21
|
+
/** Rayon de repli d'un satellite, et largeur de l'arc de bordure. */
|
|
22
|
+
getSatelliteRadius: () => number;
|
|
23
|
+
getBorderArcWidth: () => number;
|
|
24
|
+
/** Réglages lus à chaque lecture (par défaut : comète des listes). */
|
|
25
|
+
config?: PropagationCometVizConfig;
|
|
26
|
+
};
|
|
27
|
+
export type CometPlayOptions = {
|
|
28
|
+
/** Couleur de l'action du bloc, utilisée si le réglage le demande. */
|
|
29
|
+
blockColor?: string;
|
|
30
|
+
/** Point de départ avant la racine (bulle de l'action), pour le premier
|
|
31
|
+
* arbre seulement. */
|
|
32
|
+
origin?: {
|
|
33
|
+
x: number;
|
|
34
|
+
y: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
export declare class PropagationCometPlayer {
|
|
38
|
+
private deps;
|
|
39
|
+
private run;
|
|
40
|
+
constructor(deps: PropagationCometPlayerDeps);
|
|
41
|
+
private get cfg();
|
|
42
|
+
/** Joue un ou plusieurs arbres (rafale). Retourne la durée de la lecture
|
|
43
|
+
* (ms, dernier anneau éteint), 0 si rien n'est résoluble sur le
|
|
44
|
+
* diagramme. */
|
|
45
|
+
play(trees: CometNode[], options?: CometPlayOptions): number;
|
|
46
|
+
/** Efface toute lecture en cours. */
|
|
47
|
+
stop(): void;
|
|
48
|
+
private resolvePoint;
|
|
49
|
+
/** Aplatit l'arbre en résolvant les positions et les instants d'arrivée.
|
|
50
|
+
* Une branche dont un satellite est introuvable s'arrête au précédent.
|
|
51
|
+
* `origin` : point de départ placé avant la racine. */
|
|
52
|
+
private flatten;
|
|
53
|
+
/** Position de la tête qui mène au nœud `index`, à l'instant `t` (remonte
|
|
54
|
+
* la lignée quand `t` précède l'arrivée sur le parent : sert à la queue). */
|
|
55
|
+
private positionAt;
|
|
56
|
+
private renderFlight;
|
|
57
|
+
private createHead;
|
|
58
|
+
/** Anneau qui s'élargit en s'éteignant autour d'un satellite atteint. */
|
|
59
|
+
private drawRing;
|
|
60
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ForceFieldLinkDetail } from "../types";
|
|
2
|
+
import { type CometNode, type VizBlockKind, type VizSatellite } from "./propagationVizModel";
|
|
3
|
+
import type { CometPlayOptions } from "./PropagationCometPlayer";
|
|
4
|
+
export type CometPlayFn = (trees: CometNode[], options: CometPlayOptions) => void;
|
|
5
|
+
export type PropagationVizListsOptions = {
|
|
6
|
+
/** Nom affiché d'un satellite (facette comprise). */
|
|
7
|
+
nameOf: (satellite: VizSatellite) => string;
|
|
8
|
+
/** Réticule de navigation d'une ligne (vide si pas de navigation). */
|
|
9
|
+
navIconHtml: (satellite: VizSatellite, list: "source" | "bilan") => string;
|
|
10
|
+
/** Lecteur de comète ; absent → listes non cliquables. */
|
|
11
|
+
play?: CometPlayFn;
|
|
12
|
+
};
|
|
13
|
+
export declare class PropagationVizLists {
|
|
14
|
+
private readonly opts;
|
|
15
|
+
private readonly actions;
|
|
16
|
+
constructor(opts: PropagationVizListsOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Liste de la carte Bilan : cibles du prochain saut depuis `satellite`.
|
|
19
|
+
* Ligne → comète de X vers la cible puis toute sa suite ; en-tête →
|
|
20
|
+
* toutes les lignes en rafale.
|
|
21
|
+
*/
|
|
22
|
+
bilanListHtml(params: {
|
|
23
|
+
pool: readonly ForceFieldLinkDetail[];
|
|
24
|
+
satellite: VizSatellite;
|
|
25
|
+
kind: VizBlockKind;
|
|
26
|
+
scale?: number;
|
|
27
|
+
blockColor?: string;
|
|
28
|
+
}): {
|
|
29
|
+
html: string;
|
|
30
|
+
count: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Liste de la carte Source : satellites dont les arrivées forment le
|
|
34
|
+
* budget de `satellite`. Ligne → comète du satellite cliqué jusqu'à X ;
|
|
35
|
+
* en-tête → toutes les lignes en rafale.
|
|
36
|
+
*/
|
|
37
|
+
sourceListHtml(params: {
|
|
38
|
+
pool: readonly ForceFieldLinkDetail[];
|
|
39
|
+
satellite: VizSatellite;
|
|
40
|
+
blockColor?: string;
|
|
41
|
+
/** Libellé d'une provenance (ex. nom de l'action pour son satellite). */
|
|
42
|
+
labelOf?: (satellite: VizSatellite) => string | undefined;
|
|
43
|
+
}): {
|
|
44
|
+
html: string;
|
|
45
|
+
count: number;
|
|
46
|
+
};
|
|
47
|
+
/** Branche les lectures de ce rendu sur `container` (HTML déjà injecté). */
|
|
48
|
+
attach(container: HTMLElement): void;
|
|
49
|
+
private register;
|
|
50
|
+
private listHtml;
|
|
51
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { PropagationScope } from "../../../../interfaces/IPropagationGraph";
|
|
2
|
+
import type { ForceFieldLinkDetail } from "../types";
|
|
3
|
+
export type VizSatellite = {
|
|
4
|
+
componentId: string;
|
|
5
|
+
oddId: string;
|
|
6
|
+
cuttingId: number;
|
|
7
|
+
};
|
|
8
|
+
export type VizBlockKind = "direct" | "propagation";
|
|
9
|
+
/** Une ligne d'une liste Source ou Bilan : un satellite, la somme des deltas
|
|
10
|
+
* bruts des sauts qui le relient à X (voir rawDeltaOf), ces sauts eux-mêmes
|
|
11
|
+
* et leurs rationales (non vides, sans doublon, dans l'ordre des sauts). */
|
|
12
|
+
export type VizListEntry = {
|
|
13
|
+
satellite: VizSatellite;
|
|
14
|
+
scope: PropagationScope;
|
|
15
|
+
delta: number;
|
|
16
|
+
edgeIds: string[];
|
|
17
|
+
rationales: string[];
|
|
18
|
+
};
|
|
19
|
+
/** Arbre de trajet d'une comète : le satellite de départ, puis chaque
|
|
20
|
+
* satellite atteint, embranchements compris. */
|
|
21
|
+
export type CometNode = {
|
|
22
|
+
satellite: VizSatellite;
|
|
23
|
+
children: CometNode[];
|
|
24
|
+
};
|
|
25
|
+
export declare function vizSatelliteKey(s: VizSatellite): string;
|
|
26
|
+
/** Arrivées sur X (sauts qui y aboutissent). */
|
|
27
|
+
export declare function arrivalsAt(pool: readonly ForceFieldLinkDetail[], satellite: VizSatellite): ForceFieldLinkDetail[];
|
|
28
|
+
/** Sauts qui partent de X pour ce bloc (voir l'en-tête du fichier). */
|
|
29
|
+
export declare function departuresFrom(pool: readonly ForceFieldLinkDetail[], satellite: VizSatellite, kind: VizBlockKind): ForceFieldLinkDetail[];
|
|
30
|
+
/** Delta brut d'un saut : budget × poids, avant absorption et gap. C'est ce
|
|
31
|
+
* qu'affichent les listes ; l'écart à l'effectif est porté par les cartes
|
|
32
|
+
* de modificateurs. */
|
|
33
|
+
export declare const rawDeltaOf: (row: Pick<ForceFieldLinkDetail, "baseDelta" | "weight">) => number;
|
|
34
|
+
/**
|
|
35
|
+
* Carte Bilan : satellites cibles du prochain saut depuis X, chacun avec la
|
|
36
|
+
* part du delta brut qu'il reçoit. `scale` ramène les deltas du pool à
|
|
37
|
+
* ceux de l'action quand le pool a été calculé avec un autre delta (aperçu).
|
|
38
|
+
*/
|
|
39
|
+
export declare function bilanTargets(pool: readonly ForceFieldLinkDetail[], satellite: VizSatellite, kind: VizBlockKind, scale?: number): VizListEntry[];
|
|
40
|
+
/** Carte Source : satellites dont les arrivées sur X forment son budget. */
|
|
41
|
+
export declare function sourceContributors(pool: readonly ForceFieldLinkDetail[], satellite: VizSatellite): VizListEntry[];
|
|
42
|
+
/**
|
|
43
|
+
* Trajet de la comète pour une ligne du Bilan : de X vers la cible cliquée,
|
|
44
|
+
* puis toute la suite réellement propagée depuis ces arrivées, en se
|
|
45
|
+
* divisant à chaque embranchement, jusqu'au dernier satellite impacté.
|
|
46
|
+
*/
|
|
47
|
+
export declare function bilanCometTree(pool: readonly ForceFieldLinkDetail[], satellite: VizSatellite, entry: Pick<VizListEntry, "satellite" | "edgeIds">): CometNode;
|
|
48
|
+
/**
|
|
49
|
+
* Trajets de toute une résolution (boucle de l'action en focus) : un arbre
|
|
50
|
+
* par satellite de départ, c'est-à-dire par satellite d'où partent des sauts
|
|
51
|
+
* dont le parent n'est pas dans le pool. Pour le pool d'un bloc d'action
|
|
52
|
+
* directe, c'est un seul arbre depuis X, dont les branches sont exactement
|
|
53
|
+
* les trajets des lignes de son Bilan (mêmes règles que bilanCometTree).
|
|
54
|
+
*/
|
|
55
|
+
export declare function resolutionCometTrees(pool: readonly ForceFieldLinkDetail[]): CometNode[];
|
|
56
|
+
/** Trajet de la comète pour une ligne de la Source : du satellite cliqué
|
|
57
|
+
* jusqu'à X, sans poursuite au-delà. */
|
|
58
|
+
export declare function sourceCometTree(satellite: VizSatellite, entry: Pick<VizListEntry, "satellite">): CometNode;
|
|
59
|
+
/** Satellites d'un arbre, racine comprise, dans l'ordre du parcours. */
|
|
60
|
+
export declare function cometTreeSatellites(tree: CometNode): VizSatellite[];
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ForceFieldLinkDetail } from "./types";
|
|
2
|
+
type Row = ForceFieldLinkDetail;
|
|
3
|
+
/** Satellite d'arrivée d'une ligne, facette comprise. */
|
|
4
|
+
export declare function targetSatelliteKey(row: Pick<Row, "toComponentId" | "toOddId" | "toCuttingId">): string;
|
|
5
|
+
/** Satellite de départ d'une ligne, facette comprise. */
|
|
6
|
+
export declare function sourceSatelliteKey(row: Pick<Row, "fromComponentId" | "fromOddId" | "fromCuttingId">): string;
|
|
7
|
+
export declare class PropagationTree {
|
|
8
|
+
readonly rows: readonly Row[];
|
|
9
|
+
private readonly byId;
|
|
10
|
+
private readonly children;
|
|
11
|
+
private readonly order;
|
|
12
|
+
constructor(rows: readonly Row[]);
|
|
13
|
+
get size(): number;
|
|
14
|
+
has(row: Row): boolean;
|
|
15
|
+
parentOf(row: Row): Row | undefined;
|
|
16
|
+
childrenOf(row: Row): Row[];
|
|
17
|
+
/** Racines, dans l'ordre des lignes. */
|
|
18
|
+
roots(): Row[];
|
|
19
|
+
depthOf(row: Row): number;
|
|
20
|
+
/** Chemin de la racine jusqu'à `row` inclus. */
|
|
21
|
+
pathTo(row: Row): Row[];
|
|
22
|
+
/** Ancêtres d'un ensemble de lignes, dédupliqués, racines d'abord (par
|
|
23
|
+
* profondeur, puis ordre des lignes). Les lignes de `rows` elles-mêmes en
|
|
24
|
+
* sont exclues. */
|
|
25
|
+
ancestorsOf(rows: readonly Row[]): Row[];
|
|
26
|
+
/** Descendants d'un ensemble de lignes, en largeur, dédupliqués ; les
|
|
27
|
+
* lignes de `rows` elles-mêmes en sont exclues. */
|
|
28
|
+
descendantsOf(rows: readonly Row[]): Row[];
|
|
29
|
+
/** Lignes triées par profondeur puis ordre d'origine. */
|
|
30
|
+
sortTopDown(rows: readonly Row[]): Row[];
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import type { ShieldAbsorption } from "../actions/ActionProjectionService";
|
|
2
|
+
/** Un bouclier posé par une action de la pile sur son satellite source. */
|
|
3
|
+
export interface ShieldGrant {
|
|
4
|
+
componentId?: string;
|
|
5
|
+
oddId: string;
|
|
6
|
+
cuttingIndex: number;
|
|
7
|
+
shield: number;
|
|
8
|
+
/** Nom de l'action qui l'a créé — l'origine affichée au joueur. */
|
|
9
|
+
label?: string;
|
|
10
|
+
/** Item de pile qui l'a créé — cible du lien de la carte Bouclier. */
|
|
11
|
+
stackItemId?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ActiveShield {
|
|
14
|
+
value: number;
|
|
15
|
+
originLabel?: string;
|
|
16
|
+
originStackItemId?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ShieldTargetRef {
|
|
19
|
+
componentId?: string;
|
|
20
|
+
oddId: string;
|
|
21
|
+
cuttingIndex: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Bouclier actif sur `target` après les `grants` donnés (ordre de pile) :
|
|
25
|
+
* un seul par satellite, le plus fort ; à valeur égale, le premier posé
|
|
26
|
+
* reste l'origine (un bouclier plus faible ou égal ne remplace jamais).
|
|
27
|
+
*/
|
|
28
|
+
export declare function resolveActiveShield(grants: ShieldGrant[], target: ShieldTargetRef): ActiveShield | undefined;
|
|
29
|
+
export type ShieldVerdict = "creates" | "replaces" | "ignored" | "unchanged";
|
|
30
|
+
/**
|
|
31
|
+
* Ce que ferait un bouclier `created` face au bouclier `active` déjà en
|
|
32
|
+
* place sur le même satellite — undefined si rien n'est créé.
|
|
33
|
+
*/
|
|
34
|
+
export declare function shieldVerdict(active: number | undefined, created: number | undefined): ShieldVerdict | undefined;
|
|
35
|
+
/** « Bouclier actif : −X sur chaque menace directe ou propagée jusqu'à la fin de la mission. » */
|
|
36
|
+
export declare function activeShieldSentence(active: ActiveShield): string;
|
|
37
|
+
/** Phrase du bouclier qu'une stabilisation prévisualisée créerait, avec le
|
|
38
|
+
* résultat face au bouclier actif. */
|
|
39
|
+
export declare function createdShieldSentence(created: number, active: number | undefined): string;
|
|
40
|
+
/** Décomposition d'une résolution négative sur un satellite protégé. */
|
|
41
|
+
export interface AbsorptionBreakdown {
|
|
42
|
+
/** Delta adverse direct (≤ 0) — 0 si la menace ne vise pas ce satellite. */
|
|
43
|
+
direct: number;
|
|
44
|
+
/** Total propagé (≤ 0), tous chemins confondus. */
|
|
45
|
+
propagated: number;
|
|
46
|
+
/** Total négatif agrégé avant bouclier = direct + propagé. */
|
|
47
|
+
aggregated: number;
|
|
48
|
+
shield: number;
|
|
49
|
+
/** Points effectivement absorbés (≥ 0), une seule fois sur l'agrégé. */
|
|
50
|
+
absorbed: number;
|
|
51
|
+
/** Delta finalement appliqué (≤ 0), jamais un bonus. */
|
|
52
|
+
applied: number;
|
|
53
|
+
/** true si le bouclier a tout absorbé : le delta appliqué est 0, pas un gain. */
|
|
54
|
+
boundedToZero: boolean;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @param absorption réduction rapportée par la projection pour ce satellite
|
|
58
|
+
* @param directDelta delta effectif de l'action si elle vise ce satellite,
|
|
59
|
+
* 0 sinon — permet de séparer direct et propagé.
|
|
60
|
+
*/
|
|
61
|
+
export declare function buildAbsorptionBreakdown(absorption: Pick<ShieldAbsorption, "shield" | "aggregated" | "applied">, directDelta: number): AbsorptionBreakdown;
|
|
62
|
+
/** Lignes courtes du journal de résolution, dans l'ordre du pipeline. */
|
|
63
|
+
export declare function absorptionSentences(b: AbsorptionBreakdown): string[];
|
|
64
|
+
/** Carte « Bouclier » d'un bloc de l'ANALYSE : maillon additif entre les
|
|
65
|
+
* modificateurs et le Bilan — badge = points absorbés, si bien que
|
|
66
|
+
* delta avant bouclier + badge = Bilan. */
|
|
67
|
+
export interface ShieldCardViewModel {
|
|
68
|
+
/** Points absorbés (> 0), affichés en badge positif. */
|
|
69
|
+
absorbed: number;
|
|
70
|
+
shield: number;
|
|
71
|
+
originLabel?: string;
|
|
72
|
+
originStackItemId?: string;
|
|
73
|
+
/** Lignes de calcul, dans l'ordre du pipeline. */
|
|
74
|
+
lines: string[];
|
|
75
|
+
boundedToZero: boolean;
|
|
76
|
+
}
|
|
77
|
+
/** undefined quand le bouclier n'a rien réduit dans ce bloc (contribution
|
|
78
|
+
* positive, ou pas de bouclier) : pas de carte, la note du Bilan suffit. */
|
|
79
|
+
export declare function shieldCardViewModel(absorption: AbsorptionBreakdown | undefined, active?: ActiveShield): ShieldCardViewModel | undefined;
|