@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.
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
@@ -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): void;
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"): D3Element;
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): void;
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;
@@ -1,4 +1,3 @@
1
1
  export declare class GeometryUtils {
2
- static calculateSpikeLength(radius: number, value: number): number;
3
2
  static calculateSmallCircleRadius(grandRadius: number, dataLength: number): number;
4
3
  }
@@ -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": "1.0.6",
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/script.d.ts",
6
+ "types": "dist/types/main.d.ts",
7
7
  "scripts": {
8
- "test": "echo \"Error: no test specified\" && exit 1",
9
- "build": "tsc -p tsconfig.types.json && webpack --mode production",
10
- "start": "webpack serve --mode development --open",
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
- "dependencies": {
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
- "webpack": "^5.90.3",
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.0.4"
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>
@@ -1,3 +0,0 @@
1
- import { IOddItem } from "../../interfaces/IOddItem";
2
- declare let odd: IOddItem[];
3
- export default odd;
@@ -1,3 +0,0 @@
1
- import { IOddItem } from "../../interfaces/IOddItem";
2
- declare let odd: IOddItem[];
3
- export default odd;
@@ -1,3 +0,0 @@
1
- import { IOddItem } from "../interfaces/IOddItem";
2
- declare let odd: IOddItem[];
3
- export default odd;
@@ -1,6 +0,0 @@
1
- export interface IOddItem {
2
- categorie: string;
3
- composante: string;
4
- score: number;
5
- description: string;
6
- }
@@ -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[];