@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.
- package/README.md +233 -0
- package/bin/dialogue-forge.js +78 -0
- package/demo/app/layout.tsx +36 -0
- package/demo/app/page.tsx +440 -0
- package/demo/components/ThemeSwitcher.tsx +611 -0
- package/demo/next.config.mjs +7 -0
- package/demo/package.json +29 -0
- package/demo/postcss.config.mjs +7 -0
- package/demo/public/logo.svg +1 -0
- package/demo/styles/globals.css +19 -0
- package/demo/tailwind.config.ts +90 -0
- package/demo/tsconfig.json +42 -0
- package/dist/components/ChoiceEdgeV2.d.ts +3 -0
- package/dist/components/ChoiceEdgeV2.js +103 -0
- package/dist/components/CodeBlock.d.ts +8 -0
- package/dist/components/CodeBlock.js +24 -0
- package/dist/components/ConditionAutocomplete.d.ts +14 -0
- package/dist/components/ConditionAutocomplete.js +284 -0
- package/dist/components/ConditionalNodeV2.d.ts +16 -0
- package/dist/components/ConditionalNodeV2.js +147 -0
- package/dist/components/DialogueEditorV2.d.ts +22 -0
- package/dist/components/DialogueEditorV2.js +1170 -0
- package/dist/components/EdgeIcon.d.ts +8 -0
- package/dist/components/EdgeIcon.js +13 -0
- package/dist/components/ExampleLoader.d.ts +11 -0
- package/dist/components/ExampleLoader.js +52 -0
- package/dist/components/ExampleLoaderButton.d.ts +15 -0
- package/dist/components/ExampleLoaderButton.js +102 -0
- package/dist/components/FlagManager.d.ts +11 -0
- package/dist/components/FlagManager.js +282 -0
- package/dist/components/FlagSelector.d.ts +11 -0
- package/dist/components/FlagSelector.js +235 -0
- package/dist/components/GuidePanel.d.ts +7 -0
- package/dist/components/GuidePanel.js +1176 -0
- package/dist/components/Minimap.d.ts +16 -0
- package/dist/components/Minimap.js +93 -0
- package/dist/components/NPCEdgeV2.d.ts +3 -0
- package/dist/components/NPCEdgeV2.js +104 -0
- package/dist/components/NPCNodeV2.d.ts +26 -0
- package/dist/components/NPCNodeV2.js +86 -0
- package/dist/components/NodeEditor.d.ts +18 -0
- package/dist/components/NodeEditor.js +1025 -0
- package/dist/components/PlayView.d.ts +12 -0
- package/dist/components/PlayView.js +307 -0
- package/dist/components/PlayerNodeV2.d.ts +16 -0
- package/dist/components/PlayerNodeV2.js +139 -0
- package/dist/components/ReactFlowPOC.d.ts +61 -0
- package/dist/components/ReactFlowPOC.js +312 -0
- package/dist/components/ScenePlayer.d.ts +18 -0
- package/dist/components/ScenePlayer.js +196 -0
- package/dist/components/YarnView.d.ts +9 -0
- package/dist/components/YarnView.js +45 -0
- package/dist/components/ZoomControls.d.ts +11 -0
- package/dist/components/ZoomControls.js +34 -0
- package/dist/esm/components/ChoiceEdgeV2.d.ts +3 -0
- package/dist/esm/components/ChoiceEdgeV2.js +67 -0
- package/dist/esm/components/CodeBlock.d.ts +8 -0
- package/dist/esm/components/CodeBlock.js +18 -0
- package/dist/esm/components/ConditionAutocomplete.d.ts +14 -0
- package/dist/esm/components/ConditionAutocomplete.js +248 -0
- package/dist/esm/components/ConditionalNodeV2.d.ts +16 -0
- package/dist/esm/components/ConditionalNodeV2.js +111 -0
- package/dist/esm/components/DialogueEditorV2.d.ts +22 -0
- package/dist/esm/components/DialogueEditorV2.js +1134 -0
- package/dist/esm/components/EdgeIcon.d.ts +8 -0
- package/dist/esm/components/EdgeIcon.js +7 -0
- package/dist/esm/components/ExampleLoader.d.ts +11 -0
- package/dist/esm/components/ExampleLoader.js +46 -0
- package/dist/esm/components/ExampleLoaderButton.d.ts +15 -0
- package/dist/esm/components/ExampleLoaderButton.js +66 -0
- package/dist/esm/components/FlagManager.d.ts +11 -0
- package/dist/esm/components/FlagManager.js +246 -0
- package/dist/esm/components/FlagSelector.d.ts +11 -0
- package/dist/esm/components/FlagSelector.js +199 -0
- package/dist/esm/components/GuidePanel.d.ts +7 -0
- package/dist/esm/components/GuidePanel.js +1140 -0
- package/dist/esm/components/Minimap.d.ts +16 -0
- package/dist/esm/components/Minimap.js +57 -0
- package/dist/esm/components/NPCEdgeV2.d.ts +3 -0
- package/dist/esm/components/NPCEdgeV2.js +68 -0
- package/dist/esm/components/NPCNodeV2.d.ts +26 -0
- package/dist/esm/components/NPCNodeV2.js +80 -0
- package/dist/esm/components/NodeEditor.d.ts +18 -0
- package/dist/esm/components/NodeEditor.js +989 -0
- package/dist/esm/components/PlayView.d.ts +12 -0
- package/dist/esm/components/PlayView.js +271 -0
- package/dist/esm/components/PlayerNodeV2.d.ts +16 -0
- package/dist/esm/components/PlayerNodeV2.js +103 -0
- package/dist/esm/components/ReactFlowPOC.d.ts +61 -0
- package/dist/esm/components/ReactFlowPOC.js +275 -0
- package/dist/esm/components/ScenePlayer.d.ts +18 -0
- package/dist/esm/components/ScenePlayer.js +160 -0
- package/dist/esm/components/YarnView.d.ts +9 -0
- package/dist/esm/components/YarnView.js +39 -0
- package/dist/esm/components/ZoomControls.d.ts +11 -0
- package/dist/esm/components/ZoomControls.js +28 -0
- package/dist/esm/examples/example-loader.d.ts +29 -0
- package/dist/esm/examples/example-loader.js +103 -0
- package/dist/esm/examples/examples-registry.d.ts +38 -0
- package/dist/esm/examples/examples-registry.js +153 -0
- package/dist/esm/examples/index.d.ts +26 -0
- package/dist/esm/examples/index.js +50 -0
- package/dist/esm/examples/legacy-examples.d.ts +9 -0
- package/dist/esm/examples/legacy-examples.js +814 -0
- package/dist/esm/examples/yarn-examples.d.ts +35 -0
- package/dist/esm/examples/yarn-examples.js +181 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/lib/flag-manager.d.ts +21 -0
- package/dist/esm/lib/flag-manager.js +93 -0
- package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
- package/dist/esm/lib/yarn-converter/__tests__/round-trip.test.js +169 -0
- package/dist/esm/lib/yarn-converter.d.ts +17 -0
- package/dist/esm/lib/yarn-converter.js +521 -0
- package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/condition-evaluator.test.js +171 -0
- package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/node-processor.test.js +237 -0
- package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
- package/dist/esm/lib/yarn-runner/__tests__/variable-manager.test.js +106 -0
- package/dist/esm/lib/yarn-runner/condition-evaluator.d.ts +12 -0
- package/dist/esm/lib/yarn-runner/condition-evaluator.js +56 -0
- package/dist/esm/lib/yarn-runner/index.d.ts +12 -0
- package/dist/esm/lib/yarn-runner/index.js +11 -0
- package/dist/esm/lib/yarn-runner/node-processor.d.ts +18 -0
- package/dist/esm/lib/yarn-runner/node-processor.js +129 -0
- package/dist/esm/lib/yarn-runner/variable-manager.d.ts +51 -0
- package/dist/esm/lib/yarn-runner/variable-manager.js +120 -0
- package/dist/esm/lib/yarn-runner/variable-operations.d.ts +16 -0
- package/dist/esm/lib/yarn-runner/variable-operations.js +88 -0
- package/dist/esm/types/conditionals.d.ts +29 -0
- package/dist/esm/types/conditionals.js +1 -0
- package/dist/esm/types/constants.d.ts +59 -0
- package/dist/esm/types/constants.js +55 -0
- package/dist/esm/types/flags.d.ts +49 -0
- package/dist/esm/types/flags.js +49 -0
- package/dist/esm/types/game-state.d.ts +62 -0
- package/dist/esm/types/game-state.js +6 -0
- package/dist/esm/types/index.d.ts +77 -0
- package/dist/esm/types/index.js +1 -0
- package/dist/esm/utils/constants.d.ts +5 -0
- package/dist/esm/utils/constants.js +5 -0
- package/dist/esm/utils/feature-flags.d.ts +11 -0
- package/dist/esm/utils/feature-flags.js +11 -0
- package/dist/esm/utils/game-state-flattener.d.ts +41 -0
- package/dist/esm/utils/game-state-flattener.js +135 -0
- package/dist/esm/utils/layout/collision.d.ts +27 -0
- package/dist/esm/utils/layout/collision.js +74 -0
- package/dist/esm/utils/layout/index.d.ts +82 -0
- package/dist/esm/utils/layout/index.js +98 -0
- package/dist/esm/utils/layout/registry.d.ts +91 -0
- package/dist/esm/utils/layout/registry.js +148 -0
- package/dist/esm/utils/layout/strategies/dagre.d.ts +19 -0
- package/dist/esm/utils/layout/strategies/dagre.js +182 -0
- package/dist/esm/utils/layout/strategies/force.d.ts +21 -0
- package/dist/esm/utils/layout/strategies/force.js +178 -0
- package/dist/esm/utils/layout/strategies/grid.d.ts +17 -0
- package/dist/esm/utils/layout/strategies/grid.js +91 -0
- package/dist/esm/utils/layout/strategies/index.d.ts +8 -0
- package/dist/esm/utils/layout/strategies/index.js +8 -0
- package/dist/esm/utils/layout/types.d.ts +100 -0
- package/dist/esm/utils/layout/types.js +7 -0
- package/dist/esm/utils/layout.d.ts +9 -0
- package/dist/esm/utils/layout.js +17 -0
- package/dist/esm/utils/node-helpers.d.ts +7 -0
- package/dist/esm/utils/node-helpers.js +94 -0
- package/dist/esm/utils/reactflow-converter.d.ts +42 -0
- package/dist/esm/utils/reactflow-converter.js +217 -0
- package/dist/examples/example-loader.d.ts +29 -0
- package/dist/examples/example-loader.js +109 -0
- package/dist/examples/examples-registry.d.ts +38 -0
- package/dist/examples/examples-registry.js +160 -0
- package/dist/examples/index.d.ts +26 -0
- package/dist/examples/index.js +63 -0
- package/dist/examples/legacy-examples.d.ts +9 -0
- package/dist/examples/legacy-examples.js +817 -0
- package/dist/examples/yarn-examples.d.ts +35 -0
- package/dist/examples/yarn-examples.js +189 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.js +66 -0
- package/dist/lib/flag-manager.d.ts +21 -0
- package/dist/lib/flag-manager.js +99 -0
- package/dist/lib/yarn-converter/__tests__/round-trip.test.d.ts +1 -0
- package/dist/lib/yarn-converter/__tests__/round-trip.test.js +171 -0
- package/dist/lib/yarn-converter.d.ts +17 -0
- package/dist/lib/yarn-converter.js +525 -0
- package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/condition-evaluator.test.js +173 -0
- package/dist/lib/yarn-runner/__tests__/node-processor.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/node-processor.test.js +239 -0
- package/dist/lib/yarn-runner/__tests__/variable-manager.test.d.ts +1 -0
- package/dist/lib/yarn-runner/__tests__/variable-manager.test.js +108 -0
- package/dist/lib/yarn-runner/condition-evaluator.d.ts +12 -0
- package/dist/lib/yarn-runner/condition-evaluator.js +60 -0
- package/dist/lib/yarn-runner/index.d.ts +12 -0
- package/dist/lib/yarn-runner/index.js +21 -0
- package/dist/lib/yarn-runner/node-processor.d.ts +18 -0
- package/dist/lib/yarn-runner/node-processor.js +133 -0
- package/dist/lib/yarn-runner/variable-manager.d.ts +51 -0
- package/dist/lib/yarn-runner/variable-manager.js +124 -0
- package/dist/lib/yarn-runner/variable-operations.d.ts +16 -0
- package/dist/lib/yarn-runner/variable-operations.js +92 -0
- package/dist/types/conditionals.d.ts +29 -0
- package/dist/types/conditionals.js +2 -0
- package/dist/types/constants.d.ts +59 -0
- package/dist/types/constants.js +58 -0
- package/dist/types/flags.d.ts +49 -0
- package/dist/types/flags.js +52 -0
- package/dist/types/game-state.d.ts +62 -0
- package/dist/types/game-state.js +7 -0
- package/dist/types/index.d.ts +77 -0
- package/dist/types/index.js +2 -0
- package/dist/utils/constants.d.ts +5 -0
- package/dist/utils/constants.js +8 -0
- package/dist/utils/feature-flags.d.ts +11 -0
- package/dist/utils/feature-flags.js +14 -0
- package/dist/utils/game-state-flattener.d.ts +41 -0
- package/dist/utils/game-state-flattener.js +140 -0
- package/dist/utils/layout/collision.d.ts +27 -0
- package/dist/utils/layout/collision.js +77 -0
- package/dist/utils/layout/index.d.ts +82 -0
- package/dist/utils/layout/index.js +109 -0
- package/dist/utils/layout/registry.d.ts +91 -0
- package/dist/utils/layout/registry.js +151 -0
- package/dist/utils/layout/strategies/dagre.d.ts +19 -0
- package/dist/utils/layout/strategies/dagre.js +189 -0
- package/dist/utils/layout/strategies/force.d.ts +21 -0
- package/dist/utils/layout/strategies/force.js +182 -0
- package/dist/utils/layout/strategies/grid.d.ts +17 -0
- package/dist/utils/layout/strategies/grid.js +95 -0
- package/dist/utils/layout/strategies/index.d.ts +8 -0
- package/dist/utils/layout/strategies/index.js +14 -0
- package/dist/utils/layout/types.d.ts +100 -0
- package/dist/utils/layout/types.js +8 -0
- package/dist/utils/layout.d.ts +9 -0
- package/dist/utils/layout.js +25 -0
- package/dist/utils/node-helpers.d.ts +7 -0
- package/dist/utils/node-helpers.js +101 -0
- package/dist/utils/reactflow-converter.d.ts +42 -0
- package/dist/utils/reactflow-converter.js +223 -0
- package/package.json +70 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { Config } from 'tailwindcss';
|
|
2
|
+
|
|
3
|
+
const config: Config = {
|
|
4
|
+
content: [
|
|
5
|
+
'./app/**/*.{js,ts,jsx,tsx,mdx}',
|
|
6
|
+
'./components/**/*.{js,ts,jsx,tsx,mdx}',
|
|
7
|
+
'../src/**/*.{js,ts,jsx,tsx,mdx}',
|
|
8
|
+
'../../packages-shared/server-template/**/*.{js,ts,jsx,tsx,mdx}',
|
|
9
|
+
],
|
|
10
|
+
theme: {
|
|
11
|
+
extend: {
|
|
12
|
+
colors: {
|
|
13
|
+
'df-base': 'var(--color-df-base)',
|
|
14
|
+
'df-surface': 'var(--color-df-surface)',
|
|
15
|
+
'df-elevated': 'var(--color-df-elevated)',
|
|
16
|
+
'df-node-bg': 'var(--color-df-node-bg)',
|
|
17
|
+
'df-node-border': 'var(--color-df-node-border)',
|
|
18
|
+
'df-node-selected': 'var(--color-df-node-selected)',
|
|
19
|
+
'df-node-dimmed': 'var(--color-df-node-dimmed)',
|
|
20
|
+
'df-npc-bg': 'var(--color-df-npc-bg)',
|
|
21
|
+
'df-npc-border': 'var(--color-df-npc-border)',
|
|
22
|
+
'df-npc-header': 'var(--color-df-npc-header)',
|
|
23
|
+
'df-npc-text': 'var(--color-df-npc-text)',
|
|
24
|
+
'df-npc-selected': 'var(--color-df-npc-selected)',
|
|
25
|
+
'df-player-bg': 'var(--color-df-player-bg)',
|
|
26
|
+
'df-player-border': 'var(--color-df-player-border)',
|
|
27
|
+
'df-player-header': 'var(--color-df-player-header)',
|
|
28
|
+
'df-player-text': 'var(--color-df-player-text)',
|
|
29
|
+
'df-player-selected': 'var(--color-df-player-selected)',
|
|
30
|
+
'df-conditional-bg': 'var(--color-df-conditional-bg)',
|
|
31
|
+
'df-conditional-border': 'var(--color-df-conditional-border)',
|
|
32
|
+
'df-conditional-header': 'var(--color-df-conditional-header)',
|
|
33
|
+
'df-conditional-text': 'var(--color-df-conditional-text)',
|
|
34
|
+
'df-start': 'var(--color-df-start)',
|
|
35
|
+
'df-start-bg': 'var(--color-df-start-bg)',
|
|
36
|
+
'df-end': 'var(--color-df-end)',
|
|
37
|
+
'df-end-bg': 'var(--color-df-end-bg)',
|
|
38
|
+
'df-edge-default': 'var(--color-df-edge-default)',
|
|
39
|
+
'df-edge-default-hover': 'var(--color-df-edge-default-hover)',
|
|
40
|
+
'df-edge-choice-1': 'var(--color-df-edge-choice-1)',
|
|
41
|
+
'df-edge-choice-2': 'var(--color-df-edge-choice-2)',
|
|
42
|
+
'df-edge-choice-3': 'var(--color-df-edge-choice-3)',
|
|
43
|
+
'df-edge-choice-4': 'var(--color-df-edge-choice-4)',
|
|
44
|
+
'df-edge-choice-5': 'var(--color-df-edge-choice-5)',
|
|
45
|
+
'df-edge-loop': 'var(--color-df-edge-loop)',
|
|
46
|
+
'df-edge-dimmed': 'var(--color-df-edge-dimmed)',
|
|
47
|
+
'df-error': 'var(--color-df-error)',
|
|
48
|
+
'df-error-bg': 'var(--color-df-error-bg)',
|
|
49
|
+
'df-warning': 'var(--color-df-warning)',
|
|
50
|
+
'df-warning-bg': 'var(--color-df-warning-bg)',
|
|
51
|
+
'df-success': 'var(--color-df-success)',
|
|
52
|
+
'df-success-bg': 'var(--color-df-success-bg)',
|
|
53
|
+
'df-info': 'var(--color-df-info)',
|
|
54
|
+
'df-info-bg': 'var(--color-df-info-bg)',
|
|
55
|
+
'df-text-primary': 'var(--color-df-text-primary)',
|
|
56
|
+
'df-text-secondary': 'var(--color-df-text-secondary)',
|
|
57
|
+
'df-text-tertiary': 'var(--color-df-text-tertiary)',
|
|
58
|
+
'df-text-muted': 'var(--color-df-text-muted)',
|
|
59
|
+
'df-control-bg': 'var(--color-df-control-bg)',
|
|
60
|
+
'df-control-border': 'var(--color-df-control-border)',
|
|
61
|
+
'df-control-hover': 'var(--color-df-control-hover)',
|
|
62
|
+
'df-control-active': 'var(--color-df-control-active)',
|
|
63
|
+
'df-flag-dialogue': 'var(--color-df-flag-dialogue)',
|
|
64
|
+
'df-flag-dialogue-bg': 'var(--color-df-flag-dialogue-bg)',
|
|
65
|
+
'df-flag-quest': 'var(--color-df-flag-quest)',
|
|
66
|
+
'df-flag-quest-bg': 'var(--color-df-flag-quest-bg)',
|
|
67
|
+
'df-flag-achievement': 'var(--color-df-flag-achievement)',
|
|
68
|
+
'df-flag-achievement-bg': 'var(--color-df-flag-achievement-bg)',
|
|
69
|
+
'df-flag-item': 'var(--color-df-flag-item)',
|
|
70
|
+
'df-flag-item-bg': 'var(--color-df-flag-item-bg)',
|
|
71
|
+
'df-flag-stat': 'var(--color-df-flag-stat)',
|
|
72
|
+
'df-flag-stat-bg': 'var(--color-df-flag-stat-bg)',
|
|
73
|
+
'df-flag-title': 'var(--color-df-flag-title)',
|
|
74
|
+
'df-flag-title-bg': 'var(--color-df-flag-title-bg)',
|
|
75
|
+
'df-flag-global': 'var(--color-df-flag-global)',
|
|
76
|
+
'df-flag-global-bg': 'var(--color-df-flag-global-bg)',
|
|
77
|
+
'df-canvas-bg': 'var(--color-df-canvas-bg)',
|
|
78
|
+
'df-canvas-grid': 'var(--color-df-canvas-grid)',
|
|
79
|
+
'df-sidebar-bg': 'var(--color-df-sidebar-bg)',
|
|
80
|
+
'df-sidebar-border': 'var(--color-df-sidebar-border)',
|
|
81
|
+
'df-editor-bg': 'var(--color-df-editor-bg)',
|
|
82
|
+
'df-editor-border': 'var(--color-df-editor-border)',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
plugins: [],
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export default config;
|
|
90
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": [
|
|
5
|
+
"dom",
|
|
6
|
+
"dom.iterable",
|
|
7
|
+
"esnext"
|
|
8
|
+
],
|
|
9
|
+
"allowJs": true,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"strict": true,
|
|
12
|
+
"noEmit": true,
|
|
13
|
+
"esModuleInterop": true,
|
|
14
|
+
"module": "esnext",
|
|
15
|
+
"moduleResolution": "bundler",
|
|
16
|
+
"resolveJsonModule": true,
|
|
17
|
+
"isolatedModules": true,
|
|
18
|
+
"jsx": "react-jsx",
|
|
19
|
+
"incremental": true,
|
|
20
|
+
"plugins": [
|
|
21
|
+
{
|
|
22
|
+
"name": "next"
|
|
23
|
+
}
|
|
24
|
+
],
|
|
25
|
+
"paths": {
|
|
26
|
+
"@magicborn/*": [
|
|
27
|
+
"../../packages/*",
|
|
28
|
+
"../../packages-shared/*"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"include": [
|
|
33
|
+
"next-env.d.ts",
|
|
34
|
+
"**/*.ts",
|
|
35
|
+
"**/*.tsx",
|
|
36
|
+
".next/types/**/*.ts",
|
|
37
|
+
".next/dev/types/**/*.ts"
|
|
38
|
+
],
|
|
39
|
+
"exclude": [
|
|
40
|
+
"node_modules"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ChoiceEdgeV2 = ChoiceEdgeV2;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const reactflow_1 = require("reactflow");
|
|
39
|
+
function ChoiceEdgeV2({ id, sourceX, sourceY, sourcePosition, targetX, targetY, targetPosition, data, selected, }) {
|
|
40
|
+
const [hovered, setHovered] = (0, react_1.useState)(false);
|
|
41
|
+
const isBackEdge = data?.isBackEdge ?? false;
|
|
42
|
+
// Use smooth step path for angular look (like the horizontal example)
|
|
43
|
+
// For back edges, use bezier for a more curved appearance
|
|
44
|
+
const [edgePath, labelX, labelY] = isBackEdge
|
|
45
|
+
? (0, reactflow_1.getBezierPath)({
|
|
46
|
+
sourceX,
|
|
47
|
+
sourceY,
|
|
48
|
+
sourcePosition,
|
|
49
|
+
targetX,
|
|
50
|
+
targetY,
|
|
51
|
+
targetPosition,
|
|
52
|
+
curvature: 0.5,
|
|
53
|
+
})
|
|
54
|
+
: (0, reactflow_1.getSmoothStepPath)({
|
|
55
|
+
sourceX,
|
|
56
|
+
sourceY,
|
|
57
|
+
sourcePosition: sourcePosition || reactflow_1.Position.Bottom,
|
|
58
|
+
targetX,
|
|
59
|
+
targetY,
|
|
60
|
+
targetPosition: targetPosition || reactflow_1.Position.Top,
|
|
61
|
+
borderRadius: 8,
|
|
62
|
+
});
|
|
63
|
+
const choiceIndex = data?.choiceIndex ?? 0;
|
|
64
|
+
// Map choice index to CSS variable
|
|
65
|
+
const choiceColorVar = `var(--color-df-edge-choice-${Math.min(choiceIndex % 5, 4) + 1})`;
|
|
66
|
+
// Use loop color for back edges, otherwise use choice color
|
|
67
|
+
const colorVar = isBackEdge ? 'var(--color-df-edge-loop)' : choiceColorVar;
|
|
68
|
+
const isSelected = selected || hovered;
|
|
69
|
+
const isDimmed = data?.isDimmed ?? false;
|
|
70
|
+
// Make edge thicker and more opaque when hovered or selected
|
|
71
|
+
// Dim edges not in path when highlighting is on
|
|
72
|
+
const strokeWidth = isSelected ? 4 : 2;
|
|
73
|
+
const opacity = isDimmed ? 0.15 : (isSelected ? 1 : 0.7);
|
|
74
|
+
// Use dimmed color when dimmed
|
|
75
|
+
const strokeColor = isDimmed ? 'var(--color-df-edge-dimmed)' : colorVar;
|
|
76
|
+
// Add glow effect when hovered (only if not dimmed)
|
|
77
|
+
const filter = hovered && !isDimmed ? `drop-shadow(0 0 4px ${colorVar})` : undefined;
|
|
78
|
+
// For pulse animation, we'll use a slightly brighter version
|
|
79
|
+
// Since we can't easily brighten CSS variables, we'll use the same color with higher opacity
|
|
80
|
+
const pulseColor = colorVar;
|
|
81
|
+
const shouldAnimate = data?.isInPathToSelected ?? false;
|
|
82
|
+
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
83
|
+
react_1.default.createElement("path", { d: edgePath, fill: "none", stroke: "transparent", strokeWidth: 20, style: { cursor: 'pointer', pointerEvents: 'all' }, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false) }),
|
|
84
|
+
react_1.default.createElement(reactflow_1.BaseEdge, { id: id, path: edgePath, style: {
|
|
85
|
+
stroke: strokeColor,
|
|
86
|
+
strokeWidth,
|
|
87
|
+
opacity,
|
|
88
|
+
cursor: 'pointer',
|
|
89
|
+
transition: 'all 0.2s ease',
|
|
90
|
+
pointerEvents: 'none',
|
|
91
|
+
filter,
|
|
92
|
+
// Dashed line for back edges
|
|
93
|
+
strokeDasharray: isBackEdge ? '8 4' : undefined,
|
|
94
|
+
}, markerEnd: isDimmed ? undefined : `url(#react-flow__arrowclosed-choice-${choiceIndex})` }),
|
|
95
|
+
isBackEdge && (react_1.default.createElement("g", { transform: `translate(${labelX - 10}, ${labelY - 10})` },
|
|
96
|
+
react_1.default.createElement("circle", { cx: "10", cy: "10", r: "12", fill: "var(--color-df-base)", stroke: strokeColor, strokeWidth: "2" }),
|
|
97
|
+
react_1.default.createElement("text", { x: "10", y: "14", textAnchor: "middle", fontSize: "12", fill: strokeColor }, "\u21BA"))),
|
|
98
|
+
shouldAnimate && (react_1.default.createElement("circle", { r: "6", fill: pulseColor, opacity: 0.9 },
|
|
99
|
+
react_1.default.createElement("animateMotion", { dur: "2s", repeatCount: "indefinite", path: edgePath }))),
|
|
100
|
+
react_1.default.createElement("defs", null,
|
|
101
|
+
react_1.default.createElement("marker", { id: `react-flow__arrowclosed-choice-${choiceIndex}`, markerWidth: "12.5", markerHeight: "12.5", viewBox: "-10 -10 20 20", markerUnits: "strokeWidth", orient: "auto", refX: "0", refY: "0" },
|
|
102
|
+
react_1.default.createElement("polyline", { stroke: colorVar, strokeLinecap: "round", strokeLinejoin: "round", fill: colorVar, points: "-5,-4 0,0 -5,4 -5,-4" })))));
|
|
103
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CodeBlock = CodeBlock;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const react_syntax_highlighter_1 = require("react-syntax-highlighter");
|
|
9
|
+
const prism_1 = require("react-syntax-highlighter/dist/esm/styles/prism");
|
|
10
|
+
function CodeBlock({ code, language = 'typescript', className = '' }) {
|
|
11
|
+
return (react_1.default.createElement("div", { className: `bg-[#12121a] rounded border border-[#2a2a3e] overflow-hidden ${className}` },
|
|
12
|
+
react_1.default.createElement(react_syntax_highlighter_1.Prism, { language: language, style: prism_1.vscDarkPlus, customStyle: {
|
|
13
|
+
margin: 0,
|
|
14
|
+
padding: '1rem',
|
|
15
|
+
background: '#12121a',
|
|
16
|
+
fontSize: '0.75rem',
|
|
17
|
+
lineHeight: '1.5',
|
|
18
|
+
borderRadius: 0,
|
|
19
|
+
}, codeTagProps: {
|
|
20
|
+
style: {
|
|
21
|
+
fontFamily: 'ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace',
|
|
22
|
+
}
|
|
23
|
+
}, PreTag: "div" }, code)));
|
|
24
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { FlagSchema } from '../types/flags';
|
|
3
|
+
interface ConditionAutocompleteProps {
|
|
4
|
+
value: string;
|
|
5
|
+
onChange: (value: string) => void;
|
|
6
|
+
onBlur?: () => void;
|
|
7
|
+
placeholder?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: React.CSSProperties;
|
|
10
|
+
flagSchema?: FlagSchema;
|
|
11
|
+
textarea?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function ConditionAutocomplete({ value, onChange, onBlur, placeholder, className, style, flagSchema, textarea }: ConditionAutocompleteProps): React.JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.ConditionAutocomplete = ConditionAutocomplete;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const lucide_react_1 = require("lucide-react");
|
|
39
|
+
function getFlagIcon(flagType) {
|
|
40
|
+
switch (flagType) {
|
|
41
|
+
case 'quest':
|
|
42
|
+
return lucide_react_1.BookOpen;
|
|
43
|
+
case 'achievement':
|
|
44
|
+
return lucide_react_1.Trophy;
|
|
45
|
+
case 'item':
|
|
46
|
+
return lucide_react_1.Package;
|
|
47
|
+
case 'stat':
|
|
48
|
+
return lucide_react_1.TrendingUp;
|
|
49
|
+
case 'title':
|
|
50
|
+
return lucide_react_1.Crown;
|
|
51
|
+
case 'global':
|
|
52
|
+
return lucide_react_1.Globe;
|
|
53
|
+
case 'dialogue':
|
|
54
|
+
default:
|
|
55
|
+
return lucide_react_1.MessageSquare;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function getFlagColorClasses(flagType) {
|
|
59
|
+
switch (flagType) {
|
|
60
|
+
case 'quest':
|
|
61
|
+
return 'bg-blue-500/20 text-blue-400 border-blue-500/30';
|
|
62
|
+
case 'achievement':
|
|
63
|
+
return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30';
|
|
64
|
+
case 'item':
|
|
65
|
+
return 'bg-green-500/20 text-green-400 border-green-500/30';
|
|
66
|
+
case 'stat':
|
|
67
|
+
return 'bg-purple-500/20 text-purple-400 border-purple-500/30';
|
|
68
|
+
case 'title':
|
|
69
|
+
return 'bg-pink-500/20 text-pink-400 border-pink-500/30';
|
|
70
|
+
case 'global':
|
|
71
|
+
return 'bg-orange-500/20 text-orange-400 border-orange-500/30';
|
|
72
|
+
case 'dialogue':
|
|
73
|
+
default:
|
|
74
|
+
return 'bg-gray-500/20 text-gray-400 border-gray-500/30';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function ConditionAutocomplete({ value, onChange, onBlur, placeholder, className = '', style, flagSchema, textarea = false }) {
|
|
78
|
+
const [showSuggestions, setShowSuggestions] = (0, react_1.useState)(false);
|
|
79
|
+
const [selectedIndex, setSelectedIndex] = (0, react_1.useState)(0);
|
|
80
|
+
const [cursorPosition, setCursorPosition] = (0, react_1.useState)(0);
|
|
81
|
+
const [debouncedSearchTerm, setDebouncedSearchTerm] = (0, react_1.useState)('');
|
|
82
|
+
const containerRef = (0, react_1.useRef)(null);
|
|
83
|
+
const inputRef = (0, react_1.useRef)(null);
|
|
84
|
+
const debounceTimerRef = (0, react_1.useRef)(null);
|
|
85
|
+
// Extract the current word being typed (for autocomplete matching)
|
|
86
|
+
const currentWord = (0, react_1.useMemo)(() => {
|
|
87
|
+
const textBeforeCursor = value.substring(0, cursorPosition);
|
|
88
|
+
const match = textBeforeCursor.match(/(\$?\w*)$/);
|
|
89
|
+
return match ? match[1] : '';
|
|
90
|
+
}, [value, cursorPosition]);
|
|
91
|
+
// Debounce search term for better performance
|
|
92
|
+
(0, react_1.useEffect)(() => {
|
|
93
|
+
if (debounceTimerRef.current) {
|
|
94
|
+
clearTimeout(debounceTimerRef.current);
|
|
95
|
+
}
|
|
96
|
+
debounceTimerRef.current = setTimeout(() => {
|
|
97
|
+
setDebouncedSearchTerm(currentWord);
|
|
98
|
+
}, 300); // 300ms debounce for smoother experience
|
|
99
|
+
return () => {
|
|
100
|
+
if (debounceTimerRef.current) {
|
|
101
|
+
clearTimeout(debounceTimerRef.current);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}, [currentWord]);
|
|
105
|
+
// Generate suggestions based on current input (using debounced search term)
|
|
106
|
+
const suggestions = (0, react_1.useMemo)(() => {
|
|
107
|
+
const result = [];
|
|
108
|
+
const word = debouncedSearchTerm.toLowerCase();
|
|
109
|
+
const isTypingVariable = word.startsWith('$') || word.length > 0;
|
|
110
|
+
// If typing a variable (starts with $ or has text), show flags
|
|
111
|
+
if (flagSchema && (isTypingVariable || word === '')) {
|
|
112
|
+
const searchTerm = word.startsWith('$') ? word.substring(1) : word;
|
|
113
|
+
flagSchema.flags.forEach(flag => {
|
|
114
|
+
const flagId = flag.id.toLowerCase();
|
|
115
|
+
const flagName = flag.name.toLowerCase();
|
|
116
|
+
// Match if search term is empty (showing $ or empty field) or matches flag id/name
|
|
117
|
+
if (!searchTerm || flagId.includes(searchTerm) || flagName.includes(searchTerm)) {
|
|
118
|
+
result.push({
|
|
119
|
+
type: 'flag',
|
|
120
|
+
label: `$${flag.id}`, // Show with dollar sign
|
|
121
|
+
insert: `$${flag.id}`,
|
|
122
|
+
description: flag.name,
|
|
123
|
+
flagType: flag.type
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Show operators and keywords when user has typed $ or is actively typing
|
|
129
|
+
if (word === '$' || (word.startsWith('$') && word.length > 1)) {
|
|
130
|
+
// Operators - only show when user has typed $ and is looking for what comes next
|
|
131
|
+
result.push({ type: 'operator', label: '==', insert: ' == ', description: 'Equals' }, { type: 'operator', label: '!=', insert: ' != ', description: 'Not equals' }, { type: 'operator', label: '>=', insert: ' >= ', description: 'Greater than or equal' }, { type: 'operator', label: '<=', insert: ' <= ', description: 'Less than or equal' }, { type: 'operator', label: '>', insert: ' > ', description: 'Greater than' }, { type: 'operator', label: '<', insert: ' < ', description: 'Less than' });
|
|
132
|
+
// Keywords
|
|
133
|
+
result.push({ type: 'keyword', label: 'and', insert: ' and ', description: 'Logical AND' }, { type: 'keyword', label: 'not', insert: 'not ', description: 'Logical NOT' });
|
|
134
|
+
}
|
|
135
|
+
// Limit results
|
|
136
|
+
return result.slice(0, 20);
|
|
137
|
+
}, [debouncedSearchTerm, flagSchema]);
|
|
138
|
+
// Handle input change
|
|
139
|
+
const handleChange = (e) => {
|
|
140
|
+
const newValue = e.target.value;
|
|
141
|
+
const newCursorPos = e.target.selectionStart || 0;
|
|
142
|
+
// Mark that user has actively typed
|
|
143
|
+
setHasActivelyTyped(true);
|
|
144
|
+
onChange(newValue);
|
|
145
|
+
setCursorPosition(newCursorPos);
|
|
146
|
+
};
|
|
147
|
+
// Track if user has actively typed in this session (not just focused on existing content)
|
|
148
|
+
const [hasActivelyTyped, setHasActivelyTyped] = (0, react_1.useState)(false);
|
|
149
|
+
// Update suggestions visibility when value or cursor changes
|
|
150
|
+
// Show suggestions when typing $ or when actively typing
|
|
151
|
+
(0, react_1.useEffect)(() => {
|
|
152
|
+
const textBeforeCursor = value.substring(0, cursorPosition);
|
|
153
|
+
const match = textBeforeCursor.match(/(\$?\w*)$/);
|
|
154
|
+
const word = match ? match[1] : '';
|
|
155
|
+
// Show suggestions when:
|
|
156
|
+
// 1. User is typing a variable (starts with $) OR
|
|
157
|
+
// 2. User has actively typed something and we have suggestions OR
|
|
158
|
+
// 3. Field is empty and user just focused (allow showing on empty field when typing $)
|
|
159
|
+
const isTypingVariable = word.startsWith('$') || word === '$';
|
|
160
|
+
const isEmpty = value.trim() === '';
|
|
161
|
+
const shouldShow = (hasActivelyTyped || isTypingVariable || isEmpty) && suggestions.length > 0;
|
|
162
|
+
setShowSuggestions(shouldShow);
|
|
163
|
+
}, [value, cursorPosition, suggestions.length, hasActivelyTyped]);
|
|
164
|
+
// Handle selection change (for cursor tracking)
|
|
165
|
+
const handleSelect = (e) => {
|
|
166
|
+
const target = e.currentTarget;
|
|
167
|
+
setCursorPosition(target.selectionStart || 0);
|
|
168
|
+
};
|
|
169
|
+
// Handle keydown
|
|
170
|
+
const handleKeyDown = (e) => {
|
|
171
|
+
if (!showSuggestions || suggestions.length === 0) {
|
|
172
|
+
if (e.key === 'Escape' && onBlur) {
|
|
173
|
+
onBlur();
|
|
174
|
+
}
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
if (e.key === 'ArrowDown') {
|
|
178
|
+
e.preventDefault();
|
|
179
|
+
setSelectedIndex(prev => (prev + 1) % suggestions.length);
|
|
180
|
+
}
|
|
181
|
+
else if (e.key === 'ArrowUp') {
|
|
182
|
+
e.preventDefault();
|
|
183
|
+
setSelectedIndex(prev => (prev - 1 + suggestions.length) % suggestions.length);
|
|
184
|
+
}
|
|
185
|
+
else if (e.key === 'Enter' || e.key === 'Tab') {
|
|
186
|
+
e.preventDefault();
|
|
187
|
+
insertSuggestion(suggestions[selectedIndex]);
|
|
188
|
+
}
|
|
189
|
+
else if (e.key === 'Escape') {
|
|
190
|
+
setShowSuggestions(false);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
// Insert suggestion at cursor position
|
|
194
|
+
const insertSuggestion = (0, react_1.useCallback)((suggestion) => {
|
|
195
|
+
const textBeforeCursor = value.substring(0, cursorPosition);
|
|
196
|
+
const textAfterCursor = value.substring(cursorPosition);
|
|
197
|
+
// Find the start of the current word
|
|
198
|
+
const wordMatch = textBeforeCursor.match(/(\$?\w*)$/);
|
|
199
|
+
const wordStart = wordMatch ? cursorPosition - wordMatch[1].length : cursorPosition;
|
|
200
|
+
// Replace the current word with the suggestion
|
|
201
|
+
const newText = value.substring(0, wordStart) +
|
|
202
|
+
suggestion.insert +
|
|
203
|
+
textAfterCursor;
|
|
204
|
+
onChange(newText);
|
|
205
|
+
// Set cursor position after inserted text
|
|
206
|
+
const newCursorPos = wordStart + suggestion.insert.length;
|
|
207
|
+
setTimeout(() => {
|
|
208
|
+
if (inputRef.current) {
|
|
209
|
+
inputRef.current.setSelectionRange(newCursorPos, newCursorPos);
|
|
210
|
+
inputRef.current.focus();
|
|
211
|
+
}
|
|
212
|
+
}, 0);
|
|
213
|
+
setShowSuggestions(false);
|
|
214
|
+
setSelectedIndex(0);
|
|
215
|
+
}, [value, cursorPosition, onChange]);
|
|
216
|
+
// Handle drag start for draggable suggestions
|
|
217
|
+
const handleDragStart = (0, react_1.useCallback)((e, suggestion) => {
|
|
218
|
+
e.dataTransfer.setData('text/plain', suggestion.insert);
|
|
219
|
+
e.dataTransfer.effectAllowed = 'copy';
|
|
220
|
+
}, []);
|
|
221
|
+
// Handle click outside
|
|
222
|
+
(0, react_1.useEffect)(() => {
|
|
223
|
+
const handleClickOutside = (event) => {
|
|
224
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
225
|
+
setShowSuggestions(false);
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
229
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
230
|
+
}, []);
|
|
231
|
+
const InputComponent = textarea ? 'textarea' : 'input';
|
|
232
|
+
const inputProps = {
|
|
233
|
+
ref: inputRef,
|
|
234
|
+
type: textarea ? undefined : 'text',
|
|
235
|
+
value,
|
|
236
|
+
onChange: handleChange,
|
|
237
|
+
onSelect: handleSelect,
|
|
238
|
+
onKeyDown: handleKeyDown,
|
|
239
|
+
onFocus: () => {
|
|
240
|
+
if (inputRef.current) {
|
|
241
|
+
setCursorPosition(inputRef.current.selectionStart || 0);
|
|
242
|
+
}
|
|
243
|
+
// Don't reset hasActivelyTyped on focus - allow showing suggestions if field is empty or has $
|
|
244
|
+
// This allows suggestions to show when user focuses and types $
|
|
245
|
+
},
|
|
246
|
+
onBlur: () => {
|
|
247
|
+
// Delay to allow click on suggestion
|
|
248
|
+
setTimeout(() => {
|
|
249
|
+
if (onBlur)
|
|
250
|
+
onBlur();
|
|
251
|
+
}, 200);
|
|
252
|
+
},
|
|
253
|
+
placeholder,
|
|
254
|
+
className,
|
|
255
|
+
};
|
|
256
|
+
if (style) {
|
|
257
|
+
inputProps.style = style;
|
|
258
|
+
}
|
|
259
|
+
return (react_1.default.createElement("div", { className: "relative", ref: containerRef },
|
|
260
|
+
react_1.default.createElement(InputComponent, { ...inputProps }),
|
|
261
|
+
showSuggestions && suggestions.length > 0 && (react_1.default.createElement("div", { className: "absolute z-50 mt-1 w-full bg-[#1a1a2e] border border-[#2a2a3e] rounded-lg shadow-xl max-h-64 overflow-y-auto" }, suggestions.map((suggestion, idx) => {
|
|
262
|
+
const isSelected = idx === selectedIndex;
|
|
263
|
+
const IconComponent = suggestion.type === 'flag' && suggestion.flagType
|
|
264
|
+
? getFlagIcon(suggestion.flagType)
|
|
265
|
+
: null;
|
|
266
|
+
// Get color classes for operators and keywords
|
|
267
|
+
const operatorColorClasses = 'bg-purple-500/20 text-purple-400 border-purple-500/30';
|
|
268
|
+
const keywordColorClasses = 'bg-blue-500/20 text-blue-400 border-blue-500/30';
|
|
269
|
+
return (react_1.default.createElement("button", { key: `${suggestion.type}-${suggestion.label}-${idx}`, type: "button", onClick: () => insertSuggestion(suggestion), onMouseEnter: () => setSelectedIndex(idx), draggable: true, onDragStart: (e) => handleDragStart(e, suggestion), className: `w-full text-left px-3 py-2 text-sm flex items-center gap-2 transition-colors ${isSelected
|
|
270
|
+
? 'bg-[#2a2a3e] text-white'
|
|
271
|
+
: 'text-gray-300 hover:bg-[#252538]'}`, style: { minHeight: 'auto', height: 'auto' } },
|
|
272
|
+
suggestion.type === 'flag' && suggestion.flagType && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
273
|
+
IconComponent && (react_1.default.createElement(IconComponent, { size: 14, className: `flex-shrink-0 ${getFlagColorClasses(suggestion.flagType).split(' ')[1]}` })),
|
|
274
|
+
react_1.default.createElement("span", { className: `text-xs px-2 py-1 rounded border flex-shrink-0 font-medium whitespace-nowrap ${getFlagColorClasses(suggestion.flagType)}` }, suggestion.label),
|
|
275
|
+
suggestion.description && (react_1.default.createElement("span", { className: "text-[10px] text-gray-500 truncate flex-1 min-w-0 ml-1" }, suggestion.description)),
|
|
276
|
+
react_1.default.createElement("span", { className: `text-[10px] px-1.5 py-0.5 rounded border flex-shrink-0 whitespace-nowrap ${getFlagColorClasses(suggestion.flagType)}` }, suggestion.flagType === 'dialogue' ? 'temp' : suggestion.flagType))),
|
|
277
|
+
suggestion.type === 'operator' && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
278
|
+
react_1.default.createElement("span", { className: `text-xs px-2 py-1 rounded border flex-shrink-0 font-mono font-medium whitespace-nowrap ${operatorColorClasses}` }, suggestion.label),
|
|
279
|
+
suggestion.description && (react_1.default.createElement("span", { className: "text-[10px] text-gray-500 truncate flex-1 min-w-0 ml-1" }, suggestion.description)))),
|
|
280
|
+
suggestion.type === 'keyword' && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
281
|
+
react_1.default.createElement("span", { className: `text-xs px-2 py-1 rounded border flex-shrink-0 font-mono font-medium whitespace-nowrap ${keywordColorClasses}` }, suggestion.label),
|
|
282
|
+
suggestion.description && (react_1.default.createElement("span", { className: "text-[10px] text-gray-500 truncate flex-1 min-w-0 ml-1" }, suggestion.description))))));
|
|
283
|
+
})))));
|
|
284
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { NodeProps } from 'reactflow';
|
|
3
|
+
import { DialogueNode } from '../types';
|
|
4
|
+
import { FlagSchema } from '../types/flags';
|
|
5
|
+
import { LayoutDirection } from '../utils/layout';
|
|
6
|
+
interface ConditionalNodeData {
|
|
7
|
+
node: DialogueNode;
|
|
8
|
+
flagSchema?: FlagSchema;
|
|
9
|
+
isDimmed?: boolean;
|
|
10
|
+
isInPath?: boolean;
|
|
11
|
+
layoutDirection?: LayoutDirection;
|
|
12
|
+
isStartNode?: boolean;
|
|
13
|
+
isEndNode?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export declare function ConditionalNodeV2({ data, selected }: NodeProps<ConditionalNodeData>): React.JSX.Element;
|
|
16
|
+
export {};
|