@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,235 @@
|
|
|
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.FlagSelector = FlagSelector;
|
|
37
|
+
const react_1 = __importStar(require("react"));
|
|
38
|
+
const lucide_react_1 = require("lucide-react");
|
|
39
|
+
const react_tooltip_1 = require("react-tooltip");
|
|
40
|
+
require("react-tooltip/dist/react-tooltip.css");
|
|
41
|
+
function getFlagColorClasses(flagType) {
|
|
42
|
+
switch (flagType) {
|
|
43
|
+
case 'quest':
|
|
44
|
+
return 'bg-blue-500/20 text-blue-400 border-blue-500/30';
|
|
45
|
+
case 'achievement':
|
|
46
|
+
return 'bg-yellow-500/20 text-yellow-400 border-yellow-500/30';
|
|
47
|
+
case 'item':
|
|
48
|
+
return 'bg-green-500/20 text-green-400 border-green-500/30';
|
|
49
|
+
case 'stat':
|
|
50
|
+
return 'bg-purple-500/20 text-purple-400 border-purple-500/30';
|
|
51
|
+
case 'title':
|
|
52
|
+
return 'bg-pink-500/20 text-pink-400 border-pink-500/30';
|
|
53
|
+
case 'global':
|
|
54
|
+
return 'bg-orange-500/20 text-orange-400 border-orange-500/30';
|
|
55
|
+
case 'dialogue':
|
|
56
|
+
default:
|
|
57
|
+
return 'bg-gray-500/20 text-gray-400 border-gray-500/30';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function getFlagIcon(flagType) {
|
|
61
|
+
switch (flagType) {
|
|
62
|
+
case 'quest':
|
|
63
|
+
return lucide_react_1.BookOpen;
|
|
64
|
+
case 'achievement':
|
|
65
|
+
return lucide_react_1.Trophy;
|
|
66
|
+
case 'item':
|
|
67
|
+
return lucide_react_1.Package;
|
|
68
|
+
case 'stat':
|
|
69
|
+
return lucide_react_1.TrendingUp;
|
|
70
|
+
case 'title':
|
|
71
|
+
return lucide_react_1.Crown;
|
|
72
|
+
case 'global':
|
|
73
|
+
return lucide_react_1.Globe;
|
|
74
|
+
case 'dialogue':
|
|
75
|
+
default:
|
|
76
|
+
return lucide_react_1.MessageSquare;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function getFlagTypeDescription(flagType) {
|
|
80
|
+
switch (flagType) {
|
|
81
|
+
case 'quest':
|
|
82
|
+
return 'Quest flags track mission and storyline progression. They persist across game sessions and control quest availability and completion states.';
|
|
83
|
+
case 'achievement':
|
|
84
|
+
return 'Achievement flags mark player accomplishments and milestones. They are permanent and unlock rewards or recognition.';
|
|
85
|
+
case 'item':
|
|
86
|
+
return 'Item flags represent inventory items, equipment, or collectibles. They track what the player has obtained.';
|
|
87
|
+
case 'stat':
|
|
88
|
+
return 'Stat flags store numeric values like reputation, health, or skill levels. They can be incremented, decremented, or compared in conditions.';
|
|
89
|
+
case 'title':
|
|
90
|
+
return 'Title flags represent player titles or ranks. They are typically set based on achievements or story progression.';
|
|
91
|
+
case 'global':
|
|
92
|
+
return 'Global flags are game-wide state variables that affect multiple systems. They persist across all game sessions.';
|
|
93
|
+
case 'dialogue':
|
|
94
|
+
default:
|
|
95
|
+
return 'Dialogue flags are temporary, conversation-scoped variables. They reset between dialogue sessions and are used for local conversation state.';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function FlagSelector({ value, onChange, flagSchema, placeholder = "Add flags..." }) {
|
|
99
|
+
const [inputValue, setInputValue] = (0, react_1.useState)('');
|
|
100
|
+
const [showDropdown, setShowDropdown] = (0, react_1.useState)(false);
|
|
101
|
+
const [focusedIndex, setFocusedIndex] = (0, react_1.useState)(null);
|
|
102
|
+
const inputRef = (0, react_1.useRef)(null);
|
|
103
|
+
const containerRef = (0, react_1.useRef)(null);
|
|
104
|
+
// Get flag definitions for selected flags
|
|
105
|
+
const selectedFlags = value.map(flagId => {
|
|
106
|
+
const flag = flagSchema?.flags.find(f => f.id === flagId);
|
|
107
|
+
return flag ? { ...flag, id: flagId } : { id: flagId, type: 'dialogue', name: flagId };
|
|
108
|
+
});
|
|
109
|
+
// Filter available flags (not already selected)
|
|
110
|
+
const availableFlags = flagSchema?.flags.filter(flag => !value.includes(flag.id)) || [];
|
|
111
|
+
// Filter flags based on input
|
|
112
|
+
const filteredFlags = inputValue.trim()
|
|
113
|
+
? availableFlags.filter(flag => flag.id.toLowerCase().includes(inputValue.toLowerCase()) ||
|
|
114
|
+
flag.name.toLowerCase().includes(inputValue.toLowerCase()))
|
|
115
|
+
: availableFlags;
|
|
116
|
+
const flagsByCategory = filteredFlags.reduce((acc, flag) => {
|
|
117
|
+
const cat = flag.category || 'other';
|
|
118
|
+
if (!acc[cat])
|
|
119
|
+
acc[cat] = [];
|
|
120
|
+
acc[cat].push(flag);
|
|
121
|
+
return acc;
|
|
122
|
+
}, {});
|
|
123
|
+
// Handle input change
|
|
124
|
+
const handleInputChange = (e) => {
|
|
125
|
+
const text = e.target.value;
|
|
126
|
+
setInputValue(text);
|
|
127
|
+
setShowDropdown(true);
|
|
128
|
+
};
|
|
129
|
+
// Handle adding a flag
|
|
130
|
+
const handleAddFlag = (flagId) => {
|
|
131
|
+
if (!value.includes(flagId)) {
|
|
132
|
+
onChange([...value, flagId]);
|
|
133
|
+
setInputValue('');
|
|
134
|
+
setShowDropdown(false);
|
|
135
|
+
inputRef.current?.focus();
|
|
136
|
+
}
|
|
137
|
+
};
|
|
138
|
+
// Handle removing a flag
|
|
139
|
+
const handleRemoveFlag = (flagId, e) => {
|
|
140
|
+
e?.stopPropagation();
|
|
141
|
+
onChange(value.filter(id => id !== flagId));
|
|
142
|
+
};
|
|
143
|
+
// Handle input keydown
|
|
144
|
+
const handleKeyDown = (e) => {
|
|
145
|
+
if (e.key === 'Enter' && inputValue.trim()) {
|
|
146
|
+
// Try to find exact match first
|
|
147
|
+
const exactMatch = availableFlags.find(flag => flag.id.toLowerCase() === inputValue.trim().toLowerCase());
|
|
148
|
+
if (exactMatch) {
|
|
149
|
+
handleAddFlag(exactMatch.id);
|
|
150
|
+
e.preventDefault();
|
|
151
|
+
}
|
|
152
|
+
else if (filteredFlags.length > 0) {
|
|
153
|
+
// Add first filtered flag
|
|
154
|
+
handleAddFlag(filteredFlags[0].id);
|
|
155
|
+
e.preventDefault();
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
else if (e.key === 'Backspace' && inputValue === '' && value.length > 0) {
|
|
159
|
+
// Remove last flag when backspace on empty input
|
|
160
|
+
handleRemoveFlag(value[value.length - 1]);
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
}
|
|
163
|
+
else if (e.key === 'Escape') {
|
|
164
|
+
setShowDropdown(false);
|
|
165
|
+
inputRef.current?.blur();
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
// Handle click outside
|
|
169
|
+
(0, react_1.useEffect)(() => {
|
|
170
|
+
const handleClickOutside = (event) => {
|
|
171
|
+
if (containerRef.current && !containerRef.current.contains(event.target)) {
|
|
172
|
+
setShowDropdown(false);
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
176
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
177
|
+
}, []);
|
|
178
|
+
return (react_1.default.createElement("div", { className: "relative", ref: containerRef },
|
|
179
|
+
react_1.default.createElement("div", { className: "w-full min-h-[30px] bg-[#12121a] border border-[#2a2a3e] rounded px-2 py-1.5 flex flex-wrap gap-1.5 items-center cursor-text", onClick: () => inputRef.current?.focus() },
|
|
180
|
+
selectedFlags.map((flag, idx) => {
|
|
181
|
+
const IconComponent = getFlagIcon(flag.type);
|
|
182
|
+
const tooltipId = `flag-tooltip-${flag.id}-${idx}`;
|
|
183
|
+
const description = getFlagTypeDescription(flag.type);
|
|
184
|
+
return (react_1.default.createElement("span", { key: flag.id, className: `inline-flex items-center gap-1 px-2 py-0.5 rounded border text-xs font-mono ${getFlagColorClasses(flag.type)}` },
|
|
185
|
+
react_1.default.createElement("div", { className: "relative group" },
|
|
186
|
+
react_1.default.createElement(IconComponent, { size: 12, className: "cursor-help", "data-tooltip-id": tooltipId }),
|
|
187
|
+
react_1.default.createElement(react_tooltip_1.Tooltip, { id: tooltipId, place: "top", border: "2px solid rgba(255, 255, 255, 0.2)", style: {
|
|
188
|
+
backgroundColor: '#000000',
|
|
189
|
+
color: '#ffffff',
|
|
190
|
+
fontFamily: 'monospace',
|
|
191
|
+
fontSize: '11px',
|
|
192
|
+
padding: '10px',
|
|
193
|
+
borderRadius: '6px',
|
|
194
|
+
boxShadow: '0 8px 20px rgba(0, 0, 0, 0.5)',
|
|
195
|
+
maxWidth: '280px',
|
|
196
|
+
zIndex: 10000,
|
|
197
|
+
} },
|
|
198
|
+
react_1.default.createElement("div", { style: { fontFamily: 'monospace', fontWeight: 600, color: '#ffffff', marginBottom: '6px', fontSize: '12px', textTransform: 'uppercase' } },
|
|
199
|
+
flag.type,
|
|
200
|
+
" Flag"),
|
|
201
|
+
react_1.default.createElement("div", { style: { fontFamily: 'monospace', fontSize: '11px', color: '#ffffff', lineHeight: '1.5' } }, description))),
|
|
202
|
+
react_1.default.createElement("span", null, flag.id),
|
|
203
|
+
react_1.default.createElement("button", { type: "button", onClick: (e) => handleRemoveFlag(flag.id, e), className: "hover:bg-black/20 rounded p-0.5 transition-colors", title: "Remove flag" },
|
|
204
|
+
react_1.default.createElement(lucide_react_1.X, { size: 12 }))));
|
|
205
|
+
}),
|
|
206
|
+
react_1.default.createElement("input", { ref: inputRef, type: "text", value: inputValue, onChange: handleInputChange, onKeyDown: handleKeyDown, onFocus: () => setShowDropdown(true), className: "flex-1 min-w-[120px] bg-transparent text-sm text-gray-200 outline-none font-mono placeholder:text-gray-500", placeholder: value.length === 0 ? placeholder : '' }),
|
|
207
|
+
react_1.default.createElement("div", { className: "flex-shrink-0" },
|
|
208
|
+
react_1.default.createElement(lucide_react_1.Info, { size: 14, className: "text-gray-500 hover:text-white transition-colors cursor-help", "data-tooltip-id": "flags-tooltip" }))),
|
|
209
|
+
react_1.default.createElement(react_tooltip_1.Tooltip, { id: "flags-tooltip", place: "left", border: "2px solid rgba(255, 255, 255, 0.2)", style: {
|
|
210
|
+
backgroundColor: '#000000',
|
|
211
|
+
color: '#ffffff',
|
|
212
|
+
fontFamily: 'monospace',
|
|
213
|
+
fontSize: '12px',
|
|
214
|
+
padding: '12px',
|
|
215
|
+
borderRadius: '8px',
|
|
216
|
+
boxShadow: '0 10px 25px rgba(0, 0, 0, 0.5)',
|
|
217
|
+
maxWidth: '300px',
|
|
218
|
+
zIndex: 9999,
|
|
219
|
+
} },
|
|
220
|
+
react_1.default.createElement("div", { style: { display: 'flex', alignItems: 'flex-start', gap: '8px' } },
|
|
221
|
+
react_1.default.createElement(lucide_react_1.Info, { size: 16, style: { color: '#ffffff', flexShrink: 0, marginTop: '2px' } }),
|
|
222
|
+
react_1.default.createElement("div", { style: { flex: 1 } },
|
|
223
|
+
react_1.default.createElement("div", { style: { fontFamily: 'monospace', fontWeight: 600, color: '#ffffff', marginBottom: '8px', fontSize: '14px' } }, "FLAGS"),
|
|
224
|
+
react_1.default.createElement("div", { style: { fontFamily: 'monospace', fontSize: '12px', color: '#ffffff', lineHeight: '1.6' } },
|
|
225
|
+
react_1.default.createElement("div", null, "Game state variables that persist across dialogue sessions."),
|
|
226
|
+
react_1.default.createElement("div", { style: { marginTop: '4px' } }, "Use to track quest progress, achievements, items, stats, and more."),
|
|
227
|
+
react_1.default.createElement("div", { style: { marginTop: '4px' } }, "Flags can be checked in conditions to control dialogue flow."))))),
|
|
228
|
+
showDropdown && flagSchema && filteredFlags.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" }, Object.entries(flagsByCategory).map(([category, flags]) => (react_1.default.createElement("div", { key: category },
|
|
229
|
+
react_1.default.createElement("div", { className: "px-3 py-1.5 text-[10px] text-gray-500 uppercase border-b border-[#2a2a3e] bg-[#12121a]" }, category),
|
|
230
|
+
flags.map(flag => (react_1.default.createElement("button", { key: flag.id, type: "button", onClick: () => handleAddFlag(flag.id), onMouseEnter: () => setFocusedIndex(flags.indexOf(flag)), className: `w-full text-left px-3 py-2 text-sm text-gray-300 hover:bg-[#2a2a3e] flex items-center justify-between ${focusedIndex === flags.indexOf(flag) ? 'bg-[#2a2a3e]' : ''}` },
|
|
231
|
+
react_1.default.createElement("div", null,
|
|
232
|
+
react_1.default.createElement("div", { className: "font-mono text-xs" }, flag.id),
|
|
233
|
+
flag.name !== flag.id && (react_1.default.createElement("div", { className: "text-xs text-gray-500" }, flag.name))),
|
|
234
|
+
react_1.default.createElement("span", { className: `text-[10px] px-1.5 py-0.5 rounded border ${getFlagColorClasses(flag.type)}` }, flag.type === 'dialogue' ? 'temp' : flag.type)))))))))));
|
|
235
|
+
}
|