@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.
- package/dist/bundle.css +1 -0
- package/dist/bundle.js +1 -2
- package/dist/types/adapters/yasuniCauseAdapter.d.ts +13 -2
- package/dist/types/adapters/yinYangAdapter.d.ts +7 -0
- package/dist/types/animations/AnimationsMngr.d.ts +69 -15
- package/dist/types/animations/FrameScheduler.d.ts +99 -0
- package/dist/types/animations/rotationMotion.d.ts +43 -0
- package/dist/types/api.d.ts +31 -3
- package/dist/types/benchmark/runner.d.ts +20 -0
- package/dist/types/benchmark/scenarios.d.ts +55 -6
- package/dist/types/components/controller/YinYangController.d.ts +109 -14
- package/dist/types/components/controller/action-stack/ActionStackController.d.ts +16 -1
- package/dist/types/components/controller/action-stack/ActionStackDragHandler.d.ts +4 -0
- package/dist/types/components/controller/action-stack/ActionStackManager.d.ts +13 -2
- package/dist/types/components/controller/action-stack/ActionStackState.d.ts +8 -5
- package/dist/types/components/controller/action-stack/StackFocusController.d.ts +8 -7
- package/dist/types/components/controller/action-stack/stackChromePalette.d.ts +20 -0
- package/dist/types/components/controller/actions/ActionProjectionService.d.ts +12 -1
- package/dist/types/components/controller/actions/ChildActionMenuController.d.ts +74 -32
- package/dist/types/components/controller/actions/KeyEventController.d.ts +78 -70
- package/dist/types/components/controller/actions/{CoreEventMenuController.d.ts → KeyEventMenuController.d.ts} +28 -33
- package/dist/types/components/controller/actions/radialItemMenu.d.ts +43 -5
- package/dist/types/components/controller/children/ChildInteractionController.d.ts +4 -0
- package/dist/types/components/controller/children/ChildrenBuilder.d.ts +19 -22
- package/dist/types/components/controller/children/ComponentSwitchCoordinator.d.ts +3 -1
- package/dist/types/components/controller/children/IdleFacettesController.d.ts +205 -0
- package/dist/types/components/controller/children/facetModulation.d.ts +49 -0
- package/dist/types/components/controller/children/idleTabLayout.d.ts +95 -0
- package/dist/types/components/controller/children/idleTabMorph.d.ts +45 -0
- package/dist/types/components/controller/children/signatureLook.d.ts +10 -0
- package/dist/types/components/controller/force-field/EventFieldLifecycleController.d.ts +14 -0
- package/dist/types/components/controller/force-field/EventFieldRenderer.d.ts +3 -3
- package/dist/types/components/controller/force-field/ForceFieldCanvasPainter.d.ts +99 -0
- package/dist/types/components/controller/force-field/ForceFieldComputationService.d.ts +9 -0
- package/dist/types/components/controller/force-field/ForceFieldDetailsPanel.d.ts +28 -57
- package/dist/types/components/controller/force-field/ForceFieldDetailsPresenter.d.ts +4 -1
- package/dist/types/components/controller/force-field/ForceFieldLifecycleController.d.ts +16 -1
- package/dist/types/components/controller/force-field/ForceFieldRenderer.d.ts +10 -18
- package/dist/types/components/controller/force-field/IncomingForceFieldService.d.ts +2 -2
- package/dist/types/components/controller/force-field/PropagationAnimator.d.ts +2 -0
- package/dist/types/components/controller/force-field/keyEventPresentation.d.ts +47 -0
- package/dist/types/components/controller/force-field/propagation-viz/PropagationCometPlayer.d.ts +4 -0
- package/dist/types/components/controller/force-field/propagation-viz/propagationVizLists.d.ts +4 -2
- package/dist/types/components/controller/force-field/propagation-viz/propagationVizModel.d.ts +1 -0
- package/dist/types/components/controller/force-field/shieldViewModel.d.ts +6 -2
- package/dist/types/components/controller/force-field/types.d.ts +2 -1
- package/dist/types/components/controller/labels/ChildScoresDeltaRenderer.d.ts +7 -0
- package/dist/types/components/controller/labels/ComponentTitlePresenter.d.ts +13 -0
- package/dist/types/components/controller/labels/ContextLabelsRenderer.d.ts +16 -0
- package/dist/types/components/controller/labels/WeightPreviewRingRenderer.d.ts +33 -0
- package/dist/types/components/controller/odd/ChildrenOrbitManager.d.ts +76 -25
- package/dist/types/components/controller/odd/OddHighlightEffects.d.ts +2 -0
- package/dist/types/components/controller/odd/OddViewManager.d.ts +7 -3
- package/dist/types/components/controller/odd/childHighlightStyles.d.ts +45 -3
- package/dist/types/components/controller/search/SearchPanelSynchronizer.d.ts +8 -5
- package/dist/types/components/controller/settings/ControllerSettingsApplier.d.ts +4 -4
- package/dist/types/components/controller/state/ControllerSession.d.ts +3 -3
- package/dist/types/components/controller/state/ControllerUiCallbacks.d.ts +10 -0
- package/dist/types/components/controller/state/YinYangControllerState.d.ts +20 -9
- package/dist/types/components/controller/types.d.ts +9 -2
- package/dist/types/components/controller/utils/actionCatalog.d.ts +1 -1
- package/dist/types/components/controller/utils/eventFieldTargets.d.ts +19 -13
- package/dist/types/components/controller/utils/keyEventPropagationContext.d.ts +4 -0
- package/dist/types/components/controller/utils/keyEventTargetBreakdowns.d.ts +4 -0
- package/dist/types/components/controller/utils/svgTransform.d.ts +16 -0
- package/dist/types/components/controls/ObstacleDemoControl.d.ts +3 -0
- package/dist/types/components/controls/VizControlsPanel.d.ts +3 -1
- package/dist/types/components/panel/PanelManager.d.ts +92 -22
- package/dist/types/components/search/GlobalSearchController.d.ts +13 -6
- package/dist/types/components/view/BorderDrawer.d.ts +40 -14
- package/dist/types/components/view/IdleTabGridDrawer.d.ts +15 -0
- package/dist/types/components/view/SpikeDrawer.d.ts +18 -0
- package/dist/types/components/view/ViewInitializer.d.ts +45 -7
- package/dist/types/components/view/YinYangDrawer.d.ts +132 -30
- package/dist/types/components/view/borderColorCycle.d.ts +76 -0
- package/dist/types/components/workspace/facetWeightRuleSetting.d.ts +10 -0
- package/dist/types/components/workspace/workspaceTemplate.d.ts +1 -1
- package/dist/types/config/animationConfig.d.ts +10 -1
- package/dist/types/data/activeDiagram.d.ts +6 -2
- package/dist/types/data/adverse-action-planner.d.ts +3 -3
- package/dist/types/data/amplifier-engine.d.ts +6 -6
- package/dist/types/data/contacts/demoObstacle.d.ts +3 -0
- package/dist/types/data/contacts/index.d.ts +3 -0
- package/dist/types/data/contacts/obstacleSignature.d.ts +56 -0
- package/dist/types/data/key-event-effects.d.ts +30 -0
- package/dist/types/data/key-event-eligibility.d.ts +24 -0
- package/dist/types/data/key-event-propagation.d.ts +13 -0
- package/dist/types/data/key-event-types.d.ts +48 -0
- package/dist/types/data/key-event-validation.d.ts +11 -0
- package/dist/types/data/stability-shield.d.ts +14 -0
- package/dist/types/data/yasuni_adverse_key_events.d.ts +1 -1
- package/dist/types/data/yasuni_cause.d.ts +7 -0
- package/dist/types/data/yasuni_key_events.d.ts +4 -60
- package/dist/types/interfaces/ICauseModel.d.ts +16 -1
- package/dist/types/interfaces/IGraphicsStrategy.d.ts +9 -2
- package/dist/types/interfaces/IPropagationGraph.d.ts +14 -0
- package/dist/types/interfaces/IViewData.d.ts +19 -3
- package/dist/types/interfaces/IYinYangController.d.ts +35 -7
- package/dist/types/interfaces/IYinYangInternalModel.d.ts +7 -0
- package/dist/types/main.d.ts +1 -1
- package/dist/types/utils/actionIconFit.d.ts +23 -0
- package/dist/types/utils/actionPropagation.d.ts +6 -4
- package/dist/types/utils/causeMetrics.d.ts +29 -11
- package/dist/types/utils/chainCardHeight.d.ts +87 -4
- package/dist/types/utils/collapseAnimation.d.ts +39 -0
- package/dist/types/utils/d3/D3GraphicsStrategy.d.ts +28 -5
- package/dist/types/utils/deltaChips.d.ts +0 -4
- package/dist/types/utils/exportControls.d.ts +8 -0
- package/dist/types/utils/facetWeightLabel.d.ts +6 -4
- package/dist/types/utils/facetteImages.d.ts +6 -0
- package/dist/types/utils/glowHalo.d.ts +74 -0
- package/dist/types/utils/hierBadge.d.ts +1 -1
- package/dist/types/utils/keyEventImages.d.ts +1 -1
- package/dist/types/utils/menuIconSize.d.ts +17 -0
- package/dist/types/utils/spreadAngles.d.ts +17 -0
- package/package.json +4 -1
- 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 (`
|
|
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 :
|
|
19
|
-
* verrou d'animation, SANS
|
|
20
|
-
* quand les éléments vont être détruits : finalizeStop
|
|
21
|
-
* transforms des lobes yin/yang à la position de base
|
|
22
|
-
* or ces groupes vivent dans globalGroup, pas dans le
|
|
23
|
-
* clearChildren retire — le reset ressusciterait donc à
|
|
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
|
|
62
|
-
*
|
|
63
|
-
* pendant qu'un arrêt progressif est en cours ré-accélère en douceur
|
|
64
|
-
* la vitesse déjà atteinte, sans à-coup. `rampMs` omis (0) → vitesse
|
|
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
|
-
|
|
69
|
-
|
|
70
|
-
private
|
|
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;
|
package/dist/types/api.d.ts
CHANGED
|
@@ -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
|
-
/**
|
|
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
|
|
39
|
-
*
|
|
40
|
-
*
|
|
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
|
-
*
|
|
54
|
-
*
|
|
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>;
|