create-pixi-vn 1.7.1 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/package.json +1 -1
  2. package/template-nqtr-react-vite-muijoy/package.json +2 -2
  3. package/template-nqtr-react-vite-muijoy/src/constans.ts +1 -0
  4. package/template-nqtr-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
  5. package/template-nqtr-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
  6. package/template-nqtr-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
  7. package/template-nqtr-react-vite-muijoy-ink/package.json +2 -2
  8. package/template-nqtr-react-vite-muijoy-ink/src/constans.ts +1 -0
  9. package/template-nqtr-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
  10. package/template-nqtr-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
  11. package/template-nqtr-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
  12. package/template-nqtr-react-vite-muijoy-ink-tauri/package.json +2 -2
  13. package/template-nqtr-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
  14. package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
  15. package/template-nqtr-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
  16. package/template-nqtr-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
  17. package/template-nqtr-react-vite-muijoy-tauri/package.json +2 -2
  18. package/template-nqtr-react-vite-muijoy-tauri/src/constans.ts +1 -0
  19. package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
  20. package/template-nqtr-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
  21. package/template-nqtr-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
  22. package/template-react-vite-muijoy/package.json +1 -1
  23. package/template-react-vite-muijoy/src/constans.ts +1 -0
  24. package/template-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
  25. package/template-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
  26. package/template-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
  27. package/template-react-vite-muijoy-ink/package.json +1 -1
  28. package/template-react-vite-muijoy-ink/src/constans.ts +1 -0
  29. package/template-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
  30. package/template-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
  31. package/template-react-vite-muijoy-ink/src/labels/animations-labels.ts +1 -1
  32. package/template-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
  33. package/template-react-vite-muijoy-ink-tauri/package.json +1 -1
  34. package/template-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
  35. package/template-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
  36. package/template-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
  37. package/template-react-vite-muijoy-ink-tauri/src/labels/animations-labels.ts +1 -1
  38. package/template-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
  39. package/template-react-vite-muijoy-tauri/package.json +1 -1
  40. package/template-react-vite-muijoy-tauri/src/constans.ts +1 -0
  41. package/template-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
  42. package/template-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
  43. package/template-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
  44. package/template-story-react-vite-muijoy/package.json +1 -1
  45. package/template-story-react-vite-muijoy/src/constans.ts +1 -0
  46. package/template-story-react-vite-muijoy/src/hooks/useMinigame.ts +54 -0
  47. package/template-story-react-vite-muijoy/src/hooks/useMyNavigate.ts +1 -1
  48. package/template-story-react-vite-muijoy/src/screens/NarrationScreen.tsx +4 -1
  49. package/template-story-react-vite-muijoy-ink/package.json +1 -1
  50. package/template-story-react-vite-muijoy-ink/src/constans.ts +1 -0
  51. package/template-story-react-vite-muijoy-ink/src/hooks/useMinigame.ts +54 -0
  52. package/template-story-react-vite-muijoy-ink/src/hooks/useMyNavigate.ts +1 -1
  53. package/template-story-react-vite-muijoy-ink/src/labels/animations-labels.ts +1 -1
  54. package/template-story-react-vite-muijoy-ink/src/screens/NarrationScreen.tsx +4 -1
  55. package/template-story-react-vite-muijoy-ink-tauri/package.json +1 -1
  56. package/template-story-react-vite-muijoy-ink-tauri/src/constans.ts +1 -0
  57. package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useMinigame.ts +54 -0
  58. package/template-story-react-vite-muijoy-ink-tauri/src/hooks/useMyNavigate.ts +1 -1
  59. package/template-story-react-vite-muijoy-ink-tauri/src/labels/animations-labels.ts +1 -1
  60. package/template-story-react-vite-muijoy-ink-tauri/src/screens/NarrationScreen.tsx +4 -1
  61. package/template-story-react-vite-muijoy-tauri/package.json +1 -1
  62. package/template-story-react-vite-muijoy-tauri/src/constans.ts +1 -0
  63. package/template-story-react-vite-muijoy-tauri/src/hooks/useMinigame.ts +54 -0
  64. package/template-story-react-vite-muijoy-tauri/src/hooks/useMyNavigate.ts +1 -1
  65. package/template-story-react-vite-muijoy-tauri/src/screens/NarrationScreen.tsx +4 -1
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": "1.7.1",
4
+ "version": "1.7.3",
5
5
  "type": "module",
6
6
  "license": "GPL-3.0",
7
7
  "author": "DRincs-Productions",
@@ -11,8 +11,8 @@
11
11
  "preview": "vite preview"
12
12
  },
13
13
  "dependencies": {
14
- "@drincs/nqtr": "^0.5.5",
15
- "@drincs/pixi-vn": "^1.3.2",
14
+ "@drincs/nqtr": "^0.5.7",
15
+ "@drincs/pixi-vn": "^1.3.13",
16
16
  "@emotion/react": "^11.14.0",
17
17
  "@emotion/styled": "^11.14.1",
18
18
  "@mui/icons-material": "^7.3.1",
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
8
8
  export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
9
9
 
10
10
  export const CANVAS_UI_LAYER_NAME = "ui";
11
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
11
12
 
12
13
  export const SKIP_DELAY = 100;
13
14
 
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -11,8 +11,8 @@
11
11
  "preview": "vite preview"
12
12
  },
13
13
  "dependencies": {
14
- "@drincs/nqtr": "^0.5.5",
15
- "@drincs/pixi-vn": "^1.3.2",
14
+ "@drincs/nqtr": "^0.5.7",
15
+ "@drincs/pixi-vn": "^1.3.13",
16
16
  "@drincs/pixi-vn-ink": "^0.8.0",
17
17
  "@emotion/react": "^11.14.0",
18
18
  "@emotion/styled": "^11.14.1",
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
8
8
  export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
9
9
 
10
10
  export const CANVAS_UI_LAYER_NAME = "ui";
11
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
11
12
 
12
13
  export const SKIP_DELAY = 100;
13
14
 
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -12,8 +12,8 @@
12
12
  "tauri": "tauri"
13
13
  },
14
14
  "dependencies": {
15
- "@drincs/nqtr": "^0.5.5",
16
- "@drincs/pixi-vn": "^1.3.2",
15
+ "@drincs/nqtr": "^0.5.7",
16
+ "@drincs/pixi-vn": "^1.3.13",
17
17
  "@drincs/pixi-vn-ink": "^0.8.0",
18
18
  "@emotion/react": "^11.14.0",
19
19
  "@emotion/styled": "^11.14.1",
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
8
8
  export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
9
9
 
10
10
  export const CANVAS_UI_LAYER_NAME = "ui";
11
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
11
12
 
12
13
  export const SKIP_DELAY = 100;
13
14
 
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -12,8 +12,8 @@
12
12
  "tauri": "tauri"
13
13
  },
14
14
  "dependencies": {
15
- "@drincs/nqtr": "^0.5.5",
16
- "@drincs/pixi-vn": "^1.3.2",
15
+ "@drincs/nqtr": "^0.5.7",
16
+ "@drincs/pixi-vn": "^1.3.13",
17
17
  "@emotion/react": "^11.14.0",
18
18
  "@emotion/styled": "^11.14.1",
19
19
  "@mui/icons-material": "^7.3.1",
@@ -8,6 +8,7 @@ export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
8
8
  export const SELECTED_QUEST_STORAGE_KEY = "selected_quest";
9
9
 
10
10
  export const CANVAS_UI_LAYER_NAME = "ui";
11
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
11
12
 
12
13
  export const SKIP_DELAY = 100;
13
14
 
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -11,7 +11,7 @@
11
11
  "preview": "vite preview"
12
12
  },
13
13
  "dependencies": {
14
- "@drincs/pixi-vn": "^1.3.2",
14
+ "@drincs/pixi-vn": "^1.3.13",
15
15
  "@emotion/react": "^11.14.0",
16
16
  "@emotion/styled": "^11.14.1",
17
17
  "@mui/icons-material": "^7.3.1",
@@ -5,5 +5,6 @@ export const NARRATION_ROUTE = "/narration";
5
5
  export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
6
6
 
7
7
  export const CANVAS_UI_LAYER_NAME = "ui";
8
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
8
9
 
9
10
  export const SKIP_DELAY = 100;
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -11,7 +11,7 @@
11
11
  "preview": "vite preview"
12
12
  },
13
13
  "dependencies": {
14
- "@drincs/pixi-vn": "^1.3.2",
14
+ "@drincs/pixi-vn": "^1.3.13",
15
15
  "@drincs/pixi-vn-ink": "^0.8.0",
16
16
  "@emotion/react": "^11.14.0",
17
17
  "@emotion/styled": "^11.14.1",
@@ -5,5 +5,6 @@ export const NARRATION_ROUTE = "/narration";
5
5
  export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
6
6
 
7
7
  export const CANVAS_UI_LAYER_NAME = "ui";
8
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
8
9
 
9
10
  export const SKIP_DELAY = 100;
@@ -0,0 +1,54 @@
1
+ import { canvas, Layer, PIXI } from "@drincs/pixi-vn";
2
+ import { useEffect, useRef } from "react";
3
+ import { CANVAS_MINIGAME_LAYER_NAME } from "../constans";
4
+
5
+ export default function useMinigame(
6
+ game: (layer: Layer) => void,
7
+ props?: {
8
+ onStart?: () => Promise<void>;
9
+ onExit?: (layer: Layer) => void;
10
+ }
11
+ ) {
12
+ const loading = useRef(false);
13
+
14
+ // Keep latest callbacks in refs to avoid effect restarts
15
+ const startRef = useRef<() => Promise<void>>(props?.onStart ?? (async () => {}));
16
+ const exitRef = useRef<(layer: Layer) => void>(props?.onExit);
17
+
18
+ // Update refs when props change, without changing effect identity
19
+ useEffect(() => {
20
+ startRef.current = props?.onStart ?? (async () => {});
21
+ }, [props?.onStart]);
22
+
23
+ useEffect(() => {
24
+ exitRef.current = props?.onExit;
25
+ }, [props?.onExit]);
26
+
27
+ useEffect(() => {
28
+ // Create the layer and start the game once
29
+ loading.current = true;
30
+ const layer = canvas.addLayer(CANVAS_MINIGAME_LAYER_NAME, new PIXI.Container());
31
+ if (!layer) {
32
+ console.error("Failed to create UI layer for minigame");
33
+ return;
34
+ }
35
+
36
+ let cancelled = false;
37
+
38
+ startRef.current().then(() => {
39
+ if (cancelled) return;
40
+ loading.current = false;
41
+ game(layer);
42
+ });
43
+
44
+ return () => {
45
+ cancelled = true;
46
+ canvas.removeLayer(CANVAS_MINIGAME_LAYER_NAME);
47
+ if (exitRef.current) {
48
+ exitRef.current(layer);
49
+ }
50
+ };
51
+ }, [game]);
52
+
53
+ return { loading };
54
+ }
@@ -2,7 +2,7 @@ import { Assets } from "@drincs/pixi-vn";
2
2
  import { NavigateFunction, NavigateOptions, To, useNavigate } from "react-router-dom";
3
3
 
4
4
  /**
5
- * https://pixi-vn.web.app/advanced/intercept-events.html#back-and-forward-buttons
5
+ * https://pixi-vn.web.app/it/start/interface-navigate#block-back-forward
6
6
  */
7
7
  export default function useMyNavigate(): NavigateFunction {
8
8
  const navigate = useNavigate();
@@ -7,7 +7,7 @@ export const animation01 = newLabel("animation_01", [
7
7
  {
8
8
  scaleX: 1,
9
9
  },
10
- { autoplay: false }
10
+ { autoplay: false, forceCompleteBeforeNext: true }
11
11
  );
12
12
 
13
13
  await moveIn(
@@ -207,7 +207,10 @@ function NarrationScreenText({ paragraphRef }: { paragraphRef: RefObject<HTMLDiv
207
207
  }, []);
208
208
 
209
209
  return (
210
- <p className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`} style={{ margin: 0, padding: 0 }}>
210
+ <p
211
+ className={`prose ${mode === "dark" ? "dark:prose-invert" : ""}`}
212
+ style={{ margin: 0, padding: 0, maxWidth: "100%" }}
213
+ >
211
214
  <span>
212
215
  <Markdown
213
216
  remarkPlugins={[remarkGfm]}
@@ -12,7 +12,7 @@
12
12
  "tauri": "tauri"
13
13
  },
14
14
  "dependencies": {
15
- "@drincs/pixi-vn": "^1.3.2",
15
+ "@drincs/pixi-vn": "^1.3.13",
16
16
  "@drincs/pixi-vn-ink": "^0.8.0",
17
17
  "@emotion/react": "^11.14.0",
18
18
  "@emotion/styled": "^11.14.1",
@@ -5,5 +5,6 @@ export const NARRATION_ROUTE = "/narration";
5
5
  export const REFRESH_SAVE_LOCAL_STORAGE_KEY = "refresh_save";
6
6
 
7
7
  export const CANVAS_UI_LAYER_NAME = "ui";
8
+ export const CANVAS_MINIGAME_LAYER_NAME = "minigame";
8
9
 
9
10
  export const SKIP_DELAY = 100;