@fivem-nui/svelte 0.0.0-stage → 1.0.0

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 (222) hide show
  1. package/README.md +284 -2
  2. package/dist/actions/clickOutside/clickOutside.d.ts +24 -0
  3. package/dist/actions/clickOutside/clickOutside.d.ts.map +1 -0
  4. package/dist/actions/clickOutside/clickOutside.js +62 -0
  5. package/dist/actions/clickOutside/clickOutside.js.map +1 -0
  6. package/dist/actions/clickOutside/handler.d.ts +11 -0
  7. package/dist/actions/clickOutside/handler.d.ts.map +1 -0
  8. package/dist/actions/clickOutside/handler.js +45 -0
  9. package/dist/actions/clickOutside/handler.js.map +1 -0
  10. package/dist/actions/clickOutside/index.d.ts +4 -0
  11. package/dist/actions/clickOutside/index.d.ts.map +1 -0
  12. package/dist/actions/clickOutside/index.js +4 -0
  13. package/dist/actions/clickOutside/index.js.map +1 -0
  14. package/dist/actions/clickOutside/types.d.ts +36 -0
  15. package/dist/actions/clickOutside/types.d.ts.map +1 -0
  16. package/dist/actions/clickOutside/types.js +6 -0
  17. package/dist/actions/clickOutside/types.js.map +1 -0
  18. package/dist/actions/clickOutside.d.ts +63 -0
  19. package/dist/actions/clickOutside.d.ts.map +1 -0
  20. package/dist/actions/clickOutside.js +106 -0
  21. package/dist/actions/clickOutside.js.map +1 -0
  22. package/dist/actions/escape/escape.d.ts +26 -0
  23. package/dist/actions/escape/escape.d.ts.map +1 -0
  24. package/dist/actions/escape/escape.js +74 -0
  25. package/dist/actions/escape/escape.js.map +1 -0
  26. package/dist/actions/escape/handler.d.ts +11 -0
  27. package/dist/actions/escape/handler.d.ts.map +1 -0
  28. package/dist/actions/escape/handler.js +50 -0
  29. package/dist/actions/escape/handler.js.map +1 -0
  30. package/dist/actions/escape/index.d.ts +4 -0
  31. package/dist/actions/escape/index.d.ts.map +1 -0
  32. package/dist/actions/escape/index.js +4 -0
  33. package/dist/actions/escape/index.js.map +1 -0
  34. package/dist/actions/escape/types.d.ts +70 -0
  35. package/dist/actions/escape/types.d.ts.map +1 -0
  36. package/dist/actions/escape/types.js +12 -0
  37. package/dist/actions/escape/types.js.map +1 -0
  38. package/dist/actions/escape.d.ts +99 -0
  39. package/dist/actions/escape.d.ts.map +1 -0
  40. package/dist/actions/escape.js +128 -0
  41. package/dist/actions/escape.js.map +1 -0
  42. package/dist/actions/focusTrap/focusTrap.d.ts +19 -0
  43. package/dist/actions/focusTrap/focusTrap.d.ts.map +1 -0
  44. package/dist/actions/focusTrap/focusTrap.js +198 -0
  45. package/dist/actions/focusTrap/focusTrap.js.map +1 -0
  46. package/dist/actions/focusTrap/focusables.d.ts +39 -0
  47. package/dist/actions/focusTrap/focusables.d.ts.map +1 -0
  48. package/dist/actions/focusTrap/focusables.js +142 -0
  49. package/dist/actions/focusTrap/focusables.js.map +1 -0
  50. package/dist/actions/focusTrap/index.d.ts +5 -0
  51. package/dist/actions/focusTrap/index.d.ts.map +1 -0
  52. package/dist/actions/focusTrap/index.js +5 -0
  53. package/dist/actions/focusTrap/index.js.map +1 -0
  54. package/dist/actions/focusTrap/trapStack.d.ts +33 -0
  55. package/dist/actions/focusTrap/trapStack.d.ts.map +1 -0
  56. package/dist/actions/focusTrap/trapStack.js +84 -0
  57. package/dist/actions/focusTrap/trapStack.js.map +1 -0
  58. package/dist/actions/focusTrap/types.d.ts +50 -0
  59. package/dist/actions/focusTrap/types.d.ts.map +1 -0
  60. package/dist/actions/focusTrap/types.js +10 -0
  61. package/dist/actions/focusTrap/types.js.map +1 -0
  62. package/dist/actions/focusTrap.d.ts +24 -0
  63. package/dist/actions/focusTrap.d.ts.map +1 -0
  64. package/dist/actions/focusTrap.js +201 -0
  65. package/dist/actions/focusTrap.js.map +1 -0
  66. package/dist/actions/focusTrap.types.d.ts +50 -0
  67. package/dist/actions/focusTrap.types.d.ts.map +1 -0
  68. package/dist/actions/focusTrap.types.js +10 -0
  69. package/dist/actions/focusTrap.types.js.map +1 -0
  70. package/dist/actions/focusables.d.ts +39 -0
  71. package/dist/actions/focusables.d.ts.map +1 -0
  72. package/dist/actions/focusables.js +142 -0
  73. package/dist/actions/focusables.js.map +1 -0
  74. package/dist/actions/index.d.ts +5 -0
  75. package/dist/actions/index.d.ts.map +1 -0
  76. package/dist/actions/index.js +5 -0
  77. package/dist/actions/index.js.map +1 -0
  78. package/dist/actions/layer/index.d.ts +4 -0
  79. package/dist/actions/layer/index.d.ts.map +1 -0
  80. package/dist/actions/layer/index.js +4 -0
  81. package/dist/actions/layer/index.js.map +1 -0
  82. package/dist/actions/layer/layer.d.ts +28 -0
  83. package/dist/actions/layer/layer.d.ts.map +1 -0
  84. package/dist/actions/layer/layer.js +118 -0
  85. package/dist/actions/layer/layer.js.map +1 -0
  86. package/dist/actions/layer/layerStack.d.ts +10 -0
  87. package/dist/actions/layer/layerStack.d.ts.map +1 -0
  88. package/dist/actions/layer/layerStack.js +153 -0
  89. package/dist/actions/layer/layerStack.js.map +1 -0
  90. package/dist/actions/layer/types.d.ts +105 -0
  91. package/dist/actions/layer/types.d.ts.map +1 -0
  92. package/dist/actions/layer/types.js +14 -0
  93. package/dist/actions/layer/types.js.map +1 -0
  94. package/dist/actions/layer.d.ts +133 -0
  95. package/dist/actions/layer.d.ts.map +1 -0
  96. package/dist/actions/layer.js +269 -0
  97. package/dist/actions/layer.js.map +1 -0
  98. package/dist/actions/trapStack.d.ts +33 -0
  99. package/dist/actions/trapStack.d.ts.map +1 -0
  100. package/dist/actions/trapStack.js +84 -0
  101. package/dist/actions/trapStack.js.map +1 -0
  102. package/dist/client.d.ts +179 -0
  103. package/dist/client.d.ts.map +1 -0
  104. package/dist/client.js +176 -0
  105. package/dist/client.js.map +1 -0
  106. package/dist/context/index.d.ts +68 -0
  107. package/dist/context/index.d.ts.map +1 -0
  108. package/dist/context/index.js +112 -0
  109. package/dist/context/index.js.map +1 -0
  110. package/dist/index.d.ts +22 -0
  111. package/dist/index.d.ts.map +1 -0
  112. package/dist/index.js +30 -0
  113. package/dist/index.js.map +1 -0
  114. package/dist/mock/index.d.ts +27 -0
  115. package/dist/mock/index.d.ts.map +1 -0
  116. package/dist/mock/index.js +137 -0
  117. package/dist/mock/index.js.map +1 -0
  118. package/dist/mock/interceptor.d.ts +19 -0
  119. package/dist/mock/interceptor.d.ts.map +1 -0
  120. package/dist/mock/interceptor.js +128 -0
  121. package/dist/mock/interceptor.js.map +1 -0
  122. package/dist/mock/types.d.ts +100 -0
  123. package/dist/mock/types.d.ts.map +1 -0
  124. package/dist/mock/types.js +27 -0
  125. package/dist/mock/types.js.map +1 -0
  126. package/dist/mock/url.d.ts +14 -0
  127. package/dist/mock/url.d.ts.map +1 -0
  128. package/dist/mock/url.js +38 -0
  129. package/dist/mock/url.js.map +1 -0
  130. package/dist/runes/clickOutside.svelte.d.ts +29 -0
  131. package/dist/runes/clickOutside.svelte.d.ts.map +1 -0
  132. package/dist/runes/clickOutside.svelte.js +42 -0
  133. package/dist/runes/clickOutside.svelte.js.map +1 -0
  134. package/dist/runes/escape.svelte.d.ts +34 -0
  135. package/dist/runes/escape.svelte.d.ts.map +1 -0
  136. package/dist/runes/escape.svelte.js +44 -0
  137. package/dist/runes/escape.svelte.js.map +1 -0
  138. package/dist/runes/focusTrap.svelte.d.ts +21 -0
  139. package/dist/runes/focusTrap.svelte.d.ts.map +1 -0
  140. package/dist/runes/focusTrap.svelte.js +37 -0
  141. package/dist/runes/focusTrap.svelte.js.map +1 -0
  142. package/dist/runes/index.svelte.d.ts +8 -0
  143. package/dist/runes/index.svelte.d.ts.map +1 -0
  144. package/dist/runes/index.svelte.js +8 -0
  145. package/dist/runes/index.svelte.js.map +1 -0
  146. package/dist/runes/layer.svelte.d.ts +36 -0
  147. package/dist/runes/layer.svelte.d.ts.map +1 -0
  148. package/dist/runes/layer.svelte.js +48 -0
  149. package/dist/runes/layer.svelte.js.map +1 -0
  150. package/dist/runes/query.svelte.d.ts +104 -0
  151. package/dist/runes/query.svelte.d.ts.map +1 -0
  152. package/dist/runes/query.svelte.js +179 -0
  153. package/dist/runes/query.svelte.js.map +1 -0
  154. package/dist/runes/state.svelte.d.ts +72 -0
  155. package/dist/runes/state.svelte.d.ts.map +1 -0
  156. package/dist/runes/state.svelte.js +98 -0
  157. package/dist/runes/state.svelte.js.map +1 -0
  158. package/dist/runes/window.svelte.d.ts +120 -0
  159. package/dist/runes/window.svelte.d.ts.map +1 -0
  160. package/dist/runes/window.svelte.js +196 -0
  161. package/dist/runes/window.svelte.js.map +1 -0
  162. package/dist/types/index.d.ts +2 -0
  163. package/dist/types/index.d.ts.map +1 -0
  164. package/dist/types/index.js +3 -0
  165. package/dist/types/index.js.map +1 -0
  166. package/dist/types/nui.d.ts +34 -0
  167. package/dist/types/nui.d.ts.map +1 -0
  168. package/dist/types/nui.js +17 -0
  169. package/dist/types/nui.js.map +1 -0
  170. package/dist/utils/env.d.ts +21 -0
  171. package/dist/utils/env.d.ts.map +1 -0
  172. package/dist/utils/env.js +36 -0
  173. package/dist/utils/env.js.map +1 -0
  174. package/dist/utils/error.d.ts +11 -0
  175. package/dist/utils/error.d.ts.map +1 -0
  176. package/dist/utils/error.js +30 -0
  177. package/dist/utils/error.js.map +1 -0
  178. package/dist/utils/index.d.ts +3 -0
  179. package/dist/utils/index.d.ts.map +1 -0
  180. package/dist/utils/index.js +3 -0
  181. package/dist/utils/index.js.map +1 -0
  182. package/dist/utils/keyboard.d.ts +127 -0
  183. package/dist/utils/keyboard.d.ts.map +1 -0
  184. package/dist/utils/keyboard.js +152 -0
  185. package/dist/utils/keyboard.js.map +1 -0
  186. package/package.json +76 -4
  187. package/src/actions/clickOutside/clickOutside.ts +78 -0
  188. package/src/actions/clickOutside/handler.ts +49 -0
  189. package/src/actions/clickOutside/index.ts +11 -0
  190. package/src/actions/clickOutside/types.ts +54 -0
  191. package/src/actions/escape/escape.ts +90 -0
  192. package/src/actions/escape/handler.ts +52 -0
  193. package/src/actions/escape/index.ts +11 -0
  194. package/src/actions/escape/types.ts +88 -0
  195. package/src/actions/focusTrap/focusTrap.ts +228 -0
  196. package/src/actions/focusTrap/focusables.ts +155 -0
  197. package/src/actions/focusTrap/index.ts +22 -0
  198. package/src/actions/focusTrap/trapStack.ts +109 -0
  199. package/src/actions/focusTrap/types.ts +64 -0
  200. package/src/actions/index.ts +35 -0
  201. package/src/actions/layer/index.ts +13 -0
  202. package/src/actions/layer/layer.ts +140 -0
  203. package/src/actions/layer/layerStack.ts +169 -0
  204. package/src/actions/layer/types.ts +132 -0
  205. package/src/client.ts +323 -0
  206. package/src/context/index.ts +127 -0
  207. package/src/index.ts +53 -0
  208. package/src/mock/index.ts +176 -0
  209. package/src/mock/interceptor.ts +177 -0
  210. package/src/mock/types.ts +125 -0
  211. package/src/mock/url.ts +37 -0
  212. package/src/runes/clickOutside.svelte.ts +53 -0
  213. package/src/runes/escape.svelte.ts +71 -0
  214. package/src/runes/focusTrap.svelte.ts +56 -0
  215. package/src/runes/index.svelte.ts +38 -0
  216. package/src/runes/layer.svelte.ts +74 -0
  217. package/src/runes/query.svelte.ts +313 -0
  218. package/src/runes/state.svelte.ts +175 -0
  219. package/src/runes/window.svelte.ts +308 -0
  220. package/src/utils/env.ts +36 -0
  221. package/src/utils/index.ts +2 -0
  222. package/src/utils/keyboard.ts +244 -0
@@ -0,0 +1,269 @@
1
+ import { nuiFocusTrap, isNodeAllowedOutside } from './focusTrap';
2
+ import { resolveElement } from './clickOutside';
3
+ export var NuiLayerDismissReason;
4
+ (function (NuiLayerDismissReason) {
5
+ NuiLayerDismissReason["Escape"] = "escape";
6
+ NuiLayerDismissReason["Outside"] = "outside";
7
+ })(NuiLayerDismissReason || (NuiLayerDismissReason = {}));
8
+ export function toLayerOptions(input) {
9
+ if (!input)
10
+ return { enabled: true };
11
+ if (typeof input === 'function') {
12
+ return { enabled: true, onDismiss: input };
13
+ }
14
+ return input;
15
+ }
16
+ /**
17
+ * Global stack of active overlay layers.
18
+ * Manages hierarchical Escape key and outside click handling across modals, dialogs,
19
+ * drawers, and portaled overlays in FiveM NUI.
20
+ */
21
+ const layerStack = [];
22
+ let globalController = null;
23
+ let layerIdCounter = 0;
24
+ export function getLayerStack() {
25
+ return [...layerStack];
26
+ }
27
+ export function resetLayerStack() {
28
+ layerStack.length = 0;
29
+ cleanupGlobalListeners();
30
+ }
31
+ function getSortedStack() {
32
+ return [...layerStack].sort((a, b) => {
33
+ return (a.getOptions().priority ?? 0) - (b.getOptions().priority ?? 0);
34
+ });
35
+ }
36
+ export function getTopLayer() {
37
+ const sorted = getSortedStack();
38
+ for (let i = sorted.length - 1; i >= 0; i--) {
39
+ const layer = sorted[i];
40
+ const opts = layer.getOptions();
41
+ const isEnabled = typeof opts.enabled === 'function' ? opts.enabled() : (opts.enabled ?? true);
42
+ if (isEnabled && layer.node.isConnected) {
43
+ return layer;
44
+ }
45
+ }
46
+ return undefined;
47
+ }
48
+ function onGlobalKeyDown(event) {
49
+ if (event.key !== 'Escape' || event.isComposing)
50
+ return;
51
+ if (layerStack.length === 0)
52
+ return;
53
+ const sorted = getSortedStack();
54
+ // Find the topmost active layer that handles Escape
55
+ for (let i = sorted.length - 1; i >= 0; i--) {
56
+ const layer = sorted[i];
57
+ const opts = layer.getOptions();
58
+ const isEnabled = typeof opts.enabled === 'function' ? opts.enabled() : (opts.enabled ?? true);
59
+ if (!isEnabled || !layer.node.isConnected)
60
+ continue;
61
+ const handlesEscape = opts.onEscape !== false &&
62
+ (typeof opts.onEscape === 'function' || typeof opts.onDismiss === 'function');
63
+ if (!handlesEscape)
64
+ continue;
65
+ if ((opts.ignoreRepeat ?? true) && event.repeat) {
66
+ if (opts.preventEscapeDefault ?? true) {
67
+ event.preventDefault();
68
+ }
69
+ return;
70
+ }
71
+ if (opts.preventEscapeDefault ?? true) {
72
+ event.preventDefault();
73
+ }
74
+ if (opts.stopEscapePropagation) {
75
+ event.stopPropagation();
76
+ }
77
+ try {
78
+ if (typeof opts.onEscape === 'function') {
79
+ opts.onEscape(event);
80
+ }
81
+ else if (typeof opts.onDismiss === 'function') {
82
+ opts.onDismiss(NuiLayerDismissReason.Escape);
83
+ }
84
+ }
85
+ catch (err) {
86
+ console.error('[NuiLayer] Error in onEscape/onDismiss callback:', err);
87
+ }
88
+ // Only the topmost handling layer responds to Escape
89
+ return;
90
+ }
91
+ }
92
+ function onGlobalPointerDown(event) {
93
+ if (event.button !== 0 || layerStack.length === 0)
94
+ return;
95
+ const topLayer = getTopLayer();
96
+ if (!topLayer)
97
+ return;
98
+ const opts = topLayer.getOptions();
99
+ const handlesOutside = opts.onClickOutside !== false &&
100
+ (typeof opts.onClickOutside === 'function' || typeof opts.onDismiss === 'function');
101
+ if (!handlesOutside)
102
+ return;
103
+ const path = event.composedPath();
104
+ // 1. Click inside top layer node
105
+ if (path.includes(topLayer.node))
106
+ return;
107
+ // 2. Click inside any allowed outside target (e.g. portaled dropdown)
108
+ if (opts.allowOutside && isNodeAllowedOutside(event.target, opts.allowOutside)) {
109
+ return;
110
+ }
111
+ // 3. Click inside any ignoreOutside target (e.g. trigger button)
112
+ if (opts.ignoreOutside) {
113
+ for (const item of opts.ignoreOutside) {
114
+ const el = resolveElement(item);
115
+ if (el && path.includes(el))
116
+ return;
117
+ }
118
+ }
119
+ // Trigger outside click for the topmost layer only
120
+ try {
121
+ if (typeof opts.onClickOutside === 'function') {
122
+ opts.onClickOutside(event);
123
+ }
124
+ else if (typeof opts.onDismiss === 'function') {
125
+ opts.onDismiss(NuiLayerDismissReason.Outside);
126
+ }
127
+ }
128
+ catch (err) {
129
+ console.error('[NuiLayer] Error in onClickOutside/onDismiss callback:', err);
130
+ }
131
+ }
132
+ function ensureGlobalListeners() {
133
+ if (globalController || layerStack.length === 0)
134
+ return;
135
+ globalController = new AbortController();
136
+ document.addEventListener('keydown', onGlobalKeyDown, {
137
+ capture: true,
138
+ signal: globalController.signal
139
+ });
140
+ document.addEventListener('pointerdown', onGlobalPointerDown, {
141
+ capture: true,
142
+ signal: globalController.signal
143
+ });
144
+ }
145
+ function cleanupGlobalListeners() {
146
+ if (layerStack.length === 0 && globalController) {
147
+ globalController.abort();
148
+ globalController = null;
149
+ }
150
+ }
151
+ /**
152
+ * Svelte Action for managing an overlay layer in FiveM NUI.
153
+ *
154
+ * Coordinates:
155
+ * - **Escape key**: Traverses the layer stack top-to-bottom. The topmost active layer that handles Escape
156
+ * receives the event and dismisses. If the topmost layer disables Escape (`onEscape: false`),
157
+ * lower layers can handle it.
158
+ * - **Outside click**: Evaluates strictly the topmost active layer. If the topmost layer disables outside
159
+ * clicks (`onClickOutside: false`), clicks outside are blocked and do NOT fall through to underlying layers,
160
+ * preserving modal barrier isolation.
161
+ * - **Focus trap**: Integrates `nuiFocusTrap` synchronized with layer priority so focus containment and Tab
162
+ * navigation are enforced by the topmost layer even when layers have varying priorities.
163
+ * - **Portal integration**: `allowOutside` allows portaled children (selects, datepickers, tooltips)
164
+ * without triggering outside clicks or breaking focus containment.
165
+ * @param node - The DOM element attaching the layer action.
166
+ * @param parameter - Dismissal callback function or layer configuration options object.
167
+ *
168
+ * @example
169
+ * ```svelte
170
+ * <div use:nuiLayer={() => (isOpen = false)}>...</div>
171
+ * <div use:nuiLayer={{ onDismiss: close, allowOutside: '.portal-menu' }}>...</div>
172
+ * ```
173
+ */
174
+ export const nuiLayer = (node, parameter) => {
175
+ let currentParam = parameter;
176
+ let active = false;
177
+ let trapAction = null;
178
+ const id = toLayerOptions(parameter).id ?? `nui-layer-${++layerIdCounter}`;
179
+ function getOptions() {
180
+ return toLayerOptions(currentParam);
181
+ }
182
+ function isEnabled() {
183
+ const opts = getOptions();
184
+ const { enabled } = opts;
185
+ return typeof enabled === 'function' ? enabled() : (enabled ?? true);
186
+ }
187
+ const instance = {
188
+ id,
189
+ node,
190
+ getOptions
191
+ };
192
+ function syncFocusTrap() {
193
+ const opts = getOptions();
194
+ const enabled = isEnabled();
195
+ if (!enabled || opts.trapFocus === false) {
196
+ if (trapAction) {
197
+ trapAction.destroy?.();
198
+ trapAction = null;
199
+ }
200
+ return;
201
+ }
202
+ const trapConfig = typeof opts.trapFocus === 'object' ? { ...opts.trapFocus } : {};
203
+ if (trapConfig.allowOutside === undefined && opts.allowOutside !== undefined) {
204
+ trapConfig.allowOutside = opts.allowOutside;
205
+ }
206
+ if (trapConfig.initialFocus === undefined && opts.initialFocus !== undefined) {
207
+ trapConfig.initialFocus = opts.initialFocus;
208
+ }
209
+ if (trapConfig.returnFocus === undefined && opts.returnFocus !== undefined) {
210
+ trapConfig.returnFocus = opts.returnFocus;
211
+ }
212
+ if (trapConfig.autofocus === undefined && opts.autofocus !== undefined) {
213
+ trapConfig.autofocus = opts.autofocus;
214
+ }
215
+ trapConfig.enabled = enabled;
216
+ trapConfig.isTopmost = () => getTopLayer() === instance;
217
+ if (!trapAction) {
218
+ trapAction = nuiFocusTrap(node, trapConfig);
219
+ }
220
+ else {
221
+ trapAction.update?.(trapConfig);
222
+ }
223
+ }
224
+ function setup() {
225
+ if (active)
226
+ return;
227
+ active = true;
228
+ layerStack.push(instance);
229
+ ensureGlobalListeners();
230
+ syncFocusTrap();
231
+ }
232
+ function deactivate() {
233
+ if (!active)
234
+ return;
235
+ active = false;
236
+ if (trapAction) {
237
+ trapAction.destroy?.();
238
+ trapAction = null;
239
+ }
240
+ const idx = layerStack.findIndex((l) => l === instance);
241
+ if (idx !== -1) {
242
+ layerStack.splice(idx, 1);
243
+ }
244
+ cleanupGlobalListeners();
245
+ }
246
+ if (isEnabled()) {
247
+ setup();
248
+ }
249
+ return {
250
+ update(newParam) {
251
+ const wasEnabled = active;
252
+ currentParam = newParam;
253
+ const nowEnabled = isEnabled();
254
+ if (!wasEnabled && nowEnabled) {
255
+ setup();
256
+ }
257
+ else if (wasEnabled && !nowEnabled) {
258
+ deactivate();
259
+ }
260
+ else if (nowEnabled) {
261
+ syncFocusTrap();
262
+ }
263
+ },
264
+ destroy() {
265
+ deactivate();
266
+ }
267
+ };
268
+ };
269
+ //# sourceMappingURL=layer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layer.js","sourceRoot":"","sources":["../../src/actions/layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type FocusTrapAllowOutsideTarget = Element | string | null | undefined | (() => Element | null | undefined);
2
+ export type FocusTrapAllowOutside = FocusTrapAllowOutsideTarget | FocusTrapAllowOutsideTarget[];
3
+ export interface FocusTrapEntry {
4
+ node: HTMLElement;
5
+ focusFirst: () => void;
6
+ containsOrAllowed: (el: Node | null) => boolean;
7
+ isTopmost?: () => boolean | undefined;
8
+ }
9
+ /**
10
+ * Registers an active focus trap entry to the top of the trap stack.
11
+ */
12
+ export declare function pushTrap(entry: FocusTrapEntry): void;
13
+ /**
14
+ * Removes a focus trap entry associated with the given container node.
15
+ */
16
+ export declare function removeTrap(node: HTMLElement): void;
17
+ /**
18
+ * Resolves the topmost active focus trap entry.
19
+ * Evaluates custom `isTopmost` predicates first (e.g. from `nuiLayer`), where layer-managed
20
+ * traps with `isTopmost: true` always take precedence over standalone traps.
21
+ * Falls back to activation order (most recently activated connected trap).
22
+ */
23
+ export declare function getTopTrap(): FocusTrapEntry | undefined;
24
+ /**
25
+ * Resolves an element, selector, or getter from an `allowOutside` configuration.
26
+ */
27
+ export declare function resolveAllowOutsideElement(target: FocusTrapAllowOutsideTarget): Element | null;
28
+ /**
29
+ * Checks whether a given node resides within any of the elements specified in `allowOutside`.
30
+ * Supports selector strings, elements, or reactive getters.
31
+ */
32
+ export declare function isNodeAllowedOutside(target: Node | null, allowOutside?: FocusTrapAllowOutside): boolean;
33
+ //# sourceMappingURL=trapStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trapStack.d.ts","sourceRoot":"","sources":["../../src/actions/trapStack.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,2BAA2B,GACnC,OAAO,GACP,MAAM,GACN,IAAI,GACJ,SAAS,GACT,CAAC,MAAM,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAEvC,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,2BAA2B,EAAE,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,iBAAiB,EAAE,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,KAAK,OAAO,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,OAAO,GAAG,SAAS,CAAC;CACvC;AASD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAEpD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKlD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,IAAI,cAAc,GAAG,SAAS,CAavD;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,2BAA2B,GAClC,OAAO,GAAG,IAAI,CAQhB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,IAAI,GAAG,IAAI,EACnB,YAAY,CAAC,EAAE,qBAAqB,GACnC,OAAO,CAuBT"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Global stack of active focus trap entries.
3
+ * Ensures only the topmost trap (e.g. child confirmation dialog or portaled modal)
4
+ * enforces focus containment, preventing nested traps from fighting for focus.
5
+ */
6
+ const trapStack = [];
7
+ /**
8
+ * Registers an active focus trap entry to the top of the trap stack.
9
+ */
10
+ export function pushTrap(entry) {
11
+ trapStack.push(entry);
12
+ }
13
+ /**
14
+ * Removes a focus trap entry associated with the given container node.
15
+ */
16
+ export function removeTrap(node) {
17
+ const idx = trapStack.findIndex((e) => e.node === node);
18
+ if (idx !== -1) {
19
+ trapStack.splice(idx, 1);
20
+ }
21
+ }
22
+ /**
23
+ * Resolves the topmost active focus trap entry.
24
+ * Evaluates custom `isTopmost` predicates first (e.g. from `nuiLayer`), where layer-managed
25
+ * traps with `isTopmost: true` always take precedence over standalone traps.
26
+ * Falls back to activation order (most recently activated connected trap).
27
+ */
28
+ export function getTopTrap() {
29
+ for (let i = trapStack.length - 1; i >= 0; i--) {
30
+ const entry = trapStack[i];
31
+ if (entry.node.isConnected && entry.isTopmost?.() === true) {
32
+ return entry;
33
+ }
34
+ }
35
+ for (let i = trapStack.length - 1; i >= 0; i--) {
36
+ if (trapStack[i].node.isConnected) {
37
+ return trapStack[i];
38
+ }
39
+ }
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Resolves an element, selector, or getter from an `allowOutside` configuration.
44
+ */
45
+ export function resolveAllowOutsideElement(target) {
46
+ if (typeof target === 'string') {
47
+ return document.querySelector(target);
48
+ }
49
+ if (typeof target === 'function') {
50
+ return target() ?? null;
51
+ }
52
+ return target ?? null;
53
+ }
54
+ /**
55
+ * Checks whether a given node resides within any of the elements specified in `allowOutside`.
56
+ * Supports selector strings, elements, or reactive getters.
57
+ */
58
+ export function isNodeAllowedOutside(target, allowOutside) {
59
+ if (!target || !allowOutside)
60
+ return false;
61
+ const list = Array.isArray(allowOutside) ? allowOutside : [allowOutside];
62
+ const targetElement = target instanceof Element ? target : target.parentElement;
63
+ for (const item of list) {
64
+ if (!item)
65
+ continue;
66
+ if (typeof item === 'string') {
67
+ try {
68
+ if (targetElement?.closest(item)) {
69
+ return true;
70
+ }
71
+ }
72
+ catch {
73
+ // Invalid selector syntax, ignore
74
+ }
75
+ continue;
76
+ }
77
+ const el = resolveAllowOutsideElement(item);
78
+ if (el && (el === target || el.contains(target))) {
79
+ return true;
80
+ }
81
+ }
82
+ return false;
83
+ }
84
+ //# sourceMappingURL=trapStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trapStack.js","sourceRoot":"","sources":["../../src/actions/trapStack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import { NuiClient as CoreNuiClient } from '@fivem-nui/core';
2
+ import type { NuiClientOptions, NuiEventKey, NuiEventPayload, NuiEventRequest, NuiEventResponse, NuiWindowAction, SendPayload } from '@fivem-nui/core';
3
+ import { type GlobalErrorListenerOptions } from '@fivem-nui/error';
4
+ type UntypedNuiClient = Omit<InstanceType<typeof CoreNuiClient>, 'on' | 'once' | 'off' | 'send' | 'sendAndWait' | 'request' | 'callback' | 'onWindow'> & {
5
+ on(eventName: string, handler: (data: unknown) => void): () => void;
6
+ once(eventName: string, handler: (data: unknown) => void): () => void;
7
+ off(eventName: string, handler?: (data: unknown) => void): void;
8
+ send(eventName: string, payload?: unknown): void;
9
+ sendAndWait(eventName: string, payload?: unknown): Promise<void>;
10
+ request<TResponse = unknown>(eventName: string, request?: unknown, timeout?: number, signal?: AbortSignal): Promise<TResponse>;
11
+ callback(eventName: string, handler: (request: unknown) => Promise<{
12
+ success: boolean;
13
+ value?: unknown;
14
+ error?: {
15
+ code: string;
16
+ message: string;
17
+ };
18
+ }>): void;
19
+ onWindow(handler: (action: string, window: string | undefined) => void): () => void;
20
+ };
21
+ /**
22
+ * Configuration options for creating a {@link SvelteNuiClient}.
23
+ */
24
+ export interface SvelteNuiClientOptions extends Partial<NuiClientOptions> {
25
+ /**
26
+ * Optional pre-configured `@fivem-nui/core` client instance to wrap.
27
+ */
28
+ client?: InstanceType<typeof CoreNuiClient>;
29
+ /**
30
+ * Whether to automatically start listening for window `message` events upon instantiation.
31
+ * @defaultValue true
32
+ */
33
+ autoInitialize?: boolean;
34
+ /**
35
+ * Whether to install global window error & unhandled rejection listeners.
36
+ * If `true`, uses default configuration. You can also pass custom {@link GlobalErrorListenerOptions}.
37
+ * @defaultValue false
38
+ */
39
+ captureGlobalErrors?: boolean | GlobalErrorListenerOptions;
40
+ }
41
+ /**
42
+ * Svelte NUI Client adapter.
43
+ *
44
+ * Wraps `@fivem-nui/core`'s transport layer with type-safe overloads for contract maps,
45
+ * event listeners, RPC requests, and lifecycle tracking.
46
+ */
47
+ export declare class SvelteNuiClient {
48
+ private readonly _typedClient;
49
+ private readonly _client;
50
+ private readonly _listeners;
51
+ private _listening;
52
+ /**
53
+ * Creates a new SvelteNuiClient instance.
54
+ *
55
+ * @param options - Configuration options for the client adapter and underlying transport.
56
+ */
57
+ constructor(options?: SvelteNuiClientOptions);
58
+ private _ensureListening;
59
+ /**
60
+ * Subscribes to an event emitted from C# / game backend.
61
+ *
62
+ * @param eventName - Name of the event emitted by C# / game backend.
63
+ * @param handler - Callback function invoked when the event payload arrives.
64
+ * @returns Unsubscribe function to remove the event listener.
65
+ */
66
+ on<K extends NuiEventKey>(eventName: K, handler: (data: NuiEventPayload<K>) => void): () => void;
67
+ on<T = unknown>(eventName: string, handler: (data: T) => void): () => void;
68
+ /**
69
+ * Subscribes to an event once and automatically unsubscribes upon first receipt.
70
+ *
71
+ * @param eventName - Name of the event to listen for once.
72
+ * @param handler - Callback function invoked upon first receipt of the event.
73
+ * @returns Unsubscribe function to remove the one-time listener prior to firing.
74
+ */
75
+ once<K extends NuiEventKey>(eventName: K, handler: (data: NuiEventPayload<K>) => void): () => void;
76
+ once<T = unknown>(eventName: string, handler: (data: T) => void): () => void;
77
+ /**
78
+ * Removes an event listener.
79
+ *
80
+ * @param eventName - Name of the event to stop listening for.
81
+ * @param handler - Specific handler callback to remove. If omitted, removes all handlers for this event.
82
+ */
83
+ off(eventName: string, handler?: (data: unknown) => void): void;
84
+ /**
85
+ * Sends a fire-and-forget message to C# via the NUI transport layer.
86
+ *
87
+ * @param eventName - Target event name on the game backend.
88
+ * @param payload - Optional data payload to transmit.
89
+ */
90
+ send<K extends NuiEventKey>(eventName: K, payload?: SendPayload<K>): void;
91
+ send(eventName: string, payload?: unknown): void;
92
+ /**
93
+ * Sends a message to C# and awaits delivery to the transport layer.
94
+ *
95
+ * @param eventName - Target event name on the game backend.
96
+ * @param payload - Optional data payload to transmit.
97
+ * @returns Promise that resolves once the transport layer confirms transmission.
98
+ */
99
+ sendAndWait<K extends NuiEventKey>(eventName: K, payload?: SendPayload<K>): Promise<void>;
100
+ sendAndWait(eventName: string, payload?: unknown): Promise<void>;
101
+ /**
102
+ * Sends an RPC request to C# and waits for the correlated response envelope.
103
+ *
104
+ * @param eventName - RPC event name on the game backend.
105
+ * @param request - Request payload data.
106
+ * @param timeout - Request timeout in milliseconds.
107
+ * @param signal - AbortSignal to cancel the pending request.
108
+ * @returns Promise resolving to the correlated response payload from C#.
109
+ */
110
+ request<K extends NuiEventKey>(eventName: K, request?: NuiEventRequest<K>, timeout?: number, signal?: AbortSignal): Promise<NuiEventResponse<K>>;
111
+ request<TRequest = unknown, TResponse = unknown>(eventName: string, request?: TRequest, timeout?: number, signal?: AbortSignal): Promise<TResponse>;
112
+ /**
113
+ * Sends a notification to a specific native callback endpoint (e.g. `'ready'`, `'close'`).
114
+ *
115
+ * @param callbackName - Name of the native callback endpoint.
116
+ * @param payload - Optional data to send with the notification.
117
+ */
118
+ notify(callbackName: string, payload?: unknown): void;
119
+ /**
120
+ * Sends a notification and awaits HTTP transmission confirmation.
121
+ *
122
+ * @param callbackName - Name of the native callback endpoint.
123
+ * @param payload - Optional data to send with the notification.
124
+ * @returns Promise that resolves once the HTTP notification is acknowledged.
125
+ */
126
+ notifyAndWait(callbackName: string, payload?: unknown): Promise<void>;
127
+ /**
128
+ * Registers a handler for requests initiated from C# to the UI.
129
+ *
130
+ * @param eventName - Name of the incoming RPC endpoint from C#.
131
+ * @param handler - Handler function returning a promise with response envelope.
132
+ */
133
+ callback(eventName: string, handler: (request: unknown) => Promise<{
134
+ success: boolean;
135
+ value?: unknown;
136
+ error?: {
137
+ code: string;
138
+ message: string;
139
+ };
140
+ }>): void;
141
+ /**
142
+ * Unregisters an incoming RPC callback handler previously registered with {@link callback}.
143
+ *
144
+ * @param eventName - Name of the RPC endpoint to unregister.
145
+ * @returns True if a handler was registered and removed, false otherwise.
146
+ */
147
+ unregisterCallback(eventName: string): boolean;
148
+ /**
149
+ * Listens for window lifecycle actions from C# (`'open'`, `'close'`, `'focus'`, `'blur'`).
150
+ *
151
+ * @param handler - Callback invoked with the lifecycle action and target window identifier.
152
+ * @returns Unsubscribe function to remove the window action listener.
153
+ */
154
+ onWindow(handler: (action: NuiWindowAction, window: string | undefined) => void): () => void;
155
+ /**
156
+ * Starts listening for NUI message events dispatched to the window.
157
+ *
158
+ * @returns Unsubscribe function to stop listening to window messages.
159
+ */
160
+ listen(): () => void;
161
+ /**
162
+ * Returns an untyped view of the underlying transport client.
163
+ *
164
+ * @returns Untyped transport client reference.
165
+ */
166
+ getClient(): UntypedNuiClient;
167
+ /**
168
+ * Returns the underlying strongly typed `@fivem-nui/core` client instance.
169
+ *
170
+ * @returns The underlying `NuiClient` instance.
171
+ */
172
+ getTypedClient(): InstanceType<typeof CoreNuiClient>;
173
+ /**
174
+ * Cleans up all active listeners, stops listening, and disposes the underlying transport client.
175
+ */
176
+ destroy(): void;
177
+ }
178
+ export {};
179
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}