@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,13 +1,13 @@
1
1
  import type { Composante } from "../data/yasuni_cause";
2
2
  import type { Cause } from "../interfaces/ICauseModel";
3
- import { type ContactProfileData } from "../data/contacts";
3
+ import { type ContactProfileData, type ObstacleSignatureData } from "../data/contacts";
4
4
  /**
5
5
  * Adapte le catalogue Composante[] (format yasuni_cause.ts) vers le format
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
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
10
+ * ses satellites, catégories confondues, zéros inclus (`facetWeight`) — même
11
11
  * règle pour une cause et pour un contact (POC-05A4).
12
12
  */
13
13
  export declare function composantesToCause(composantes: Composante[], id?: string, name?: string): Cause;
@@ -28,3 +28,14 @@ export declare function getYasuniCause(id?: string): Cause;
28
28
  * bornes (`validateContactProfile`).
29
29
  */
30
30
  export declare function contactProfileToCause(profile: ContactProfileData, id?: string): Cause;
31
+ /**
32
+ * La `Cause` d'une SIGNATURE D'OBSTACLE (OBS-UI-01) : les huit facettes
33
+ * universelles d'un contact, chacune pesant son exigence O_f, SANS SCORE
34
+ * (`scoreless`) — un obstacle n'a pas de qualité. Montée avec
35
+ * `presentation: true`, elle s'affiche en Idle « facettes » ou « tab »
36
+ * (satellites-facettes à la taille de O_f) ; `setFacetModulation` y
37
+ * superpose ensuite la lecture d'un contact. Fraîchement construite à
38
+ * chaque appel ; lève une erreur explicite pour une signature invalide
39
+ * (`validateObstacleSignature`).
40
+ */
41
+ export declare function obstacleSignatureToCause(signature: ObstacleSignatureData, id?: string): Cause;
@@ -1,6 +1,13 @@
1
1
  import { YinYangComponentNode, YinYangInternalModel, YinYangOddNode } from "../interfaces/IYinYangInternalModel";
2
2
  import { Cause } from "../interfaces/ICauseModel";
3
3
  export declare function mapCauseToInternalModel(cause: Cause): YinYangInternalModel;
4
+ /**
5
+ * Builds the internal model of a facette satellite (Idle « facettes »
6
+ * sub-state): the whole facette — every ODD and cutting — as the single
7
+ * component of its own model. The satellite thus derives its yin/yang from
8
+ * facetTensionFromOdds exactly as the main circle does for that facette.
9
+ */
10
+ export declare function buildChildFacetteInternalModel(component: YinYangComponentNode): YinYangInternalModel;
4
11
  /**
5
12
  * Builds a single-component, single-odd, single-cutting internal model for a
6
13
  * satellite child, preserving the parent odd's orientation/labels so the
@@ -1,8 +1,22 @@
1
1
  import { IYinYangController } from "../interfaces/IYinYangController";
2
+ /**
3
+ * Rotation Yin/Yang du composant central et de ses satellites, composée par
4
+ * le navigateur : chaque mouvement (rampe, croisière, freinage) est décrit
5
+ * analytiquement (rotationMotion.ts) et joué par des Web Animations sur
6
+ * `transform`. Le contenu des lobes (arcs masqués, dégradés, images) n'est
7
+ * alors plus redessiné à chaque image : seule leur position change, sur le
8
+ * GPU, et le thread principal n'a plus rien à faire à chaque image. Les
9
+ * animations ne sont refaites que sur signal (ViewInitializer.
10
+ * onRotationTargetsChanged : géométrie des lobes, libellés redessinés), et
11
+ * la fin d'un freinage est programmée par une minuterie.
12
+ */
2
13
  export declare class AnimationsMngr {
3
14
  private subscriberMap;
4
15
  subscribe(component: IYinYangController, clockWise?: boolean, time?: number): void;
5
16
  startAll(): void;
17
+ /** Change la durée d'un tour. Une rotation en cours (hors freinage) y
18
+ * converge au rythme de sa rampe — progressivement plutôt que d'un coup
19
+ * si `rampMs > 0`. */
6
20
  setRotationDuration(durationMs: number): void;
7
21
  revertRotation(component: IYinYangController): void;
8
22
  /**
@@ -15,13 +29,13 @@ export declare class AnimationsMngr {
15
29
  */
16
30
  stopRotation(component: IYinYangController, rampMs?: number): void;
17
31
  /**
18
- * Désabonne un composant en fin de vie : coupe sa boucle rAF et libère son
19
- * verrou d'animation, SANS toucher au DOM. À utiliser (et non stopRotation)
20
- * quand les éléments vont être détruits : finalizeStop remettrait les
21
- * transforms des lobes yin/yang à la position de base (resetRotationFrame)
22
- * or ces groupes vivent dans globalGroup, pas dans le yinYangGroup que
23
- * clearChildren retire — le reset ressusciterait donc à l'écran des
24
- * satellites pourtant retirés.
32
+ * Désabonne un composant en fin de vie : annule ses animations et libère
33
+ * son verrou d'animation, SANS écrire dans le DOM. À utiliser (et non
34
+ * stopRotation) quand les éléments vont être détruits : finalizeStop
35
+ * remettrait les transforms des lobes yin/yang à la position de base
36
+ * (resetRotationFrame) or ces groupes vivent dans globalGroup, pas dans le
37
+ * yinYangGroup que clearChildren retire — le reset ressusciterait donc à
38
+ * l'écran des satellites pourtant retirés.
25
39
  */
26
40
  unsubscribe(component: IYinYangController): void;
27
41
  /**
@@ -54,18 +68,58 @@ export declare class AnimationsMngr {
54
68
  * choisie par l'utilisateur — voir `computeFastStopProfile`.
55
69
  */
56
70
  private beginFastHomingStop;
71
+ private beginBrake;
57
72
  private finalizeStop;
73
+ /** Fin de rotation sans toucher au DOM : animations annulées, veilles
74
+ * débranchées, verrou d'animation rendu. */
75
+ private release;
58
76
  private resetRotationFrame;
59
77
  /**
60
78
  * Démarre (ou modifie en vol) la rotation. Avec `rampMs > 0`, la vitesse
61
- * angulaire part de sa valeur courante (0 si à l'arrêt) et chasse
62
- * progressivement la vitesse cible déduite de `time`/`clockWise` — un appel
63
- * pendant qu'un arrêt progressif est en cours ré-accélère en douceur depuis
64
- * la vitesse déjà atteinte, sans à-coup. `rampMs` omis (0) → vitesse cible
65
- * appliquée instantanément, comportement historique.
79
+ * angulaire part de sa valeur courante (0 si à l'arrêt) et rejoint la
80
+ * vitesse cible déduite de `time`/`clockWise` à accélération constante — un
81
+ * appel pendant qu'un arrêt progressif est en cours ré-accélère en douceur
82
+ * depuis la vitesse déjà atteinte, sans à-coup. `rampMs` omis (0) → vitesse
83
+ * cible appliquée instantanément, comportement historique.
66
84
  */
67
85
  animate(component: IYinYangController, clockWise: boolean, time?: number, rampMs?: number): void;
68
- private startRotationLoop;
69
- private applyRotationFrame;
70
- private applyRotationToYinYangGroup;
86
+ /** Mouvement vers la vitesse cible depuis l'état courant (angle et
87
+ * vitesse à cet instant, qu'il y ait rotation, freinage ou arrêt). */
88
+ private startMotion;
89
+ private play;
90
+ /** Géométrie des lobes changée, ghost rempli ou libellés redessinés
91
+ * pendant la rotation : seules les pistes concernées sont refaites. */
92
+ private resync;
93
+ /**
94
+ * Cœur et lobes (base et ghost). Le cœur tourne de θ autour du centre du
95
+ * symbole ; chaque lobe orbite de θ autour de ce même centre puis tourne
96
+ * de ∓2θ sur lui-même — même cinématique que le film (api-film.ts). Les
97
+ * lobes ne sont pas dans le yinYangGroup : chacun porte l'orbite et sa
98
+ * rotation propre dans une seule liste de transformations, interpolée
99
+ * fonction par fonction (angles linéaires en θ).
100
+ */
101
+ private syncLobes;
102
+ /** Libellés contre-tournés : orientation opposée à celle de leur lobe. */
103
+ private syncLabels;
104
+ /**
105
+ * (Re)pose les animations des cibles dont la piste est absente ou
106
+ * périmée ; oublie celles des nœuds sortis du document. Une cible qui ne
107
+ * peint rien (ghost vide, libellé masqué) n'est pas animée : le navigateur
108
+ * refuse de composer une animation sans effet visible et la joue alors
109
+ * sur le thread principal, qui repeindrait tout à chaque image.
110
+ */
111
+ private syncTargets;
112
+ private dropTrack;
113
+ /**
114
+ * Une animation par tronçon, calée sur `document.timeline` : les tronçons
115
+ * s'enchaînent d'eux-mêmes, sans attendre le JS. Un tronçon fini garde sa
116
+ * pose finale (fill forwards) sous le suivant, créé après lui donc
117
+ * prioritaire dès qu'il démarre : pas d'image vide à la jonction. La
118
+ * croisière boucle sur un tour (θ → θ ± 360°), pose identique aux bornes
119
+ * pour chaque cible (multiples entiers de θ).
120
+ */
121
+ private animateTarget;
122
+ private cancelTracks;
123
+ /** Horloge des animations (temps de l'image courante). */
124
+ private now;
71
125
  }
@@ -0,0 +1,99 @@
1
+ /**
2
+ * Horloge d'animation commune : UNE seule requestAnimationFrame native par
3
+ * frame, quel que soit le nombre de boucles actives (rotation, orbite,
4
+ * transition de facette, ghost, champ de force, étincelles…).
5
+ *
6
+ * L'API reprend celle de requestAnimationFrame / cancelAnimationFrame pour
7
+ * que les boucles existantes migrent sans changer de forme : un rappel
8
+ * demandé pendant une frame s'exécute à la frame suivante, avec l'horodatage
9
+ * de la frame ; il ne tourne qu'une fois, la boucle se ré-abonne si elle veut
10
+ * continuer. Quand plus aucun rappel n'est en attente, plus aucune rAF native
11
+ * n'est demandée : l'arrêt est automatique.
12
+ *
13
+ * En plus de rAF :
14
+ * - phases : tous les rappels `read` (mesures DOM : getBBox,
15
+ * getBoundingClientRect…) passent avant tous les rappels `write` de la même
16
+ * frame, ce qui évite d'alterner lecture et écriture (layout forcé) ;
17
+ * - `fps` : cadence maximale d'un effet décoratif. Le rappel est simplement
18
+ * reporté aux frames suivantes tant que l'intervalle n'est pas écoulé ; la
19
+ * boucle étant pilotée par l'horodatage, l'animation garde sa vitesse, elle
20
+ * est seulement échantillonnée moins souvent ;
21
+ * - `pauseWhenHidden` : rappel suspendu tant que le diagramme est hors écran
22
+ * (voir observeVisibility). L'onglet caché, lui, est déjà géré par le
23
+ * navigateur, qui n'appelle plus rAF ;
24
+ * - activité (`isActive`, `onActivityChange`) : vrai tant qu'une boucle tourne
25
+ * à chaque frame depuis un moment, c.-à-d. que le diagramme est de toute
26
+ * façon repeint sur le thread principal. Un effet peut alors préférer
27
+ * s'y joindre plutôt que d'ajouter des calques composés (voir
28
+ * borderColorCycle). Les rappels `passive` n'en comptent pas.
29
+ */
30
+ export type FramePhase = "read" | "write";
31
+ export interface FrameRequestOptions {
32
+ /** Défaut "write". */
33
+ phase?: FramePhase;
34
+ /** Cadence maximale (images/s) — pour les effets décoratifs. */
35
+ fps?: number;
36
+ /** Suspendu tant que le diagramme est hors écran. */
37
+ pauseWhenHidden?: boolean;
38
+ /** Ne compte pas comme activité (voir isActive) : un effet qui ne tourne
39
+ * que parce que le diagramme est actif ne doit pas l'entretenir. */
40
+ passive?: boolean;
41
+ }
42
+ /** Ce que les appelants utilisent de d3.Timer. */
43
+ export interface FrameTimer {
44
+ stop(): void;
45
+ }
46
+ export declare class FrameScheduler {
47
+ private nextId;
48
+ private queue;
49
+ /** Frame en cours d'exécution : un cancel() doit aussi pouvoir y retirer
50
+ * un rappel pas encore exécuté, comme cancelAnimationFrame. */
51
+ private running;
52
+ private nativeFrameId;
53
+ /** Dernière exécution de chaque boucle bridée, indexée par son rappel :
54
+ * une boucle se ré-abonne avec la même fonction à chaque frame. */
55
+ private lastRunByCallback;
56
+ private observer;
57
+ private visibility;
58
+ private active;
59
+ /** Début de la suite de frames actives en cours, null hors d'une suite. */
60
+ private activeStreakStart;
61
+ private lastActiveAt;
62
+ private activityListeners;
63
+ request(callback: FrameRequestCallback, options?: FrameRequestOptions): number;
64
+ cancel(id: number | null | undefined): void;
65
+ /** Équivalent de d3.timer : `callback(elapsedMs)` à chaque frame jusqu'à
66
+ * stop(). */
67
+ timer(callback: (elapsedMs: number) => void, options?: FrameRequestOptions): FrameTimer;
68
+ /**
69
+ * Déclare un élément racine du diagramme : tant qu'aucun des éléments
70
+ * déclarés n'est à l'écran, les rappels `pauseWhenHidden` sont suspendus.
71
+ */
72
+ observeVisibility(element: Element): void;
73
+ /** Inverse d'observeVisibility : le diagramme est démonté. */
74
+ unobserveVisibility(element: Element): void;
75
+ isDiagramVisible(): boolean;
76
+ /** Vrai quand une boucle non passive tourne depuis ACTIVITY_ENTER_MS : le
77
+ * diagramme est alors repeint à chaque frame sur le thread principal. */
78
+ get isActive(): boolean;
79
+ /** Prévient à chaque bascule actif/repos ; renvoie le désabonnement. Le
80
+ * retour au repos n'est constaté que par une frame : un écouteur qui veut
81
+ * le voir garde une boucle `passive` tant qu'il est actif. */
82
+ onActivityChange(listener: (active: boolean) => void): () => void;
83
+ /** Nombre de rappels en attente (diagnostic, tests). */
84
+ get pendingCount(): number;
85
+ /** Tests : oublie tout, y compris la rAF native en attente (les tests
86
+ * remplacent requestAnimationFrame entre deux cas). */
87
+ reset(): void;
88
+ private ensureNativeFrame;
89
+ private hasRunnableEntry;
90
+ private flush;
91
+ private trackActivity;
92
+ }
93
+ export declare const frameScheduler: FrameScheduler;
94
+ /** Effets permanents sans valeur hors écran (étincelle du pourtour,
95
+ * surbrillance d'ODD) : suspendus quand le diagramme n'est pas visible. */
96
+ export declare const AMBIENT_FRAME: FrameRequestOptions;
97
+ /** Effets décoratifs en boucle (vagues et pulsation du ghost) : bridés à
98
+ * animationConfig.decorativeFps et suspendus hors écran. */
99
+ export declare const DECORATIVE_FRAME: FrameRequestOptions;
@@ -0,0 +1,43 @@
1
+ import { FastStopProfile } from "./fastHomingStop";
2
+ /**
3
+ * Mouvement angulaire décrit analytiquement, tronçon par tronçon, pour être
4
+ * joué par le navigateur (Web Animations) plutôt qu'écrit image par image :
5
+ * chaque tronçon est à accélération constante, donc sa position est un
6
+ * polynôme du second degré en temps, qu'une courbe `cubic-bezier` reproduit
7
+ * exactement (voir `segmentEasing`).
8
+ *
9
+ * Les temps sont ceux de `document.timeline` (ms), les angles en degrés, les
10
+ * vitesses en °/ms et les accélérations en °/ms², tous signés (+ = horaire).
11
+ * Les calculs ne dépendent pas de l'unité d'angle : l'orbite des satellites
12
+ * (ChildrenOrbitManager) les fait en radians.
13
+ */
14
+ export interface MotionSegment {
15
+ startTime: number;
16
+ /** Infinity = croisière à vitesse constante, sans fin. */
17
+ duration: number;
18
+ angle0: number;
19
+ omega0: number;
20
+ accel: number;
21
+ }
22
+ export declare function angleAfter(segment: MotionSegment, elapsedMs: number): number;
23
+ export declare function motionEndTime(segments: MotionSegment[]): number;
24
+ /** Angle et vitesse du mouvement à l'instant `time` (0 sans mouvement). */
25
+ export declare function evaluateMotion(segments: MotionSegment[], time: number): {
26
+ angle: number;
27
+ omega: number;
28
+ };
29
+ /**
30
+ * Démarrage ou changement de vitesse : rampe à accélération constante
31
+ * (`accelMag`, °/ms²) de `omega` vers `targetOmega`, puis croisière.
32
+ * `accelMag` ≤ 0 → vitesse cible appliquée d'emblée.
33
+ */
34
+ export declare function rampSegments(startTime: number, angle: number, omega: number, targetOmega: number, accelMag: number): MotionSegment[];
35
+ /** Freinage vers la position de base selon un profil de `fastHomingStop`. */
36
+ export declare function brakeSegments(startTime: number, angle: number, direction: number, profile: FastStopProfile): MotionSegment[];
37
+ /**
38
+ * Courbe d'accélération d'un tronçon fini. Avec x1 = 1/3 et x2 = 2/3, le
39
+ * temps est linéaire dans le paramètre de la courbe ; la progression est
40
+ * alors le polynôme cubique de mêmes pentes aux bornes que la position, qui
41
+ * est du second degré : c'est donc elle, exactement.
42
+ */
43
+ export declare function segmentEasing(segment: MotionSegment): string;
@@ -4,9 +4,14 @@ import type { YinYangInternalModel } from "./interfaces/IYinYangInternalModel";
4
4
  import type { Cause } from "./interfaces/ICauseModel";
5
5
  export type { IViewData } from "./interfaces/IViewData";
6
6
  export type { IYinYangController } from "./interfaces/IYinYangController";
7
- export type { Cause, CauseComponent, CauseOdd, CauseOddCutting, } from "./interfaces/ICauseModel";
7
+ export type { Cause, CauseComponent, CauseOdd, CauseOddCutting, FacetNotion, } from "./interfaces/ICauseModel";
8
8
  export type { YinYangInternalModel, YinYangComponentNode, YinYangOddNode, YinYangCuttingNode, YinYangCategorySlice, YinYangOrientation, } from "./interfaces/IYinYangInternalModel";
9
9
  export { mapCauseToInternalModel } from "./adapters/yinYangAdapter";
10
+ /** Sous-état Idle du diagramme (aucune facette ouverte) — voir
11
+ * `YinYangMountConfig.idleView`. */
12
+ export type YinYangIdleView = "arcs" | "facettes" | "tab";
13
+ export type { FacetModulation, FacetModulationOptions, } from "./components/controller/children/facetModulation";
14
+ import type { FacetModulation, FacetModulationOptions } from "./components/controller/children/facetModulation";
10
15
  /** Données acceptées : soit une `Cause` (format métier), soit le modèle interne déjà adapté. */
11
16
  export type YinYangData = Cause | YinYangInternalModel;
12
17
  export interface YinYangSvgConfig {
@@ -29,10 +34,31 @@ export interface YinYangMountConfig {
29
34
  /** Mode PRÉSENTATION : le diagramme se lit, il ne se manœuvre pas — voir
30
35
  * `IViewData.presentation`. Défaut : false (l'atelier complet). */
31
36
  presentation?: boolean;
37
+ /** Sous-état Idle affiché au montage : `"arcs"` (arcs pondérés des
38
+ * facettes autour de l'illustration) ou `"facettes"` (un satellite
39
+ * yin/yang par facette, à l'angle de son arc) ou `"tab"` (ces mêmes
40
+ * satellites rangés dans une grille régulière autour d'une illustration
41
+ * réduite — les facettes d'une même notion parente, `CauseComponent.notion`,
42
+ * y sont regroupées). L'utilisateur passe ensuite d'un sous-état au
43
+ * suivant en cliquant l'illustration centrale. Défaut : `"arcs"`. */
44
+ idleView?: YinYangIdleView;
32
45
  }
33
46
  export interface YinYangMountHandle {
34
47
  controller: IYinYangController;
35
- /** Vide le conteneur. */
48
+ /** Bascule (animée) du sous-état Idle — voir `YinYangMountConfig.idleView`.
49
+ * Facette ouverte : le choix s'applique à sa fermeture. */
50
+ setIdleView(view: YinYangIdleView): Promise<void>;
51
+ /** Signature d'obstacle (`obstacleSignatureToCause`) : y superpose la
52
+ * lecture d'un contact, ou la retire (`null`). Pour chaque facette (id) :
53
+ * `weights` le poids modulé W_f (0–10, diamètre du satellite), `scores`
54
+ * la qualité Q_f du contact (0–100, sa chance affichée). Le diamètre
55
+ * d'origine (O_f) reste visible en fantôme ; places et échelle ne
56
+ * bougent pas. `durationMs` anime le passage (0 : immédiat),
57
+ * `ghostWaves` fait courir la vague du fantôme (à couper en mouvement
58
+ * réduit). Une facette de poids nul reste sans score. */
59
+ setFacetModulation(modulation: FacetModulation | null, options?: FacetModulationOptions): Promise<void>;
60
+ /** Arrête toutes les boucles d'animation du diagramme (champ de force,
61
+ * orbite, rotation, ghost, étincelles…) puis vide le conteneur. */
36
62
  destroy(): void;
37
63
  }
38
64
  /**
@@ -58,10 +84,12 @@ export { createYinYangFilmSvg, createYinYangFilmSvgAsync } from "./api-film";
58
84
  export type { YinYangFilmConfig, YinYangFilmAsyncOptions } from "./api-film";
59
85
  export { createRandomCause } from "./api-random";
60
86
  export type { RandomCauseOptions, RandomRange } from "./api-random";
61
- export { getYasuniCause, contactProfileToCause } from "./adapters/yasuniCauseAdapter";
87
+ export { getYasuniCause, contactProfileToCause, obstacleSignatureToCause, } from "./adapters/yasuniCauseAdapter";
62
88
  export { validateContactProfile } from "./data/contacts/buildContactSphere";
63
89
  export type { ContactProfileData, ContactSatelliteValue, } from "./data/contacts/buildContactSphere";
64
90
  export { UNIVERSAL_FACETS, CONTACT_CATEGORIES } from "./data/contacts/universalFacets";
91
+ export { contactFacetReadings, obstacleFacetWeight, obstacleModulation, validateObstacleSignature, } from "./data/contacts/obstacleSignature";
92
+ export type { ContactFacetReading, ObstacleSignatureData, } from "./data/contacts/obstacleSignature";
65
93
  export type { SatelliteKey, ContactFacetId, ContactCategoryId, UniversalFacet, UniversalSatellite, ContactCategory, } from "./data/contacts/universalFacets";
66
94
  export { mountYinYangWorkspace } from "./api-workspace";
67
95
  export type { YinYangWorkspaceConfig, YinYangWorkspaceHandle, } from "./api-workspace";
@@ -1,5 +1,25 @@
1
1
  declare global {
2
2
  var runBenchmark: () => Promise<void>;
3
3
  var runBenchmarkAvg: (n: number) => Promise<void>;
4
+ var runBenchmarkReport: (only?: string[]) => Promise<BenchmarkReport>;
5
+ }
6
+ import { type DomCounts } from "./scenarios";
7
+ interface ScenarioResult {
8
+ name: string;
9
+ description: string;
10
+ duration: number;
11
+ setupMs?: number;
12
+ avgFrameMs: number;
13
+ p95FrameMs: number;
14
+ longTasksCount: number;
15
+ domCounts?: DomCounts;
16
+ }
17
+ interface BenchmarkReport {
18
+ commit: string;
19
+ timestamp: string;
20
+ runsCount?: number;
21
+ longTaskObserverOk?: boolean;
22
+ scenarios: ScenarioResult[];
23
+ analysis?: Record<string, unknown>;
4
24
  }
5
25
  export {};
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Compteurs DOM d'un scénario (détection de fuites : nœuds SVG, `<animate>` SMIL,
3
+ * enfants de `<defs>`). Relevés par le scénario juste avant de retirer son
4
+ * conteneur, puis lus une seule fois par le runner via takeDomCounts().
5
+ */
6
+ export interface DomCounts {
7
+ svgNodes: number;
8
+ animateNodes: number;
9
+ defsChildren: number;
10
+ }
11
+ export declare function takeDomCounts(): DomCounts | undefined;
1
12
  /**
2
13
  * Scenario 1 — Large dataset initialization.
3
14
  *
@@ -35,10 +46,9 @@ export declare function runComponentSwitchScenario(hooks?: ComponentSwitchHooks)
35
46
  /**
36
47
  * Scenario 3 — Rotation animation.
37
48
  *
38
- * Starts the continuous rotation animation (AnimationsMngr RAF loop) on a
39
- * full Yasuni instance including orbit children, and lets it run for
40
- * TRANSITION_DURATION_MS. Measures per-frame cost: Yin/Yang orbital math,
41
- * SVG transform updates for parent + all children.
49
+ * Starts the continuous rotation animation (AnimationsMngr, Web Animations
50
+ * composed by the browser) on a full Yasuni instance including orbit
51
+ * children, and lets it run for TRANSITION_DURATION_MS.
42
52
  *
43
53
  * Performance measure name: "bm-transition"
44
54
  */
@@ -50,8 +60,8 @@ export interface BaselineHooks {
50
60
  /**
51
61
  * Scenario — Baseline (pivot).
52
62
  *
53
- * Controller + satellites en état idle : aucune action activée, aucune rotation,
54
- * aucun champ de force. Seuls les RAF loops systèmes tournent en arrière-plan
63
+ * Facette 0 ouverte (donc satellites présents), sans action, rotation ni champ de force :
64
+ * seuls les RAF loops systèmes tournent en arrière-plan
55
65
  * (ghost pulse, outer spark, cycle couleurs de bordure).
56
66
  *
57
67
  * Sert de référence directe pour quantifier le surcoût de chaque autre scénario :
@@ -116,3 +126,42 @@ export declare function runForceFieldDirectScenario(hooks?: ForceFieldHooks): Pr
116
126
  * Performance measure names: "bm-forcefield-merged-setup", "bm-forcefield-merged"
117
127
  */
118
128
  export declare function runForceFieldMergedScenario(hooks?: ForceFieldHooks): Promise<void>;
129
+ /**
130
+ * Scenario 8 — ghostProjection : action projetée en mode Pile, 3 s.
131
+ *
132
+ * Mode Pile forcé + activation d'une action (ODD_15 / cut0) : le ghost (badge
133
+ * de deltas, vagues, arc / bordure / spikes ghost) tourne en boucle sans fin.
134
+ * Mesure le régime établi pendant 3 s, une fois la projection affichée.
135
+ *
136
+ * Performance measure names: "bm-ghost-setup", "bm-ghost"
137
+ */
138
+ export declare function runGhostProjectionScenario(hooks?: ForceFieldHooks): Promise<void>;
139
+ /**
140
+ * Scenario 9 — orbit : orbite des satellites SANS action active (3 s).
141
+ *
142
+ * setChildrenOrbitEnabled(true) : chaque frame, ChildrenOrbitManager.applyTransforms
143
+ * déclenche renderOppositeChildrenForceField (labels de contexte, panneau de
144
+ * détails…). Cible : la cascade applicative à 60 fps hors champ de force.
145
+ *
146
+ * Performance measure name: "bm-orbit"
147
+ */
148
+ export declare function runOrbitScenario(hooks?: ForceFieldHooks): Promise<void>;
149
+ /**
150
+ * Scenario 10 — orbitAction : orbite des satellites AVEC une action active (3 s).
151
+ *
152
+ * Même chose qu'orbit, mais après searchNavigateToAction : le champ de force
153
+ * est alors dessiné par l'orbite ET par sa propre boucle.
154
+ *
155
+ * Performance measure names: "bm-orbit-action-setup", "bm-orbit-action"
156
+ */
157
+ export declare function runOrbitActionScenario(hooks?: ForceFieldHooks): Promise<void>;
158
+ /**
159
+ * Scenario 11 — idleTabMorph : Idle « facettes » → « tab » → « facettes ».
160
+ *
161
+ * La fenêtre de mesure couvre les deux morphs et un maintien de 1 s sur la
162
+ * grille « tab » (transform sur le globalGroup racine à chaque tick, fondus
163
+ * d'images clip-pathées).
164
+ *
165
+ * Performance measure name: "bm-idle-tab"
166
+ */
167
+ export declare function runIdleTabMorphScenario(hooks?: ForceFieldHooks): Promise<void>;