@seed-ship/mcp-ui-solid 4.0.6 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/components/AgentCard.cjs +122 -0
  2. package/dist/components/AgentCard.cjs.map +1 -0
  3. package/dist/components/AgentCard.d.ts +20 -0
  4. package/dist/components/AgentCard.d.ts.map +1 -0
  5. package/dist/components/AgentCard.js +122 -0
  6. package/dist/components/AgentCard.js.map +1 -0
  7. package/dist/components/AgentHandoff.cjs +49 -0
  8. package/dist/components/AgentHandoff.cjs.map +1 -0
  9. package/dist/components/AgentHandoff.d.ts +12 -0
  10. package/dist/components/AgentHandoff.d.ts.map +1 -0
  11. package/dist/components/AgentHandoff.js +49 -0
  12. package/dist/components/AgentHandoff.js.map +1 -0
  13. package/dist/components/BriefingDiff.cjs +165 -0
  14. package/dist/components/BriefingDiff.cjs.map +1 -0
  15. package/dist/components/BriefingDiff.d.ts +12 -0
  16. package/dist/components/BriefingDiff.d.ts.map +1 -0
  17. package/dist/components/BriefingDiff.js +165 -0
  18. package/dist/components/BriefingDiff.js.map +1 -0
  19. package/dist/components/FormFieldRenderer.cjs +314 -264
  20. package/dist/components/FormFieldRenderer.cjs.map +1 -1
  21. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  22. package/dist/components/FormFieldRenderer.js +315 -265
  23. package/dist/components/FormFieldRenderer.js.map +1 -1
  24. package/dist/components/FormRenderer.cjs +74 -17
  25. package/dist/components/FormRenderer.cjs.map +1 -1
  26. package/dist/components/FormRenderer.d.ts.map +1 -1
  27. package/dist/components/FormRenderer.js +76 -19
  28. package/dist/components/FormRenderer.js.map +1 -1
  29. package/dist/components/ScratchpadPanel.cjs +618 -411
  30. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  31. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  32. package/dist/components/ScratchpadPanel.js +619 -412
  33. package/dist/components/ScratchpadPanel.js.map +1 -1
  34. package/dist/components/SplitStepper.cjs +121 -0
  35. package/dist/components/SplitStepper.cjs.map +1 -0
  36. package/dist/components/SplitStepper.d.ts +12 -0
  37. package/dist/components/SplitStepper.d.ts.map +1 -0
  38. package/dist/components/SplitStepper.js +121 -0
  39. package/dist/components/SplitStepper.js.map +1 -0
  40. package/dist/components/index.d.ts +8 -0
  41. package/dist/components/index.d.ts.map +1 -1
  42. package/dist/components.cjs +9 -0
  43. package/dist/components.cjs.map +1 -1
  44. package/dist/components.d.cts +8 -0
  45. package/dist/components.d.ts +8 -0
  46. package/dist/components.js +9 -0
  47. package/dist/components.js.map +1 -1
  48. package/dist/index.cjs +9 -0
  49. package/dist/index.cjs.map +1 -1
  50. package/dist/index.d.cts +9 -1
  51. package/dist/index.d.ts +9 -1
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +9 -0
  54. package/dist/index.js.map +1 -1
  55. package/dist/types/chat-bus.d.ts +81 -1
  56. package/dist/types/chat-bus.d.ts.map +1 -1
  57. package/dist/types/index.d.ts +15 -0
  58. package/dist/types/index.d.ts.map +1 -1
  59. package/dist/types.d.cts +15 -0
  60. package/dist/types.d.ts +15 -0
  61. package/package.json +1 -1
  62. package/src/components/AgentCard.tsx +109 -0
  63. package/src/components/AgentHandoff.tsx +64 -0
  64. package/src/components/BriefingDiff.tsx +93 -0
  65. package/src/components/FormFieldRenderer.tsx +35 -4
  66. package/src/components/FormRenderer.tsx +74 -4
  67. package/src/components/ScratchpadPanel.tsx +131 -49
  68. package/src/components/SplitStepper.tsx +111 -0
  69. package/src/components/index.ts +13 -0
  70. package/src/index.ts +15 -0
  71. package/src/types/chat-bus.ts +70 -1
  72. package/src/types/index.ts +18 -0
  73. package/tsconfig.tsbuildinfo +1 -1
@@ -1,11 +1,11 @@
1
- import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, memo, effect, setProperty, runHydrationEvents, className } from "solid-js/web";
2
- import { createSignal, onMount, createEffect, Show, For } from "solid-js";
1
+ import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, runHydrationEvents, memo, effect, setProperty, setAttribute, className } from "solid-js/web";
2
+ import { createSignal, onCleanup, onMount, createEffect, Show, For } from "solid-js";
3
3
  import { FormFieldRenderer } from "./FormFieldRenderer.js";
4
4
  import { useAction } from "../hooks/useAction.js";
5
5
  import { validateFormData } from "../services/validation.js";
6
6
  import { evaluateCondition } from "../hooks/useConditionalField.js";
7
7
  import { useFormPersistence } from "../hooks/useFormPersistence.js";
8
- var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md"><p class="text-sm text-red-600 dark:text-red-400"role=alert>`), _tmpl$3 = /* @__PURE__ */ template(`<button type=button class="px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors">Reset`), _tmpl$4 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><!$><!/><form novalidate><div></div><!$><!/><div class="flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700"><button type=submit class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"></button><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<span class="flex items-center gap-2"><span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></span>Submitting...`);
8
+ var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md"><p class="text-sm text-red-600 dark:text-red-400"role=alert>`), _tmpl$3 = /* @__PURE__ */ template(`<div class="mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md"><span class="text-sm text-blue-700 dark:text-blue-300"><!$><!/> in <!$><!/>s...</span><button type=button class="text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200">Cancel`), _tmpl$4 = /* @__PURE__ */ template(`<button type=button class="px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors">Reset`), _tmpl$5 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><!$><!/><form novalidate><div></div><!$><!/><!$><!/><div class="flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700"><button type=submit class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"></button><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<span class="flex items-center gap-2"><span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></span>Submitting...`);
9
9
  function getFieldDefault(type) {
10
10
  switch (type) {
11
11
  case "checkbox":
@@ -34,10 +34,30 @@ const FormRenderer = (props) => {
34
34
  return evaluateCondition(field.showWhen, formData());
35
35
  });
36
36
  };
37
+ const [countdown, setCountdown] = createSignal(null);
38
+ let countdownTimer = null;
39
+ const [userInteracted, setUserInteracted] = createSignal(false);
40
+ const cancelCountdown = () => {
41
+ if (countdownTimer) {
42
+ clearInterval(countdownTimer);
43
+ countdownTimer = null;
44
+ }
45
+ setCountdown(null);
46
+ };
47
+ const handleUserInteraction = () => {
48
+ if (!userInteracted()) {
49
+ setUserInteracted(true);
50
+ cancelCountdown();
51
+ }
52
+ };
53
+ onCleanup(() => cancelCountdown());
54
+ const allRequiredPrefilled = () => {
55
+ return params().fields.filter((f) => f.required).every((f) => f.prefill != null);
56
+ };
37
57
  const initializeForm = (clearStorage = false) => {
38
58
  const initial = {};
39
59
  for (const field of params().fields) {
40
- initial[field.name] = field.defaultValue ?? getFieldDefault(field.type);
60
+ initial[field.name] = field.prefill ?? field.defaultValue ?? getFieldDefault(field.type);
41
61
  }
42
62
  setFormData(initial);
43
63
  setErrors({});
@@ -61,7 +81,24 @@ const FormRenderer = (props) => {
61
81
  clearPersisted = persistence.clearPersisted;
62
82
  }
63
83
  });
84
+ createEffect(() => {
85
+ const delay = params().autoSubmitDelay;
86
+ if (!delay || !allRequiredPrefilled() || userInteracted()) return;
87
+ let remaining = Math.ceil(delay / 1e3);
88
+ setCountdown(remaining);
89
+ countdownTimer = setInterval(() => {
90
+ remaining--;
91
+ if (remaining <= 0) {
92
+ cancelCountdown();
93
+ const form = document.querySelector(`#form-${props.component.id}`);
94
+ if (form) form.requestSubmit();
95
+ } else {
96
+ setCountdown(remaining);
97
+ }
98
+ }, 1e3);
99
+ });
64
100
  const handleFieldChange = (name, value) => {
101
+ handleUserInteraction();
65
102
  setFormData((prev) => ({
66
103
  ...prev,
67
104
  [name]: value
@@ -141,7 +178,7 @@ const FormRenderer = (props) => {
141
178
  }
142
179
  };
143
180
  return (() => {
144
- var _el$ = getNextElement(_tmpl$4), _el$12 = _el$.firstChild, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling), _el$3 = _el$13.nextSibling, _el$4 = _el$3.firstChild, _el$10 = _el$4.nextSibling, [_el$11, _co$2] = getNextMarker(_el$10.nextSibling), _el$7 = _el$11.nextSibling, _el$8 = _el$7.firstChild, _el$0 = _el$8.nextSibling, [_el$1, _co$] = getNextMarker(_el$0.nextSibling);
181
+ var _el$ = getNextElement(_tmpl$5), _el$23 = _el$.firstChild, [_el$24, _co$6] = getNextMarker(_el$23.nextSibling), _el$3 = _el$24.nextSibling, _el$4 = _el$3.firstChild, _el$19 = _el$4.nextSibling, [_el$20, _co$4] = getNextMarker(_el$19.nextSibling), _el$21 = _el$20.nextSibling, [_el$22, _co$5] = getNextMarker(_el$21.nextSibling), _el$14 = _el$22.nextSibling, _el$15 = _el$14.firstChild, _el$17 = _el$15.nextSibling, [_el$18, _co$3] = getNextMarker(_el$17.nextSibling);
145
182
  insert(_el$, createComponent(Show, {
146
183
  get when() {
147
184
  return params().title;
@@ -151,7 +188,7 @@ const FormRenderer = (props) => {
151
188
  insert(_el$2, () => params().title);
152
189
  return _el$2;
153
190
  }
154
- }), _el$13, _co$3);
191
+ }), _el$24, _co$6);
155
192
  _el$3.addEventListener("submit", handleSubmit);
156
193
  insert(_el$4, createComponent(For, {
157
194
  get each() {
@@ -181,31 +218,51 @@ const FormRenderer = (props) => {
181
218
  insert(_el$6, () => errors()._form);
182
219
  return _el$5;
183
220
  }
184
- }), _el$11, _co$2);
185
- insert(_el$8, (() => {
221
+ }), _el$20, _co$4);
222
+ insert(_el$3, createComponent(Show, {
223
+ get when() {
224
+ return countdown() != null;
225
+ },
226
+ get children() {
227
+ var _el$7 = getNextElement(_tmpl$3), _el$8 = _el$7.firstChild, _el$1 = _el$8.firstChild, [_el$10, _co$] = getNextMarker(_el$1.nextSibling), _el$9 = _el$10.nextSibling, _el$11 = _el$9.nextSibling, [_el$12, _co$2] = getNextMarker(_el$11.nextSibling);
228
+ _el$12.nextSibling;
229
+ var _el$13 = _el$8.nextSibling;
230
+ insert(_el$8, () => params().submitLabel || "Submit", _el$10, _co$);
231
+ insert(_el$8, countdown, _el$12, _co$2);
232
+ _el$13.$$click = () => {
233
+ cancelCountdown();
234
+ setUserInteracted(true);
235
+ };
236
+ runHydrationEvents();
237
+ return _el$7;
238
+ }
239
+ }), _el$22, _co$5);
240
+ insert(_el$15, (() => {
186
241
  var _c$ = memo(() => !!isSubmitting());
187
- return () => _c$() ? getNextElement(_tmpl$5) : params().submitLabel || "Submit";
242
+ return () => _c$() ? getNextElement(_tmpl$6) : params().submitLabel || "Submit";
188
243
  })());
189
- insert(_el$7, createComponent(Show, {
244
+ insert(_el$14, createComponent(Show, {
190
245
  get when() {
191
246
  return params().showReset;
192
247
  },
193
248
  get children() {
194
- var _el$9 = getNextElement(_tmpl$3);
195
- _el$9.$$click = () => initializeForm(true);
196
- effect(() => setProperty(_el$9, "disabled", isSubmitting()));
249
+ var _el$16 = getNextElement(_tmpl$4);
250
+ _el$16.$$click = () => initializeForm(true);
251
+ effect(() => setProperty(_el$16, "disabled", isSubmitting()));
197
252
  runHydrationEvents();
198
- return _el$9;
253
+ return _el$16;
199
254
  }
200
- }), _el$1, _co$);
255
+ }), _el$18, _co$3);
201
256
  effect((_p$) => {
202
- var _v$ = layoutClass(), _v$2 = isSubmitting();
203
- _v$ !== _p$.e && className(_el$4, _p$.e = _v$);
204
- _v$2 !== _p$.t && setProperty(_el$8, "disabled", _p$.t = _v$2);
257
+ var _v$ = `form-${props.component.id}`, _v$2 = layoutClass(), _v$3 = isSubmitting();
258
+ _v$ !== _p$.e && setAttribute(_el$3, "id", _p$.e = _v$);
259
+ _v$2 !== _p$.t && className(_el$4, _p$.t = _v$2);
260
+ _v$3 !== _p$.a && setProperty(_el$15, "disabled", _p$.a = _v$3);
205
261
  return _p$;
206
262
  }, {
207
263
  e: void 0,
208
- t: void 0
264
+ t: void 0,
265
+ a: void 0
209
266
  });
210
267
  return _el$;
211
268
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"FormRenderer.js","sources":["../../src/components/FormRenderer.tsx"],"sourcesContent":["/**\n * FormRenderer - Main form component\n * Sprint 1: Form Foundation\n * Sprint 2: Conditional field visibility (showWhen)\n * Sprint 4: Form state persistence\n */\n\nimport { Component, createSignal, For, Show, onMount, createEffect } from 'solid-js'\nimport { FormFieldRenderer } from './FormFieldRenderer'\nimport type { UIComponent, FormComponentParams, FormFieldParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { validateFormData } from '../services/validation'\nimport { evaluateCondition } from '../hooks/useConditionalField'\nimport { useFormPersistence } from '../hooks/useFormPersistence'\n\nexport interface FormRendererProps {\n component: UIComponent\n onSubmit?: (data: Record<string, any>) => void\n onError?: (errors: Record<string, string>) => void\n}\n\n/**\n * Get default value for a field type\n */\nfunction getFieldDefault(type: FormFieldParams['type']): any {\n switch (type) {\n case 'checkbox':\n return false\n case 'number':\n return undefined\n case 'select':\n case 'radio':\n return ''\n default:\n return ''\n }\n}\n\nexport const FormRenderer: Component<FormRendererProps> = (props) => {\n const params = () => props.component.params as FormComponentParams\n const [formData, setFormData] = createSignal<Record<string, any>>({})\n const [errors, setErrors] = createSignal<Record<string, string>>({})\n const [isSubmitting, setIsSubmitting] = createSignal(false)\n const { execute } = useAction()\n\n // Form persistence (Sprint 4)\n let clearPersisted: (() => void) | undefined\n\n /**\n * Get fields that are currently visible based on showWhen conditions\n */\n const getVisibleFields = (): FormFieldParams[] => {\n return params().fields.filter((field) => {\n if (!field.showWhen) return true\n return evaluateCondition(field.showWhen, formData())\n })\n }\n\n // Initialize form data with default values\n const initializeForm = (clearStorage = false) => {\n const initial: Record<string, any> = {}\n for (const field of params().fields) {\n initial[field.name] = field.defaultValue ?? getFieldDefault(field.type)\n }\n setFormData(initial)\n setErrors({})\n\n // Clear persisted data if requested\n if (clearStorage && clearPersisted) {\n clearPersisted()\n }\n }\n\n // Initialize on mount\n onMount(() => {\n initializeForm()\n })\n\n // Setup persistence if persistKey is provided (Sprint 4)\n createEffect(() => {\n const persistKey = params().persistKey\n if (persistKey) {\n const persistence = useFormPersistence({\n persistKey,\n formData,\n setFormData,\n excludeFields: params().excludeFromPersistence,\n expiresIn: params().persistExpiresIn,\n })\n clearPersisted = persistence.clearPersisted\n }\n })\n\n const handleFieldChange = (name: string, value: any) => {\n setFormData((prev) => ({ ...prev, [name]: value }))\n // Clear error on change\n if (errors()[name]) {\n setErrors((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [name]: _removed, ...rest } = prev\n return rest\n })\n }\n }\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setIsSubmitting(true)\n setErrors({})\n\n // Get only visible fields for validation and submission\n const visibleFields = getVisibleFields()\n const visibleFieldNames = new Set(visibleFields.map((f) => f.name))\n\n // Filter form data to only include visible fields\n const visibleFormData: Record<string, any> = {}\n for (const [key, value] of Object.entries(formData())) {\n if (visibleFieldNames.has(key)) {\n visibleFormData[key] = value\n }\n }\n\n // Validate only visible fields\n const validationResult = validateFormData(visibleFormData, visibleFields)\n if (!validationResult.valid) {\n setErrors(validationResult.errors)\n setIsSubmitting(false)\n props.onError?.(validationResult.errors)\n return\n }\n\n // Submit via tool call if specified\n if (params().submitAction?.toolName) {\n try {\n const result = await execute(params().submitAction!.toolName, {\n ...params().submitAction!.params,\n formData: visibleFormData,\n })\n if (!result.success) {\n setErrors({ _form: result.error || 'Submission failed' })\n setIsSubmitting(false)\n props.onError?.({ _form: result.error || 'Submission failed' })\n return\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed'\n setErrors({ _form: errorMessage })\n setIsSubmitting(false)\n props.onError?.({ _form: errorMessage })\n return\n }\n }\n\n // Clear persisted data on successful submit\n if (clearPersisted) {\n clearPersisted()\n }\n\n props.onSubmit?.(visibleFormData)\n setIsSubmitting(false)\n }\n\n const layoutClass = () => {\n switch (params().layout) {\n case 'horizontal':\n return 'grid grid-cols-2 gap-4'\n case 'inline':\n return 'flex flex-wrap gap-4 items-end'\n default:\n return 'space-y-4'\n }\n }\n\n return (\n <div class=\"w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <Show when={params().title}>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n {params().title}\n </h3>\n </Show>\n\n <form onSubmit={handleSubmit} noValidate>\n <div class={layoutClass()}>\n <For each={params().fields}>\n {(field) => (\n <FormFieldRenderer\n field={field}\n value={formData()[field.name]}\n error={errors()[field.name]}\n onChange={(value) => handleFieldChange(field.name, value)}\n disabled={isSubmitting() || field.disabled}\n formData={formData}\n />\n )}\n </For>\n </div>\n\n <Show when={errors()._form}>\n <div class=\"mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md\">\n <p class=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {errors()._form}\n </p>\n </div>\n </Show>\n\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"submit\"\n disabled={isSubmitting()}\n class=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting() ? (\n <span class=\"flex items-center gap-2\">\n <span class=\"animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full\" />\n Submitting...\n </span>\n ) : (\n params().submitLabel || 'Submit'\n )}\n </button>\n <Show when={params().showReset}>\n <button\n type=\"button\"\n onClick={() => initializeForm(true)}\n disabled={isSubmitting()}\n class=\"px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Reset\n </button>\n </Show>\n </div>\n </form>\n </div>\n )\n}\n"],"names":["getFieldDefault","type","undefined","FormRenderer","props","params","component","formData","setFormData","createSignal","errors","setErrors","isSubmitting","setIsSubmitting","execute","useAction","clearPersisted","getVisibleFields","fields","filter","field","showWhen","evaluateCondition","initializeForm","clearStorage","initial","name","defaultValue","onMount","createEffect","persistKey","persistence","useFormPersistence","excludeFields","excludeFromPersistence","expiresIn","persistExpiresIn","handleFieldChange","value","prev","_removed","rest","handleSubmit","e","preventDefault","visibleFields","visibleFieldNames","Set","map","f","visibleFormData","key","Object","entries","has","validationResult","validateFormData","valid","onError","submitAction","toolName","result","success","_form","error","errorMessage","Error","message","onSubmit","layoutClass","layout","_el$","_$getNextElement","_tmpl$4","_el$12","firstChild","_el$13","_co$3","_$getNextMarker","nextSibling","_el$3","_el$4","_el$10","_el$11","_co$2","_el$7","_el$8","_el$0","_el$1","_co$","_$insert","_$createComponent","Show","when","title","children","_el$2","_tmpl$","addEventListener","For","each","FormFieldRenderer","onChange","disabled","_el$5","_tmpl$2","_el$6","_c$","_$memo","_tmpl$5","submitLabel","showReset","_el$9","_tmpl$3","$$click","_$effect","_$setProperty","_$runHydrationEvents","_p$","_v$","_v$2","_$className","t","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"FormRenderer.js","sources":["../../src/components/FormRenderer.tsx"],"sourcesContent":["/**\n * FormRenderer - Main form component\n * Sprint 1: Form Foundation\n * Sprint 2: Conditional field visibility (showWhen)\n * Sprint 4: Form state persistence\n */\n\nimport { Component, createSignal, For, Show, onMount, createEffect, onCleanup } from 'solid-js'\nimport { FormFieldRenderer } from './FormFieldRenderer'\nimport type { UIComponent, FormComponentParams, FormFieldParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { validateFormData } from '../services/validation'\nimport { evaluateCondition } from '../hooks/useConditionalField'\nimport { useFormPersistence } from '../hooks/useFormPersistence'\n\nexport interface FormRendererProps {\n component: UIComponent\n onSubmit?: (data: Record<string, any>) => void\n onError?: (errors: Record<string, string>) => void\n}\n\n/**\n * Get default value for a field type\n */\nfunction getFieldDefault(type: FormFieldParams['type']): any {\n switch (type) {\n case 'checkbox':\n return false\n case 'number':\n return undefined\n case 'select':\n case 'radio':\n return ''\n default:\n return ''\n }\n}\n\nexport const FormRenderer: Component<FormRendererProps> = (props) => {\n const params = () => props.component.params as FormComponentParams\n const [formData, setFormData] = createSignal<Record<string, any>>({})\n const [errors, setErrors] = createSignal<Record<string, string>>({})\n const [isSubmitting, setIsSubmitting] = createSignal(false)\n const { execute } = useAction()\n\n // Form persistence (Sprint 4)\n let clearPersisted: (() => void) | undefined\n\n /**\n * Get fields that are currently visible based on showWhen conditions\n */\n const getVisibleFields = (): FormFieldParams[] => {\n return params().fields.filter((field) => {\n if (!field.showWhen) return true\n return evaluateCondition(field.showWhen, formData())\n })\n }\n\n // Auto-submit countdown state (v4.2.0)\n const [countdown, setCountdown] = createSignal<number | null>(null)\n let countdownTimer: ReturnType<typeof setInterval> | null = null\n const [userInteracted, setUserInteracted] = createSignal(false)\n\n const cancelCountdown = () => {\n if (countdownTimer) {\n clearInterval(countdownTimer)\n countdownTimer = null\n }\n setCountdown(null)\n }\n\n const handleUserInteraction = () => {\n if (!userInteracted()) {\n setUserInteracted(true)\n cancelCountdown()\n }\n }\n\n onCleanup(() => cancelCountdown())\n\n /**\n * Check if all required fields have prefill values\n */\n const allRequiredPrefilled = (): boolean => {\n return params().fields\n .filter((f) => f.required)\n .every((f) => f.prefill != null)\n }\n\n // Initialize form data with default values, applying prefill (v4.2.0)\n const initializeForm = (clearStorage = false) => {\n const initial: Record<string, any> = {}\n for (const field of params().fields) {\n // prefill takes priority over defaultValue\n initial[field.name] = field.prefill ?? field.defaultValue ?? getFieldDefault(field.type)\n }\n setFormData(initial)\n setErrors({})\n\n // Clear persisted data if requested\n if (clearStorage && clearPersisted) {\n clearPersisted()\n }\n }\n\n // Initialize on mount\n onMount(() => {\n initializeForm()\n })\n\n // Setup persistence if persistKey is provided (Sprint 4)\n createEffect(() => {\n const persistKey = params().persistKey\n if (persistKey) {\n const persistence = useFormPersistence({\n persistKey,\n formData,\n setFormData,\n excludeFields: params().excludeFromPersistence,\n expiresIn: params().persistExpiresIn,\n })\n clearPersisted = persistence.clearPersisted\n }\n })\n\n // Auto-submit countdown (v4.2.0)\n createEffect(() => {\n const delay = params().autoSubmitDelay\n if (!delay || !allRequiredPrefilled() || userInteracted()) return\n\n let remaining = Math.ceil(delay / 1000)\n setCountdown(remaining)\n\n countdownTimer = setInterval(() => {\n remaining--\n if (remaining <= 0) {\n cancelCountdown()\n // Trigger submit programmatically\n const form = document.querySelector(`#form-${props.component.id}`) as HTMLFormElement | null\n if (form) form.requestSubmit()\n } else {\n setCountdown(remaining)\n }\n }, 1000)\n })\n\n const handleFieldChange = (name: string, value: any) => {\n handleUserInteraction()\n setFormData((prev) => ({ ...prev, [name]: value }))\n // Clear error on change\n if (errors()[name]) {\n setErrors((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [name]: _removed, ...rest } = prev\n return rest\n })\n }\n }\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setIsSubmitting(true)\n setErrors({})\n\n // Get only visible fields for validation and submission\n const visibleFields = getVisibleFields()\n const visibleFieldNames = new Set(visibleFields.map((f) => f.name))\n\n // Filter form data to only include visible fields\n const visibleFormData: Record<string, any> = {}\n for (const [key, value] of Object.entries(formData())) {\n if (visibleFieldNames.has(key)) {\n visibleFormData[key] = value\n }\n }\n\n // Validate only visible fields\n const validationResult = validateFormData(visibleFormData, visibleFields)\n if (!validationResult.valid) {\n setErrors(validationResult.errors)\n setIsSubmitting(false)\n props.onError?.(validationResult.errors)\n return\n }\n\n // Submit via tool call if specified\n if (params().submitAction?.toolName) {\n try {\n const result = await execute(params().submitAction!.toolName, {\n ...params().submitAction!.params,\n formData: visibleFormData,\n })\n if (!result.success) {\n setErrors({ _form: result.error || 'Submission failed' })\n setIsSubmitting(false)\n props.onError?.({ _form: result.error || 'Submission failed' })\n return\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed'\n setErrors({ _form: errorMessage })\n setIsSubmitting(false)\n props.onError?.({ _form: errorMessage })\n return\n }\n }\n\n // Clear persisted data on successful submit\n if (clearPersisted) {\n clearPersisted()\n }\n\n props.onSubmit?.(visibleFormData)\n setIsSubmitting(false)\n }\n\n const layoutClass = () => {\n switch (params().layout) {\n case 'horizontal':\n return 'grid grid-cols-2 gap-4'\n case 'inline':\n return 'flex flex-wrap gap-4 items-end'\n default:\n return 'space-y-4'\n }\n }\n\n return (\n <div class=\"w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <Show when={params().title}>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n {params().title}\n </h3>\n </Show>\n\n <form id={`form-${props.component.id}`} onSubmit={handleSubmit} noValidate>\n <div class={layoutClass()}>\n <For each={params().fields}>\n {(field) => (\n <FormFieldRenderer\n field={field}\n value={formData()[field.name]}\n error={errors()[field.name]}\n onChange={(value) => handleFieldChange(field.name, value)}\n disabled={isSubmitting() || field.disabled}\n formData={formData}\n />\n )}\n </For>\n </div>\n\n <Show when={errors()._form}>\n <div class=\"mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md\">\n <p class=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {errors()._form}\n </p>\n </div>\n </Show>\n\n {/* Auto-submit countdown (v4.2.0) */}\n <Show when={countdown() != null}>\n <div class=\"mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md\">\n <span class=\"text-sm text-blue-700 dark:text-blue-300\">\n {params().submitLabel || 'Submit'} in {countdown()}s...\n </span>\n <button\n type=\"button\"\n onClick={() => { cancelCountdown(); setUserInteracted(true) }}\n class=\"text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200\"\n >\n Cancel\n </button>\n </div>\n </Show>\n\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"submit\"\n disabled={isSubmitting()}\n class=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting() ? (\n <span class=\"flex items-center gap-2\">\n <span class=\"animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full\" />\n Submitting...\n </span>\n ) : (\n params().submitLabel || 'Submit'\n )}\n </button>\n <Show when={params().showReset}>\n <button\n type=\"button\"\n onClick={() => initializeForm(true)}\n disabled={isSubmitting()}\n class=\"px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Reset\n </button>\n </Show>\n </div>\n </form>\n </div>\n )\n}\n"],"names":["getFieldDefault","type","undefined","FormRenderer","props","params","component","formData","setFormData","createSignal","errors","setErrors","isSubmitting","setIsSubmitting","execute","useAction","clearPersisted","getVisibleFields","fields","filter","field","showWhen","evaluateCondition","countdown","setCountdown","countdownTimer","userInteracted","setUserInteracted","cancelCountdown","clearInterval","handleUserInteraction","onCleanup","allRequiredPrefilled","f","required","every","prefill","initializeForm","clearStorage","initial","name","defaultValue","onMount","createEffect","persistKey","persistence","useFormPersistence","excludeFields","excludeFromPersistence","expiresIn","persistExpiresIn","delay","autoSubmitDelay","remaining","Math","ceil","setInterval","form","document","querySelector","id","requestSubmit","handleFieldChange","value","prev","_removed","rest","handleSubmit","e","preventDefault","visibleFields","visibleFieldNames","Set","map","visibleFormData","key","Object","entries","has","validationResult","validateFormData","valid","onError","submitAction","toolName","result","success","_form","error","errorMessage","Error","message","onSubmit","layoutClass","layout","_el$","_$getNextElement","_tmpl$5","_el$23","firstChild","_el$24","_co$6","_$getNextMarker","nextSibling","_el$3","_el$4","_el$19","_el$20","_co$4","_el$21","_el$22","_co$5","_el$14","_el$15","_el$17","_el$18","_co$3","_$insert","_$createComponent","Show","when","title","children","_el$2","_tmpl$","addEventListener","For","each","FormFieldRenderer","onChange","disabled","_el$5","_tmpl$2","_el$6","_el$7","_tmpl$3","_el$8","_el$1","_el$10","_co$","_el$9","_el$11","_el$12","_co$2","_el$13","submitLabel","$$click","_$runHydrationEvents","_c$","_$memo","_tmpl$6","showReset","_el$16","_tmpl$4","_$effect","_$setProperty","_p$","_v$","_v$2","_v$3","_$setAttribute","t","_$className","a","_$delegateEvents"],"mappings":"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"}