@seed-ship/mcp-ui-solid 2.5.2 → 2.5.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/components/ChatPrompt.cjs +92 -71
- package/dist/components/ChatPrompt.cjs.map +1 -1
- package/dist/components/ChatPrompt.d.ts +3 -1
- package/dist/components/ChatPrompt.d.ts.map +1 -1
- package/dist/components/ChatPrompt.js +94 -73
- package/dist/components/ChatPrompt.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ChatPrompt.test.tsx +55 -0
- package/src/components/ChatPrompt.tsx +15 -6
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
|
-
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-hidden"role=dialog style="animation:chat-prompt-slide-up 0.2s ease-out"><div class="flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700"><p class="text-sm font-medium text-gray-900 dark:text-white"></p><button
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-hidden"role=dialog style="animation:chat-prompt-slide-up 0.2s ease-out"><div class="flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700"><p class="text-sm font-medium text-gray-900 dark:text-white"></p><button></button></div><div class="px-4 py-3"></div><style>
|
|
6
6
|
@keyframes chat-prompt-slide-up {
|
|
7
7
|
from { opacity: 0; transform: translateY(8px); }
|
|
8
8
|
to { opacity: 1; transform: translateY(0); }
|
|
9
9
|
}
|
|
10
|
-
`), _tmpl$2 = /* @__PURE__ */ web.template(`<
|
|
10
|
+
`), _tmpl$2 = /* @__PURE__ */ web.template(`<svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<span class=mr-2>`), _tmpl$5 = /* @__PURE__ */ web.template(`<span class="block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal">`), _tmpl$6 = /* @__PURE__ */ web.template(`<button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white hover:bg-blue-50 hover:border-blue-300 dark:hover:bg-blue-900/30 dark:hover:border-blue-600 transition-colors text-left"><!$><!/><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<p class="text-sm text-gray-600 dark:text-gray-400 mb-3">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><!$><!/><div class="flex gap-2 justify-end"><button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"></button><button>`), _tmpl$9 = /* @__PURE__ */ web.template(`<form class="flex flex-col gap-3"><!$><!/><div class="flex justify-end"><button type=submit class="px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors">`), _tmpl$0 = /* @__PURE__ */ web.template(`<span class="text-red-500 ml-0.5">*`), _tmpl$1 = /* @__PURE__ */ web.template(`<textarea rows=3 class="w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors">`), _tmpl$10 = /* @__PURE__ */ web.template(`<select class="w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors"><option value></option><!$><!/>`), _tmpl$11 = /* @__PURE__ */ web.template(`<input class="w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors">`), _tmpl$12 = /* @__PURE__ */ web.template(`<div><label class="block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1"><!$><!/><!$><!/></label><!$><!/>`), _tmpl$13 = /* @__PURE__ */ web.template(`<option>`);
|
|
11
11
|
const ChatPrompt = (props) => {
|
|
12
12
|
if (!props.config) return null;
|
|
13
13
|
return (() => {
|
|
@@ -23,6 +23,17 @@ const ChatPrompt = (props) => {
|
|
|
23
23
|
dismissed: true
|
|
24
24
|
});
|
|
25
25
|
};
|
|
26
|
+
web.insert(_el$4, web.createComponent(solidJs.Show, {
|
|
27
|
+
get when() {
|
|
28
|
+
return props.dismissLabel;
|
|
29
|
+
},
|
|
30
|
+
get fallback() {
|
|
31
|
+
return web.getNextElement(_tmpl$2);
|
|
32
|
+
},
|
|
33
|
+
get children() {
|
|
34
|
+
return props.dismissLabel;
|
|
35
|
+
}
|
|
36
|
+
}));
|
|
26
37
|
web.insert(_el$5, web.createComponent(solidJs.Switch, {
|
|
27
38
|
get children() {
|
|
28
39
|
return [web.createComponent(solidJs.Match, {
|
|
@@ -86,7 +97,17 @@ const ChatPrompt = (props) => {
|
|
|
86
97
|
})];
|
|
87
98
|
}
|
|
88
99
|
}));
|
|
89
|
-
web.effect(() =>
|
|
100
|
+
web.effect((_p$) => {
|
|
101
|
+
var _v$ = props.config.title, _v$2 = props.dismissLabel ? "px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors" : "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors", _v$3 = props.dismissLabel || "Dismiss";
|
|
102
|
+
_v$ !== _p$.e && web.setAttribute(_el$, "aria-label", _p$.e = _v$);
|
|
103
|
+
_v$2 !== _p$.t && web.className(_el$4, _p$.t = _v$2);
|
|
104
|
+
_v$3 !== _p$.a && web.setAttribute(_el$4, "aria-label", _p$.a = _v$3);
|
|
105
|
+
return _p$;
|
|
106
|
+
}, {
|
|
107
|
+
e: void 0,
|
|
108
|
+
t: void 0,
|
|
109
|
+
a: void 0
|
|
110
|
+
});
|
|
90
111
|
web.runHydrationEvents();
|
|
91
112
|
return _el$;
|
|
92
113
|
})();
|
|
@@ -103,64 +124,64 @@ const ChoiceBody = (props) => {
|
|
|
103
124
|
}
|
|
104
125
|
};
|
|
105
126
|
return (() => {
|
|
106
|
-
var _el$
|
|
107
|
-
web.insert(_el$
|
|
127
|
+
var _el$7 = web.getNextElement(_tmpl$3);
|
|
128
|
+
web.insert(_el$7, web.createComponent(solidJs.For, {
|
|
108
129
|
get each() {
|
|
109
130
|
return props.config.options;
|
|
110
131
|
},
|
|
111
132
|
children: (option) => (() => {
|
|
112
|
-
var _el$
|
|
113
|
-
_el$
|
|
114
|
-
web.insert(_el$
|
|
133
|
+
var _el$8 = web.getNextElement(_tmpl$6), _el$1 = _el$8.firstChild, [_el$10, _co$] = web.getNextMarker(_el$1.nextSibling), _el$11 = _el$10.nextSibling, [_el$12, _co$2] = web.getNextMarker(_el$11.nextSibling), _el$13 = _el$12.nextSibling, [_el$14, _co$3] = web.getNextMarker(_el$13.nextSibling);
|
|
134
|
+
_el$8.$$click = () => props.onSelect(option.value, option.label);
|
|
135
|
+
web.insert(_el$8, web.createComponent(solidJs.Show, {
|
|
115
136
|
get when() {
|
|
116
137
|
return option.icon;
|
|
117
138
|
},
|
|
118
139
|
get children() {
|
|
119
|
-
var _el$
|
|
120
|
-
web.insert(_el$
|
|
121
|
-
return _el$
|
|
140
|
+
var _el$9 = web.getNextElement(_tmpl$4);
|
|
141
|
+
web.insert(_el$9, () => option.icon);
|
|
142
|
+
return _el$9;
|
|
122
143
|
}
|
|
123
|
-
}), _el$
|
|
124
|
-
web.insert(_el$
|
|
125
|
-
web.insert(_el$
|
|
144
|
+
}), _el$10, _co$);
|
|
145
|
+
web.insert(_el$8, () => option.label, _el$12, _co$2);
|
|
146
|
+
web.insert(_el$8, web.createComponent(solidJs.Show, {
|
|
126
147
|
get when() {
|
|
127
148
|
return option.description;
|
|
128
149
|
},
|
|
129
150
|
get children() {
|
|
130
|
-
var _el$
|
|
131
|
-
web.insert(_el$
|
|
132
|
-
return _el$
|
|
151
|
+
var _el$0 = web.getNextElement(_tmpl$5);
|
|
152
|
+
web.insert(_el$0, () => option.description);
|
|
153
|
+
return _el$0;
|
|
133
154
|
}
|
|
134
|
-
}), _el$
|
|
155
|
+
}), _el$14, _co$3);
|
|
135
156
|
web.runHydrationEvents();
|
|
136
|
-
return _el$
|
|
157
|
+
return _el$8;
|
|
137
158
|
})()
|
|
138
159
|
}));
|
|
139
|
-
web.effect(() => web.className(_el$
|
|
140
|
-
return _el$
|
|
160
|
+
web.effect(() => web.className(_el$7, layoutClass()));
|
|
161
|
+
return _el$7;
|
|
141
162
|
})();
|
|
142
163
|
};
|
|
143
164
|
const ConfirmBody = (props) => {
|
|
144
165
|
const isDanger = () => props.config.variant === "danger";
|
|
145
166
|
return (() => {
|
|
146
|
-
var _el$
|
|
147
|
-
web.insert(_el$
|
|
167
|
+
var _el$15 = web.getNextElement(_tmpl$8), _el$20 = _el$15.firstChild, [_el$21, _co$4] = web.getNextMarker(_el$20.nextSibling), _el$17 = _el$21.nextSibling, _el$18 = _el$17.firstChild, _el$19 = _el$18.nextSibling;
|
|
168
|
+
web.insert(_el$15, web.createComponent(solidJs.Show, {
|
|
148
169
|
get when() {
|
|
149
170
|
return props.config.message;
|
|
150
171
|
},
|
|
151
172
|
get children() {
|
|
152
|
-
var _el$
|
|
153
|
-
web.insert(_el$
|
|
154
|
-
return _el$
|
|
173
|
+
var _el$16 = web.getNextElement(_tmpl$7);
|
|
174
|
+
web.insert(_el$16, () => props.config.message);
|
|
175
|
+
return _el$16;
|
|
155
176
|
}
|
|
156
|
-
}), _el$
|
|
157
|
-
web.addEventListener(_el$
|
|
158
|
-
web.insert(_el$
|
|
159
|
-
web.addEventListener(_el$
|
|
160
|
-
web.insert(_el$
|
|
161
|
-
web.effect(() => web.className(_el$
|
|
177
|
+
}), _el$21, _co$4);
|
|
178
|
+
web.addEventListener(_el$18, "click", props.onCancel, true);
|
|
179
|
+
web.insert(_el$18, () => props.config.cancelLabel || "Cancel");
|
|
180
|
+
web.addEventListener(_el$19, "click", props.onConfirm, true);
|
|
181
|
+
web.insert(_el$19, () => props.config.confirmLabel || "Confirm");
|
|
182
|
+
web.effect(() => web.className(_el$19, `px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${isDanger() ? "bg-red-600 hover:bg-red-700" : "bg-blue-600 hover:bg-blue-700"}`));
|
|
162
183
|
web.runHydrationEvents();
|
|
163
|
-
return _el$
|
|
184
|
+
return _el$15;
|
|
164
185
|
})();
|
|
165
186
|
};
|
|
166
187
|
const FormBody = (props) => {
|
|
@@ -185,86 +206,86 @@ const FormBody = (props) => {
|
|
|
185
206
|
});
|
|
186
207
|
};
|
|
187
208
|
return (() => {
|
|
188
|
-
var _el$
|
|
189
|
-
_el$
|
|
190
|
-
web.insert(_el$
|
|
209
|
+
var _el$22 = web.getNextElement(_tmpl$9), _el$25 = _el$22.firstChild, [_el$26, _co$5] = web.getNextMarker(_el$25.nextSibling), _el$23 = _el$26.nextSibling, _el$24 = _el$23.firstChild;
|
|
210
|
+
_el$22.addEventListener("submit", handleSubmit);
|
|
211
|
+
web.insert(_el$22, web.createComponent(solidJs.For, {
|
|
191
212
|
get each() {
|
|
192
213
|
return props.config.fields;
|
|
193
214
|
},
|
|
194
215
|
children: (field) => (() => {
|
|
195
|
-
var _el$
|
|
196
|
-
web.insert(_el$
|
|
197
|
-
web.insert(_el$
|
|
216
|
+
var _el$27 = web.getNextElement(_tmpl$12), _el$28 = _el$27.firstChild, _el$30 = _el$28.firstChild, [_el$31, _co$6] = web.getNextMarker(_el$30.nextSibling), _el$32 = _el$31.nextSibling, [_el$33, _co$7] = web.getNextMarker(_el$32.nextSibling), _el$40 = _el$28.nextSibling, [_el$41, _co$9] = web.getNextMarker(_el$40.nextSibling);
|
|
217
|
+
web.insert(_el$28, () => field.label, _el$31, _co$6);
|
|
218
|
+
web.insert(_el$28, web.createComponent(solidJs.Show, {
|
|
198
219
|
get when() {
|
|
199
220
|
return field.required;
|
|
200
221
|
},
|
|
201
222
|
get children() {
|
|
202
|
-
return web.getNextElement(_tmpl$
|
|
223
|
+
return web.getNextElement(_tmpl$0);
|
|
203
224
|
}
|
|
204
|
-
}), _el$
|
|
205
|
-
web.insert(_el$
|
|
225
|
+
}), _el$33, _co$7);
|
|
226
|
+
web.insert(_el$27, web.createComponent(solidJs.Switch, {
|
|
206
227
|
get children() {
|
|
207
228
|
return [web.createComponent(solidJs.Match, {
|
|
208
229
|
get when() {
|
|
209
230
|
return field.type === "textarea";
|
|
210
231
|
},
|
|
211
232
|
get children() {
|
|
212
|
-
var _el$
|
|
213
|
-
_el$
|
|
214
|
-
web.effect(() => web.setAttribute(_el$
|
|
215
|
-
web.effect(() => web.setProperty(_el$
|
|
233
|
+
var _el$34 = web.getNextElement(_tmpl$1);
|
|
234
|
+
_el$34.$$input = (e) => updateField(field.name, e.currentTarget.value);
|
|
235
|
+
web.effect(() => web.setAttribute(_el$34, "placeholder", field.placeholder));
|
|
236
|
+
web.effect(() => web.setProperty(_el$34, "value", formData()[field.name] || ""));
|
|
216
237
|
web.runHydrationEvents();
|
|
217
|
-
return _el$
|
|
238
|
+
return _el$34;
|
|
218
239
|
}
|
|
219
240
|
}), web.createComponent(solidJs.Match, {
|
|
220
241
|
get when() {
|
|
221
242
|
return field.type === "select";
|
|
222
243
|
},
|
|
223
244
|
get children() {
|
|
224
|
-
var _el$
|
|
225
|
-
_el$
|
|
226
|
-
web.insert(_el$
|
|
227
|
-
web.insert(_el$
|
|
245
|
+
var _el$35 = web.getNextElement(_tmpl$10), _el$36 = _el$35.firstChild, _el$37 = _el$36.nextSibling, [_el$38, _co$8] = web.getNextMarker(_el$37.nextSibling);
|
|
246
|
+
_el$35.addEventListener("change", (e) => updateField(field.name, e.currentTarget.value));
|
|
247
|
+
web.insert(_el$36, () => field.placeholder || "Select...");
|
|
248
|
+
web.insert(_el$35, web.createComponent(solidJs.For, {
|
|
228
249
|
get each() {
|
|
229
250
|
return field.options;
|
|
230
251
|
},
|
|
231
252
|
children: (opt) => (() => {
|
|
232
|
-
var _el$
|
|
233
|
-
web.insert(_el$
|
|
234
|
-
web.effect(() => web.setProperty(_el$
|
|
235
|
-
return _el$
|
|
253
|
+
var _el$42 = web.getNextElement(_tmpl$13);
|
|
254
|
+
web.insert(_el$42, () => opt.label);
|
|
255
|
+
web.effect(() => web.setProperty(_el$42, "value", opt.value));
|
|
256
|
+
return _el$42;
|
|
236
257
|
})()
|
|
237
|
-
}), _el$
|
|
238
|
-
web.effect(() => web.setProperty(_el$
|
|
239
|
-
return _el$
|
|
258
|
+
}), _el$38, _co$8);
|
|
259
|
+
web.effect(() => web.setProperty(_el$35, "value", formData()[field.name] || ""));
|
|
260
|
+
return _el$35;
|
|
240
261
|
}
|
|
241
262
|
}), web.createComponent(solidJs.Match, {
|
|
242
263
|
when: true,
|
|
243
264
|
get children() {
|
|
244
|
-
var _el$
|
|
245
|
-
_el$
|
|
265
|
+
var _el$39 = web.getNextElement(_tmpl$11);
|
|
266
|
+
_el$39.$$input = (e) => updateField(field.name, e.currentTarget.value);
|
|
246
267
|
web.effect((_p$) => {
|
|
247
|
-
var _v$ = field.type === "number" ? "number" : "text", _v$
|
|
248
|
-
_v$ !== _p$.e && web.setAttribute(_el$
|
|
249
|
-
_v$
|
|
268
|
+
var _v$4 = field.type === "number" ? "number" : "text", _v$5 = field.placeholder;
|
|
269
|
+
_v$4 !== _p$.e && web.setAttribute(_el$39, "type", _p$.e = _v$4);
|
|
270
|
+
_v$5 !== _p$.t && web.setAttribute(_el$39, "placeholder", _p$.t = _v$5);
|
|
250
271
|
return _p$;
|
|
251
272
|
}, {
|
|
252
273
|
e: void 0,
|
|
253
274
|
t: void 0
|
|
254
275
|
});
|
|
255
|
-
web.effect(() => web.setProperty(_el$
|
|
276
|
+
web.effect(() => web.setProperty(_el$39, "value", formData()[field.name] || ""));
|
|
256
277
|
web.runHydrationEvents();
|
|
257
|
-
return _el$
|
|
278
|
+
return _el$39;
|
|
258
279
|
}
|
|
259
280
|
})];
|
|
260
281
|
}
|
|
261
|
-
}), _el$
|
|
262
|
-
return _el$
|
|
282
|
+
}), _el$41, _co$9);
|
|
283
|
+
return _el$27;
|
|
263
284
|
})()
|
|
264
|
-
}), _el$
|
|
265
|
-
web.insert(_el$
|
|
266
|
-
web.effect(() => web.setProperty(_el$
|
|
267
|
-
return _el$
|
|
285
|
+
}), _el$26, _co$5);
|
|
286
|
+
web.insert(_el$24, () => props.config.submitLabel || "Submit");
|
|
287
|
+
web.effect(() => web.setProperty(_el$24, "disabled", !isValid()));
|
|
288
|
+
return _el$22;
|
|
268
289
|
})();
|
|
269
290
|
};
|
|
270
291
|
web.delegateEvents(["click", "input"]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPrompt.cjs","sources":["../../src/components/ChatPrompt.tsx"],"sourcesContent":["/**\n * ChatPrompt — Ephemeral structured interaction above chat input\n * v2.4.0: choice, confirm, form subtypes\n *\n * @experimental — This component may change without major bump until v2.5.0.\n *\n * Renders above the chat input. User responds → Promise resolves → prompt disappears.\n * Supports AbortSignal for cleanup on navigation (C4).\n */\n\nimport { Component, Show, For, createSignal, onCleanup, Switch, Match } from 'solid-js'\nimport type {\n ChatPromptConfig,\n ChatPromptResponse,\n ChoicePromptConfig,\n ConfirmPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\nexport interface ChatPromptProps {\n /** Prompt configuration */\n config: ChatPromptConfig\n /** Called when user responds */\n onSubmit: (response: ChatPromptResponse) => void\n /** Called when user dismisses */\n onDismiss?: () => void\n}\n\n/**\n * @experimental\n * Ephemeral interaction component — choice buttons, confirmation dialog, or quick form.\n * Designed to sit between the chat messages and the input area.\n *\n * @example\n * <ChatPrompt\n * config={{ type: 'choice', title: 'Format?', config: { options: [...] } }}\n * onSubmit={(r) => bus.events.emit('onChatPromptResponse', { streamKey, response: r })}\n * onDismiss={() => setActivePrompt(null)}\n * />\n */\nexport const ChatPrompt: Component<ChatPromptProps> = (props) => {\n // F1: Guard against null/undefined config (e.g. after dismiss clears state)\n if (!props.config) return null\n\n return (\n <div\n class=\"w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-hidden\"\n style={{ animation: 'chat-prompt-slide-up 0.2s ease-out' }}\n role=\"dialog\"\n aria-label={props.config.title}\n >\n {/* Header */}\n <div class=\"flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700\">\n <p class=\"text-sm font-medium text-gray-900 dark:text-white\">{props.config.title}</p>\n <button\n onClick={() => {\n props.onDismiss?.()\n props.onSubmit({ type: props.config.type, value: '', label: '', dismissed: true })\n }}\n class=\"p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n aria-label=\"Dismiss\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Body — type-specific */}\n <div class=\"px-4 py-3\">\n <Switch>\n <Match when={props.config.type === 'choice'}>\n <ChoiceBody\n config={props.config.config as ChoicePromptConfig}\n onSelect={(value, label) => props.onSubmit({ type: 'choice', value, label })}\n />\n </Match>\n <Match when={props.config.type === 'confirm'}>\n <ConfirmBody\n config={props.config.config as ConfirmPromptConfig}\n onConfirm={() => props.onSubmit({ type: 'confirm', value: 'confirmed', label: (props.config.config as ConfirmPromptConfig).confirmLabel || 'Confirmed' })}\n onCancel={() => {\n props.onDismiss?.()\n props.onSubmit({ type: 'confirm', value: 'cancelled', label: (props.config.config as ConfirmPromptConfig).cancelLabel || 'Cancelled', dismissed: true })\n }}\n />\n </Match>\n <Match when={props.config.type === 'form'}>\n <FormBody\n config={props.config.config as FormPromptConfig}\n onSubmit={(data, label) => props.onSubmit({ type: 'form', value: data, label })}\n />\n </Match>\n </Switch>\n </div>\n\n <style>{`\n @keyframes chat-prompt-slide-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n </div>\n )\n}\n\n// ─── Choice ──────────────────────────────────────────────────\n\nconst ChoiceBody: Component<{\n config: ChoicePromptConfig\n onSelect: (value: string, label: string) => void\n}> = (props) => {\n const layoutClass = () => {\n switch (props.config.layout) {\n case 'vertical': return 'flex flex-col gap-2'\n case 'grid': return 'grid grid-cols-2 gap-2'\n default: return 'flex flex-wrap gap-2'\n }\n }\n\n return (\n <div class={layoutClass()}>\n <For each={props.config.options}>\n {(option) => (\n <button\n onClick={() => props.onSelect(option.value, option.label)}\n class=\"px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white hover:bg-blue-50 hover:border-blue-300 dark:hover:bg-blue-900/30 dark:hover:border-blue-600 transition-colors text-left\"\n >\n <Show when={option.icon}>\n <span class=\"mr-2\">{option.icon}</span>\n </Show>\n {option.label}\n <Show when={option.description}>\n <span class=\"block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal\">{option.description}</span>\n </Show>\n </button>\n )}\n </For>\n </div>\n )\n}\n\n// ─── Confirm ─────────────────────────────────────────────────\n\nconst ConfirmBody: Component<{\n config: ConfirmPromptConfig\n onConfirm: () => void\n onCancel: () => void\n}> = (props) => {\n const isDanger = () => props.config.variant === 'danger'\n\n return (\n <div>\n <Show when={props.config.message}>\n <p class=\"text-sm text-gray-600 dark:text-gray-400 mb-3\">{props.config.message}</p>\n </Show>\n <div class=\"flex gap-2 justify-end\">\n <button\n onClick={props.onCancel}\n class=\"px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n >\n {props.config.cancelLabel || 'Cancel'}\n </button>\n <button\n onClick={props.onConfirm}\n class={`px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${\n isDanger()\n ? 'bg-red-600 hover:bg-red-700'\n : 'bg-blue-600 hover:bg-blue-700'\n }`}\n >\n {props.config.confirmLabel || 'Confirm'}\n </button>\n </div>\n </div>\n )\n}\n\n// ─── Form ────────────────────────────────────────────────────\n\nconst FormBody: Component<{\n config: FormPromptConfig\n onSubmit: (data: Record<string, unknown>, label: string) => void\n}> = (props) => {\n const [formData, setFormData] = createSignal<Record<string, string>>({})\n\n const updateField = (name: string, value: string) => {\n setFormData((prev) => ({ ...prev, [name]: value }))\n }\n\n const handleSubmit = (e: Event) => {\n e.preventDefault()\n const data = formData()\n // Build a human-readable label from the form values\n const label = Object.entries(data)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ')\n props.onSubmit(data, label || 'Form submitted')\n }\n\n const isValid = () => {\n const data = formData()\n return (props.config.fields || [])\n .filter((f) => f.required)\n .every((f) => data[f.name]?.trim())\n }\n\n return (\n <form onSubmit={handleSubmit} class=\"flex flex-col gap-3\">\n <For each={props.config.fields}>\n {(field) => (\n <div>\n <label class=\"block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1\">\n {field.label}\n <Show when={field.required}>\n <span class=\"text-red-500 ml-0.5\">*</span>\n </Show>\n </label>\n <Switch>\n <Match when={field.type === 'textarea'}>\n <textarea\n value={formData()[field.name] || ''}\n onInput={(e) => updateField(field.name, e.currentTarget.value)}\n placeholder={field.placeholder}\n rows={3}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n />\n </Match>\n <Match when={field.type === 'select'}>\n <select\n value={formData()[field.name] || ''}\n onChange={(e) => updateField(field.name, e.currentTarget.value)}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n <For each={field.options}>\n {(opt) => <option value={opt.value}>{opt.label}</option>}\n </For>\n </select>\n </Match>\n <Match when={true}>\n <input\n type={field.type === 'number' ? 'number' : 'text'}\n value={formData()[field.name] || ''}\n onInput={(e) => updateField(field.name, e.currentTarget.value)}\n placeholder={field.placeholder}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n />\n </Match>\n </Switch>\n </div>\n )}\n </For>\n <div class=\"flex justify-end\">\n <button\n type=\"submit\"\n disabled={!isValid()}\n class=\"px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors\"\n >\n {props.config.submitLabel || 'Submit'}\n </button>\n </div>\n </form>\n )\n}\n"],"names":["ChatPrompt","props","config","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","title","$$click","onDismiss","onSubmit","type","value","label","dismissed","_$createComponent","Switch","children","Match","when","ChoiceBody","onSelect","ConfirmBody","onConfirm","confirmLabel","onCancel","cancelLabel","FormBody","data","_$effect","_$setAttribute","_$runHydrationEvents","layoutClass","layout","_el$6","_tmpl$2","For","each","options","option","_el$7","_tmpl$5","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$11","_co$2","_el$12","_el$13","_co$3","Show","icon","_el$8","_tmpl$3","description","_el$9","_tmpl$4","_$className","isDanger","variant","_el$14","_tmpl$7","_el$19","_el$20","_co$4","_el$16","_el$17","_el$18","message","_el$15","_tmpl$6","_$addEventListener","formData","setFormData","createSignal","updateField","name","prev","handleSubmit","e","preventDefault","Object","entries","filter","v","map","k","join","isValid","fields","f","required","every","trim","_el$21","_tmpl$8","_el$24","_el$25","_co$5","_el$22","_el$23","addEventListener","field","_el$26","_tmpl$11","_el$27","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","_el$39","_el$40","_co$9","_tmpl$9","_el$33","_tmpl$0","$$input","currentTarget","placeholder","_$setProperty","_el$34","_tmpl$1","_el$35","_el$36","_el$37","_co$8","opt","_el$41","_tmpl$12","_el$38","_tmpl$10","_p$","_v$","_v$2","t","undefined","submitLabel","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChatPrompt.cjs","sources":["../../src/components/ChatPrompt.tsx"],"sourcesContent":["/**\n * ChatPrompt — Ephemeral structured interaction above chat input\n * v2.4.0: choice, confirm, form subtypes\n *\n * @experimental — This component may change without major bump until v2.5.0.\n *\n * Renders above the chat input. User responds → Promise resolves → prompt disappears.\n * Supports AbortSignal for cleanup on navigation (C4).\n */\n\nimport { Component, Show, For, createSignal, onCleanup, Switch, Match } from 'solid-js'\nimport type {\n ChatPromptConfig,\n ChatPromptResponse,\n ChoicePromptConfig,\n ConfirmPromptConfig,\n FormPromptConfig,\n} from '../types/chat-bus'\n\nexport interface ChatPromptProps {\n /** Prompt configuration */\n config: ChatPromptConfig\n /** Called when user responds */\n onSubmit: (response: ChatPromptResponse) => void\n /** Called when user dismisses (e.g. \"send as-is\") */\n onDismiss?: () => void\n /** Label for the dismiss button (replaces X icon). Default: shows X icon. */\n dismissLabel?: string\n}\n\n/**\n * @experimental\n * Ephemeral interaction component — choice buttons, confirmation dialog, or quick form.\n * Designed to sit between the chat messages and the input area.\n *\n * @example\n * <ChatPrompt\n * config={{ type: 'choice', title: 'Format?', config: { options: [...] } }}\n * onSubmit={(r) => bus.events.emit('onChatPromptResponse', { streamKey, response: r })}\n * onDismiss={() => setActivePrompt(null)}\n * />\n */\nexport const ChatPrompt: Component<ChatPromptProps> = (props) => {\n // F1: Guard against null/undefined config (e.g. after dismiss clears state)\n if (!props.config) return null\n\n return (\n <div\n class=\"w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-hidden\"\n style={{ animation: 'chat-prompt-slide-up 0.2s ease-out' }}\n role=\"dialog\"\n aria-label={props.config.title}\n >\n {/* Header */}\n <div class=\"flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700\">\n <p class=\"text-sm font-medium text-gray-900 dark:text-white\">{props.config.title}</p>\n <button\n onClick={() => {\n props.onDismiss?.()\n props.onSubmit({ type: props.config.type, value: '', label: '', dismissed: true })\n }}\n class={props.dismissLabel\n ? 'px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors'\n : 'p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors'\n }\n aria-label={props.dismissLabel || 'Dismiss'}\n >\n <Show when={props.dismissLabel} fallback={\n <svg class=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n }>\n {props.dismissLabel}\n </Show>\n </button>\n </div>\n\n {/* Body — type-specific */}\n <div class=\"px-4 py-3\">\n <Switch>\n <Match when={props.config.type === 'choice'}>\n <ChoiceBody\n config={props.config.config as ChoicePromptConfig}\n onSelect={(value, label) => props.onSubmit({ type: 'choice', value, label })}\n />\n </Match>\n <Match when={props.config.type === 'confirm'}>\n <ConfirmBody\n config={props.config.config as ConfirmPromptConfig}\n onConfirm={() => props.onSubmit({ type: 'confirm', value: 'confirmed', label: (props.config.config as ConfirmPromptConfig).confirmLabel || 'Confirmed' })}\n onCancel={() => {\n props.onDismiss?.()\n props.onSubmit({ type: 'confirm', value: 'cancelled', label: (props.config.config as ConfirmPromptConfig).cancelLabel || 'Cancelled', dismissed: true })\n }}\n />\n </Match>\n <Match when={props.config.type === 'form'}>\n <FormBody\n config={props.config.config as FormPromptConfig}\n onSubmit={(data, label) => props.onSubmit({ type: 'form', value: data, label })}\n />\n </Match>\n </Switch>\n </div>\n\n <style>{`\n @keyframes chat-prompt-slide-up {\n from { opacity: 0; transform: translateY(8px); }\n to { opacity: 1; transform: translateY(0); }\n }\n `}</style>\n </div>\n )\n}\n\n// ─── Choice ──────────────────────────────────────────────────\n\nconst ChoiceBody: Component<{\n config: ChoicePromptConfig\n onSelect: (value: string, label: string) => void\n}> = (props) => {\n const layoutClass = () => {\n switch (props.config.layout) {\n case 'vertical': return 'flex flex-col gap-2'\n case 'grid': return 'grid grid-cols-2 gap-2'\n default: return 'flex flex-wrap gap-2'\n }\n }\n\n return (\n <div class={layoutClass()}>\n <For each={props.config.options}>\n {(option) => (\n <button\n onClick={() => props.onSelect(option.value, option.label)}\n class=\"px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 bg-gray-50 dark:bg-gray-700 text-gray-900 dark:text-white hover:bg-blue-50 hover:border-blue-300 dark:hover:bg-blue-900/30 dark:hover:border-blue-600 transition-colors text-left\"\n >\n <Show when={option.icon}>\n <span class=\"mr-2\">{option.icon}</span>\n </Show>\n {option.label}\n <Show when={option.description}>\n <span class=\"block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal\">{option.description}</span>\n </Show>\n </button>\n )}\n </For>\n </div>\n )\n}\n\n// ─── Confirm ─────────────────────────────────────────────────\n\nconst ConfirmBody: Component<{\n config: ConfirmPromptConfig\n onConfirm: () => void\n onCancel: () => void\n}> = (props) => {\n const isDanger = () => props.config.variant === 'danger'\n\n return (\n <div>\n <Show when={props.config.message}>\n <p class=\"text-sm text-gray-600 dark:text-gray-400 mb-3\">{props.config.message}</p>\n </Show>\n <div class=\"flex gap-2 justify-end\">\n <button\n onClick={props.onCancel}\n class=\"px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n >\n {props.config.cancelLabel || 'Cancel'}\n </button>\n <button\n onClick={props.onConfirm}\n class={`px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${\n isDanger()\n ? 'bg-red-600 hover:bg-red-700'\n : 'bg-blue-600 hover:bg-blue-700'\n }`}\n >\n {props.config.confirmLabel || 'Confirm'}\n </button>\n </div>\n </div>\n )\n}\n\n// ─── Form ────────────────────────────────────────────────────\n\nconst FormBody: Component<{\n config: FormPromptConfig\n onSubmit: (data: Record<string, unknown>, label: string) => void\n}> = (props) => {\n const [formData, setFormData] = createSignal<Record<string, string>>({})\n\n const updateField = (name: string, value: string) => {\n setFormData((prev) => ({ ...prev, [name]: value }))\n }\n\n const handleSubmit = (e: Event) => {\n e.preventDefault()\n const data = formData()\n // Build a human-readable label from the form values\n const label = Object.entries(data)\n .filter(([, v]) => v)\n .map(([k, v]) => `${k}: ${v}`)\n .join(', ')\n props.onSubmit(data, label || 'Form submitted')\n }\n\n const isValid = () => {\n const data = formData()\n return (props.config.fields || [])\n .filter((f) => f.required)\n .every((f) => data[f.name]?.trim())\n }\n\n return (\n <form onSubmit={handleSubmit} class=\"flex flex-col gap-3\">\n <For each={props.config.fields}>\n {(field) => (\n <div>\n <label class=\"block text-xs font-medium text-gray-600 dark:text-gray-400 mb-1\">\n {field.label}\n <Show when={field.required}>\n <span class=\"text-red-500 ml-0.5\">*</span>\n </Show>\n </label>\n <Switch>\n <Match when={field.type === 'textarea'}>\n <textarea\n value={formData()[field.name] || ''}\n onInput={(e) => updateField(field.name, e.currentTarget.value)}\n placeholder={field.placeholder}\n rows={3}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n />\n </Match>\n <Match when={field.type === 'select'}>\n <select\n value={formData()[field.name] || ''}\n onChange={(e) => updateField(field.name, e.currentTarget.value)}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n >\n <option value=\"\">{field.placeholder || 'Select...'}</option>\n <For each={field.options}>\n {(opt) => <option value={opt.value}>{opt.label}</option>}\n </For>\n </select>\n </Match>\n <Match when={true}>\n <input\n type={field.type === 'number' ? 'number' : 'text'}\n value={formData()[field.name] || ''}\n onInput={(e) => updateField(field.name, e.currentTarget.value)}\n placeholder={field.placeholder}\n class=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-200 dark:border-gray-600 bg-white dark:bg-gray-700 text-gray-900 dark:text-white focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none transition-colors\"\n />\n </Match>\n </Switch>\n </div>\n )}\n </For>\n <div class=\"flex justify-end\">\n <button\n type=\"submit\"\n disabled={!isValid()}\n class=\"px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors\"\n >\n {props.config.submitLabel || 'Submit'}\n </button>\n </div>\n </form>\n )\n}\n"],"names":["ChatPrompt","props","config","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","_el$3","_el$4","nextSibling","_el$5","_$insert","title","$$click","onDismiss","onSubmit","type","value","label","dismissed","_$createComponent","Show","when","dismissLabel","fallback","_tmpl$2","children","Switch","Match","ChoiceBody","onSelect","ConfirmBody","onConfirm","confirmLabel","onCancel","cancelLabel","FormBody","data","_$effect","_p$","_v$","_v$2","_v$3","e","_$setAttribute","t","_$className","a","undefined","_$runHydrationEvents","layoutClass","layout","_el$7","_tmpl$3","For","each","options","option","_el$8","_tmpl$6","_el$1","_el$10","_co$","_$getNextMarker","_el$11","_el$12","_co$2","_el$13","_el$14","_co$3","icon","_el$9","_tmpl$4","description","_el$0","_tmpl$5","isDanger","variant","_el$15","_tmpl$8","_el$20","_el$21","_co$4","_el$17","_el$18","_el$19","message","_el$16","_tmpl$7","_$addEventListener","formData","setFormData","createSignal","updateField","name","prev","handleSubmit","preventDefault","Object","entries","filter","v","map","k","join","isValid","fields","f","required","every","trim","_el$22","_tmpl$9","_el$25","_el$26","_co$5","_el$23","_el$24","addEventListener","field","_el$27","_tmpl$12","_el$28","_el$30","_el$31","_co$6","_el$32","_el$33","_co$7","_el$40","_el$41","_co$9","_tmpl$0","_el$34","_tmpl$1","$$input","currentTarget","placeholder","_$setProperty","_el$35","_tmpl$10","_el$36","_el$37","_el$38","_co$8","opt","_el$42","_tmpl$13","_el$39","_tmpl$11","_v$4","_v$5","submitLabel","_$delegateEvents"],"mappings":"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"}
|
|
@@ -14,8 +14,10 @@ export interface ChatPromptProps {
|
|
|
14
14
|
config: ChatPromptConfig;
|
|
15
15
|
/** Called when user responds */
|
|
16
16
|
onSubmit: (response: ChatPromptResponse) => void;
|
|
17
|
-
/** Called when user dismisses */
|
|
17
|
+
/** Called when user dismisses (e.g. "send as-is") */
|
|
18
18
|
onDismiss?: () => void;
|
|
19
|
+
/** Label for the dismiss button (replaces X icon). Default: shows X icon. */
|
|
20
|
+
dismissLabel?: string;
|
|
19
21
|
}
|
|
20
22
|
/**
|
|
21
23
|
* @experimental
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ChatPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAqD,MAAM,UAAU,CAAA;AACvF,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAInB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,gBAAgB,CAAA;IACxB,gCAAgC;IAChC,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAChD,
|
|
1
|
+
{"version":3,"file":"ChatPrompt.d.ts","sourceRoot":"","sources":["../../src/components/ChatPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,SAAS,EAAqD,MAAM,UAAU,CAAA;AACvF,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAInB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,MAAM,EAAE,gBAAgB,CAAA;IACxB,gCAAgC;IAChC,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAChD,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,UAAU,EAAE,SAAS,CAAC,eAAe,CAuEjD,CAAA"}
|