create-pixi-vn 2.1.4 → 2.1.5

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 (119) hide show
  1. package/package.json +1 -1
  2. package/template-lib/package.json +3 -0
  3. package/template-nqtr-react-vite-muijoy/package.json +2 -2
  4. package/template-nqtr-react-vite-muijoy/src/assets/index.ts +2 -11
  5. package/template-nqtr-react-vite-muijoy/src/assets/manifest.gen.json +2 -7
  6. package/template-nqtr-react-vite-muijoy/src/components/menus/settings/index.tsx +15 -6
  7. package/template-nqtr-react-vite-muijoy/src/components/menus/settings/menus/diagnostics.tsx +266 -0
  8. package/template-nqtr-react-vite-muijoy/src/components/menus/settings/quick-menus.tsx +25 -1
  9. package/template-nqtr-react-vite-muijoy/src/lib/hooks/device-diagnostics-hooks.ts +68 -0
  10. package/template-nqtr-react-vite-muijoy/src/lib/hooks/hotkeys-hooks.ts +16 -0
  11. package/template-nqtr-react-vite-muijoy/src/lib/utils/device-diagnostics-utility.ts +382 -0
  12. package/template-nqtr-react-vite-muijoy/src/locales/en.json +50 -0
  13. package/template-nqtr-react-vite-muijoy/src/pixi-vn.keys.gen.ts +4 -7
  14. package/template-nqtr-react-vite-muijoy-ink/package.json +3 -3
  15. package/template-nqtr-react-vite-muijoy-ink/src/assets/index.ts +2 -11
  16. package/template-nqtr-react-vite-muijoy-ink/src/assets/manifest.gen.json +2 -7
  17. package/template-nqtr-react-vite-muijoy-ink/src/components/menus/settings/index.tsx +15 -6
  18. package/template-nqtr-react-vite-muijoy-ink/src/components/menus/settings/menus/diagnostics.tsx +266 -0
  19. package/template-nqtr-react-vite-muijoy-ink/src/components/menus/settings/quick-menus.tsx +25 -1
  20. package/template-nqtr-react-vite-muijoy-ink/src/lib/hooks/device-diagnostics-hooks.ts +68 -0
  21. package/template-nqtr-react-vite-muijoy-ink/src/lib/hooks/hotkeys-hooks.ts +16 -0
  22. package/template-nqtr-react-vite-muijoy-ink/src/lib/utils/device-diagnostics-utility.ts +382 -0
  23. package/template-nqtr-react-vite-muijoy-ink/src/locales/en.json +50 -0
  24. package/template-nqtr-react-vite-muijoy-ink/src/pixi-vn.keys.gen.ts +4 -7
  25. package/template-nqtr-react-vite-muijoy-ink-tauri/.vscode/launch.json +1 -1
  26. package/template-nqtr-react-vite-muijoy-ink-tauri/.vscode/tasks.json +1 -35
  27. package/template-nqtr-react-vite-muijoy-ink-tauri/package.json +3 -3
  28. package/template-nqtr-react-vite-muijoy-ink-tauri/src/assets/index.ts +2 -11
  29. package/template-nqtr-react-vite-muijoy-ink-tauri/src/assets/manifest.gen.json +2 -7
  30. package/template-nqtr-react-vite-muijoy-ink-tauri/src/components/menus/settings/index.tsx +15 -6
  31. package/template-nqtr-react-vite-muijoy-ink-tauri/src/components/menus/settings/menus/diagnostics.tsx +332 -0
  32. package/template-nqtr-react-vite-muijoy-ink-tauri/src/components/menus/settings/quick-menus.tsx +32 -1
  33. package/template-nqtr-react-vite-muijoy-ink-tauri/src/content/ink/hashtag-commands.ts +17 -0
  34. package/template-nqtr-react-vite-muijoy-ink-tauri/src/lib/hooks/device-diagnostics-hooks.ts +96 -0
  35. package/template-nqtr-react-vite-muijoy-ink-tauri/src/lib/hooks/hotkeys-hooks.ts +16 -0
  36. package/template-nqtr-react-vite-muijoy-ink-tauri/src/lib/system-info.ts +54 -0
  37. package/template-nqtr-react-vite-muijoy-ink-tauri/src/lib/utils/device-diagnostics-utility.ts +511 -0
  38. package/template-nqtr-react-vite-muijoy-ink-tauri/src/locales/en.json +66 -0
  39. package/template-nqtr-react-vite-muijoy-ink-tauri/src/pixi-vn.keys.gen.ts +4 -7
  40. package/template-nqtr-react-vite-muijoy-ink-tauri/src-tauri/Cargo.toml +1 -0
  41. package/template-nqtr-react-vite-muijoy-ink-tauri/src-tauri/src/lib.rs +34 -22
  42. package/template-nqtr-react-vite-muijoy-ink-tauri/src-tauri/src/system_info.rs +33 -0
  43. package/template-nqtr-react-vite-muijoy-tauri/.vscode/launch.json +1 -1
  44. package/template-nqtr-react-vite-muijoy-tauri/.vscode/tasks.json +1 -35
  45. package/template-nqtr-react-vite-muijoy-tauri/package.json +2 -2
  46. package/template-nqtr-react-vite-muijoy-tauri/src/assets/index.ts +2 -11
  47. package/template-nqtr-react-vite-muijoy-tauri/src/assets/manifest.gen.json +2 -7
  48. package/template-nqtr-react-vite-muijoy-tauri/src/components/menus/settings/index.tsx +15 -6
  49. package/template-nqtr-react-vite-muijoy-tauri/src/components/menus/settings/menus/diagnostics.tsx +332 -0
  50. package/template-nqtr-react-vite-muijoy-tauri/src/components/menus/settings/quick-menus.tsx +32 -1
  51. package/template-nqtr-react-vite-muijoy-tauri/src/lib/hooks/device-diagnostics-hooks.ts +96 -0
  52. package/template-nqtr-react-vite-muijoy-tauri/src/lib/hooks/hotkeys-hooks.ts +16 -0
  53. package/template-nqtr-react-vite-muijoy-tauri/src/lib/system-info.ts +54 -0
  54. package/template-nqtr-react-vite-muijoy-tauri/src/lib/utils/device-diagnostics-utility.ts +511 -0
  55. package/template-nqtr-react-vite-muijoy-tauri/src/locales/en.json +66 -0
  56. package/template-nqtr-react-vite-muijoy-tauri/src/pixi-vn.keys.gen.ts +4 -7
  57. package/template-nqtr-react-vite-muijoy-tauri/src-tauri/Cargo.toml +1 -0
  58. package/template-nqtr-react-vite-muijoy-tauri/src-tauri/src/lib.rs +32 -20
  59. package/template-nqtr-react-vite-muijoy-tauri/src-tauri/src/system_info.rs +33 -0
  60. package/template-react-vite-muijoy/package.json +1 -1
  61. package/template-react-vite-muijoy/src/assets/index.ts +55 -55
  62. package/template-react-vite-muijoy/src/assets/manifest.gen.json +2 -7
  63. package/template-react-vite-muijoy/src/components/menus/settings/index.tsx +15 -6
  64. package/template-react-vite-muijoy/src/components/menus/settings/menus/diagnostics.tsx +266 -0
  65. package/template-react-vite-muijoy/src/components/menus/settings/quick-menus.tsx +25 -1
  66. package/template-react-vite-muijoy/src/lib/hooks/device-diagnostics-hooks.ts +68 -0
  67. package/template-react-vite-muijoy/src/lib/hooks/hotkeys-hooks.ts +16 -0
  68. package/template-react-vite-muijoy/src/lib/utils/device-diagnostics-utility.ts +382 -0
  69. package/template-react-vite-muijoy/src/locales/en.json +50 -0
  70. package/template-react-vite-muijoy/src/pixi-vn.keys.gen.ts +2 -3
  71. package/template-react-vite-muijoy-ink/ink/second_part.ink +0 -1
  72. package/template-react-vite-muijoy-ink/ink/start.ink +4 -6
  73. package/template-react-vite-muijoy-ink/package.json +2 -2
  74. package/template-react-vite-muijoy-ink/src/assets/index.ts +55 -55
  75. package/template-react-vite-muijoy-ink/src/assets/manifest.gen.json +2 -7
  76. package/template-react-vite-muijoy-ink/src/components/menus/settings/index.tsx +15 -6
  77. package/template-react-vite-muijoy-ink/src/components/menus/settings/menus/diagnostics.tsx +266 -0
  78. package/template-react-vite-muijoy-ink/src/components/menus/settings/quick-menus.tsx +25 -1
  79. package/template-react-vite-muijoy-ink/src/lib/hooks/device-diagnostics-hooks.ts +68 -0
  80. package/template-react-vite-muijoy-ink/src/lib/hooks/hotkeys-hooks.ts +16 -0
  81. package/template-react-vite-muijoy-ink/src/lib/utils/device-diagnostics-utility.ts +382 -0
  82. package/template-react-vite-muijoy-ink/src/locales/en.json +50 -0
  83. package/template-react-vite-muijoy-ink/src/pixi-vn.keys.gen.ts +2 -3
  84. package/template-react-vite-muijoy-ink-tauri/.vscode/launch.json +1 -1
  85. package/template-react-vite-muijoy-ink-tauri/.vscode/tasks.json +1 -35
  86. package/template-react-vite-muijoy-ink-tauri/ink/second_part.ink +0 -1
  87. package/template-react-vite-muijoy-ink-tauri/ink/start.ink +4 -6
  88. package/template-react-vite-muijoy-ink-tauri/package.json +2 -2
  89. package/template-react-vite-muijoy-ink-tauri/src/assets/index.ts +55 -55
  90. package/template-react-vite-muijoy-ink-tauri/src/assets/manifest.gen.json +2 -7
  91. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/index.tsx +15 -6
  92. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/menus/diagnostics.tsx +332 -0
  93. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/quick-menus.tsx +32 -1
  94. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/device-diagnostics-hooks.ts +96 -0
  95. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/hotkeys-hooks.ts +16 -0
  96. package/template-react-vite-muijoy-ink-tauri/src/lib/system-info.ts +54 -0
  97. package/template-react-vite-muijoy-ink-tauri/src/lib/utils/device-diagnostics-utility.ts +511 -0
  98. package/template-react-vite-muijoy-ink-tauri/src/locales/en.json +66 -0
  99. package/template-react-vite-muijoy-ink-tauri/src/pixi-vn.keys.gen.ts +2 -3
  100. package/template-react-vite-muijoy-ink-tauri/src-tauri/Cargo.toml +1 -0
  101. package/template-react-vite-muijoy-ink-tauri/src-tauri/src/lib.rs +32 -20
  102. package/template-react-vite-muijoy-ink-tauri/src-tauri/src/system_info.rs +33 -0
  103. package/template-react-vite-muijoy-tauri/.vscode/launch.json +1 -1
  104. package/template-react-vite-muijoy-tauri/.vscode/tasks.json +1 -35
  105. package/template-react-vite-muijoy-tauri/package.json +1 -1
  106. package/template-react-vite-muijoy-tauri/src/assets/index.ts +55 -55
  107. package/template-react-vite-muijoy-tauri/src/assets/manifest.gen.json +2 -7
  108. package/template-react-vite-muijoy-tauri/src/components/menus/settings/index.tsx +15 -6
  109. package/template-react-vite-muijoy-tauri/src/components/menus/settings/menus/diagnostics.tsx +332 -0
  110. package/template-react-vite-muijoy-tauri/src/components/menus/settings/quick-menus.tsx +32 -1
  111. package/template-react-vite-muijoy-tauri/src/lib/hooks/device-diagnostics-hooks.ts +96 -0
  112. package/template-react-vite-muijoy-tauri/src/lib/hooks/hotkeys-hooks.ts +16 -0
  113. package/template-react-vite-muijoy-tauri/src/lib/system-info.ts +54 -0
  114. package/template-react-vite-muijoy-tauri/src/lib/utils/device-diagnostics-utility.ts +511 -0
  115. package/template-react-vite-muijoy-tauri/src/locales/en.json +66 -0
  116. package/template-react-vite-muijoy-tauri/src/pixi-vn.keys.gen.ts +2 -3
  117. package/template-react-vite-muijoy-tauri/src-tauri/Cargo.toml +1 -0
  118. package/template-react-vite-muijoy-tauri/src-tauri/src/lib.rs +32 -20
  119. package/template-react-vite-muijoy-tauri/src-tauri/src/system_info.rs +33 -0
@@ -6,7 +6,14 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
6
6
  import { useQuit } from "@/lib/hooks/quit-hooks";
7
7
  import { Game } from "@drincs/pixi-vn";
8
8
  import { useLocation, useNavigate } from "@tanstack/react-router";
9
- import { Gamepad2Icon, HistoryIcon, LogOutIcon, PowerIcon, SaveIcon } from "lucide-react";
9
+ import {
10
+ Gamepad2Icon,
11
+ HistoryIcon,
12
+ LogOutIcon,
13
+ PowerIcon,
14
+ SaveIcon,
15
+ StethoscopeIcon,
16
+ } from "lucide-react";
10
17
  import { useTranslation } from "react-i18next";
11
18
 
12
19
  export function QuickMenus() {
@@ -19,6 +26,7 @@ export function QuickMenus() {
19
26
  {isInGame && <OpenHistorySettingButton />}
20
27
  <SaveLoadMenuButton />
21
28
  <OpenControlsListSettingButton />
29
+ <OpenDiagnosticsSettingButton />
22
30
  </div>
23
31
  {isInGame && <Separator />}
24
32
  {isInGame && <ReturnMainMenuButton />}
@@ -51,6 +59,29 @@ export function OpenControlsListSettingButton() {
51
59
  );
52
60
  }
53
61
 
62
+ export function OpenDiagnosticsSettingButton() {
63
+ const { t } = useTranslation(["ui"]);
64
+ const setSettingsOpen = useSetSearchParamState<boolean>("settings");
65
+ const setSettingsTab = useSetSearchParamState<string>("settings_tab");
66
+
67
+ return (
68
+ <Button
69
+ variant="outline"
70
+ className="w-full justify-start"
71
+ onClick={() => {
72
+ setSettingsOpen(true);
73
+ setSettingsTab("menus/diagnostics");
74
+ }}
75
+ >
76
+ <StethoscopeIcon />
77
+ {t("diagnostics")}
78
+ <KbdGroup className="ml-auto">
79
+ <Kbd>F8</Kbd>
80
+ </KbdGroup>
81
+ </Button>
82
+ );
83
+ }
84
+
54
85
  export function ReturnMainMenuButton() {
55
86
  const navigate = useNavigate();
56
87
  const { t } = useTranslation(["ui"]);
@@ -0,0 +1,96 @@
1
+ import { systemInfo } from "@/lib/system-info";
2
+ import {
3
+ type DeviceDiagnosticsSnapshot,
4
+ type NativeDiagnostics,
5
+ detectBrowserEngine,
6
+ detectPlatform,
7
+ getBrowserCapabilities,
8
+ getCurrentFps,
9
+ getEngineVersion,
10
+ getGameVersion,
11
+ getJsMemoryInfo,
12
+ getMobileDiagnostics,
13
+ getMotionVersion,
14
+ getPixiJsVersion,
15
+ getPixiVnVersion,
16
+ getResolutionInfo,
17
+ getToneJsVersion,
18
+ getWebglDiagnostics,
19
+ } from "@/lib/utils/device-diagnostics-utility";
20
+ import { useEffect, useMemo, useState } from "react";
21
+
22
+ const LIVE_REFRESH_INTERVAL_MS = 1000;
23
+
24
+ /**
25
+ * WebGL support, browser capabilities, UA, platform and engine don't change during a session,
26
+ * so they're probed once. FPS, resolution and JS memory are polled since they change live.
27
+ */
28
+ export function useDeviceDiagnostics(): DeviceDiagnosticsSnapshot {
29
+ const webgl = useMemo(() => getWebglDiagnostics(), []);
30
+ const capabilities = useMemo(() => getBrowserCapabilities(), []);
31
+ const platform = useMemo(() => detectPlatform(), []);
32
+ const browserEngine = useMemo(() => detectBrowserEngine(), []);
33
+ const engineVersion = useMemo(() => getEngineVersion(), []);
34
+ const gameVersion = useMemo(() => getGameVersion(), []);
35
+ const pixiJsVersion = useMemo(() => getPixiJsVersion(), []);
36
+ const pixiVnVersion = useMemo(() => getPixiVnVersion(), []);
37
+ const toneJsVersion = useMemo(() => getToneJsVersion(), []);
38
+ const motionVersion = useMemo(() => getMotionVersion(), []);
39
+
40
+ const [resolution, setResolution] = useState(() => getResolutionInfo());
41
+ const [mobile, setMobile] = useState(() => getMobileDiagnostics());
42
+ const [memory, setMemory] = useState(() => getJsMemoryInfo());
43
+ const [fps, setFps] = useState<number | null>(() => getCurrentFps());
44
+ // Only ever populated inside the Tauri app — stays null in the browser build.
45
+ const [native, setNative] = useState<NativeDiagnostics | null>(null);
46
+
47
+ useEffect(() => {
48
+ let cancelled = false;
49
+ Promise.all([systemInfo.getSystemInfo(), systemInfo.getWebviewVersion()]).then(
50
+ ([info, webviewVersion]) => {
51
+ if (cancelled || !info) return;
52
+ setNative({ ...info, webviewVersion });
53
+ },
54
+ );
55
+ return () => {
56
+ cancelled = true;
57
+ };
58
+ }, []);
59
+
60
+ useEffect(() => {
61
+ // A resize also fires on orientation changes, so refresh both together.
62
+ const onResize = () => {
63
+ setResolution(getResolutionInfo());
64
+ setMobile(getMobileDiagnostics());
65
+ };
66
+ window.addEventListener("resize", onResize);
67
+ return () => window.removeEventListener("resize", onResize);
68
+ }, []);
69
+
70
+ useEffect(() => {
71
+ const interval = setInterval(() => {
72
+ setFps(getCurrentFps());
73
+ setMemory(getJsMemoryInfo());
74
+ }, LIVE_REFRESH_INTERVAL_MS);
75
+ return () => clearInterval(interval);
76
+ }, []);
77
+
78
+ return {
79
+ webgl,
80
+ capabilities,
81
+ mobile,
82
+ native,
83
+ resolution,
84
+ memory,
85
+ fps,
86
+ userAgent: navigator.userAgent,
87
+ platform,
88
+ browserEngine,
89
+ engineVersion,
90
+ gameVersion,
91
+ pixiJsVersion,
92
+ pixiVnVersion,
93
+ toneJsVersion,
94
+ motionVersion,
95
+ };
96
+ }
@@ -175,6 +175,11 @@ export function useSettingsHotkeys(): null {
175
175
  setSettingsTab("menus/controls");
176
176
  }, [setSettingsOpen, setSettingsTab]);
177
177
 
178
+ const openDiagnosticsPage = useCallback(() => {
179
+ setSettingsOpen(true);
180
+ setSettingsTab("menus/diagnostics");
181
+ }, [setSettingsOpen, setSettingsTab]);
182
+
178
183
  useHotkeys([
179
184
  {
180
185
  hotkey: "Escape",
@@ -197,6 +202,17 @@ export function useSettingsHotkeys(): null {
197
202
  },
198
203
  },
199
204
  },
205
+ {
206
+ hotkey: "F8",
207
+ callback: openDiagnosticsPage,
208
+ options: {
209
+ enabled: !isAnyMenuOrDialogOpen,
210
+ meta: {
211
+ name: t("diagnostics"),
212
+ description: t("diagnostics_hotkey_description"),
213
+ },
214
+ },
215
+ },
200
216
  ]);
201
217
 
202
218
  return null;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Native system info — thin wrappers around Tauri commands exposed by
3
+ * `src-tauri/src/system_info.rs`. Safe to call even when running outside
4
+ * Tauri (web mode): functions resolve to `null` instead of throwing.
5
+ *
6
+ * These expose OS/distro and WebView engine details that browsers
7
+ * deliberately don't surface to JS (to limit fingerprinting).
8
+ */
9
+
10
+ import { invoke } from "@tauri-apps/api/core";
11
+
12
+ const isTauri = typeof window !== "undefined" && "__TAURI__" in window;
13
+
14
+ export interface NativeSystemInfo {
15
+ /** Specific OS/distro name (e.g. "Ubuntu", "Windows", "Mac OS"), not just the generic platform. */
16
+ osType: string;
17
+ osVersion: string;
18
+ bitness: string;
19
+ architecture: string;
20
+ }
21
+
22
+ interface RawSystemInfo {
23
+ os_type: string;
24
+ os_version: string;
25
+ bitness: string;
26
+ architecture: string;
27
+ }
28
+
29
+ async function call<T>(cmd: string): Promise<T | null> {
30
+ if (!isTauri) return null;
31
+ try {
32
+ return await invoke<T>(cmd);
33
+ } catch {
34
+ return null;
35
+ }
36
+ }
37
+
38
+ export namespace systemInfo {
39
+ export async function getSystemInfo(): Promise<NativeSystemInfo | null> {
40
+ const raw = await call<RawSystemInfo>("get_system_info");
41
+ if (!raw) return null;
42
+ return {
43
+ osType: raw.os_type,
44
+ osVersion: raw.os_version,
45
+ bitness: raw.bitness,
46
+ architecture: raw.architecture,
47
+ };
48
+ }
49
+
50
+ /** Underlying WebView engine version (WebView2, WebKitGTK, WKWebView, Android System WebView). */
51
+ export async function getWebviewVersion(): Promise<string | null> {
52
+ return call<string>("get_webview_version");
53
+ }
54
+ }