@micheeeeel/yinyangapp 2.6.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/dist/bundle.js +1 -1
  2. package/dist/types/adapters/yasuniCauseAdapter.d.ts +3 -24
  3. package/dist/types/api.d.ts +1 -2
  4. package/dist/types/components/controller/actions/ActionProjectionService.d.ts +4 -0
  5. package/dist/types/components/view/ViewInitializer.d.ts +11 -9
  6. package/dist/types/components/view/YinYangDrawer.d.ts +7 -10
  7. package/dist/types/data/activeDiagram.d.ts +3 -2
  8. package/dist/types/data/contacts/buildContactSphere.d.ts +0 -8
  9. package/dist/types/data/contacts/demoContact.d.ts +3 -0
  10. package/dist/types/data/contacts/index.d.ts +2 -11
  11. package/dist/types/interfaces/ICauseModel.d.ts +3 -1
  12. package/dist/types/utils/causeMetrics.d.ts +32 -0
  13. package/dist/types/utils/facetWeightLabel.d.ts +11 -0
  14. package/package.json +1 -1
  15. package/dist/types/data/contacts/profiles/andres_cevallos.d.ts +0 -2
  16. package/dist/types/data/contacts/profiles/camila_serrano.d.ts +0 -2
  17. package/dist/types/data/contacts/profiles/dika.d.ts +0 -2
  18. package/dist/types/data/contacts/profiles/elena_viteri.d.ts +0 -2
  19. package/dist/types/data/contacts/profiles/etawane.d.ts +0 -2
  20. package/dist/types/data/contacts/profiles/gabriel_mena.d.ts +0 -2
  21. package/dist/types/data/contacts/profiles/kuri_tapuy.d.ts +0 -2
  22. package/dist/types/data/contacts/profiles/lucia_cardenas.d.ts +0 -2
  23. package/dist/types/data/contacts/profiles/mariana_paredes.d.ts +0 -2
  24. package/dist/types/data/contacts/profiles/martin_aguirre.d.ts +0 -2
  25. package/dist/types/data/contacts/profiles/mateo_salazar.d.ts +0 -2
  26. package/dist/types/data/contacts/profiles/sofia_almeida.d.ts +0 -2
  27. package/dist/types/data/contacts/profiles/tomas_valverde.d.ts +0 -2
@@ -6,6 +6,9 @@ import { type ContactProfileData } from "../data/contacts";
6
6
  * Cause attendu par mapCauseToInternalModel.
7
7
  * Les scores initiaux sont neutres (0.5 = 50 % de tension), les poids valent 1
8
8
  * par satellite tant qu'aucune valeur n'est renseignée dans les données.
9
+ * Poids d'une facette (taille de son arc) : C_f, moyenne des poids de TOUS
10
+ * ses satellites, catégories confondues, zéros inclus (`meanWeight`) — même
11
+ * règle pour une cause et pour un contact (POC-05A4).
9
12
  */
10
13
  export declare function composantesToCause(composantes: Composante[], id?: string, name?: string): Cause;
11
14
  /** La `Cause` du Yasuní, fraîchement construite à chaque appel (l'hôte peut
@@ -25,27 +28,3 @@ export declare function getYasuniCause(id?: string): Cause;
25
28
  * bornes (`validateContactProfile`).
26
29
  */
27
30
  export declare function contactProfileToCause(profile: ContactProfileData, id?: string): Cause;
28
- /**
29
- * La `Cause` d'un contact EMBARQUÉ dans la lib, fraîchement construite à
30
- * chaque appel. `id` par défaut : l'id du contact. Lève une erreur si le
31
- * contact est inconnu (voir `listContacts`).
32
- *
33
- * @deprecated Les profils embarqués sont des fixtures gelées de la page
34
- * standalone ; une app hôte fournit ses profils à `contactProfileToCause`.
35
- * Retrait prévu en 3.0.0.
36
- */
37
- export declare function getContactCause(contactId: string, id?: string): Cause;
38
- export interface ContactSummary {
39
- id: string;
40
- name: string;
41
- role: string;
42
- organisation: string;
43
- provisional: boolean;
44
- }
45
- /**
46
- * Les contacts EMBARQUÉS, dans l'ordre de la calibration Notion.
47
- *
48
- * @deprecated Fixtures gelées de la page standalone ; la liste des contacts
49
- * d'une app hôte vient de sa propre source. Retrait prévu en 3.0.0.
50
- */
51
- export declare function listContacts(): ContactSummary[];
@@ -58,8 +58,7 @@ export { createYinYangFilmSvg, createYinYangFilmSvgAsync } from "./api-film";
58
58
  export type { YinYangFilmConfig, YinYangFilmAsyncOptions } from "./api-film";
59
59
  export { createRandomCause } from "./api-random";
60
60
  export type { RandomCauseOptions, RandomRange } from "./api-random";
61
- export { getYasuniCause, getContactCause, listContacts, contactProfileToCause, } from "./adapters/yasuniCauseAdapter";
62
- export type { ContactSummary } from "./adapters/yasuniCauseAdapter";
61
+ export { getYasuniCause, contactProfileToCause } from "./adapters/yasuniCauseAdapter";
63
62
  export { validateContactProfile } from "./data/contacts/buildContactSphere";
64
63
  export type { ContactProfileData, ContactSatelliteValue, } from "./data/contacts/buildContactSphere";
65
64
  export { UNIVERSAL_FACETS, CONTACT_CATEGORIES } from "./data/contacts/universalFacets";
@@ -98,5 +98,9 @@ export declare function projectGhostStateForComponent(params: {
98
98
  sourceCuttingIndex: number;
99
99
  actionDelta: number;
100
100
  }): GhostProjectionResult | null;
101
+ /** Tension projetée de la facette : même règle que sa tension courante
102
+ * (`facetTensionFromOdds`, moyenne pondérée sur tous ses satellites), sur
103
+ * les tensions projetées de chaque satellite. */
104
+ export declare function projectedComponentTension(component: YinYangInternalModel["components"][number], projectedCuttingStatesByOddId: ReadonlyMap<string, readonly ProjectedCuttingState[]>): number;
101
105
  export declare function getOriginalComponentTension(component: YinYangInternalModel["components"][number] | undefined): number | null;
102
106
  export declare function getOriginalOddTension(component: YinYangInternalModel["components"][number] | undefined, oddId: string): number | null;
@@ -305,20 +305,16 @@ export declare class ViewInitializer {
305
305
  */
306
306
  getAverageTension(): number;
307
307
  getAverageState(): number;
308
- /** Poids agrégé de la facette courante : somme des poids de tous ses ODD
309
- * (même formule que getOddWeight, celle qui fixe la taille de chaque
310
- * arc — le chiffre affiché au centre du cercle explique donc la somme
311
- * des arcs qui l'entourent). */
308
+ /** Poids C_f de la facette courante : moyenne des poids de tous ses
309
+ * satellites (`meanWeight`, même règle que `perimeterWeight`, qui fixe la
310
+ * taille de son arc de bordure). */
312
311
  getFacetteWeight(): number;
313
- /** Plafond du poids agrégé : WEIGHT_MAX par satellite, tous ODD confondus
314
- * (même règle que le plafond par-ODD affiché sur les arcs, voir
315
- * buildOddArcLabelLines dans YinYangDrawer). */
312
+ /** Plafond du poids C_f : WEIGHT_MAX, quel que soit le nombre de
313
+ * satellites. */
316
314
  getFacetteWeightMax(): number;
317
315
  /** getFacetteWeight pour une facette quelconque (poids de chaque arc de
318
316
  * bordure quand "Afficher libellés" est actif). */
319
317
  getComponentWeight(component: YinYangComponentNode | null | undefined): number;
320
- /** getFacetteWeightMax pour une facette quelconque. */
321
- getComponentWeightMax(component: YinYangComponentNode | null | undefined): number;
322
318
  getCurrentComponentIndex(): number;
323
319
  getCurrentComponentName(): string;
324
320
  getCurrentComponentOrientation(): "yin" | "yang";
@@ -414,6 +410,10 @@ export declare class ViewInitializer {
414
410
  private getAnimationCurrentState;
415
411
  private getComponentAnimationState;
416
412
  private buildOddCategories;
413
+ /** Part d'une catégorie DANS sa facette (angle de son arc au cercle
414
+ * central) : somme des poids de ses satellites — chaque satellite compte
415
+ * une fois, comme dans Q_f. Sa pastille, elle, affiche la moyenne
416
+ * (`facetWeightLabel`). */
417
417
  private getOddWeight;
418
418
  private buildCategoriesFromComponent;
419
419
  /**
@@ -483,6 +483,8 @@ export declare class ViewInitializer {
483
483
  private buildOddSpikes;
484
484
  private buildComponentSpikes;
485
485
  private buildSpike;
486
+ /** Tension de la facette : moyenne pondérée sur tous ses satellites,
487
+ * repli sur leur moyenne simple (`facetTensionFromOdds`, POC-05A4). */
486
488
  private calculateAverageTension;
487
489
  private getCurrentComponent;
488
490
  handleSparkAngleUpdate(currentAngle: number, previousAngle: number | null): void;
@@ -304,11 +304,11 @@ export declare class YinYangDrawer {
304
304
  */
305
305
  private renderFacetteStateLabel;
306
306
  /**
307
- * Affiche le poids d'une facette ("18/40") DANS son arc de bordure
307
+ * Affiche le poids d'une facette (« 6,8 ») DANS son arc de bordure
308
308
  * (segment de BorderDrawer), et non dans un lobe : ce poids est celui qui
309
- * dimensionne l'arc, il se lit donc sur lui. Le poids et son plafond sont
310
- * la somme des poids de tous les ODD de la facette (voir
311
- * ViewInitializer.getComponentWeight/getComponentWeightMax).
309
+ * dimensionne l'arc, il se lit donc sur lui. C'est C_f, la moyenne des
310
+ * poids de tous ses satellites (`facetWeightLabel`), sur 10 avec le
311
+ * suffixe.
312
312
  *
313
313
  * Par défaut seule la facette active porte son poids (et seulement quand
314
314
  * ses libellés sont visibles, voir shouldShowFacetteLabels) ; avec
@@ -475,12 +475,9 @@ export declare class YinYangDrawer {
475
475
  * (renderChildStateLabel/renderChildWeightLabel), donc le cercle central
476
476
  * et son cortège se lisent enfin de la même façon.
477
477
  *
478
- * Le maximum du poids n'est PAS WEIGHT_MAX : un ODD pèse la somme des
479
- * poids de ses satellites (même formule que ViewInitializer.getOddWeight,
480
- * celle qui fixe l'angle de l'arc — le chiffre affiché explique donc la
481
- * taille de l'arc sous lui), et son plafond est WEIGHT_MAX × nombre de
482
- * satellites. Il est affiché tel quel plutôt que ramené à une échelle /10
483
- * qui n'existe qu'au niveau satellite.
478
+ * Le poids d'un ODD est la moyenne des poids de ses seuls satellites
479
+ * (`facetWeightLabel`, « 6,8 »), sur WEIGHT_MAX avec le suffixe — même
480
+ * lecture que la pastille de sa facette (POC-05A4).
484
481
  *
485
482
  * En mode non compact, le nom court de l'ODD reste affiché au-dessus des
486
483
  * deux métriques : c'est une information que le numéro ne portait pas.
@@ -26,7 +26,7 @@ export interface DiagramOption {
26
26
  label: string;
27
27
  }
28
28
  export interface DiagramEnvironment {
29
- /** `location.search` de la page (ex. "?diagram=etawane"). */
29
+ /** `location.search` de la page (ex. "?diagram=demo_contact"). */
30
30
  search: string | null | undefined;
31
31
  /** Page standalone de la lib (seule à honorer le paramètre d'URL). */
32
32
  standalone: boolean;
@@ -42,7 +42,8 @@ export declare function detectDiagramEnvironment(): DiagramEnvironment;
42
42
  /** Données d'un diagramme : les catalogues Yasuní tels quels, ou une sphère
43
43
  * de contact (pas d'actions, d'événements, de graphe ni de propagation). */
44
44
  export declare function buildDiagramData(id: string): DiagramData;
45
- /** Options du sélecteur de diagramme : le Yasuní puis les contacts. */
45
+ /** Options du sélecteur de diagramme : le Yasuní puis le contact de
46
+ * démonstration. */
46
47
  export declare function listDiagramOptions(): DiagramOption[];
47
48
  /** URL de la page courante pointant sur `diagramId` (les autres paramètres
48
49
  * sont conservés ; le Yasuní, diagramme par défaut, retire le paramètre). */
@@ -23,12 +23,6 @@ export interface ContactProfileData {
23
23
  /** Une valeur par satellite de la grille universelle, ni plus ni moins. */
24
24
  values: Record<SatelliteKey, ContactSatelliteValue>;
25
25
  }
26
- /** Profil EMBARQUÉ (fixtures `profiles/<id>.ts`, page standalone et
27
- * `getContactCause` dépréciée) : identité complète de la calibration. */
28
- export interface ContactProfile extends ContactProfileData {
29
- role: string;
30
- organisation: string;
31
- }
32
26
  /**
33
27
  * Vérifie un profil reçu de l'hôte AVANT de construire sa sphère : une clé
34
28
  * de satellite manquante ou inconnue, un score ou un poids non fini ou hors
@@ -42,5 +36,3 @@ export declare function validateContactProfile(profile: ContactProfileData): voi
42
36
  */
43
37
  export declare function qualityPercentToTension(percent: number): number;
44
38
  export declare function buildContactSphere(profile: ContactProfileData): Sphere;
45
- /** Valeurs identiques pour les 38 satellites — gabarit de profil non calibré. */
46
- export declare function uniformContactValues(score: number, weight: number): Record<SatelliteKey, ContactSatelliteValue>;
@@ -0,0 +1,3 @@
1
+ import type { ContactProfileData } from "./buildContactSphere";
2
+ export declare const DEMO_CONTACT_ID = "demo_contact";
3
+ export declare const demoContactProfile: ContactProfileData;
@@ -1,14 +1,5 @@
1
- import type { Sphere } from "../yasuni_cause";
2
- import { type ContactProfile, type ContactProfileData } from "./buildContactSphere";
3
- export declare const contactProfiles: readonly ContactProfile[];
4
- export declare const CONTACT_IDS: readonly string[];
5
- export declare function getContactProfile(contactId: string): ContactProfile | undefined;
6
- /** Le profil embarqué `contactId` au format injectable, présenté comme
7
- * avant 2.6.0 (« rôle — organisme ») ; lève une erreur si l'id est inconnu. */
8
- export declare function getEmbeddedContactProfileData(contactId: string): ContactProfileData;
9
- /** Sphere fraîchement construite du contact ; lève une erreur si l'id est inconnu. */
10
- export declare function getContactSphere(contactId: string): Sphere;
11
1
  export { buildContactSphere, qualityPercentToTension, validateContactProfile, } from "./buildContactSphere";
12
- export type { ContactProfile, ContactProfileData, ContactSatelliteValue, } from "./buildContactSphere";
2
+ export type { ContactProfileData, ContactSatelliteValue } from "./buildContactSphere";
3
+ export { DEMO_CONTACT_ID, demoContactProfile } from "./demoContact";
13
4
  export { UNIVERSAL_FACETS, CONTACT_CATEGORIES } from "./universalFacets";
14
5
  export type { SatelliteKey, ContactFacetId, ContactCategoryId } from "./universalFacets";
@@ -23,7 +23,9 @@ export interface CauseComponent {
23
23
  description?: string;
24
24
  orientation: YinYangOrientation;
25
25
  odds: CauseOdd[];
26
- /** Somme brute des poids de tous les satellites de la facette. */
26
+ /** Poids de la facette (taille relative de son arc) : C_f, moyenne des
27
+ * poids de TOUS ses satellites, zéros inclus, de 0 à 10 — même règle pour
28
+ * une cause et pour un contact (`meanWeight`, POC-05A4). */
27
29
  perimeterWeight: number;
28
30
  }
29
31
  export interface Cause {
@@ -5,9 +5,40 @@ export declare function clampScore(value: number): number;
5
5
  * Canonical domain metric in [0, 1]. Weighted by each satellite's `weight`
6
6
  * when provided, so a heavier satellite pulls the tension further toward
7
7
  * its own score; falls back to a simple average otherwise.
8
+ *
9
+ * ⚠️ FACETTES D'UN CONTACT : cette règle est reproduite à l'identique par
10
+ * yvy-backend (`src/contacts/contact-facets.ts`), qui fait autorité pour le
11
+ * jeu. Deux implémentations à maintenir identiques : toute évolution met à
12
+ * jour les deux, ainsi que le fichier de cas commun
13
+ * `src/data/contacts/contact-facets.reference.json` (POC-05A2).
8
14
  */
9
15
  export declare function tensionFromCuttings(cuttingScores: number[], cuttingWeights?: number[]): number;
10
16
  export declare const oddTensionFromCuttings: typeof tensionFromCuttings;
17
+ /** Satellites d'une catégorie (ODD) d'une facette : tensions et poids. */
18
+ interface FacetOddCuttings {
19
+ cuttingScores: readonly number[];
20
+ cuttingWeights: readonly number[];
21
+ }
22
+ /**
23
+ * Tension d'une FACETTE (cause ou contact, POC-05A4) : `tensionFromCuttings`
24
+ * sur TOUS ses satellites, catégories confondues — moyenne pondérée par les
25
+ * poids, ou moyenne simple de la facette si tous ses poids sont nuls (pas de
26
+ * repli par catégorie). Q_f = (1 − T) × 100. `cuttingTensions` remplace les
27
+ * tensions de la catégorie d'indice donné (projection d'une action) ; une catégorie dont
28
+ * les poids ne sont pas alignés sur les scores compte ses satellites à 1.
29
+ * Facette sans satellite : 0,5.
30
+ */
31
+ export declare function facetTensionFromOdds(odds: readonly FacetOddCuttings[], cuttingTensions?: (oddIndex: number) => readonly number[] | undefined): number;
32
+ /**
33
+ * POIDS C_f d'une facette — ou d'une catégorie, pour sa pastille — (causes
34
+ * et contacts, POC-05A4) : moyenne arithmétique des poids (bornés à 0) de
35
+ * TOUS ses satellites, zéros inclus, de 0 à 10, indépendante de leur nombre.
36
+ * Fixe la taille des arcs de facette et la valeur des pastilles. Facettes
37
+ * d'un contact : reproduite à l'identique par yvy-backend
38
+ * (`contactFacetWeights`), cas communs dans
39
+ * `src/data/contacts/contact-facets.reference.json`.
40
+ */
41
+ export declare function meanWeight(weights: readonly number[]): number;
11
42
  export declare function stateFromTension(tension: number): number;
12
43
  /** Bornes du poids d'un satellite (importance dans sa facette). Un satellite
13
44
  * vaut 1 par défaut ; les actions le font varier par pas entiers, mais ne
@@ -24,3 +55,4 @@ export declare function clampWeight(value: number): number;
24
55
  * signe — ex: +1 sur un satellite déjà à WEIGHT_MAX ne change rien.
25
56
  */
26
57
  export declare function effectiveWeightDelta(currentWeight: number, delta: number): number;
58
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Libellé de la pastille de poids d'une facette ou d'une catégorie (ODD),
3
+ * pour une cause comme pour un contact (POC-05A4) : C_f, moyenne des poids
4
+ * de tous ses satellites (`meanWeight`), arrondie à un chiffre après la
5
+ * virgule, avec une virgule décimale — « 7,2 ». `max` (WEIGHT_MAX, 10) ne
6
+ * s'affiche qu'avec le suffixe (`facetteLabelSuffixVisible`).
7
+ */
8
+ export declare function facetWeightLabel(weights: readonly number[]): {
9
+ value: string;
10
+ max: number;
11
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micheeeeel/yinyangapp",
3
- "version": "2.6.0",
3
+ "version": "3.0.1",
4
4
  "description": "A program to visualize human activity balance to reach Sustainable Development Objectives",
5
5
  "main": "dist/bundle.js",
6
6
  "types": "dist/types/main.d.ts",
@@ -1,2 +0,0 @@
1
- import { type ContactProfile } from "../buildContactSphere";
2
- export declare const andresCevallosProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const camilaSerranoProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const dikaProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import { type ContactProfile } from "../buildContactSphere";
2
- export declare const elenaViteriProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const etawaneProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const gabrielMenaProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import { type ContactProfile } from "../buildContactSphere";
2
- export declare const kuriTapuyProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const luciaCardenasProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const marianaParedesProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const martinAguirreProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const mateoSalazarProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import type { ContactProfile } from "../buildContactSphere";
2
- export declare const sofiaAlmeidaProfile: ContactProfile;
@@ -1,2 +0,0 @@
1
- import { type ContactProfile } from "../buildContactSphere";
2
- export declare const tomasValverdeProfile: ContactProfile;