@magicborn/dialogue-forge 0.1.0

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 (241) hide show
  1. package/README.md +233 -0
  2. package/bin/dialogue-forge.js +78 -0
  3. package/demo/app/layout.tsx +36 -0
  4. package/demo/app/page.tsx +440 -0
  5. package/demo/components/ThemeSwitcher.tsx +611 -0
  6. package/demo/next.config.mjs +7 -0
  7. package/demo/package.json +29 -0
  8. package/demo/postcss.config.mjs +7 -0
  9. package/demo/public/logo.svg +1 -0
  10. package/demo/styles/globals.css +19 -0
  11. package/demo/tailwind.config.ts +90 -0
  12. package/demo/tsconfig.json +42 -0
  13. package/dist/components/ChoiceEdgeV2.d.ts +3 -0
  14. package/dist/components/ChoiceEdgeV2.js +103 -0
  15. package/dist/components/CodeBlock.d.ts +8 -0
  16. package/dist/components/CodeBlock.js +24 -0
  17. package/dist/components/ConditionAutocomplete.d.ts +14 -0
  18. package/dist/components/ConditionAutocomplete.js +284 -0
  19. package/dist/components/ConditionalNodeV2.d.ts +16 -0
  20. package/dist/components/ConditionalNodeV2.js +147 -0
  21. package/dist/components/DialogueEditorV2.d.ts +22 -0
  22. package/dist/components/DialogueEditorV2.js +1170 -0
  23. package/dist/components/EdgeIcon.d.ts +8 -0
  24. package/dist/components/EdgeIcon.js +13 -0
  25. package/dist/components/ExampleLoader.d.ts +11 -0
  26. package/dist/components/ExampleLoader.js +52 -0
  27. package/dist/components/ExampleLoaderButton.d.ts +15 -0
  28. package/dist/components/ExampleLoaderButton.js +102 -0
  29. package/dist/components/FlagManager.d.ts +11 -0
  30. package/dist/components/FlagManager.js +282 -0
  31. package/dist/components/FlagSelector.d.ts +11 -0
  32. package/dist/components/FlagSelector.js +235 -0
  33. package/dist/components/GuidePanel.d.ts +7 -0
  34. package/dist/components/GuidePanel.js +1176 -0
  35. package/dist/components/Minimap.d.ts +16 -0
  36. package/dist/components/Minimap.js +93 -0
  37. package/dist/components/NPCEdgeV2.d.ts +3 -0
  38. package/dist/components/NPCEdgeV2.js +104 -0
  39. package/dist/components/NPCNodeV2.d.ts +26 -0
  40. package/dist/components/NPCNodeV2.js +86 -0
  41. package/dist/components/NodeEditor.d.ts +18 -0
  42. package/dist/components/NodeEditor.js +1025 -0
  43. package/dist/components/PlayView.d.ts +12 -0
  44. package/dist/components/PlayView.js +307 -0
  45. package/dist/components/PlayerNodeV2.d.ts +16 -0
  46. package/dist/components/PlayerNodeV2.js +139 -0
  47. package/dist/components/ReactFlowPOC.d.ts +61 -0
  48. package/dist/components/ReactFlowPOC.js +312 -0
  49. package/dist/components/ScenePlayer.d.ts +18 -0
  50. package/dist/components/ScenePlayer.js +196 -0
  51. package/dist/components/YarnView.d.ts +9 -0
  52. package/dist/components/YarnView.js +45 -0
  53. package/dist/components/ZoomControls.d.ts +11 -0
  54. package/dist/components/ZoomControls.js +34 -0
  55. package/dist/esm/components/ChoiceEdgeV2.d.ts +3 -0
  56. package/dist/esm/components/ChoiceEdgeV2.js +67 -0
  57. package/dist/esm/components/CodeBlock.d.ts +8 -0
  58. package/dist/esm/components/CodeBlock.js +18 -0
  59. package/dist/esm/components/ConditionAutocomplete.d.ts +14 -0
  60. package/dist/esm/components/ConditionAutocomplete.js +248 -0
  61. package/dist/esm/components/ConditionalNodeV2.d.ts +16 -0
  62. package/dist/esm/components/ConditionalNodeV2.js +111 -0
  63. package/dist/esm/components/DialogueEditorV2.d.ts +22 -0
  64. package/dist/esm/components/DialogueEditorV2.js +1134 -0
  65. package/dist/esm/components/EdgeIcon.d.ts +8 -0
  66. package/dist/esm/components/EdgeIcon.js +7 -0
  67. package/dist/esm/components/ExampleLoader.d.ts +11 -0
  68. package/dist/esm/components/ExampleLoader.js +46 -0
  69. package/dist/esm/components/ExampleLoaderButton.d.ts +15 -0
  70. package/dist/esm/components/ExampleLoaderButton.js +66 -0
  71. package/dist/esm/components/FlagManager.d.ts +11 -0
  72. package/dist/esm/components/FlagManager.js +246 -0
  73. package/dist/esm/components/FlagSelector.d.ts +11 -0
  74. package/dist/esm/components/FlagSelector.js +199 -0
  75. package/dist/esm/components/GuidePanel.d.ts +7 -0
  76. package/dist/esm/components/GuidePanel.js +1140 -0
  77. package/dist/esm/components/Minimap.d.ts +16 -0
  78. package/dist/esm/components/Minimap.js +57 -0
  79. package/dist/esm/components/NPCEdgeV2.d.ts +3 -0
  80. package/dist/esm/components/NPCEdgeV2.js +68 -0
  81. package/dist/esm/components/NPCNodeV2.d.ts +26 -0
  82. package/dist/esm/components/NPCNodeV2.js +80 -0
  83. package/dist/esm/components/NodeEditor.d.ts +18 -0
  84. package/dist/esm/components/NodeEditor.js +989 -0
  85. package/dist/esm/components/PlayView.d.ts +12 -0
  86. package/dist/esm/components/PlayView.js +271 -0
  87. package/dist/esm/components/PlayerNodeV2.d.ts +16 -0
  88. package/dist/esm/components/PlayerNodeV2.js +103 -0
  89. package/dist/esm/components/ReactFlowPOC.d.ts +61 -0
  90. package/dist/esm/components/ReactFlowPOC.js +275 -0
  91. package/dist/esm/components/ScenePlayer.d.ts +18 -0
  92. package/dist/esm/components/ScenePlayer.js +160 -0
  93. package/dist/esm/components/YarnView.d.ts +9 -0
  94. package/dist/esm/components/YarnView.js +39 -0
  95. package/dist/esm/components/ZoomControls.d.ts +11 -0
  96. package/dist/esm/components/ZoomControls.js +28 -0
  97. package/dist/esm/examples/example-loader.d.ts +29 -0
  98. package/dist/esm/examples/example-loader.js +103 -0
  99. package/dist/esm/examples/examples-registry.d.ts +38 -0
  100. package/dist/esm/examples/examples-registry.js +153 -0
  101. package/dist/esm/examples/index.d.ts +26 -0
  102. package/dist/esm/examples/index.js +50 -0
  103. package/dist/esm/examples/legacy-examples.d.ts +9 -0
  104. package/dist/esm/examples/legacy-examples.js +814 -0
  105. package/dist/esm/examples/yarn-examples.d.ts +35 -0
  106. package/dist/esm/examples/yarn-examples.js +181 -0
  107. package/dist/esm/index.d.ts +21 -0
  108. package/dist/esm/index.js +26 -0
  109. package/dist/esm/lib/flag-manager.d.ts +21 -0
  110. package/dist/esm/lib/flag-manager.js +93 -0
  111. package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
  112. package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.js +169 -0
  113. package/dist/esm/lib/yarn-converter.d.ts +17 -0
  114. package/dist/esm/lib/yarn-converter.js +521 -0
  115. package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
  116. package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.js +171 -0
  117. package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
  118. package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.js +237 -0
  119. package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
  120. package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.js +106 -0
  121. package/dist/esm/lib/yarn-runner/condition-evaluator.d.ts +12 -0
  122. package/dist/esm/lib/yarn-runner/condition-evaluator.js +56 -0
  123. package/dist/esm/lib/yarn-runner/index.d.ts +12 -0
  124. package/dist/esm/lib/yarn-runner/index.js +11 -0
  125. package/dist/esm/lib/yarn-runner/node-processor.d.ts +18 -0
  126. package/dist/esm/lib/yarn-runner/node-processor.js +129 -0
  127. package/dist/esm/lib/yarn-runner/variable-manager.d.ts +51 -0
  128. package/dist/esm/lib/yarn-runner/variable-manager.js +120 -0
  129. package/dist/esm/lib/yarn-runner/variable-operations.d.ts +16 -0
  130. package/dist/esm/lib/yarn-runner/variable-operations.js +88 -0
  131. package/dist/esm/types/conditionals.d.ts +29 -0
  132. package/dist/esm/types/conditionals.js +1 -0
  133. package/dist/esm/types/constants.d.ts +59 -0
  134. package/dist/esm/types/constants.js +55 -0
  135. package/dist/esm/types/flags.d.ts +49 -0
  136. package/dist/esm/types/flags.js +49 -0
  137. package/dist/esm/types/game-state.d.ts +62 -0
  138. package/dist/esm/types/game-state.js +6 -0
  139. package/dist/esm/types/index.d.ts +77 -0
  140. package/dist/esm/types/index.js +1 -0
  141. package/dist/esm/utils/constants.d.ts +5 -0
  142. package/dist/esm/utils/constants.js +5 -0
  143. package/dist/esm/utils/feature-flags.d.ts +11 -0
  144. package/dist/esm/utils/feature-flags.js +11 -0
  145. package/dist/esm/utils/game-state-flattener.d.ts +41 -0
  146. package/dist/esm/utils/game-state-flattener.js +135 -0
  147. package/dist/esm/utils/layout/collision.d.ts +27 -0
  148. package/dist/esm/utils/layout/collision.js +74 -0
  149. package/dist/esm/utils/layout/index.d.ts +82 -0
  150. package/dist/esm/utils/layout/index.js +98 -0
  151. package/dist/esm/utils/layout/registry.d.ts +91 -0
  152. package/dist/esm/utils/layout/registry.js +148 -0
  153. package/dist/esm/utils/layout/strategies/dagre.d.ts +19 -0
  154. package/dist/esm/utils/layout/strategies/dagre.js +182 -0
  155. package/dist/esm/utils/layout/strategies/force.d.ts +21 -0
  156. package/dist/esm/utils/layout/strategies/force.js +178 -0
  157. package/dist/esm/utils/layout/strategies/grid.d.ts +17 -0
  158. package/dist/esm/utils/layout/strategies/grid.js +91 -0
  159. package/dist/esm/utils/layout/strategies/index.d.ts +8 -0
  160. package/dist/esm/utils/layout/strategies/index.js +8 -0
  161. package/dist/esm/utils/layout/types.d.ts +100 -0
  162. package/dist/esm/utils/layout/types.js +7 -0
  163. package/dist/esm/utils/layout.d.ts +9 -0
  164. package/dist/esm/utils/layout.js +17 -0
  165. package/dist/esm/utils/node-helpers.d.ts +7 -0
  166. package/dist/esm/utils/node-helpers.js +94 -0
  167. package/dist/esm/utils/reactflow-converter.d.ts +42 -0
  168. package/dist/esm/utils/reactflow-converter.js +217 -0
  169. package/dist/examples/example-loader.d.ts +29 -0
  170. package/dist/examples/example-loader.js +109 -0
  171. package/dist/examples/examples-registry.d.ts +38 -0
  172. package/dist/examples/examples-registry.js +160 -0
  173. package/dist/examples/index.d.ts +26 -0
  174. package/dist/examples/index.js +63 -0
  175. package/dist/examples/legacy-examples.d.ts +9 -0
  176. package/dist/examples/legacy-examples.js +817 -0
  177. package/dist/examples/yarn-examples.d.ts +35 -0
  178. package/dist/examples/yarn-examples.js +189 -0
  179. package/dist/index.d.ts +21 -0
  180. package/dist/index.js +66 -0
  181. package/dist/lib/flag-manager.d.ts +21 -0
  182. package/dist/lib/flag-manager.js +99 -0
  183. package/dist/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
  184. package/dist/lib/yarn-converter/__tests__/round-trip.test.js +171 -0
  185. package/dist/lib/yarn-converter.d.ts +17 -0
  186. package/dist/lib/yarn-converter.js +525 -0
  187. package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
  188. package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.js +173 -0
  189. package/dist/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
  190. package/dist/lib/yarn-runner/__tests__/node-processor.test.js +239 -0
  191. package/dist/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
  192. package/dist/lib/yarn-runner/__tests__/variable-manager.test.js +108 -0
  193. package/dist/lib/yarn-runner/condition-evaluator.d.ts +12 -0
  194. package/dist/lib/yarn-runner/condition-evaluator.js +60 -0
  195. package/dist/lib/yarn-runner/index.d.ts +12 -0
  196. package/dist/lib/yarn-runner/index.js +21 -0
  197. package/dist/lib/yarn-runner/node-processor.d.ts +18 -0
  198. package/dist/lib/yarn-runner/node-processor.js +133 -0
  199. package/dist/lib/yarn-runner/variable-manager.d.ts +51 -0
  200. package/dist/lib/yarn-runner/variable-manager.js +124 -0
  201. package/dist/lib/yarn-runner/variable-operations.d.ts +16 -0
  202. package/dist/lib/yarn-runner/variable-operations.js +92 -0
  203. package/dist/types/conditionals.d.ts +29 -0
  204. package/dist/types/conditionals.js +2 -0
  205. package/dist/types/constants.d.ts +59 -0
  206. package/dist/types/constants.js +58 -0
  207. package/dist/types/flags.d.ts +49 -0
  208. package/dist/types/flags.js +52 -0
  209. package/dist/types/game-state.d.ts +62 -0
  210. package/dist/types/game-state.js +7 -0
  211. package/dist/types/index.d.ts +77 -0
  212. package/dist/types/index.js +2 -0
  213. package/dist/utils/constants.d.ts +5 -0
  214. package/dist/utils/constants.js +8 -0
  215. package/dist/utils/feature-flags.d.ts +11 -0
  216. package/dist/utils/feature-flags.js +14 -0
  217. package/dist/utils/game-state-flattener.d.ts +41 -0
  218. package/dist/utils/game-state-flattener.js +140 -0
  219. package/dist/utils/layout/collision.d.ts +27 -0
  220. package/dist/utils/layout/collision.js +77 -0
  221. package/dist/utils/layout/index.d.ts +82 -0
  222. package/dist/utils/layout/index.js +109 -0
  223. package/dist/utils/layout/registry.d.ts +91 -0
  224. package/dist/utils/layout/registry.js +151 -0
  225. package/dist/utils/layout/strategies/dagre.d.ts +19 -0
  226. package/dist/utils/layout/strategies/dagre.js +189 -0
  227. package/dist/utils/layout/strategies/force.d.ts +21 -0
  228. package/dist/utils/layout/strategies/force.js +182 -0
  229. package/dist/utils/layout/strategies/grid.d.ts +17 -0
  230. package/dist/utils/layout/strategies/grid.js +95 -0
  231. package/dist/utils/layout/strategies/index.d.ts +8 -0
  232. package/dist/utils/layout/strategies/index.js +14 -0
  233. package/dist/utils/layout/types.d.ts +100 -0
  234. package/dist/utils/layout/types.js +8 -0
  235. package/dist/utils/layout.d.ts +9 -0
  236. package/dist/utils/layout.js +25 -0
  237. package/dist/utils/node-helpers.d.ts +7 -0
  238. package/dist/utils/node-helpers.js +101 -0
  239. package/dist/utils/reactflow-converter.d.ts +42 -0
  240. package/dist/utils/reactflow-converter.js +223 -0
  241. package/package.json +70 -0
package/README.md ADDED
@@ -0,0 +1,233 @@
1
+ # Dialogue Forge
2
+
3
+ A visual node-based dialogue editor with Yarn Spinner support for game development.
4
+
5
+ ## 🚀 Quick Start
6
+
7
+ ### Run the Demo
8
+
9
+ ```bash
10
+ npx @magicborn/dialogue-forge
11
+ ```
12
+
13
+ This will download the package and start an interactive demo server at `http://localhost:3000`.
14
+
15
+ ### Install as Library
16
+
17
+ ```bash
18
+ npm install @magicborn/dialogue-forge
19
+ ```
20
+
21
+ ## Quick Start
22
+
23
+ ### 1. Define Your Flags
24
+
25
+ ```typescript
26
+ import { FlagSchema, FLAG_TYPE, FLAG_VALUE_TYPE } from '@magicborn/dialogue-forge';
27
+
28
+ const flagSchema: FlagSchema = {
29
+ categories: ['quests', 'items', 'stats'],
30
+ flags: [
31
+ {
32
+ id: 'quest_dragon_slayer',
33
+ name: 'Dragon Slayer Quest',
34
+ type: FLAG_TYPE.QUEST, // ✅ Use constant, not 'quest'
35
+ category: 'quests',
36
+ valueType: FLAG_VALUE_TYPE.STRING
37
+ },
38
+ {
39
+ id: 'item_ancient_key',
40
+ name: 'Ancient Key',
41
+ type: FLAG_TYPE.ITEM, // ✅ Use constant
42
+ category: 'items'
43
+ },
44
+ {
45
+ id: 'stat_gold',
46
+ name: 'Gold',
47
+ type: FLAG_TYPE.STAT, // ✅ Use constant
48
+ category: 'stats',
49
+ valueType: FLAG_VALUE_TYPE.NUMBER,
50
+ defaultValue: 0
51
+ }
52
+ ]
53
+ };
54
+ ```
55
+
56
+ ### 2. Load Dialogue from Yarn
57
+
58
+ ```typescript
59
+ import { importFromYarn } from '@magicborn/dialogue-forge';
60
+
61
+ const yarnContent = await loadFile('merchant.yarn');
62
+ const dialogue = importFromYarn(yarnContent, 'Merchant Dialogue');
63
+ ```
64
+
65
+ ### 3. Edit Dialogue
66
+
67
+ ```tsx
68
+ import { DialogueEditor, exportToYarn } from '@magicborn/dialogue-forge';
69
+
70
+ <DialogueEditor
71
+ dialogue={dialogue}
72
+ onChange={(updated) => {
73
+ const yarn = exportToYarn(updated);
74
+ saveFile('merchant.yarn', yarn);
75
+ }}
76
+ flagSchema={flagSchema}
77
+ />
78
+ ```
79
+
80
+ ### 4. Run Dialogue with Game State
81
+
82
+ ```tsx
83
+ import { DialogueSimulator } from '@magicborn/dialogue-forge';
84
+
85
+ // Get current game flags
86
+ const gameFlags = {
87
+ quest_dragon_slayer: 'complete',
88
+ item_ancient_key: true,
89
+ stat_gold: 1000
90
+ };
91
+
92
+ <DialogueSimulator
93
+ dialogue={dialogue}
94
+ initialFlags={gameFlags}
95
+ onComplete={(result) => {
96
+ // Update game state with new flags
97
+ gameState.flags = {
98
+ ...gameState.flags,
99
+ ...result.updatedFlags
100
+ };
101
+ }}
102
+ />
103
+ ```
104
+
105
+ ## Features
106
+
107
+ - **Visual Node Editor** - Drag nodes, connect edges, right-click menus
108
+ - **Yarn Spinner Import/Export** - Work with `.yarn` files
109
+ - **Flag System** - Reference game flags with autocomplete dropdown
110
+ - **Simulation Mode** - Test dialogues with current game state
111
+ - **Built-in Guide** - Click book icon for complete documentation
112
+
113
+ ## Flag System
114
+
115
+ Flags represent game state (quests, items, achievements, etc.). The editor:
116
+ - Shows available flags in dropdowns when setting flags
117
+ - Validates flag references
118
+ - Exports flags to Yarn format
119
+ - Returns updated flags after dialogue completes
120
+
121
+ **Flag Types** (use `FLAG_TYPE` constant):
122
+ - `FLAG_TYPE.QUEST` - Quest state and completion
123
+ - `FLAG_TYPE.ACHIEVEMENT` - Unlocked achievements
124
+ - `FLAG_TYPE.ITEM` - Inventory items
125
+ - `FLAG_TYPE.STAT` - Player statistics
126
+ - `FLAG_TYPE.TITLE` - Earned titles
127
+ - `FLAG_TYPE.DIALOGUE` - Temporary, dialogue-scoped
128
+ - `FLAG_TYPE.GLOBAL` - Global game state
129
+
130
+ **Important:** Always use the exported constants (`FLAG_TYPE`, `NODE_TYPE`, etc.) instead of string literals for type safety.
131
+
132
+ See [DATA_STRUCTURES.md](./DATA_STRUCTURES.md) for complete type documentation and [FLAG_SYSTEM.md](./FLAG_SYSTEM.md) for flag system details.
133
+
134
+ ## API Reference
135
+
136
+ ### Components
137
+
138
+ - `DialogueEditor` - Visual editor for creating/editing dialogues
139
+ - `DialogueSimulator` - Run dialogues with game state, returns updated flags
140
+ - `GuidePanel` - Built-in documentation panel
141
+ - `FlagSelector` - Flag autocomplete component
142
+
143
+ ### Utilities
144
+
145
+ - `importFromYarn(yarnContent, title)` - Parse Yarn file to DialogueTree
146
+ - `exportToYarn(dialogue)` - Convert DialogueTree to Yarn format
147
+ - `initializeFlags(schema)` - Create default flag state from schema
148
+ - `mergeFlagUpdates(current, updates, schema)` - Merge flag updates
149
+ - `validateFlags(flags, schema)` - Validate flags against schema
150
+
151
+ ### Types
152
+
153
+ - `DialogueTree` - Dialogue structure
154
+ - `DialogueNode` - Individual dialogue node (NPC or Player)
155
+ - `FlagSchema` - Flag definitions
156
+ - `GameFlagState` - Current flag values `{ [flagId]: value }`
157
+ - `DialogueResult` - Result from running dialogue (updated flags, visited nodes)
158
+
159
+ ## Complete Example
160
+
161
+ ```typescript
162
+ import {
163
+ DialogueEditor,
164
+ DialogueSimulator,
165
+ importFromYarn,
166
+ exportToYarn,
167
+ FlagSchema,
168
+ GameFlagState
169
+ } from '@magicborn/dialogue-forge';
170
+
171
+ // Define flags
172
+ import { FLAG_TYPE } from '@magicborn/dialogue-forge';
173
+
174
+ const flagSchema: FlagSchema = {
175
+ flags: [
176
+ { id: 'quest_complete', type: FLAG_TYPE.QUEST, category: 'quests' },
177
+ { id: 'item_key', type: FLAG_TYPE.ITEM, category: 'items' },
178
+ ]
179
+ };
180
+
181
+ // Load dialogue
182
+ const dialogue = importFromYarn(yarnFile, 'Merchant');
183
+
184
+ // Get current game state
185
+ const gameFlags: GameFlagState = {
186
+ quest_complete: 'complete',
187
+ item_key: true
188
+ };
189
+
190
+ // Edit dialogue
191
+ <DialogueEditor
192
+ dialogue={dialogue}
193
+ onChange={(updated) => {
194
+ const yarn = exportToYarn(updated);
195
+ saveFile(yarn);
196
+ }}
197
+ flagSchema={flagSchema}
198
+ initialFlags={gameFlags}
199
+ />
200
+
201
+ // OR run dialogue
202
+ <DialogueSimulator
203
+ dialogue={dialogue}
204
+ initialFlags={gameFlags}
205
+ onComplete={(result) => {
206
+ // Update game with new flags
207
+ gameState.flags = result.updatedFlags;
208
+ // Next dialogue will have different options
209
+ // based on updated flags
210
+ }}
211
+ />
212
+ ```
213
+
214
+ ## Documentation
215
+
216
+ - **[GUIDE.md](./GUIDE.md)** - Friendly, educational guide for learning Dialogue Forge
217
+ - **[UNREAL_INTEGRATION.md](./UNREAL_INTEGRATION.md)** - Complete guide for integrating with Unreal Engine
218
+ - **[DATA_STRUCTURES.md](./DATA_STRUCTURES.md)** - Complete type reference and API documentation
219
+ - **[INTEGRATION.md](./INTEGRATION.md)** - General integration patterns
220
+ - **[FLAG_SYSTEM.md](./FLAG_SYSTEM.md)** - Detailed flag system documentation
221
+
222
+ Click the **book icon** in the editor to open the built-in guide.
223
+
224
+ ### Key Concepts
225
+
226
+ **Flags = Yarn Variables**: Flags you define in Dialogue Forge become `$variable` in Yarn Spinner. These variables are stored in Yarn Spinner's Variable Storage at runtime, not in the .yarn file.
227
+
228
+ **Bidirectional Flow**:
229
+ - Edit in Dialogue Forge → Export .yarn → Import to Unreal
230
+ - Game sets variables → Yarn reads them → Dialogue reacts
231
+ - Dialogue sets variables → Yarn stores them → Game reads them
232
+
233
+ See [UNREAL_INTEGRATION.md](./UNREAL_INTEGRATION.md) for complete details.
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Dialogue Forge Demo Server
5
+ *
6
+ * This script starts the Next.js demo server for Dialogue Forge.
7
+ * Users can run: npx @magicborn/dialogue-forge
8
+ */
9
+
10
+ const { spawn } = require('child_process');
11
+ const path = require('path');
12
+ const fs = require('fs');
13
+
14
+ // Get the directory where this package is installed
15
+ const packageDir = path.resolve(__dirname, '..');
16
+ const demoDir = path.join(packageDir, 'demo');
17
+
18
+ // Check if demo directory exists
19
+ if (!fs.existsSync(demoDir)) {
20
+ console.error('❌ Demo directory not found. Make sure the package is properly installed.');
21
+ process.exit(1);
22
+ }
23
+
24
+ // Check if we're in a published package (has node_modules/@magicborn) or local dev
25
+ const isPublished = fs.existsSync(path.join(packageDir, 'node_modules', '@magicborn'));
26
+ const nodeModulesPath = path.join(demoDir, 'node_modules');
27
+
28
+ // For published packages, use npm package references
29
+ // For local dev, use file references (already set in package.json)
30
+ if (isPublished) {
31
+ // Update demo package.json to use published packages
32
+ const demoPackageJson = path.join(demoDir, 'package.json');
33
+ const pkg = JSON.parse(fs.readFileSync(demoPackageJson, 'utf8'));
34
+ pkg.dependencies['@magicborn/dialogue-forge'] = '*';
35
+ pkg.dependencies['@magicborn/server-template'] = '*';
36
+ fs.writeFileSync(demoPackageJson, JSON.stringify(pkg, null, 2));
37
+ }
38
+
39
+ if (!fs.existsSync(nodeModulesPath)) {
40
+ console.log('📦 Installing dependencies...');
41
+ const install = spawn('npm', ['install'], {
42
+ cwd: demoDir,
43
+ stdio: 'inherit',
44
+ shell: true,
45
+ });
46
+
47
+ install.on('close', (code) => {
48
+ if (code !== 0) {
49
+ console.error('❌ Failed to install dependencies');
50
+ process.exit(1);
51
+ }
52
+ startServer();
53
+ });
54
+ } else {
55
+ startServer();
56
+ }
57
+
58
+ function startServer() {
59
+ console.log('🚀 Starting Dialogue Forge Demo Server...');
60
+ console.log('📖 Open http://localhost:3000 in your browser\n');
61
+
62
+ const dev = spawn('npm', ['run', 'dev'], {
63
+ cwd: demoDir,
64
+ stdio: 'inherit',
65
+ shell: true,
66
+ });
67
+
68
+ dev.on('close', (code) => {
69
+ process.exit(code);
70
+ });
71
+
72
+ // Handle Ctrl+C
73
+ process.on('SIGINT', () => {
74
+ dev.kill('SIGINT');
75
+ process.exit(0);
76
+ });
77
+ }
78
+
@@ -0,0 +1,36 @@
1
+ import type { Metadata } from 'next';
2
+ import 'reactflow/dist/style.css';
3
+ import 'react-tooltip/dist/react-tooltip.css';
4
+ import '../styles/globals.css';
5
+ import '../../../../packages-shared/server-template/styles/globals.css';
6
+ import { BrandedLayout } from '../../../../packages-shared/server-template/components/BrandedLayout';
7
+
8
+ export const metadata: Metadata = {
9
+ title: 'Dialogue Forge - Visual Dialogue Editor',
10
+ description: 'Interactive demo of Dialogue Forge - a visual node-based dialogue editor with Yarn Spinner support',
11
+ };
12
+
13
+ // Tell Next.js this layout is static (no dynamic params/searchParams)
14
+ export const dynamic = 'force-static';
15
+
16
+ export default function RootLayout({
17
+ children,
18
+ }: {
19
+ children: React.ReactNode;
20
+ }) {
21
+ return (
22
+ <html lang="en">
23
+ <body>
24
+ <BrandedLayout
25
+ packageName="Dialogue Forge"
26
+ packageDescription="Visual node-based dialogue editor with Yarn Spinner support"
27
+ packageRepo="https://github.com/MagicbornStudios/dialogue-forge"
28
+ portfolioUrl="bengarrard.com"
29
+ >
30
+ {children}
31
+ </BrandedLayout>
32
+ </body>
33
+ </html>
34
+ );
35
+ }
36
+