dirk-cfx-react 1.1.92 → 1.1.94

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 (65) hide show
  1. package/dist/chunk-3T2CCW5E.cjs +150 -0
  2. package/dist/chunk-3T2CCW5E.cjs.map +1 -0
  3. package/dist/chunk-4DE2IREA.cjs +9 -0
  4. package/dist/chunk-4DE2IREA.cjs.map +1 -0
  5. package/dist/chunk-E2SFEBBB.cjs +449 -0
  6. package/dist/chunk-E2SFEBBB.cjs.map +1 -0
  7. package/dist/chunk-GKSP5RIA.js +3 -0
  8. package/dist/chunk-GKSP5RIA.js.map +1 -0
  9. package/dist/chunk-HAB6H274.js +6646 -0
  10. package/dist/chunk-HAB6H274.js.map +1 -0
  11. package/dist/chunk-K3GDU6EY.cjs +6717 -0
  12. package/dist/chunk-K3GDU6EY.cjs.map +1 -0
  13. package/dist/chunk-KGLO3ZAS.js +431 -0
  14. package/dist/chunk-KGLO3ZAS.js.map +1 -0
  15. package/dist/chunk-LRGCBNZ7.cjs +4 -0
  16. package/dist/chunk-LRGCBNZ7.cjs.map +1 -0
  17. package/dist/chunk-MYNNCLMA.js +1375 -0
  18. package/dist/chunk-MYNNCLMA.js.map +1 -0
  19. package/dist/chunk-NVMOGS7Y.js +437 -0
  20. package/dist/chunk-NVMOGS7Y.js.map +1 -0
  21. package/dist/chunk-QOQQ3ERZ.cjs +445 -0
  22. package/dist/chunk-QOQQ3ERZ.cjs.map +1 -0
  23. package/dist/chunk-V6TY7KAL.js +7 -0
  24. package/dist/chunk-V6TY7KAL.js.map +1 -0
  25. package/dist/chunk-VKYONY7E.cjs +112 -0
  26. package/dist/chunk-VKYONY7E.cjs.map +1 -0
  27. package/dist/chunk-YA2PXBP6.cjs +1430 -0
  28. package/dist/chunk-YA2PXBP6.cjs.map +1 -0
  29. package/dist/chunk-Z7N5AQJW.js +146 -0
  30. package/dist/chunk-Z7N5AQJW.js.map +1 -0
  31. package/dist/chunk-ZPFW7C2A.js +108 -0
  32. package/dist/chunk-ZPFW7C2A.js.map +1 -0
  33. package/dist/components/index.cjs +282 -7760
  34. package/dist/components/index.cjs.map +1 -1
  35. package/dist/components/index.d.cts +39 -1
  36. package/dist/components/index.d.ts +39 -1
  37. package/dist/components/index.js +6 -7699
  38. package/dist/components/index.js.map +1 -1
  39. package/dist/hooks/index.cjs +75 -718
  40. package/dist/hooks/index.cjs.map +1 -1
  41. package/dist/hooks/index.d.cts +11 -1
  42. package/dist/hooks/index.d.ts +11 -1
  43. package/dist/hooks/index.js +5 -701
  44. package/dist/hooks/index.js.map +1 -1
  45. package/dist/index.cjs +572 -9066
  46. package/dist/index.cjs.map +1 -1
  47. package/dist/index.d.cts +3 -3
  48. package/dist/index.d.ts +3 -3
  49. package/dist/index.js +9 -8928
  50. package/dist/index.js.map +1 -1
  51. package/dist/modelNames-QIAIYORH.cjs +53910 -0
  52. package/dist/modelNames-QIAIYORH.cjs.map +1 -0
  53. package/dist/modelNames-WAUYJLL3.js +53908 -0
  54. package/dist/modelNames-WAUYJLL3.js.map +1 -0
  55. package/dist/providers/index.cjs +11 -596
  56. package/dist/providers/index.cjs.map +1 -1
  57. package/dist/providers/index.js +5 -596
  58. package/dist/providers/index.js.map +1 -1
  59. package/dist/utils/index.cjs +186 -1361
  60. package/dist/utils/index.cjs.map +1 -1
  61. package/dist/utils/index.d.cts +41 -1
  62. package/dist/utils/index.d.ts +41 -1
  63. package/dist/utils/index.js +2 -1324
  64. package/dist/utils/index.js.map +1 -1
  65. package/package.json +1 -1
@@ -0,0 +1,1375 @@
1
+ import { useEffect, useMemo } from 'react';
2
+ import { create } from 'zustand';
3
+ import { z } from 'zod';
4
+ import axios from 'axios';
5
+
6
+ // src/utils/colorWithAlpha.ts
7
+ var colorNames = {
8
+ AliceBlue: { r: 240, g: 248, b: 255 },
9
+ AntiqueWhite: { r: 250, g: 235, b: 215 },
10
+ Aqua: { r: 0, g: 255, b: 255 },
11
+ Aquamarine: { r: 127, g: 255, b: 212 },
12
+ Azure: { r: 240, g: 255, b: 255 },
13
+ Beige: { r: 245, g: 245, b: 220 },
14
+ Bisque: { r: 255, g: 228, b: 196 },
15
+ Black: { r: 0, g: 0, b: 0 },
16
+ BlanchedAlmond: { r: 255, g: 235, b: 205 },
17
+ Blue: { r: 0, g: 0, b: 255 },
18
+ BlueViolet: { r: 138, g: 43, b: 226 },
19
+ Brown: { r: 165, g: 42, b: 42 },
20
+ BurlyWood: { r: 222, g: 184, b: 135 },
21
+ CadetBlue: { r: 95, g: 158, b: 160 },
22
+ Chartreuse: { r: 127, g: 255, b: 0 },
23
+ Chocolate: { r: 210, g: 105, b: 30 },
24
+ Coral: { r: 255, g: 127, b: 80 },
25
+ CornflowerBlue: { r: 100, g: 149, b: 237 },
26
+ Cornsilk: { r: 255, g: 248, b: 220 },
27
+ Crimson: { r: 220, g: 20, b: 60 },
28
+ Cyan: { r: 0, g: 255, b: 255 },
29
+ DarkBlue: { r: 0, g: 0, b: 139 },
30
+ DarkCyan: { r: 0, g: 139, b: 139 },
31
+ DarkGoldenRod: { r: 184, g: 134, b: 11 },
32
+ DarkGray: { r: 169, g: 169, b: 169 },
33
+ DarkGreen: { r: 0, g: 100, b: 0 },
34
+ DarkKhaki: { r: 189, g: 183, b: 107 },
35
+ DarkMagenta: { r: 139, g: 0, b: 139 },
36
+ DarkOliveGreen: { r: 85, g: 107, b: 47 },
37
+ DarkOrange: { r: 255, g: 140, b: 0 },
38
+ DarkOrchid: { r: 153, g: 50, b: 204 },
39
+ DarkRed: { r: 139, g: 0, b: 0 },
40
+ DarkSalmon: { r: 233, g: 150, b: 122 },
41
+ DarkSeaGreen: { r: 143, g: 188, b: 143 },
42
+ DarkSlateBlue: { r: 72, g: 61, b: 139 },
43
+ DarkSlateGray: { r: 47, g: 79, b: 79 },
44
+ DarkTurquoise: { r: 0, g: 206, b: 209 },
45
+ DarkViolet: { r: 148, g: 0, b: 211 },
46
+ DeepPink: { r: 255, g: 20, b: 147 },
47
+ DeepSkyBlue: { r: 0, g: 191, b: 255 },
48
+ DimGray: { r: 105, g: 105, b: 105 },
49
+ DodgerBlue: { r: 30, g: 144, b: 255 },
50
+ FireBrick: { r: 178, g: 34, b: 34 },
51
+ FloralWhite: { r: 255, g: 250, b: 240 },
52
+ ForestGreen: { r: 34, g: 139, b: 34 },
53
+ Fuchsia: { r: 255, g: 0, b: 255 },
54
+ Gainsboro: { r: 220, g: 220, b: 220 },
55
+ GhostWhite: { r: 248, g: 248, b: 255 },
56
+ Gold: { r: 255, g: 215, b: 0 },
57
+ GoldenRod: { r: 218, g: 165, b: 32 },
58
+ Gray: { r: 128, g: 128, b: 128 },
59
+ Green: { r: 0, g: 128, b: 0 },
60
+ GreenYellow: { r: 173, g: 255, b: 47 },
61
+ HoneyDew: { r: 240, g: 255, b: 240 },
62
+ HotPink: { r: 255, g: 105, b: 180 },
63
+ IndianRed: { r: 205, g: 92, b: 92 },
64
+ Indigo: { r: 75, g: 0, b: 130 },
65
+ Ivory: { r: 255, g: 255, b: 240 },
66
+ Khaki: { r: 240, g: 230, b: 140 },
67
+ Lavender: { r: 230, g: 230, b: 250 },
68
+ LavenderBlush: { r: 255, g: 240, b: 245 },
69
+ LawnGreen: { r: 124, g: 252, b: 0 },
70
+ LemonChiffon: { r: 255, g: 250, b: 205 },
71
+ LightBlue: { r: 173, g: 216, b: 230 },
72
+ LightCoral: { r: 240, g: 128, b: 128 },
73
+ LightCyan: { r: 224, g: 255, b: 255 },
74
+ LightGoldenRodYellow: { r: 250, g: 250, b: 210 },
75
+ LightGray: { r: 211, g: 211, b: 211 },
76
+ LightGreen: { r: 144, g: 238, b: 144 },
77
+ LightPink: { r: 255, g: 182, b: 193 },
78
+ LightSalmon: { r: 255, g: 160, b: 122 },
79
+ LightSeaGreen: { r: 32, g: 178, b: 170 },
80
+ LightSkyBlue: { r: 135, g: 206, b: 250 },
81
+ LightSlateGray: { r: 119, g: 136, b: 153 },
82
+ LightSteelBlue: { r: 176, g: 196, b: 222 },
83
+ LightYellow: { r: 255, g: 255, b: 224 },
84
+ Lime: { r: 0, g: 255, b: 0 },
85
+ LimeGreen: { r: 50, g: 205, b: 50 },
86
+ Linen: { r: 250, g: 240, b: 230 },
87
+ Magenta: { r: 255, g: 0, b: 255 },
88
+ Maroon: { r: 128, g: 0, b: 0 },
89
+ // Maroon
90
+ MediumAquaMarine: { r: 102, g: 205, b: 170 },
91
+ MediumBlue: { r: 0, g: 0, b: 205 },
92
+ MediumOrchid: { r: 186, g: 85, b: 211 },
93
+ MediumPurple: { r: 147, g: 112, b: 219 },
94
+ MediumSeaGreen: { r: 60, g: 179, b: 113 },
95
+ MediumSlateBlue: { r: 123, g: 104, b: 238 },
96
+ MediumSpringGreen: { r: 0, g: 250, b: 154 },
97
+ MediumTurquoise: { r: 72, g: 209, b: 204 },
98
+ MediumVioletRed: { r: 199, g: 21, b: 133 },
99
+ MidnightBlue: { r: 25, g: 25, b: 112 },
100
+ MintCream: { r: 245, g: 255, b: 250 },
101
+ MistyRose: { r: 255, g: 228, b: 225 },
102
+ Moccasin: { r: 255, g: 228, b: 181 },
103
+ NavajoWhite: { r: 255, g: 222, b: 173 },
104
+ Navy: { r: 0, g: 0, b: 128 },
105
+ OldLace: { r: 253, g: 245, b: 230 },
106
+ Olive: { r: 128, g: 128, b: 0 },
107
+ OliveDrab: { r: 107, g: 142, b: 35 },
108
+ Orange: { r: 255, g: 165, b: 0 },
109
+ OrangeRed: { r: 255, g: 69, b: 0 },
110
+ Orchid: { r: 218, g: 112, b: 214 },
111
+ PaleGoldenRod: { r: 238, g: 232, b: 170 },
112
+ PaleGreen: { r: 152, g: 251, b: 152 },
113
+ PaleTurquoise: { r: 175, g: 238, b: 238 },
114
+ PaleVioletRed: { r: 219, g: 112, b: 147 },
115
+ PapayaWhip: { r: 255, g: 239, b: 213 },
116
+ PeachPuff: { r: 255, g: 218, b: 185 },
117
+ Peru: { r: 205, g: 133, b: 63 },
118
+ Pink: { r: 255, g: 192, b: 203 },
119
+ Plum: { r: 221, g: 160, b: 221 },
120
+ PowderBlue: { r: 176, g: 224, b: 230 },
121
+ Purple: { r: 128, g: 0, b: 128 },
122
+ RebeccaPurple: { r: 102, g: 51, b: 153 },
123
+ Red: { r: 255, g: 0, b: 0 },
124
+ RosyBrown: { r: 188, g: 143, b: 143 },
125
+ RoyalBlue: { r: 65, g: 105, b: 225 },
126
+ SaddleBrown: { r: 139, g: 69, b: 19 },
127
+ Salmon: { r: 250, g: 128, b: 114 },
128
+ SandyBrown: { r: 244, g: 164, b: 96 },
129
+ SeaGreen: { r: 46, g: 139, b: 87 },
130
+ SeaShell: { r: 255, g: 245, b: 238 },
131
+ Sienna: { r: 160, g: 82, b: 45 },
132
+ Silver: { r: 192, g: 192, b: 192 },
133
+ SkyBlue: { r: 135, g: 206, b: 235 },
134
+ SlateBlue: { r: 106, g: 90, b: 205 },
135
+ SlateGray: { r: 112, g: 128, b: 144 },
136
+ Snow: { r: 255, g: 250, b: 250 },
137
+ SpringGreen: { r: 0, g: 255, b: 127 },
138
+ SteelBlue: { r: 70, g: 130, b: 180 },
139
+ Tan: { r: 210, g: 180, b: 140 },
140
+ Teal: { r: 0, g: 128, b: 128 },
141
+ Thistle: { r: 216, g: 191, b: 216 },
142
+ Tomato: { r: 255, g: 99, b: 71 },
143
+ Turquoise: { r: 64, g: 224, b: 208 },
144
+ Violet: { r: 238, g: 130, b: 238 },
145
+ Wheat: { r: 245, g: 222, b: 179 },
146
+ White: { r: 255, g: 255, b: 255 },
147
+ WhiteSmoke: { r: 245, g: 245, b: 245 },
148
+ Yellow: { r: 255, g: 255, b: 0 },
149
+ YellowGreen: { r: 154, g: 205, b: 50 }
150
+ };
151
+ function colorWithAlpha(color, alpha) {
152
+ const lowerCasedColor = color.toLowerCase();
153
+ if (colorNames[lowerCasedColor]) {
154
+ const rgb = colorNames[lowerCasedColor];
155
+ return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha})`;
156
+ }
157
+ if (/^#([A-Fa-f0-9]{6})$/.test(color)) {
158
+ const hex = color.slice(1);
159
+ const bigint = parseInt(hex, 16);
160
+ const r = bigint >> 16 & 255;
161
+ const g = bigint >> 8 & 255;
162
+ const b = bigint & 255;
163
+ return `rgba(${r}, ${g}, ${b}, ${alpha})`;
164
+ }
165
+ if (/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/.test(color)) {
166
+ const result = color.match(/^rgb\((\d{1,3}), (\d{1,3}), (\d{1,3})\)$/);
167
+ if (result) {
168
+ return `rgba(${result[1]}, ${result[2]}, ${result[3]}, ${alpha})`;
169
+ }
170
+ }
171
+ return color;
172
+ }
173
+
174
+ // src/utils/misc.ts
175
+ var isEnvBrowser = () => !window.invokeNative;
176
+ var noop = () => {
177
+ };
178
+ var splitFAString = (faString) => {
179
+ const [prefix, newIcon] = faString.split("-");
180
+ if (!prefix || !newIcon) return { prefix: "fas", newIcon: "question" };
181
+ return { prefix, newIcon };
182
+ };
183
+ var numberToRoman = (num) => {
184
+ const romanNumerals = ["I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX", "X", "XI", "XII", "XIII", "XIV", "XV", "XVI", "XVII", "XVIII", "XIX", "XX"];
185
+ return romanNumerals[num];
186
+ };
187
+ var copyToClipboard = (text) => {
188
+ const el = document.createElement("textarea");
189
+ el.value = text;
190
+ document.body.appendChild(el);
191
+ el.select();
192
+ document.execCommand("copy");
193
+ document.body.removeChild(el);
194
+ };
195
+ var openLink = (url) => {
196
+ if (isEnvBrowser()) {
197
+ window.open(url, "_blank");
198
+ } else {
199
+ window.invokeNative("openLink", url);
200
+ }
201
+ };
202
+ var DEFAULT_PALETTE = [
203
+ "#f0f4ff",
204
+ "#d9e3ff",
205
+ "#bfcfff",
206
+ "#a6bbff",
207
+ "#8ca7ff",
208
+ "#7393ff",
209
+ "#5a7fff",
210
+ "#406bff",
211
+ "#2547ff",
212
+ "#0b33ff"
213
+ ];
214
+ var ThemeOverrideSchema = z.object({
215
+ useOverride: z.boolean(),
216
+ primaryColor: z.string(),
217
+ primaryShade: z.number(),
218
+ customTheme: z.array(z.string())
219
+ });
220
+ var defaultThemeOverride = {
221
+ useOverride: false,
222
+ primaryColor: "dirk",
223
+ primaryShade: 5,
224
+ customTheme: DEFAULT_PALETTE
225
+ };
226
+
227
+ // src/utils/useSettings.ts
228
+ var useSettings = create(() => ({
229
+ currency: "$",
230
+ game: "fivem",
231
+ primaryColor: "dirk",
232
+ primaryShade: 9,
233
+ itemImgPath: "",
234
+ resourceVersion: "dev",
235
+ customTheme: DEFAULT_PALETTE
236
+ }));
237
+
238
+ // src/utils/fetchNui.ts
239
+ async function fetchNui(eventName, data, mockData) {
240
+ const options = {
241
+ method: "post",
242
+ headers: {
243
+ "Content-Type": "application/json; charset=UTF-8"
244
+ },
245
+ body: JSON.stringify(data)
246
+ };
247
+ if (isEnvBrowser() && mockData !== void 0) return mockData;
248
+ if (isEnvBrowser() && mockData === void 0) {
249
+ console.warn(
250
+ `[fetchNui] Called fetchNui for event "${eventName}" in browser environment without mockData. Returning empty object.`
251
+ );
252
+ return {};
253
+ }
254
+ const overrideResourceName = useSettings.getState().overideResourceName;
255
+ const hasResourceContext = typeof window.GetParentResourceName === "function" || !!overrideResourceName;
256
+ if (!hasResourceContext) {
257
+ return mockData ?? {};
258
+ }
259
+ const resourceName = window.GetParentResourceName ? window.GetParentResourceName() : overrideResourceName;
260
+ try {
261
+ const resp = await fetch(`https://${resourceName}/${eventName}`, options);
262
+ return await resp.json();
263
+ } catch {
264
+ return mockData ?? {};
265
+ }
266
+ }
267
+ var initialFetches = {};
268
+ async function registerInitialFetch(eventName, data, mockData) {
269
+ const fetcher = () => fetchNui(eventName, data, mockData);
270
+ initialFetches[eventName] = fetcher;
271
+ return fetcher();
272
+ }
273
+ async function runFetches() {
274
+ return Promise.all(
275
+ Object.entries(initialFetches).map(async ([eventName, fetcher]) => {
276
+ const data = await fetcher();
277
+ return { eventName, data };
278
+ })
279
+ );
280
+ }
281
+ var useAutoFetcher = () => {
282
+ useEffect(() => {
283
+ if (isEnvBrowser()) return;
284
+ runFetches().catch(() => {
285
+ });
286
+ }, []);
287
+ };
288
+ var fetchLuaTable = (tableName, mockData) => {
289
+ return fetchNui("FETCH_LUA_TABLE", { tableName }, mockData);
290
+ };
291
+ var registerInitialLuaTableFetch = (tableName, mockData) => {
292
+ return registerInitialFetch("FETCH_LUA_TABLE", { tableName }, mockData);
293
+ };
294
+
295
+ // src/utils/internalEvent.ts
296
+ var internalEvent = (events, timer = 1e3) => {
297
+ if (isEnvBrowser()) {
298
+ for (const event of events) {
299
+ setTimeout(() => {
300
+ window.dispatchEvent(
301
+ new MessageEvent("message", {
302
+ data: {
303
+ action: event.action,
304
+ data: event.data
305
+ }
306
+ })
307
+ );
308
+ }, timer);
309
+ }
310
+ }
311
+ };
312
+ var reportedMissing = /* @__PURE__ */ new Set();
313
+ function reportMissingLocale(key) {
314
+ if (!key || reportedMissing.has(key)) return;
315
+ reportedMissing.add(key);
316
+ fetchNui("REPORT_MISSING_LOCALE", { key }).catch(() => {
317
+ });
318
+ }
319
+ var PACKAGE_DEFAULTS = {
320
+ "OccupantsDesc": "Here you can view and manage the occupants of your traphouse. These occupants can be used mainly for selling drugs to the NPCs surrounding your traphouse. However they have other uses to so be careful who you add as an occupant.",
321
+ "cfgpanel_discard": "Discard",
322
+ "cfgpanel_manual_edit": "Manual Edit",
323
+ "cfgpanel_reset_defaults": "Reset Defaults",
324
+ "cfgpanel_version": "Version",
325
+ "cfgpanel_back_title": "Back to script list",
326
+ "cfgpanel_undo": "Undo",
327
+ "cfgpanel_redo": "Redo",
328
+ "cfgpanel_save": "Save",
329
+ "cfgpanel_saving": "Saving...",
330
+ "cfgpanel_history": "History",
331
+ "cfgpanel_reset_title": "Reset to Defaults",
332
+ "cfgpanel_reset_desc": "This will permanently reset ALL config back to the defaults. Every value you have configured will be overwritten. This cannot be undone.",
333
+ "cfgpanel_reset_confirm": "Reset Config",
334
+ "cfgpanel_discard_title": "Discard Unsaved Changes?",
335
+ "cfgpanel_discard_desc_back": "You have unsaved changes. Going back now will discard them.",
336
+ "cfgpanel_discard_desc_close": "You have unsaved changes. Closing now will discard them.",
337
+ "cfgpanel_discard_confirm_back": "Go Back Without Saving",
338
+ "cfgpanel_discard_confirm_close": "Close Without Saving",
339
+ "cfgpanel_json_title": "Config JSON",
340
+ "cfgpanel_cancel": "Cancel",
341
+ "cfgpanel_apply": "Apply",
342
+ "cfgpanel_history_title": "Config History",
343
+ "cfgpanel_close": "Close"
344
+ };
345
+ var localeStore = create((set, get) => {
346
+ return {
347
+ locales: { ...PACKAGE_DEFAULTS },
348
+ locale: (key, ...args) => {
349
+ const exists = get().locales[key];
350
+ if (!exists) reportMissingLocale(key);
351
+ let translation = exists || key;
352
+ if (args.length) {
353
+ translation = translation.replace(/%s/g, () => String(args.shift() || ""));
354
+ }
355
+ return translation;
356
+ }
357
+ };
358
+ });
359
+ var locale = localeStore.getState().locale;
360
+ registerInitialFetch("GET_LOCALES", void 0).then((data) => {
361
+ localeStore.setState({ locales: { ...PACKAGE_DEFAULTS, ...data } });
362
+ }).catch(() => {
363
+ });
364
+ if (typeof window !== "undefined") {
365
+ window.addEventListener("message", (event) => {
366
+ const msg = event.data;
367
+ if (!msg || msg.action !== "UPDATE_DIRK_LIB_LOCALES") return;
368
+ if (!msg.data || typeof msg.data !== "object") return;
369
+ if (Object.keys(msg.data).length === 0) return;
370
+ localeStore.setState({ locales: { ...PACKAGE_DEFAULTS, ...msg.data } });
371
+ });
372
+ }
373
+
374
+ // src/utils/map.ts
375
+ var mapCenter = [-119.43, 58.84];
376
+ var latPr100 = 1.421;
377
+ function gameToMap(x, y) {
378
+ return [
379
+ mapCenter[0] + latPr100 / 100 * y,
380
+ // lng
381
+ mapCenter[1] + latPr100 / 100 * x
382
+ // lat
383
+ ];
384
+ }
385
+ function mapToGame(lat, lng) {
386
+ return [
387
+ (lng - mapCenter[1]) * 100 / latPr100,
388
+ (lat - mapCenter[0]) * 100 / latPr100
389
+ ];
390
+ }
391
+ var useProfanityStore = create(() => [
392
+ "ars3",
393
+ "a55",
394
+ "a55hole",
395
+ "ahole",
396
+ "anus",
397
+ "ash0le",
398
+ "ash0les",
399
+ "asholes",
400
+ "4r5e",
401
+ "5h1t",
402
+ "5hit",
403
+ "a55",
404
+ "anal",
405
+ "anus",
406
+ "ar5e",
407
+ "arrse",
408
+ "arse",
409
+ "ass",
410
+ "ass-fucker",
411
+ "asses",
412
+ "assfucker",
413
+ "assfukka",
414
+ "asshole",
415
+ "assholes",
416
+ "asswhole",
417
+ "a_s_s",
418
+ "b!tch",
419
+ "b00bs",
420
+ "b17ch",
421
+ "b1tch",
422
+ "ballsack",
423
+ "beastial",
424
+ "beastiality",
425
+ "bestial",
426
+ "bestiality",
427
+ "bi+ch",
428
+ "biatch",
429
+ "bitch",
430
+ "bitcher",
431
+ "bitchers",
432
+ "bitches",
433
+ "bitchin",
434
+ "bitching",
435
+ "blow job",
436
+ "blowjob",
437
+ "blowjobs",
438
+ "boiolas",
439
+ "bollock",
440
+ "bollok",
441
+ "boner",
442
+ "boob",
443
+ "boobs",
444
+ "booobs",
445
+ "boooobs",
446
+ "booooobs",
447
+ "booooooobs",
448
+ "breasts",
449
+ "buceta",
450
+ "bunny fucker",
451
+ "butthole",
452
+ "buttmuch",
453
+ "buttplug",
454
+ "c0ck",
455
+ "c0cksucker",
456
+ "carpet muncher",
457
+ "chink",
458
+ "cipa",
459
+ "cl1t",
460
+ "clit",
461
+ "clitoris",
462
+ "clits",
463
+ "cnut",
464
+ "cock",
465
+ "cock-sucker",
466
+ "cockface",
467
+ "cockhead",
468
+ "cockmunch",
469
+ "cockmuncher",
470
+ "cocks",
471
+ "cocksuck",
472
+ "cocksucked",
473
+ "cocksucker",
474
+ "cocksucking",
475
+ "cocksucks",
476
+ "cocksuka",
477
+ "cocksukka",
478
+ "cokmuncher",
479
+ "coksucka",
480
+ "coon",
481
+ "cum",
482
+ "cummer",
483
+ "cumming",
484
+ "cums",
485
+ "cumshot",
486
+ "cunilingus",
487
+ "cunillingus",
488
+ "cunnilingus",
489
+ "cunt",
490
+ "cuntlick",
491
+ "cuntlicker",
492
+ "cuntlicking",
493
+ "cunts",
494
+ "cyalis",
495
+ "cyberfuc",
496
+ "cyberfuck",
497
+ "cyberfucked",
498
+ "cyberfucker",
499
+ "cyberfuckers",
500
+ "cyberfucking",
501
+ "d1ck",
502
+ "dlck",
503
+ "dog-fucker",
504
+ "doggin",
505
+ "dogging",
506
+ "donkeyribber",
507
+ "dyke",
508
+ "ejaculate",
509
+ "ejaculated",
510
+ "ejaculates",
511
+ "ejaculating",
512
+ "ejaculatings",
513
+ "ejaculation",
514
+ "ejakulate",
515
+ "f u c k",
516
+ "f u c k e r",
517
+ "f4nny",
518
+ "fag",
519
+ "fagging",
520
+ "faggitt",
521
+ "faggot",
522
+ "faggs",
523
+ "fagot",
524
+ "fagots",
525
+ "fags",
526
+ "fannyflaps",
527
+ "fannyfucker",
528
+ "fatass",
529
+ "fcuk",
530
+ "fcuker",
531
+ "fcuking",
532
+ "feck",
533
+ "fecker",
534
+ "felching",
535
+ "fellate",
536
+ "fellatio",
537
+ "fingerfuck",
538
+ "fingerfucked",
539
+ "fingerfucker",
540
+ "fingerfuckers",
541
+ "fingerfucking",
542
+ "fingerfucks",
543
+ "fistfuck",
544
+ "fistfucked",
545
+ "fistfucker",
546
+ "fistfuckers",
547
+ "fistfucking",
548
+ "fistfuckings",
549
+ "fistfucks",
550
+ "fuck",
551
+ "fucka",
552
+ "fucked",
553
+ "fucker",
554
+ "fuckers",
555
+ "fuckhead",
556
+ "fuckheads",
557
+ "fuckin",
558
+ "fucking",
559
+ "fuckings",
560
+ "fuckingshitmotherfucker",
561
+ "fuckme",
562
+ "fucks",
563
+ "fuckwhit",
564
+ "fuckwit",
565
+ "fudge packer",
566
+ "fudgepacker",
567
+ "fuk",
568
+ "fuker",
569
+ "fukker",
570
+ "fukkin",
571
+ "fuks",
572
+ "fukwhit",
573
+ "fukwit",
574
+ "fux",
575
+ "fux0r",
576
+ "f_u_c_k",
577
+ "gangbang",
578
+ "gangbanged",
579
+ "gangbangs",
580
+ "gaysex",
581
+ "God",
582
+ "god-dam",
583
+ "god-damned",
584
+ "goddamn",
585
+ "goddamned",
586
+ "homo",
587
+ "jack-off",
588
+ "jerk-off",
589
+ "l3i+ch",
590
+ "l3itch",
591
+ "labia",
592
+ "lusting",
593
+ "m0f0",
594
+ "m0fo",
595
+ "m45terbate",
596
+ "ma5terb8",
597
+ "ma5terbate",
598
+ "masochist",
599
+ "master-bate",
600
+ "masterb8",
601
+ "masterbat*",
602
+ "masterbat3",
603
+ "masterbate",
604
+ "masterbation",
605
+ "masterbations",
606
+ "masturbate",
607
+ "mo-fo",
608
+ "mof0",
609
+ "mothafuck",
610
+ "mothafucka",
611
+ "mothafuckas",
612
+ "mothafuckaz",
613
+ "mothafucked",
614
+ "mothafucker",
615
+ "mothafuckers",
616
+ "mothafuckin",
617
+ "mothafucking",
618
+ "mothafuckings",
619
+ "mothafucks",
620
+ "mother fucker",
621
+ "motherfuck",
622
+ "motherfucked",
623
+ "motherfucker",
624
+ "motherfuckers",
625
+ "motherfuckin",
626
+ "motherfucking",
627
+ "motherfuckings",
628
+ "motherfuckka",
629
+ "motherfucks",
630
+ "muthafecker",
631
+ "muthafuckker",
632
+ "mutherfucker",
633
+ "n1gga",
634
+ "n1gger",
635
+ "nazi",
636
+ "nigg3r",
637
+ "nigg4h",
638
+ "nigga",
639
+ "niggah",
640
+ "niggas",
641
+ "niggaz",
642
+ "nigger",
643
+ "niggers",
644
+ "nob jokey",
645
+ "nobjocky",
646
+ "nobjokey",
647
+ "orgasim",
648
+ "orgasims",
649
+ "orgasm",
650
+ "orgasms",
651
+ "p0rn",
652
+ "penis",
653
+ "penisfucker",
654
+ "phonesex",
655
+ "phuck",
656
+ "phuked",
657
+ "phuking",
658
+ "phukked",
659
+ "phukking",
660
+ "phuks",
661
+ "phuq",
662
+ "pigfucker",
663
+ "pimpis",
664
+ "piss",
665
+ "pissed",
666
+ "pisser",
667
+ "pissers",
668
+ "pisses",
669
+ "pissflaps",
670
+ "pissin",
671
+ "pissing",
672
+ "pissoff",
673
+ "poop",
674
+ "porn",
675
+ "porno",
676
+ "pornography",
677
+ "pornos",
678
+ "prick",
679
+ "pricks",
680
+ "pron",
681
+ "pube",
682
+ "pusse",
683
+ "pussi",
684
+ "pussies",
685
+ "pussy",
686
+ "pussys",
687
+ "rectum",
688
+ "retard",
689
+ "rimjaw",
690
+ "rimming",
691
+ "s hit",
692
+ "s.o.b.",
693
+ "scroat",
694
+ "scrote",
695
+ "scrotum",
696
+ "semen",
697
+ "sex",
698
+ "sh!+",
699
+ "sh!t",
700
+ "sh1t",
701
+ "shemale",
702
+ "shit",
703
+ "shitdick",
704
+ "shite",
705
+ "shited",
706
+ "shitey",
707
+ "shitfuck",
708
+ "shitfull",
709
+ "shithead",
710
+ "shiting",
711
+ "shitings",
712
+ "shits",
713
+ "shitted",
714
+ "shitter",
715
+ "shitters",
716
+ "shitting",
717
+ "shittings",
718
+ "shitty",
719
+ "skank",
720
+ "slut",
721
+ "sluts",
722
+ "smegma",
723
+ "smut",
724
+ "son-of-a-bitch",
725
+ "spac",
726
+ "s_h_i_t",
727
+ "t1tt1e5",
728
+ "t1tties",
729
+ "teets",
730
+ "teez",
731
+ "testical",
732
+ "testicle",
733
+ "titfuck",
734
+ "tits",
735
+ "titt",
736
+ "tittie5",
737
+ "tittiefucker",
738
+ "titties",
739
+ "tittyfuck",
740
+ "tittywank",
741
+ "titwank",
742
+ "tosser",
743
+ "tw4t",
744
+ "twat",
745
+ "twathead",
746
+ "twatty",
747
+ "twunt",
748
+ "twunter",
749
+ "v14gra",
750
+ "v1gra",
751
+ "vagina",
752
+ "viagra",
753
+ "vulva",
754
+ "w00se",
755
+ "whoar",
756
+ "whore",
757
+ "xrated"
758
+ ]);
759
+ var isProfanity = (word) => {
760
+ const all = useProfanityStore.getState();
761
+ const profanityArray = Array.isArray(all) ? all : typeof all === "object" && all !== null ? Object.values(all) : [];
762
+ return profanityArray.includes(word);
763
+ };
764
+ function calculateXPForLevel(level, settings) {
765
+ if (level < settings.baseLevel) return 0;
766
+ if (level === 1) return 0;
767
+ if (level === 2) return settings.baseXP;
768
+ let totalXP = settings.baseXP;
769
+ for (let i = 2; i <= level - 1; i++) {
770
+ const baseRuneScapeXP = Math.floor((i + 300 * 2 ** (i / 7)) / 4);
771
+ totalXP += baseRuneScapeXP * settings.modifier;
772
+ }
773
+ return Math.floor(totalXP);
774
+ }
775
+ function generateLevelMap(settings) {
776
+ const levelMap = {};
777
+ for (let level = settings.baseLevel; level <= settings.maxLevel; level++) {
778
+ levelMap[level.toString()] = calculateXPForLevel(level, settings);
779
+ }
780
+ return levelMap;
781
+ }
782
+ function getLevelFromXP(xp, levelMap, settings) {
783
+ for (let level = settings.baseLevel; level <= settings.maxLevel; level++) {
784
+ const xpForLevel = levelMap[level.toString()];
785
+ if (xpForLevel > xp) return level - 1;
786
+ }
787
+ return settings.maxLevel;
788
+ }
789
+ function createSkill(defaultSettings) {
790
+ const useStore = create((set) => ({
791
+ settings: defaultSettings,
792
+ levelMap: generateLevelMap(defaultSettings),
793
+ setSettings: (updater) => set((state) => {
794
+ const newSettings = typeof updater === "function" ? updater(state.settings) : updater;
795
+ return {
796
+ settings: newSettings,
797
+ levelMap: generateLevelMap(newSettings)
798
+ };
799
+ })
800
+ }));
801
+ const useSkill = (xp) => {
802
+ const { settings, levelMap } = useStore();
803
+ return useMemo(() => {
804
+ const currentLevel = getLevelFromXP(xp, levelMap, settings);
805
+ const nextLevel = Math.min(currentLevel + 1, settings.maxLevel);
806
+ const currentLevelXP = levelMap[currentLevel.toString()] || 0;
807
+ const nextLevelXP = levelMap[nextLevel.toString()] || 0;
808
+ const xpInCurrentLevel = xp - currentLevelXP;
809
+ const xpRequiredForLevel = nextLevelXP - currentLevelXP;
810
+ const progressToLevel = xpRequiredForLevel > 0 ? xpInCurrentLevel / xpRequiredForLevel * 100 : 100;
811
+ const xpToNextLevel = Math.max(0, nextLevelXP - xp);
812
+ const prevLevelXP = calculateXPForLevel(currentLevel - 1, settings);
813
+ return {
814
+ currentLevel,
815
+ nextLevel,
816
+ currentLevelXP,
817
+ prevLevelXP,
818
+ nextLevelXP,
819
+ progressToLevel: Math.min(100, Math.max(0, progressToLevel)),
820
+ xpToNextLevel
821
+ };
822
+ }, [xp, levelMap, settings]);
823
+ };
824
+ const skill = {
825
+ get settings() {
826
+ return useStore.getState().settings;
827
+ },
828
+ setSettings: (updater) => {
829
+ useStore.getState().setSettings(updater);
830
+ },
831
+ useSettings: () => useStore((state) => state.settings)
832
+ };
833
+ return {
834
+ skill,
835
+ useSkill
836
+ };
837
+ }
838
+ var dummyURL = "https://fmapi.net/api/v2/presigned-url/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJON0UxM0tzejFRM0NuSzRHWFBPbmUiLCJ0ZWFtSWQiOiJlMDQ1YnpwZzg5TGpoaUFTaURIdVoiLCJmaWxlVHlwZSI6ImltYWdlIiwidG9rZW5JZCI6ImpwczJ4Z0M1eFZqcnRoeWZTZnFsYSIsInNldHRpbmdzIjp7IlRlYW1JRCI6ImUwNDVienBnODlMamhpQVNpREh1WiIsIkltYWdlTm90aWZpY2F0aW9uVHlwZSI6IiIsIkRpc2NvcmRXZWJob29rIjoiIiwiRGlzY29yZEltYWdlQ2hhbm5lbCI6IiIsIlZpZGVvTm90aWZpY2F0aW9uVHlwZSI6IiIsIkRpc2NvcmRWaWRlb1dlYmhvb2siOiIiLCJEaXNjb3JkVmlkZW9DaGFubmVsIjoiIiwiQXVkaW9Ob3RpZmljYXRpb25UeXBlIjoiIiwiRGlzY29yZEF1ZGlvV2ViaG9vayI6IiIsIkRpc2NvcmRBdWRpb0NoYW5uZWwiOiIiLCJEaXNjb3JkQm90VG9rZW4iOiIiLCJSZXRlbnRpb25FbmFibGVkIjpmYWxzZSwiUmV0ZW50aW9uRGF5cyI6NywiVmlkZW9SZXRlbnRpb25FbmFibGVkIjpmYWxzZSwiVmlkZW9SZXRlbnRpb25EYXlzIjo3LCJBdWRpb1JldGVudGlvbkVuYWJsZWQiOmZhbHNlLCJBdWRpb1JldGVudGlvbkRheXMiOjcsIkxvZ0FsZXJ0RW5hYmxlZCI6ZmFsc2UsIkxvZ0FsZXJ0TGV2ZWxzIjpbXSwiTG9nQWxlcnREaXNjb3JkV2ViaG9vayI6IiIsIk92ZXJyaWRlSW1hZ2VRdWFsaXR5IjpmYWxzZSwiSW1hZ2VRdWFsaXR5Ijo1MH0sImV4cCI6MTc2MTg1MTEzNH0.fpPeQ0GCm5GNTddjttUQ78VMqRUAufXoOvv5C7Vh3WA";
839
+ async function updatePresignedURL() {
840
+ return await fetchNui("GET_PRESIGNED_URL", void 0, dummyURL);
841
+ }
842
+ async function uploadImage(props) {
843
+ const uploadURL = await updatePresignedURL();
844
+ const response = await fetch(props.fileURL);
845
+ const blob = await response.blob();
846
+ const file = new File([blob], "upload.png", { type: blob.type });
847
+ const formData = new FormData();
848
+ formData.append("file", file);
849
+ formData.append(
850
+ "metadata",
851
+ JSON.stringify({
852
+ name: props.name || file.name,
853
+ description: props.description || "Uploaded via DirkScripts"
854
+ })
855
+ );
856
+ const uploadRes = await axios.post(uploadURL, formData, {
857
+ headers: { "Content-Type": "multipart/form-data" }
858
+ });
859
+ const finalUrl = uploadRes.data?.data?.url ?? uploadRes.data?.url;
860
+ if (!finalUrl) throw new Error("Upload succeeded but no URL returned");
861
+ return finalUrl;
862
+ }
863
+ async function getImageShape(file) {
864
+ return new Promise((resolve, reject) => {
865
+ const img = new Image();
866
+ img.onload = () => {
867
+ if (img.width > img.height) resolve("wide");
868
+ else resolve("square");
869
+ };
870
+ img.onerror = () => reject(new Error("Failed to load image"));
871
+ img.src = typeof file === "string" ? file : URL.createObjectURL(file);
872
+ });
873
+ }
874
+ var useItems = create(() => ({}));
875
+ var useItemsList = (excludeItemNames = []) => {
876
+ const excludeSet = new Set(excludeItemNames);
877
+ return Object.values(useItems.getState()).filter((item) => !excludeSet.has(item.name));
878
+ };
879
+ var getItemImageUrl = (itemName) => {
880
+ return useItems.getState()[itemName]?.image || "";
881
+ };
882
+ var resolveItemLabel = (items, name, fallback) => items[name]?.label || fallback || name;
883
+ var resolveItemDescription = (items, name, fallback) => items[name]?.description || fallback || "";
884
+ registerInitialFetch("FETCH_ALL_ITEMS", null, {
885
+ item1: { name: "item1", label: "Item 1", weight: 0.5, image: "item1.png" },
886
+ item2: { name: "item2", label: "Item 2", weight: 1, image: "item2.png" },
887
+ item3: { name: "item3", label: "Item 3", weight: 2.5, image: "item3.png" }
888
+ }).then((fetchedItems) => {
889
+ if (!fetchedItems) return;
890
+ useItems.setState(fetchedItems);
891
+ }).catch(() => {
892
+ });
893
+ var useFrameworkGroups = create(() => ({
894
+ jobs: [],
895
+ gangs: [],
896
+ loaded: false
897
+ }));
898
+ var frameworkGroupsRequested = false;
899
+ function ensureFrameworkGroups() {
900
+ if (frameworkGroupsRequested) return;
901
+ frameworkGroupsRequested = true;
902
+ fetchNui("GET_FRAMEWORK_GROUPS", void 0).then((data) => {
903
+ useFrameworkGroups.setState({
904
+ jobs: Array.isArray(data?.jobs) ? data.jobs : [],
905
+ gangs: Array.isArray(data?.gangs) ? data.gangs : [],
906
+ loaded: true
907
+ });
908
+ }).catch(() => {
909
+ frameworkGroupsRequested = false;
910
+ useFrameworkGroups.setState({ loaded: true });
911
+ });
912
+ }
913
+ function selectAllGroups(state) {
914
+ return [...state.jobs, ...state.gangs];
915
+ }
916
+ var useModels = create(() => ({
917
+ models: [],
918
+ loaded: false,
919
+ loading: false
920
+ }));
921
+ var requested = false;
922
+ function loadModels() {
923
+ if (requested) return;
924
+ requested = true;
925
+ useModels.setState({ loading: true });
926
+ import('./modelNames-WAUYJLL3.js').then((m) => {
927
+ useModels.setState({
928
+ models: Array.isArray(m.MODEL_NAMES) ? m.MODEL_NAMES : [],
929
+ loaded: true,
930
+ loading: false
931
+ });
932
+ }).catch(() => {
933
+ requested = false;
934
+ useModels.setState({ loaded: true, loading: false });
935
+ });
936
+ }
937
+ var useVehicles = create(() => ({
938
+ vehicles: [],
939
+ categories: [],
940
+ loaded: false
941
+ }));
942
+ var requested2 = false;
943
+ function ensureVehicles() {
944
+ if (requested2) return;
945
+ requested2 = true;
946
+ fetchNui("GET_VEHICLES", void 0).then((data) => {
947
+ const vehicles = Array.isArray(data) ? data : [];
948
+ const categories = Array.from(
949
+ new Set(vehicles.map((v) => v.category).filter(Boolean))
950
+ ).sort();
951
+ useVehicles.setState({ vehicles, categories, loaded: true });
952
+ }).catch(() => {
953
+ requested2 = false;
954
+ useVehicles.setState({ loaded: true });
955
+ });
956
+ }
957
+
958
+ // src/utils/inputMapper.ts
959
+ var INPUT_MAPPER_PRIMARY_OPTIONS = [
960
+ "DIGITALBUTTON_AXIS",
961
+ "GAME_CONTROLLED",
962
+ "JOYSTICK_AXIS",
963
+ "JOYSTICK_AXIS_NEGATIVE",
964
+ "JOYSTICK_AXIS_POSITIVE",
965
+ "JOYSTICK_BUTTON",
966
+ "JOYSTICK_IAXIS",
967
+ "JOYSTICK_POV",
968
+ "JOYSTICK_POV_AXIS",
969
+ "KEYBOARD",
970
+ "MKB_AXIS",
971
+ "MOUSE_ABSOLUTEAXIS",
972
+ "MOUSE_BUTTON",
973
+ "MOUSE_CENTEREDAXIS",
974
+ "MOUSE_NORMALIZED",
975
+ "MOUSE_RELATIVEAXIS",
976
+ "MOUSE_SCALEDAXIS",
977
+ "MOUSE_WHEEL",
978
+ "PAD_ANALOGBUTTON",
979
+ "PAD_AXIS",
980
+ "PAD_DEBUGBUTTON",
981
+ "PAD_DIGITALBUTTON",
982
+ "TOUCHPAD_ABSOLUTE_AXIS",
983
+ "TOUCHPAD_CENTERED_AXIS"
984
+ ];
985
+ var KEYBOARD_KEYS = [
986
+ "BACK",
987
+ "TAB",
988
+ "RETURN",
989
+ "PAUSE",
990
+ "CAPITAL",
991
+ "ESCAPE",
992
+ "SPACE",
993
+ "PAGEUP",
994
+ "PAGEDOWN",
995
+ "END",
996
+ "HOME",
997
+ "LEFT",
998
+ "UP",
999
+ "RIGHT",
1000
+ "DOWN",
1001
+ "INSERT",
1002
+ "DELETE",
1003
+ "0",
1004
+ "1",
1005
+ "2",
1006
+ "3",
1007
+ "4",
1008
+ "5",
1009
+ "6",
1010
+ "7",
1011
+ "8",
1012
+ "9",
1013
+ "A",
1014
+ "B",
1015
+ "C",
1016
+ "D",
1017
+ "E",
1018
+ "F",
1019
+ "G",
1020
+ "H",
1021
+ "I",
1022
+ "J",
1023
+ "K",
1024
+ "L",
1025
+ "M",
1026
+ "N",
1027
+ "O",
1028
+ "P",
1029
+ "Q",
1030
+ "R",
1031
+ "S",
1032
+ "T",
1033
+ "U",
1034
+ "V",
1035
+ "W",
1036
+ "X",
1037
+ "Y",
1038
+ "Z",
1039
+ "F1",
1040
+ "F2",
1041
+ "F3",
1042
+ "F4",
1043
+ "F5",
1044
+ "F6",
1045
+ "F7",
1046
+ "F8",
1047
+ "F9",
1048
+ "F10",
1049
+ "F11",
1050
+ "F12",
1051
+ "NUMPAD0",
1052
+ "NUMPAD1",
1053
+ "NUMPAD2",
1054
+ "NUMPAD3",
1055
+ "NUMPAD4",
1056
+ "NUMPAD5",
1057
+ "NUMPAD6",
1058
+ "NUMPAD7",
1059
+ "NUMPAD8",
1060
+ "NUMPAD9",
1061
+ "MULTIPLY",
1062
+ "ADD",
1063
+ "SUBTRACT",
1064
+ "DECIMAL",
1065
+ "DIVIDE",
1066
+ "NUMPADENTER",
1067
+ "LSHIFT",
1068
+ "RSHIFT",
1069
+ "LCONTROL",
1070
+ "RCONTROL",
1071
+ "LMENU",
1072
+ "RMENU",
1073
+ "LWIN",
1074
+ "RWIN",
1075
+ "APPS",
1076
+ "NUMLOCK",
1077
+ "SCROLL",
1078
+ "OEM_1",
1079
+ "SEMICOLON",
1080
+ "EQUALS",
1081
+ "PLUS",
1082
+ "COMMA",
1083
+ "MINUS",
1084
+ "PERIOD",
1085
+ "SLASH",
1086
+ "OEM_2",
1087
+ "OEM_3",
1088
+ "GRAVE",
1089
+ "LBRACKET",
1090
+ "OEM_4",
1091
+ "BACKSLASH",
1092
+ "OEM_5",
1093
+ "RBRACKET",
1094
+ "OEM_6",
1095
+ "APOSTROPHE",
1096
+ "OEM_7",
1097
+ "OEM_102"
1098
+ ];
1099
+ var MOUSE_BUTTON_KEYS = [
1100
+ "MOUSE_LEFT",
1101
+ "MOUSE_RIGHT",
1102
+ "MOUSE_MIDDLE",
1103
+ "MOUSE_EXTRABTN1",
1104
+ "MOUSE_EXTRABTN2",
1105
+ "MOUSE_EXTRABTN3",
1106
+ "MOUSE_EXTRABTN4",
1107
+ "MOUSE_EXTRABTN5",
1108
+ "IOM_WHEEL_UP",
1109
+ "IOM_WHEEL_DOWN"
1110
+ ];
1111
+ var MOUSE_WHEEL_KEYS = ["IOM_WHEEL_UP", "IOM_WHEEL_DOWN"];
1112
+ var MOUSE_AXIS_KEYS = [
1113
+ "IOM_AXIS_X",
1114
+ "IOM_AXIS_Y",
1115
+ "IOM_AXIS_WHEEL",
1116
+ "IOM_AXIS_WHEEL_DELTA",
1117
+ "IOM_AXIS_WHEEL_RELATIVE",
1118
+ "IOM_IAXIS_X",
1119
+ "IOM_IAXIS_Y",
1120
+ "IOM_IAXIS_WHEEL",
1121
+ "IOM_IAXIS_WHEEL_DELTA",
1122
+ "IOM_IAXIS_WHEEL_RELATIVE",
1123
+ "IOM_AXIS_X_LEFT",
1124
+ "IOM_AXIS_X_RIGHT",
1125
+ "IOM_AXIS_Y_UP",
1126
+ "IOM_AXIS_Y_DOWN",
1127
+ "BASIC_MOUSE_AXIS_MAX",
1128
+ "MOUSE_AXIS_MAX"
1129
+ ];
1130
+ var PAD_BUTTON_KEYS = [
1131
+ "L1_INDEX",
1132
+ "R1_INDEX",
1133
+ "L2_INDEX",
1134
+ "R2_INDEX",
1135
+ "L3_INDEX",
1136
+ "R3_INDEX",
1137
+ "LUP_INDEX",
1138
+ "LRIGHT_INDEX",
1139
+ "LDOWN_INDEX",
1140
+ "LLEFT_INDEX",
1141
+ "RUP_INDEX",
1142
+ "RRIGHT_INDEX",
1143
+ "RDOWN_INDEX",
1144
+ "RLEFT_INDEX",
1145
+ "SELECT_INDEX",
1146
+ "START_INDEX",
1147
+ "TOUCH_INDEX"
1148
+ ];
1149
+ var PAD_DEBUG_KEYS = [
1150
+ "L1",
1151
+ "R1",
1152
+ "L2",
1153
+ "R2",
1154
+ "L3",
1155
+ "R3",
1156
+ "LUP",
1157
+ "LRIGHT",
1158
+ "LDOWN",
1159
+ "LLEFT",
1160
+ "RUP",
1161
+ "RRIGHT",
1162
+ "RDOWN",
1163
+ "RLEFT",
1164
+ "SELECT",
1165
+ "START",
1166
+ "TOUCH"
1167
+ ];
1168
+ var PAD_AXIS_KEYS = [
1169
+ "IOM_AXIS_LX",
1170
+ "IOM_AXIS_LY",
1171
+ "IOM_AXIS_RX",
1172
+ "IOM_AXIS_RY",
1173
+ "IOM_AXIS_LUP",
1174
+ "IOM_AXIS_LDOWN",
1175
+ "IOM_AXIS_LLEFT",
1176
+ "IOM_AXIS_LRIGHT",
1177
+ "IOM_AXIS_LUR",
1178
+ "IOM_AXIS_LUL",
1179
+ "IOM_AXIS_LDR",
1180
+ "IOM_AXIS_LDL",
1181
+ "IOM_AXIS_RUP",
1182
+ "IOM_AXIS_RDOWN",
1183
+ "IOM_AXIS_RLEFT",
1184
+ "IOM_AXIS_RRIGHT",
1185
+ "IOM_AXIS_RUR",
1186
+ "IOM_AXIS_RUL",
1187
+ "IOM_AXIS_RDR",
1188
+ "IOM_AXIS_RDL",
1189
+ "IOM_AXIS_DPADX",
1190
+ "IOM_AXIS_DPADY",
1191
+ "IOM_AXIS_LY_UP",
1192
+ "IOM_AXIS_LY_DOWN",
1193
+ "IOM_AXIS_LX_LEFT",
1194
+ "IOM_AXIS_LX_RIGHT",
1195
+ "IOM_AXIS_RY_UP",
1196
+ "IOM_AXIS_RY_DOWN",
1197
+ "IOM_AXIS_RX_LEFT",
1198
+ "IOM_AXIS_RX_RIGHT"
1199
+ ];
1200
+ var JOYSTICK_AXIS_KEYS = Array.from({ length: 8 }, (_, i) => `IOM_JOYSTICK_AXIS${i + 1}`);
1201
+ var JOYSTICK_BUTTON_KEYS = Array.from({ length: 32 }, (_, i) => `IOM_JOYSTICK_BUTTON${i + 1}`);
1202
+ var JOYSTICK_POV_KEYS = Array.from({ length: 4 }, (_, p) => {
1203
+ const idx = p + 1;
1204
+ return [
1205
+ `IOM_POV${idx}_UP`,
1206
+ `IOM_POV${idx}_RIGHT`,
1207
+ `IOM_POV${idx}_DOWN`,
1208
+ `IOM_POV${idx}_LEFT`
1209
+ ];
1210
+ }).flat();
1211
+ var INPUT_MAPPER_KEYS_BY_PRIMARY = {
1212
+ DIGITALBUTTON_AXIS: [],
1213
+ GAME_CONTROLLED: [],
1214
+ JOYSTICK_AXIS: [...JOYSTICK_AXIS_KEYS],
1215
+ JOYSTICK_AXIS_NEGATIVE: [...JOYSTICK_AXIS_KEYS],
1216
+ JOYSTICK_AXIS_POSITIVE: [...JOYSTICK_AXIS_KEYS],
1217
+ JOYSTICK_BUTTON: [...JOYSTICK_BUTTON_KEYS],
1218
+ JOYSTICK_IAXIS: [...JOYSTICK_AXIS_KEYS],
1219
+ JOYSTICK_POV: [...JOYSTICK_POV_KEYS],
1220
+ JOYSTICK_POV_AXIS: [...JOYSTICK_POV_KEYS],
1221
+ KEYBOARD: [...KEYBOARD_KEYS],
1222
+ MKB_AXIS: [],
1223
+ MOUSE_ABSOLUTEAXIS: [...MOUSE_AXIS_KEYS],
1224
+ MOUSE_BUTTON: [...MOUSE_BUTTON_KEYS],
1225
+ MOUSE_CENTEREDAXIS: [...MOUSE_AXIS_KEYS],
1226
+ MOUSE_NORMALIZED: [...MOUSE_AXIS_KEYS],
1227
+ MOUSE_RELATIVEAXIS: [...MOUSE_AXIS_KEYS],
1228
+ MOUSE_SCALEDAXIS: [...MOUSE_AXIS_KEYS],
1229
+ MOUSE_WHEEL: [...MOUSE_WHEEL_KEYS],
1230
+ PAD_ANALOGBUTTON: [...PAD_BUTTON_KEYS],
1231
+ PAD_AXIS: [...PAD_AXIS_KEYS],
1232
+ PAD_DEBUGBUTTON: [...PAD_DEBUG_KEYS],
1233
+ PAD_DIGITALBUTTON: [...PAD_BUTTON_KEYS],
1234
+ TOUCHPAD_ABSOLUTE_AXIS: [],
1235
+ TOUCHPAD_CENTERED_AXIS: []
1236
+ };
1237
+
1238
+ // src/utils/extractDefaults.ts
1239
+ function extractDefaults(schema) {
1240
+ if (!schema || typeof schema !== "object") return void 0;
1241
+ if (schema.default !== void 0) return schema.default;
1242
+ if (schema.type === "object" && schema.properties) {
1243
+ const result = {};
1244
+ let hasValue = false;
1245
+ for (const [key, child] of Object.entries(schema.properties)) {
1246
+ const val = extractDefaults(child);
1247
+ if (val !== void 0) {
1248
+ result[key] = val;
1249
+ hasValue = true;
1250
+ }
1251
+ }
1252
+ return hasValue ? result : void 0;
1253
+ }
1254
+ return void 0;
1255
+ }
1256
+
1257
+ // src/utils/gtaControls.ts
1258
+ var GTA_CONTROLS = [
1259
+ // ── Camera ─────────────────────────────────────────────────────────────────
1260
+ { id: 0, symbol: "INPUT_NEXT_CAMERA", label: "Switch Camera", defaultKey: "V", group: "Camera" },
1261
+ { id: 1, symbol: "INPUT_LOOK_LR", label: "Look Left/Right", defaultKey: "Mouse X", group: "Camera" },
1262
+ { id: 2, symbol: "INPUT_LOOK_UD", label: "Look Up/Down", defaultKey: "Mouse Y", group: "Camera" },
1263
+ { id: 3, symbol: "INPUT_LOOK_UP_ONLY", label: "Look Up Only", group: "Camera" },
1264
+ { id: 4, symbol: "INPUT_LOOK_DOWN_ONLY", label: "Look Down Only", group: "Camera" },
1265
+ { id: 5, symbol: "INPUT_LOOK_LEFT_ONLY", label: "Look Left Only", group: "Camera" },
1266
+ { id: 6, symbol: "INPUT_LOOK_RIGHT_ONLY", label: "Look Right Only", group: "Camera" },
1267
+ { id: 8, symbol: "INPUT_CINEMATIC_SLOWMO", label: "Cinematic Slowmo", defaultKey: "Insert", group: "Camera" },
1268
+ { id: 26, symbol: "INPUT_LOOK_BEHIND", label: "Look Behind", defaultKey: "C", group: "Camera" },
1269
+ { id: 27, symbol: "INPUT_PHONE", label: "Phone", defaultKey: "Up Arrow", group: "Phone" },
1270
+ // ── Movement ───────────────────────────────────────────────────────────────
1271
+ { id: 21, symbol: "INPUT_SPRINT", label: "Sprint", defaultKey: "Left Shift", group: "Movement" },
1272
+ { id: 22, symbol: "INPUT_JUMP", label: "Jump", defaultKey: "Space", group: "Movement" },
1273
+ { id: 23, symbol: "INPUT_ENTER", label: "Enter Vehicle", defaultKey: "F", group: "Movement" },
1274
+ { id: 30, symbol: "INPUT_MOVE_LR", label: "Move Left/Right", group: "Movement" },
1275
+ { id: 31, symbol: "INPUT_MOVE_UD", label: "Move Up/Down", group: "Movement" },
1276
+ { id: 32, symbol: "INPUT_MOVE_UP_ONLY", label: "Move Forward (W)", group: "Movement" },
1277
+ { id: 33, symbol: "INPUT_MOVE_DOWN_ONLY", label: "Move Back (S)", group: "Movement" },
1278
+ { id: 34, symbol: "INPUT_MOVE_LEFT_ONLY", label: "Move Left (A)", group: "Movement" },
1279
+ { id: 35, symbol: "INPUT_MOVE_RIGHT_ONLY", label: "Move Right (D)", group: "Movement" },
1280
+ { id: 36, symbol: "INPUT_DUCK", label: "Duck / Stealth", defaultKey: "Left Ctrl", group: "Movement" },
1281
+ { id: 37, symbol: "INPUT_SELECT_WEAPON", label: "Weapon Wheel", defaultKey: "Tab", group: "Combat" },
1282
+ { id: 38, symbol: "INPUT_PICKUP", label: "Pickup / Interact", defaultKey: "E", group: "Movement" },
1283
+ // ── Combat ─────────────────────────────────────────────────────────────────
1284
+ { id: 24, symbol: "INPUT_ATTACK", label: "Attack / Fire", defaultKey: "Mouse 1", group: "Combat" },
1285
+ { id: 25, symbol: "INPUT_AIM", label: "Aim", defaultKey: "Mouse 2", group: "Combat" },
1286
+ { id: 45, symbol: "INPUT_RELOAD", label: "Reload", defaultKey: "R", group: "Combat" },
1287
+ { id: 47, symbol: "INPUT_DETONATE", label: "Detonate", defaultKey: "G", group: "Combat" },
1288
+ { id: 257, symbol: "INPUT_ATTACK2", label: "Attack 2", group: "Combat" },
1289
+ { id: 140, symbol: "INPUT_MELEE_ATTACK_LIGHT", label: "Melee Light", defaultKey: "R", group: "Combat" },
1290
+ { id: 141, symbol: "INPUT_MELEE_ATTACK_HEAVY", label: "Melee Heavy", defaultKey: "Q", group: "Combat" },
1291
+ { id: 142, symbol: "INPUT_MELEE_ATTACK_ALTERNATE", label: "Melee Alternate", defaultKey: "Mouse 1", group: "Combat" },
1292
+ { id: 263, symbol: "INPUT_MELEE_ATTACK1", label: "Melee Attack 1", group: "Combat" },
1293
+ { id: 264, symbol: "INPUT_MELEE_ATTACK2", label: "Melee Attack 2", group: "Combat" },
1294
+ // ── Cover ──────────────────────────────────────────────────────────────────
1295
+ { id: 44, symbol: "INPUT_COVER", label: "Cover", defaultKey: "Q", group: "Cover" },
1296
+ // ── Vehicle (general) ──────────────────────────────────────────────────────
1297
+ { id: 59, symbol: "INPUT_VEH_MOVE_LR", label: "Vehicle Steering", group: "Vehicle" },
1298
+ { id: 63, symbol: "INPUT_VEH_MOVE_LEFT_ONLY", label: "Vehicle Steer Left", group: "Vehicle" },
1299
+ { id: 64, symbol: "INPUT_VEH_MOVE_RIGHT_ONLY", label: "Vehicle Steer Right", group: "Vehicle" },
1300
+ { id: 71, symbol: "INPUT_VEH_ACCELERATE", label: "Vehicle Accelerate", defaultKey: "W", group: "Vehicle" },
1301
+ { id: 72, symbol: "INPUT_VEH_BRAKE", label: "Vehicle Brake", defaultKey: "S", group: "Vehicle" },
1302
+ { id: 73, symbol: "INPUT_VEH_DUCK", label: "Vehicle Duck", defaultKey: "X", group: "Vehicle" },
1303
+ { id: 74, symbol: "INPUT_VEH_HEADLIGHT", label: "Headlights", defaultKey: "H", group: "Vehicle" },
1304
+ { id: 75, symbol: "INPUT_VEH_EXIT", label: "Exit Vehicle", defaultKey: "F", group: "Vehicle" },
1305
+ { id: 76, symbol: "INPUT_VEH_HANDBRAKE", label: "Handbrake", defaultKey: "Space", group: "Vehicle" },
1306
+ { id: 80, symbol: "INPUT_VEH_CIN_CAM", label: "Cinematic Cam", defaultKey: "R", group: "Vehicle" },
1307
+ { id: 81, symbol: "INPUT_VEH_NEXT_RADIO", label: "Radio Next", group: "Vehicle" },
1308
+ { id: 82, symbol: "INPUT_VEH_PREV_RADIO", label: "Radio Prev", group: "Vehicle" },
1309
+ { id: 83, symbol: "INPUT_VEH_NEXT_RADIO_TRACK", label: "Radio Next Track", group: "Vehicle" },
1310
+ { id: 84, symbol: "INPUT_VEH_PREV_RADIO_TRACK", label: "Radio Prev Track", group: "Vehicle" },
1311
+ { id: 85, symbol: "INPUT_VEH_RADIO_WHEEL", label: "Radio Wheel", defaultKey: "Q", group: "Vehicle" },
1312
+ { id: 86, symbol: "INPUT_VEH_HORN", label: "Horn", defaultKey: "E", group: "Vehicle" },
1313
+ { id: 90, symbol: "INPUT_VEH_AIM", label: "Vehicle Aim", group: "Vehicle" },
1314
+ { id: 91, symbol: "INPUT_VEH_ATTACK", label: "Vehicle Attack", group: "Vehicle" },
1315
+ { id: 92, symbol: "INPUT_VEH_ATTACK2", label: "Vehicle Attack 2", group: "Vehicle" },
1316
+ { id: 99, symbol: "INPUT_VEH_SELECT_NEXT_WEAPON", label: "Veh Next Weapon", group: "Vehicle" },
1317
+ { id: 100, symbol: "INPUT_VEH_SELECT_PREV_WEAPON", label: "Veh Prev Weapon", group: "Vehicle" },
1318
+ // ── Vehicle (Plane/Heli) ───────────────────────────────────────────────────
1319
+ { id: 152, symbol: "INPUT_VEH_FLY_THROTTLE_UP", label: "Plane Throttle Up", defaultKey: "W", group: "Vehicle (Plane/Heli)" },
1320
+ { id: 153, symbol: "INPUT_VEH_FLY_THROTTLE_DOWN", label: "Plane Throttle Down", defaultKey: "S", group: "Vehicle (Plane/Heli)" },
1321
+ { id: 154, symbol: "INPUT_VEH_FLY_YAW_LEFT", label: "Plane Yaw Left", defaultKey: "A", group: "Vehicle (Plane/Heli)" },
1322
+ { id: 155, symbol: "INPUT_VEH_FLY_YAW_RIGHT", label: "Plane Yaw Right", defaultKey: "D", group: "Vehicle (Plane/Heli)" },
1323
+ { id: 158, symbol: "INPUT_VEH_FLY_ATTACK", label: "Plane Attack", defaultKey: "Mouse 1", group: "Vehicle (Plane/Heli)" },
1324
+ // ── Vehicle (Boat / Bike) ──────────────────────────────────────────────────
1325
+ { id: 198, symbol: "INPUT_VEH_BICYCLE_PEDAL", label: "Bike Pedal", group: "Vehicle (Boat/Bike)" },
1326
+ // ── Phone ──────────────────────────────────────────────────────────────────
1327
+ { id: 137, symbol: "INPUT_FRONTEND_SOCIAL_CLUB_SECONDARY", label: "Toggle Phone (alt)", group: "Phone" },
1328
+ // ── Frontend / UI ──────────────────────────────────────────────────────────
1329
+ { id: 199, symbol: "INPUT_FRONTEND_PAUSE", label: "Pause Menu", defaultKey: "P", group: "Frontend / UI" },
1330
+ { id: 200, symbol: "INPUT_FRONTEND_PAUSE_ALTERNATE", label: "Pause Menu (alt)", defaultKey: "Esc", group: "Frontend / UI" },
1331
+ { id: 201, symbol: "INPUT_FRONTEND_ACCEPT", label: "Accept", defaultKey: "Enter", group: "Frontend / UI" },
1332
+ { id: 202, symbol: "INPUT_FRONTEND_CANCEL", label: "Cancel", defaultKey: "Esc", group: "Frontend / UI" },
1333
+ { id: 244, symbol: "INPUT_INTERACTION_MENU", label: "Interaction Menu", defaultKey: "M", group: "Frontend / UI" },
1334
+ // ── Multiplayer ────────────────────────────────────────────────────────────
1335
+ { id: 245, symbol: "INPUT_MP_TEXT_CHAT_ALL", label: "Chat (All)", defaultKey: "T", group: "Multiplayer" },
1336
+ { id: 246, symbol: "INPUT_MP_TEXT_CHAT_TEAM", label: "Chat (Team)", defaultKey: "Y", group: "Multiplayer" },
1337
+ { id: 247, symbol: "INPUT_MP_TEXT_CHAT_FRIENDS", label: "Chat (Friends)", group: "Multiplayer" },
1338
+ { id: 248, symbol: "INPUT_MP_TEXT_CHAT_CREW", label: "Chat (Crew)", group: "Multiplayer" },
1339
+ { id: 249, symbol: "INPUT_PUSH_TO_TALK", label: "Push To Talk", defaultKey: "N", group: "Multiplayer" },
1340
+ // ── Misc ───────────────────────────────────────────────────────────────────
1341
+ { id: 51, symbol: "INPUT_CONTEXT", label: "Context (E)", defaultKey: "E", group: "Misc" },
1342
+ { id: 52, symbol: "INPUT_CONTEXT_SECONDARY", label: "Context Secondary", defaultKey: "Q", group: "Misc" },
1343
+ { id: 19, symbol: "INPUT_CHARACTER_WHEEL", label: "Character Wheel", defaultKey: "Left Alt", group: "Misc" },
1344
+ { id: 105, symbol: "INPUT_HUD_SPECIAL", label: "Special Ability", defaultKey: "Caps Lock", group: "Misc" },
1345
+ { id: 121, symbol: "INPUT_MULTIPLAYER_INFO", label: "Player List", defaultKey: "Z", group: "Misc" },
1346
+ { id: 170, symbol: "INPUT_SAVE_REPLAY_CLIP", label: "Save Replay Clip", defaultKey: "F1", group: "Misc" },
1347
+ { id: 288, symbol: "INPUT_REPLAY_START_STOP_RECORDING", label: "Replay Record", defaultKey: "F1", group: "Misc" },
1348
+ { id: 289, symbol: "INPUT_REPLAY_START_STOP_RECORDING_SECONDARY", label: "Replay Record (alt)", group: "Misc" }
1349
+ ];
1350
+ var BY_ID = new Map(GTA_CONTROLS.map((c) => [c.id, c]));
1351
+ function getGtaControl(id) {
1352
+ return BY_ID.get(id);
1353
+ }
1354
+ function formatGtaControl(id) {
1355
+ const c = BY_ID.get(id);
1356
+ if (!c) return `Control ${id}`;
1357
+ return c.defaultKey ? `${c.label} (${id} \xB7 ${c.defaultKey})` : `${c.label} (${id})`;
1358
+ }
1359
+ var GTA_CONTROL_GROUP_ORDER = [
1360
+ "Camera",
1361
+ "Movement",
1362
+ "Combat",
1363
+ "Cover",
1364
+ "Vehicle",
1365
+ "Vehicle (Plane/Heli)",
1366
+ "Vehicle (Boat/Bike)",
1367
+ "Phone",
1368
+ "Frontend / UI",
1369
+ "Multiplayer",
1370
+ "Misc"
1371
+ ];
1372
+
1373
+ export { DEFAULT_PALETTE, GTA_CONTROLS, GTA_CONTROL_GROUP_ORDER, INPUT_MAPPER_KEYS_BY_PRIMARY, INPUT_MAPPER_PRIMARY_OPTIONS, ThemeOverrideSchema, colorWithAlpha, copyToClipboard, createSkill, defaultThemeOverride, ensureFrameworkGroups, ensureVehicles, extractDefaults, fetchLuaTable, fetchNui, formatGtaControl, gameToMap, getGtaControl, getImageShape, getItemImageUrl, initialFetches, internalEvent, isEnvBrowser, isProfanity, latPr100, loadModels, locale, localeStore, mapCenter, mapToGame, noop, numberToRoman, openLink, registerInitialFetch, registerInitialLuaTableFetch, resolveItemDescription, resolveItemLabel, runFetches, selectAllGroups, splitFAString, updatePresignedURL, uploadImage, useAutoFetcher, useFrameworkGroups, useItems, useItemsList, useModels, useProfanityStore, useSettings, useVehicles };
1374
+ //# sourceMappingURL=chunk-MYNNCLMA.js.map
1375
+ //# sourceMappingURL=chunk-MYNNCLMA.js.map