@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
@@ -5,6 +5,9 @@ import { IYinYangAppFactory } from "../../interfaces/IYinYangAppFactory";
5
5
  import { IAnimator } from "../../interfaces/IAnimator";
6
6
  import { YinYangInternalModel } from "../../interfaces/IYinYangInternalModel";
7
7
  import { ForceFieldLinkDetail } from "./force-field/types";
8
+ import { type IdleTabHooks } from "./children/IdleFacettesController";
9
+ import type { FacetModulation, FacetModulationOptions } from "./children/facetModulation";
10
+ import type { IdleView } from "./state/YinYangControllerState";
8
11
  import type { DiagramNavEvent } from "./types";
9
12
  export declare class YinYangController implements IYinYangController {
10
13
  model: IYinYangModel;
@@ -12,6 +15,9 @@ export declare class YinYangController implements IYinYangController {
12
15
  factory: IYinYangAppFactory;
13
16
  animator: IAnimator;
14
17
  private childControllers;
18
+ /** Vrai pendant la création des satellites (ChildrenBuilder) : les rendus
19
+ * intermédiaires du champ de force y sont ignorés, un seul suit. */
20
+ private forceFieldRenderSuppressed;
15
21
  /** État de la rotation spin (voir startRotation/stopRotationAll) — non nul
16
22
  * tant que la rotation est active, pour que les enfants recréés en cours
17
23
  * de route (createYinYangChildren) démarrent immédiatement avec les mêmes
@@ -22,7 +28,7 @@ export declare class YinYangController implements IYinYangController {
22
28
  private readonly ACTION_DRAG_THRESHOLD_PX;
23
29
  private actionStackController;
24
30
  private childActionMenuController;
25
- private coreEventMenuController;
31
+ private keyEventMenuController;
26
32
  private forceFieldDetailsPanel;
27
33
  private forceFieldRenderer;
28
34
  /** Champ d'événement — liens cœur → satellites amplifiés par l'Événement
@@ -41,6 +47,8 @@ export declare class YinYangController implements IYinYangController {
41
47
  private actionStackManager;
42
48
  private state;
43
49
  private childrenBuilder;
50
+ private idleFacettes;
51
+ private onIdleViewChange;
44
52
  private componentSwitch;
45
53
  private incomingForceField;
46
54
  private detailsPresenter;
@@ -56,6 +64,39 @@ export declare class YinYangController implements IYinYangController {
56
64
  * Constructor to initialize the controller with its model, view, and factory.
57
65
  */
58
66
  constructor(model: IYinYangModel, view: IYinYangView, factory: IYinYangAppFactory);
67
+ /** Sous-état d'Idle affiché quand aucune Facette n'est ouverte : arcs
68
+ * pondérés (« arcs ») ou un satellite yin/yang par facette (« facettes »). */
69
+ getIdleView(): IdleView;
70
+ /** Crochets de l'hôte autour du sous-état Idle « tab » : `beforeEnter`
71
+ * (attendu avant le calcul de la grille — ex. replier des panneaux pour
72
+ * agrandir le conteneur du diagramme) et `afterLeave` (satellites revenus
73
+ * à leur place radiale — ex. rétablir ces panneaux). */
74
+ setIdleTabHooks(hooks: IdleTabHooks | null): void;
75
+ /** Rappel de l'hôte à chaque changement de sous-état Idle (ex. refléter
76
+ * l'état d'un bouton « Arcs »). */
77
+ setOnIdleViewChange(callback: ((view: IdleView) => void) | null): void;
78
+ /** Bascule vers un sous-état d'Idle. Hors Idle (Facette ouverte), le choix
79
+ * est seulement mémorisé : il s'appliquera à la fermeture de la Facette. */
80
+ setIdleView(view: IdleView): Promise<void>;
81
+ private isEventFieldInIdleFacettes;
82
+ /** Amène le diagramme en Idle « facettes » — en refermant la Facette
83
+ * ouverte s'il le faut. Résolu une fois les satellites-facettes sortis. */
84
+ private showIdleFacettes;
85
+ /** Clic sur le cœur du lobe dominant en Facette : referme la Facette et
86
+ * revient à la cause en Idle « facettes », quel que soit le sous-état
87
+ * Idle mémorisé. */
88
+ onFacetteCoreClicked(): void;
89
+ /** Clic sur l'illustration centrale : facettes ↔ tab (sans effet hors Idle
90
+ * et en « arcs »). */
91
+ toggleIdleView(): Promise<void>;
92
+ /** Superpose (ou retire, `null`) la lecture d'un contact à une
93
+ * signature d'obstacle (OBS-UI-01) — voir
94
+ * IdleFacettesController.setModulation. */
95
+ setFacetModulation(modulation: FacetModulation | null, options?: FacetModulationOptions): Promise<void>;
96
+ /** Vrai quand le sous-état Idle « facettes » est visé (arcs repliés). */
97
+ isIdleFacettesActive(): boolean;
98
+ /** Réaligne le sous-état Idle après une entrée/sortie d'Idle. */
99
+ syncIdleView(): void;
59
100
  /**
60
101
  * Retrieves the number of borders for the YinYang view.
61
102
  */
@@ -211,6 +252,8 @@ export declare class YinYangController implements IYinYangController {
211
252
  private setActiveChild;
212
253
  private clearActiveChild;
213
254
  private animateChildren;
255
+ private destroyed;
256
+ destroy(): void;
214
257
  private clearChildren;
215
258
  setChildrenOrbitEnabled(isEnabled: boolean, rampMs?: number): void;
216
259
  /** Arrête l'orbite des satellites en rejoignant leur position de base dans
@@ -307,10 +350,37 @@ export declare class YinYangController implements IYinYangController {
307
350
  * Fermeture du menu radial d'un satellite et de l'action qu'il projetait
308
351
  * (champ de force, ghosts, bloc d'action du panneau) — chemin unique partagé
309
352
  * par la hiérarchie (deactivateChildMenuFromHierarchy) et par l'exclusivité
310
- * action/événement (toggleCoreEventMenu, previewKeyEvent). No-op si aucun
353
+ * action/événement (toggleKeyEventMenu, previewKeyEvent). No-op si aucun
311
354
  * satellite n'est actif.
312
355
  */
313
356
  private closeChildActionMenu;
357
+ /**
358
+ * Sélection courante du diagramme — satellite, sinon ODD mis en valeur,
359
+ * sinon facette ; null en vue Sphère (aucune facette ouverte). Sert à
360
+ * mémoriser la sélection propre à un mode au moment de le quitter (voir
361
+ * PanelManager.rememberStackSelection).
362
+ */
363
+ getDiagramSelection(): {
364
+ type: "composante";
365
+ componentIndex: number;
366
+ } | {
367
+ type: "odd";
368
+ componentIndex: number;
369
+ oddId: string;
370
+ } | {
371
+ type: "cutting";
372
+ componentIndex: number;
373
+ oddId: string;
374
+ cuttingIndex: number;
375
+ } | null;
376
+ /**
377
+ * Remet le diagramme à blanc sous la facette courante — satellite
378
+ * désélectionné (menu et action projetée compris), ODD éteint — avant d'y
379
+ * rejouer la sélection mémorisée d'un mode. La facette elle-même reste
380
+ * ouverte (vue ODD quittée) : c'est la sélection rejouée qui décide de la
381
+ * garder, d'en changer ou de la fermer.
382
+ */
383
+ clearDiagramSelection(): void;
314
384
  deactivateComposanteFromHierarchy(): void;
315
385
  /**
316
386
  * Fermeture de la facette courante — chemin unique partagé par l'arc de
@@ -335,7 +405,7 @@ export declare class YinYangController implements IYinYangController {
335
405
  */
336
406
  syncForceFieldToStackMode(): void;
337
407
  /**
338
- * Recalcule le Champ d'événement pour le mode courant — à appeler APRÈS que
408
+ * Recalcule les bulles et le Champ d'événement pour le mode courant — APRÈS que
339
409
  * l'onglet a réellement basculé (les gardes RECHERCHE/STACK, elles, tournent
340
410
  * en phase de capture, avant le toggle de `ff-tab-active`, et liraient donc
341
411
  * encore l'ancien mode via isStackModeActive).
@@ -364,18 +434,20 @@ export declare class YinYangController implements IYinYangController {
364
434
  /** Centre automatiquement (scroll animé) le bloc "Effets cumulés" correspondant
365
435
  * à cet item de pile, dès qu'il apparaît dans le panneau — voir
366
436
  * ForceFieldDetailsPanel.requestScrollToStackItemBlock. */
437
+ private _guidedEventPreviewItem;
367
438
  /**
368
439
  * Glisser guidé d'un prérequis depuis RECHERCHE : la bascule vers STACK
369
440
  * faite par le glisser (switchToTab direct, sans le clic d'onglet qui
370
441
  * appelle syncForceFieldToStackMode) laissait le panneau sur le satellite
371
442
  * de l'action glissée — encore absente de la pile, donc sans aucun bloc.
372
443
  * On resynchronise les champs de la pile comme un vrai passage en STACK,
373
- * puis on affiche les blocs du satellite de l'action portant le combo,
444
+ * puis on affiche les blocs du satellite de l'action portant le combo
445
+ * ou l'aperçu de l'action ciblée par l'événement,
374
446
  * sans déplacer la sélection du diagramme (le dépôt s'en charge).
375
447
  */
376
448
  private showStackItemBlocksForDrag;
377
449
  /**
378
- * Sélectionne le satellite porteur d'un item de pile (diagramme + panneau)
450
+ * Sélectionne le satellite porteur ou la Facette d'origine d'un item de pile (diagramme + panneau)
379
451
  * et centre son bloc — même effet qu'un clic sur le libellé de l'item
380
452
  * (voir setOnSelectStackItemSatellite dans DiagramPanelBridge).
381
453
  */
@@ -399,7 +471,8 @@ export declare class YinYangController implements IYinYangController {
399
471
  setOnDirectActionBlock(show: (compId: string, oddId: string, cutIdx: number, actionId: string, cardsHtml: string, attachHandlers: (container: HTMLElement) => void) => void, clear: () => void): void;
400
472
  /** Wire from main.ts — injecte la carte descriptive d'un Événement Clé dans l'onglet Recherche. */
401
473
  setOnShowKeyEventBlock(show: (compId: string, keyEventId: string, cardsHtml: string, attachHandlers: (container: HTMLElement) => void) => void, clear: () => void): void;
402
- /** Enregistre le miroir "menu cœur déployé ?" vers la hiérarchie RECHERCHE. */
474
+ /** Enregistre le miroir "bulles d'Événements Clés déployées sur quel
475
+ * satellite-facette ?" vers la hiérarchie RECHERCHE. */
403
476
  setOnKeyEventMenuStateChange(cb: (componentIndex: number, open: boolean) => void): void;
404
477
  /** Wire from main.ts — affiche le bloc d'action directe d'un prérequis dans le panneau B. */
405
478
  setOnDirectActionBlockPanelB(show: (compId: string, oddId: string, cutIdx: number, actionId: string, cardsHtml: string, attachHandlers: (container: HTMLElement) => void) => void): void;
@@ -425,6 +498,19 @@ export declare class YinYangController implements IYinYangController {
425
498
  setOnDiagramOddChange(cb: (componentIndex: number, oddId: string, mode: "highlight") => void): void;
426
499
  /** Wire from main.ts to sync the search panel on composante / cutting / action clicks. */
427
500
  setOnDiagramNavChange(cb: (event: DiagramNavEvent) => void): void;
501
+ /** Consulter un autre satellite garde l'action active (et son champ de
502
+ * force) : toujours en STACK, en RECHERCHE seulement avec un panneau
503
+ * verrouillé — voir openActionMenuFromChild. */
504
+ private keepsActiveActionOnSatelliteSwitch;
505
+ setIsAnyRecherchePanelLocked(cb: () => boolean): void;
506
+ /** Multi-blocs : un panneau RECHERCHE verrouillé sur une action la fige
507
+ * comme action source — les boutons d'action s'estompent et un clic
508
+ * dessus est refusé (voir onActionSelectionBlocked). */
509
+ setActionSelectionLock(isLocked: () => boolean, onBlocked: (retry: () => void) => void): void;
510
+ private isActionSelectionLocked;
511
+ /** Redessine le menu d'actions du satellite sélectionné — après un
512
+ * (dé)verrouillage de panneau, qui change l'estompage des boutons. */
513
+ refreshChildActionMenu(): void;
428
514
  setOnDiagramSatelliteDeselect(cb: (componentIndex: number) => void): void;
429
515
  setOnDiagramComposanteDeselect(cb: () => void): void;
430
516
  setOnDiagramChildHover(cb: (componentIndex: number | null, oddId: string | null, cuttingIndex?: number) => void): void;
@@ -466,9 +552,9 @@ export declare class YinYangController implements IYinYangController {
466
552
  setChildActionMenuItemDistance(distance: number): void;
467
553
  setChildActionMenuItemScale(scale: number): void;
468
554
  setChildActionIconFontScale(scale: number): void;
469
- setCoreEventMenuDistanceOffset(offset: number): void;
470
- setCoreEventMenuItemScale(scale: number): void;
471
- setCoreEventIconFontScale(scale: number): void;
555
+ setKeyEventMenuDistanceOffset(offset: number): void;
556
+ setKeyEventMenuItemScale(scale: number): void;
557
+ setKeyEventIconFontScale(scale: number): void;
472
558
  setChildLabelMaxLines(lines: number): void;
473
559
  setLabelShortMaxChars(chars: number): void;
474
560
  setOddLabelMaxLines(lines: number): void;
@@ -487,13 +573,22 @@ export declare class YinYangController implements IYinYangController {
487
573
  private clearProjectedActionState;
488
574
  private applyEmptyGhostProjectionState;
489
575
  private updateChildActionMenu;
490
- /** Clic sur le libellé de l'item en focus dans la pile, rejoué depuis une
491
- * bulle du diagramme — null hors STACK ou sans focus. */
492
- private focusedStackItemLabelClick;
576
+ /**
577
+ * STACK : une bulle par action activée de la pile dont la source est sur
578
+ * la facette affichée, sur son satellite source. Comme les champs de
579
+ * force : l'action en focus ressort, les autres s'estompent, et toutes
580
+ * sont pleines quand aucune n'est en focus.
581
+ */
582
+ private buildStackDetachedBubbles;
583
+ /**
584
+ * RECHERCHE multi-blocs (panneau verrouillé) : l'action active garde ses
585
+ * champs de force pendant qu'on consulte un autre satellite — sa bulle
586
+ * reste donc visible sur la source, que le menu radial ne montre plus.
587
+ */
588
+ private buildRechercheDetachedBubbles;
493
589
  /** Sélectionne (ouvre) le satellite `childKey` de la facette courante,
494
590
  * comme un clic dessus — sans toggle-close s'il est déjà actif. */
495
591
  private selectSatelliteByKey;
496
- onCoreEventNucleusClicked(): void;
497
592
  searchNavigateToKeyEvent(keyEventId: string): void;
498
593
  restoreKeyEventDiagramState(keyEventId: string): void;
499
594
  searchSetKeyEventMenuOpen(componentIndex: number, open: boolean): void;
@@ -554,7 +649,7 @@ export declare class YinYangController implements IYinYangController {
554
649
  /**
555
650
  * Mode adverse (outil de debug, voir adverseMode.ts) : les actions et
556
651
  * Événements adverses remplacent les ordinaires sur le diagramme (bulles
557
- * des satellites, menu cœur) et dans l'arbre RECHERCHE — qui se
652
+ * des satellites et des satellites-facettes) et dans l'arbre RECHERCHE — qui se
558
653
  * reconstruit seul à la bascule. La pile n'est jamais filtrée.
559
654
  *
560
655
  * Hors STACK, l'action ou l'Événement en aperçu de l'autre bord perdrait
@@ -75,6 +75,8 @@ export declare class ActionStackController {
75
75
  * ActionStackState.addItem, sans muter la pile. null hors zone de dépôt.
76
76
  */
77
77
  getPriorIdsIfInsertedAtPreview(anchorItemId: string, insertedActionId: string): string[] | null;
78
+ /** Projection d'une insertion externe, sans mutation de la pile ni de l'historique. */
79
+ getItemsIfInsertedAtPreview(inserted: ActionStackItem): ActionStackItem[] | null;
78
80
  /** Fin du glisser (dépôt ou abandon). Les barres restent affichées ; un
79
81
  * dépôt consomme le guide, un abandon le garde pour un nouvel essai. */
80
82
  endPrereqDragGuide(dropped: boolean): void;
@@ -100,6 +102,15 @@ export declare class ActionStackController {
100
102
  */
101
103
  private _hitboxEmphasisStyle;
102
104
  private _applyHitboxEmphasisStyles;
105
+ /** Couleur du libellé d'un item — éclairci pour l'item en focus. */
106
+ private _stackLabelFill;
107
+ /**
108
+ * Marques propres à l'item en focus, indépendantes du cadre : liseré plein
109
+ * à sa couleur sur le bord gauche (pendant du border-left du bloc
110
+ * .ff-block--focused dans le panneau) et libellé éclairci en gras. Elles
111
+ * restent visibles quand le survol lié prend la main sur le cadre.
112
+ */
113
+ private _applyFocusMarks;
103
114
  /**
104
115
  * Affiche temporairement le highlight combo (cercles de fenêtre) pendant ~1.8 s.
105
116
  * Sans effet si un highlight permanent est déjà actif.
@@ -142,7 +153,7 @@ export declare class ActionStackController {
142
153
  * ActionStackState.addItemAtSlot. Même remise à zéro de l'aperçu de
143
154
  * glisser qu'addItem, pour la même raison (rendu synchrone dans
144
155
  * state.addItemAtSlot). */
145
- addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem;
156
+ addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem | null;
146
157
  syncActiveAction(sourceChildKey: string | null, actionId: string | null): void;
147
158
  setExternalDragActive(active: boolean): void;
148
159
  clearDropPreview(): void;
@@ -195,5 +206,9 @@ export declare class ActionStackController {
195
206
  copyRangeToClipboard(): void;
196
207
  /** Pastes the clipboard at the top of the currently active stack. */
197
208
  pasteClipboard(): void;
209
+ /** Fin de vie : observer déconnecté, minuterie du flash et écouteur
210
+ * clavier retirés. */
211
+ destroy(): void;
212
+ private keydownHandler;
198
213
  private ensureKeyboardListeners;
199
214
  }
@@ -83,6 +83,10 @@ export declare class ActionStackDragHandler {
83
83
  compactLength: number;
84
84
  }): void;
85
85
  clearDropPreview(): void;
86
+ /** Zone de dépôt relue à l'instant : un glisser venu du diagramme ou de
87
+ * RECHERCHE bascule en mode STACK, dont le panneau entre alors en glissant
88
+ * depuis la gauche — la géométrie du dernier rendu serait périmée. */
89
+ private liveDropZone;
86
90
  updateDropPreview(clientX: number, clientY: number, _localY: number): boolean;
87
91
  isDropZoneHit(clientX: number, clientY: number): boolean;
88
92
  getInsertionPreviewIndex(): number | null;
@@ -41,7 +41,7 @@ type ActionStackManagerDeps = {
41
41
  prepareForComponentSwitch: (targetComponentId: string) => void;
42
42
  animateChildrenHide: () => void;
43
43
  recomputeIncomingForceFieldForItems: (items: ActionStackItem[], sourceComponentId: string, currentComponentId: string) => boolean;
44
- buildProjectionActionsFromStackItems: (items: ActionStackItem[]) => SequentialActionProjectionInput[];
44
+ buildProjectionActionsFromStackItems: (items: ActionStackItem[], eventContextItems?: ActionStackItem[]) => SequentialActionProjectionInput[];
45
45
  buildForceFieldSourceIndicesFromStackItems: (items: ActionStackItem[]) => number[];
46
46
  clearProjectedActionState: (options?: {
47
47
  deselect?: boolean;
@@ -119,7 +119,18 @@ export declare class ActionStackManager {
119
119
  * ODD, métadonnées de son cutting. Null si le satellite est inconnu. */
120
120
  private buildActionStackItem;
121
121
  activateActionFromChild(childController: IYinYangController, actionId?: string, label?: string, clearStack?: boolean): void;
122
- applyProjectedGhostFromStackItems(items: ActionStackItem[]): void;
122
+ private panelsRefreshFrameId;
123
+ /** Rend, à la frame suivante, les panneaux dépendants de l'action active :
124
+ * détails du ghost, deltas des satellites, puis le menu radial en dernier
125
+ * (il rebranche ses closures de clic sur l'activeActionId posé par
126
+ * l'activation, voir refreshChildActionMenu). Plusieurs activations dans la
127
+ * même frame se fondent en un seul rendu. Si l'action n'est plus active à
128
+ * l'échéance (désactivée, ou remplacée), le flux qui l'a remplacée a rendu
129
+ * son propre état : rien à faire. */
130
+ /** Fin de vie : annule le rendu différé des panneaux. */
131
+ destroy(): void;
132
+ private schedulePanelsRefresh;
133
+ applyProjectedGhostFromStackItems(items: ActionStackItem[], eventContextItems?: ActionStackItem[]): void;
123
134
  onStackItemVisibilityToggle(activeItems: ActionStackItem[]): void;
124
135
  private updateProjectedGhostTensions;
125
136
  private applyEmptyGhostProjectionState;
@@ -2,8 +2,7 @@ export type ActionStackItem = {
2
2
  id: string;
3
3
  /**
4
4
  * Nature de l'item — "action" (par défaut) pour une action satellite
5
- * classique, "keyEvent" pour un Événement Clé joué depuis le cercle
6
- * central d'une facette. Un keyEvent n'a pas de satellite cible (les
5
+ * classique, "keyEvent" pour un Événement Clé joué depuis le satellite-facette. Un keyEvent n'a pas de satellite cible (les
7
6
  * champs source* ci-dessous sont des sentinels dans ce cas) ni de delta
8
7
  * propre (effectiveDelta reste 0) — son seul effet est d'amplifier les
9
8
  * actions listées dans sa définition, si elles sont jouées après lui
@@ -31,6 +30,7 @@ export type ActionStackItem = {
31
30
  comboResults?: import("../../../data/combo-engine").ComboResult[];
32
31
  /** Index du slot occupé dans la pile (0 = en bas, croissant vers le haut). */
33
32
  slotIndex: number;
33
+ unrecognized?: boolean;
34
34
  };
35
35
  /** Champs persistants d'un item copié — sans id/validatedAt/slotIndex, qui sont
36
36
  * réattribués à l'insertion (dans la même pile ou une autre, via un bookmark). */
@@ -61,6 +61,7 @@ export type ActionStackSnapshot = StackState & {
61
61
  export declare class ActionStackState {
62
62
  private readonly onActiveItemsChange;
63
63
  private readonly onClear?;
64
+ private readonly isKnownItem?;
64
65
  readonly ACTION_STACK_MAX_ITEMS = 30;
65
66
  readonly HISTORY_LIMIT = 120;
66
67
  readonly CONFIG_BOOKMARKS_MAX = 4;
@@ -76,7 +77,7 @@ export declare class ActionStackState {
76
77
  stackClipboard: StackClipboardEntry[] | null;
77
78
  configBookmarks: ConfigBookmark[];
78
79
  activeBookmarkIndex: number;
79
- constructor(onActiveItemsChange: (activeItems: ActionStackItem[]) => void, onClear?: (() => void) | undefined);
80
+ constructor(onActiveItemsChange: (activeItems: ActionStackItem[]) => void, onClear?: (() => void) | undefined, isKnownItem?: ((item: ActionStackItem) => boolean) | undefined);
80
81
  canUndo(): boolean;
81
82
  canRedo(): boolean;
82
83
  getItemById(id: string): ActionStackItem | undefined;
@@ -106,7 +107,7 @@ export declare class ActionStackState {
106
107
  * @param compactLength Current number of visible slots (from render context).
107
108
  * Null when called without a specific insertion index.
108
109
  */
109
- addItem(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, insertAtVisibleIndex: number | null, compactLength: number | null): ActionStackItem;
110
+ addItem(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, insertAtVisibleIndex: number | null, compactLength: number | null): ActionStackItem | null;
110
111
  /**
111
112
  * Insère à un slot ABSOLU (0 = bas de pile), en décalant d'un cran tout
112
113
  * item situé à ce slot ou au-dessus — inconditionnellement, même si le
@@ -115,8 +116,10 @@ export declare class ActionStackState {
115
116
  * insertion. addItem, lui, n'a pas cette garantie (il ne décale qu'en
116
117
  * présence d'un occupant, et raisonne en index visible).
117
118
  */
118
- addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem;
119
+ addItemAtSlot(item: Omit<ActionStackItem, "id" | "validatedAt" | "slotIndex">, slotIndex: number): ActionStackItem | null;
119
120
  private pushItemAtSlot;
121
+ /** Unicité par carte sur toute la STAC, y compris les items décochés. */
122
+ private hasKeyEvent;
120
123
  removeItem(itemId: string): void;
121
124
  clearAll(): void;
122
125
  deselectAllItems(): void;
@@ -45,9 +45,11 @@ export declare class StackFocusController {
45
45
  setStackItemEmphasisPreview(stackItemId: string | null): void;
46
46
  /**
47
47
  * Point d'accroche unique de la mise en valeur du satellite source de
48
- * l'action portant l'emphase (aperçu ?? focus). Réutilise pour l'instant
49
- * le glow de highlightOddByStackItemId (ou le segment de bordure si la
50
- * source est dans une autre facette) — l'anneau animé viendra ici.
48
+ * l'action portant l'emphase (aperçu ?? focus) : pour l'action en focus,
49
+ * la même mise en lumière que le satellite sélectionné en RECHERCHE
50
+ * (anneaux de visée, pings, onde de scan) ; pour un simple aperçu au
51
+ * survol, le glow doux. Segment de bordure si la source est dans une
52
+ * autre facette.
51
53
  * `clearIfNone` : sans emphase, efface la mise en valeur (sorties de
52
54
  * survol, défocus) ; false pour les simples re-applications (satellites
53
55
  * recréés, fin d'un survol de satellite) afin de ne pas écraser d'autres
@@ -89,10 +91,9 @@ export declare class StackFocusController {
89
91
  sourceIndex: number;
90
92
  } | null;
91
93
  /**
92
- * Point de départ « bulle » du champ de force de l'action en focus : la
93
- * bulle de son action dans le menu radial si le satellite source est celui
94
- * sélectionné, sinon la bulle détachée posée sur la source. null si
95
- * aucune bulle n'est visible (le champ démarre alors au satellite).
94
+ * Point de départ « bulle » du champ de force de l'action en focus : sa
95
+ * bulle détachée, posée sur le satellite source. null si aucune bulle
96
+ * n'est visible (le champ démarre alors au satellite).
96
97
  */
97
98
  resolveFocusBubbleStub(): {
98
99
  sourceChildIndex: number;
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Habillage ambre de la pile (mode STACK) — pendant SVG des variables
3
+ * --stack-* de layout.css. Ne couvre que le décor (bordures, en-tête,
4
+ * boutons, frise temporelle) : les couleurs porteuses d'état (configurations
5
+ * A/B/C/D, placeholder de dépôt, phases, items actifs) restent les leurs.
6
+ */
7
+ export declare const STACK_CHROME: {
8
+ readonly line: "#3a2f1e";
9
+ readonly headerText: "#e8c07a";
10
+ readonly buttonStroke: "#6a5028";
11
+ readonly buttonIcon: "#e8c07a";
12
+ readonly ghostSlotDots: "rgba(130, 98, 48, 0.55)";
13
+ readonly ghostSlotNumber: "rgba(120, 90, 45, 0.50)";
14
+ readonly timelineBandFill: "rgba(232, 168, 64, 0.06)";
15
+ readonly timelineBandStroke: "rgba(232, 168, 64, 0.18)";
16
+ readonly timelineAxis: "rgba(232, 168, 64, 0.50)";
17
+ readonly timelineArrow: "rgba(232, 168, 64, 0.65)";
18
+ readonly timelineTickOccupied: "rgba(240, 195, 110, 0.75)";
19
+ readonly timelineTick: "rgba(232, 168, 64, 0.40)";
20
+ };
@@ -1,5 +1,7 @@
1
+ import type { KeyEventPropagationContext } from "../../../data/key-event-propagation";
1
2
  import { YinYangInternalModel } from "../../../interfaces/IYinYangInternalModel";
2
3
  import { type PropagatedActionEdge, type PropagationTruncation } from "../../../utils/actionPropagation";
4
+ import { type StabilityProtection, type ProtectedSign, type DirectionalShield } from "../../../data/stability-shield";
3
5
  import { ForceFieldLink } from "../force-field/types";
4
6
  export type ProjectedCuttingState = {
5
7
  cuttingId: number;
@@ -15,6 +17,7 @@ export type GhostProjectionResult = {
15
17
  projectedGhostCuttingStatesByOddId: Map<string, ProjectedCuttingState[]>;
16
18
  };
17
19
  export type SequentialActionProjectionInput = {
20
+ eventPropagation?: KeyEventPropagationContext;
18
21
  sourceOddId: string;
19
22
  sourceCuttingIndex: number;
20
23
  /** Bouclier de stabilité (points d'état) que cette action crée sur son
@@ -23,6 +26,7 @@ export type SequentialActionProjectionInput = {
23
26
  * résolutions suivantes de la séquence, jamais consommé ; le plus fort
24
27
  * remplace le précédent sur un même satellite. */
25
28
  shield?: number;
29
+ protectedSign?: ProtectedSign;
26
30
  };
27
31
  export type EmptyGhostProjectionState = {
28
32
  projectedGhostTensionByOddId: null;
@@ -45,6 +49,7 @@ export type ShieldAbsorption = {
45
49
  shield: number;
46
50
  aggregated: number;
47
51
  applied: number;
52
+ protectedSign?: ProtectedSign;
48
53
  };
49
54
  /**
50
55
  * Bouclier de stabilité sur UNE résolution : pour chaque satellite protégé,
@@ -53,11 +58,16 @@ export type ShieldAbsorption = {
53
58
  * total une seule fois — jamais chaque contribution séparément, jamais
54
59
  * au-delà de 0. Mute `projectedStates` et rend les réductions appliquées.
55
60
  */
56
- export declare function applyStabilityShieldsToResolution(startStates: Record<string, Record<number, number>>, projectedStates: Record<string, Record<number, number>>, activeShields: Map<string, Map<number, number>>): ShieldAbsorption[];
61
+ export type SignedResolutionContributions = Record<string, Record<number, {
62
+ positive: number;
63
+ negative: number;
64
+ }>>;
65
+ export declare function applyStabilityShieldsToResolution(startStates: Record<string, Record<number, number>>, projectedStates: Record<string, Record<number, number>>, activeShields: Map<string, Map<number, StabilityProtection>>, contributions?: SignedResolutionContributions): ShieldAbsorption[];
57
66
  export type ActionSequenceStepInfo = {
58
67
  actionIndex: number;
59
68
  action: SequentialActionProjectionInput;
60
69
  effectiveDelta: number;
70
+ createdProtection?: DirectionalShield;
61
71
  /** Boucliers ayant réduit une contribution négative de cette étape — vide
62
72
  * si aucun satellite protégé n'a été touché négativement. */
63
73
  shieldAbsorptions: ShieldAbsorption[];
@@ -97,6 +107,7 @@ export declare function projectGhostStateForComponent(params: {
97
107
  sourceOddId: string | undefined;
98
108
  sourceCuttingIndex: number;
99
109
  actionDelta: number;
110
+ eventPropagation?: KeyEventPropagationContext;
100
111
  }): GhostProjectionResult | null;
101
112
  /** Tension projetée de la facette : même règle que sa tension courante
102
113
  * (`facetTensionFromOdds`, moyenne pondérée sur tous ses satellites), sur