@micheeeeel/yinyangapp 1.0.6 → 2.0.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/README.md +105 -0
- package/dist/bundle.js +2 -1
- package/dist/bundle.js.LICENSE.txt +1 -0
- package/dist/types/adapters/yinYangAdapter.d.ts +10 -0
- package/dist/types/animations/AnimationsMngr.d.ts +7 -19
- package/dist/types/api-film.d.ts +22 -0
- package/dist/types/api.d.ts +48 -0
- package/dist/types/benchmark/runner.d.ts +5 -0
- package/dist/types/benchmark/scenarios.d.ts +118 -0
- package/dist/types/components/action-image/ActionImageModal.d.ts +42 -0
- package/dist/types/components/controller/YinYangController.d.ts +946 -18
- package/dist/types/components/controller/action-stack/ActionStackController.d.ts +149 -0
- package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +111 -0
- package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +118 -0
- package/dist/types/components/controller/action-stack/ActionStackState.d.ts +169 -0
- package/dist/types/components/controller/actions/ActionProjectionService.d.ts +73 -0
- package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +83 -0
- package/dist/types/components/controller/actions/CoreEventMenuController.d.ts +90 -0
- package/dist/types/components/controller/actions/radialItemMenu.d.ts +117 -0
- package/dist/types/components/controller/children/ChildInteractionController.d.ts +38 -0
- package/dist/types/components/controller/children/ChildrenOrbitService.d.ts +14 -0
- package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +104 -0
- package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +86 -0
- package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +50 -0
- package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +639 -0
- package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +53 -0
- package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +67 -0
- package/dist/types/components/controller/force-field/types.d.ts +42 -0
- package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +33 -0
- package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +155 -0
- package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +61 -0
- package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +25 -0
- package/dist/types/components/controller/odd/OddViewManager.d.ts +44 -0
- package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +125 -0
- package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +50 -0
- package/dist/types/components/controller/state/BlockingAnimationTracker.d.ts +17 -0
- package/dist/types/components/controller/state/YinYangControllerState.d.ts +176 -0
- package/dist/types/components/controller/utils/actionStackMath.d.ts +13 -0
- package/dist/types/components/controller/utils/actionStackReorder.d.ts +7 -0
- package/dist/types/components/controller/utils/childrenOrbit.d.ts +18 -0
- package/dist/types/components/controller/utils/cuttingLabels.d.ts +9 -0
- package/dist/types/components/controller/utils/eventFieldStyle.d.ts +13 -0
- package/dist/types/components/controller/utils/eventFieldTargets.d.ts +47 -0
- package/dist/types/components/controller/utils/forceFieldMetadata.d.ts +4 -0
- package/dist/types/components/controller/utils/forceFieldPresentation.d.ts +9 -0
- package/dist/types/components/controller/utils/forceFieldStyle.d.ts +10 -0
- package/dist/types/components/controller/utils/labelGeometry.d.ts +5 -0
- package/dist/types/components/controller/utils/oddCutting.d.ts +2 -0
- package/dist/types/components/controller/utils/svgCoordinates.d.ts +9 -0
- package/dist/types/components/controller/utils/svgTransform.d.ts +5 -0
- package/dist/types/components/controller/utils/textLayout.d.ts +2 -0
- package/dist/types/components/controls/VizControlsPanel.d.ts +14 -0
- package/dist/types/components/factory/YinYangAppFactory.d.ts +4 -6
- package/dist/types/components/model/YinYangModel.d.ts +4 -30
- package/dist/types/components/panel/DiagramPanelBridge.d.ts +34 -0
- package/dist/types/components/panel/PanelManager.d.ts +150 -0
- package/dist/types/components/search/GlobalSearchController.d.ts +396 -0
- package/dist/types/components/stack-nav/StackNavOverlay.d.ts +82 -0
- package/dist/types/components/view/BorderDrawer.d.ts +203 -13
- package/dist/types/components/view/SpikeDrawer.d.ts +37 -31
- package/dist/types/components/view/ViewInitializer.d.ts +438 -2
- package/dist/types/components/view/YinYangDrawer.d.ts +414 -11
- package/dist/types/config/animationConfig.d.ts +37 -0
- package/dist/types/config/deltaColors.d.ts +64 -0
- package/dist/types/config/labelStyleConfig.d.ts +50 -0
- package/dist/types/data/OddCategoryColors.d.ts +12 -2
- package/dist/types/data/adverse-action-planner.d.ts +51 -0
- package/dist/types/data/adverse-action-planner.test.d.ts +1 -0
- package/dist/types/data/amplifier-engine.d.ts +107 -0
- package/dist/types/data/amplifier-engine.test.d.ts +1 -0
- package/dist/types/data/combo-engine.d.ts +94 -0
- package/dist/types/data/combo-engine.test.d.ts +1 -0
- package/dist/types/data/odd_generic_descriptions.d.ts +4 -0
- package/dist/types/data/odd_labels.d.ts +5 -0
- package/dist/types/data/yasuni_actions.d.ts +47 -0
- package/dist/types/data/yasuni_adverse_actions.d.ts +2 -0
- package/dist/types/data/yasuni_adverse_key_events.d.ts +2 -0
- package/dist/types/data/yasuni_cause.d.ts +33 -0
- package/dist/types/data/yasuni_graph.d.ts +22 -0
- package/dist/types/data/yasuni_key_events.d.ts +61 -0
- package/dist/types/data/yasuni_propagation_layers.d.ts +3 -0
- package/dist/types/interfaces/IActions.d.ts +1 -0
- package/dist/types/interfaces/ICauseGraph.d.ts +9 -0
- package/dist/types/interfaces/ICauseModel.d.ts +33 -0
- package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -5
- package/dist/types/interfaces/IPropagationLayers.d.ts +27 -0
- package/dist/types/interfaces/IViewData.d.ts +12 -0
- package/dist/types/interfaces/IYinYangAppFactory.d.ts +3 -3
- package/dist/types/interfaces/IYinYangController.d.ts +301 -6
- package/dist/types/interfaces/IYinYangGeometry.d.ts +43 -0
- package/dist/types/interfaces/IYinYangInternalModel.d.ts +34 -0
- package/dist/types/interfaces/IYinYangModel.d.ts +3 -11
- package/dist/types/main.d.ts +9 -0
- package/dist/types/utils/actionImages.d.ts +14 -0
- package/dist/types/utils/actionPropagation.d.ts +74 -0
- package/dist/types/utils/appMode.d.ts +5 -0
- package/dist/types/utils/causeGraph.d.ts +6 -0
- package/dist/types/utils/causeMetrics.d.ts +26 -0
- package/dist/types/utils/chainCardHeight.d.ts +27 -0
- package/dist/types/utils/d3/D3Element.d.ts +2 -2
- package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +21 -4
- package/dist/types/utils/deltaChips.d.ts +15 -0
- package/dist/types/utils/deltaLabels.d.ts +54 -0
- package/dist/types/utils/facetteImages.d.ts +1 -0
- package/dist/types/utils/geometryUtils.d.ts +0 -1
- package/dist/types/utils/hierBadge.d.ts +44 -0
- package/dist/types/utils/idleSphereImage.d.ts +8 -0
- package/dist/types/utils/keyEventImages.d.ts +41 -0
- package/dist/types/utils/oddLegend.d.ts +30 -0
- package/dist/types/utils/positionalEfficiency.d.ts +16 -0
- package/dist/types/utils/yinYangWatermark.d.ts +29 -0
- package/package.json +27 -12
- package/dist/index.html +0 -1
- package/dist/types/data/coupe_rase_Orangs-outans/data_Kalimantan.d.ts +0 -3
- package/dist/types/data/coupe_rase_Orangs-outans/data_PT_Mayawana_Persada.d.ts +0 -3
- package/dist/types/data/data_institu_bancaire.d.ts +0 -3
- package/dist/types/interfaces/IOddItem.d.ts +0 -6
- package/dist/types/script.d.ts +0 -13
|
@@ -7,6 +7,9 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
|
|
|
7
7
|
private currentScale;
|
|
8
8
|
private currentY;
|
|
9
9
|
private currentX;
|
|
10
|
+
private arcMaskCache;
|
|
11
|
+
private underlyingGradientCache;
|
|
12
|
+
private maskIdCurrentCacheKey;
|
|
10
13
|
/**
|
|
11
14
|
* Initializes the SVG element and appends it to the given selector.
|
|
12
15
|
* Also creates a 'defs' section for reusable graphical elements like gradients.
|
|
@@ -16,11 +19,15 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
|
|
|
16
19
|
/**
|
|
17
20
|
* Draws an arc using D3 on the parent element.
|
|
18
21
|
*/
|
|
19
|
-
drawArc(parent: D3Element, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, fill: string):
|
|
22
|
+
drawArc(parent: D3Element, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, fill: string, cornerRadius?: number): D3Element;
|
|
20
23
|
/**
|
|
21
24
|
* Draws a circle on the parent element with the specified attributes.
|
|
22
25
|
*/
|
|
23
26
|
drawCircle(parent: D3Element, cx: number, cy: number, radius: number, fill: string, opacity?: number): D3Element;
|
|
27
|
+
private escapeAttributeValue;
|
|
28
|
+
private getDefById;
|
|
29
|
+
private defExists;
|
|
30
|
+
private getCacheKey;
|
|
24
31
|
/**
|
|
25
32
|
* Creates a linear gradient element in the 'defs' section.
|
|
26
33
|
* Stops define the gradient transitions.
|
|
@@ -30,6 +37,16 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
|
|
|
30
37
|
color: string;
|
|
31
38
|
opacity: number;
|
|
32
39
|
}[], gradientUnits: string): D3Element;
|
|
40
|
+
/**
|
|
41
|
+
* Creates a radial gradient element in the 'defs' section.
|
|
42
|
+
* Same contract as createLinearGradient: an existing def with the same id is
|
|
43
|
+
* reused as-is, so callers that need fresh stops must drop the old def first.
|
|
44
|
+
*/
|
|
45
|
+
createRadialGradient(id: string, cx: string, cy: string, r: string, stops: {
|
|
46
|
+
offset: string;
|
|
47
|
+
color: string;
|
|
48
|
+
opacity: number;
|
|
49
|
+
}[], gradientUnits: string): D3Element;
|
|
33
50
|
/**
|
|
34
51
|
* Helper function to create an arc path with the specified radii and angles.
|
|
35
52
|
*/
|
|
@@ -37,7 +54,7 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
|
|
|
37
54
|
/**
|
|
38
55
|
* Creates a mask for Yin or Yang arcs using a gradient for soft transitions.
|
|
39
56
|
*/
|
|
40
|
-
createYinOrYangArcMask(maskId: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang"):
|
|
57
|
+
createYinOrYangArcMask(maskId: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang", blendOpacity?: number): string;
|
|
41
58
|
/**
|
|
42
59
|
* Creates a mask for the border with a radial gradient to simulate fading edges.
|
|
43
60
|
*/
|
|
@@ -53,9 +70,9 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
|
|
|
53
70
|
/**
|
|
54
71
|
* Creates a radial gradient for an underlying circle.
|
|
55
72
|
*/
|
|
56
|
-
createUnderlyingCircleGradient(id: string, color: string):
|
|
73
|
+
createUnderlyingCircleGradient(id: string, color: string, spread?: number, intensity?: number): string;
|
|
57
74
|
/**
|
|
58
75
|
* Creates an underlying circle with a gradient and applies an arc mask.
|
|
59
76
|
*/
|
|
60
|
-
createUnderlyingCircleWithArcMask(maskId: string, gradientId: string, parent: D3Element, cx: number, cy: number, radius: number): void;
|
|
77
|
+
createUnderlyingCircleWithArcMask(maskId: string | undefined, gradientId: string, parent: D3Element, cx: number, cy: number, radius: number): void;
|
|
61
78
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { KeyEventEffect } from "../data/yasuni_key_events";
|
|
2
|
+
/** Ce dont une chip a besoin — sous-ensemble d'ActionDefinition. */
|
|
3
|
+
export interface ChipDeltas {
|
|
4
|
+
baseDelta: number;
|
|
5
|
+
weightDelta?: number;
|
|
6
|
+
}
|
|
7
|
+
/** 9.45 → "9,5" ; 9 → "9". Virgule décimale, zéro superflu retiré. */
|
|
8
|
+
export declare function formatDelta(value: number): string;
|
|
9
|
+
/** Toujours signé : "+2", "−3" (vrai signe moins, pas un tiret), "+0". */
|
|
10
|
+
export declare function formatSignedDelta(value: number): string;
|
|
11
|
+
/** Deltas du catalogue, sur une ligne Action. */
|
|
12
|
+
export declare function buildActionChipsHtml(action: ChipDeltas): string;
|
|
13
|
+
/** Bonus d'un Événement Clé — points ajoutés aux actions amplifiées. Sert
|
|
14
|
+
* aussi au malus d'une action adverse (mêmes champs, signe négatif). */
|
|
15
|
+
export declare function buildKeyEventChipsHtml(effect: KeyEventEffect): string;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as d3 from "d3";
|
|
2
|
+
/**
|
|
3
|
+
* Forme canonique d'un delta affiché dans le diagramme — une ligne de texte,
|
|
4
|
+
* sa couleur de remplissage et sa lueur.
|
|
5
|
+
*
|
|
6
|
+
* Le pictogramme fait partie du texte : Δ creux pour un delta de score,
|
|
7
|
+
* triangle plein orienté selon le signe pour un delta de poids. C'est lui qui
|
|
8
|
+
* porte le sens du poids (un poids en baisse n'est pas forcément un problème,
|
|
9
|
+
* voir WEIGHT_DELTA_COLOR), quand le score, lui, laisse la couleur le dire.
|
|
10
|
+
*
|
|
11
|
+
* Seule source de ce format : les deltas des satellites
|
|
12
|
+
* (ChildScoresDeltaRenderer) et ceux du badge du ghost central
|
|
13
|
+
* (YinYangDrawer.updateGhostDeltaBadge) doivent se lire comme une seule et
|
|
14
|
+
* même convention.
|
|
15
|
+
*/
|
|
16
|
+
export type DeltaRow = {
|
|
17
|
+
text: string;
|
|
18
|
+
fill: string;
|
|
19
|
+
glow: string;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Ligne d'un delta de score, à la décimale près (les projections d'action
|
|
23
|
+
* produisent des valeurs fractionnaires) — vert s'il monte, rouge s'il
|
|
24
|
+
* descend. `null` si le delta est nul : rien à montrer.
|
|
25
|
+
*/
|
|
26
|
+
export declare function buildScoreDeltaRow(delta: number | undefined | null, onLight?: boolean): DeltaRow | null;
|
|
27
|
+
/**
|
|
28
|
+
* Ligne d'un delta de poids : entier (le poids ne bouge que par pas entiers),
|
|
29
|
+
* toujours doré, le triangle disant le sens. `null` si le delta est nul.
|
|
30
|
+
*/
|
|
31
|
+
export declare function buildWeightDeltaRow(delta: number | undefined | null, onLight?: boolean): DeltaRow | null;
|
|
32
|
+
/**
|
|
33
|
+
* Voile doux posé derrière une pile de lignes de delta : détache le texte des
|
|
34
|
+
* fonds clairs ou chargés (images de facette, lobe blanc, ondes du ghost)
|
|
35
|
+
* sans reproduire l'effet "cadre" — pas de bordure, des bords flous. Un
|
|
36
|
+
* encadré, lui, se lit comme un élément d'interface posé sur le diagramme et
|
|
37
|
+
* prend le pas sur ce qu'il annote.
|
|
38
|
+
*
|
|
39
|
+
* À appeler AVANT les lignes qu'il accompagne (ordre de peinture).
|
|
40
|
+
*/
|
|
41
|
+
export declare function appendDeltaScrim(group: d3.Selection<any, any, any, any>, params: {
|
|
42
|
+
centerX: number;
|
|
43
|
+
centerY: number;
|
|
44
|
+
halfWidth: number;
|
|
45
|
+
halfHeight: number;
|
|
46
|
+
cornerRadius: number;
|
|
47
|
+
blur: number;
|
|
48
|
+
}): void;
|
|
49
|
+
/**
|
|
50
|
+
* Pose une ligne de delta : coloré, avec un contour fin de la même teinte qui
|
|
51
|
+
* le détache de n'importe quel fond (image de facette, lobe blanc) sans
|
|
52
|
+
* l'encadrer.
|
|
53
|
+
*/
|
|
54
|
+
export declare function appendDeltaRow(group: d3.Selection<any, any, any, any>, x: number, y: number, fontSize: number, role: string, row: DeltaRow, shadowEnabled: boolean): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getFacetteImageUrl(composanteId: string): string;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/** Badge de niveau hiérarchique (Sphère/Facette/ODD/Satellite/Action) affiché
|
|
2
|
+
* devant un nom d'élément — utilisé aussi bien dans le header des panneaux
|
|
3
|
+
* RECHERCHE que dans le chip de navigation du mode STACK, pour un rendu
|
|
4
|
+
* identique. Les classes CSS `ff-hier-badge--*` sont définies dans
|
|
5
|
+
* details-panel.css (couleurs fixées par profondeur : d0 Sphère, d1 Facette,
|
|
6
|
+
* d2 ODD, d3 Satellite, action-direct/action-prop).
|
|
7
|
+
*/
|
|
8
|
+
export type HierBadge = {
|
|
9
|
+
label: string;
|
|
10
|
+
cssClass: string;
|
|
11
|
+
};
|
|
12
|
+
export declare function buildHierBadgeHtml(badge: HierBadge): string;
|
|
13
|
+
/** Point coloré par ODD affiché devant le badge "Satellite" — même rôle que le
|
|
14
|
+
* dot persistant du chip STACK (`.stack-nav-chip-dot`), mais recréé à chaque
|
|
15
|
+
* rendu (pas de transition), pour les headers de panneau RECHERCHE. */
|
|
16
|
+
export declare function buildOddDotHtml(oddColor: string): string;
|
|
17
|
+
/** Icône propre à l'élément (action/Événement Clé), affichée entre le point
|
|
18
|
+
* ODD et le badge de type — jamais pour composante/cutting (pas de
|
|
19
|
+
* convention d'icône à ce niveau). onerror retire l'élément silencieusement
|
|
20
|
+
* si l'asset n'existe pas (protection générique, plus aucune icône
|
|
21
|
+
* manquante en pratique depuis que le catalogue des 25 Événements Clés est
|
|
22
|
+
* couvert). `isKeyEvent` ajoute le médaillon (plaque + anneau doré +
|
|
23
|
+
* Yin/Yang en filigrane, voir `.ke-medallion` dans details-panel.css) qui
|
|
24
|
+
* distingue un Événement d'une Action à la silhouette seule. */
|
|
25
|
+
export declare function buildItemIconHtml(iconUrl: string, isKeyEvent?: boolean): string;
|
|
26
|
+
/** Pastille d'état (score /100) affichée après le nom, dans le champ
|
|
27
|
+
* "élément sélectionné" tout en haut du panneau — uniquement quand cet
|
|
28
|
+
* élément est un satellite. Pas de delta : jugé trop chargé visuellement à
|
|
29
|
+
* cet endroit (le delta reste visible dans le diagramme). */
|
|
30
|
+
export declare function buildStateChipHtml(state: number): string;
|
|
31
|
+
/** Pastille de poids actuel (importance du satellite dans sa facette), même
|
|
32
|
+
* agencement que buildStateChipHtml : valeur entière en blanc + "/WEIGHT_MAX"
|
|
33
|
+
* atténué (le poids est un entier borné, pas un décimal). Pas de delta —
|
|
34
|
+
* voir buildStateChipHtml. */
|
|
35
|
+
export declare function buildWeightChipHtml(weight: number): string;
|
|
36
|
+
/** Assemble les pastilles état + poids d'un satellite (chacune omise si sa
|
|
37
|
+
* valeur correspondante est absente) — seule source de la logique de
|
|
38
|
+
* gluage, réutilisée par le champ "élément sélectionné" en RECHERCHE
|
|
39
|
+
* (PanelManager) comme en STACK (StackNavOverlay) pour qu'un ajout/retrait
|
|
40
|
+
* de pastille ne puisse pas diverger entre les deux modes. */
|
|
41
|
+
export declare function buildSelectedStateWeightChipsHtml(params: {
|
|
42
|
+
stateValue?: number;
|
|
43
|
+
weightValue?: number;
|
|
44
|
+
}): string;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Illustration affichée dans le cercle principal quand aucune facette n'est
|
|
3
|
+
* sélectionnée (mode idle) — remplace le rendu yin/yang de la composante 0
|
|
4
|
+
* par défaut, qui n'a pas de sens tant que rien n'a réellement été
|
|
5
|
+
* sélectionné. Fichier fixe (pas d'id à reconstruire), voir
|
|
6
|
+
* documentation/assets-pipeline.md Pipeline 5.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getIdleSphereImageUrl(): string;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export type KeyEventImageSize = "thumb" | "full";
|
|
2
|
+
/**
|
|
3
|
+
* Même convention que actionImages.ts (résolution par id, sans champ stocké),
|
|
4
|
+
* mais dans un dossier dédié : un Événement Clé affiche sa PROPRE illustration,
|
|
5
|
+
* jamais celle de l'action qu'il amplifie.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getKeyEventImageUrl(keyEventId: string, size: KeyEventImageSize): string;
|
|
8
|
+
/**
|
|
9
|
+
* Icône vectorielle courte (bulle du menu radial du cercle central, badge
|
|
10
|
+
* de carte), même convention de nommage.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getKeyEventIconUrl(keyEventId: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Événements Clés "débloqués" — POC.
|
|
15
|
+
*
|
|
16
|
+
* Le jeu final débloquera les Événements Clés au fil de l'aventure ; ce POC
|
|
17
|
+
* n'a pas encore de progression. On simule donc le verrou avec la seule
|
|
18
|
+
* donnée réellement disponible : l'illustration existe-t-elle ou non. Un
|
|
19
|
+
* événement sans illustration est présenté comme non débloqué (image
|
|
20
|
+
* remplacée par un cartouche verrouillé, libellés et boutons grisés) plutôt
|
|
21
|
+
* que comme une carte cassée à l'image manquante.
|
|
22
|
+
*
|
|
23
|
+
* Cette liste EST le contrat du pipeline 3 (voir documentation/assets-pipeline.md) :
|
|
24
|
+
* dès qu'un `{id}.webp` est produit dans public/assets/key-events/full|thumb,
|
|
25
|
+
* ajouter l'id ici — c'est la seule étape manuelle, il n'existe pas de moyen
|
|
26
|
+
* fiable de tester la présence d'un asset statique de façon synchrone au
|
|
27
|
+
* moment du rendu.
|
|
28
|
+
*
|
|
29
|
+
* Verrou PUREMENT VISUEL : un Événement Clé verrouillé reste sélectionnable,
|
|
30
|
+
* glissable dans la pile et amplifie normalement — le POC doit continuer à
|
|
31
|
+
* démontrer le moteur d'amplification sur les 25 événements.
|
|
32
|
+
*/
|
|
33
|
+
export declare const UNLOCKED_KEY_EVENT_IDS: ReadonlySet<string>;
|
|
34
|
+
export declare function isKeyEventUnlocked(keyEventId: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Cadenas fermé, marqueur commun à tous les rendus d'un Événement Clé
|
|
37
|
+
* verrouillé (cartouche de carte, ligne d'arbre, panneau de description).
|
|
38
|
+
* Inline plutôt qu'un asset : un seul glyphe, qui doit hériter de la couleur
|
|
39
|
+
* du contexte (`currentColor`) pour se fondre dans chacun de ces rendus.
|
|
40
|
+
*/
|
|
41
|
+
export declare function buildLockGlyphHtml(cssClass: string): string;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type Composante, type ODD } from "../data/yasuni_cause";
|
|
2
|
+
/** Bloc légende pour le statut sphère : tous les ODD de la sphère,
|
|
3
|
+
* description générique. À insérer sous `.ff-sphere-intro-desc`. */
|
|
4
|
+
export declare function buildOddLegendHtml(): string;
|
|
5
|
+
/** Bloc légende pour le statut facette : seulement les ODD de cette
|
|
6
|
+
* composante, description contextualisée à celle-ci. À insérer sous
|
|
7
|
+
* la description de facette (`.ff-element-intro-desc` / `.gs-detail-desc-text`). */
|
|
8
|
+
export declare function buildOddLegendHtmlForComposante(composante: Composante): string;
|
|
9
|
+
/** Bloc légende pour le statut satellite (cutting) : le seul ODD parent de
|
|
10
|
+
* ce satellite, description contextualisée à la composante. À insérer
|
|
11
|
+
* sous la description de satellite. */
|
|
12
|
+
export declare function buildOddLegendHtmlForOdd(odd: ODD, composanteId: string): string;
|
|
13
|
+
/** Gère le clic délégué sur un chip `[data-odd-legend-chip]` : ouvre sa
|
|
14
|
+
* description sous la grille (générique ou contextualisée selon la portée
|
|
15
|
+
* du bloc — voir `data-legend-composante`), ou la referme si déjà active.
|
|
16
|
+
* Retourne le nouvel état (`true` = ouvert, `false` = refermé) pour que
|
|
17
|
+
* l'appelant puisse répercuter ce même état ailleurs (ex : l'arc du
|
|
18
|
+
* diagramme correspondant à cet ODD). */
|
|
19
|
+
export declare function toggleOddLegendChip(chip: HTMLElement): boolean;
|
|
20
|
+
/** Attache le survol des chips `[data-odd-legend-chip]` d'un container à un
|
|
21
|
+
* callback (id ODD survolé, ou `null` en sortie — accompagné de la composante
|
|
22
|
+
* à cibler dans le diagramme, résolue par chip via `data-odd-legend-composante` :
|
|
23
|
+
* la composante elle-même en légende facette, la première composante qui
|
|
24
|
+
* contient cet ODD en légende sphère) — sens "chip → diagramme". À rappeler
|
|
25
|
+
* à chaque re-render (les chips sont recréés à chaque innerHTML). */
|
|
26
|
+
export declare function attachOddLegendHoverHandlers(container: HTMLElement, onHover: (oddId: string | null, composanteId?: string) => void): void;
|
|
27
|
+
/** Reflète dans un container donné le survol venant du diagramme — sens
|
|
28
|
+
* "arc → chip". Ne fait rien si aucun chip ne correspond (ex : légende de
|
|
29
|
+
* la sphère, sans arc affiché à l'écran). */
|
|
30
|
+
export declare function setOddLegendHoverState(container: HTMLElement, oddId: string | null): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plancher des slots réellement occupés : une densité Beta(α,β) vaut
|
|
3
|
+
* structurellement 0 pile aux bords (t=0 ou t=1) quels que soient α et β —
|
|
4
|
+
* aucun réglage de forme ne peut l'éviter. Un slot occupé au bord de la
|
|
5
|
+
* fenêtre garde donc une efficacité résiduelle plutôt que de retomber à 0
|
|
6
|
+
* comme un slot vide/jamais joué.
|
|
7
|
+
*/
|
|
8
|
+
export declare const MIN_OCCUPIED_POSITIONAL_EFF = 0.15;
|
|
9
|
+
/** Beta(t) normalisée par son pic, sans plancher — exactement 0 aux bords. */
|
|
10
|
+
export declare function rawPositionalEfficiency(t: number): number;
|
|
11
|
+
/**
|
|
12
|
+
* Efficacité positionnelle d'un slot RÉELLEMENT OCCUPÉ dans une fenêtre
|
|
13
|
+
* [windowMin, windowMin + windowSize]. N'appeler que pour un slot occupé —
|
|
14
|
+
* un slot vide/hors-fenêtre doit rester à 0 sans plancher immérité.
|
|
15
|
+
*/
|
|
16
|
+
export declare function occupiedSlotPositionalEfficiency(slot: number, windowMin: number, windowSize: number): number;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as d3 from "d3";
|
|
2
|
+
/**
|
|
3
|
+
* Insère le filigrane (voile + courbe en S + les deux yeux) dans chaque
|
|
4
|
+
* élément d'une sélection D3. À appeler une seule fois, sur la sélection
|
|
5
|
+
* enter() : la mise à l'échelle et la teinte se règlent ensuite par
|
|
6
|
+
* `styleYinYangWatermark` à chaque rendu.
|
|
7
|
+
*
|
|
8
|
+
* L'appelant reste responsable du z-order : appeler ce helper APRÈS la
|
|
9
|
+
* plaque de fond et AVANT le pictogramme.
|
|
10
|
+
*/
|
|
11
|
+
export declare function appendYinYangWatermark<TDatum>(selection: d3.Selection<any, TDatum, any, any>): void;
|
|
12
|
+
/**
|
|
13
|
+
* Met le filigrane d'UN élément à l'échelle du médaillon qui l'accueille et
|
|
14
|
+
* lui donne sa teinte.
|
|
15
|
+
*
|
|
16
|
+
* @param host élément conteneur (celui qui a reçu `appendYinYangWatermark`)
|
|
17
|
+
* @param radius rayon du médaillon, dans les unités du conteneur
|
|
18
|
+
* @param color teinte du filigrane (l'or des Événements Clés par défaut ;
|
|
19
|
+
* un gris froid pour un événement verrouillé, la teinte or
|
|
20
|
+
* étant justement ce qu'on lui retire)
|
|
21
|
+
* @param intensity multiplicateur des opacités de référence — en dessous de 1
|
|
22
|
+
* sur les grands médaillons, dont la surface fait davantage
|
|
23
|
+
* ressortir le motif à opacité égale.
|
|
24
|
+
*/
|
|
25
|
+
export declare function styleYinYangWatermark(host: d3.Selection<any, any, any, any>, params: {
|
|
26
|
+
radius: number;
|
|
27
|
+
color?: string;
|
|
28
|
+
intensity?: number;
|
|
29
|
+
}): void;
|
package/package.json
CHANGED
|
@@ -1,20 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@micheeeeel/yinyangapp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "A program to visualize human activity balance to reach Sustainable Development Objectives",
|
|
5
5
|
"main": "dist/bundle.js",
|
|
6
|
-
"types": "dist/types/
|
|
6
|
+
"types": "dist/types/main.d.ts",
|
|
7
7
|
"scripts": {
|
|
8
|
-
"test": "
|
|
9
|
-
"build": "tsc -p tsconfig.types.json
|
|
10
|
-
"start": "webpack serve --mode development
|
|
11
|
-
"deploy": "npm run build && gh-pages -d dist --no-delete"
|
|
8
|
+
"test": "vitest run",
|
|
9
|
+
"build": "webpack --mode production && tsc -p tsconfig.types.json",
|
|
10
|
+
"start": "webpack serve --mode development",
|
|
11
|
+
"deploy": "npm run build && gh-pages -d dist --no-delete",
|
|
12
|
+
"check:file-lines": "node scripts/check-file-lines.mjs",
|
|
13
|
+
"ci:guard": "npm run check:file-lines",
|
|
14
|
+
"analyze": "ANALYZE=true webpack --mode production && tsc -p tsconfig.types.json",
|
|
15
|
+
"benchmark:compare": "node benchmarks/compare.js"
|
|
12
16
|
},
|
|
13
17
|
"author": "Thomas MICHEL",
|
|
14
18
|
"license": "ISC",
|
|
15
|
-
"
|
|
16
|
-
"d3": "^7.9.0"
|
|
17
|
-
"gh-pages": "^6.2.0"
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"d3": "^7.9.0"
|
|
18
21
|
},
|
|
19
22
|
"devDependencies": {
|
|
20
23
|
"@babel/core": "^7.24.0",
|
|
@@ -22,15 +25,27 @@
|
|
|
22
25
|
"@babel/preset-typescript": "^7.24.1",
|
|
23
26
|
"@types/d3": "^7.4.3",
|
|
24
27
|
"babel-loader": "^9.1.3",
|
|
28
|
+
"copy-webpack-plugin": "^14.0.0",
|
|
29
|
+
"css-loader": "^7.1.4",
|
|
30
|
+
"css-minimizer-webpack-plugin": "^8.0.0",
|
|
31
|
+
"d3": "^7.9.0",
|
|
32
|
+
"gh-pages": "^6.2.0",
|
|
25
33
|
"html-webpack-plugin": "^5.6.3",
|
|
34
|
+
"mini-css-extract-plugin": "^2.10.2",
|
|
35
|
+
"playwright": "^1.61.0",
|
|
36
|
+
"style-loader": "^4.0.0",
|
|
26
37
|
"ts-loader": "^9.5.1",
|
|
27
38
|
"typescript": "^5.4.5",
|
|
28
|
-
"
|
|
39
|
+
"vitest": "^4.1.11",
|
|
40
|
+
"webpack": "^5.105.0",
|
|
41
|
+
"webpack-bundle-analyzer": "^5.3.0",
|
|
29
42
|
"webpack-cli": "^5.1.4",
|
|
30
|
-
"webpack-dev-server": "^5.
|
|
43
|
+
"webpack-dev-server": "^5.2.3"
|
|
31
44
|
},
|
|
32
45
|
"files": [
|
|
33
|
-
"dist",
|
|
46
|
+
"dist/bundle.js",
|
|
47
|
+
"dist/bundle.js.LICENSE.txt",
|
|
48
|
+
"dist/types",
|
|
34
49
|
"README.md"
|
|
35
50
|
]
|
|
36
51
|
}
|
package/dist/index.html
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><title>YinYangApp Visualization</title><script defer="defer" src="bundle.js"></script></head><body><h1>YinYang Visualization</h1><div id="svg-container" style="width: 100vw; height: 100vh"></div><script src="https://d3js.org/d3.v7.min.js"></script></body></html>
|
package/dist/types/script.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { IViewData } from "./interfaces/IViewData";
|
|
2
|
-
import { IOddItem } from "./interfaces/IOddItem";
|
|
3
|
-
export declare function initializeYinYangApp(viewData: IViewData): void;
|
|
4
|
-
export interface YinYangSvgConfig {
|
|
5
|
-
data: IOddItem[];
|
|
6
|
-
viewData: Omit<IViewData, "containerId"> & {
|
|
7
|
-
containerId?: string;
|
|
8
|
-
};
|
|
9
|
-
isEnemy?: boolean;
|
|
10
|
-
includeChildren?: boolean;
|
|
11
|
-
}
|
|
12
|
-
export declare function createYinYangSvg(config: YinYangSvgConfig): SVGSVGElement | null;
|
|
13
|
-
export declare function createYinYangSvgs(configs: YinYangSvgConfig[]): SVGSVGElement[];
|