@micheeeeel/yinyangapp 3.0.1 → 3.1.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 (117) hide show
  1. package/dist/bundle.css +1 -0
  2. package/dist/bundle.js +1 -2
  3. package/dist/types/adapters/yasuniCauseAdapter.d.ts +13 -2
  4. package/dist/types/adapters/yinYangAdapter.d.ts +7 -0
  5. package/dist/types/animations/AnimationsMngr.d.ts +69 -15
  6. package/dist/types/animations/FrameScheduler.d.ts +99 -0
  7. package/dist/types/animations/rotationMotion.d.ts +43 -0
  8. package/dist/types/api.d.ts +31 -3
  9. package/dist/types/benchmark/runner.d.ts +20 -0
  10. package/dist/types/benchmark/scenarios.d.ts +55 -6
  11. package/dist/types/components/controller/YinYangController.d.ts +109 -14
  12. package/dist/types/components/controller/action-stack/ActionStackController.d.ts +16 -1
  13. package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +4 -0
  14. package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +13 -2
  15. package/dist/types/components/controller/action-stack/ActionStackState.d.ts +8 -5
  16. package/dist/types/components/controller/action-stack/StackFocusController.d.ts +8 -7
  17. package/dist/types/components/controller/action-stack/stackChromePalette.d.ts +20 -0
  18. package/dist/types/components/controller/actions/ActionProjectionService.d.ts +12 -1
  19. package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +74 -32
  20. package/dist/types/components/controller/actions/KeyEventController.d.ts +78 -70
  21. package/dist/types/components/controller/actions/{CoreEventMenuController.d.ts → KeyEventMenuController.d.ts} +28 -33
  22. package/dist/types/components/controller/actions/radialItemMenu.d.ts +43 -5
  23. package/dist/types/components/controller/children/ChildInteractionController.d.ts +4 -0
  24. package/dist/types/components/controller/children/ChildrenBuilder.d.ts +19 -22
  25. package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +3 -1
  26. package/dist/types/components/controller/children/IdleFacettesController.d.ts +205 -0
  27. package/dist/types/components/controller/children/facetModulation.d.ts +49 -0
  28. package/dist/types/components/controller/children/idleTabLayout.d.ts +95 -0
  29. package/dist/types/components/controller/children/idleTabMorph.d.ts +45 -0
  30. package/dist/types/components/controller/children/signatureLook.d.ts +10 -0
  31. package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +14 -0
  32. package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +3 -3
  33. package/dist/types/components/controller/force-field/ForceFieldCanvasPainter.d.ts +99 -0
  34. package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +9 -0
  35. package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +28 -57
  36. package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +4 -1
  37. package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +16 -1
  38. package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +10 -18
  39. package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +2 -2
  40. package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +2 -0
  41. package/dist/types/components/controller/force-field/keyEventPresentation.d.ts +47 -0
  42. package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +4 -0
  43. package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +4 -2
  44. package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +1 -0
  45. package/dist/types/components/controller/force-field/shieldViewModel.d.ts +6 -2
  46. package/dist/types/components/controller/force-field/types.d.ts +2 -1
  47. package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +7 -0
  48. package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +13 -0
  49. package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +16 -0
  50. package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +33 -0
  51. package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +76 -25
  52. package/dist/types/components/controller/odd/OddHighlightEffects.d.ts +2 -0
  53. package/dist/types/components/controller/odd/OddViewManager.d.ts +7 -3
  54. package/dist/types/components/controller/odd/childHighlightStyles.d.ts +45 -3
  55. package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +8 -5
  56. package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +4 -4
  57. package/dist/types/components/controller/state/ControllerSession.d.ts +3 -3
  58. package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +10 -0
  59. package/dist/types/components/controller/state/YinYangControllerState.d.ts +20 -9
  60. package/dist/types/components/controller/types.d.ts +9 -2
  61. package/dist/types/components/controller/utils/actionCatalog.d.ts +1 -1
  62. package/dist/types/components/controller/utils/eventFieldTargets.d.ts +19 -13
  63. package/dist/types/components/controller/utils/keyEventPropagationContext.d.ts +4 -0
  64. package/dist/types/components/controller/utils/keyEventTargetBreakdowns.d.ts +4 -0
  65. package/dist/types/components/controller/utils/svgTransform.d.ts +16 -0
  66. package/dist/types/components/controls/ObstacleDemoControl.d.ts +3 -0
  67. package/dist/types/components/controls/VizControlsPanel.d.ts +3 -1
  68. package/dist/types/components/panel/PanelManager.d.ts +92 -22
  69. package/dist/types/components/search/GlobalSearchController.d.ts +13 -6
  70. package/dist/types/components/view/BorderDrawer.d.ts +40 -14
  71. package/dist/types/components/view/IdleTabGridDrawer.d.ts +15 -0
  72. package/dist/types/components/view/SpikeDrawer.d.ts +18 -0
  73. package/dist/types/components/view/ViewInitializer.d.ts +45 -7
  74. package/dist/types/components/view/YinYangDrawer.d.ts +132 -30
  75. package/dist/types/components/view/borderColorCycle.d.ts +76 -0
  76. package/dist/types/components/workspace/facetWeightRuleSetting.d.ts +10 -0
  77. package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
  78. package/dist/types/config/animationConfig.d.ts +10 -1
  79. package/dist/types/data/activeDiagram.d.ts +6 -2
  80. package/dist/types/data/adverse-action-planner.d.ts +3 -3
  81. package/dist/types/data/amplifier-engine.d.ts +6 -6
  82. package/dist/types/data/contacts/demoObstacle.d.ts +3 -0
  83. package/dist/types/data/contacts/index.d.ts +3 -0
  84. package/dist/types/data/contacts/obstacleSignature.d.ts +56 -0
  85. package/dist/types/data/key-event-effects.d.ts +30 -0
  86. package/dist/types/data/key-event-eligibility.d.ts +24 -0
  87. package/dist/types/data/key-event-propagation.d.ts +13 -0
  88. package/dist/types/data/key-event-types.d.ts +48 -0
  89. package/dist/types/data/key-event-validation.d.ts +11 -0
  90. package/dist/types/data/stability-shield.d.ts +14 -0
  91. package/dist/types/data/yasuni_adverse_key_events.d.ts +1 -1
  92. package/dist/types/data/yasuni_cause.d.ts +7 -0
  93. package/dist/types/data/yasuni_key_events.d.ts +4 -60
  94. package/dist/types/interfaces/ICauseModel.d.ts +16 -1
  95. package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -2
  96. package/dist/types/interfaces/IPropagationGraph.d.ts +14 -0
  97. package/dist/types/interfaces/IViewData.d.ts +19 -3
  98. package/dist/types/interfaces/IYinYangController.d.ts +35 -7
  99. package/dist/types/interfaces/IYinYangInternalModel.d.ts +7 -0
  100. package/dist/types/main.d.ts +1 -1
  101. package/dist/types/utils/actionIconFit.d.ts +23 -0
  102. package/dist/types/utils/actionPropagation.d.ts +6 -4
  103. package/dist/types/utils/causeMetrics.d.ts +29 -11
  104. package/dist/types/utils/chainCardHeight.d.ts +87 -4
  105. package/dist/types/utils/collapseAnimation.d.ts +39 -0
  106. package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +28 -5
  107. package/dist/types/utils/deltaChips.d.ts +0 -4
  108. package/dist/types/utils/exportControls.d.ts +8 -0
  109. package/dist/types/utils/facetWeightLabel.d.ts +6 -4
  110. package/dist/types/utils/facetteImages.d.ts +6 -0
  111. package/dist/types/utils/glowHalo.d.ts +74 -0
  112. package/dist/types/utils/hierBadge.d.ts +1 -1
  113. package/dist/types/utils/keyEventImages.d.ts +1 -1
  114. package/dist/types/utils/menuIconSize.d.ts +17 -0
  115. package/dist/types/utils/spreadAngles.d.ts +17 -0
  116. package/package.json +4 -1
  117. package/dist/bundle.js.LICENSE.txt +0 -1
@@ -1,3 +1,80 @@
1
+ export type DetailDensity = "full" | "reduced" | "compact";
2
+ export interface DetailDensityInput {
3
+ /** Hauteur visible du conteneur (clientHeight). */
4
+ available: number;
5
+ /** Hauteur de la description dépliée (0 si aucune). */
6
+ descFullH: number;
7
+ /** Hauteur de la description repliée (= descFullH si l'utilisateur l'a dépliée). */
8
+ descFoldedH: number;
9
+ /** Habillage d'un bloc hors carte (marges, en-têtes du bloc). */
10
+ chrome: number;
11
+ /** Nombre de blocs de cartes affichés. */
12
+ blockCount: number;
13
+ /** Hauteur occupée par le reste du contenu (ni description ni bloc). */
14
+ other?: number;
15
+ /** Palier précédent, pour l'hystérésis. */
16
+ previous?: DetailDensity | null;
17
+ }
18
+ export interface DetailDensityResult {
19
+ density: DetailDensity;
20
+ /** null = hauteur de carte par défaut (pas de variable posée). */
21
+ cardHeight: number | null;
22
+ foldDesc: boolean;
23
+ }
24
+ /**
25
+ * Choisit la densité d'une colonne de détail d'après la hauteur réellement
26
+ * libre — pas d'après le nombre de panneaux ouverts :
27
+ * - full : description entière et cartes au format nominal (352px) ;
28
+ * - reduced : description repliée sur une ligne, cartes réduites
29
+ * (≥ REDUCED_MIN_CARD_HEIGHT), haut de l'illustration visible ;
30
+ * - compact : description repliée, cartes au plus court, haut de
31
+ * l'illustration visible.
32
+ * Au-delà de deux blocs, on vise deux blocs visibles et le scroll prend le
33
+ * relais (même règle que l'ancien comportement multi-blocs).
34
+ */
35
+ export declare function computeDetailDensity(input: DetailDensityInput): DetailDensityResult;
36
+ export interface StackCardHeightInput {
37
+ /** Hauteur utile du conteneur (clientHeight moins ses paddings). */
38
+ available: number;
39
+ /** Habillage (en-tête, description, marges) de chaque bloc déplié, dans
40
+ * l'ordre d'affichage. */
41
+ expandedChromes: number[];
42
+ /** Hauteur de tout le reste : blocs repliés, bandeau Σ. */
43
+ other: number;
44
+ previous?: DetailDensity | null;
45
+ }
46
+ /**
47
+ * STACK : hauteur des cartes pour que les blocs dépliés remplissent la place
48
+ * libre. Jusqu'à deux blocs dépliés, tout le panneau (blocs repliés et
49
+ * bandeau Σ compris) doit tenir ; au-delà, on vise les deux premiers blocs
50
+ * et le scroll prend le relais. La carte ne dépasse jamais le format nominal
51
+ * (image entière) : au-delà, il ne resterait que du vide autour de l'image.
52
+ */
53
+ export declare function computeStackCardHeight(input: StackCardHeightInput): {
54
+ density: DetailDensity;
55
+ cardHeight: number | null;
56
+ };
57
+ export interface ChainCardHeightOptions {
58
+ blockSelector?: string;
59
+ /**
60
+ * RECHERCHE : ajuste les cartes à la hauteur libre du conteneur même avec un
61
+ * seul bloc (description comprise) et pose data-density. Sans cette option
62
+ * (STACK), seul le cas « 2 blocs ou plus » réduit les cartes.
63
+ */
64
+ fitToContainer?: boolean;
65
+ /**
66
+ * STACK : ajuste les cartes à la place libre en tenant compte des blocs
67
+ * repliés et du bandeau Σ (voir computeStackCardHeight), et pose
68
+ * data-density.
69
+ */
70
+ fitBlocks?: boolean;
71
+ }
72
+ /**
73
+ * Synchro immédiate d'un conteneur surveillé (watchChainCardHeight), avec ses
74
+ * options : à appeler au sein d'une bascule animée, pour que la hauteur
75
+ * finale mesurée tienne compte des cartes recalées. Sans effet sinon.
76
+ */
77
+ export declare function resyncChainCardHeightNow(container: HTMLElement): void;
1
78
  /**
2
79
  * Un seul bloc affiché : les cartes gardent leur hauteur par défaut, calée sur
3
80
  * le format des illustrations pour qu'elles s'affichent entières (cf.
@@ -6,7 +83,9 @@
6
83
  * tiennent dans la hauteur visible du conteneur sans scroll — au-delà, le
7
84
  * scroll prend le relais. L'image reste alors visible en entier mais plus
8
85
  * petite, avec une bande vide en haut et en bas (object-fit: contain, cf.
9
- * action-image.css) : c'est la hauteur qui cède, jamais le cadrage.
86
+ * action-image.css) : c'est la hauteur qui cède, jamais le cadrage — sauf
87
+ * avec `fitToContainer`, où la carte réduite garde le haut de l'image.
88
+ * Avec `fitToContainer` (RECHERCHE), voir computeDetailDensity.
10
89
  *
11
90
  * La variable CSS est posée à la fois sur le conteneur ET directement sur
12
91
  * chaque `.ff-chain-card` : quand un bloc est ajouté après coup (RECHERCHE,
@@ -15,13 +94,17 @@
15
94
  * `height` déjà calculé des cartes existantes — le poser directement sur
16
95
  * chaque carte contourne ce cas.
17
96
  */
18
- export declare function syncChainCardHeight(container: HTMLElement, blockSelector?: string): void;
97
+ export declare function syncChainCardHeight(container: HTMLElement, options?: ChainCardHeightOptions): void;
19
98
  /**
20
99
  * Recalcule immédiatement puis surveille le conteneur pour garder la hauteur
21
100
  * des cartes synchronisée : redimensionnement du panneau (ResizeObserver) et
22
101
  * ajout/retrait de blocs (MutationObserver — un bloc peut être ajouté/retiré
23
102
  * sans que la taille du conteneur lui-même ne change, ex. panneau RECHERCHE
24
- * où le bloc secondaire propagé apparaît/disparaît). Idempotent : un seul
103
+ * où le bloc secondaire propagé apparaît/disparaît). Avec `fitToContainer`,
104
+ * le sous-arbre est aussi observé : une description remplacée ou des cartes
105
+ * re-rendues changent la place disponible. Seules les insertions/retraits de
106
+ * nœuds sont observés (pas les attributs) : les classes et styles posés par
107
+ * la synchro elle-même ne la redéclenchent donc pas. Idempotent : un seul
25
108
  * couple d'observers est installé par conteneur.
26
109
  */
27
- export declare function watchChainCardHeight(container: HTMLElement, blockSelector?: string): void;
110
+ export declare function watchChainCardHeight(container: HTMLElement, options?: ChainCardHeightOptions): void;
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Animation commune des replis/déploiements : la bascule d'état reste
3
+ * synchrone (classe, attribut `hidden`…), seule la hauteur de l'élément est
4
+ * interpolée de l'ancienne valeur à la nouvelle (mesure avant/après, Web
5
+ * Animations). L'état logique est donc à jour dès le clic — un re-rendu ou
6
+ * une mesure lit la valeur finale, jamais une valeur différée.
7
+ *
8
+ * Au repli, le contenu masqué par la bascule (display:none, hidden, line-clamp)
9
+ * disparaîtrait d'un coup et l'élément se refermerait sur du vide : `hold`
10
+ * le garde visible le temps de l'animation et rend la fonction qui le relâche.
11
+ *
12
+ * Pendant l'animation, l'élément porte `data-collapse-anim` ; à la fin il
13
+ * émet COLLAPSE_ANIM_END (bulle), ce qui permet aux calculs de mise en page
14
+ * (chainCardHeight) d'ignorer les hauteurs intermédiaires et de se recaler.
15
+ *
16
+ * Les zones défilantes qui ne débordaient pas avant la bascule (panneau
17
+ * parent, liste interne) gardent leur barre de défilement masquée pendant
18
+ * l'animation : une hauteur intermédiaire peut les faire déborder un instant.
19
+ */
20
+ export declare const COLLAPSE_ANIM_DURATION_MS = 240;
21
+ export declare const COLLAPSE_ANIM_END = "collapseanimend";
22
+ export declare const COLLAPSE_ANIM_ATTR = "data-collapse-anim";
23
+ export interface HeightAnimationOptions {
24
+ /** Repli : garde visible le contenu sortant, rend la fonction qui le relâche. */
25
+ hold?: () => (() => void) | void;
26
+ /** Élément dont l'opacité suit le mouvement (contenu entrant / sortant). */
27
+ fade?: HTMLElement | null;
28
+ duration?: number;
29
+ }
30
+ export declare function prefersReducedMotion(): boolean;
31
+ /**
32
+ * Applique `mutate` (la bascule d'état) et anime la hauteur de `el` de sa
33
+ * valeur courante — éventuellement en cours d'animation, un double clic
34
+ * repart donc d'où il en est — à sa nouvelle valeur.
35
+ */
36
+ export declare function animateHeightChange(el: HTMLElement, mutate: () => void, options?: HeightAnimationOptions): void;
37
+ /** Apparition d'un contenu révélé autrement que par la hauteur (ex. carte qui
38
+ * s'élargit) : fondu seul. */
39
+ export declare function fadeIn(el: HTMLElement | null | undefined): void;
@@ -10,6 +10,8 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
10
10
  private arcMaskCache;
11
11
  private underlyingGradientCache;
12
12
  private maskIdCurrentCacheKey;
13
+ private gradientIdCurrentCacheKey;
14
+ private liveDefNodes;
13
15
  /**
14
16
  * Initializes the SVG element and appends it to the given selector.
15
17
  * Also creates a 'defs' section for reusable graphical elements like gradients.
@@ -26,6 +28,8 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
26
28
  drawCircle(parent: D3Element, cx: number, cy: number, radius: number, fill: string, opacity?: number): D3Element;
27
29
  private escapeAttributeValue;
28
30
  private getDefById;
31
+ private getLiveDefById;
32
+ removeDefsByIds(ids: Iterable<string>): void;
29
33
  private defExists;
30
34
  private getCacheKey;
31
35
  /**
@@ -56,13 +60,26 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
56
60
  */
57
61
  createYinOrYangArcMask(maskId: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang", blendOpacity?: number): string;
58
62
  /**
59
- * Creates a mask for the border with a radial gradient to simulate fading edges.
63
+ * Géométrie d'un masque d'arc (createYinOrYangArcMask) : deux bandes en
64
+ * dégradé aux bords de l'arc (fondu des extrémités) et l'arc plein. Partagée
65
+ * par la création et la mise à jour en place (updateYinOrYangArcMask), pour
66
+ * qu'une frame de transition écrive exactement les attributs qu'un rendu
67
+ * complet aurait posés.
60
68
  */
61
- createBorderMask(id: string, centerX: number, centerY: number, innerRadius: number, outerRadius: number): void;
69
+ private computeArcMaskShape;
70
+ /**
71
+ * Met à jour EN PLACE un masque posé par createYinOrYangArcMask (mêmes
72
+ * paramètres) : attributs des deux bandes, de l'arc et opacité de fondu,
73
+ * sans rien retirer ni ajouter au <defs>. Sert aux frames de transition de
74
+ * facette (YinYangDrawer.updateSwitchFrame). Renvoie false si le masque
75
+ * n'existe pas ou n'a pas la structure attendue : l'appelant repasse alors
76
+ * par un rendu complet.
77
+ */
78
+ updateYinOrYangArcMask(maskId: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang", blendOpacity?: number): boolean;
62
79
  /**
63
- * Changes the colors of a border gradient over time using an animation.
80
+ * Creates a mask for the border with a radial gradient to simulate fading edges.
64
81
  */
65
- changeBorderColors(gradient: D3Element, duration: number, colors: string[]): void;
82
+ createBorderMask(id: string, centerX: number, centerY: number, innerRadius: number, outerRadius: number): void;
66
83
  /**
67
84
  * Draws a line with a gradient stroke.
68
85
  */
@@ -71,8 +88,14 @@ export declare class D3GraphicsStrategy implements IGraphicsStrategy {
71
88
  * Creates a radial gradient for an underlying circle.
72
89
  */
73
90
  createUnderlyingCircleGradient(id: string, color: string, spread?: number, intensity?: number): string;
91
+ /**
92
+ * Repeint en place un dégradé posé par createUnderlyingCircleGradient
93
+ * (mêmes étalement et intensité) : seule la couleur de ses arrêts change.
94
+ * Renvoie false s'il n'existe plus (l'appelant repasse par un rendu complet).
95
+ */
96
+ updateUnderlyingCircleGradientColor(id: string, color: string, spread?: number, intensity?: number): boolean;
74
97
  /**
75
98
  * Creates an underlying circle with a gradient and applies an arc mask.
76
99
  */
77
- createUnderlyingCircleWithArcMask(maskId: string | undefined, gradientId: string, parent: D3Element, cx: number, cy: number, radius: number): void;
100
+ createUnderlyingCircleWithArcMask(maskId: string | undefined, gradientId: string, parent: D3Element, cx: number, cy: number, radius: number): D3Element;
78
101
  }
@@ -1,4 +1,3 @@
1
- import type { KeyEventEffect } from "../data/yasuni_key_events";
2
1
  /** Ce dont une chip a besoin — sous-ensemble d'ActionDefinition. */
3
2
  export interface ChipDeltas {
4
3
  baseDelta: number;
@@ -10,6 +9,3 @@ export declare function formatDelta(value: number): string;
10
9
  export declare function formatSignedDelta(value: number): string;
11
10
  /** Deltas du catalogue, sur une ligne Action. */
12
11
  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,8 @@
1
+ /** Utilitaire pour exporter et copier les contrôles du panneau debug */
2
+ export interface ExportOptions {
3
+ selectedIds?: Set<string>;
4
+ showPreview?: boolean;
5
+ }
6
+ export declare function generateControlsCode(snapshot: Record<string, unknown>, selectedIds?: Set<string>): string;
7
+ export declare function copyToClipboard(text: string): Promise<boolean>;
8
+ export declare function showToast(message: string, duration?: number): void;
@@ -1,9 +1,11 @@
1
1
  /**
2
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`).
3
+ * pour une cause comme pour un contact. Règle `mean` (défaut, POC-05A4) :
4
+ * moyenne des poids de tous ses satellites, arrondie à un chiffre après la
5
+ * virgule, avec une virgule décimale — « 7,2 », sur 10. Règle `sum`
6
+ * (ancienne, voir `FacetWeightRule`) : somme entière — « 61 », sur
7
+ * « satellites × 10 ». `max` ne s'affiche qu'avec le suffixe
8
+ * (`facetteLabelSuffixVisible`).
7
9
  */
8
10
  export declare function facetWeightLabel(weights: readonly number[]): {
9
11
  value: string;
@@ -1,2 +1,8 @@
1
1
  export declare function hasFacetteImage(composanteId: string): boolean;
2
+ /**
3
+ * Les originaux (1254×1254, ~6 Mo décodés) ne sont jamais affichés tels quels :
4
+ * on sert une miniature de 512 px et sa variante « voilée » pré-rendue (voir
5
+ * scripts/generate-facette-thumbs.py).
6
+ */
2
7
  export declare function getFacetteImageUrl(composanteId: string): string;
8
+ export declare function getFacetteVeiledImageUrl(composanteId: string): string;
@@ -0,0 +1,74 @@
1
+ export type GlowStrokeLayer = {
2
+ /** Débord du trait de halo au-delà du bord de la forme, en px. */
3
+ spread: number;
4
+ /** Opacité propre de ce trait (les traits se superposent). */
5
+ opacity: number;
6
+ };
7
+ /**
8
+ * Traits superposés équivalant à `drop-shadow(0 0 ${blur}px couleur)` d'alpha
9
+ * `alpha` : à peindre du plus large au plus étroit, chacun de largeur
10
+ * `largeurDeBase + 2 × spread`, même couleur, `stroke-opacity` = `opacity`.
11
+ */
12
+ export declare function glowStrokeLayers(blur: number, alpha?: number): GlowStrokeLayer[];
13
+ /** Débord total (px) du halo de `glowStrokeLayers(blur)`. */
14
+ export declare function glowStrokeReach(blur: number): number;
15
+ /**
16
+ * Crée (ou recâble) dans `group` les traits d'un halo de chemin. `tag` est
17
+ * l'élément copié (`path`, `line`…) ; la géométrie est posée ensuite par
18
+ * l'appelant sur chaque trait (`d`, `x1`…), via `forEachStroke`.
19
+ */
20
+ export declare function ensureGlowStrokes(group: SVGGElement, tag: "path" | "line" | "circle", layerCount?: number): SVGElement[];
21
+ /**
22
+ * Habille les traits d'un halo : couleur, largeurs et opacités équivalant à
23
+ * un `drop-shadow(0 0 ${blur}px color)` posé sur une forme dont le trait fait
24
+ * `baseWidth` (0 pour une forme seulement remplie).
25
+ */
26
+ export declare function styleGlowStrokes(strokes: readonly SVGElement[], options: {
27
+ color: string;
28
+ blur: number;
29
+ alpha?: number;
30
+ baseWidth?: number;
31
+ }): void;
32
+ export type SoftEdgeLayer = {
33
+ /** Décalage du bord de la couche (px) : > 0 vers l'extérieur. */
34
+ offset: number;
35
+ opacity: number;
36
+ };
37
+ /**
38
+ * Couches superposées équivalant à une forme pleine d'alpha `alpha` floutée
39
+ * par `filter: blur(${sigma}px)` (σ = l'argument de blur()) : à peindre dans
40
+ * l'ordre, chacune agrandie de `offset` (ou réduite si négatif), même
41
+ * couleur, `fill-opacity` = `opacity`.
42
+ */
43
+ export declare function softEdgeLayers(sigma: number, alpha?: number): SoftEdgeLayer[];
44
+ /** Rayon du disque de halo d'un cercle de rayon `radius`. */
45
+ export declare function circleGlowRadius(radius: number, blur: number): number;
46
+ /**
47
+ * `fill` d'un disque de rayon `circleGlowRadius(radius, blur)` centré sur un
48
+ * cercle de rayon `radius`, équivalant à `drop-shadow(0 0 ${blur}px color)`
49
+ * de ce cercle. Le dégradé (objectBoundingBox) est partagé par tous les
50
+ * cercles de même couleur et de même rapport rayon / flou, et recréé s'il a
51
+ * été purgé des defs.
52
+ */
53
+ export declare function circleGlowFill(svg: SVGSVGElement, color: string, radius: number, blur: number): string;
54
+ /** Une lueur : équivalent de `drop-shadow(0 0 ${blur}px color)` d'alpha `alpha`. */
55
+ export type GlowSpec = {
56
+ color: string;
57
+ blur: number;
58
+ alpha?: number;
59
+ };
60
+ /**
61
+ * Pose (ou retire, `glows` null) un halo d'une forme : un `<g>` inséré
62
+ * avant elle (donc peint dessous), qui contient des copies de sa géométrie
63
+ * en traits de lueur (voir styleGlowStrokes). Plusieurs lueurs s'empilent,
64
+ * la plus large d'abord. `baseWidth` : largeur du trait de la forme. `slot`
65
+ * distingue plusieurs halos indépendants sur la même forme. Renvoie le
66
+ * groupe du halo (null s'il est retiré).
67
+ */
68
+ export declare function syncShapeGlow(shape: SVGElement, glows: readonly GlowSpec[] | null, baseWidth?: number, slot?: string): SVGGElement | null;
69
+ /** Recopie la géométrie d'une forme sur ses halos, s'il y en a — à appeler
70
+ * quand la forme est modifiée en place. */
71
+ export declare function syncShapeGlowGeometry(shape: SVGElement): void;
72
+ /** Pose un attribut de géométrie sur les halos d'une forme (quand la forme
73
+ * elle-même le reçoit plus tard, p. ex. dans un attrTween d3). */
74
+ export declare function setShapeGlowAttribute(shape: Element, name: string, value: string): void;
@@ -22,7 +22,7 @@ export declare function buildOddDotHtml(oddColor: string): string;
22
22
  * couvert). `isKeyEvent` ajoute le médaillon (plaque + anneau doré +
23
23
  * Yin/Yang en filigrane, voir `.ke-medallion` dans details-panel.css) qui
24
24
  * distingue un Événement d'une Action à la silhouette seule. */
25
- export declare function buildItemIconHtml(iconUrl: string, isKeyEvent?: boolean): string;
25
+ export declare function buildItemIconHtml(iconUrl: string, isKeyEvent?: boolean, lazy?: boolean): string;
26
26
  /** Pastille d'état (score /100) affichée après le nom, dans le champ
27
27
  * "élément sélectionné" tout en haut du panneau — uniquement quand cet
28
28
  * élément est un satellite. Pas de delta : jugé trop chargé visuellement à
@@ -6,7 +6,7 @@ export type KeyEventImageSize = "thumb" | "full";
6
6
  */
7
7
  export declare function getKeyEventImageUrl(keyEventId: string, size: KeyEventImageSize): string;
8
8
  /**
9
- * Icône vectorielle courte (bulle du menu radial du cercle central, badge
9
+ * Icône vectorielle courte (bulle du menu radial du satellite-facette, badge
10
10
  * de carte), même convention de nommage.
11
11
  */
12
12
  export declare function getKeyEventIconUrl(keyEventId: string): string;
@@ -0,0 +1,17 @@
1
+ /** Utilitaire centralisé pour calculer la taille des icônes dans les menus radiaux
2
+ * (actions et événements clés). Assure l'harmonie visuelle entre les deux. */
3
+ /** Ratio de taille de l'icône quand elle est active (en focus/sélectionnée) */
4
+ export declare const ACTIVE_ICON_SIZE_RATIO = 1.85;
5
+ /** Ratio de taille de l'icône quand elle est inactive */
6
+ export declare const INACTIVE_ICON_SIZE_RATIO = 1.65;
7
+ /**
8
+ * Calcule la taille d'une icône dans un menu radial (bulle).
9
+ * Harmonise le dimensionnement entre les actions et les événements clés.
10
+ *
11
+ * @param bubbleRadius - Rayon de la bulle contenant l'icône
12
+ * @param isActive - L'icône est-elle en focus/active?
13
+ * @param iconFontScale - Facteur d'échelle du debug pour l'icône (slider utilisateur)
14
+ * @param applyFitScale - Appliquer le plafonnement fitScale (pour ne pas dépasser du cercle)?
15
+ * @returns Taille de l'icône en pixels
16
+ */
17
+ export declare function calculateMenuIconSize(bubbleRadius: number, isActive: boolean, iconFontScale?: number, applyFitScale?: boolean): number;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Écarte des angles (radians) placés sur un cercle de rayon `distance` pour
3
+ * que des disques de rayons `radii` centrés dessus ne se chevauchent pas,
4
+ * en déplaçant le moins possible chaque angle de sa position d'origine :
5
+ * chaque paire voisine trop serrée est écartée symétriquement, sur quelques
6
+ * passes. Renvoie les angles dans l'ordre d'entrée.
7
+ */
8
+ export declare function spreadAngles(angles: number[], radii: number[], distance: number, gap: number): number[];
9
+ /**
10
+ * Facteur (0, 1] à appliquer aux rayons `radii` pour que leurs disques
11
+ * tiennent, sans se chevaucher, sur le cercle de rayon `distance` (écart
12
+ * `gap` entre voisins, dans l'ordre des `angles`) — la condition sous
13
+ * laquelle `spreadAngles` peut les écarter. 1 quand tout tient déjà : un
14
+ * anneau n'est resserré que s'il est plein, et alors d'un bloc (les tailles
15
+ * relatives sont gardées).
16
+ */
17
+ export declare function ringFitScale(angles: number[], radii: number[], distance: number, gap: number): number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@micheeeeel/yinyangapp",
3
- "version": "3.0.1",
3
+ "version": "3.1.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",
@@ -14,6 +14,8 @@
14
14
  "analyze": "ANALYZE=true webpack --mode production && tsc -p tsconfig.types.json",
15
15
  "benchmark:compare": "node benchmarks/compare.js",
16
16
  "catalogue:matrix": "npx tsx scripts/catalogue-matrix.ts",
17
+ "events:balance": "node scripts/key-event-balance.cjs",
18
+ "events:adverse-balance": "node scripts/adverse-event-balance.cjs",
17
19
  "propagation:cycles-audit": "npx tsx scripts/propagation-cycles-audit.ts"
18
20
  },
19
21
  "author": "Thomas MICHEL",
@@ -47,6 +49,7 @@
47
49
  "files": [
48
50
  "dist/bundle.js",
49
51
  "dist/bundle.js.LICENSE.txt",
52
+ "dist/bundle.css",
50
53
  "dist/types",
51
54
  "README.md",
52
55
  "LICENSE"
@@ -1 +0,0 @@
1
- /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */