@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
@@ -0,0 +1,56 @@
1
+ import type { Sphere } from "../yasuni_cause";
2
+ import { type ContactProfileData } from "./buildContactSphere";
3
+ import { type ContactFacetId } from "./universalFacets";
4
+ export interface ObstacleSignatureData {
5
+ /** Identifiant stable de l'obstacle (id de la Cause produite). */
6
+ id: string;
7
+ name: string;
8
+ /** Présentation de l'obstacle (titre au repos, panneau de détails). */
9
+ description?: string;
10
+ /** Exigence O_f de chacune des huit facettes, 0–10 (0 : sans effet). */
11
+ weights: Record<ContactFacetId, number>;
12
+ }
13
+ /** Qualité Q_f (0–100) et poids C_f (0–10) d'une facette d'un contact. */
14
+ export interface ContactFacetReading {
15
+ quality: number;
16
+ weight: number;
17
+ }
18
+ /**
19
+ * Vérifie une signature reçue de l'hôte : les huit facettes et elles
20
+ * seules, chacune d'un poids fini dans [0, 10], au moins une non nulle (une
21
+ * signature entièrement nulle ne sollicite rien : refus explicite plutôt
22
+ * qu'un obstacle sans exigence). L'erreur nomme l'obstacle et la facette.
23
+ */
24
+ export declare function validateObstacleSignature(signature: ObstacleSignatureData): void;
25
+ /**
26
+ * La Sphere d'une signature : les huit facettes universelles (mêmes ids,
27
+ * orientations, notions et images que la sphère d'un contact), chacune
28
+ * réduite à UN satellite qui porte son poids O_f — le poids de la facette
29
+ * (C_f, moyenne de ses satellites) vaut donc exactement O_f.
30
+ */
31
+ export declare function buildObstacleSphere(signature: ObstacleSignatureData): Sphere;
32
+ /**
33
+ * Qualité Q_f et poids C_f de chacune des huit facettes d'un contact, tels
34
+ * que son diagramme les montre : Q_f = (1 − T) × 100, T tension de la
35
+ * facette pondérée par les poids de tous ses satellites (moyenne simple si
36
+ * tous sont nuls) ; C_f = moyenne de ces poids, zéros inclus. Lève une
37
+ * erreur explicite pour un profil invalide (`validateContactProfile`).
38
+ */
39
+ export declare function contactFacetReadings(profile: ContactProfileData): Record<ContactFacetId, ContactFacetReading>;
40
+ /**
41
+ * Poids d'une facette dans la RENCONTRE d'un contact et d'un obstacle :
42
+ * W_f = O_f × (C_f + O_f) / 20 (règle Notion « Obstacles, poids &
43
+ * résolution par superposition »). Jamais plus que O_f (C_f, O_f ≤ 10) ;
44
+ * nul si l'obstacle n'exige rien de la facette. yvy-backend applique la
45
+ * même règle à la résolution (`contacts/facet-duration.ts`).
46
+ */
47
+ export declare function obstacleFacetWeight(required: number, contactWeight: number): number;
48
+ /**
49
+ * La modulation d'une signature par un contact, telle que
50
+ * `setFacetModulation` l'attend : par facette, W_f (diamètre) et Q_f (chance
51
+ * affichée, que la modulation ne change pas).
52
+ */
53
+ export declare function obstacleModulation(weights: Readonly<Record<ContactFacetId, number>>, readings: Readonly<Record<ContactFacetId, ContactFacetReading>>): {
54
+ weights: Record<string, number>;
55
+ scores: Record<string, number>;
56
+ };
@@ -0,0 +1,30 @@
1
+ import type { ActionStackItem } from "../components/controller/action-stack/ActionStackState";
2
+ import type { KeyEventDefinition } from "./key-event-types";
3
+ import { type EligibleKeyEvent } from "./key-event-eligibility";
4
+ import { type AmplifierResult } from "./amplifier-engine";
5
+ export type ResolvedKeyEvent = {
6
+ definition: KeyEventDefinition;
7
+ eligibility: EligibleKeyEvent;
8
+ };
9
+ export type KeyEventActionEffects = {
10
+ /** Shared matches consumed by the propagation resolver for rayonnement/portée. */
11
+ eligibleEvents: ResolvedKeyEvent[];
12
+ amplifiers: AmplifierResult[];
13
+ guaranteedDelta: number;
14
+ finalDelta: number;
15
+ finalWeightDelta: number;
16
+ /** Shield granted by STABILITÉ; merge with combo shields at projection. */
17
+ eventShield: number;
18
+ eventShieldProtectedSign: 1 | -1;
19
+ };
20
+ /** One action resolution after combos: GARANTIE, AMPLIFIER, then STABILITÉ.
21
+ * All event signatures read the same eligibility and strength. */
22
+ export declare function resolveKeyEventActionEffects(params: {
23
+ actionItem: ActionStackItem;
24
+ allItems: ActionStackItem[];
25
+ activeItemIds: ReadonlySet<string>;
26
+ keyEventMap: Map<string, KeyEventDefinition>;
27
+ baseDelta: number;
28
+ comboDelta: number;
29
+ baseWeightDelta?: number;
30
+ }): KeyEventActionEffects;
@@ -0,0 +1,24 @@
1
+ import type { ActionStackItem } from "../components/controller/action-stack/ActionStackState";
2
+ import type { KeyEventDefinition } from "./key-event-types";
3
+ /** EVT-08: an occupied event slot keeps half its nominal effect, including
4
+ * the first action. The shared Beta peak stays unchanged; combos keep their
5
+ * own 15% floor. See documentation/events-balance.md for measured arbitration. */
6
+ export declare const EVENT_MIN_POSITIONAL_STRENGTH = 0.5;
7
+ export declare function eventPositionStrength(slotDistance: number, withinNextN: number): number;
8
+ export interface EligibleKeyEvent {
9
+ eventId: string;
10
+ sourceItemId: string;
11
+ targetItemId: string;
12
+ /** Absolute slot distance, including unoccupied slots. */
13
+ slotDistance: number;
14
+ strength: number;
15
+ }
16
+ /** Shared eligibility for all five signatures. An event remains available on
17
+ * every slot of its window: no charge, consumption, or trigger counter. */
18
+ export declare function evaluateKeyEventEligibility(params: {
19
+ event: KeyEventDefinition;
20
+ sourceItem: ActionStackItem;
21
+ targetItem: ActionStackItem;
22
+ activeItemIds: ReadonlySet<string>;
23
+ actionDelta: number;
24
+ }): EligibleKeyEvent | null;
@@ -0,0 +1,13 @@
1
+ import { type CompiledEdge, type CompiledPropagationGraph, type SatelliteRef } from "../interfaces/IPropagationGraph";
2
+ import type { ResolvedKeyEvent } from "./key-event-effects";
3
+ export type KeyEventPropagationContext = {
4
+ actionId: string;
5
+ source: SatelliteRef;
6
+ /** Actual source satellite's action catalogue, not the event's target list. */
7
+ applicableActionIds: readonly string[];
8
+ eligibleEvents: readonly ResolvedKeyEvent[];
9
+ };
10
+ /** Resolution-local first hops. No writes to graph, catalogue or event data.
11
+ * RAYONNEMENT adds weighted boosts before one clamp. PORTÉE contributions
12
+ * remain separate (including equal endpoints), in stable event/bridge order. */
13
+ export declare function resolveKeyEventPropagationEdges(graph: CompiledPropagationGraph, source: SatelliteRef, context: KeyEventPropagationContext | undefined, exists: (ref: SatelliteRef) => boolean): readonly CompiledEdge[];
@@ -0,0 +1,48 @@
1
+ import type { SatelliteRef } from "../interfaces/IPropagationGraph";
2
+ export type AmplifierSignature = {
3
+ type: "amplifier";
4
+ deltaBonus: number;
5
+ weightBonus?: number;
6
+ };
7
+ export type RayonnementSignature = {
8
+ type: "rayonnement";
9
+ propagationBoost: number;
10
+ };
11
+ export type StabiliteSignature = {
12
+ type: "stabilite";
13
+ shield: number;
14
+ };
15
+ export type GarantieSignature = {
16
+ type: "garantie";
17
+ minBaseDeltaRatio: number;
18
+ };
19
+ export type PorteeSignature = {
20
+ type: "portee";
21
+ bridges: EventPropagationBridge[];
22
+ };
23
+ /** Temporary causal edge; resolved only for an eligible action (EVT-04). */
24
+ export interface EventPropagationBridge {
25
+ from: SatelliteRef;
26
+ to: SatelliteRef;
27
+ w: number;
28
+ rationale: string;
29
+ triggerActionIds?: string[];
30
+ }
31
+ export type KeyEventSignature = AmplifierSignature | RayonnementSignature | StabiliteSignature | GarantieSignature | PorteeSignature;
32
+ export interface KeyEventDefinition {
33
+ id: string;
34
+ alignment: "ally" | "adverse";
35
+ name: string;
36
+ shortDescription: string;
37
+ description: string;
38
+ origin: {
39
+ kind: "facet";
40
+ componentId: string;
41
+ };
42
+ /** Attribution of an adverse event, separate from its facet origin. */
43
+ originLabel?: string;
44
+ targetedActionIds: string[];
45
+ withinNextN: number;
46
+ signature: KeyEventSignature;
47
+ }
48
+ export declare function isAdverseKeyEvent(event: KeyEventDefinition): boolean;
@@ -0,0 +1,11 @@
1
+ import type { KeyEventDefinition } from "./key-event-types";
2
+ import type { ActionDefinition } from "./yasuni_actions";
3
+ import type { Composante } from "./yasuni_cause";
4
+ export interface KeyEventDiagnostic {
5
+ eventId: string;
6
+ path: string;
7
+ message: string;
8
+ }
9
+ /** Read-only catalogue validation. No edge is ever added to the cause graph. */
10
+ export declare function validateKeyEvents(events: readonly KeyEventDefinition[], actions: readonly ActionDefinition[], cause: readonly Composante[]): KeyEventDiagnostic[];
11
+ export declare function formatKeyEventDiagnostics(diagnostics: readonly KeyEventDiagnostic[]): string;
@@ -19,3 +19,17 @@ export declare function applyStabilityShield(aggregatedDelta: number, shield: nu
19
19
  * bouclier plus faible ne dégrade jamais celui déjà en place.
20
20
  */
21
21
  export declare function mergeStabilityShield(current: number | undefined, incoming: number): number;
22
+ /** Persisted scalar shields are always allied, irrespective of the last action. */
23
+ export type ProtectedSign = 1 | -1;
24
+ export type DirectionalShield = {
25
+ magnitude: number;
26
+ protectedSign: ProtectedSign;
27
+ };
28
+ export type StabilityProtection = number | DirectionalShield[];
29
+ export declare function normalizeStabilityProtection(value: StabilityProtection | undefined): DirectionalShield[];
30
+ export declare function mergeDirectionalShield(current: StabilityProtection | undefined, incoming: DirectionalShield): DirectionalShield[];
31
+ /** Filter each signed aggregate once. No consumption and no cross-direction cancellation. */
32
+ export declare function filterDirectionalContributions(positive: number, negative: number, protection: StabilityProtection): {
33
+ positive: number;
34
+ negative: number;
35
+ };
@@ -1,2 +1,2 @@
1
- import type { KeyEventDefinition } from "./yasuni_key_events";
1
+ import type { KeyEventDefinition } from "./key-event-types";
2
2
  export declare const yasuniAdverseKeyEvents: KeyEventDefinition[];
@@ -26,6 +26,13 @@ export interface Composante {
26
26
  id: string;
27
27
  name: string;
28
28
  orientation?: "yin" | "yang";
29
+ /** Notion parente commune à des facettes d'orientations opposées (ex. la
30
+ * Gouvernance, déclinée en une facette yin et une facette yang). Les
31
+ * facettes qui la partagent sont regroupées dans la vue Idle « tab ». */
32
+ notion?: {
33
+ id: string;
34
+ name: string;
35
+ };
29
36
  /** Vue d'ensemble des enjeux et des dynamiques propres à cette composante. */
30
37
  description?: string;
31
38
  odds: ODD[];
@@ -1,62 +1,6 @@
1
- export interface KeyEventEffect {
2
- /**
3
- * Bonus additif nominal au pic de la fenêtre. Pour un slot occupé éligible,
4
- * pondération positionnelle avec plancher 0,15 ; aucun effet si la cible est
5
- * absente ou hors fenêtre. Voir positionalBonus (amplifier-engine.ts).
6
- * Appliqué dans la direction du delta effectif de l'action (après combos),
7
- * jamais sur une action au delta nul. Additif et non multiplicatif : un
8
- * ratio réduit par la position devenait fractionnaire et se faisait
9
- * absorber par l'arrondi du poids ; un montant en points permet aussi à
10
- * un futur malus (bonus négatif) de s'annuler exactement avec lui.
11
- */
12
- scoreBonus: number;
13
- /**
14
- * Bonus ADDITIF de poids (en points entiers), au pic de la fenêtre.
15
- * Renforce le weightDelta de l'action ciblée dans sa propre direction
16
- * (alléger ou alourdir) — sans effet sur une action sans weightDelta.
17
- * L'arrondi à l'entier se fait par événement à l'évaluation, jamais sur
18
- * un total fractionnaire : ce que la carte affiche est ce qui s'applique.
19
- */
20
- weightBonus: number;
21
- }
22
- export interface KeyEventDefinition {
23
- id: string;
24
- name: string;
25
- shortDescription: string;
26
- description: string;
27
- /** Facette (Composante.id) depuis laquelle l'événement se déclenche. */
28
- originComposanteId: string;
29
- /**
30
- * Actions amplifiées (par id), même logique que ComboCondition.requires.
31
- * Cohérence thématique obligatoire avec la facette d'origine.
32
- */
33
- targetedActionIds: string[];
34
- /**
35
- * Fenêtre temporelle AVANT laquelle l'amplification s'arrête — pendant
36
- * inverse de ComboCondition.withinLastN : une action ciblée jouée plus de
37
- * withinNextN slots après l'événement n'est plus amplifiée. Oblige le
38
- * joueur à réserver des emplacements libres après l'événement plutôt que
39
- * de le placer systématiquement tout en bas de la pile.
40
- */
41
- withinNextN?: number;
42
- effect: KeyEventEffect;
43
- /** Acteur à l'origine d'un Événement adverse (pouvoir politique,
44
- * industrie…), affiché en note de provenance sur son bloc — les
45
- * Événements Clés positifs n'en ont pas (ils émanent de la cause). */
46
- origin?: string;
47
- }
48
- /**
49
- * Un Événement adverse est une KeyEventDefinition ordinaire dont l'effet est
50
- * un MALUS (bonus négatifs) — même critère de signe qu'isAdverseAction, pas
51
- * un drapeau. Catalogue séparé (yasuni_adverse_key_events.ts), jamais listé
52
- * dans yasuniKeyEvents : le menu radial du cercle central et l'arbre
53
- * RECHERCHE, qui itèrent ce tableau, l'ignorent donc structurellement — seul
54
- * yasuniKeyEventMap (moteur, rendu de la pile) fusionne les deux catalogues.
55
- */
56
- export declare function isAdverseKeyEvent(keyEvent: KeyEventDefinition): boolean;
1
+ import type { KeyEventDefinition } from "./key-event-types";
2
+ export type * from "./key-event-types";
3
+ export { isAdverseKeyEvent } from "./key-event-types";
57
4
  export declare const yasuniKeyEvents: KeyEventDefinition[];
58
- /** Lookup O(1) par id, même convention que les autres catalogues — fusionne
59
- * Événements Clés ET Événements adverses : le moteur et le rendu de la pile
60
- * résolvent les deux ici, tandis que les surfaces utilisateur (menu radial,
61
- * arbre RECHERCHE) itèrent yasuniKeyEvents, sans les adverses. */
62
5
  export declare const yasuniKeyEventMap: Map<string, KeyEventDefinition>;
6
+ export declare const yasuniKeyEventDiagnostics: import("./key-event-validation").KeyEventDiagnostic[];
@@ -16,16 +16,25 @@ export interface CauseOddCutting {
16
16
  score: number;
17
17
  weight: number;
18
18
  }
19
+ /** Notion parente d'une facette : des facettes d'orientations opposées qui
20
+ * la partagent en sont les déclinaisons yin et yang (regroupées dans la vue
21
+ * Idle « tab »). */
22
+ export interface FacetNotion {
23
+ id: string;
24
+ name: string;
25
+ }
19
26
  export interface CauseComponent {
20
27
  id: string;
21
28
  name?: string;
22
29
  shortName?: string;
23
30
  description?: string;
24
31
  orientation: YinYangOrientation;
32
+ /** Notion parente (absente : la facette est seule de sa notion). */
33
+ notion?: FacetNotion;
25
34
  odds: CauseOdd[];
26
35
  /** Poids de la facette (taille relative de son arc) : C_f, moyenne des
27
36
  * 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). */
37
+ * une cause et pour un contact (`facetWeight`, POC-05A4). */
29
38
  perimeterWeight: number;
30
39
  }
31
40
  export interface Cause {
@@ -35,5 +44,11 @@ export interface Cause {
35
44
  * remplace la sphère active de la page (Yasuní) dans le titre au repos et
36
45
  * le panneau de détails : l'hôte qui monte un contact voit son nom. */
37
46
  description?: string;
47
+ /** Cause SANS SCORE : ses facettes ne portent que des POIDS — la
48
+ * signature d'un obstacle (`obstacleSignatureToCause`). Ses scores ne
49
+ * sont qu'une géométrie neutre, jamais affichée : satellites-facettes
50
+ * sans score ni lobes, pas de sous-état Idle « arcs », pas de Facette
51
+ * ouverte au clic (voir `docs/integration-yvy-frontend.md`). */
52
+ scoreless?: boolean;
38
53
  components: CauseComponent[];
39
54
  }
@@ -18,10 +18,17 @@ export interface IGraphicsStrategy {
18
18
  color: string;
19
19
  opacity: number;
20
20
  }[], gradientUnits: string): IGraphicElement;
21
+ /** Retire du <defs> les éléments (masques, dégradés…) portant ces ids. */
22
+ removeDefsByIds(ids: Iterable<string>): void;
21
23
  createYinOrYangArcMask(id: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang", blendOpacity?: number): string;
24
+ /** Met à jour en place un masque de createYinOrYangArcMask (frame de
25
+ * transition) ; false s'il manque, l'appelant refait alors un rendu complet. */
26
+ updateYinOrYangArcMask(id: string, cx: number, cy: number, innerRadius: number, outerRadius: number, startAngle: number, endAngle: number, type: "yin" | "yang", blendOpacity?: number): boolean;
22
27
  createBorderMask(id: string, cx: number, cy: number, innerRadius: number, outerRadius: number): void;
23
- changeBorderColors(gradient: any, duration: number, colors: string[]): void;
24
28
  drawLineWithGradient(parent: IGraphicElement, x1: number, y1: number, x2: number, y2: number, gradientId: string): void;
25
29
  createUnderlyingCircleGradient(id: string, color: string, spread?: number, intensity?: number): string;
26
- createUnderlyingCircleWithArcMask(maskId: string | undefined, gradientId: string, parent: IGraphicElement, cx: number, cy: number, radius: number): void;
30
+ /** Repeint en place un dégradé de createUnderlyingCircleGradient ; false
31
+ * s'il manque. */
32
+ updateUnderlyingCircleGradientColor(id: string, color: string, spread?: number, intensity?: number): boolean;
33
+ createUnderlyingCircleWithArcMask(maskId: string | undefined, gradientId: string, parent: IGraphicElement, cx: number, cy: number, radius: number): IGraphicElement;
27
34
  }
@@ -22,6 +22,20 @@ export type PropagationScope = "local" | "inter-odd" | "inter-facette";
22
22
  export type CompiledEdge = PropagationTarget & {
23
23
  from: SatelliteRef;
24
24
  scope: PropagationScope;
25
+ eventPropagation?: EventPropagationMetadata;
26
+ };
27
+ /** Explanatory provenance, preserved on applied hops and Bilan details. */
28
+ export type EventPropagationMetadata = {
29
+ kind: "rayonnement" | "portee";
30
+ originalWeight: number;
31
+ sources: readonly {
32
+ eventId: string;
33
+ eventName: string;
34
+ sourceItemId: string;
35
+ strength: number;
36
+ parameter: number;
37
+ bridgeIndex?: number;
38
+ }[];
25
39
  };
26
40
  export type PropagationGraphRule = "V1" | "V2" | "V3" | "V4" | "V5" | "V6" | "V7";
27
41
  export type PropagationGraphDiagnostic = {
@@ -11,16 +11,32 @@ export interface IViewData {
11
11
  * `docs/integration-yvy-frontend.md`). Hérité par les satellites, qui
12
12
  * sont eux-mêmes des contrôleurs complets. Défaut : false. */
13
13
  presentation?: boolean;
14
- /** Poids de ce satellite relatif à la moyenne de sa fratrie (1 = moyenne),
15
- * déjà utilisé pour dériver minEdge dans YinYangController.createYinYangChildren.
14
+ /** Taille de ce satellite relative à la taille de base (1 = poids de
15
+ * référence, voir ChildrenBuilder.weightToSizeRatio ; resserrement de son
16
+ * anneau compris), déjà utilisée pour dériver minEdge.
16
17
  * Reporté ici tel quel pour que le satellite compense sa propre taille de
17
18
  * police (voir YinYangDrawer.renderChildStateLabel) sans redériver le
18
19
  * calcul. Absent pour les patterns qui ne sont pas des satellites. */
19
20
  weightRatio?: number;
20
21
  /** Poids brut (échelle absolue [WEIGHT_MIN, WEIGHT_MAX], voir causeMetrics.ts),
21
- * distinct de weightRatio qui est relatif à la fratrie : sert à savoir
22
+ * distinct de weightRatio (une taille) : sert à savoir
22
23
  * combien de graduations remplir dans la jauge de poids du satellite
23
24
  * (voir YinYangDrawer.renderChildWeightGauge). Absent pour les patterns
24
25
  * qui ne sont pas des satellites. */
25
26
  weight?: number;
27
+ /** Libellé de poids déjà formaté, affiché tel quel dans la pastille du
28
+ * satellite au lieu de l'entier arrondi de `weight`. Posé pour les
29
+ * satellites-facettes : c'est celui de l'arc de leur facette
30
+ * (facetWeightLabel — « 5,5 » en règle `mean`, « 61 » en règle `sum`). */
31
+ weightLabel?: string;
32
+ /** Satellite SANS SCORE (signature d'obstacle, voir
33
+ * `obstacleSignatureToCause`) : il ne porte qu'un poids. Ni score ni
34
+ * lobes ne sont rendus — un disque neutre et la pastille de poids
35
+ * (`children/signatureLook.ts`). Absent : satellite ordinaire. */
36
+ scoreless?: boolean;
37
+ /** Angle imposé (radians, repère SVG : 0 = 3 h, sens horaire) auquel ce
38
+ * satellite se place autour de son parent, au lieu de la répartition
39
+ * uniforme par index. Posé pour les satellites-facettes du sous-état
40
+ * Idle « facettes », alignés sur le milieu de l'arc de leur facette. */
41
+ angleOverride?: number;
26
42
  }
@@ -10,6 +10,12 @@ export interface IYinYangController {
10
10
  factory: IYinYangAppFactory;
11
11
  animator: IAnimator;
12
12
  createYinYangChildren(): void;
13
+ /** Fin de vie : arrête toutes les boucles d'animation du contrôleur et de
14
+ * ses satellites (champ de force, orbite, rotation, ghost, étincelles,
15
+ * comètes…), déconnecte ses observers et libère ses defs. Le contrôleur
16
+ * n'est plus utilisable ensuite. Idempotent. Le DOM du diagramme est
17
+ * vidé par l'appelant (voir mountYinYang). */
18
+ destroy(): void;
13
19
  clearForceFieldDetails(): void;
14
20
  applyChildrenFitScale(): void;
15
21
  setChildrenEnabled(isEnabled: boolean): void;
@@ -122,9 +128,9 @@ export interface IYinYangController {
122
128
  * Fine (px) adjustment of the Key Event radial menu buttons' distance,
123
129
  * layered on top of the auto-computed base distance.
124
130
  */
125
- setCoreEventMenuDistanceOffset(offset: number): void;
126
- setCoreEventMenuItemScale(scale: number): void;
127
- setCoreEventIconFontScale(scale: number): void;
131
+ setKeyEventMenuDistanceOffset(offset: number): void;
132
+ setKeyEventMenuItemScale(scale: number): void;
133
+ setKeyEventIconFontScale(scale: number): void;
128
134
  /**
129
135
  * Sets maximum number of lines for child labels (1-3).
130
136
  */
@@ -136,6 +142,28 @@ export interface IYinYangController {
136
142
  setLabelShortMaxChars(chars: number): void;
137
143
  isChildrenEnabled(): boolean;
138
144
  isActionActive(): boolean;
145
+ /** Sous-état d'Idle : arcs pondérés ou un satellite yin/yang par facette. */
146
+ getIdleView(): "arcs" | "facettes" | "tab";
147
+ setIdleView(view: "arcs" | "facettes" | "tab"): Promise<void>;
148
+ /** Crochets de l'hôte autour du sous-état Idle « tab » (voir
149
+ * YinYangController.setIdleTabHooks). */
150
+ setIdleTabHooks(hooks: {
151
+ beforeEnter?: () => Promise<void> | void;
152
+ afterLeave?: () => Promise<void> | void;
153
+ } | null): void;
154
+ setOnIdleViewChange(callback: ((view: "arcs" | "facettes" | "tab") => void) | null): void;
155
+ toggleIdleView(): Promise<void>;
156
+ isIdleFacettesActive(): boolean;
157
+ /** Superpose (ou retire, `null`) à une signature d'obstacle la lecture
158
+ * d'un contact : diamètres sur W_f, chances Q_f, fantôme sur O_f
159
+ * (OBS-UI-01, voir `docs/integration-yvy-frontend.md`). */
160
+ setFacetModulation(modulation: {
161
+ weights: Record<string, number>;
162
+ scores: Record<string, number>;
163
+ } | null, options?: {
164
+ durationMs?: number;
165
+ ghostWaves?: boolean;
166
+ }): Promise<void>;
139
167
  /**
140
168
  * Sets font scale for action stack item labels.
141
169
  */
@@ -269,10 +297,10 @@ export interface IYinYangController {
269
297
  /** Called by YinYangDrawer when the user clicks an ODD arc: toggles that
270
298
  * ODD's legend chip in the panel, mirroring a direct chip click. */
271
299
  onDiagramOddArcClicked(oddId: string): void;
272
- /** Called by YinYangDrawer when the user clicks the small "eye" circle of
273
- * the facette's dominant lobe (yin or yang, per Composante.orientation) —
274
- * opens/closes the radial menu of Événements Clés for the active facette. */
275
- onCoreEventNucleusClicked(): void;
300
+ /** Called by YinYangDrawer when the user clicks the core of the facette's
301
+ * dominant lobe (yin or yang, per Composante.orientation) while a Facette
302
+ * is open — closes it and shows the cause in Idle « facettes ». */
303
+ onFacetteCoreClicked(): void;
276
304
  /** Wires a callback fired when the user clicks a composante border, cutting, or action in the diagram. */
277
305
  setOnDiagramNavChange(cb: (event: {
278
306
  type: "composante";
@@ -26,6 +26,11 @@ export interface YinYangComponentNode {
26
26
  label?: string;
27
27
  shortLabel?: string;
28
28
  orientation: YinYangOrientation;
29
+ /** Notion parente — voir `FacetNotion` (ICauseModel). */
30
+ notion?: {
31
+ id: string;
32
+ name: string;
33
+ };
29
34
  odds: YinYangOddNode[];
30
35
  }
31
36
  export interface YinYangInternalModel {
@@ -37,4 +42,6 @@ export interface YinYangInternalModel {
37
42
  name: string;
38
43
  description: string;
39
44
  };
45
+ /** Modèle SANS SCORE (signature d'obstacle) — voir `Cause.scoreless`. */
46
+ scoreless?: boolean;
40
47
  }
@@ -5,5 +5,5 @@ import "./styles/details-panel.css";
5
5
  import "./styles/search.css";
6
6
  import "./styles/delta-chips.css";
7
7
  import "./styles/action-image.css";
8
+ import "./styles/signature.css";
8
9
  export * from "./api";
9
- import "./benchmark/runner";
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Facteur de taille maximal des icônes d'action pour qu'elles tiennent dans
3
+ * leur bulle (groupe debug "Grappe actions" › "Taille icônes").
4
+ *
5
+ * Les SVG partagent un viewBox 64×64 mais leur dessin n'occupe pas tous la
6
+ * même surface : certains (satellite, barrières flottantes…) remplissent les
7
+ * coins et débordaient du cercle de la bulle. On rastérise chaque icône une
8
+ * fois pour mesurer son rayon réel (trait compris), puis on en déduit le
9
+ * facteur au-delà duquel le dessin franchirait l'anneau.
10
+ */
11
+ /** Taille de l'icône rapportée au rayon de la bulle, pour l'action active —
12
+ * la plus grande des deux variantes rendues par ChildActionMenuController. */
13
+ export declare const ACTIVE_ACTION_ICON_SIZE_RATIO = 1.85;
14
+ export declare function scaleFittingExtent(extent: number): number;
15
+ /** Plus grand facteur qui fait tenir toutes les icônes mesurées jusqu'ici
16
+ * (Infinity tant qu'aucune ne l'a été). */
17
+ export declare function getActionIconFitScale(): number;
18
+ export declare function onActionIconFitScaleChange(listener: (fitScale: number) => void): () => void;
19
+ /** Lance la mesure des icônes pas encore vues ; les abonnés sont prévenus
20
+ * chaque fois que le facteur admissible baisse. La promesse se résout quand
21
+ * toutes les icônes demandées sont mesurées, pour retoucher celles déjà
22
+ * affichées. */
23
+ export declare function measureActionIcons(urls: readonly string[]): Promise<void>;
@@ -1,4 +1,5 @@
1
- import { type CompiledPropagationGraph, type PropagationScope, type SatelliteKey } from "../interfaces/IPropagationGraph";
1
+ import { type KeyEventPropagationContext } from "../data/key-event-propagation";
2
+ import { type EventPropagationMetadata, type CompiledPropagationGraph, type PropagationScope, type SatelliteKey } from "../interfaces/IPropagationGraph";
2
3
  import { YinYangComponentNode } from "../interfaces/IYinYangInternalModel";
3
4
  export type Action = {
4
5
  id: string;
@@ -14,6 +15,7 @@ export type Action = {
14
15
  * ODD, autre facette — sont produites par le même parcours.
15
16
  */
16
17
  export type PropagatedActionEdge = {
18
+ eventPropagation?: EventPropagationMetadata;
17
19
  scope: PropagationScope;
18
20
  fromComponentId: string;
19
21
  toComponentId: string;
@@ -112,7 +114,7 @@ export type ActionPropagationDetails = ProjectedActionStateDetails & {
112
114
  * `allComponents` fournit l'état de base des autres facettes ; sans lui, les
113
115
  * sauts qui sortent de `component` sont ignorés.
114
116
  */
115
- export declare function computeActionPropagationDetails(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[]): ActionPropagationDetails;
117
+ export declare function computeActionPropagationDetails(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[], eventPropagation?: KeyEventPropagationContext): ActionPropagationDetails;
116
118
  /**
117
119
  * Arrivée dans `component` d'une arête venue d'une autre composante, déjà
118
120
  * calculée par la résolution de l'action (voir computeActionPropagationDetails).
@@ -141,6 +143,6 @@ export type IncomingLocalContinuation = {
141
143
  * autre ODD de la même composante est poursuivie comme une arête locale.
142
144
  */
143
145
  export declare function computeIncomingLocalContinuation(component: YinYangComponentNode, entry: IncomingPropagationEntry, graph: CompiledPropagationGraph): IncomingLocalContinuation;
144
- export declare function propagateForceFieldActionInComponent(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[]): PropagatedActionEdge[];
145
- export declare function projectActionStateDetailsInComponent(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[]): ProjectedActionStateDetails;
146
+ export declare function propagateForceFieldActionInComponent(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[], eventPropagation?: KeyEventPropagationContext): PropagatedActionEdge[];
147
+ export declare function projectActionStateDetailsInComponent(component: YinYangComponentNode, graph: CompiledPropagationGraph, sourceOddId: string, sourceCuttingId: number | undefined, delta: number, allComponents?: readonly YinYangComponentNode[], eventPropagation?: KeyEventPropagationContext): ProjectedActionStateDetails;
146
148
  export {};
@@ -14,31 +14,49 @@ export declare function clampScore(value: number): number;
14
14
  */
15
15
  export declare function tensionFromCuttings(cuttingScores: number[], cuttingWeights?: number[]): number;
16
16
  export declare const oddTensionFromCuttings: typeof tensionFromCuttings;
17
+ /**
18
+ * RÈGLE DES POIDS DE FACETTE, commutable pour comparaison (debug de la page
19
+ * standalone, clé localStorage `spheres.facetWeightRule`) :
20
+ * - `mean` (défaut, POC-05A4) : C_f = moyenne des poids de tous les
21
+ * satellites ; Q_f = moyenne pondérée sur tous les satellites, repli sur
22
+ * leur moyenne simple ;
23
+ * - `sum` (ancienne règle) : poids = somme des poids ; Q_f = tension de
24
+ * chaque catégorie pondérée par la somme de ses poids, repli par
25
+ * catégorie sur son nombre de satellites.
26
+ * La lib npm reste en `mean` : seule la page standalone la change.
27
+ */
28
+ export type FacetWeightRule = "mean" | "sum";
29
+ export declare function getFacetWeightRule(): FacetWeightRule;
30
+ export declare function setFacetWeightRule(rule: FacetWeightRule): void;
17
31
  /** Satellites d'une catégorie (ODD) d'une facette : tensions et poids. */
18
32
  interface FacetOddCuttings {
19
33
  cuttingScores: readonly number[];
20
34
  cuttingWeights: readonly number[];
21
35
  }
22
36
  /**
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
37
+ * Tension d'une FACETTE (cause ou contact). Règle `mean` (POC-05A4) :
38
+ * `tensionFromCuttings` sur TOUS ses satellites, catégories confondues —
39
+ * moyenne pondérée par les poids, ou moyenne simple de la facette si tous
40
+ * ses poids sont nuls. Règle `sum` : voir `FacetWeightRule`.
41
+ * Q_f = (1 − T) × 100. `cuttingTensions` remplace les tensions de la
42
+ * catégorie d'indice donné (projection d'une action) ; une catégorie dont
28
43
  * les poids ne sont pas alignés sur les scores compte ses satellites à 1.
29
44
  * Facette sans satellite : 0,5.
30
45
  */
31
46
  export declare function facetTensionFromOdds(odds: readonly FacetOddCuttings[], cuttingTensions?: (oddIndex: number) => readonly number[] | undefined): number;
32
47
  /**
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
48
+ * POIDS d'une facette — ou d'une catégorie, pour sa pastille. Règle `mean`
49
+ * (défaut, POC-05A4) : C_f, moyenne arithmétique des poids (bornés à 0) de
35
50
  * 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
51
+ * Règle `sum` : leur somme. Fixe la taille des arcs de facette et la valeur
52
+ * des pastilles. Facettes d'un contact, règle `mean` : reproduite à
53
+ * l'identique par yvy-backend (`contactFacetWeights`), cas communs dans
39
54
  * `src/data/contacts/contact-facets.reference.json`.
40
55
  */
41
- export declare function meanWeight(weights: readonly number[]): number;
56
+ export declare function facetWeight(weights: readonly number[]): number;
57
+ /** Plafond de `facetWeight` pour `count` satellites : 10 (`mean`) ou
58
+ * `count × 10` (`sum`). */
59
+ export declare function facetWeightMax(count: number): number;
42
60
  export declare function stateFromTension(tension: number): number;
43
61
  /** Bornes du poids d'un satellite (importance dans sa facette). Un satellite
44
62
  * vaut 1 par défaut ; les actions le font varier par pas entiers, mais ne