@flighthq/gui 0.4.1-edge.28.7f8e221

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 (96) hide show
  1. package/LICENSE.md +9 -0
  2. package/README.md +17 -0
  3. package/dist/buttonController.d.ts +7 -0
  4. package/dist/buttonController.d.ts.map +1 -0
  5. package/dist/buttonController.js +83 -0
  6. package/dist/buttonController.js.map +1 -0
  7. package/dist/comboBoxController.d.ts +7 -0
  8. package/dist/comboBoxController.d.ts.map +1 -0
  9. package/dist/comboBoxController.js +46 -0
  10. package/dist/comboBoxController.js.map +1 -0
  11. package/dist/contract.d.ts +16 -0
  12. package/dist/contract.d.ts.map +1 -0
  13. package/dist/contract.js +16 -0
  14. package/dist/contract.js.map +1 -0
  15. package/dist/guiController.d.ts +24 -0
  16. package/dist/guiController.d.ts.map +1 -0
  17. package/dist/guiController.js +101 -0
  18. package/dist/guiController.js.map +1 -0
  19. package/dist/guiTestHelper.d.ts +5 -0
  20. package/dist/guiTestHelper.d.ts.map +1 -0
  21. package/dist/guiTestHelper.js +57 -0
  22. package/dist/guiTestHelper.js.map +1 -0
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +2 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/listController.d.ts +8 -0
  28. package/dist/listController.d.ts.map +1 -0
  29. package/dist/listController.js +82 -0
  30. package/dist/listController.js.map +1 -0
  31. package/dist/progressBarController.d.ts +6 -0
  32. package/dist/progressBarController.d.ts.map +1 -0
  33. package/dist/progressBarController.js +42 -0
  34. package/dist/progressBarController.js.map +1 -0
  35. package/dist/radioGroupController.d.ts +7 -0
  36. package/dist/radioGroupController.d.ts.map +1 -0
  37. package/dist/radioGroupController.js +50 -0
  38. package/dist/radioGroupController.js.map +1 -0
  39. package/dist/scrollBarController.d.ts +7 -0
  40. package/dist/scrollBarController.d.ts.map +1 -0
  41. package/dist/scrollBarController.js +124 -0
  42. package/dist/scrollBarController.js.map +1 -0
  43. package/dist/scrollViewController.d.ts +8 -0
  44. package/dist/scrollViewController.d.ts.map +1 -0
  45. package/dist/scrollViewController.js +99 -0
  46. package/dist/scrollViewController.js.map +1 -0
  47. package/dist/sliderController.d.ts +7 -0
  48. package/dist/sliderController.d.ts.map +1 -0
  49. package/dist/sliderController.js +105 -0
  50. package/dist/sliderController.js.map +1 -0
  51. package/dist/splitPaneController.d.ts +7 -0
  52. package/dist/splitPaneController.d.ts.map +1 -0
  53. package/dist/splitPaneController.js +87 -0
  54. package/dist/splitPaneController.js.map +1 -0
  55. package/dist/tabBarController.d.ts +7 -0
  56. package/dist/tabBarController.d.ts.map +1 -0
  57. package/dist/tabBarController.js +43 -0
  58. package/dist/tabBarController.js.map +1 -0
  59. package/dist/textInputController.d.ts +9 -0
  60. package/dist/textInputController.d.ts.map +1 -0
  61. package/dist/textInputController.js +132 -0
  62. package/dist/textInputController.js.map +1 -0
  63. package/dist/toggleController.d.ts +7 -0
  64. package/dist/toggleController.d.ts.map +1 -0
  65. package/dist/toggleController.js +57 -0
  66. package/dist/toggleController.js.map +1 -0
  67. package/dist/tooltipController.d.ts +6 -0
  68. package/dist/tooltipController.d.ts.map +1 -0
  69. package/dist/tooltipController.js +62 -0
  70. package/dist/tooltipController.js.map +1 -0
  71. package/dist/treeViewController.d.ts +10 -0
  72. package/dist/treeViewController.d.ts.map +1 -0
  73. package/dist/treeViewController.js +128 -0
  74. package/dist/treeViewController.js.map +1 -0
  75. package/dist/windowController.d.ts +7 -0
  76. package/dist/windowController.d.ts.map +1 -0
  77. package/dist/windowController.js +119 -0
  78. package/dist/windowController.js.map +1 -0
  79. package/package.json +53 -0
  80. package/src/buttonController.test.ts +90 -0
  81. package/src/comboBoxController.test.ts +71 -0
  82. package/src/guiController.test.ts +162 -0
  83. package/src/guiTreeShaking.test.ts +35 -0
  84. package/src/listController.test.ts +96 -0
  85. package/src/progressBarController.test.ts +49 -0
  86. package/src/radioGroupController.test.ts +61 -0
  87. package/src/scrollBarController.test.ts +86 -0
  88. package/src/scrollViewController.test.ts +80 -0
  89. package/src/sliderController.test.ts +74 -0
  90. package/src/splitPaneController.test.ts +85 -0
  91. package/src/tabBarController.test.ts +50 -0
  92. package/src/textInputController.test.ts +93 -0
  93. package/src/toggleController.test.ts +72 -0
  94. package/src/tooltipController.test.ts +56 -0
  95. package/src/treeViewController.test.ts +105 -0
  96. package/src/windowController.test.ts +75 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitPaneController.js","sourceRoot":"","sources":["../src/splitPaneController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { TabBarController, TabBarControllerOptions, TabBarControllerSignals } from '@flighthq/types/contract';
2
+ export declare function createTabBarController(options: Readonly<TabBarControllerOptions>): TabBarController;
3
+ export declare function disposeTabBarController(controller: TabBarController): void;
4
+ export declare function getTabBarControllerSelectedIndex(controller: TabBarController): number;
5
+ export declare function getTabBarControllerSignals(controller: TabBarController): Readonly<TabBarControllerSignals>;
6
+ export declare function setTabBarControllerSelectedIndex(controller: TabBarController, index: number): void;
7
+ //# sourceMappingURL=tabBarController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabBarController.d.ts","sourceRoot":"","sources":["../src/tabBarController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAiBlC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAoBnG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAK1E;AAED,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,gBAAgB,GAAG,MAAM,CAErF;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAE1G;AAED,wBAAgB,gCAAgC,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAUlG"}
@@ -0,0 +1,43 @@
1
+ import { createSignal, emitSignal } from '@flighthq/signals/contract';
2
+ import { connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, } from './guiController';
3
+ export function createTabBarController(options) {
4
+ const runtime = createGuiControllerRuntime({
5
+ selectedIndex: -1,
6
+ signals: { onChange: createSignal() },
7
+ tabs: options.tabs.slice(),
8
+ }, options.transition);
9
+ const controller = createGuiController(runtime);
10
+ runtime.tabs.forEach((tab, index) => {
11
+ const targets = [tab.selectedState, tab.unselectedState].filter((target, i, all) => all.indexOf(target) === i);
12
+ for (const target of targets) {
13
+ connectGuiInteraction(runtime, target, 'onClick', () => setTabBarControllerSelectedIndex(controller, index));
14
+ }
15
+ });
16
+ setTabBarControllerSelectedIndex(controller, options.selectedIndex ?? (runtime.tabs.length === 0 ? -1 : 0));
17
+ return controller;
18
+ }
19
+ export function disposeTabBarController(controller) {
20
+ const runtime = getGuiControllerRuntime(controller);
21
+ disposeGuiController(controller, () => {
22
+ runtime.tabs.length = 0;
23
+ });
24
+ }
25
+ export function getTabBarControllerSelectedIndex(controller) {
26
+ return getGuiControllerRuntime(controller).selectedIndex;
27
+ }
28
+ export function getTabBarControllerSignals(controller) {
29
+ return getGuiControllerRuntime(controller).signals;
30
+ }
31
+ export function setTabBarControllerSelectedIndex(controller, index) {
32
+ const runtime = getGuiControllerRuntime(controller);
33
+ const next = index >= 0 && index < runtime.tabs.length ? index : -1;
34
+ const changed = runtime.selectedIndex !== next;
35
+ runtime.selectedIndex = next;
36
+ runtime.tabs.forEach((tab, i) => {
37
+ setGuiVisible(runtime, tab.selectedState, i === next);
38
+ setGuiVisible(runtime, tab.unselectedState, i !== next);
39
+ });
40
+ if (changed)
41
+ emitSignal(runtime.signals.onChange, next);
42
+ }
43
+ //# sourceMappingURL=tabBarController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tabBarController.js","sourceRoot":"","sources":["../src/tabBarController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { InputKeyboardData, TextInputController, TextInputControllerOptions, TextInputControllerSignals } from '@flighthq/types/contract';
2
+ export declare function blurTextInputController(controller: TextInputController): void;
3
+ export declare function createTextInputController(options: Readonly<TextInputControllerOptions>): TextInputController;
4
+ export declare function dispatchTextInputControllerKeyDown(controller: TextInputController, data: Readonly<InputKeyboardData>): boolean;
5
+ export declare function dispatchTextInputControllerText(controller: TextInputController, text: string): boolean;
6
+ export declare function disposeTextInputController(controller: TextInputController): void;
7
+ export declare function focusTextInputController(controller: TextInputController): void;
8
+ export declare function getTextInputControllerSignals(controller: TextInputController): Readonly<TextInputControllerSignals>;
9
+ //# sourceMappingURL=textInputController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textInputController.d.ts","sourceRoot":"","sources":["../src/textInputController.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACV,iBAAiB,EAMjB,mBAAmB,EACnB,0BAA0B,EAC1B,0BAA0B,EAC3B,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAK7E;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,0BAA0B,CAAC,GAAG,mBAAmB,CA+C5G;AAED,wBAAgB,kCAAkC,CAChD,UAAU,EAAE,mBAAmB,EAC/B,IAAI,EAAE,QAAQ,CAAC,iBAAiB,CAAC,GAChC,OAAO,CAST;AAED,wBAAgB,+BAA+B,CAAC,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAQtG;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAWhF;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,mBAAmB,GAAG,IAAI,CAM9E;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,mBAAmB,GAAG,QAAQ,CAAC,0BAA0B,CAAC,CAEnH"}
@@ -0,0 +1,132 @@
1
+ import { createSignal, emitSignal } from '@flighthq/signals/contract';
2
+ import { enableTextFieldSignals, getRichTextRuntime } from '@flighthq/text/contract';
3
+ import { blurTextInput, createTextInputManager, disableTextInput, dispatchTextInput, dispatchTextInputKeyDown, dispatchTextInputPointerDown, dispatchTextInputPointerMove, dispatchTextInputWheel, enableTextInput, focusTextInput, getTextInputCaretRectangle, hasTextInput, } from '@flighthq/textinput/contract';
4
+ import { connectGuiInteraction, connectGuiSignal, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, setGuiVisualProperty, } from './guiController';
5
+ export function blurTextInputController(controller) {
6
+ const runtime = getGuiControllerRuntime(controller);
7
+ if (runtime.textField === null)
8
+ return;
9
+ blurTextInput(runtime.manager);
10
+ setGuiVisible(runtime, runtime.caret, false);
11
+ }
12
+ export function createTextInputController(options) {
13
+ const ownsInput = !hasTextInput(options.textField);
14
+ enableTextInput(options.textField);
15
+ const runtime = createGuiControllerRuntime({
16
+ background: options.background ?? null,
17
+ caret: options.caret ?? null,
18
+ manager: options.manager ?? createTextInputManager(),
19
+ ownsInput,
20
+ signals: { onChange: createSignal(), onSubmit: createSignal() },
21
+ textField: options.textField,
22
+ }, options.transition);
23
+ const controller = createGuiController(runtime);
24
+ connectGuiSignal(runtime, enableTextFieldSignals(options.textField).onTextFieldChange, (event) => {
25
+ updateTextInputControllerCaret(runtime);
26
+ emitSignal(runtime.signals.onChange, event.text);
27
+ });
28
+ connectGuiInteraction(runtime, options.textField, 'onPointerDown', (data) => {
29
+ dispatchTextInputPointerDown(runtime.manager, options.textField, data.localX, data.localY, data.shiftKey);
30
+ updateTextInputControllerCaret(runtime);
31
+ });
32
+ connectGuiInteraction(runtime, options.textField, 'onPointerMove', (data) => {
33
+ if (data.buttons !== 0) {
34
+ dispatchTextInputPointerMove(runtime.manager, data.localX, data.localY);
35
+ updateTextInputControllerCaret(runtime);
36
+ }
37
+ });
38
+ connectGuiInteraction(runtime, options.textField, 'onWheel', (data) => {
39
+ dispatchTextInputWheel(runtime.manager, data.deltaY);
40
+ });
41
+ connectGuiInteraction(runtime, options.textField, 'onFocusIn', () => focusTextInputController(controller));
42
+ connectGuiInteraction(runtime, options.textField, 'onFocusOut', () => blurTextInputController(controller));
43
+ connectGuiInteraction(runtime, options.textField, 'onKeyDown', (data) => {
44
+ dispatchTextInputControllerKeyDown(controller, keyboardEventToInput(data));
45
+ });
46
+ if (options.input !== undefined) {
47
+ connectGuiSignal(runtime, options.input.onKeyDown, (data) => {
48
+ dispatchTextInputControllerKeyDown(controller, data);
49
+ });
50
+ connectGuiSignal(runtime, options.input.onTextInput, (data) => dispatchTextInputControllerText(controller, data.text));
51
+ }
52
+ setGuiVisible(runtime, runtime.caret, false);
53
+ return controller;
54
+ }
55
+ export function dispatchTextInputControllerKeyDown(controller, data) {
56
+ const runtime = getGuiControllerRuntime(controller);
57
+ if (runtime.textField === null)
58
+ return false;
59
+ if (data.key === 'Enter')
60
+ emitSignal(runtime.signals.onSubmit, runtime.textField.data.text);
61
+ const previousText = runtime.textField.data.text;
62
+ const handled = dispatchTextInputKeyDown(runtime.manager, data);
63
+ if (runtime.textField.data.text !== previousText)
64
+ emitSignal(runtime.signals.onChange, runtime.textField.data.text);
65
+ updateTextInputControllerCaret(runtime);
66
+ return handled;
67
+ }
68
+ export function dispatchTextInputControllerText(controller, text) {
69
+ const runtime = getGuiControllerRuntime(controller);
70
+ if (runtime.textField === null)
71
+ return false;
72
+ const previousText = runtime.textField.data.text;
73
+ const handled = dispatchTextInput(runtime.manager, text);
74
+ if (runtime.textField.data.text !== previousText)
75
+ emitSignal(runtime.signals.onChange, runtime.textField.data.text);
76
+ updateTextInputControllerCaret(runtime);
77
+ return handled;
78
+ }
79
+ export function disposeTextInputController(controller) {
80
+ const runtime = getGuiControllerRuntime(controller);
81
+ disposeGuiController(controller, () => {
82
+ if (runtime.textField !== null) {
83
+ if (runtime.manager.focused === runtime.textField)
84
+ blurTextInput(runtime.manager);
85
+ if (runtime.ownsInput)
86
+ disableTextInput(runtime.textField);
87
+ }
88
+ runtime.background = null;
89
+ runtime.caret = null;
90
+ runtime.textField = null;
91
+ });
92
+ }
93
+ export function focusTextInputController(controller) {
94
+ const runtime = getGuiControllerRuntime(controller);
95
+ if (runtime.textField === null)
96
+ return;
97
+ focusTextInput(runtime.manager, runtime.textField);
98
+ setGuiVisible(runtime, runtime.caret, true);
99
+ updateTextInputControllerCaret(runtime);
100
+ }
101
+ export function getTextInputControllerSignals(controller) {
102
+ return getGuiControllerRuntime(controller).signals;
103
+ }
104
+ function keyboardEventToInput(data) {
105
+ return {
106
+ altKey: data.altKey,
107
+ capsLock: false,
108
+ code: data.key,
109
+ ctrlKey: data.ctrlKey,
110
+ key: data.key,
111
+ keyCode: data.keyCode,
112
+ location: 0,
113
+ metaKey: data.metaKey,
114
+ modifier: 0,
115
+ numLock: false,
116
+ repeat: false,
117
+ shiftKey: data.shiftKey,
118
+ timeStamp: 0,
119
+ };
120
+ }
121
+ function updateTextInputControllerCaret(runtime) {
122
+ if (runtime.textField === null || runtime.caret === null || runtime.manager.focused !== runtime.textField)
123
+ return;
124
+ const layout = getRichTextRuntime(runtime.textField).textLayout;
125
+ if (layout === null)
126
+ return;
127
+ const rectangle = { height: 0, lineIndex: 0, width: 0, x: 0, y: 0 };
128
+ getTextInputCaretRectangle(rectangle, runtime.textField, layout);
129
+ setGuiVisualProperty(runtime, runtime.caret, 'x', rectangle.x);
130
+ setGuiVisualProperty(runtime, runtime.caret, 'y', rectangle.y);
131
+ }
132
+ //# sourceMappingURL=textInputController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"textInputController.js","sourceRoot":"","sources":["../src/textInputController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ToggleController, ToggleControllerOptions, ToggleControllerSignals } from '@flighthq/types/contract';
2
+ export declare function createToggleController(options: Readonly<ToggleControllerOptions>): ToggleController;
3
+ export declare function disposeToggleController(controller: ToggleController): void;
4
+ export declare function getToggleControllerSignals(controller: ToggleController): Readonly<ToggleControllerSignals>;
5
+ export declare function isToggleControllerChecked(controller: ToggleController): boolean;
6
+ export declare function setToggleControllerChecked(controller: ToggleController, checked: boolean): void;
7
+ //# sourceMappingURL=toggleController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggleController.d.ts","sourceRoot":"","sources":["../src/toggleController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAqBlC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CA8BnG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,GAAG,IAAI,CAQ1E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,GAAG,QAAQ,CAAC,uBAAuB,CAAC,CAE1G;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAE/E;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAM/F"}
@@ -0,0 +1,57 @@
1
+ import { createSignal, emitSignal } from '@flighthq/signals/contract';
2
+ import { connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, } from './guiController';
3
+ export function createToggleController(options) {
4
+ const runtime = createGuiControllerRuntime({
5
+ checked: options.checked ?? false,
6
+ checkedState: options.checkedState,
7
+ label: options.label ?? null,
8
+ over: false,
9
+ overState: options.overState ?? null,
10
+ signals: { onChange: createSignal() },
11
+ uncheckedState: options.uncheckedState,
12
+ }, options.transition);
13
+ const controller = createGuiController(runtime);
14
+ const targets = [options.uncheckedState, options.checkedState, options.label].filter((target, index, all) => target !== undefined && all.indexOf(target) === index);
15
+ for (const target of targets) {
16
+ connectGuiInteraction(runtime, target, 'onClick', () => setToggleControllerChecked(controller, !runtime.checked));
17
+ connectGuiInteraction(runtime, target, 'onPointerOver', () => {
18
+ runtime.over = true;
19
+ updateToggleControllerVisuals(runtime);
20
+ });
21
+ connectGuiInteraction(runtime, target, 'onPointerOut', () => {
22
+ runtime.over = false;
23
+ updateToggleControllerVisuals(runtime);
24
+ });
25
+ }
26
+ updateToggleControllerVisuals(runtime);
27
+ return controller;
28
+ }
29
+ export function disposeToggleController(controller) {
30
+ const runtime = getGuiControllerRuntime(controller);
31
+ disposeGuiController(controller, () => {
32
+ runtime.checkedState = null;
33
+ runtime.label = null;
34
+ runtime.overState = null;
35
+ runtime.uncheckedState = null;
36
+ });
37
+ }
38
+ export function getToggleControllerSignals(controller) {
39
+ return getGuiControllerRuntime(controller).signals;
40
+ }
41
+ export function isToggleControllerChecked(controller) {
42
+ return getGuiControllerRuntime(controller).checked;
43
+ }
44
+ export function setToggleControllerChecked(controller, checked) {
45
+ const runtime = getGuiControllerRuntime(controller);
46
+ if (runtime.checked === checked || runtime.disposed)
47
+ return;
48
+ runtime.checked = checked;
49
+ updateToggleControllerVisuals(runtime);
50
+ emitSignal(runtime.signals.onChange, checked);
51
+ }
52
+ function updateToggleControllerVisuals(runtime) {
53
+ setGuiVisible(runtime, runtime.uncheckedState, !runtime.checked);
54
+ setGuiVisible(runtime, runtime.checkedState, runtime.checked);
55
+ setGuiVisible(runtime, runtime.overState, runtime.over);
56
+ }
57
+ //# sourceMappingURL=toggleController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toggleController.js","sourceRoot":"","sources":["../src/toggleController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { TooltipController, TooltipControllerOptions } from '@flighthq/types/contract';
2
+ export declare function createTooltipController(options: Readonly<TooltipControllerOptions>): TooltipController;
3
+ export declare function disposeTooltipController(controller: TooltipController): void;
4
+ export declare function hideTooltipController(controller: TooltipController): void;
5
+ export declare function showTooltipController(controller: TooltipController): void;
6
+ //# sourceMappingURL=tooltipController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltipController.d.ts","sourceRoot":"","sources":["../src/tooltipController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA4B,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAuBtH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,QAAQ,CAAC,wBAAwB,CAAC,GAAG,iBAAiB,CA+BtG;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAM5E;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAIzE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,iBAAiB,GAAG,IAAI,CAKzE"}
@@ -0,0 +1,62 @@
1
+ import { connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, setGuiVisualProperty, } from './guiController';
2
+ export function createTooltipController(options) {
3
+ const runtime = createGuiControllerRuntime({
4
+ content: options.content,
5
+ delay: Math.max(0, options.delay ?? 500),
6
+ offsetX: options.offset?.x ?? 0,
7
+ offsetY: options.offset?.y ?? 20,
8
+ target: options.target,
9
+ timer: null,
10
+ worldX: 0,
11
+ worldY: 0,
12
+ }, options.transition);
13
+ const controller = createGuiController(runtime);
14
+ runtime.cleanups.push(() => clearTooltipControllerTimer(runtime));
15
+ connectGuiInteraction(runtime, options.target, 'onPointerOver', (data) => {
16
+ runtime.worldX = data.worldX;
17
+ runtime.worldY = data.worldY;
18
+ clearTooltipControllerTimer(runtime);
19
+ if (runtime.delay === 0)
20
+ showTooltipController(controller);
21
+ else
22
+ runtime.timer = setTimeout(() => showTooltipController(controller), runtime.delay);
23
+ });
24
+ connectGuiInteraction(runtime, options.target, 'onPointerMove', (data) => {
25
+ runtime.worldX = data.worldX;
26
+ runtime.worldY = data.worldY;
27
+ if (runtime.content?.visible === true)
28
+ positionTooltipController(runtime);
29
+ });
30
+ connectGuiInteraction(runtime, options.target, 'onPointerOut', () => hideTooltipController(controller));
31
+ setGuiVisible(runtime, options.content, false);
32
+ return controller;
33
+ }
34
+ export function disposeTooltipController(controller) {
35
+ const runtime = getGuiControllerRuntime(controller);
36
+ disposeGuiController(controller, () => {
37
+ runtime.content = null;
38
+ runtime.target = null;
39
+ });
40
+ }
41
+ export function hideTooltipController(controller) {
42
+ const runtime = getGuiControllerRuntime(controller);
43
+ clearTooltipControllerTimer(runtime);
44
+ setGuiVisible(runtime, runtime.content, false);
45
+ }
46
+ export function showTooltipController(controller) {
47
+ const runtime = getGuiControllerRuntime(controller);
48
+ clearTooltipControllerTimer(runtime);
49
+ positionTooltipController(runtime);
50
+ setGuiVisible(runtime, runtime.content, true);
51
+ }
52
+ function clearTooltipControllerTimer(runtime) {
53
+ if (runtime.timer === null)
54
+ return;
55
+ clearTimeout(runtime.timer);
56
+ runtime.timer = null;
57
+ }
58
+ function positionTooltipController(runtime) {
59
+ setGuiVisualProperty(runtime, runtime.content, 'x', runtime.worldX + runtime.offsetX);
60
+ setGuiVisualProperty(runtime, runtime.content, 'y', runtime.worldY + runtime.offsetY);
61
+ }
62
+ //# sourceMappingURL=tooltipController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tooltipController.js","sourceRoot":"","sources":["../src/tooltipController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { TreeViewController, TreeViewControllerItem, TreeViewControllerOptions, TreeViewControllerSignals } from '@flighthq/types/contract';
2
+ export declare function createTreeViewController(options: Readonly<TreeViewControllerOptions>): TreeViewController;
3
+ export declare function disposeTreeViewController(controller: TreeViewController): void;
4
+ export declare function getTreeViewControllerSelectedItem(controller: TreeViewController): Readonly<TreeViewControllerItem> | null;
5
+ export declare function getTreeViewControllerSignals(controller: TreeViewController): Readonly<TreeViewControllerSignals>;
6
+ export declare function isTreeViewControllerItemExpanded(controller: TreeViewController, item: Readonly<TreeViewControllerItem>): boolean;
7
+ export declare function setTreeViewControllerItemExpanded(controller: TreeViewController, item: Readonly<TreeViewControllerItem>, expanded: boolean): void;
8
+ export declare function setTreeViewControllerSelectedItem(controller: TreeViewController, item: Readonly<TreeViewControllerItem> | null): void;
9
+ export declare function toggleTreeViewControllerItem(controller: TreeViewController, item: Readonly<TreeViewControllerItem>): void;
10
+ //# sourceMappingURL=treeViewController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeViewController.d.ts","sourceRoot":"","sources":["../src/treeViewController.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AAoBlC,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC,yBAAyB,CAAC,GAAG,kBAAkB,CAiCzG;AAED,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,kBAAkB,GAAG,IAAI,CAS9E;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,kBAAkB,GAC7B,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAEzC;AAED,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,kBAAkB,GAAG,QAAQ,CAAC,yBAAyB,CAAC,CAEhH;AAED,wBAAgB,gCAAgC,CAC9C,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACrC,OAAO,CAET;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,EACtC,QAAQ,EAAE,OAAO,GAChB,IAAI,CASN;AAED,wBAAgB,iCAAiC,CAC/C,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GAAG,IAAI,GAC5C,IAAI,CAMN;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,QAAQ,CAAC,sBAAsB,CAAC,GACrC,IAAI,CAEN"}
@@ -0,0 +1,128 @@
1
+ import { createSignal, emitSignal } from '@flighthq/signals/contract';
2
+ import { connectGuiInteraction, createGuiController, createGuiControllerRuntime, disposeGuiController, getGuiControllerRuntime, setGuiVisible, } from './guiController';
3
+ export function createTreeViewController(options) {
4
+ const items = [];
5
+ const parents = new Map();
6
+ const expanded = new Set();
7
+ collectTreeViewItems(options.items, null, items, parents, expanded);
8
+ const runtime = createGuiControllerRuntime({
9
+ expanded,
10
+ items,
11
+ parents,
12
+ roots: options.items.slice(),
13
+ selectedItem: options.selectedItem ?? null,
14
+ signals: {
15
+ onActivate: createSignal(),
16
+ onExpandChange: createSignal(),
17
+ onSelect: createSignal(),
18
+ },
19
+ }, options.transition);
20
+ const controller = createGuiController(runtime);
21
+ runtime.items.forEach((item) => {
22
+ connectGuiInteraction(runtime, item.visual, 'onClick', () => setTreeViewControllerSelectedItem(controller, item));
23
+ connectGuiInteraction(runtime, item.visual, 'onDoubleClick', () => {
24
+ emitSignal(runtime.signals.onActivate, item);
25
+ if ((item.children?.length ?? 0) > 0)
26
+ toggleTreeViewControllerItem(controller, item);
27
+ });
28
+ connectGuiInteraction(runtime, item.visual, 'onKeyDown', (data) => {
29
+ handleTreeViewControllerKeyDown(controller, data);
30
+ });
31
+ });
32
+ updateTreeViewControllerVisibility(runtime);
33
+ return controller;
34
+ }
35
+ export function disposeTreeViewController(controller) {
36
+ const runtime = getGuiControllerRuntime(controller);
37
+ disposeGuiController(controller, () => {
38
+ runtime.expanded.clear();
39
+ runtime.items.length = 0;
40
+ runtime.parents.clear();
41
+ runtime.roots.length = 0;
42
+ runtime.selectedItem = null;
43
+ });
44
+ }
45
+ export function getTreeViewControllerSelectedItem(controller) {
46
+ return getGuiControllerRuntime(controller).selectedItem;
47
+ }
48
+ export function getTreeViewControllerSignals(controller) {
49
+ return getGuiControllerRuntime(controller).signals;
50
+ }
51
+ export function isTreeViewControllerItemExpanded(controller, item) {
52
+ return getGuiControllerRuntime(controller).expanded.has(item);
53
+ }
54
+ export function setTreeViewControllerItemExpanded(controller, item, expanded) {
55
+ const runtime = getGuiControllerRuntime(controller);
56
+ if (!runtime.parents.has(item) || (item.children?.length ?? 0) === 0 || runtime.disposed)
57
+ return;
58
+ const previous = runtime.expanded.has(item);
59
+ if (previous === expanded)
60
+ return;
61
+ if (expanded)
62
+ runtime.expanded.add(item);
63
+ else
64
+ runtime.expanded.delete(item);
65
+ updateTreeViewControllerVisibility(runtime);
66
+ emitSignal(runtime.signals.onExpandChange, item, expanded);
67
+ }
68
+ export function setTreeViewControllerSelectedItem(controller, item) {
69
+ const runtime = getGuiControllerRuntime(controller);
70
+ const next = item !== null && runtime.parents.has(item) ? item : null;
71
+ if (runtime.selectedItem === next || runtime.disposed)
72
+ return;
73
+ runtime.selectedItem = next;
74
+ emitSignal(runtime.signals.onSelect, next);
75
+ }
76
+ export function toggleTreeViewControllerItem(controller, item) {
77
+ setTreeViewControllerItemExpanded(controller, item, !isTreeViewControllerItemExpanded(controller, item));
78
+ }
79
+ function collectTreeViewItems(source, parent, items, parents, expanded) {
80
+ for (const item of source) {
81
+ items.push(item);
82
+ parents.set(item, parent);
83
+ if (item.expanded === true)
84
+ expanded.add(item);
85
+ if (item.children !== undefined)
86
+ collectTreeViewItems(item.children, item, items, parents, expanded);
87
+ }
88
+ }
89
+ function getVisibleTreeViewItems(runtime) {
90
+ return runtime.items.filter((item) => isTreeViewItemVisible(runtime, item));
91
+ }
92
+ function handleTreeViewControllerKeyDown(controller, data) {
93
+ const runtime = getGuiControllerRuntime(controller);
94
+ const selected = runtime.selectedItem;
95
+ const visible = getVisibleTreeViewItems(runtime);
96
+ const index = selected === null ? -1 : visible.indexOf(selected);
97
+ if (data.key === 'ArrowDown' && visible.length > 0)
98
+ setTreeViewControllerSelectedItem(controller, visible[Math.min(visible.length - 1, index + 1)]);
99
+ else if (data.key === 'ArrowUp' && visible.length > 0)
100
+ setTreeViewControllerSelectedItem(controller, visible[Math.max(0, index - 1)]);
101
+ else if (data.key === 'ArrowRight' && selected !== null) {
102
+ if ((selected.children?.length ?? 0) > 0 && !runtime.expanded.has(selected))
103
+ setTreeViewControllerItemExpanded(controller, selected, true);
104
+ else if ((selected.children?.length ?? 0) > 0)
105
+ setTreeViewControllerSelectedItem(controller, selected.children[0]);
106
+ }
107
+ else if (data.key === 'ArrowLeft' && selected !== null) {
108
+ if (runtime.expanded.has(selected))
109
+ setTreeViewControllerItemExpanded(controller, selected, false);
110
+ else
111
+ setTreeViewControllerSelectedItem(controller, runtime.parents.get(selected) ?? null);
112
+ }
113
+ else if (data.key === 'Enter' && selected !== null)
114
+ emitSignal(runtime.signals.onActivate, selected);
115
+ }
116
+ function isTreeViewItemVisible(runtime, item) {
117
+ let parent = runtime.parents.get(item) ?? null;
118
+ while (parent !== null) {
119
+ if (!runtime.expanded.has(parent))
120
+ return false;
121
+ parent = runtime.parents.get(parent) ?? null;
122
+ }
123
+ return true;
124
+ }
125
+ function updateTreeViewControllerVisibility(runtime) {
126
+ runtime.items.forEach((item) => setGuiVisible(runtime, item.visual, isTreeViewItemVisible(runtime, item)));
127
+ }
128
+ //# sourceMappingURL=treeViewController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeViewController.js","sourceRoot":"","sources":["../src/treeViewController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { WindowController, WindowControllerOptions, WindowControllerSignals } from '@flighthq/types/contract';
2
+ export declare function createWindowController(options: Readonly<WindowControllerOptions>): WindowController;
3
+ export declare function disposeWindowController(controller: WindowController): void;
4
+ export declare function getWindowControllerSignals(controller: WindowController): Readonly<WindowControllerSignals>;
5
+ export declare function setWindowControllerPosition(controller: WindowController, x: number, y: number): void;
6
+ export declare function setWindowControllerSize(controller: WindowController, width: number, height: number): void;
7
+ //# sourceMappingURL=windowController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windowController.d.ts","sourceRoot":"","sources":["../src/windowController.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,0BAA0B,CAAC;AAwClC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,uBAAuB,CAAC,GAAG,gBAAgB,CAuFnG;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,2BAA2B,CAAC,UAAU,EAAE,gBAAgB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAMpG;AAED,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAoBzG"}