create-pixi-vn 2.0.7 → 2.0.9

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 (37) hide show
  1. package/package.json +1 -1
  2. package/template-react-vite-muijoy/src/components/menus/settings/system-controls.tsx +2 -2
  3. package/template-react-vite-muijoy/src/components/quick-tools.tsx +4 -4
  4. package/template-react-vite-muijoy/src/lib/hooks/hotkeys-hooks.ts +4 -4
  5. package/template-react-vite-muijoy/src/lib/hooks/save-hooks.tsx +7 -7
  6. package/template-react-vite-muijoy/src/lib/query/narration-query.ts +12 -12
  7. package/template-react-vite-muijoy/src/lib/query/save-query.ts +4 -4
  8. package/template-react-vite-muijoy/src/lib/query/settings-query.ts +2 -2
  9. package/template-react-vite-muijoy/vite.config.ts +3 -3
  10. package/template-react-vite-muijoy-ink/src/components/menus/settings/system-controls.tsx +2 -2
  11. package/template-react-vite-muijoy-ink/src/components/quick-tools.tsx +4 -4
  12. package/template-react-vite-muijoy-ink/src/lib/hooks/hotkeys-hooks.ts +4 -4
  13. package/template-react-vite-muijoy-ink/src/lib/hooks/save-hooks.tsx +7 -7
  14. package/template-react-vite-muijoy-ink/src/lib/query/narration-query.ts +12 -12
  15. package/template-react-vite-muijoy-ink/src/lib/query/save-query.ts +4 -4
  16. package/template-react-vite-muijoy-ink/src/lib/query/settings-query.ts +2 -2
  17. package/template-react-vite-muijoy-ink/vite.config.ts +3 -3
  18. package/template-react-vite-muijoy-ink-tauri/.assetpack.ts +9 -0
  19. package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/system-controls.tsx +2 -2
  20. package/template-react-vite-muijoy-ink-tauri/src/components/quick-tools.tsx +4 -4
  21. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/hotkeys-hooks.ts +4 -4
  22. package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/save-hooks.tsx +7 -7
  23. package/template-react-vite-muijoy-ink-tauri/src/lib/query/narration-query.ts +12 -12
  24. package/template-react-vite-muijoy-ink-tauri/src/lib/query/save-query.ts +4 -4
  25. package/template-react-vite-muijoy-ink-tauri/src/lib/query/settings-query.ts +2 -2
  26. package/template-react-vite-muijoy-ink-tauri/src-tauri/Cargo.toml +7 -0
  27. package/template-react-vite-muijoy-ink-tauri/vite.config.ts +3 -3
  28. package/template-react-vite-muijoy-tauri/.assetpack.ts +9 -0
  29. package/template-react-vite-muijoy-tauri/src/components/menus/settings/system-controls.tsx +2 -2
  30. package/template-react-vite-muijoy-tauri/src/components/quick-tools.tsx +4 -4
  31. package/template-react-vite-muijoy-tauri/src/lib/hooks/hotkeys-hooks.ts +4 -4
  32. package/template-react-vite-muijoy-tauri/src/lib/hooks/save-hooks.tsx +7 -7
  33. package/template-react-vite-muijoy-tauri/src/lib/query/narration-query.ts +12 -12
  34. package/template-react-vite-muijoy-tauri/src/lib/query/save-query.ts +4 -4
  35. package/template-react-vite-muijoy-tauri/src/lib/query/settings-query.ts +2 -2
  36. package/template-react-vite-muijoy-tauri/src-tauri/Cargo.toml +7 -0
  37. package/template-react-vite-muijoy-tauri/vite.config.ts +3 -3
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pixi-vn",
3
3
  "description": "Create a new Pixi’VN project",
4
- "version": "2.0.7",
4
+ "version": "2.0.9",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0",
7
7
  "author": "DRincs-Productions",
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
14
14
  import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
15
15
  import { downloadResourceToTranslate } from "@/lib/i18n";
16
16
  import {
17
- IS_FULL_SCREEN_MODE_USE_QUEY_KEY,
17
+ IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
18
18
  useQueryIsFullModeScreen,
19
19
  } from "@/lib/query/settings-query";
20
20
  import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
@@ -162,7 +162,7 @@ export function FullScreenSettings() {
162
162
  promise.finally(() => {
163
163
  setLoading(false);
164
164
  queryClient.invalidateQueries({
165
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
165
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
166
166
  });
167
167
  });
168
168
  }}
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
7
7
  import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
8
8
  import { useQueryCanGoBack } from "@/lib/query/narration-query";
9
9
  import {
10
- LAST_SAVE_USE_QUEY_KEY,
11
- SAVES_USE_QUEY_KEY,
10
+ LAST_SAVE_USE_QUERY_KEY,
11
+ SAVES_USE_QUERY_KEY,
12
12
  useQueryLastSave,
13
13
  } from "@/lib/query/save-query";
14
14
  import { AutoSettings } from "@/lib/stores/auto-settings-store";
@@ -105,8 +105,8 @@ export function QuickTools() {
105
105
  className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
106
106
  onClick={() => {
107
107
  const savePromise = saveGameToIndexDB().then((save) => {
108
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
109
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
108
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
109
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
110
110
  });
111
111
  toast.promise(savePromise, {
112
112
  loading: t("saving"),
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
5
  import { useQueryInputValue } from "@/lib/query/narration-query";
6
6
  import {
7
- LAST_SAVE_USE_QUEY_KEY,
8
- SAVES_USE_QUEY_KEY,
7
+ LAST_SAVE_USE_QUERY_KEY,
8
+ SAVES_USE_QUERY_KEY,
9
9
  useQueryLastSave,
10
10
  } from "@/lib/query/save-query";
11
11
  import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
47
47
  return;
48
48
  }
49
49
  const savePromise = saveGameToIndexDB().then((save) => {
50
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
51
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
50
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
51
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
52
52
  });
53
53
  toast.promise(savePromise, {
54
54
  loading: t("saving"),
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
2
2
  import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
3
3
  import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
- import { LAST_SAVE_USE_QUEY_KEY, SAVES_USE_QUEY_KEY } from "@/lib/query/save-query";
5
+ import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
6
6
  import {
7
7
  addRefreshSave,
8
8
  deleteSaveFromIndexDB,
@@ -62,8 +62,8 @@ export function useSaveActions() {
62
62
  onConfirm: () =>
63
63
  deleteSaveFromIndexDB(id)
64
64
  .then(() => {
65
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, id], null);
66
- queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUEY_KEY] });
65
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
66
+ queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
67
67
  toast.success(t("success_delete"));
68
68
  return true;
69
69
  })
@@ -95,8 +95,8 @@ export function useSaveActions() {
95
95
  id,
96
96
  name: tempSaveNameRef.current,
97
97
  }).then((save) => {
98
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
99
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
98
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
99
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
100
100
  });
101
101
  toast.promise(savePromise, {
102
102
  loading: t("saving"),
@@ -138,8 +138,8 @@ export function useSaveActions() {
138
138
  id,
139
139
  name: tempSaveNameRef.current,
140
140
  }).then((save) => {
141
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
142
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
141
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
142
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
143
143
  });
144
144
  toast.promise(savePromise, {
145
145
  loading: t("saving"),
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useTranslation } from "react-i18next";
5
5
 
6
- const CAN_GO_BACK_USE_QUEY_KEY = "can_go_back_use_quey_key";
6
+ const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
7
7
  export function useQueryCanGoBack() {
8
8
  return useQuery({
9
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUEY_KEY],
9
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
10
10
  queryFn: async () => stepHistory.canGoBack,
11
11
  });
12
12
  }
13
13
 
14
- const CHOICE_MENU_OPTIONS_USE_QUEY_KEY = "choice_menu_options_use_quey_key";
14
+ const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
15
15
  export function useQueryChoiceMenuOptions() {
16
16
  const { t } = useTranslation(["narration"]);
17
17
  return useQuery({
18
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUEY_KEY],
18
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
19
19
  queryFn: async () =>
20
20
  narration.choices?.map((option) => ({
21
21
  ...option,
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
27
27
  });
28
28
  }
29
29
 
30
- const INPUT_VALUE_USE_QUEY_KEY = "input_value_use_quey_key";
30
+ const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
31
31
  export function useQueryInputValue<T>() {
32
32
  return useQuery({
33
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUEY_KEY],
33
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
34
34
  queryFn: async () => ({
35
35
  isRequired: narration.isRequiredInput,
36
36
  type: narration.inputType,
@@ -44,13 +44,13 @@ type DialogueModel = {
44
44
  text?: string;
45
45
  character?: CharacterInterface;
46
46
  };
47
- const DIALOGUE_USE_QUEY_KEY = "dialogue_use_quey_key";
47
+ const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
48
48
  export function useQueryDialogue() {
49
49
  const { t } = useTranslation(["narration"]);
50
50
  const queryClient = useQueryClient();
51
51
 
52
52
  return useQuery<DialogueModel>({
53
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUEY_KEY],
53
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
54
54
  queryFn: async ({ queryKey }) => {
55
55
  const dialogue = narration.dialogue;
56
56
  let text = dialogue?.text;
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
89
89
  });
90
90
  }
91
91
 
92
- const CAN_GO_NEXT_USE_QUEY_KEY = "can_go_next_use_quey_key";
92
+ const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
93
93
  export function useQueryCanGoNext() {
94
94
  return useQuery({
95
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUEY_KEY],
95
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
96
96
  queryFn: async () => narration.canContinue && !narration.isRequiredInput,
97
97
  });
98
98
  }
99
99
 
100
- const NARRATIVE_HISTORY_USE_QUEY_KEY = "narrative_history_use_quey_key";
100
+ const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
101
101
  export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
102
102
  const { t } = useTranslation(["narration"]);
103
103
  const normalizedSearch = searchString?.toLowerCase().trim();
104
104
 
105
105
  return useQuery({
106
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUEY_KEY],
106
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
107
107
  queryFn: async () => {
108
108
  const promises = stepHistory.narrativeHistory.map(async (step) => {
109
109
  const character = step.dialogue?.character;
@@ -1,18 +1,18 @@
1
1
  import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
 
4
- export const SAVES_USE_QUEY_KEY = "saves_use_quey_key";
4
+ export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
5
5
  export function useQuerySaves({ id }: { id: number }) {
6
6
  return useQuery({
7
- queryKey: [SAVES_USE_QUEY_KEY, id],
7
+ queryKey: [SAVES_USE_QUERY_KEY, id],
8
8
  queryFn: async () => (await getSaveFromIndexDB(id)) || null,
9
9
  });
10
10
  }
11
11
 
12
- export const LAST_SAVE_USE_QUEY_KEY = "last_save_use_quey_key";
12
+ export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
13
13
  export function useQueryLastSave() {
14
14
  return useQuery({
15
- queryKey: [LAST_SAVE_USE_QUEY_KEY],
15
+ queryKey: [LAST_SAVE_USE_QUERY_KEY],
16
16
  queryFn: async () => (await getLastSaveFromIndexDB()) || null,
17
17
  });
18
18
  }
@@ -1,10 +1,10 @@
1
1
  import { useQuery } from "@tanstack/react-query";
2
2
 
3
- export const IS_FULL_SCREEN_MODE_USE_QUEY_KEY = "is_full_screen_mode_use_quey_key";
3
+ export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
4
4
 
5
5
  export function useQueryIsFullModeScreen() {
6
6
  return useQuery({
7
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
7
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
8
8
  queryFn: async () => document.fullscreenElement !== null,
9
9
  });
10
10
  }
@@ -19,7 +19,7 @@ import assetPackConfig from "./.assetpack.ts";
19
19
  const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
20
20
 
21
21
  // https://vite.dev/config/
22
- export default defineConfig({
22
+ export default defineConfig(({ mode }) => ({
23
23
  plugins: [
24
24
  assetpackPlugin(),
25
25
  checker({
@@ -27,7 +27,7 @@ export default defineConfig({
27
27
  tsconfigPath: "tsconfig.app.json",
28
28
  },
29
29
  }),
30
- devtools(),
30
+ mode !== "production" && devtools(),
31
31
  tanstackRouter({ target: "react", autoCodeSplitting: true }),
32
32
  react(),
33
33
  tailwindcss(),
@@ -112,7 +112,7 @@ export default defineConfig({
112
112
  },
113
113
  },
114
114
  },
115
- });
115
+ }));
116
116
 
117
117
  function assetpackPlugin(): Plugin {
118
118
  let mode: ResolvedConfig["command"];
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
14
14
  import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
15
15
  import { downloadResourceToTranslate } from "@/lib/i18n";
16
16
  import {
17
- IS_FULL_SCREEN_MODE_USE_QUEY_KEY,
17
+ IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
18
18
  useQueryIsFullModeScreen,
19
19
  } from "@/lib/query/settings-query";
20
20
  import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
@@ -162,7 +162,7 @@ export function FullScreenSettings() {
162
162
  promise.finally(() => {
163
163
  setLoading(false);
164
164
  queryClient.invalidateQueries({
165
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
165
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
166
166
  });
167
167
  });
168
168
  }}
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
7
7
  import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
8
8
  import { useQueryCanGoBack } from "@/lib/query/narration-query";
9
9
  import {
10
- LAST_SAVE_USE_QUEY_KEY,
11
- SAVES_USE_QUEY_KEY,
10
+ LAST_SAVE_USE_QUERY_KEY,
11
+ SAVES_USE_QUERY_KEY,
12
12
  useQueryLastSave,
13
13
  } from "@/lib/query/save-query";
14
14
  import { AutoSettings } from "@/lib/stores/auto-settings-store";
@@ -105,8 +105,8 @@ export function QuickTools() {
105
105
  className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
106
106
  onClick={() => {
107
107
  const savePromise = saveGameToIndexDB().then((save) => {
108
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
109
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
108
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
109
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
110
110
  });
111
111
  toast.promise(savePromise, {
112
112
  loading: t("saving"),
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
5
  import { useQueryInputValue } from "@/lib/query/narration-query";
6
6
  import {
7
- LAST_SAVE_USE_QUEY_KEY,
8
- SAVES_USE_QUEY_KEY,
7
+ LAST_SAVE_USE_QUERY_KEY,
8
+ SAVES_USE_QUERY_KEY,
9
9
  useQueryLastSave,
10
10
  } from "@/lib/query/save-query";
11
11
  import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
47
47
  return;
48
48
  }
49
49
  const savePromise = saveGameToIndexDB().then((save) => {
50
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
51
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
50
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
51
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
52
52
  });
53
53
  toast.promise(savePromise, {
54
54
  loading: t("saving"),
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
2
2
  import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
3
3
  import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
- import { LAST_SAVE_USE_QUEY_KEY, SAVES_USE_QUEY_KEY } from "@/lib/query/save-query";
5
+ import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
6
6
  import {
7
7
  addRefreshSave,
8
8
  deleteSaveFromIndexDB,
@@ -62,8 +62,8 @@ export function useSaveActions() {
62
62
  onConfirm: () =>
63
63
  deleteSaveFromIndexDB(id)
64
64
  .then(() => {
65
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, id], null);
66
- queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUEY_KEY] });
65
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
66
+ queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
67
67
  toast.success(t("success_delete"));
68
68
  return true;
69
69
  })
@@ -95,8 +95,8 @@ export function useSaveActions() {
95
95
  id,
96
96
  name: tempSaveNameRef.current,
97
97
  }).then((save) => {
98
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
99
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
98
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
99
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
100
100
  });
101
101
  toast.promise(savePromise, {
102
102
  loading: t("saving"),
@@ -138,8 +138,8 @@ export function useSaveActions() {
138
138
  id,
139
139
  name: tempSaveNameRef.current,
140
140
  }).then((save) => {
141
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
142
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
141
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
142
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
143
143
  });
144
144
  toast.promise(savePromise, {
145
145
  loading: t("saving"),
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useTranslation } from "react-i18next";
5
5
 
6
- const CAN_GO_BACK_USE_QUEY_KEY = "can_go_back_use_quey_key";
6
+ const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
7
7
  export function useQueryCanGoBack() {
8
8
  return useQuery({
9
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUEY_KEY],
9
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
10
10
  queryFn: async () => stepHistory.canGoBack,
11
11
  });
12
12
  }
13
13
 
14
- const CHOICE_MENU_OPTIONS_USE_QUEY_KEY = "choice_menu_options_use_quey_key";
14
+ const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
15
15
  export function useQueryChoiceMenuOptions() {
16
16
  const { t } = useTranslation(["narration"]);
17
17
  return useQuery({
18
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUEY_KEY],
18
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
19
19
  queryFn: async () =>
20
20
  narration.choices?.map((option) => ({
21
21
  ...option,
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
27
27
  });
28
28
  }
29
29
 
30
- const INPUT_VALUE_USE_QUEY_KEY = "input_value_use_quey_key";
30
+ const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
31
31
  export function useQueryInputValue<T>() {
32
32
  return useQuery({
33
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUEY_KEY],
33
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
34
34
  queryFn: async () => ({
35
35
  isRequired: narration.isRequiredInput,
36
36
  type: narration.inputType,
@@ -44,13 +44,13 @@ type DialogueModel = {
44
44
  text?: string;
45
45
  character?: CharacterInterface;
46
46
  };
47
- const DIALOGUE_USE_QUEY_KEY = "dialogue_use_quey_key";
47
+ const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
48
48
  export function useQueryDialogue() {
49
49
  const { t } = useTranslation(["narration"]);
50
50
  const queryClient = useQueryClient();
51
51
 
52
52
  return useQuery<DialogueModel>({
53
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUEY_KEY],
53
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
54
54
  queryFn: async ({ queryKey }) => {
55
55
  const dialogue = narration.dialogue;
56
56
  let text = dialogue?.text;
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
89
89
  });
90
90
  }
91
91
 
92
- const CAN_GO_NEXT_USE_QUEY_KEY = "can_go_next_use_quey_key";
92
+ const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
93
93
  export function useQueryCanGoNext() {
94
94
  return useQuery({
95
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUEY_KEY],
95
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
96
96
  queryFn: async () => narration.canContinue && !narration.isRequiredInput,
97
97
  });
98
98
  }
99
99
 
100
- const NARRATIVE_HISTORY_USE_QUEY_KEY = "narrative_history_use_quey_key";
100
+ const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
101
101
  export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
102
102
  const { t } = useTranslation(["narration"]);
103
103
  const normalizedSearch = searchString?.toLowerCase().trim();
104
104
 
105
105
  return useQuery({
106
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUEY_KEY],
106
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
107
107
  queryFn: async () => {
108
108
  const promises = stepHistory.narrativeHistory.map(async (step) => {
109
109
  const character = step.dialogue?.character;
@@ -1,18 +1,18 @@
1
1
  import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
 
4
- export const SAVES_USE_QUEY_KEY = "saves_use_quey_key";
4
+ export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
5
5
  export function useQuerySaves({ id }: { id: number }) {
6
6
  return useQuery({
7
- queryKey: [SAVES_USE_QUEY_KEY, id],
7
+ queryKey: [SAVES_USE_QUERY_KEY, id],
8
8
  queryFn: async () => (await getSaveFromIndexDB(id)) || null,
9
9
  });
10
10
  }
11
11
 
12
- export const LAST_SAVE_USE_QUEY_KEY = "last_save_use_quey_key";
12
+ export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
13
13
  export function useQueryLastSave() {
14
14
  return useQuery({
15
- queryKey: [LAST_SAVE_USE_QUEY_KEY],
15
+ queryKey: [LAST_SAVE_USE_QUERY_KEY],
16
16
  queryFn: async () => (await getLastSaveFromIndexDB()) || null,
17
17
  });
18
18
  }
@@ -1,10 +1,10 @@
1
1
  import { useQuery } from "@tanstack/react-query";
2
2
 
3
- export const IS_FULL_SCREEN_MODE_USE_QUEY_KEY = "is_full_screen_mode_use_quey_key";
3
+ export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
4
4
 
5
5
  export function useQueryIsFullModeScreen() {
6
6
  return useQuery({
7
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
7
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
8
8
  queryFn: async () => document.fullscreenElement !== null,
9
9
  });
10
10
  }
@@ -20,7 +20,7 @@ import assetPackConfig from "./.assetpack.ts";
20
20
  const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
21
21
 
22
22
  // https://vite.dev/config/
23
- export default defineConfig({
23
+ export default defineConfig(({ mode }) => ({
24
24
  plugins: [
25
25
  assetpackPlugin(),
26
26
  checker({
@@ -28,7 +28,7 @@ export default defineConfig({
28
28
  tsconfigPath: "tsconfig.app.json",
29
29
  },
30
30
  }),
31
- devtools(),
31
+ mode !== "production" && devtools(),
32
32
  tanstackRouter({ target: "react", autoCodeSplitting: true }),
33
33
  react(),
34
34
  tailwindcss(),
@@ -118,7 +118,7 @@ export default defineConfig({
118
118
  },
119
119
  },
120
120
  },
121
- });
121
+ }));
122
122
 
123
123
  function assetpackPlugin(): Plugin {
124
124
  let mode: ResolvedConfig["command"];
@@ -1,6 +1,9 @@
1
1
  import type { AssetPackConfig } from "@assetpack/core";
2
2
  import { pixiPipes } from "@assetpack/core/pixi";
3
3
 
4
+ // TAURI_ENV_TARGET_TRIPLE is set by `tauri build` before running beforeBuildCommand
5
+ const isTauri = !!process.env.TAURI_ENV_TARGET_TRIPLE;
6
+
4
7
  const config: AssetPackConfig = {
5
8
  entry: "./src/assets",
6
9
  output: "./public/assets",
@@ -11,6 +14,12 @@ const config: AssetPackConfig = {
11
14
  output: "src/assets/manifest.gen.json",
12
15
  createShortcuts: true,
13
16
  },
17
+ // For Tauri: skip @0.5x mipmaps (unused on desktop, WebView handles DPR)
18
+ resolutions: isTauri ? { default: 1 } : undefined,
19
+ // For Tauri: raise WebP quality — files are local so bandwidth is not a concern
20
+ compression: isTauri
21
+ ? { png: true, jpg: true, webp: { quality: 88, alphaQuality: 88 } }
22
+ : undefined,
14
23
  }),
15
24
  ],
16
25
  };
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
14
14
  import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
15
15
  import { downloadResourceToTranslate } from "@/lib/i18n";
16
16
  import {
17
- IS_FULL_SCREEN_MODE_USE_QUEY_KEY,
17
+ IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
18
18
  useQueryIsFullModeScreen,
19
19
  } from "@/lib/query/settings-query";
20
20
  import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
@@ -172,7 +172,7 @@ export function FullScreenSettings() {
172
172
  promise.finally(() => {
173
173
  setLoading(false);
174
174
  queryClient.invalidateQueries({
175
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
175
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
176
176
  });
177
177
  });
178
178
  }}
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
7
7
  import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
8
8
  import { useQueryCanGoBack } from "@/lib/query/narration-query";
9
9
  import {
10
- LAST_SAVE_USE_QUEY_KEY,
11
- SAVES_USE_QUEY_KEY,
10
+ LAST_SAVE_USE_QUERY_KEY,
11
+ SAVES_USE_QUERY_KEY,
12
12
  useQueryLastSave,
13
13
  } from "@/lib/query/save-query";
14
14
  import { AutoSettings } from "@/lib/stores/auto-settings-store";
@@ -105,8 +105,8 @@ export function QuickTools() {
105
105
  className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
106
106
  onClick={() => {
107
107
  const savePromise = saveGameToIndexDB().then((save) => {
108
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
109
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
108
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
109
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
110
110
  });
111
111
  toast.promise(savePromise, {
112
112
  loading: t("saving"),
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
5
  import { useQueryInputValue } from "@/lib/query/narration-query";
6
6
  import {
7
- LAST_SAVE_USE_QUEY_KEY,
8
- SAVES_USE_QUEY_KEY,
7
+ LAST_SAVE_USE_QUERY_KEY,
8
+ SAVES_USE_QUERY_KEY,
9
9
  useQueryLastSave,
10
10
  } from "@/lib/query/save-query";
11
11
  import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
47
47
  return;
48
48
  }
49
49
  const savePromise = saveGameToIndexDB().then((save) => {
50
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
51
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
50
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
51
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
52
52
  });
53
53
  toast.promise(savePromise, {
54
54
  loading: t("saving"),
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
2
2
  import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
3
3
  import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
- import { LAST_SAVE_USE_QUEY_KEY, SAVES_USE_QUEY_KEY } from "@/lib/query/save-query";
5
+ import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
6
6
  import {
7
7
  addRefreshSave,
8
8
  deleteSaveFromIndexDB,
@@ -62,8 +62,8 @@ export function useSaveActions() {
62
62
  onConfirm: () =>
63
63
  deleteSaveFromIndexDB(id)
64
64
  .then(() => {
65
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, id], null);
66
- queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUEY_KEY] });
65
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
66
+ queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
67
67
  toast.success(t("success_delete"));
68
68
  return true;
69
69
  })
@@ -95,8 +95,8 @@ export function useSaveActions() {
95
95
  id,
96
96
  name: tempSaveNameRef.current,
97
97
  }).then((save) => {
98
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
99
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
98
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
99
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
100
100
  });
101
101
  toast.promise(savePromise, {
102
102
  loading: t("saving"),
@@ -138,8 +138,8 @@ export function useSaveActions() {
138
138
  id,
139
139
  name: tempSaveNameRef.current,
140
140
  }).then((save) => {
141
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
142
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
141
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
142
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
143
143
  });
144
144
  toast.promise(savePromise, {
145
145
  loading: t("saving"),
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useTranslation } from "react-i18next";
5
5
 
6
- const CAN_GO_BACK_USE_QUEY_KEY = "can_go_back_use_quey_key";
6
+ const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
7
7
  export function useQueryCanGoBack() {
8
8
  return useQuery({
9
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUEY_KEY],
9
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
10
10
  queryFn: async () => stepHistory.canGoBack,
11
11
  });
12
12
  }
13
13
 
14
- const CHOICE_MENU_OPTIONS_USE_QUEY_KEY = "choice_menu_options_use_quey_key";
14
+ const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
15
15
  export function useQueryChoiceMenuOptions() {
16
16
  const { t } = useTranslation(["narration"]);
17
17
  return useQuery({
18
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUEY_KEY],
18
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
19
19
  queryFn: async () =>
20
20
  narration.choices?.map((option) => ({
21
21
  ...option,
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
27
27
  });
28
28
  }
29
29
 
30
- const INPUT_VALUE_USE_QUEY_KEY = "input_value_use_quey_key";
30
+ const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
31
31
  export function useQueryInputValue<T>() {
32
32
  return useQuery({
33
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUEY_KEY],
33
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
34
34
  queryFn: async () => ({
35
35
  isRequired: narration.isRequiredInput,
36
36
  type: narration.inputType,
@@ -44,13 +44,13 @@ type DialogueModel = {
44
44
  text?: string;
45
45
  character?: CharacterInterface;
46
46
  };
47
- const DIALOGUE_USE_QUEY_KEY = "dialogue_use_quey_key";
47
+ const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
48
48
  export function useQueryDialogue() {
49
49
  const { t } = useTranslation(["narration"]);
50
50
  const queryClient = useQueryClient();
51
51
 
52
52
  return useQuery<DialogueModel>({
53
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUEY_KEY],
53
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
54
54
  queryFn: async ({ queryKey }) => {
55
55
  const dialogue = narration.dialogue;
56
56
  let text = dialogue?.text;
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
89
89
  });
90
90
  }
91
91
 
92
- const CAN_GO_NEXT_USE_QUEY_KEY = "can_go_next_use_quey_key";
92
+ const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
93
93
  export function useQueryCanGoNext() {
94
94
  return useQuery({
95
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUEY_KEY],
95
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
96
96
  queryFn: async () => narration.canContinue && !narration.isRequiredInput,
97
97
  });
98
98
  }
99
99
 
100
- const NARRATIVE_HISTORY_USE_QUEY_KEY = "narrative_history_use_quey_key";
100
+ const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
101
101
  export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
102
102
  const { t } = useTranslation(["narration"]);
103
103
  const normalizedSearch = searchString?.toLowerCase().trim();
104
104
 
105
105
  return useQuery({
106
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUEY_KEY],
106
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
107
107
  queryFn: async () => {
108
108
  const promises = stepHistory.narrativeHistory.map(async (step) => {
109
109
  const character = step.dialogue?.character;
@@ -1,18 +1,18 @@
1
1
  import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
 
4
- export const SAVES_USE_QUEY_KEY = "saves_use_quey_key";
4
+ export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
5
5
  export function useQuerySaves({ id }: { id: number }) {
6
6
  return useQuery({
7
- queryKey: [SAVES_USE_QUEY_KEY, id],
7
+ queryKey: [SAVES_USE_QUERY_KEY, id],
8
8
  queryFn: async () => (await getSaveFromIndexDB(id)) || null,
9
9
  });
10
10
  }
11
11
 
12
- export const LAST_SAVE_USE_QUEY_KEY = "last_save_use_quey_key";
12
+ export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
13
13
  export function useQueryLastSave() {
14
14
  return useQuery({
15
- queryKey: [LAST_SAVE_USE_QUEY_KEY],
15
+ queryKey: [LAST_SAVE_USE_QUERY_KEY],
16
16
  queryFn: async () => (await getLastSaveFromIndexDB()) || null,
17
17
  });
18
18
  }
@@ -1,11 +1,11 @@
1
1
  import { useQuery } from "@tanstack/react-query";
2
2
  import { getCurrentWindow } from "@tauri-apps/api/window";
3
3
 
4
- export const IS_FULL_SCREEN_MODE_USE_QUEY_KEY = "is_full_screen_mode_use_quey_key";
4
+ export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
5
5
 
6
6
  export function useQueryIsFullModeScreen() {
7
7
  return useQuery({
8
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
8
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
9
9
  queryFn: async () => {
10
10
  if (window.__TAURI__) {
11
11
  return getCurrentWindow().isFullscreen();
@@ -41,3 +41,10 @@ serde = { version = "1", features = ["derive"] }
41
41
  serde_json = "1"
42
42
  steamworks = { version = "0.13", optional = true }
43
43
 
44
+ [profile.release]
45
+ opt-level = "z" # max runtime performance
46
+ lto = true # link-time optimization — removes dead code across crates
47
+ codegen-units = 1 # slower compile, smaller output
48
+ panic = "abort" # no stack unwinding machinery
49
+ strip = true # strip symbols from the binary
50
+
@@ -22,7 +22,7 @@ const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
22
22
  const host = process.env.TAURI_DEV_HOST;
23
23
 
24
24
  // https://vite.dev/config/
25
- export default defineConfig({
25
+ export default defineConfig(({ mode }) => ({
26
26
  plugins: [
27
27
  assetpackPlugin(),
28
28
  checker({
@@ -30,7 +30,7 @@ export default defineConfig({
30
30
  tsconfigPath: "tsconfig.app.json",
31
31
  },
32
32
  }),
33
- devtools(),
33
+ mode !== "production" && devtools(),
34
34
  tanstackRouter({ target: "react", autoCodeSplitting: true }),
35
35
  react(),
36
36
  tailwindcss(),
@@ -142,7 +142,7 @@ export default defineConfig({
142
142
  ignored: ["**/src-tauri/**"],
143
143
  },
144
144
  },
145
- });
145
+ }));
146
146
 
147
147
  function assetpackPlugin(): Plugin {
148
148
  let mode: ResolvedConfig["command"];
@@ -1,6 +1,9 @@
1
1
  import type { AssetPackConfig } from "@assetpack/core";
2
2
  import { pixiPipes } from "@assetpack/core/pixi";
3
3
 
4
+ // TAURI_ENV_TARGET_TRIPLE is set by `tauri build` before running beforeBuildCommand
5
+ const isTauri = !!process.env.TAURI_ENV_TARGET_TRIPLE;
6
+
4
7
  const config: AssetPackConfig = {
5
8
  entry: "./src/assets",
6
9
  output: "./public/assets",
@@ -11,6 +14,12 @@ const config: AssetPackConfig = {
11
14
  output: "src/assets/manifest.gen.json",
12
15
  createShortcuts: true,
13
16
  },
17
+ // For Tauri: skip @0.5x mipmaps (unused on desktop, WebView handles DPR)
18
+ resolutions: isTauri ? { default: 1 } : undefined,
19
+ // For Tauri: raise WebP quality — files are local so bandwidth is not a concern
20
+ compression: isTauri
21
+ ? { png: true, jpg: true, webp: { quality: 88, alphaQuality: 88 } }
22
+ : undefined,
14
23
  }),
15
24
  ],
16
25
  };
@@ -14,7 +14,7 @@ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/comp
14
14
  import { useLanguageSettings } from "@/lib/hooks/language-settings-hooks";
15
15
  import { downloadResourceToTranslate } from "@/lib/i18n";
16
16
  import {
17
- IS_FULL_SCREEN_MODE_USE_QUEY_KEY,
17
+ IS_FULL_SCREEN_MODE_USE_QUERY_KEY,
18
18
  useQueryIsFullModeScreen,
19
19
  } from "@/lib/query/settings-query";
20
20
  import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
@@ -172,7 +172,7 @@ export function FullScreenSettings() {
172
172
  promise.finally(() => {
173
173
  setLoading(false);
174
174
  queryClient.invalidateQueries({
175
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
175
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
176
176
  });
177
177
  });
178
178
  }}
@@ -7,8 +7,8 @@ import { useGameProps } from "@/lib/hooks/props-hooks";
7
7
  import { useWheelActions } from "@/lib/hooks/quick-tools-hooks";
8
8
  import { useQueryCanGoBack } from "@/lib/query/narration-query";
9
9
  import {
10
- LAST_SAVE_USE_QUEY_KEY,
11
- SAVES_USE_QUEY_KEY,
10
+ LAST_SAVE_USE_QUERY_KEY,
11
+ SAVES_USE_QUERY_KEY,
12
12
  useQueryLastSave,
13
13
  } from "@/lib/query/save-query";
14
14
  import { AutoSettings } from "@/lib/stores/auto-settings-store";
@@ -105,8 +105,8 @@ export function QuickTools() {
105
105
  className="h-5 px-1 text-[10px] sm:h-6 sm:px-2 sm:text-xs"
106
106
  onClick={() => {
107
107
  const savePromise = saveGameToIndexDB().then((save) => {
108
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
109
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
108
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
109
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
110
110
  });
111
111
  toast.promise(savePromise, {
112
112
  loading: t("saving"),
@@ -4,8 +4,8 @@ import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
5
  import { useQueryInputValue } from "@/lib/query/narration-query";
6
6
  import {
7
- LAST_SAVE_USE_QUEY_KEY,
8
- SAVES_USE_QUEY_KEY,
7
+ LAST_SAVE_USE_QUERY_KEY,
8
+ SAVES_USE_QUERY_KEY,
9
9
  useQueryLastSave,
10
10
  } from "@/lib/query/save-query";
11
11
  import { QuickActionsWheelState } from "@/lib/stores/quick-actions-wheel-store";
@@ -47,8 +47,8 @@ export function useSaveHotkeys(): null {
47
47
  return;
48
48
  }
49
49
  const savePromise = saveGameToIndexDB().then((save) => {
50
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
51
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
50
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
51
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
52
52
  });
53
53
  toast.promise(savePromise, {
54
54
  loading: t("saving"),
@@ -2,7 +2,7 @@ import { SaveNameInput } from "@/components/menus/save-menu/save-forms";
2
2
  import { useAlertDialog } from "@/components/providers/alert-dialog-provider";
3
3
  import { useSetSearchParamState } from "@/lib/hooks/navigation-hooks";
4
4
  import { useGameProps } from "@/lib/hooks/props-hooks";
5
- import { LAST_SAVE_USE_QUEY_KEY, SAVES_USE_QUEY_KEY } from "@/lib/query/save-query";
5
+ import { LAST_SAVE_USE_QUERY_KEY, SAVES_USE_QUERY_KEY } from "@/lib/query/save-query";
6
6
  import {
7
7
  addRefreshSave,
8
8
  deleteSaveFromIndexDB,
@@ -62,8 +62,8 @@ export function useSaveActions() {
62
62
  onConfirm: () =>
63
63
  deleteSaveFromIndexDB(id)
64
64
  .then(() => {
65
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, id], null);
66
- queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUEY_KEY] });
65
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, id], null);
66
+ queryClient.invalidateQueries({ queryKey: [LAST_SAVE_USE_QUERY_KEY] });
67
67
  toast.success(t("success_delete"));
68
68
  return true;
69
69
  })
@@ -95,8 +95,8 @@ export function useSaveActions() {
95
95
  id,
96
96
  name: tempSaveNameRef.current,
97
97
  }).then((save) => {
98
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
99
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
98
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
99
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
100
100
  });
101
101
  toast.promise(savePromise, {
102
102
  loading: t("saving"),
@@ -138,8 +138,8 @@ export function useSaveActions() {
138
138
  id,
139
139
  name: tempSaveNameRef.current,
140
140
  }).then((save) => {
141
- queryClient.setQueryData([SAVES_USE_QUEY_KEY, save.id], save);
142
- queryClient.setQueryData([LAST_SAVE_USE_QUEY_KEY], save);
141
+ queryClient.setQueryData([SAVES_USE_QUERY_KEY, save.id], save);
142
+ queryClient.setQueryData([LAST_SAVE_USE_QUERY_KEY], save);
143
143
  });
144
144
  toast.promise(savePromise, {
145
145
  loading: t("saving"),
@@ -3,19 +3,19 @@ import { type CharacterInterface, narration, stepHistory } from "@drincs/pixi-vn
3
3
  import { useQuery, useQueryClient } from "@tanstack/react-query";
4
4
  import { useTranslation } from "react-i18next";
5
5
 
6
- const CAN_GO_BACK_USE_QUEY_KEY = "can_go_back_use_quey_key";
6
+ const CAN_GO_BACK_USE_QUERY_KEY = "can_go_back_use_query_key";
7
7
  export function useQueryCanGoBack() {
8
8
  return useQuery({
9
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUEY_KEY],
9
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_BACK_USE_QUERY_KEY],
10
10
  queryFn: async () => stepHistory.canGoBack,
11
11
  });
12
12
  }
13
13
 
14
- const CHOICE_MENU_OPTIONS_USE_QUEY_KEY = "choice_menu_options_use_quey_key";
14
+ const CHOICE_MENU_OPTIONS_USE_QUERY_KEY = "choice_menu_options_use_query_key";
15
15
  export function useQueryChoiceMenuOptions() {
16
16
  const { t } = useTranslation(["narration"]);
17
17
  return useQuery({
18
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUEY_KEY],
18
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CHOICE_MENU_OPTIONS_USE_QUERY_KEY],
19
19
  queryFn: async () =>
20
20
  narration.choices?.map((option) => ({
21
21
  ...option,
@@ -27,10 +27,10 @@ export function useQueryChoiceMenuOptions() {
27
27
  });
28
28
  }
29
29
 
30
- const INPUT_VALUE_USE_QUEY_KEY = "input_value_use_quey_key";
30
+ const INPUT_VALUE_USE_QUERY_KEY = "input_value_use_query_key";
31
31
  export function useQueryInputValue<T>() {
32
32
  return useQuery({
33
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUEY_KEY],
33
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, INPUT_VALUE_USE_QUERY_KEY],
34
34
  queryFn: async () => ({
35
35
  isRequired: narration.isRequiredInput,
36
36
  type: narration.inputType,
@@ -44,13 +44,13 @@ type DialogueModel = {
44
44
  text?: string;
45
45
  character?: CharacterInterface;
46
46
  };
47
- const DIALOGUE_USE_QUEY_KEY = "dialogue_use_quey_key";
47
+ const DIALOGUE_USE_QUERY_KEY = "dialogue_use_query_key";
48
48
  export function useQueryDialogue() {
49
49
  const { t } = useTranslation(["narration"]);
50
50
  const queryClient = useQueryClient();
51
51
 
52
52
  return useQuery<DialogueModel>({
53
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUEY_KEY],
53
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, DIALOGUE_USE_QUERY_KEY],
54
54
  queryFn: async ({ queryKey }) => {
55
55
  const dialogue = narration.dialogue;
56
56
  let text = dialogue?.text;
@@ -89,21 +89,21 @@ export function useQueryDialogue() {
89
89
  });
90
90
  }
91
91
 
92
- const CAN_GO_NEXT_USE_QUEY_KEY = "can_go_next_use_quey_key";
92
+ const CAN_GO_NEXT_USE_QUERY_KEY = "can_go_next_use_query_key";
93
93
  export function useQueryCanGoNext() {
94
94
  return useQuery({
95
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUEY_KEY],
95
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, CAN_GO_NEXT_USE_QUERY_KEY],
96
96
  queryFn: async () => narration.canContinue && !narration.isRequiredInput,
97
97
  });
98
98
  }
99
99
 
100
- const NARRATIVE_HISTORY_USE_QUEY_KEY = "narrative_history_use_quey_key";
100
+ const NARRATIVE_HISTORY_USE_QUERY_KEY = "narrative_history_use_query_key";
101
101
  export function useQueryNarrativeHistory({ searchString }: { searchString?: string }) {
102
102
  const { t } = useTranslation(["narration"]);
103
103
  const normalizedSearch = searchString?.toLowerCase().trim();
104
104
 
105
105
  return useQuery({
106
- queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUEY_KEY],
106
+ queryKey: [INTERFACE_DATA_USE_QUERY_KEY, NARRATIVE_HISTORY_USE_QUERY_KEY],
107
107
  queryFn: async () => {
108
108
  const promises = stepHistory.narrativeHistory.map(async (step) => {
109
109
  const character = step.dialogue?.character;
@@ -1,18 +1,18 @@
1
1
  import { getLastSaveFromIndexDB, getSaveFromIndexDB } from "@/lib/utils/save-utility";
2
2
  import { useQuery } from "@tanstack/react-query";
3
3
 
4
- export const SAVES_USE_QUEY_KEY = "saves_use_quey_key";
4
+ export const SAVES_USE_QUERY_KEY = "saves_use_query_key";
5
5
  export function useQuerySaves({ id }: { id: number }) {
6
6
  return useQuery({
7
- queryKey: [SAVES_USE_QUEY_KEY, id],
7
+ queryKey: [SAVES_USE_QUERY_KEY, id],
8
8
  queryFn: async () => (await getSaveFromIndexDB(id)) || null,
9
9
  });
10
10
  }
11
11
 
12
- export const LAST_SAVE_USE_QUEY_KEY = "last_save_use_quey_key";
12
+ export const LAST_SAVE_USE_QUERY_KEY = "last_save_use_query_key";
13
13
  export function useQueryLastSave() {
14
14
  return useQuery({
15
- queryKey: [LAST_SAVE_USE_QUEY_KEY],
15
+ queryKey: [LAST_SAVE_USE_QUERY_KEY],
16
16
  queryFn: async () => (await getLastSaveFromIndexDB()) || null,
17
17
  });
18
18
  }
@@ -1,11 +1,11 @@
1
1
  import { useQuery } from "@tanstack/react-query";
2
2
  import { getCurrentWindow } from "@tauri-apps/api/window";
3
3
 
4
- export const IS_FULL_SCREEN_MODE_USE_QUEY_KEY = "is_full_screen_mode_use_quey_key";
4
+ export const IS_FULL_SCREEN_MODE_USE_QUERY_KEY = "is_full_screen_mode_use_query_key";
5
5
 
6
6
  export function useQueryIsFullModeScreen() {
7
7
  return useQuery({
8
- queryKey: [IS_FULL_SCREEN_MODE_USE_QUEY_KEY],
8
+ queryKey: [IS_FULL_SCREEN_MODE_USE_QUERY_KEY],
9
9
  queryFn: async () => {
10
10
  if (window.__TAURI__) {
11
11
  return getCurrentWindow().isFullscreen();
@@ -41,3 +41,10 @@ serde = { version = "1", features = ["derive"] }
41
41
  serde_json = "1"
42
42
  steamworks = { version = "0.13", optional = true }
43
43
 
44
+ [profile.release]
45
+ opt-level = "z" # max runtime performance
46
+ lto = true # link-time optimization — removes dead code across crates
47
+ codegen-units = 1 # slower compile, smaller output
48
+ panic = "abort" # no stack unwinding machinery
49
+ strip = true # strip symbols from the binary
50
+
@@ -21,7 +21,7 @@ const CACHED_EXTERNAL_HOSTNAMES: string[] = ["raw.githubusercontent.com"];
21
21
  const host = process.env.TAURI_DEV_HOST;
22
22
 
23
23
  // https://vite.dev/config/
24
- export default defineConfig({
24
+ export default defineConfig(({ mode }) => ({
25
25
  plugins: [
26
26
  assetpackPlugin(),
27
27
  checker({
@@ -29,7 +29,7 @@ export default defineConfig({
29
29
  tsconfigPath: "tsconfig.app.json",
30
30
  },
31
31
  }),
32
- devtools(),
32
+ mode !== "production" && devtools(),
33
33
  tanstackRouter({ target: "react", autoCodeSplitting: true }),
34
34
  react(),
35
35
  tailwindcss(),
@@ -136,7 +136,7 @@ export default defineConfig({
136
136
  ignored: ["**/src-tauri/**"],
137
137
  },
138
138
  },
139
- });
139
+ }));
140
140
 
141
141
  function assetpackPlugin(): Plugin {
142
142
  let mode: ResolvedConfig["command"];