@decido/shell 4.0.2 → 4.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CenterComposite-RPEGBKQU.mjs +1697 -0
- package/dist/DebugPanel-KEKDMHDN.mjs +14 -0
- package/dist/MorphShell-FKDBB7E5.mjs +14 -0
- package/dist/PlaygroundAppSidebar-ALYJJGAO.mjs +9 -0
- package/dist/PlaygroundChat-MI2KXMK6.mjs +15 -0
- package/dist/PlaygroundTerminal-5AV4BJAI.mjs +7 -0
- package/dist/PluginSandbox-WMNAUQOJ.mjs +188 -0
- package/dist/ReactFlowEditor-RTF2652X.mjs +3574 -0
- package/dist/ReactFlowEditor-ZW5MCN5Y.css +561 -0
- package/dist/TimelineEditor-N4HRMHTB.mjs +226 -0
- package/dist/WidgetSlotPanel-KJI4CHHD.mjs +11 -0
- package/dist/chunk-2YMI4N5I.mjs +2004 -0
- package/dist/chunk-3BZX7LF2.mjs +139 -0
- package/dist/chunk-3P4P3M54.mjs +136 -0
- package/dist/chunk-F3OTFHNO.mjs +40 -0
- package/dist/chunk-IMHORBTL.mjs +48 -0
- package/dist/chunk-JF5QSJYT.mjs +295 -0
- package/dist/chunk-LWMMFTJC.mjs +382 -0
- package/dist/chunk-MSVEFEXE.mjs +179 -0
- package/dist/chunk-OCHGY2MN.mjs +1662 -0
- package/dist/chunk-PMYAM764.mjs +813 -0
- package/dist/chunk-Q64KZXPK.mjs +43 -0
- package/dist/chunk-QHQW2HMU.mjs +155 -0
- package/dist/chunk-RWZ4BOIN.mjs +385 -0
- package/dist/chunk-UHT6FIYF.mjs +195 -0
- package/dist/chunk-UJCSKKID.mjs +30 -0
- package/dist/chunk-V3CYNPGL.mjs +8758 -0
- package/dist/chunk-VBPGEFNM.mjs +2381 -0
- package/dist/chunk-XMSU6UWD.mjs +158 -0
- package/dist/chunk-ZCCCBHE6.mjs +55 -0
- package/dist/index.css +561 -0
- package/dist/index.js +65130 -0
- package/dist/index.mjs +40248 -0
- package/dist/useIntentLens-LEQCAXCK.mjs +13 -0
- package/dist/useSuggestionsStore-4L2AIZ2D.mjs +7 -0
- package/dist/wasm-QFXGEYGP.mjs +81 -0
- package/package.json +17 -18
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import {
|
|
2
|
+
usePlaygroundStore
|
|
3
|
+
} from "./chunk-XMSU6UWD.mjs";
|
|
4
|
+
import "./chunk-UJCSKKID.mjs";
|
|
5
|
+
|
|
6
|
+
// src/components/studio/TimelineEditor.tsx
|
|
7
|
+
import { useTimelineStore } from "@decido/engine";
|
|
8
|
+
import { Plus, MonitorPlay } from "lucide-react";
|
|
9
|
+
import { AnimatePresence } from "motion/react";
|
|
10
|
+
|
|
11
|
+
// src/components/studio/TimelineKeyframeCard.tsx
|
|
12
|
+
import React from "react";
|
|
13
|
+
import { Trash2, Clock } from "lucide-react";
|
|
14
|
+
import { motion } from "motion/react";
|
|
15
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
|
+
var trackColors = {
|
|
17
|
+
dialogue: { clock: "text-purple-400/70", input: "focus:border-purple-500/50", text: "text-purple-300", label: "text-purple-400/70" },
|
|
18
|
+
ui: { clock: "text-cyan-400/70", input: "focus:border-cyan-500/50", text: "text-text-primary", label: "text-cyan-400/70" },
|
|
19
|
+
logic: { clock: "text-orange-400/70", input: "focus:border-orange-500/50", text: "text-text-primary", label: "text-orange-400/70" }
|
|
20
|
+
};
|
|
21
|
+
var TimelineKeyframeCard = React.memo(function TimelineKeyframeCard2({
|
|
22
|
+
kf,
|
|
23
|
+
track,
|
|
24
|
+
activeTimelineId,
|
|
25
|
+
updateKeyframe,
|
|
26
|
+
removeKeyframe
|
|
27
|
+
}) {
|
|
28
|
+
const colors = trackColors[track];
|
|
29
|
+
return /* @__PURE__ */ jsxs(
|
|
30
|
+
motion.div,
|
|
31
|
+
{
|
|
32
|
+
layout: true,
|
|
33
|
+
initial: { opacity: 0, scale: 0.9 },
|
|
34
|
+
animate: { opacity: 1, scale: 1 },
|
|
35
|
+
exit: { opacity: 0, scale: 0.9 },
|
|
36
|
+
transition: { duration: 0.2 },
|
|
37
|
+
style: { left: `${kf.t * 100}px`, width: "260px" },
|
|
38
|
+
className: "absolute top-2 bottom-2 bg-surface-secondary border border-border-default rounded-xl p-3 flex flex-col gap-2 group hover:border-border-subtle0 shadow-[0_8px_30px_rgb(0,0,0,0.5)] hover:shadow-[0_8px_30px_rgb(0,0,0,0.8)] transition-all z-10",
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border-subtle pb-1.5", children: [
|
|
41
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 bg-surface-overlay px-1.5 py-0.5 rounded border border-border-default transition-colors", children: [
|
|
42
|
+
/* @__PURE__ */ jsx(Clock, { size: 10, className: colors.clock }),
|
|
43
|
+
/* @__PURE__ */ jsx(
|
|
44
|
+
"input",
|
|
45
|
+
{
|
|
46
|
+
type: "number",
|
|
47
|
+
step: "0.1",
|
|
48
|
+
className: "bg-transparent w-10 text-xs text-text-primary font-mono focus:outline-hidden text-center",
|
|
49
|
+
value: kf.t,
|
|
50
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { t: parseFloat(e.target.value) || 0 })
|
|
51
|
+
}
|
|
52
|
+
)
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ jsx(
|
|
55
|
+
"button",
|
|
56
|
+
{
|
|
57
|
+
onClick: () => removeKeyframe(activeTimelineId, kf.id),
|
|
58
|
+
className: "p-1 text-text-muted hover:text-red-400 hover:bg-red-500/10 rounded transition-colors opacity-0 group-hover:opacity-100",
|
|
59
|
+
title: "Eliminar Keyframe",
|
|
60
|
+
children: /* @__PURE__ */ jsx(Trash2, { size: 12 })
|
|
61
|
+
}
|
|
62
|
+
)
|
|
63
|
+
] }),
|
|
64
|
+
track === "dialogue" && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 flex-1", children: [
|
|
65
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
66
|
+
/* @__PURE__ */ jsx("span", { className: `text-[9px] uppercase tracking-wider ${colors.label} w-10`, children: "Actor" }),
|
|
67
|
+
/* @__PURE__ */ jsx(
|
|
68
|
+
"input",
|
|
69
|
+
{
|
|
70
|
+
type: "text",
|
|
71
|
+
className: `flex-1 bg-surface-glass border border-border-subtle rounded px-2 py-1 text-xs ${colors.text} focus:outline-hidden ${colors.input}`,
|
|
72
|
+
value: kf.actorId || "",
|
|
73
|
+
placeholder: "system",
|
|
74
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { actorId: e.target.value })
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsx(
|
|
79
|
+
"textarea",
|
|
80
|
+
{
|
|
81
|
+
className: `w-full bg-surface-glass border border-border-subtle rounded px-2 py-1.5 text-xs text-text-primary focus:outline-hidden ${colors.input} resize-none flex-1 min-h-0`,
|
|
82
|
+
placeholder: "Texto a sintetizar...",
|
|
83
|
+
value: kf.speech || "",
|
|
84
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { speech: e.target.value })
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
] }),
|
|
88
|
+
track === "ui" && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 flex-1 justify-center", children: [
|
|
89
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
|
|
90
|
+
/* @__PURE__ */ jsx("span", { className: `text-[9px] uppercase tracking-wider ${colors.label}`, children: "App State" }),
|
|
91
|
+
/* @__PURE__ */ jsx(
|
|
92
|
+
"input",
|
|
93
|
+
{
|
|
94
|
+
type: "text",
|
|
95
|
+
className: `w-full bg-surface-glass border border-border-subtle rounded px-2 py-1.5 text-xs text-text-primary focus:outline-hidden ${colors.input}`,
|
|
96
|
+
value: kf.state || "",
|
|
97
|
+
placeholder: "idle",
|
|
98
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { state: e.target.value })
|
|
99
|
+
}
|
|
100
|
+
)
|
|
101
|
+
] }),
|
|
102
|
+
/* @__PURE__ */ jsxs("label", { className: "flex items-center gap-2 p-1.5 mt-1 rounded hover:bg-surface-glass cursor-pointer border border-transparent hover:border-border-subtle transition-colors", children: [
|
|
103
|
+
/* @__PURE__ */ jsx(
|
|
104
|
+
"input",
|
|
105
|
+
{
|
|
106
|
+
type: "checkbox",
|
|
107
|
+
checked: kf.canvas || false,
|
|
108
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { canvas: e.target.checked }),
|
|
109
|
+
className: "rounded border-border-strong bg-surface-glass text-cyan-500 w-3.5 h-3.5"
|
|
110
|
+
}
|
|
111
|
+
),
|
|
112
|
+
/* @__PURE__ */ jsx("span", { className: "text-[10px] uppercase tracking-wider text-cyan-300", children: "Mostrar Lienzo 3D" })
|
|
113
|
+
] })
|
|
114
|
+
] }),
|
|
115
|
+
track === "logic" && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1 flex-1 justify-center", children: [
|
|
116
|
+
/* @__PURE__ */ jsx("span", { className: `text-[9px] uppercase tracking-wider ${colors.label}`, children: "Intent / Action" }),
|
|
117
|
+
/* @__PURE__ */ jsx(
|
|
118
|
+
"input",
|
|
119
|
+
{
|
|
120
|
+
type: "text",
|
|
121
|
+
className: `w-full bg-surface-glass border border-border-subtle rounded px-2 py-1.5 text-xs text-text-primary focus:outline-hidden ${colors.input} font-mono mt-1`,
|
|
122
|
+
value: kf.intent || "",
|
|
123
|
+
placeholder: "action_name",
|
|
124
|
+
onChange: (e) => updateKeyframe(activeTimelineId, kf.id, { intent: e.target.value })
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx("span", { className: "text-[9px] text-text-muted leading-tight mt-2 px-1", children: "Dispara un trigger local o llamada MCP." })
|
|
128
|
+
] })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
// src/components/studio/TimelineEditor.tsx
|
|
135
|
+
import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
136
|
+
var TimelineEditor = () => {
|
|
137
|
+
const activeTimelineId = usePlaygroundStore((state) => state.prototypeBrand);
|
|
138
|
+
const timelines = useTimelineStore((state) => state.timelines);
|
|
139
|
+
const addKeyframe = useTimelineStore((state) => state.addKeyframe);
|
|
140
|
+
const updateKeyframe = useTimelineStore((state) => state.updateKeyframe);
|
|
141
|
+
const removeKeyframe = useTimelineStore((state) => state.removeKeyframe);
|
|
142
|
+
const updateDuration = useTimelineStore((state) => state.updateDuration);
|
|
143
|
+
const activeTimeline = timelines[activeTimelineId];
|
|
144
|
+
if (!activeTimeline) return null;
|
|
145
|
+
const handleAdd = (trackName) => {
|
|
146
|
+
addKeyframe(activeTimelineId, {
|
|
147
|
+
t: activeTimeline.duration,
|
|
148
|
+
track: trackName,
|
|
149
|
+
...trackName === "dialogue" ? { speech: "", actorId: "system" } : {},
|
|
150
|
+
...trackName === "ui" ? { state: "new_state", canvas: false } : {},
|
|
151
|
+
...trackName === "logic" ? { intent: "" } : {}
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const tracks = ["dialogue", "ui", "logic"];
|
|
155
|
+
return /* @__PURE__ */ jsxs2("div", { className: "flex flex-col h-full bg-surface-secondary text-text-primary border-l border-border-default w-full shadow-2xl z-40 overflow-hidden relative", children: [
|
|
156
|
+
/* @__PURE__ */ jsx2("div", { className: "absolute inset-0 bg-[url('data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.65' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E')] opacity-[0.10] mix-blend-overlay pointer-events-none z-0" }),
|
|
157
|
+
/* @__PURE__ */ jsxs2("div", { className: "p-4 border-b border-border-default relative z-10 flex justify-between items-center bg-surface-glass", children: [
|
|
158
|
+
/* @__PURE__ */ jsxs2("div", { children: [
|
|
159
|
+
/* @__PURE__ */ jsxs2("h2", { className: "text-lg font-bold text-text-primary flex items-center gap-2", children: [
|
|
160
|
+
/* @__PURE__ */ jsx2(MonitorPlay, { size: 18, className: "text-purple-400" }),
|
|
161
|
+
"Multi-Track Sequence"
|
|
162
|
+
] }),
|
|
163
|
+
/* @__PURE__ */ jsxs2("p", { className: "text-xs text-text-secondary mt-1 font-mono uppercase tracking-wider", children: [
|
|
164
|
+
"Editando: ",
|
|
165
|
+
activeTimeline.name
|
|
166
|
+
] })
|
|
167
|
+
] }),
|
|
168
|
+
/* @__PURE__ */ jsxs2("div", { className: "text-right flex flex-col items-end gap-1", children: [
|
|
169
|
+
/* @__PURE__ */ jsx2("span", { className: "text-xs text-text-muted font-mono", children: "Duraci\xF3n Global (s)" }),
|
|
170
|
+
/* @__PURE__ */ jsx2(
|
|
171
|
+
"input",
|
|
172
|
+
{
|
|
173
|
+
type: "number",
|
|
174
|
+
className: "bg-surface-glass border border-border-strong rounded px-2 py-1 w-20 text-text-primary text-right text-sm focus:outline-hidden focus:border-purple-400",
|
|
175
|
+
value: activeTimeline.duration,
|
|
176
|
+
onChange: (e) => updateDuration(activeTimelineId, parseFloat(e.target.value) || 0)
|
|
177
|
+
}
|
|
178
|
+
)
|
|
179
|
+
] })
|
|
180
|
+
] }),
|
|
181
|
+
/* @__PURE__ */ jsxs2("div", { className: "flex-1 flex overflow-hidden w-full relative z-10", children: [
|
|
182
|
+
/* @__PURE__ */ jsxs2("div", { className: "w-[220px] shrink-0 flex flex-col border-r border-border-default bg-surface-primary z-20", children: [
|
|
183
|
+
/* @__PURE__ */ jsx2("div", { className: "h-8 border-b border-border-default shrink-0 bg-surface-secondary" }),
|
|
184
|
+
tracks.map((track) => /* @__PURE__ */ jsxs2("div", { className: `h-[170px] flex flex-col justify-center p-4 border-b border-border-subtle relative
|
|
185
|
+
${track === "dialogue" ? "bg-purple-500/5" : track === "ui" ? "bg-cyan-500/5" : "bg-orange-500/5"}`, children: [
|
|
186
|
+
/* @__PURE__ */ jsx2("div", { className: `text-[10px] font-bold uppercase tracking-widest
|
|
187
|
+
${track === "dialogue" ? "text-purple-400" : track === "ui" ? "text-cyan-400" : "text-orange-400"}`, children: track === "dialogue" ? "Track 1: Di\xE1logo & Audio" : track === "ui" ? "Track 2: UI & Canvas" : "Track 3: L\xF3gica & MCP" }),
|
|
188
|
+
/* @__PURE__ */ jsxs2(
|
|
189
|
+
"button",
|
|
190
|
+
{
|
|
191
|
+
onClick: () => handleAdd(track),
|
|
192
|
+
className: "mt-3 w-fit py-1.5 px-3 rounded text-xs transition-colors flex items-center gap-1 border border-border-default hover:bg-surface-glass text-text-primary/70 hover:text-text-primary",
|
|
193
|
+
children: [
|
|
194
|
+
/* @__PURE__ */ jsx2(Plus, { size: 12 }),
|
|
195
|
+
" Add Node"
|
|
196
|
+
]
|
|
197
|
+
}
|
|
198
|
+
)
|
|
199
|
+
] }, track))
|
|
200
|
+
] }),
|
|
201
|
+
/* @__PURE__ */ jsx2("div", { className: "flex-1 overflow-x-auto overflow-y-hidden custom-scrollbar bg-surface-secondary relative", children: /* @__PURE__ */ jsxs2("div", { className: "h-full relative min-w-max pb-10", style: { width: `${Math.max(activeTimeline.duration, 15) * 100 + 400}px` }, children: [
|
|
202
|
+
/* @__PURE__ */ jsx2("div", { className: "h-8 border-b border-border-default sticky top-0 bg-surface-secondary z-20 flex items-end", children: Array.from({ length: Math.ceil(Math.max(activeTimeline.duration, 15)) + 5 }).map((_, i) => /* @__PURE__ */ jsxs2("div", { className: "absolute h-3 border-l border-border-strong", style: { left: `${i * 100}px` }, children: [
|
|
203
|
+
/* @__PURE__ */ jsxs2("span", { className: "absolute -top-5 -left-1.5 text-[10px] text-text-primary/30 font-mono tracking-tighter", children: [
|
|
204
|
+
i,
|
|
205
|
+
"s"
|
|
206
|
+
] }),
|
|
207
|
+
/* @__PURE__ */ jsx2("div", { className: "absolute left-[50px] -bottom-3 h-1.5 border-l border-border-default" })
|
|
208
|
+
] }, i)) }),
|
|
209
|
+
/* @__PURE__ */ jsx2("div", { className: "flex flex-col w-full relative", children: tracks.map((track) => /* @__PURE__ */ jsx2("div", { className: "h-[170px] border-b border-border-subtle relative hover:bg-surface-glass transition-colors group/lane", children: /* @__PURE__ */ jsx2(AnimatePresence, { children: activeTimeline.keyframes.filter((kf) => kf.track === track).map((kf) => /* @__PURE__ */ jsx2(
|
|
210
|
+
TimelineKeyframeCard,
|
|
211
|
+
{
|
|
212
|
+
kf,
|
|
213
|
+
track,
|
|
214
|
+
activeTimelineId,
|
|
215
|
+
updateKeyframe,
|
|
216
|
+
removeKeyframe
|
|
217
|
+
},
|
|
218
|
+
kf.id
|
|
219
|
+
)) }) }, track)) })
|
|
220
|
+
] }) })
|
|
221
|
+
] })
|
|
222
|
+
] });
|
|
223
|
+
};
|
|
224
|
+
export {
|
|
225
|
+
TimelineEditor
|
|
226
|
+
};
|