@flighthq/gui 0.5.1-next.658.9cb44d7 → 0.5.1-next.685.f72fc7f

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/README.md CHANGED
@@ -13,5 +13,5 @@ Import the supported application-facing API from `@flighthq/gui`. The `@flighthq
13
13
  This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
14
14
 
15
15
  - [Flight project](https://github.com/flighthq/flight)
16
- - [Source for @flighthq/gui@0.5.1-next.658.9cb44d7](https://github.com/flighthq/flight/tree/9cb44d76b981adad2503d5e62207be99adb35c55/packages/gui)
17
- - [License](https://github.com/flighthq/flight/blob/9cb44d76b981adad2503d5e62207be99adb35c55/LICENSE.md)
16
+ - [Source for @flighthq/gui@0.5.1-next.685.f72fc7f](https://github.com/flighthq/flight/tree/f72fc7feaa9653d950f39c7d2fe6365f48e82e51/packages/gui)
17
+ - [License](https://github.com/flighthq/flight/blob/f72fc7feaa9653d950f39c7d2fe6365f48e82e51/LICENSE.md)
@@ -1 +1 @@
1
- {"version":3,"file":"buttonController.d.ts","sourceRoot":"","sources":["../src/buttonController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EAExB,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAgDnG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAO1E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAE1G;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAEhF;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAMjG"}
1
+ {"version":3,"file":"buttonController.d.ts","sourceRoot":"","sources":["../src/buttonController.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EAGxB,MAAM,0BAA0B,CAAC;AAuBlC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAiDnG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAS1E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAE1G;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAEhF;AAED,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI,CAMjG"}
@@ -1,9 +1,11 @@
1
+ import { applyNodeInteractiveStates, disposeNodeInteractiveStateBinding } from '@flighthq/interaction/contract';
1
2
  import { createSignal, emitSignal } from '@flighthq/signals/contract';
2
3
  import { configureGuiHitArea, connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, } from './guiController';
3
4
  export function createButtonController(options) {
4
5
  const runtime = createGuiControllerRuntime({
5
6
  disabled: options.disabled ?? false,
6
7
  downState: options.downState ?? null,
8
+ interactiveStateBinding: options.interactiveStateBinding ?? null,
7
9
  over: false,
8
10
  overState: options.overState ?? null,
9
11
  pressed: false,
@@ -53,7 +55,10 @@ export function createButtonController(options) {
53
55
  export function disposeButtonController(controller) {
54
56
  const runtime = getGuiControllerRuntime(controller);
55
57
  disposeGuiController(controller, () => {
58
+ if (runtime.interactiveStateBinding !== null)
59
+ disposeNodeInteractiveStateBinding(runtime.interactiveStateBinding);
56
60
  runtime.downState = null;
61
+ runtime.interactiveStateBinding = null;
57
62
  runtime.overState = null;
58
63
  runtime.upState = null;
59
64
  });
@@ -79,5 +84,12 @@ function updateButtonControllerVisuals(runtime) {
79
84
  setGuiVisible(runtime, runtime.upState, !down && !over);
80
85
  setGuiVisible(runtime, runtime.overState, over);
81
86
  setGuiVisible(runtime, runtime.downState, down);
87
+ if (runtime.interactiveStateBinding !== null) {
88
+ applyNodeInteractiveStates(runtime.interactiveStateBinding, {
89
+ disabled: runtime.disabled,
90
+ hovered: runtime.over,
91
+ pressed: runtime.pressed,
92
+ });
93
+ }
82
94
  }
83
95
  //# sourceMappingURL=buttonController.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"buttonController.js","sourceRoot":"","sources":["../src/buttonController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAQtE,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,aAAa,GACd,MAAM,iBAAiB,CAAC;AAYzB,MAAM,UAAU,sBAAsB,CAAC,OAA0C;IAC/E,MAAM,OAAO,GAAG,0BAA0B,CACxC;QACE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,KAAK;QACnC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI;QACpC,OAAO,EAAE,KAAK;QACd,OAAO,EAAE;YACP,OAAO,EAAE,YAAY,EAAE;YACvB,OAAO,EAAE,YAAY,EAAE;YACvB,SAAS,EAAE,YAAY,EAAE;SAC1B;QACD,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,EACD,OAAO,CAAC,UAAU,CACnB,CAAC;IACF,MAAM,UAAU,GAAG,mBAAmB,CAAmC,OAAO,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAC/B,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;QAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzF,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE;QAC3D,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;QACpB,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,EAAE;QAC1D,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;QACrB,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IACH,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE;QAC3D,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO;QAC7B,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;QACvB,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACvC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,GAAG,EAAE;QACnB,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO;QAC7B,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QACxB,6BAA6B,CAAC,OAAO,CAAC,CAAC;QACvC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC,CAAC;IACF,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/D,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC;IACnE,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IACpE,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE;QACrD,IAAI,CAAC,OAAO,CAAC,QAAQ;YAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IACH,6BAA6B,CAAC,OAAO,CAAC,CAAC;IACvC,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAA4B;IAClE,MAAM,OAAO,GAAG,uBAAuB,CAAyB,UAAU,CAAC,CAAC;IAC5E,oBAAoB,CAAC,UAAU,EAAE,GAAG,EAAE;QACpC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;QACzB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAA4B;IACrE,OAAO,uBAAuB,CAAyB,UAAU,CAAC,CAAC,OAAO,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,UAA4B;IACrE,OAAO,uBAAuB,CAAyB,UAAU,CAAC,CAAC,QAAQ,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,UAA4B,EAAE,QAAiB;IACzF,MAAM,OAAO,GAAG,uBAAuB,CAAyB,UAAU,CAAC,CAAC;IAC5E,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO;IAC1C,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,IAAI,QAAQ;QAAE,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;IACtC,6BAA6B,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,6BAA6B,CACpC,OAA2E;IAE3E,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;IAChF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,CAAC;IACtF,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChD,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"buttonController.js","sourceRoot":"","sources":["../src/buttonController.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export * from './buttonController';
2
2
  export * from './comboBoxController';
3
+ export * from './guiDialog';
3
4
  export { createListController, disposeListController, getListControllerSelectedIndex, getListControllerSignals, setListControllerSelectedIndex, } from './listController';
4
5
  export * from './progressBarController';
5
6
  export * from './radioGroupController';
@@ -1 +1 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
package/dist/contract.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './buttonController';
2
2
  export * from './comboBoxController';
3
+ export * from './guiDialog';
3
4
  export { createListController, disposeListController, getListControllerSelectedIndex, getListControllerSignals, setListControllerSelectedIndex, } from './listController';
4
5
  export * from './progressBarController';
5
6
  export * from './radioGroupController';
@@ -1 +1 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,8BAA8B,EAC9B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { GuiDialog, GuiDialogCloseResult, GuiDialogEntry, GuiDialogOptions, GuiDialogSignals } from '@flighthq/types/contract';
2
+ export declare function closeGuiDialog(dialog: GuiDialog, result: Readonly<GuiDialogCloseResult>): boolean;
3
+ export declare function createGuiDialog(options?: Readonly<GuiDialogOptions>): GuiDialog;
4
+ export declare function disposeGuiDialog(dialog: GuiDialog): void;
5
+ export declare function enqueueGuiDialog(dialog: GuiDialog, entry: Readonly<GuiDialogEntry>): boolean;
6
+ export declare function getActiveGuiDialogEntry(dialog: GuiDialog): Readonly<GuiDialogEntry> | null;
7
+ export declare function getGuiDialogEntries(dialog: GuiDialog, out?: Array<Readonly<GuiDialogEntry>>): Array<Readonly<GuiDialogEntry>>;
8
+ export declare function getGuiDialogSignals(dialog: GuiDialog): Readonly<GuiDialogSignals>;
9
+ export declare function removeGuiDialogEntry(dialog: GuiDialog, id: string): boolean;
10
+ //# sourceMappingURL=guiDialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guiDialog.d.ts","sourceRoot":"","sources":["../src/guiDialog.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,SAAS,EACT,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAEjB,MAAM,0BAA0B,CAAC;AAoBlC,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAkBjG;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,QAAQ,CAAC,gBAAgB,CAAM,GAAG,SAAS,CA0BnF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYxD;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,OAAO,CAe5F;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,IAAI,CAE1F;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,GAAG,GAAE,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAM,GACxC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAKjC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,CAEjF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAS3E"}
@@ -0,0 +1,124 @@
1
+ import { getFocusedNode, setFocusedNode } from '@flighthq/interaction/contract';
2
+ import { createSignal, emitSignal } from '@flighthq/signals/contract';
3
+ import { connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, } from './guiController';
4
+ export function closeGuiDialog(dialog, result) {
5
+ const runtime = getGuiControllerRuntime(dialog);
6
+ const active = runtime.entries[0];
7
+ if (runtime.disposed || active === undefined || active.id !== result.entryId)
8
+ return false;
9
+ runtime.entries.shift();
10
+ setGuiVisible(runtime, active.root, false);
11
+ const next = runtime.entries[0] ?? null;
12
+ if (next === null) {
13
+ setGuiVisible(runtime, runtime.backdrop, false);
14
+ restoreGuiDialogFocus(runtime);
15
+ }
16
+ else {
17
+ activateGuiDialogEntry(runtime, next);
18
+ }
19
+ emitSignal(runtime.signals.onActiveChange, next);
20
+ emitSignal(runtime.signals.onQueueChange);
21
+ emitSignal(runtime.signals.onClose, result);
22
+ return true;
23
+ }
24
+ export function createGuiDialog(options = {}) {
25
+ const runtime = createGuiControllerRuntime({
26
+ backdrop: options.backdrop ?? null,
27
+ entries: [],
28
+ focusManager: options.focusManager ?? null,
29
+ hasFocusSnapshot: false,
30
+ previousFocus: null,
31
+ signals: {
32
+ onActiveChange: createSignal(),
33
+ onClose: createSignal(),
34
+ onQueueChange: createSignal(),
35
+ },
36
+ }, options.transition);
37
+ const dialog = createGuiController(runtime);
38
+ if (runtime.backdrop !== null) {
39
+ connectGuiInteraction(runtime, runtime.backdrop, 'onClick', () => {
40
+ const active = runtime.entries[0];
41
+ if (active?.dismissOnBackdrop !== true)
42
+ return;
43
+ closeGuiDialog(dialog, { entryId: active.id, reason: 'dismissed' });
44
+ });
45
+ }
46
+ setGuiVisible(runtime, runtime.backdrop, false);
47
+ return dialog;
48
+ }
49
+ export function disposeGuiDialog(dialog) {
50
+ const runtime = getGuiControllerRuntime(dialog);
51
+ if (runtime.disposed)
52
+ return;
53
+ for (const entry of runtime.entries)
54
+ setGuiVisible(runtime, entry.root, false);
55
+ setGuiVisible(runtime, runtime.backdrop, false);
56
+ restoreGuiDialogFocus(runtime);
57
+ disposeGuiController(dialog, () => {
58
+ runtime.backdrop = null;
59
+ runtime.entries.length = 0;
60
+ runtime.focusManager = null;
61
+ runtime.previousFocus = null;
62
+ });
63
+ }
64
+ export function enqueueGuiDialog(dialog, entry) {
65
+ const runtime = getGuiControllerRuntime(dialog);
66
+ if (runtime.disposed || runtime.entries.some((candidate) => candidate.id === entry.id))
67
+ return false;
68
+ const activate = runtime.entries.length === 0;
69
+ runtime.entries.push(entry);
70
+ if (activate) {
71
+ snapshotGuiDialogFocus(runtime);
72
+ activateGuiDialogEntry(runtime, entry);
73
+ emitSignal(runtime.signals.onActiveChange, entry);
74
+ }
75
+ else {
76
+ setGuiVisible(runtime, entry.root, false);
77
+ }
78
+ emitSignal(runtime.signals.onQueueChange);
79
+ return true;
80
+ }
81
+ export function getActiveGuiDialogEntry(dialog) {
82
+ return getGuiControllerRuntime(dialog).entries[0] ?? null;
83
+ }
84
+ export function getGuiDialogEntries(dialog, out = []) {
85
+ const entries = getGuiControllerRuntime(dialog).entries;
86
+ out.length = 0;
87
+ out.push(...entries);
88
+ return out;
89
+ }
90
+ export function getGuiDialogSignals(dialog) {
91
+ return getGuiControllerRuntime(dialog).signals;
92
+ }
93
+ export function removeGuiDialogEntry(dialog, id) {
94
+ const runtime = getGuiControllerRuntime(dialog);
95
+ if (runtime.disposed)
96
+ return false;
97
+ const index = runtime.entries.findIndex((entry, entryIndex) => entryIndex > 0 && entry.id === id);
98
+ if (index < 0)
99
+ return false;
100
+ const [removed] = runtime.entries.splice(index, 1);
101
+ setGuiVisible(runtime, removed.root, false);
102
+ emitSignal(runtime.signals.onQueueChange);
103
+ return true;
104
+ }
105
+ function activateGuiDialogEntry(runtime, entry) {
106
+ setGuiVisible(runtime, entry.root, true);
107
+ setGuiVisible(runtime, runtime.backdrop, true);
108
+ if (runtime.focusManager !== null && entry.initialFocus !== undefined)
109
+ setFocusedNode(runtime.focusManager, entry.initialFocus);
110
+ }
111
+ function restoreGuiDialogFocus(runtime) {
112
+ if (!runtime.hasFocusSnapshot || runtime.focusManager === null)
113
+ return;
114
+ setFocusedNode(runtime.focusManager, runtime.previousFocus);
115
+ runtime.hasFocusSnapshot = false;
116
+ runtime.previousFocus = null;
117
+ }
118
+ function snapshotGuiDialogFocus(runtime) {
119
+ if (runtime.focusManager === null)
120
+ return;
121
+ runtime.previousFocus = getFocusedNode(runtime.focusManager);
122
+ runtime.hasFocusSnapshot = true;
123
+ }
124
+ //# sourceMappingURL=guiDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guiDialog.js","sourceRoot":"","sources":["../src/guiDialog.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export { blurTextInputController, createButtonController, createComboBoxController, createListController, createProgressBarController, createRadioGroupController, createScrollBarController, createScrollViewController, createSliderController, createSplitPaneController, createTabBarController, createTextInputController, createToggleController, createTooltipController, createTreeViewController, createWindowController, dispatchTextInputControllerKeyDown, dispatchTextInputControllerText, disposeButtonController, disposeComboBoxController, disposeListController, disposeProgressBarController, disposeRadioGroupController, disposeScrollBarController, disposeScrollViewController, disposeSliderController, disposeSplitPaneController, disposeTabBarController, disposeTextInputController, disposeToggleController, disposeTooltipController, disposeTreeViewController, disposeWindowController, focusTextInputController, getButtonControllerSignals, getComboBoxControllerSignals, getListControllerSelectedIndex, getListControllerSignals, getProgressBarControllerValue, getRadioGroupControllerSelectedIndex, getRadioGroupControllerSignals, getScrollBarControllerSignals, getScrollBarControllerValue, getScrollViewControllerSignals, getScrollViewControllerX, getScrollViewControllerY, getSliderControllerSignals, getSliderControllerValue, getSplitPaneControllerPosition, getSplitPaneControllerSignals, getTabBarControllerSelectedIndex, getTabBarControllerSignals, getTextInputControllerSignals, getToggleControllerSignals, getTreeViewControllerSelectedItem, getTreeViewControllerSignals, getWindowControllerSignals, hideTooltipController, isButtonControllerDisabled, isComboBoxControllerOpen, isToggleControllerChecked, isTreeViewControllerItemExpanded, setButtonControllerDisabled, setComboBoxControllerOpen, setListControllerSelectedIndex, setProgressBarControllerValue, setRadioGroupControllerSelectedIndex, setScrollBarControllerValue, setScrollViewControllerPosition, setSliderControllerValue, setSplitPaneControllerPosition, setTabBarControllerSelectedIndex, setToggleControllerChecked, setTreeViewControllerItemExpanded, setTreeViewControllerSelectedItem, setWindowControllerPosition, setWindowControllerSize, showTooltipController, toggleTreeViewControllerItem, } from './contract';
1
+ export { blurTextInputController, closeGuiDialog, createButtonController, createComboBoxController, createGuiDialog, createListController, createProgressBarController, createRadioGroupController, createScrollBarController, createScrollViewController, createSliderController, createSplitPaneController, createTabBarController, createTextInputController, createToggleController, createTooltipController, createTreeViewController, createWindowController, dispatchTextInputControllerKeyDown, dispatchTextInputControllerText, disposeButtonController, disposeComboBoxController, disposeGuiDialog, disposeListController, disposeProgressBarController, disposeRadioGroupController, disposeScrollBarController, disposeScrollViewController, disposeSliderController, disposeSplitPaneController, disposeTabBarController, disposeTextInputController, disposeToggleController, disposeTooltipController, disposeTreeViewController, disposeWindowController, enqueueGuiDialog, focusTextInputController, getActiveGuiDialogEntry, getButtonControllerSignals, getComboBoxControllerSignals, getGuiDialogEntries, getGuiDialogSignals, getListControllerSelectedIndex, getListControllerSignals, getProgressBarControllerValue, getRadioGroupControllerSelectedIndex, getRadioGroupControllerSignals, getScrollBarControllerSignals, getScrollBarControllerValue, getScrollViewControllerSignals, getScrollViewControllerX, getScrollViewControllerY, getSliderControllerSignals, getSliderControllerValue, getSplitPaneControllerPosition, getSplitPaneControllerSignals, getTabBarControllerSelectedIndex, getTabBarControllerSignals, getTextInputControllerSignals, getToggleControllerSignals, getTreeViewControllerSelectedItem, getTreeViewControllerSignals, getWindowControllerSignals, hideTooltipController, isButtonControllerDisabled, isComboBoxControllerOpen, isToggleControllerChecked, isTreeViewControllerItemExpanded, removeGuiDialogEntry, setButtonControllerDisabled, setComboBoxControllerOpen, setListControllerSelectedIndex, setProgressBarControllerValue, setRadioGroupControllerSelectedIndex, setScrollBarControllerValue, setScrollViewControllerPosition, setSliderControllerValue, setSplitPaneControllerPosition, setTabBarControllerSelectedIndex, setToggleControllerChecked, setTreeViewControllerItemExpanded, setTreeViewControllerSelectedItem, setWindowControllerPosition, setWindowControllerSize, showTooltipController, toggleTreeViewControllerItem, } from './contract';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,kCAAkC,EAClC,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,EAC7B,oCAAoC,EACpC,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,0BAA0B,EAC1B,iCAAiC,EACjC,iCAAiC,EACjC,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,kCAAkC,EAClC,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,EAC7B,oCAAoC,EACpC,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,0BAA0B,EAC1B,iCAAiC,EACjC,iCAAiC,EACjC,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { blurTextInputController, createButtonController, createComboBoxController, createListController, createProgressBarController, createRadioGroupController, createScrollBarController, createScrollViewController, createSliderController, createSplitPaneController, createTabBarController, createTextInputController, createToggleController, createTooltipController, createTreeViewController, createWindowController, dispatchTextInputControllerKeyDown, dispatchTextInputControllerText, disposeButtonController, disposeComboBoxController, disposeListController, disposeProgressBarController, disposeRadioGroupController, disposeScrollBarController, disposeScrollViewController, disposeSliderController, disposeSplitPaneController, disposeTabBarController, disposeTextInputController, disposeToggleController, disposeTooltipController, disposeTreeViewController, disposeWindowController, focusTextInputController, getButtonControllerSignals, getComboBoxControllerSignals, getListControllerSelectedIndex, getListControllerSignals, getProgressBarControllerValue, getRadioGroupControllerSelectedIndex, getRadioGroupControllerSignals, getScrollBarControllerSignals, getScrollBarControllerValue, getScrollViewControllerSignals, getScrollViewControllerX, getScrollViewControllerY, getSliderControllerSignals, getSliderControllerValue, getSplitPaneControllerPosition, getSplitPaneControllerSignals, getTabBarControllerSelectedIndex, getTabBarControllerSignals, getTextInputControllerSignals, getToggleControllerSignals, getTreeViewControllerSelectedItem, getTreeViewControllerSignals, getWindowControllerSignals, hideTooltipController, isButtonControllerDisabled, isComboBoxControllerOpen, isToggleControllerChecked, isTreeViewControllerItemExpanded, setButtonControllerDisabled, setComboBoxControllerOpen, setListControllerSelectedIndex, setProgressBarControllerValue, setRadioGroupControllerSelectedIndex, setScrollBarControllerValue, setScrollViewControllerPosition, setSliderControllerValue, setSplitPaneControllerPosition, setTabBarControllerSelectedIndex, setToggleControllerChecked, setTreeViewControllerItemExpanded, setTreeViewControllerSelectedItem, setWindowControllerPosition, setWindowControllerSize, showTooltipController, toggleTreeViewControllerItem, } from './contract';
1
+ export { blurTextInputController, closeGuiDialog, createButtonController, createComboBoxController, createGuiDialog, createListController, createProgressBarController, createRadioGroupController, createScrollBarController, createScrollViewController, createSliderController, createSplitPaneController, createTabBarController, createTextInputController, createToggleController, createTooltipController, createTreeViewController, createWindowController, dispatchTextInputControllerKeyDown, dispatchTextInputControllerText, disposeButtonController, disposeComboBoxController, disposeGuiDialog, disposeListController, disposeProgressBarController, disposeRadioGroupController, disposeScrollBarController, disposeScrollViewController, disposeSliderController, disposeSplitPaneController, disposeTabBarController, disposeTextInputController, disposeToggleController, disposeTooltipController, disposeTreeViewController, disposeWindowController, enqueueGuiDialog, focusTextInputController, getActiveGuiDialogEntry, getButtonControllerSignals, getComboBoxControllerSignals, getGuiDialogEntries, getGuiDialogSignals, getListControllerSelectedIndex, getListControllerSignals, getProgressBarControllerValue, getRadioGroupControllerSelectedIndex, getRadioGroupControllerSignals, getScrollBarControllerSignals, getScrollBarControllerValue, getScrollViewControllerSignals, getScrollViewControllerX, getScrollViewControllerY, getSliderControllerSignals, getSliderControllerValue, getSplitPaneControllerPosition, getSplitPaneControllerSignals, getTabBarControllerSelectedIndex, getTabBarControllerSignals, getTextInputControllerSignals, getToggleControllerSignals, getTreeViewControllerSelectedItem, getTreeViewControllerSignals, getWindowControllerSignals, hideTooltipController, isButtonControllerDisabled, isComboBoxControllerOpen, isToggleControllerChecked, isTreeViewControllerItemExpanded, removeGuiDialogEntry, setButtonControllerDisabled, setComboBoxControllerOpen, setListControllerSelectedIndex, setProgressBarControllerValue, setRadioGroupControllerSelectedIndex, setScrollBarControllerValue, setScrollViewControllerPosition, setSliderControllerValue, setSplitPaneControllerPosition, setTabBarControllerSelectedIndex, setToggleControllerChecked, setTreeViewControllerItemExpanded, setTreeViewControllerSelectedItem, setWindowControllerPosition, setWindowControllerSize, showTooltipController, toggleTreeViewControllerItem, } from './contract';
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,kCAAkC,EAClC,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,wBAAwB,EACxB,0BAA0B,EAC1B,4BAA4B,EAC5B,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,EAC7B,oCAAoC,EACpC,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,0BAA0B,EAC1B,iCAAiC,EACjC,iCAAiC,EACjC,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,cAAc,EACd,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,2BAA2B,EAC3B,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,EACxB,sBAAsB,EACtB,kCAAkC,EAClC,+BAA+B,EAC/B,uBAAuB,EACvB,yBAAyB,EACzB,gBAAgB,EAChB,qBAAqB,EACrB,4BAA4B,EAC5B,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,0BAA0B,EAC1B,uBAAuB,EACvB,wBAAwB,EACxB,yBAAyB,EACzB,uBAAuB,EACvB,gBAAgB,EAChB,wBAAwB,EACxB,uBAAuB,EACvB,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,EACnB,mBAAmB,EACnB,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,EAC7B,oCAAoC,EACpC,8BAA8B,EAC9B,6BAA6B,EAC7B,2BAA2B,EAC3B,8BAA8B,EAC9B,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,8BAA8B,EAC9B,6BAA6B,EAC7B,gCAAgC,EAChC,0BAA0B,EAC1B,6BAA6B,EAC7B,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,EAChC,oBAAoB,EACpB,2BAA2B,EAC3B,yBAAyB,EACzB,8BAA8B,EAC9B,6BAA6B,EAC7B,oCAAoC,EACpC,2BAA2B,EAC3B,+BAA+B,EAC/B,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAChC,0BAA0B,EAC1B,iCAAiC,EACjC,iCAAiC,EACjC,2BAA2B,EAC3B,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,YAAY,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flighthq/gui",
3
- "version": "0.5.1-next.658.9cb44d7",
3
+ "version": "0.5.1-next.685.f72fc7f",
4
4
  "author": "Joshua Granick and other contributors",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -38,12 +38,12 @@
38
38
  "clean:dist": "tsx ../../scripts/clean-package-dist.ts"
39
39
  },
40
40
  "dependencies": {
41
- "@flighthq/interaction": "0.5.1-next.658.9cb44d7",
42
- "@flighthq/node": "0.5.1-next.658.9cb44d7",
43
- "@flighthq/signals": "0.5.1-next.658.9cb44d7",
44
- "@flighthq/text": "0.5.1-next.658.9cb44d7",
45
- "@flighthq/textinput": "0.5.1-next.658.9cb44d7",
46
- "@flighthq/types": "0.5.1-next.658.9cb44d7"
41
+ "@flighthq/interaction": "0.5.1-next.685.f72fc7f",
42
+ "@flighthq/node": "0.5.1-next.685.f72fc7f",
43
+ "@flighthq/signals": "0.5.1-next.685.f72fc7f",
44
+ "@flighthq/text": "0.5.1-next.685.f72fc7f",
45
+ "@flighthq/textinput": "0.5.1-next.685.f72fc7f",
46
+ "@flighthq/types": "0.5.1-next.685.f72fc7f"
47
47
  },
48
48
  "devDependencies": {
49
49
  "typescript": "^5.3.0"
@@ -1,4 +1,6 @@
1
+ import { createNodeInteractiveStateBinding } from '@flighthq/interaction/contract';
1
2
  import { connectSignal } from '@flighthq/signals/contract';
3
+ import type { FlightDocumentSchemaRegistry } from '@flighthq/types/contract';
2
4
 
3
5
  import {
4
6
  createButtonController,
@@ -47,6 +49,33 @@ describe('createButtonController', () => {
47
49
  for (const apply of applies.splice(0)) apply();
48
50
  expect([up.visible, over.visible]).toEqual([false, true]);
49
51
  });
52
+
53
+ it('explicitly drives one shared interactive-state binding without replacing legacy visuals', () => {
54
+ const up = createGuiTestNode();
55
+ const binding = createNodeInteractiveStateBinding(
56
+ up,
57
+ {
58
+ disabled: { alpha: 0.4, extensions: [] },
59
+ hover: { alpha: 0.8, extensions: [] },
60
+ pressed: { extensions: [], scaleX: 0.9 },
61
+ },
62
+ createEmptySchemas(),
63
+ )!;
64
+ const controller = createButtonController({ interactiveStateBinding: binding, upState: up });
65
+
66
+ emitGuiPointer(up, 'onPointerOver');
67
+ expect(up.alpha).toBe(0.8);
68
+ emitGuiPointer(up, 'onPointerDown');
69
+ expect(up.scaleX).toBe(0.9);
70
+
71
+ setButtonControllerDisabled(controller, true);
72
+ expect(up.alpha).toBe(0.4);
73
+ expect(up.scaleX).toBe(1);
74
+
75
+ disposeButtonController(controller);
76
+ expect(up.alpha).toBe(1);
77
+ expect(up.scaleX).toBe(1);
78
+ });
50
79
  });
51
80
 
52
81
  describe('disposeButtonController', () => {
@@ -88,3 +117,14 @@ describe('setButtonControllerDisabled', () => {
88
117
  expect(clicks).toBe(0);
89
118
  });
90
119
  });
120
+
121
+ function createEmptySchemas(): FlightDocumentSchemaRegistry {
122
+ const table = (registry: string) => ({ entries: new Map(), onMiss: 'none', registry, shape: 'keyed' as const });
123
+ return {
124
+ interactiveStateExtensionSchemas: table('flight-document.interactive-state-extension'),
125
+ interactiveStateTransitionSchemas: table('flight-document.interactive-state-transition'),
126
+ nodeSchemas: table('flight-document.node'),
127
+ resourceSchemas: table('flight-document.resource'),
128
+ shapeCommandSchemas: table('flight-document.shape-command'),
129
+ };
130
+ }
@@ -0,0 +1,210 @@
1
+ import { createFocusManager, getFocusedNode, setFocusedNode, setNodeFocusable } from '@flighthq/interaction/contract';
2
+ import { getNodeParent } from '@flighthq/node/contract';
3
+ import { connectSignal } from '@flighthq/signals/contract';
4
+ import type { GuiDialogCloseResult } from '@flighthq/types/contract';
5
+
6
+ import {
7
+ closeGuiDialog,
8
+ createGuiDialog,
9
+ disposeGuiDialog,
10
+ enqueueGuiDialog,
11
+ getActiveGuiDialogEntry,
12
+ getGuiDialogEntries,
13
+ getGuiDialogSignals,
14
+ removeGuiDialogEntry,
15
+ } from './guiDialog';
16
+ import { createGuiTestNode, emitGuiPointer } from './guiTestHelper';
17
+
18
+ describe('closeGuiDialog', () => {
19
+ it('closes the active entry and promotes the FIFO head without reparenting caller visuals', () => {
20
+ const backdrop = createGuiTestNode();
21
+ const firstRoot = createGuiTestNode();
22
+ const secondRoot = createGuiTestNode();
23
+ const dialog = createGuiDialog({ backdrop });
24
+ const closed: GuiDialogCloseResult[] = [];
25
+ connectSignal(getGuiDialogSignals(dialog).onClose, (result) => closed.push(result));
26
+
27
+ enqueueGuiDialog(dialog, { id: 'first', root: firstRoot });
28
+ enqueueGuiDialog(dialog, { id: 'second', root: secondRoot });
29
+
30
+ expect([backdrop.visible, firstRoot.visible, secondRoot.visible]).toEqual([true, true, false]);
31
+ expect([getNodeParent(firstRoot), getNodeParent(secondRoot)]).toEqual([null, null]);
32
+
33
+ expect(closeGuiDialog(dialog, { entryId: 'first', reason: 'accepted', value: 7 })).toBe(true);
34
+ expect(getActiveGuiDialogEntry(dialog)?.id).toBe('second');
35
+ expect([backdrop.visible, firstRoot.visible, secondRoot.visible]).toEqual([true, false, true]);
36
+ expect(closed).toEqual([{ entryId: 'first', reason: 'accepted', value: 7 }]);
37
+ expect([getNodeParent(firstRoot), getNodeParent(secondRoot)]).toEqual([null, null]);
38
+ });
39
+
40
+ it('rejects a mismatched result and a reentrant duplicate close', () => {
41
+ const root = createGuiTestNode();
42
+ const dialog = createGuiDialog();
43
+ enqueueGuiDialog(dialog, { id: 'only', root });
44
+ const result: GuiDialogCloseResult = { entryId: 'only', reason: 'cancelled' };
45
+ const nested: boolean[] = [];
46
+ let closeCount = 0;
47
+ connectSignal(getGuiDialogSignals(dialog).onClose, () => {
48
+ closeCount++;
49
+ nested.push(closeGuiDialog(dialog, result));
50
+ });
51
+
52
+ expect(closeGuiDialog(dialog, { entryId: 'other', reason: 'cancelled' })).toBe(false);
53
+ expect(closeGuiDialog(dialog, result)).toBe(true);
54
+ expect([closeCount, nested]).toEqual([1, [false]]);
55
+ expect([root.visible, getActiveGuiDialogEntry(dialog)]).toEqual([false, null]);
56
+ });
57
+ });
58
+
59
+ describe('createGuiDialog', () => {
60
+ it('dismisses only an opted-in active entry from the supplied backdrop', () => {
61
+ const backdrop = createGuiTestNode();
62
+ const dialog = createGuiDialog({ backdrop });
63
+ const results: GuiDialogCloseResult[] = [];
64
+ connectSignal(getGuiDialogSignals(dialog).onClose, (result) => results.push(result));
65
+ enqueueGuiDialog(dialog, { id: 'fixed', root: createGuiTestNode() });
66
+ emitGuiPointer(backdrop, 'onClick');
67
+ expect(getActiveGuiDialogEntry(dialog)?.id).toBe('fixed');
68
+
69
+ closeGuiDialog(dialog, { entryId: 'fixed', reason: 'cancelled' });
70
+ enqueueGuiDialog(dialog, { dismissOnBackdrop: true, id: 'dismissible', root: createGuiTestNode() });
71
+ emitGuiPointer(backdrop, 'onClick');
72
+ expect(results).toEqual([
73
+ { entryId: 'fixed', reason: 'cancelled' },
74
+ { entryId: 'dismissible', reason: 'dismissed' },
75
+ ]);
76
+ });
77
+
78
+ it('writes visibility immediately by default and delegates only to an explicit transition adapter', () => {
79
+ const backdrop = createGuiTestNode();
80
+ const root = createGuiTestNode();
81
+ root.visible = false;
82
+ const requests: Array<{ target: unknown; value: unknown }> = [];
83
+ const dialog = createGuiDialog({
84
+ backdrop,
85
+ transition: {
86
+ run: (request) => {
87
+ requests.push({ target: request.target, value: request.value });
88
+ request.apply();
89
+ },
90
+ },
91
+ });
92
+ expect(backdrop.visible).toBe(false);
93
+ enqueueGuiDialog(dialog, { id: 'entry', root });
94
+ expect([backdrop.visible, root.visible]).toEqual([true, true]);
95
+ expect(requests).toEqual([
96
+ { target: backdrop, value: false },
97
+ { target: root, value: true },
98
+ { target: backdrop, value: true },
99
+ ]);
100
+ });
101
+ });
102
+
103
+ describe('disposeGuiDialog', () => {
104
+ it('hides retained visuals, restores focus, and detaches backdrop interaction', () => {
105
+ const focusRoot = createGuiTestNode();
106
+ const previous = createGuiTestNode();
107
+ const initial = createGuiTestNode();
108
+ setNodeFocusable(previous, true);
109
+ setNodeFocusable(initial, true);
110
+ const focusManager = createFocusManager(focusRoot);
111
+ setFocusedNode(focusManager, previous);
112
+ const backdrop = createGuiTestNode();
113
+ const entryRoot = createGuiTestNode();
114
+ const dialog = createGuiDialog({ backdrop, focusManager });
115
+ let closes = 0;
116
+ connectSignal(getGuiDialogSignals(dialog).onClose, () => closes++);
117
+ enqueueGuiDialog(dialog, { dismissOnBackdrop: true, id: 'entry', initialFocus: initial, root: entryRoot });
118
+ expect(getFocusedNode(focusManager)).toBe(initial);
119
+
120
+ disposeGuiDialog(dialog);
121
+ emitGuiPointer(backdrop, 'onClick');
122
+
123
+ expect([backdrop.visible, entryRoot.visible, getFocusedNode(focusManager)]).toEqual([false, false, previous]);
124
+ expect([closes, enqueueGuiDialog(dialog, { id: 'late', root: createGuiTestNode() })]).toEqual([0, false]);
125
+ });
126
+ });
127
+
128
+ describe('enqueueGuiDialog', () => {
129
+ it('rejects duplicate IDs without changing the caller visual or queue', () => {
130
+ const firstRoot = createGuiTestNode();
131
+ const duplicateRoot = createGuiTestNode();
132
+ const dialog = createGuiDialog();
133
+ expect(enqueueGuiDialog(dialog, { id: 'same', root: firstRoot })).toBe(true);
134
+ expect(enqueueGuiDialog(dialog, { id: 'same', root: duplicateRoot })).toBe(false);
135
+ expect(getGuiDialogEntries(dialog).map((entry) => entry.root)).toEqual([firstRoot]);
136
+ expect(duplicateRoot.visible).toBe(true);
137
+ });
138
+
139
+ it('hands focus to each explicit initial target and restores the pre-dialog focus when empty', () => {
140
+ const focusRoot = createGuiTestNode();
141
+ const previous = createGuiTestNode();
142
+ const firstFocus = createGuiTestNode();
143
+ const secondFocus = createGuiTestNode();
144
+ for (const node of [previous, firstFocus, secondFocus]) setNodeFocusable(node, true);
145
+ const focusManager = createFocusManager(focusRoot);
146
+ setFocusedNode(focusManager, previous);
147
+ const dialog = createGuiDialog({ focusManager });
148
+ enqueueGuiDialog(dialog, { id: 'first', initialFocus: firstFocus, root: createGuiTestNode() });
149
+ enqueueGuiDialog(dialog, { id: 'second', initialFocus: secondFocus, root: createGuiTestNode() });
150
+ expect(getFocusedNode(focusManager)).toBe(firstFocus);
151
+
152
+ closeGuiDialog(dialog, { entryId: 'first', reason: 'accepted' });
153
+ expect(getFocusedNode(focusManager)).toBe(secondFocus);
154
+ closeGuiDialog(dialog, { entryId: 'second', reason: 'accepted' });
155
+ expect(getFocusedNode(focusManager)).toBe(previous);
156
+ });
157
+ });
158
+
159
+ describe('getActiveGuiDialogEntry', () => {
160
+ it('returns null for an empty queue and the current FIFO head otherwise', () => {
161
+ const dialog = createGuiDialog();
162
+ expect(getActiveGuiDialogEntry(dialog)).toBeNull();
163
+ enqueueGuiDialog(dialog, { id: 'active', root: createGuiTestNode() });
164
+ expect(getActiveGuiDialogEntry(dialog)?.id).toBe('active');
165
+ });
166
+ });
167
+
168
+ describe('getGuiDialogEntries', () => {
169
+ it('fills a caller-owned array in FIFO order', () => {
170
+ const dialog = createGuiDialog();
171
+ enqueueGuiDialog(dialog, { id: 'first', root: createGuiTestNode() });
172
+ enqueueGuiDialog(dialog, { id: 'second', root: createGuiTestNode() });
173
+ const out = [{ id: 'stale', root: createGuiTestNode() }];
174
+ expect(getGuiDialogEntries(dialog, out)).toBe(out);
175
+ expect(out.map((entry) => entry.id)).toEqual(['first', 'second']);
176
+ });
177
+ });
178
+
179
+ describe('getGuiDialogSignals', () => {
180
+ it('returns stable signals and reports active and queue changes', () => {
181
+ const dialog = createGuiDialog();
182
+ const signals = getGuiDialogSignals(dialog);
183
+ const active: Array<string | null> = [];
184
+ let queueChanges = 0;
185
+ connectSignal(signals.onActiveChange, (entry) => active.push(entry?.id ?? null));
186
+ connectSignal(signals.onQueueChange, () => queueChanges++);
187
+ enqueueGuiDialog(dialog, { id: 'first', root: createGuiTestNode() });
188
+ enqueueGuiDialog(dialog, { id: 'second', root: createGuiTestNode() });
189
+ closeGuiDialog(dialog, { entryId: 'first', reason: 'accepted' });
190
+
191
+ expect(getGuiDialogSignals(dialog)).toBe(signals);
192
+ expect(active).toEqual(['first', 'second']);
193
+ expect(queueChanges).toBe(3);
194
+ });
195
+ });
196
+
197
+ describe('removeGuiDialogEntry', () => {
198
+ it('removes queued entries only', () => {
199
+ const firstRoot = createGuiTestNode();
200
+ const secondRoot = createGuiTestNode();
201
+ const dialog = createGuiDialog();
202
+ enqueueGuiDialog(dialog, { id: 'first', root: firstRoot });
203
+ enqueueGuiDialog(dialog, { id: 'second', root: secondRoot });
204
+
205
+ expect(removeGuiDialogEntry(dialog, 'first')).toBe(false);
206
+ expect(removeGuiDialogEntry(dialog, 'second')).toBe(true);
207
+ expect(getGuiDialogEntries(dialog).map((entry) => entry.id)).toEqual(['first']);
208
+ expect([firstRoot.visible, secondRoot.visible]).toEqual([true, false]);
209
+ });
210
+ });
@@ -25,6 +25,32 @@ describe('GUI controller tree shaking', () => {
25
25
  expect(output).not.toContain('createTextInputManager');
26
26
  expect(output).not.toContain('@flighthq/tween');
27
27
  });
28
+
29
+ it('does not pull later application GUI systems or tween into a GuiDialog-only bundle', async () => {
30
+ const result = await build({
31
+ bundle: true,
32
+ format: 'esm',
33
+ logLevel: 'silent',
34
+ minify: true,
35
+ packages: 'external',
36
+ stdin: {
37
+ contents: `export { createGuiDialog } from './contract.ts';`,
38
+ resolveDir: fileUrlDirectory(import.meta.url),
39
+ sourcefile: 'tree-shake-gui-dialog.ts',
40
+ },
41
+ treeShaking: true,
42
+ write: false,
43
+ });
44
+ const output = result.outputFiles[0].text;
45
+ expect(output).toContain('createGuiDialog');
46
+ expect(output).not.toContain('@flighthq/command');
47
+ expect(output).not.toContain('@flighthq/dialog');
48
+ expect(output).not.toContain('@flighthq/layout');
49
+ expect(output).not.toContain('@flighthq/menu');
50
+ expect(output).not.toContain('@flighthq/tween');
51
+ expect(output).not.toContain('createTextInputManager');
52
+ expect(output).not.toContain('onExpandChange');
53
+ });
28
54
  });
29
55
 
30
56
  function fileUrlDirectory(url: string): string {