yarn-spinner-runner-ts 0.1.1-b → 0.1.2
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.
|
@@ -80,26 +80,6 @@ export function DialogueExample() {
|
|
|
80
80
|
padding: "16px",
|
|
81
81
|
borderRadius: "8px",
|
|
82
82
|
marginBottom: "20px",
|
|
83
|
-
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })), _jsx(DialogueView, { result: result, onAdvance: advance, scenes: scenes })
|
|
84
|
-
width: "100%",
|
|
85
|
-
minHeight: "300px",
|
|
86
|
-
marginTop: "10px",
|
|
87
|
-
padding: "12px",
|
|
88
|
-
fontFamily: "monospace",
|
|
89
|
-
fontSize: "14px",
|
|
90
|
-
backgroundColor: "#2a2a3e",
|
|
91
|
-
color: "#ffffff",
|
|
92
|
-
border: "1px solid #4a9eff",
|
|
93
|
-
borderRadius: "8px",
|
|
94
|
-
}, spellCheck: false }), _jsx("button", { onClick: () => window.location.reload(), style: {
|
|
95
|
-
marginTop: "10px",
|
|
96
|
-
padding: "10px 20px",
|
|
97
|
-
backgroundColor: "#4a9eff",
|
|
98
|
-
color: "#ffffff",
|
|
99
|
-
border: "none",
|
|
100
|
-
borderRadius: "8px",
|
|
101
|
-
cursor: "pointer",
|
|
102
|
-
fontSize: "16px",
|
|
103
|
-
}, children: "Reload to Restart" })] })] }) }));
|
|
83
|
+
}, children: [_jsx("strong", { children: "Error:" }), " ", error] })), _jsx(DialogueView, { result: result, onAdvance: advance, scenes: scenes })] }) }));
|
|
104
84
|
}
|
|
105
85
|
//# sourceMappingURL=DialogueExample.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogueExample.js","sourceRoot":"","sources":["../../src/react/DialogueExample.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;IAyBjB,CAAC;AAEL,MAAM,cAAc,GAAG;;;;;;;;CAQtB,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,MAAM,GAAoB,OAAO,CAAC,GAAG,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CACvC,OAAO,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EACnC;QACE,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,EAAE;KACd,CACF,CAAC;IAEF,OAAO,CACL,cACE,KAAK,EAAE;YACL,SAAS,EAAE,OAAO;YAClB,eAAe,EAAE,SAAS;YAC1B,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,QAAQ;SACrB,YAED,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,aAC/C,aAAI,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,8CAAoC,EAE7G,KAAK,IAAI,CACR,eACE,KAAK,EAAE;wBACL,eAAe,EAAE,SAAS;wBAC1B,KAAK,EAAE,SAAS;wBAChB,OAAO,EAAE,MAAM;wBACf,YAAY,EAAE,KAAK;wBACnB,YAAY,EAAE,MAAM;qBACrB,aAED,sCAAuB,OAAE,KAAK,IAC1B,CACP,EAED,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,
|
|
1
|
+
{"version":3,"file":"DialogueExample.js","sourceRoot":"","sources":["../../src/react/DialogueExample.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;IAyBjB,CAAC;AAEL,MAAM,cAAc,GAAG;;;;;;;;CAQtB,CAAC;AAEF,MAAM,UAAU,eAAe;IAC7B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAExD,MAAM,MAAM,GAAoB,OAAO,CAAC,GAAG,EAAE;QAC3C,IAAI,CAAC;YACH,OAAO,WAAW,CAAC,cAAc,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAC;YAC3C,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACxB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE;QAC3B,IAAI,CAAC;YACH,QAAQ,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,QAAQ,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CACvC,OAAO,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EACnC;QACE,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,EAAE;KACd,CACF,CAAC;IAEF,OAAO,CACL,cACE,KAAK,EAAE;YACL,SAAS,EAAE,OAAO;YAClB,eAAe,EAAE,SAAS;YAC1B,OAAO,EAAE,MAAM;YACf,OAAO,EAAE,MAAM;YACf,aAAa,EAAE,QAAQ;YACvB,UAAU,EAAE,QAAQ;SACrB,YAED,eAAK,KAAK,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,aAC/C,aAAI,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,8CAAoC,EAE7G,KAAK,IAAI,CACR,eACE,KAAK,EAAE;wBACL,eAAe,EAAE,SAAS;wBAC1B,KAAK,EAAE,SAAS;wBAChB,OAAO,EAAE,MAAM;wBACf,YAAY,EAAE,KAAK;wBACnB,YAAY,EAAE,MAAM;qBACrB,aAED,sCAAuB,OAAE,KAAK,IAC1B,CACP,EAED,KAAC,YAAY,IAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAI,IAuChE,GACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -8,12 +8,20 @@ export function DialogueScene({ sceneName, speaker, scenes, className }) {
|
|
|
8
8
|
const [backgroundOpacity, setBackgroundOpacity] = useState(1);
|
|
9
9
|
const [nextBackground, setNextBackground] = useState(null);
|
|
10
10
|
const [lastSceneName, setLastSceneName] = useState(undefined);
|
|
11
|
+
const [lastSpeaker, setLastSpeaker] = useState(undefined);
|
|
11
12
|
// Get scene config - use last scene if current node has no scene
|
|
12
13
|
const activeSceneName = sceneName || lastSceneName;
|
|
13
14
|
const sceneConfig = activeSceneName ? scenes.scenes[activeSceneName] : undefined;
|
|
14
15
|
const backgroundImage = sceneConfig?.background;
|
|
15
16
|
// Get all actors from the current scene
|
|
16
17
|
const sceneActors = sceneConfig ? Object.keys(sceneConfig.actors) : [];
|
|
18
|
+
// Track last speaker - update when speaker is provided, keep when undefined
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
if (speaker) {
|
|
21
|
+
setLastSpeaker(speaker);
|
|
22
|
+
}
|
|
23
|
+
// Never clear speaker - keep it until a new one is explicitly set
|
|
24
|
+
}, [speaker]);
|
|
17
25
|
// Handle background transitions
|
|
18
26
|
useEffect(() => {
|
|
19
27
|
if (backgroundImage && backgroundImage !== currentBackground) {
|
|
@@ -54,9 +62,14 @@ export function DialogueScene({ sceneName, speaker, scenes, className }) {
|
|
|
54
62
|
}, children: [nextBackground && (_jsx("div", { className: "yd-scene-next", style: {
|
|
55
63
|
backgroundImage: `url(${nextBackground})`,
|
|
56
64
|
opacity: 1 - backgroundOpacity,
|
|
57
|
-
} })), sceneConfig && speaker && (() => {
|
|
65
|
+
} })), sceneConfig && (speaker || lastSpeaker) && (() => {
|
|
66
|
+
// Use current speaker if available, otherwise use last speaker to keep image visible
|
|
67
|
+
const activeSpeaker = speaker || lastSpeaker;
|
|
68
|
+
// Type guard: ensure activeSpeaker is defined
|
|
69
|
+
if (!activeSpeaker)
|
|
70
|
+
return null;
|
|
58
71
|
// Find the actor that matches the speaker (case-insensitive)
|
|
59
|
-
const speakingActorName = sceneActors.find(actorName => actorName.toLowerCase() ===
|
|
72
|
+
const speakingActorName = sceneActors.find(actorName => actorName.toLowerCase() === activeSpeaker.toLowerCase());
|
|
60
73
|
if (!speakingActorName)
|
|
61
74
|
return null;
|
|
62
75
|
const actorConfig = sceneConfig.actors[speakingActorName];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogueScene.js","sourceRoot":"","sources":["../../src/react/DialogueScene.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAYnD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAsB;IACzF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAChF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC9D,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IAC1E,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"DialogueScene.js","sourceRoot":"","sources":["../../src/react/DialogueScene.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "yarn-spinner-runner-ts",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"private": false,
|
|
5
|
-
"description": "TypeScript parser, compiler, and runtime for Yarn Spinner 3.x with React adapter",
|
|
5
|
+
"description": "TypeScript parser, compiler, and runtime for Yarn Spinner 3.x with React adapter [NPM package](https://www.npmjs.com/package/yarn-spinner-runner-ts)",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "dist/index.cjs",
|
|
@@ -105,7 +105,7 @@ export function DialogueExample() {
|
|
|
105
105
|
|
|
106
106
|
<DialogueView result={result} onAdvance={advance} scenes={scenes} />
|
|
107
107
|
|
|
108
|
-
<details style={{ marginTop: "30px", color: "#ffffff" }}>
|
|
108
|
+
{/* <details style={{ marginTop: "30px", color: "#ffffff" }}>
|
|
109
109
|
<summary style={{ cursor: "pointer", padding: "10px", backgroundColor: "rgba(74, 158, 255, 0.2)", borderRadius: "8px" }}>
|
|
110
110
|
Edit Yarn Script
|
|
111
111
|
</summary>
|
|
@@ -141,7 +141,7 @@ export function DialogueExample() {
|
|
|
141
141
|
>
|
|
142
142
|
Reload to Restart
|
|
143
143
|
</button>
|
|
144
|
-
</details>
|
|
144
|
+
</details> */}
|
|
145
145
|
</div>
|
|
146
146
|
</div>
|
|
147
147
|
);
|
|
@@ -18,6 +18,7 @@ export function DialogueScene({ sceneName, speaker, scenes, className }: Dialogu
|
|
|
18
18
|
const [backgroundOpacity, setBackgroundOpacity] = useState(1);
|
|
19
19
|
const [nextBackground, setNextBackground] = useState<string | null>(null);
|
|
20
20
|
const [lastSceneName, setLastSceneName] = useState<string | undefined>(undefined);
|
|
21
|
+
const [lastSpeaker, setLastSpeaker] = useState<string | undefined>(undefined);
|
|
21
22
|
|
|
22
23
|
// Get scene config - use last scene if current node has no scene
|
|
23
24
|
const activeSceneName = sceneName || lastSceneName;
|
|
@@ -26,6 +27,14 @@ export function DialogueScene({ sceneName, speaker, scenes, className }: Dialogu
|
|
|
26
27
|
|
|
27
28
|
// Get all actors from the current scene
|
|
28
29
|
const sceneActors = sceneConfig ? Object.keys(sceneConfig.actors) : [];
|
|
30
|
+
|
|
31
|
+
// Track last speaker - update when speaker is provided, keep when undefined
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
if (speaker) {
|
|
34
|
+
setLastSpeaker(speaker);
|
|
35
|
+
}
|
|
36
|
+
// Never clear speaker - keep it until a new one is explicitly set
|
|
37
|
+
}, [speaker]);
|
|
29
38
|
|
|
30
39
|
// Handle background transitions
|
|
31
40
|
useEffect(() => {
|
|
@@ -79,10 +88,16 @@ export function DialogueScene({ sceneName, speaker, scenes, className }: Dialogu
|
|
|
79
88
|
)}
|
|
80
89
|
|
|
81
90
|
{/* Actor image - show only the speaking actor, aligned to top */}
|
|
82
|
-
{sceneConfig && speaker && (() => {
|
|
91
|
+
{sceneConfig && (speaker || lastSpeaker) && (() => {
|
|
92
|
+
// Use current speaker if available, otherwise use last speaker to keep image visible
|
|
93
|
+
const activeSpeaker = speaker || lastSpeaker;
|
|
94
|
+
|
|
95
|
+
// Type guard: ensure activeSpeaker is defined
|
|
96
|
+
if (!activeSpeaker) return null;
|
|
97
|
+
|
|
83
98
|
// Find the actor that matches the speaker (case-insensitive)
|
|
84
99
|
const speakingActorName = sceneActors.find(
|
|
85
|
-
actorName => actorName.toLowerCase() ===
|
|
100
|
+
actorName => actorName.toLowerCase() === activeSpeaker.toLowerCase()
|
|
86
101
|
);
|
|
87
102
|
|
|
88
103
|
if (!speakingActorName) return null;
|