create-pixi-vn 2.0.13 → 2.0.14
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.
- package/dist/index.mjs +36 -35
- package/package.json +1 -1
- package/template-react-vite-muijoy/components.json +1 -1
- package/template-react-vite-muijoy/package-lock.json +663 -967
- package/template-react-vite-muijoy/package.json +10 -11
- package/template-react-vite-muijoy/src/components/dev-devtools.tsx +25 -0
- package/template-react-vite-muijoy/src/components/menus/settings/menus/history.tsx +78 -62
- package/template-react-vite-muijoy/src/components/screens/narration/index.tsx +5 -2
- package/template-react-vite-muijoy/src/components/ui/alert-dialog.tsx +3 -2
- package/template-react-vite-muijoy/src/components/ui/avatar.tsx +2 -2
- package/template-react-vite-muijoy/src/components/ui/breadcrumb.tsx +5 -4
- package/template-react-vite-muijoy/src/components/ui/button-group.tsx +3 -2
- package/template-react-vite-muijoy/src/components/ui/button.tsx +2 -2
- package/template-react-vite-muijoy/src/components/ui/card.tsx +6 -10
- package/template-react-vite-muijoy/src/components/ui/carousel.tsx +10 -7
- package/template-react-vite-muijoy/src/components/ui/drawer.tsx +2 -0
- package/template-react-vite-muijoy/src/components/ui/field.tsx +8 -5
- package/template-react-vite-muijoy/src/components/ui/input-group.tsx +4 -3
- package/template-react-vite-muijoy/src/components/ui/input.tsx +1 -1
- package/template-react-vite-muijoy/src/components/ui/item.tsx +9 -8
- package/template-react-vite-muijoy/src/components/ui/label.tsx +1 -1
- package/template-react-vite-muijoy/src/components/ui/radio-group.tsx +4 -1
- package/template-react-vite-muijoy/src/components/ui/scroll-area.tsx +5 -2
- package/template-react-vite-muijoy/src/components/ui/select.tsx +3 -2
- package/template-react-vite-muijoy/src/components/ui/separator.tsx +2 -0
- package/template-react-vite-muijoy/src/components/ui/sonner.tsx +4 -4
- package/template-react-vite-muijoy/src/components/ui/spinner.tsx +2 -1
- package/template-react-vite-muijoy/src/components/ui/switch.tsx +3 -0
- package/template-react-vite-muijoy/src/components/ui/textarea.tsx +2 -1
- package/template-react-vite-muijoy/src/components/ui/tooltip.tsx +2 -0
- package/template-react-vite-muijoy/src/lib/hooks/hotkeys-hooks.ts +2 -0
- package/template-react-vite-muijoy/src/lib/hooks/narration-hooks.ts +24 -9
- package/template-react-vite-muijoy/src/lib/hooks/navigation-hooks.ts +29 -10
- package/template-react-vite-muijoy/src/main.tsx +0 -1
- package/{template-react-vite-muijoy-tauri/src/pixi-vn-keys.gen.d.ts → template-react-vite-muijoy/src/pixi-vn.keys.gen.ts} +4 -2
- package/template-react-vite-muijoy/src/routeTree.gen.ts +3 -21
- package/template-react-vite-muijoy/src/routes/__root.tsx +10 -20
- package/template-react-vite-muijoy/src/styles.css +43 -43
- package/template-react-vite-muijoy/vite.config.ts +1 -1
- package/template-react-vite-muijoy-ink/components.json +1 -1
- package/template-react-vite-muijoy-ink/package-lock.json +709 -1051
- package/template-react-vite-muijoy-ink/package.json +11 -12
- package/template-react-vite-muijoy-ink/src/components/dev-devtools.tsx +25 -0
- package/template-react-vite-muijoy-ink/src/components/menus/settings/menus/history.tsx +78 -62
- package/template-react-vite-muijoy-ink/src/components/screens/narration/index.tsx +5 -2
- package/template-react-vite-muijoy-ink/src/components/ui/alert-dialog.tsx +3 -2
- package/template-react-vite-muijoy-ink/src/components/ui/avatar.tsx +2 -2
- package/template-react-vite-muijoy-ink/src/components/ui/breadcrumb.tsx +5 -4
- package/template-react-vite-muijoy-ink/src/components/ui/button-group.tsx +3 -2
- package/template-react-vite-muijoy-ink/src/components/ui/button.tsx +2 -2
- package/template-react-vite-muijoy-ink/src/components/ui/card.tsx +6 -10
- package/template-react-vite-muijoy-ink/src/components/ui/carousel.tsx +10 -7
- package/template-react-vite-muijoy-ink/src/components/ui/drawer.tsx +2 -0
- package/template-react-vite-muijoy-ink/src/components/ui/field.tsx +8 -5
- package/template-react-vite-muijoy-ink/src/components/ui/input-group.tsx +4 -3
- package/template-react-vite-muijoy-ink/src/components/ui/input.tsx +1 -1
- package/template-react-vite-muijoy-ink/src/components/ui/item.tsx +9 -8
- package/template-react-vite-muijoy-ink/src/components/ui/label.tsx +1 -1
- package/template-react-vite-muijoy-ink/src/components/ui/radio-group.tsx +4 -1
- package/template-react-vite-muijoy-ink/src/components/ui/scroll-area.tsx +5 -2
- package/template-react-vite-muijoy-ink/src/components/ui/select.tsx +3 -2
- package/template-react-vite-muijoy-ink/src/components/ui/separator.tsx +2 -0
- package/template-react-vite-muijoy-ink/src/components/ui/sonner.tsx +4 -4
- package/template-react-vite-muijoy-ink/src/components/ui/spinner.tsx +2 -1
- package/template-react-vite-muijoy-ink/src/components/ui/switch.tsx +3 -0
- package/template-react-vite-muijoy-ink/src/components/ui/textarea.tsx +2 -1
- package/template-react-vite-muijoy-ink/src/components/ui/tooltip.tsx +2 -0
- package/template-react-vite-muijoy-ink/src/content/ink/hashtag-commands.ts +2 -1
- package/template-react-vite-muijoy-ink/src/lib/hooks/hotkeys-hooks.ts +2 -0
- package/template-react-vite-muijoy-ink/src/lib/hooks/narration-hooks.ts +24 -9
- package/template-react-vite-muijoy-ink/src/lib/hooks/navigation-hooks.ts +29 -10
- package/template-react-vite-muijoy-ink/src/main.tsx +0 -1
- package/template-react-vite-muijoy-ink/src/pixi-vn.keys.gen.ts +24 -0
- package/template-react-vite-muijoy-ink/src/routeTree.gen.ts +3 -21
- package/template-react-vite-muijoy-ink/src/routes/__root.tsx +10 -20
- package/template-react-vite-muijoy-ink/src/styles.css +43 -43
- package/template-react-vite-muijoy-ink/vite.config.ts +1 -1
- package/template-react-vite-muijoy-ink-tauri/components.json +1 -1
- package/template-react-vite-muijoy-ink-tauri/package-lock.json +709 -1051
- package/template-react-vite-muijoy-ink-tauri/package.json +11 -12
- package/template-react-vite-muijoy-ink-tauri/src/components/dev-devtools.tsx +25 -0
- package/template-react-vite-muijoy-ink-tauri/src/components/menus/settings/menus/history.tsx +78 -62
- package/template-react-vite-muijoy-ink-tauri/src/components/screens/narration/index.tsx +5 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/alert-dialog.tsx +3 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/avatar.tsx +2 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/breadcrumb.tsx +5 -4
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/button-group.tsx +3 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/button.tsx +2 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/card.tsx +6 -10
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/carousel.tsx +10 -7
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/drawer.tsx +2 -0
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/field.tsx +8 -5
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/input-group.tsx +4 -3
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/input.tsx +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/item.tsx +9 -8
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/label.tsx +1 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/radio-group.tsx +4 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/scroll-area.tsx +5 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/select.tsx +3 -2
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/separator.tsx +2 -0
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/sonner.tsx +4 -4
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/spinner.tsx +2 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/switch.tsx +3 -0
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/textarea.tsx +2 -1
- package/template-react-vite-muijoy-ink-tauri/src/components/ui/tooltip.tsx +2 -0
- package/template-react-vite-muijoy-ink-tauri/src/content/ink/hashtag-commands.ts +2 -1
- package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/hotkeys-hooks.ts +2 -0
- package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/narration-hooks.ts +24 -9
- package/template-react-vite-muijoy-ink-tauri/src/lib/hooks/navigation-hooks.ts +29 -10
- package/template-react-vite-muijoy-ink-tauri/src/main.tsx +0 -1
- package/{template-react-vite-muijoy-ink/src/pixi-vn-keys.gen.d.ts → template-react-vite-muijoy-ink-tauri/src/pixi-vn.keys.gen.ts} +4 -2
- package/template-react-vite-muijoy-ink-tauri/src/routeTree.gen.ts +3 -21
- package/template-react-vite-muijoy-ink-tauri/src/routes/__root.tsx +10 -20
- package/template-react-vite-muijoy-ink-tauri/src/styles.css +43 -43
- package/template-react-vite-muijoy-ink-tauri/vite.config.ts +1 -1
- package/template-react-vite-muijoy-tauri/components.json +1 -1
- package/template-react-vite-muijoy-tauri/package-lock.json +663 -967
- package/template-react-vite-muijoy-tauri/package.json +10 -11
- package/template-react-vite-muijoy-tauri/src/components/dev-devtools.tsx +25 -0
- package/template-react-vite-muijoy-tauri/src/components/menus/settings/menus/history.tsx +78 -62
- package/template-react-vite-muijoy-tauri/src/components/screens/narration/index.tsx +5 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/alert-dialog.tsx +3 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/avatar.tsx +2 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/breadcrumb.tsx +5 -4
- package/template-react-vite-muijoy-tauri/src/components/ui/button-group.tsx +3 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/button.tsx +2 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/card.tsx +6 -10
- package/template-react-vite-muijoy-tauri/src/components/ui/carousel.tsx +10 -7
- package/template-react-vite-muijoy-tauri/src/components/ui/drawer.tsx +2 -0
- package/template-react-vite-muijoy-tauri/src/components/ui/field.tsx +8 -5
- package/template-react-vite-muijoy-tauri/src/components/ui/input-group.tsx +4 -3
- package/template-react-vite-muijoy-tauri/src/components/ui/input.tsx +1 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/item.tsx +9 -8
- package/template-react-vite-muijoy-tauri/src/components/ui/label.tsx +1 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/radio-group.tsx +4 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/scroll-area.tsx +5 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/select.tsx +3 -2
- package/template-react-vite-muijoy-tauri/src/components/ui/separator.tsx +2 -0
- package/template-react-vite-muijoy-tauri/src/components/ui/sonner.tsx +4 -4
- package/template-react-vite-muijoy-tauri/src/components/ui/spinner.tsx +2 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/switch.tsx +3 -0
- package/template-react-vite-muijoy-tauri/src/components/ui/textarea.tsx +2 -1
- package/template-react-vite-muijoy-tauri/src/components/ui/tooltip.tsx +2 -0
- package/template-react-vite-muijoy-tauri/src/lib/hooks/hotkeys-hooks.ts +2 -0
- package/template-react-vite-muijoy-tauri/src/lib/hooks/narration-hooks.ts +24 -9
- package/template-react-vite-muijoy-tauri/src/lib/hooks/navigation-hooks.ts +29 -10
- package/template-react-vite-muijoy-tauri/src/main.tsx +0 -1
- package/{template-react-vite-muijoy-ink-tauri/src/pixi-vn-keys.gen.d.ts → template-react-vite-muijoy-tauri/src/pixi-vn.keys.gen.ts} +4 -4
- package/template-react-vite-muijoy-tauri/src/routeTree.gen.ts +3 -21
- package/template-react-vite-muijoy-tauri/src/routes/__root.tsx +10 -20
- package/template-react-vite-muijoy-tauri/src/styles.css +43 -43
- package/template-react-vite-muijoy-tauri/vite.config.ts +1 -1
- package/template-react-vite-muijoy/src/pixi-vn-keys.gen.d.ts +0 -20
- package/template-react-vite-muijoy/src/routes/narration.tsx +0 -9
- package/template-react-vite-muijoy-ink/src/routes/narration.tsx +0 -9
- package/template-react-vite-muijoy-ink-tauri/src/routes/narration.tsx +0 -9
- package/template-react-vite-muijoy-tauri/src/routes/narration.tsx +0 -9
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { useTheme } from "next-themes";
|
|
2
|
+
import { Toaster as Sonner, type ToasterProps } from "sonner";
|
|
1
3
|
import {
|
|
2
4
|
CircleCheckIcon,
|
|
3
5
|
InfoIcon,
|
|
4
|
-
Loader2Icon,
|
|
5
|
-
OctagonXIcon,
|
|
6
6
|
TriangleAlertIcon,
|
|
7
|
+
OctagonXIcon,
|
|
8
|
+
Loader2Icon,
|
|
7
9
|
} from "lucide-react";
|
|
8
|
-
import { useTheme } from "next-themes";
|
|
9
|
-
import { Toaster as Sonner, type ToasterProps } from "sonner";
|
|
10
10
|
|
|
11
11
|
const Toaster = ({ ...props }: ToasterProps) => {
|
|
12
12
|
const { theme = "system" } = useTheme();
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { Loader2Icon } from "lucide-react";
|
|
2
1
|
import { cn } from "@/lib/utils";
|
|
2
|
+
import { Loader2Icon } from "lucide-react";
|
|
3
3
|
|
|
4
4
|
function Spinner({ className, ...props }: React.ComponentProps<"svg">) {
|
|
5
5
|
return (
|
|
6
6
|
<Loader2Icon
|
|
7
|
+
data-slot="spinner"
|
|
7
8
|
role="status"
|
|
8
9
|
aria-label="Loading"
|
|
9
10
|
className={cn("size-4 animate-spin", className)}
|
|
@@ -250,6 +250,7 @@ export function useNarrationHotkeys(): null {
|
|
|
250
250
|
callback: onSkipKeyUp,
|
|
251
251
|
options: {
|
|
252
252
|
eventType: "keyup",
|
|
253
|
+
conflictBehavior: "allow",
|
|
253
254
|
meta: {
|
|
254
255
|
name: t("next"),
|
|
255
256
|
description: t("skip_release_description"),
|
|
@@ -262,6 +263,7 @@ export function useNarrationHotkeys(): null {
|
|
|
262
263
|
callback: onSkipKeyUp,
|
|
263
264
|
options: {
|
|
264
265
|
eventType: "keyup",
|
|
266
|
+
conflictBehavior: "allow",
|
|
265
267
|
meta: {
|
|
266
268
|
name: t("next"),
|
|
267
269
|
description: t("skip_release_space_description"),
|
|
@@ -2,6 +2,7 @@ import { SKIP_DELAY } from "@/constants";
|
|
|
2
2
|
import { useGameProps } from "@/lib/hooks/props-hooks";
|
|
3
3
|
import { AutoSettings } from "@/lib/stores/auto-settings-store";
|
|
4
4
|
import { GameStatus } from "@/lib/stores/game-status-store";
|
|
5
|
+
import { SearchParams } from "@/lib/stores/search-param-store";
|
|
5
6
|
import { SkipSettings } from "@/lib/stores/skip-settings-store";
|
|
6
7
|
import { TextDisplaySettings } from "@/lib/stores/text-display-settings-store";
|
|
7
8
|
import { hasScrollableParent, isScrollableElement } from "@/lib/utils/scroll-utils";
|
|
@@ -9,12 +10,18 @@ import { narration, stepHistory, type StoredIndexedChoiceInterface } from "@drin
|
|
|
9
10
|
import { useDebouncer } from "@tanstack/react-pacer";
|
|
10
11
|
import { useSelector } from "@tanstack/react-store";
|
|
11
12
|
import type React from "react";
|
|
12
|
-
import { useCallback, useEffect, useRef } from "react";
|
|
13
|
+
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
13
14
|
|
|
14
15
|
export function useNarrationFunctions() {
|
|
15
16
|
const gameProps = useGameProps();
|
|
17
|
+
const searchParams = useSelector(SearchParams.store, (state) => state);
|
|
18
|
+
const hasOpenMenu = useMemo(
|
|
19
|
+
() => Object.values(searchParams).some((value) => value !== undefined),
|
|
20
|
+
[searchParams],
|
|
21
|
+
);
|
|
16
22
|
|
|
17
23
|
const goNext = useCallback(async () => {
|
|
24
|
+
if (hasOpenMenu) return;
|
|
18
25
|
GameStatus.setLoading(true);
|
|
19
26
|
try {
|
|
20
27
|
if (!narration.canContinue) {
|
|
@@ -36,9 +43,10 @@ export function useNarrationFunctions() {
|
|
|
36
43
|
console.error(e);
|
|
37
44
|
return;
|
|
38
45
|
}
|
|
39
|
-
}, [gameProps]);
|
|
46
|
+
}, [gameProps, hasOpenMenu]);
|
|
40
47
|
|
|
41
48
|
const goBack = useCallback(async () => {
|
|
49
|
+
if (hasOpenMenu) return;
|
|
42
50
|
GameStatus.setLoading(true);
|
|
43
51
|
return stepHistory
|
|
44
52
|
.back(gameProps)
|
|
@@ -50,10 +58,11 @@ export function useNarrationFunctions() {
|
|
|
50
58
|
GameStatus.setLoading(false);
|
|
51
59
|
console.error(e);
|
|
52
60
|
});
|
|
53
|
-
}, [gameProps]);
|
|
61
|
+
}, [gameProps, hasOpenMenu]);
|
|
54
62
|
|
|
55
63
|
const selectChoice = useCallback(
|
|
56
64
|
async (item: StoredIndexedChoiceInterface) => {
|
|
65
|
+
if (hasOpenMenu) return;
|
|
57
66
|
GameStatus.setLoading(true);
|
|
58
67
|
return narration
|
|
59
68
|
.selectChoice(item, gameProps)
|
|
@@ -66,7 +75,7 @@ export function useNarrationFunctions() {
|
|
|
66
75
|
console.error(e);
|
|
67
76
|
});
|
|
68
77
|
},
|
|
69
|
-
[gameProps],
|
|
78
|
+
[gameProps, hasOpenMenu],
|
|
70
79
|
);
|
|
71
80
|
|
|
72
81
|
return {
|
|
@@ -196,6 +205,11 @@ export function useSkipAutoDetector() {
|
|
|
196
205
|
TextDisplaySettings.store,
|
|
197
206
|
(state) => state.inProgress,
|
|
198
207
|
);
|
|
208
|
+
const searchParams = useSelector(SearchParams.store, (state) => state);
|
|
209
|
+
const hasOpenMenu = useMemo(
|
|
210
|
+
() => Object.values(searchParams).some((value) => value !== undefined),
|
|
211
|
+
[searchParams],
|
|
212
|
+
);
|
|
199
213
|
const { goNext } = useNarrationFunctions();
|
|
200
214
|
|
|
201
215
|
const savedGoNext = useRef(goNext);
|
|
@@ -203,11 +217,11 @@ export function useSkipAutoDetector() {
|
|
|
203
217
|
savedGoNext.current = goNext;
|
|
204
218
|
}, [goNext]);
|
|
205
219
|
useEffect(() => {
|
|
206
|
-
if (skipEnabled) {
|
|
220
|
+
if (skipEnabled && !hasOpenMenu) {
|
|
207
221
|
const id = setInterval(() => savedGoNext.current(), SKIP_DELAY);
|
|
208
222
|
return () => clearInterval(id);
|
|
209
223
|
}
|
|
210
|
-
}, [skipEnabled]);
|
|
224
|
+
}, [skipEnabled, hasOpenMenu]);
|
|
211
225
|
|
|
212
226
|
const autoDebouncer = useDebouncer(
|
|
213
227
|
(_trigger: {
|
|
@@ -215,20 +229,21 @@ export function useSkipAutoDetector() {
|
|
|
215
229
|
skipEnabled: boolean;
|
|
216
230
|
typewriterInProgress: boolean;
|
|
217
231
|
autoTime: number;
|
|
232
|
+
hasOpenMenu: boolean;
|
|
218
233
|
}) => {
|
|
219
234
|
goNext();
|
|
220
235
|
},
|
|
221
236
|
{
|
|
222
237
|
wait: autoTime * 1000,
|
|
223
|
-
enabled: autoEnabled && !skipEnabled && !typewriterInProgress,
|
|
238
|
+
enabled: autoEnabled && !skipEnabled && !typewriterInProgress && !hasOpenMenu,
|
|
224
239
|
},
|
|
225
240
|
);
|
|
226
241
|
|
|
227
242
|
const { maybeExecute } = autoDebouncer;
|
|
228
243
|
|
|
229
244
|
useEffect(() => {
|
|
230
|
-
maybeExecute({ autoEnabled, skipEnabled, typewriterInProgress, autoTime });
|
|
231
|
-
}, [maybeExecute, autoEnabled, skipEnabled, typewriterInProgress, autoTime]);
|
|
245
|
+
maybeExecute({ autoEnabled, skipEnabled, typewriterInProgress, autoTime, hasOpenMenu });
|
|
246
|
+
}, [maybeExecute, autoEnabled, skipEnabled, typewriterInProgress, autoTime, hasOpenMenu]);
|
|
232
247
|
|
|
233
248
|
return null;
|
|
234
249
|
}
|
|
@@ -1,9 +1,35 @@
|
|
|
1
1
|
import { SearchParams } from "@/lib/stores/search-param-store";
|
|
2
|
-
import { useDebouncedCallback } from "@tanstack/react-pacer";
|
|
3
2
|
import { useLocation, useNavigate } from "@tanstack/react-router";
|
|
4
3
|
import { useSelector } from "@tanstack/react-store";
|
|
5
4
|
import { useCallback, useEffect } from "react";
|
|
6
5
|
|
|
6
|
+
// Shared pending param changes — all synchronous setters accumulate here
|
|
7
|
+
// and a single navigate fires after a very short delay.
|
|
8
|
+
const _pendingParams: Record<string, unknown> = {};
|
|
9
|
+
let _pendingTimer: ReturnType<typeof setTimeout> | null = null;
|
|
10
|
+
let _pendingNavigate: ((...args: unknown[]) => unknown) | null = null;
|
|
11
|
+
|
|
12
|
+
function scheduleNavigate(navigate: (...args: unknown[]) => unknown, key: string, value: unknown) {
|
|
13
|
+
_pendingParams[key] = value;
|
|
14
|
+
_pendingNavigate = navigate;
|
|
15
|
+
if (_pendingTimer !== null) {
|
|
16
|
+
clearTimeout(_pendingTimer);
|
|
17
|
+
}
|
|
18
|
+
_pendingTimer = setTimeout(() => {
|
|
19
|
+
_pendingTimer = null;
|
|
20
|
+
if (_pendingNavigate) {
|
|
21
|
+
const snapshot = { ..._pendingParams };
|
|
22
|
+
for (const k of Object.keys(_pendingParams)) {
|
|
23
|
+
delete _pendingParams[k];
|
|
24
|
+
}
|
|
25
|
+
_pendingNavigate({
|
|
26
|
+
search: (prev: Record<string, unknown>) => ({ ...prev, ...snapshot }),
|
|
27
|
+
});
|
|
28
|
+
_pendingNavigate = null;
|
|
29
|
+
}
|
|
30
|
+
}, 10);
|
|
31
|
+
}
|
|
32
|
+
|
|
7
33
|
/**
|
|
8
34
|
* useConfirmBackNavigation
|
|
9
35
|
*
|
|
@@ -69,13 +95,6 @@ export function useSetSearchParamState<T>(
|
|
|
69
95
|
): (value: T | undefined | ((previous: T | undefined) => T | undefined)) => void {
|
|
70
96
|
const navigate = useNavigate();
|
|
71
97
|
|
|
72
|
-
const debouncedNavigate = useDebouncedCallback(
|
|
73
|
-
(key: string, value: unknown) => {
|
|
74
|
-
navigate({ search: ((prev: any) => ({ ...prev, [key]: value })) as any });
|
|
75
|
-
},
|
|
76
|
-
{ wait: 300 },
|
|
77
|
-
);
|
|
78
|
-
|
|
79
98
|
return useCallback(
|
|
80
99
|
(value) => {
|
|
81
100
|
const currentValue = SearchParams.store.state[field] as T | undefined;
|
|
@@ -86,8 +105,8 @@ export function useSetSearchParamState<T>(
|
|
|
86
105
|
const normalizedValue = nextValue === false ? undefined : nextValue;
|
|
87
106
|
|
|
88
107
|
SearchParams.set(field, normalizedValue);
|
|
89
|
-
|
|
108
|
+
scheduleNavigate(navigate as never, field, normalizedValue);
|
|
90
109
|
},
|
|
91
|
-
[field,
|
|
110
|
+
[field, navigate],
|
|
92
111
|
);
|
|
93
112
|
}
|
|
@@ -10,7 +10,6 @@ import { ChannelSound } from "@/lib/stores/channel-sound-stores";
|
|
|
10
10
|
import { MasterSound } from "@/lib/stores/master-sound-storage";
|
|
11
11
|
import "@/styles.css";
|
|
12
12
|
import { Assets, canvas, Container, drawCanvasErrorHandler, Game, sound } from "@drincs/pixi-vn";
|
|
13
|
-
import "@drincs/pixi-vn-spine";
|
|
14
13
|
import { createRoot } from "react-dom/client";
|
|
15
14
|
|
|
16
15
|
// Canvas setup with PIXI
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
1
|
/* eslint-disable */
|
|
3
2
|
// noinspection JSUnusedGlobalSymbols
|
|
4
3
|
// This file is auto-generated by @drincs/pixi-vn vite plugin. Do not edit manually.
|
|
@@ -15,8 +14,9 @@ declare module "@drincs/pixi-vn/narration" {
|
|
|
15
14
|
"animation_01": never;
|
|
16
15
|
"second_part": never;
|
|
17
16
|
"start": never;
|
|
18
|
-
"start_|_c-0": never;
|
|
19
|
-
"start_|_c-1": never;
|
|
20
17
|
}
|
|
21
18
|
}
|
|
22
|
-
export
|
|
19
|
+
export const characterIds = ["mc","james","steph","sly"] as const;
|
|
20
|
+
export const characterIdsEnum = {"mc":"mc","james":"james","steph":"steph","sly":"sly"} as const;
|
|
21
|
+
export const labelIds = ["animation_01","second_part","start"] as const;
|
|
22
|
+
export const labelIdsEnum = {"animation_01":"animation_01","second_part":"second_part","start":"start"} as const;
|
|
@@ -9,16 +9,10 @@
|
|
|
9
9
|
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
10
10
|
|
|
11
11
|
import { Route as rootRouteImport } from './routes/__root'
|
|
12
|
-
import { Route as NarrationRouteImport } from './routes/narration'
|
|
13
12
|
import { Route as GameRouteImport } from './routes/game'
|
|
14
13
|
import { Route as IndexRouteImport } from './routes/index'
|
|
15
14
|
import { Route as GameNarrationRouteImport } from './routes/game/narration'
|
|
16
15
|
|
|
17
|
-
const NarrationRoute = NarrationRouteImport.update({
|
|
18
|
-
id: '/narration',
|
|
19
|
-
path: '/narration',
|
|
20
|
-
getParentRoute: () => rootRouteImport,
|
|
21
|
-
} as any)
|
|
22
16
|
const GameRoute = GameRouteImport.update({
|
|
23
17
|
id: '/game',
|
|
24
18
|
path: '/game',
|
|
@@ -38,45 +32,34 @@ const GameNarrationRoute = GameNarrationRouteImport.update({
|
|
|
38
32
|
export interface FileRoutesByFullPath {
|
|
39
33
|
'/': typeof IndexRoute
|
|
40
34
|
'/game': typeof GameRouteWithChildren
|
|
41
|
-
'/narration': typeof NarrationRoute
|
|
42
35
|
'/game/narration': typeof GameNarrationRoute
|
|
43
36
|
}
|
|
44
37
|
export interface FileRoutesByTo {
|
|
45
38
|
'/': typeof IndexRoute
|
|
46
39
|
'/game': typeof GameRouteWithChildren
|
|
47
|
-
'/narration': typeof NarrationRoute
|
|
48
40
|
'/game/narration': typeof GameNarrationRoute
|
|
49
41
|
}
|
|
50
42
|
export interface FileRoutesById {
|
|
51
43
|
__root__: typeof rootRouteImport
|
|
52
44
|
'/': typeof IndexRoute
|
|
53
45
|
'/game': typeof GameRouteWithChildren
|
|
54
|
-
'/narration': typeof NarrationRoute
|
|
55
46
|
'/game/narration': typeof GameNarrationRoute
|
|
56
47
|
}
|
|
57
48
|
export interface FileRouteTypes {
|
|
58
49
|
fileRoutesByFullPath: FileRoutesByFullPath
|
|
59
|
-
fullPaths: '/' | '/game' | '/
|
|
50
|
+
fullPaths: '/' | '/game' | '/game/narration'
|
|
60
51
|
fileRoutesByTo: FileRoutesByTo
|
|
61
|
-
to: '/' | '/game' | '/
|
|
62
|
-
id: '__root__' | '/' | '/game' | '/
|
|
52
|
+
to: '/' | '/game' | '/game/narration'
|
|
53
|
+
id: '__root__' | '/' | '/game' | '/game/narration'
|
|
63
54
|
fileRoutesById: FileRoutesById
|
|
64
55
|
}
|
|
65
56
|
export interface RootRouteChildren {
|
|
66
57
|
IndexRoute: typeof IndexRoute
|
|
67
58
|
GameRoute: typeof GameRouteWithChildren
|
|
68
|
-
NarrationRoute: typeof NarrationRoute
|
|
69
59
|
}
|
|
70
60
|
|
|
71
61
|
declare module '@tanstack/react-router' {
|
|
72
62
|
interface FileRoutesByPath {
|
|
73
|
-
'/narration': {
|
|
74
|
-
id: '/narration'
|
|
75
|
-
path: '/narration'
|
|
76
|
-
fullPath: '/narration'
|
|
77
|
-
preLoaderRoute: typeof NarrationRouteImport
|
|
78
|
-
parentRoute: typeof rootRouteImport
|
|
79
|
-
}
|
|
80
63
|
'/game': {
|
|
81
64
|
id: '/game'
|
|
82
65
|
path: '/game'
|
|
@@ -114,7 +97,6 @@ const GameRouteWithChildren = GameRoute._addFileChildren(GameRouteChildren)
|
|
|
114
97
|
const rootRouteChildren: RootRouteChildren = {
|
|
115
98
|
IndexRoute: IndexRoute,
|
|
116
99
|
GameRoute: GameRouteWithChildren,
|
|
117
|
-
NarrationRoute: NarrationRoute,
|
|
118
100
|
}
|
|
119
101
|
export const routeTree = rootRouteImport
|
|
120
102
|
._addFileChildren(rootRouteChildren)
|
|
@@ -12,11 +12,12 @@ import { initializeIndexedDB } from "@/lib/utils/db-utility";
|
|
|
12
12
|
import { loadRefreshSave } from "@/lib/utils/save-utility";
|
|
13
13
|
import type { RouterContext } from "@/router";
|
|
14
14
|
import { setupPixivnViteData } from "@drincs/pixi-vn/vite-listener";
|
|
15
|
-
import { TanStackDevtools } from "@tanstack/react-devtools";
|
|
16
|
-
import { hotkeysDevtoolsPlugin } from "@tanstack/react-hotkeys-devtools";
|
|
17
|
-
import { ReactQueryDevtoolsPanel } from "@tanstack/react-query-devtools";
|
|
18
15
|
import { createRootRouteWithContext, ErrorComponent, Outlet } from "@tanstack/react-router";
|
|
19
|
-
import {
|
|
16
|
+
import { lazy, Suspense } from "react";
|
|
17
|
+
|
|
18
|
+
const DevDevtools = import.meta.env.DEV
|
|
19
|
+
? lazy(() => import("@/components/dev-devtools"))
|
|
20
|
+
: null;
|
|
20
21
|
|
|
21
22
|
export const Route = createRootRouteWithContext<RouterContext>()({
|
|
22
23
|
validateSearch: (search) => SearchParams.setMany(search),
|
|
@@ -54,22 +55,11 @@ function RootComponent() {
|
|
|
54
55
|
<Outlet />
|
|
55
56
|
</RootProvider>
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
{
|
|
63
|
-
name: "UI screens",
|
|
64
|
-
render: <TanStackRouterDevtoolsPanel />,
|
|
65
|
-
},
|
|
66
|
-
{ ...hotkeysDevtoolsPlugin(), name: "Hotkeys" },
|
|
67
|
-
{
|
|
68
|
-
name: "UI cache",
|
|
69
|
-
render: <ReactQueryDevtoolsPanel />,
|
|
70
|
-
},
|
|
71
|
-
]}
|
|
72
|
-
/>
|
|
58
|
+
{DevDevtools && (
|
|
59
|
+
<Suspense>
|
|
60
|
+
<DevDevtools />
|
|
61
|
+
</Suspense>
|
|
62
|
+
)}
|
|
73
63
|
</>
|
|
74
64
|
);
|
|
75
65
|
}
|
|
@@ -8,37 +8,37 @@
|
|
|
8
8
|
|
|
9
9
|
:root {
|
|
10
10
|
--background: oklch(1 0 0);
|
|
11
|
-
--foreground: oklch(0.
|
|
11
|
+
--foreground: oklch(0.145 0 0);
|
|
12
12
|
--card: oklch(1 0 0);
|
|
13
|
-
--card-foreground: oklch(0.
|
|
13
|
+
--card-foreground: oklch(0.145 0 0);
|
|
14
14
|
--popover: oklch(1 0 0);
|
|
15
|
-
--popover-foreground: oklch(0.
|
|
16
|
-
--primary: oklch(0.
|
|
15
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
16
|
+
--primary: oklch(0.205 0 0);
|
|
17
17
|
--primary-foreground: oklch(0.985 0 0);
|
|
18
|
-
--secondary: oklch(0.
|
|
19
|
-
--secondary-foreground: oklch(0.
|
|
20
|
-
--muted: oklch(0.
|
|
21
|
-
--muted-foreground: oklch(0.
|
|
22
|
-
--accent: oklch(0.
|
|
23
|
-
--accent-foreground: oklch(0.
|
|
18
|
+
--secondary: oklch(0.97 0 0);
|
|
19
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
20
|
+
--muted: oklch(0.97 0 0);
|
|
21
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
22
|
+
--accent: oklch(0.97 0 0);
|
|
23
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
24
24
|
--destructive: oklch(0.577 0.245 27.325);
|
|
25
|
-
--border: oklch(0.
|
|
26
|
-
--input: oklch(0.
|
|
27
|
-
--ring: oklch(0.
|
|
28
|
-
--chart-1: oklch(0.
|
|
29
|
-
--chart-2: oklch(0.
|
|
30
|
-
--chart-3: oklch(0.
|
|
31
|
-
--chart-4: oklch(0.
|
|
32
|
-
--chart-5: oklch(0.
|
|
25
|
+
--border: oklch(0.922 0 0);
|
|
26
|
+
--input: oklch(0.922 0 0);
|
|
27
|
+
--ring: oklch(0.708 0 0);
|
|
28
|
+
--chart-1: oklch(0.87 0 0);
|
|
29
|
+
--chart-2: oklch(0.556 0 0);
|
|
30
|
+
--chart-3: oklch(0.439 0 0);
|
|
31
|
+
--chart-4: oklch(0.371 0 0);
|
|
32
|
+
--chart-5: oklch(0.269 0 0);
|
|
33
33
|
--radius: 0.625rem;
|
|
34
34
|
--sidebar: oklch(0.985 0 0);
|
|
35
|
-
--sidebar-foreground: oklch(0.
|
|
36
|
-
--sidebar-primary: oklch(0.
|
|
35
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
36
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
37
37
|
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
38
|
-
--sidebar-accent: oklch(0.
|
|
39
|
-
--sidebar-accent-foreground: oklch(0.
|
|
40
|
-
--sidebar-border: oklch(0.
|
|
41
|
-
--sidebar-ring: oklch(0.
|
|
38
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
39
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
40
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
41
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
html,
|
|
@@ -56,7 +56,7 @@ body {
|
|
|
56
56
|
|
|
57
57
|
@theme inline {
|
|
58
58
|
--font-heading: var(--font-sans);
|
|
59
|
-
--font-sans: "
|
|
59
|
+
--font-sans: "Geist Variable", sans-serif;
|
|
60
60
|
--color-sidebar-ring: var(--sidebar-ring);
|
|
61
61
|
--color-sidebar-border: var(--sidebar-border);
|
|
62
62
|
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
@@ -98,37 +98,37 @@ body {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
.dark {
|
|
101
|
-
--background: oklch(0.
|
|
101
|
+
--background: oklch(0.145 0 0);
|
|
102
102
|
--foreground: oklch(0.985 0 0);
|
|
103
|
-
--card: oklch(0.
|
|
103
|
+
--card: oklch(0.205 0 0);
|
|
104
104
|
--card-foreground: oklch(0.985 0 0);
|
|
105
|
-
--popover: oklch(0.
|
|
105
|
+
--popover: oklch(0.205 0 0);
|
|
106
106
|
--popover-foreground: oklch(0.985 0 0);
|
|
107
|
-
--primary: oklch(0.
|
|
108
|
-
--primary-foreground: oklch(0.
|
|
109
|
-
--secondary: oklch(0.
|
|
107
|
+
--primary: oklch(0.922 0 0);
|
|
108
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
109
|
+
--secondary: oklch(0.269 0 0);
|
|
110
110
|
--secondary-foreground: oklch(0.985 0 0);
|
|
111
|
-
--muted: oklch(0.
|
|
112
|
-
--muted-foreground: oklch(0.
|
|
113
|
-
--accent: oklch(0.
|
|
111
|
+
--muted: oklch(0.269 0 0);
|
|
112
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
113
|
+
--accent: oklch(0.269 0 0);
|
|
114
114
|
--accent-foreground: oklch(0.985 0 0);
|
|
115
115
|
--destructive: oklch(0.704 0.191 22.216);
|
|
116
116
|
--border: oklch(1 0 0 / 10%);
|
|
117
117
|
--input: oklch(1 0 0 / 15%);
|
|
118
|
-
--ring: oklch(0.
|
|
119
|
-
--chart-1: oklch(0.
|
|
120
|
-
--chart-2: oklch(0.
|
|
121
|
-
--chart-3: oklch(0.
|
|
122
|
-
--chart-4: oklch(0.
|
|
123
|
-
--chart-5: oklch(0.
|
|
124
|
-
--sidebar: oklch(0.
|
|
118
|
+
--ring: oklch(0.556 0 0);
|
|
119
|
+
--chart-1: oklch(0.87 0 0);
|
|
120
|
+
--chart-2: oklch(0.556 0 0);
|
|
121
|
+
--chart-3: oklch(0.439 0 0);
|
|
122
|
+
--chart-4: oklch(0.371 0 0);
|
|
123
|
+
--chart-5: oklch(0.269 0 0);
|
|
124
|
+
--sidebar: oklch(0.205 0 0);
|
|
125
125
|
--sidebar-foreground: oklch(0.985 0 0);
|
|
126
126
|
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
127
127
|
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
128
|
-
--sidebar-accent: oklch(0.
|
|
128
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
129
129
|
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
130
130
|
--sidebar-border: oklch(1 0 0 / 10%);
|
|
131
|
-
--sidebar-ring: oklch(0.
|
|
131
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
@layer base {
|
|
@@ -37,7 +37,7 @@ export default defineConfig(({ mode }) => ({
|
|
|
37
37
|
content: "./src/content/index.ts",
|
|
38
38
|
characters: "./src/content/characters.ts",
|
|
39
39
|
labels: "./src/content/labels/*.label.ts",
|
|
40
|
-
typeFilePath: "./src/pixi-vn
|
|
40
|
+
typeFilePath: "./src/pixi-vn.keys.gen.ts",
|
|
41
41
|
}),
|
|
42
42
|
VitePWA({
|
|
43
43
|
// generate icons with: npm run icon
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
|
-
/* eslint-disable */
|
|
3
|
-
// noinspection JSUnusedGlobalSymbols
|
|
4
|
-
// This file is auto-generated by @drincs/pixi-vn vite plugin. Do not edit manually.
|
|
5
|
-
declare module "@drincs/pixi-vn/characters" {
|
|
6
|
-
interface PixivnCharacterIds {
|
|
7
|
-
"mc": never;
|
|
8
|
-
"james": never;
|
|
9
|
-
"steph": never;
|
|
10
|
-
"sly": never;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
declare module "@drincs/pixi-vn/narration" {
|
|
14
|
-
interface PixivnLabelIds {
|
|
15
|
-
"animation_01": never;
|
|
16
|
-
"second_part": never;
|
|
17
|
-
"start": never;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
export {};
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createFileRoute, redirect } from "@tanstack/react-router";
|
|
2
|
-
|
|
3
|
-
// Redirect for old versions that used /narration
|
|
4
|
-
export const Route = createFileRoute("/narration")({
|
|
5
|
-
beforeLoad: () => {
|
|
6
|
-
throw redirect({ to: "/game/narration" });
|
|
7
|
-
},
|
|
8
|
-
component: () => null,
|
|
9
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createFileRoute, redirect } from "@tanstack/react-router";
|
|
2
|
-
|
|
3
|
-
// Redirect for old versions that used /narration
|
|
4
|
-
export const Route = createFileRoute("/narration")({
|
|
5
|
-
beforeLoad: () => {
|
|
6
|
-
throw redirect({ to: "/game/narration" });
|
|
7
|
-
},
|
|
8
|
-
component: () => null,
|
|
9
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createFileRoute, redirect } from "@tanstack/react-router";
|
|
2
|
-
|
|
3
|
-
// Redirect for old versions that used /narration
|
|
4
|
-
export const Route = createFileRoute("/narration")({
|
|
5
|
-
beforeLoad: () => {
|
|
6
|
-
throw redirect({ to: "/game/narration" });
|
|
7
|
-
},
|
|
8
|
-
component: () => null,
|
|
9
|
-
});
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { createFileRoute, redirect } from "@tanstack/react-router";
|
|
2
|
-
|
|
3
|
-
// Redirect for old versions that used /narration
|
|
4
|
-
export const Route = createFileRoute("/narration")({
|
|
5
|
-
beforeLoad: () => {
|
|
6
|
-
throw redirect({ to: "/game/narration" });
|
|
7
|
-
},
|
|
8
|
-
component: () => null,
|
|
9
|
-
});
|