@seed-ship/mcp-ui-solid 2.0.0 → 2.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.
Files changed (140) hide show
  1. package/README.md +50 -1
  2. package/dist/components/AutocompleteDropdown.cjs +201 -0
  3. package/dist/components/AutocompleteDropdown.cjs.map +1 -0
  4. package/dist/components/AutocompleteDropdown.d.ts +71 -0
  5. package/dist/components/AutocompleteDropdown.d.ts.map +1 -0
  6. package/dist/components/AutocompleteDropdown.js +201 -0
  7. package/dist/components/AutocompleteDropdown.js.map +1 -0
  8. package/dist/components/AutocompleteFormField.cjs +289 -0
  9. package/dist/components/AutocompleteFormField.cjs.map +1 -0
  10. package/dist/components/AutocompleteFormField.d.ts +52 -0
  11. package/dist/components/AutocompleteFormField.d.ts.map +1 -0
  12. package/dist/components/AutocompleteFormField.js +289 -0
  13. package/dist/components/AutocompleteFormField.js.map +1 -0
  14. package/dist/components/DraggableGridItem.cjs +133 -0
  15. package/dist/components/DraggableGridItem.cjs.map +1 -0
  16. package/dist/components/DraggableGridItem.d.ts +95 -0
  17. package/dist/components/DraggableGridItem.d.ts.map +1 -0
  18. package/dist/components/DraggableGridItem.js +133 -0
  19. package/dist/components/DraggableGridItem.js.map +1 -0
  20. package/dist/components/EditableUIResourceRenderer.cjs +203 -0
  21. package/dist/components/EditableUIResourceRenderer.cjs.map +1 -0
  22. package/dist/components/EditableUIResourceRenderer.d.ts +43 -0
  23. package/dist/components/EditableUIResourceRenderer.d.ts.map +1 -0
  24. package/dist/components/EditableUIResourceRenderer.js +203 -0
  25. package/dist/components/EditableUIResourceRenderer.js.map +1 -0
  26. package/dist/components/GhostText.cjs +105 -0
  27. package/dist/components/GhostText.cjs.map +1 -0
  28. package/dist/components/GhostText.d.ts +113 -0
  29. package/dist/components/GhostText.d.ts.map +1 -0
  30. package/dist/components/GhostText.js +105 -0
  31. package/dist/components/GhostText.js.map +1 -0
  32. package/dist/components/ResizeHandle.cjs +173 -0
  33. package/dist/components/ResizeHandle.cjs.map +1 -0
  34. package/dist/components/ResizeHandle.d.ts +50 -0
  35. package/dist/components/ResizeHandle.d.ts.map +1 -0
  36. package/dist/components/ResizeHandle.js +173 -0
  37. package/dist/components/ResizeHandle.js.map +1 -0
  38. package/dist/context/AutocompleteContext.cjs +158 -0
  39. package/dist/context/AutocompleteContext.cjs.map +1 -0
  40. package/dist/context/AutocompleteContext.d.ts +77 -0
  41. package/dist/context/AutocompleteContext.d.ts.map +1 -0
  42. package/dist/context/AutocompleteContext.js +158 -0
  43. package/dist/context/AutocompleteContext.js.map +1 -0
  44. package/dist/hooks/index.d.ts +6 -0
  45. package/dist/hooks/index.d.ts.map +1 -1
  46. package/dist/hooks/useAutocomplete.cjs +234 -0
  47. package/dist/hooks/useAutocomplete.cjs.map +1 -0
  48. package/dist/hooks/useAutocomplete.d.ts +119 -0
  49. package/dist/hooks/useAutocomplete.d.ts.map +1 -0
  50. package/dist/hooks/useAutocomplete.js +234 -0
  51. package/dist/hooks/useAutocomplete.js.map +1 -0
  52. package/dist/hooks/useDragDrop.cjs +170 -0
  53. package/dist/hooks/useDragDrop.cjs.map +1 -0
  54. package/dist/hooks/useDragDrop.d.ts +100 -0
  55. package/dist/hooks/useDragDrop.d.ts.map +1 -0
  56. package/dist/hooks/useDragDrop.js +170 -0
  57. package/dist/hooks/useDragDrop.js.map +1 -0
  58. package/dist/hooks/useResize.cjs +209 -0
  59. package/dist/hooks/useResize.cjs.map +1 -0
  60. package/dist/hooks/useResize.d.ts +87 -0
  61. package/dist/hooks/useResize.d.ts.map +1 -0
  62. package/dist/hooks/useResize.js +209 -0
  63. package/dist/hooks/useResize.js.map +1 -0
  64. package/dist/hooks.cjs +6 -0
  65. package/dist/hooks.cjs.map +1 -1
  66. package/dist/hooks.d.cts +6 -0
  67. package/dist/hooks.d.ts +6 -0
  68. package/dist/hooks.js +6 -0
  69. package/dist/hooks.js.map +1 -1
  70. package/dist/index.cjs +29 -0
  71. package/dist/index.cjs.map +1 -1
  72. package/dist/index.d.cts +18 -3
  73. package/dist/index.d.ts +18 -3
  74. package/dist/index.d.ts.map +1 -1
  75. package/dist/index.js +29 -0
  76. package/dist/index.js.map +1 -1
  77. package/dist/plugins/duckdb.cjs +192 -0
  78. package/dist/plugins/duckdb.cjs.map +1 -0
  79. package/dist/plugins/duckdb.d.ts +20 -0
  80. package/dist/plugins/duckdb.d.ts.map +1 -0
  81. package/dist/plugins/duckdb.js +170 -0
  82. package/dist/plugins/duckdb.js.map +1 -0
  83. package/dist/plugins/groq.cjs +97 -0
  84. package/dist/plugins/groq.cjs.map +1 -0
  85. package/dist/plugins/groq.d.ts +13 -0
  86. package/dist/plugins/groq.d.ts.map +1 -0
  87. package/dist/plugins/groq.js +97 -0
  88. package/dist/plugins/groq.js.map +1 -0
  89. package/dist/plugins/index.d.ts +10 -0
  90. package/dist/plugins/index.d.ts.map +1 -0
  91. package/dist/plugins/rest.cjs +92 -0
  92. package/dist/plugins/rest.cjs.map +1 -0
  93. package/dist/plugins/rest.d.ts +13 -0
  94. package/dist/plugins/rest.d.ts.map +1 -0
  95. package/dist/plugins/rest.js +92 -0
  96. package/dist/plugins/rest.js.map +1 -0
  97. package/dist/plugins/supabase.cjs +79 -0
  98. package/dist/plugins/supabase.cjs.map +1 -0
  99. package/dist/plugins/supabase.d.ts +13 -0
  100. package/dist/plugins/supabase.d.ts.map +1 -0
  101. package/dist/plugins/supabase.js +79 -0
  102. package/dist/plugins/supabase.js.map +1 -0
  103. package/dist/services/validation.cjs +40 -1
  104. package/dist/services/validation.cjs.map +1 -1
  105. package/dist/services/validation.d.ts.map +1 -1
  106. package/dist/services/validation.js +40 -1
  107. package/dist/services/validation.js.map +1 -1
  108. package/dist/types/index.d.ts +430 -0
  109. package/dist/types/index.d.ts.map +1 -1
  110. package/dist/types.d.cts +430 -0
  111. package/dist/types.d.ts +430 -0
  112. package/package.json +16 -1
  113. package/src/components/AutocompleteDropdown.tsx +329 -0
  114. package/src/components/AutocompleteFormField.tsx +288 -0
  115. package/src/components/DraggableGridItem.tsx +274 -0
  116. package/src/components/EditableUIResourceRenderer.tsx +273 -0
  117. package/src/components/GhostText.tsx +262 -0
  118. package/src/components/ResizeHandle.tsx +262 -0
  119. package/src/context/AutocompleteContext.tsx +317 -0
  120. package/src/hooks/index.ts +23 -0
  121. package/src/hooks/useAutocomplete.test.ts +334 -0
  122. package/src/hooks/useAutocomplete.ts +466 -0
  123. package/src/hooks/useDragDrop.test.ts +355 -0
  124. package/src/hooks/useDragDrop.ts +379 -0
  125. package/src/hooks/useResize.test.ts +313 -0
  126. package/src/hooks/useResize.ts +372 -0
  127. package/src/index.ts +71 -0
  128. package/src/plugins/duckdb.ts +269 -0
  129. package/src/plugins/groq.ts +137 -0
  130. package/src/plugins/index.ts +14 -0
  131. package/src/plugins/rest.ts +147 -0
  132. package/src/plugins/supabase.ts +120 -0
  133. package/src/services/validation.ts +46 -0
  134. package/src/styles/autocomplete.css +356 -0
  135. package/src/styles/drag-drop.css +297 -0
  136. package/src/styles/index.css +7 -0
  137. package/src/types/index.ts +529 -0
  138. package/src/vite-env.d.ts +18 -0
  139. package/tsconfig.tsbuildinfo +1 -1
  140. package/vite.config.ts +2 -0
@@ -0,0 +1,289 @@
1
+ import { delegateEvents, createComponent, getNextElement, template, getNextMarker, insert, effect, setAttribute, setProperty, className, runHydrationEvents, memo } from "solid-js/web";
2
+ import { createSignal, createEffect, on, createMemo, Show } from "solid-js";
3
+ import { useConditionalField } from "../hooks/useConditionalField.js";
4
+ import { useAutocomplete } from "../hooks/useAutocomplete.js";
5
+ import { useAutocompleteContextSafe } from "../context/AutocompleteContext.js";
6
+ import { GhostText } from "./GhostText.js";
7
+ import { AutocompleteDropdown } from "./AutocompleteDropdown.js";
8
+ var _tmpl$ = /* @__PURE__ */ template(`<span class="text-red-500 ml-1"aria-hidden=true>*`), _tmpl$2 = /* @__PURE__ */ template(`<label class="block text-sm font-medium text-gray-700 dark:text-gray-300"><!$><!/><!$><!/>`), _tmpl$3 = /* @__PURE__ */ template(`<div class=relative><!$><!/><input aria-autocomplete=list aria-haspopup=listbox autocomplete=off style=position:relative;z-index:2><!$><!/>`), _tmpl$4 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400">`), _tmpl$5 = /* @__PURE__ */ template(`<p role=alert class="text-xs text-red-600 dark:text-red-400">`), _tmpl$6 = /* @__PURE__ */ template(`<div class=space-y-1><!$><!/><div class=relative></div><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<input>`);
9
+ const AutocompleteFormField = (props) => {
10
+ var _a, _b, _c, _d;
11
+ const autocompleteCtx = useAutocompleteContextSafe();
12
+ const {
13
+ isVisible
14
+ } = useConditionalField({
15
+ condition: props.field.showWhen,
16
+ formData: props.formData || (() => ({}))
17
+ });
18
+ const [localValue, setLocalValue] = createSignal(String(props.value || ""));
19
+ createEffect(on(() => props.value, (newValue) => {
20
+ setLocalValue(String(newValue || ""));
21
+ }));
22
+ const autocompleteContext = createMemo(() => {
23
+ var _a2, _b2;
24
+ const formData = (_a2 = props.formData) == null ? void 0 : _a2.call(props);
25
+ const config = props.field.autocomplete;
26
+ if (!((_b2 = config == null ? void 0 : config.contextFields) == null ? void 0 : _b2.length) && !formData) {
27
+ return {
28
+ fieldName: props.field.name
29
+ };
30
+ }
31
+ const contextData = {};
32
+ if ((config == null ? void 0 : config.contextFields) && formData) {
33
+ config.contextFields.forEach((field) => {
34
+ if (formData[field] !== void 0) {
35
+ contextData[field] = formData[field];
36
+ }
37
+ });
38
+ }
39
+ return {
40
+ fieldName: props.field.name,
41
+ formData: contextData
42
+ };
43
+ });
44
+ const autocomplete = useAutocomplete({
45
+ inputValue: localValue,
46
+ pluginId: (_a = props.field.autocomplete) == null ? void 0 : _a.plugin,
47
+ fieldConfig: props.field.autocomplete,
48
+ context: () => autocompleteContext() || {
49
+ fieldName: props.field.name
50
+ },
51
+ enabled: !!(((_b = props.field.autocomplete) == null ? void 0 : _b.enabled) && autocompleteCtx),
52
+ minChars: (_c = props.field.autocomplete) == null ? void 0 : _c.minChars,
53
+ debounceMs: (_d = props.field.autocomplete) == null ? void 0 : _d.debounceMs,
54
+ onInputChange: (value) => {
55
+ setLocalValue(value);
56
+ props.onChange(value);
57
+ }
58
+ });
59
+ const handleInput = (value) => {
60
+ setLocalValue(value);
61
+ props.onChange(value);
62
+ };
63
+ const handleKeyDown = (e) => {
64
+ if (autocomplete.handleKeyDown(e)) {
65
+ return;
66
+ }
67
+ };
68
+ const baseInputClass = () => `
69
+ w-full px-3 py-2 border rounded-md
70
+ focus:ring-2 focus:ring-blue-500 focus:border-blue-500
71
+ disabled:bg-gray-100 disabled:cursor-not-allowed
72
+ ${props.error ? "border-red-500 focus:ring-red-500" : "border-gray-300 dark:border-gray-600"}
73
+ dark:bg-gray-700 dark:text-white
74
+ `;
75
+ const fieldId = () => `field-${props.field.name}`;
76
+ const errorId = () => `${props.field.name}-error`;
77
+ const supportsAutocomplete = createMemo(() => ["text", "email"].includes(props.field.type));
78
+ const showAutocomplete = createMemo(() => {
79
+ var _a2;
80
+ return supportsAutocomplete() && ((_a2 = props.field.autocomplete) == null ? void 0 : _a2.enabled) && autocompleteCtx !== void 0;
81
+ });
82
+ return createComponent(Show, {
83
+ get when() {
84
+ return isVisible();
85
+ },
86
+ get children() {
87
+ var _el$ = getNextElement(_tmpl$6), _el$15 = _el$.firstChild, [_el$16, _co$5] = getNextMarker(_el$15.nextSibling), _el$8 = _el$16.nextSibling, _el$17 = _el$8.nextSibling, [_el$18, _co$6] = getNextMarker(_el$17.nextSibling), _el$19 = _el$18.nextSibling, [_el$20, _co$7] = getNextMarker(_el$19.nextSibling);
88
+ insert(_el$, createComponent(Show, {
89
+ get when() {
90
+ return props.field.label;
91
+ },
92
+ get children() {
93
+ var _el$2 = getNextElement(_tmpl$2), _el$4 = _el$2.firstChild, [_el$5, _co$] = getNextMarker(_el$4.nextSibling), _el$6 = _el$5.nextSibling, [_el$7, _co$2] = getNextMarker(_el$6.nextSibling);
94
+ insert(_el$2, () => props.field.label, _el$5, _co$);
95
+ insert(_el$2, createComponent(Show, {
96
+ get when() {
97
+ return props.field.required;
98
+ },
99
+ get children() {
100
+ return getNextElement(_tmpl$);
101
+ }
102
+ }), _el$7, _co$2);
103
+ effect(() => setAttribute(_el$2, "for", fieldId()));
104
+ return _el$2;
105
+ }
106
+ }), _el$16, _co$5);
107
+ insert(_el$8, createComponent(Show, {
108
+ get when() {
109
+ return showAutocomplete();
110
+ },
111
+ get fallback() {
112
+ return (
113
+ /* Standard input without autocomplete */
114
+ (() => {
115
+ var _el$21 = getNextElement(_tmpl$7);
116
+ _el$21.$$input = (e) => props.onChange(e.currentTarget.value);
117
+ effect((_p$) => {
118
+ var _v$12 = fieldId(), _v$13 = props.field.type, _v$14 = props.field.name, _v$15 = props.field.placeholder, _v$16 = props.disabled, _v$17 = props.field.required, _v$18 = props.field.minLength, _v$19 = props.field.maxLength, _v$20 = props.field.pattern, _v$21 = !!props.error, _v$22 = props.error ? errorId() : void 0, _v$23 = baseInputClass();
119
+ _v$12 !== _p$.e && setAttribute(_el$21, "id", _p$.e = _v$12);
120
+ _v$13 !== _p$.t && setAttribute(_el$21, "type", _p$.t = _v$13);
121
+ _v$14 !== _p$.a && setAttribute(_el$21, "name", _p$.a = _v$14);
122
+ _v$15 !== _p$.o && setAttribute(_el$21, "placeholder", _p$.o = _v$15);
123
+ _v$16 !== _p$.i && setProperty(_el$21, "disabled", _p$.i = _v$16);
124
+ _v$17 !== _p$.n && setProperty(_el$21, "required", _p$.n = _v$17);
125
+ _v$18 !== _p$.s && setAttribute(_el$21, "minlength", _p$.s = _v$18);
126
+ _v$19 !== _p$.h && setAttribute(_el$21, "maxlength", _p$.h = _v$19);
127
+ _v$20 !== _p$.r && setAttribute(_el$21, "pattern", _p$.r = _v$20);
128
+ _v$21 !== _p$.d && setAttribute(_el$21, "aria-invalid", _p$.d = _v$21);
129
+ _v$22 !== _p$.l && setAttribute(_el$21, "aria-describedby", _p$.l = _v$22);
130
+ _v$23 !== _p$.u && className(_el$21, _p$.u = _v$23);
131
+ return _p$;
132
+ }, {
133
+ e: void 0,
134
+ t: void 0,
135
+ a: void 0,
136
+ o: void 0,
137
+ i: void 0,
138
+ n: void 0,
139
+ s: void 0,
140
+ h: void 0,
141
+ r: void 0,
142
+ d: void 0,
143
+ l: void 0,
144
+ u: void 0
145
+ });
146
+ effect(() => setProperty(_el$21, "value", props.value || ""));
147
+ runHydrationEvents();
148
+ return _el$21;
149
+ })()
150
+ );
151
+ },
152
+ get children() {
153
+ var _el$9 = getNextElement(_tmpl$3), _el$1 = _el$9.firstChild, [_el$10, _co$3] = getNextMarker(_el$1.nextSibling), _el$0 = _el$10.nextSibling, _el$11 = _el$0.nextSibling, [_el$12, _co$4] = getNextMarker(_el$11.nextSibling);
154
+ insert(_el$9, createComponent(Show, {
155
+ get when() {
156
+ return autocomplete.resultType() === "completion";
157
+ },
158
+ get children() {
159
+ return createComponent(GhostText, {
160
+ get inputValue() {
161
+ return localValue();
162
+ },
163
+ get ghostText() {
164
+ return autocomplete.ghostText();
165
+ },
166
+ get visible() {
167
+ return autocomplete.isOpen();
168
+ },
169
+ get hintText() {
170
+ return autocomplete.ghostText() ? "Tab to accept" : void 0;
171
+ },
172
+ get isLoading() {
173
+ return autocomplete.isLoading();
174
+ }
175
+ });
176
+ }
177
+ }), _el$10, _co$3);
178
+ _el$0.addEventListener("focus", () => {
179
+ var _a2;
180
+ if (localValue().length >= (((_a2 = props.field.autocomplete) == null ? void 0 : _a2.minChars) || 1)) {
181
+ autocomplete.open();
182
+ }
183
+ });
184
+ _el$0.addEventListener("blur", () => {
185
+ setTimeout(() => autocomplete.dismiss(), 150);
186
+ });
187
+ _el$0.$$keydown = handleKeyDown;
188
+ _el$0.$$input = (e) => handleInput(e.currentTarget.value);
189
+ insert(_el$9, createComponent(Show, {
190
+ get when() {
191
+ return autocomplete.resultType() === "options";
192
+ },
193
+ get children() {
194
+ return createComponent(AutocompleteDropdown, {
195
+ get options() {
196
+ return autocomplete.options();
197
+ },
198
+ get selectedIndex() {
199
+ return autocomplete.selectedIndex();
200
+ },
201
+ get isOpen() {
202
+ return autocomplete.isOpen();
203
+ },
204
+ get isLoading() {
205
+ return autocomplete.isLoading();
206
+ },
207
+ onSelect: (option) => {
208
+ handleInput(option.value);
209
+ autocomplete.dismiss();
210
+ },
211
+ onHover: (_index) => {
212
+ },
213
+ get highlightMatch() {
214
+ return localValue();
215
+ },
216
+ get loadingMessage() {
217
+ var _a2;
218
+ return (_a2 = props.field.autocomplete) == null ? void 0 : _a2.loadingPlaceholder;
219
+ }
220
+ });
221
+ }
222
+ }), _el$12, _co$4);
223
+ effect((_p$) => {
224
+ var _v$ = fieldId(), _v$2 = props.field.type, _v$3 = props.field.name, _v$4 = props.field.placeholder, _v$5 = props.disabled, _v$6 = props.field.required, _v$7 = props.field.minLength, _v$8 = props.field.maxLength, _v$9 = props.field.pattern, _v$0 = !!props.error, _v$1 = props.error ? errorId() : void 0, _v$10 = autocomplete.isOpen(), _v$11 = `${baseInputClass()} ${autocomplete.resultType() === "completion" ? "bg-transparent" : ""}`;
225
+ _v$ !== _p$.e && setAttribute(_el$0, "id", _p$.e = _v$);
226
+ _v$2 !== _p$.t && setAttribute(_el$0, "type", _p$.t = _v$2);
227
+ _v$3 !== _p$.a && setAttribute(_el$0, "name", _p$.a = _v$3);
228
+ _v$4 !== _p$.o && setAttribute(_el$0, "placeholder", _p$.o = _v$4);
229
+ _v$5 !== _p$.i && setProperty(_el$0, "disabled", _p$.i = _v$5);
230
+ _v$6 !== _p$.n && setProperty(_el$0, "required", _p$.n = _v$6);
231
+ _v$7 !== _p$.s && setAttribute(_el$0, "minlength", _p$.s = _v$7);
232
+ _v$8 !== _p$.h && setAttribute(_el$0, "maxlength", _p$.h = _v$8);
233
+ _v$9 !== _p$.r && setAttribute(_el$0, "pattern", _p$.r = _v$9);
234
+ _v$0 !== _p$.d && setAttribute(_el$0, "aria-invalid", _p$.d = _v$0);
235
+ _v$1 !== _p$.l && setAttribute(_el$0, "aria-describedby", _p$.l = _v$1);
236
+ _v$10 !== _p$.u && setAttribute(_el$0, "aria-expanded", _p$.u = _v$10);
237
+ _v$11 !== _p$.c && className(_el$0, _p$.c = _v$11);
238
+ return _p$;
239
+ }, {
240
+ e: void 0,
241
+ t: void 0,
242
+ a: void 0,
243
+ o: void 0,
244
+ i: void 0,
245
+ n: void 0,
246
+ s: void 0,
247
+ h: void 0,
248
+ r: void 0,
249
+ d: void 0,
250
+ l: void 0,
251
+ u: void 0,
252
+ c: void 0
253
+ });
254
+ effect(() => setProperty(_el$0, "value", localValue()));
255
+ runHydrationEvents();
256
+ return _el$9;
257
+ }
258
+ }));
259
+ insert(_el$, createComponent(Show, {
260
+ get when() {
261
+ return memo(() => !!props.field.helpText)() && !props.error;
262
+ },
263
+ get children() {
264
+ var _el$13 = getNextElement(_tmpl$4);
265
+ insert(_el$13, () => props.field.helpText);
266
+ return _el$13;
267
+ }
268
+ }), _el$18, _co$6);
269
+ insert(_el$, createComponent(Show, {
270
+ get when() {
271
+ return props.error;
272
+ },
273
+ get children() {
274
+ var _el$14 = getNextElement(_tmpl$5);
275
+ insert(_el$14, () => props.error);
276
+ effect(() => setAttribute(_el$14, "id", errorId()));
277
+ return _el$14;
278
+ }
279
+ }), _el$20, _co$7);
280
+ return _el$;
281
+ }
282
+ });
283
+ };
284
+ delegateEvents(["input", "keydown"]);
285
+ export {
286
+ AutocompleteFormField,
287
+ AutocompleteFormField as default
288
+ };
289
+ //# sourceMappingURL=AutocompleteFormField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutocompleteFormField.js","sources":["../../src/components/AutocompleteFormField.tsx"],"sourcesContent":["/**\n * AutocompleteFormField Component\n * Form field with integrated autocomplete support\n *\n * Sprint Autocomplete Feature\n */\n\nimport { Component, Show, createSignal, createMemo, Accessor, createEffect, on } from 'solid-js'\nimport type { FormFieldParams, FieldAutocompleteConfig, AutocompleteContext } from '../types'\nimport { useConditionalField } from '../hooks/useConditionalField'\nimport { useAutocomplete } from '../hooks/useAutocomplete'\nimport { useAutocompleteContextSafe } from '../context/AutocompleteContext'\nimport { GhostText } from './GhostText'\nimport { AutocompleteDropdown } from './AutocompleteDropdown'\n\n/**\n * Extended FormFieldParams with autocomplete config\n */\nexport interface AutocompleteFormFieldParams extends FormFieldParams {\n /**\n * Autocomplete configuration for this field\n */\n autocomplete?: FieldAutocompleteConfig\n}\n\n/**\n * Props for AutocompleteFormField\n */\nexport interface AutocompleteFormFieldProps {\n /**\n * Field configuration\n */\n field: AutocompleteFormFieldParams\n\n /**\n * Current field value\n */\n value: any\n\n /**\n * Error message\n */\n error?: string\n\n /**\n * Change handler\n */\n onChange: (value: any) => void\n\n /**\n * Whether field is disabled\n */\n disabled?: boolean\n\n /**\n * Form data accessor for conditional visibility and context\n */\n formData?: Accessor<Record<string, any>>\n}\n\n/**\n * AutocompleteFormField Component\n */\nexport const AutocompleteFormField: Component<AutocompleteFormFieldProps> = (props) => {\n // Check if autocomplete context is available\n const autocompleteCtx = useAutocompleteContextSafe()\n\n // Conditional visibility\n const { isVisible } = useConditionalField({\n condition: props.field.showWhen,\n formData: props.formData || (() => ({}))\n })\n\n // Local input value for autocomplete (may differ during suggestion)\n const [localValue, setLocalValue] = createSignal(String(props.value || ''))\n\n // Sync external value changes\n createEffect(on(() => props.value, (newValue) => {\n setLocalValue(String(newValue || ''))\n }))\n\n // Build autocomplete context\n const autocompleteContext = createMemo((): AutocompleteContext | undefined => {\n const formData = props.formData?.()\n const config = props.field.autocomplete\n\n if (!config?.contextFields?.length && !formData) {\n return { fieldName: props.field.name }\n }\n\n const contextData: Record<string, any> = {}\n if (config?.contextFields && formData) {\n config.contextFields.forEach(field => {\n if (formData[field] !== undefined) {\n contextData[field] = formData[field]\n }\n })\n }\n\n return {\n fieldName: props.field.name,\n formData: contextData\n }\n })\n\n // Initialize autocomplete hook\n const autocomplete = useAutocomplete({\n inputValue: localValue,\n pluginId: props.field.autocomplete?.plugin,\n fieldConfig: props.field.autocomplete,\n context: () => autocompleteContext() || { fieldName: props.field.name },\n enabled: !!(props.field.autocomplete?.enabled && autocompleteCtx),\n minChars: props.field.autocomplete?.minChars,\n debounceMs: props.field.autocomplete?.debounceMs,\n onInputChange: (value) => {\n setLocalValue(value)\n props.onChange(value)\n }\n })\n\n // Handle input change\n const handleInput = (value: string) => {\n setLocalValue(value)\n props.onChange(value)\n }\n\n // Handle key down\n const handleKeyDown = (e: KeyboardEvent) => {\n if (autocomplete.handleKeyDown(e)) {\n return\n }\n }\n\n // Base input class\n const baseInputClass = () => `\n w-full px-3 py-2 border rounded-md\n focus:ring-2 focus:ring-blue-500 focus:border-blue-500\n disabled:bg-gray-100 disabled:cursor-not-allowed\n ${props.error\n ? 'border-red-500 focus:ring-red-500'\n : 'border-gray-300 dark:border-gray-600'}\n dark:bg-gray-700 dark:text-white\n `\n\n const fieldId = () => `field-${props.field.name}`\n const errorId = () => `${props.field.name}-error`\n\n // Check if field supports autocomplete (text-based fields only)\n const supportsAutocomplete = createMemo(() =>\n ['text', 'email'].includes(props.field.type)\n )\n\n // Whether to show autocomplete features\n const showAutocomplete = createMemo(() =>\n supportsAutocomplete() &&\n props.field.autocomplete?.enabled &&\n autocompleteCtx !== undefined\n )\n\n return (\n <Show when={isVisible()}>\n <div class=\"space-y-1\">\n {/* Label */}\n <Show when={props.field.label}>\n <label\n for={fieldId()}\n class=\"block text-sm font-medium text-gray-700 dark:text-gray-300\"\n >\n {props.field.label}\n <Show when={props.field.required}>\n <span class=\"text-red-500 ml-1\" aria-hidden=\"true\">*</span>\n </Show>\n </label>\n </Show>\n\n {/* Input with autocomplete */}\n <div class=\"relative\">\n <Show\n when={showAutocomplete()}\n fallback={\n /* Standard input without autocomplete */\n <input\n id={fieldId()}\n type={props.field.type}\n name={props.field.name}\n value={props.value || ''}\n onInput={(e) => props.onChange(e.currentTarget.value)}\n placeholder={props.field.placeholder}\n disabled={props.disabled}\n required={props.field.required}\n minLength={props.field.minLength}\n maxLength={props.field.maxLength}\n pattern={props.field.pattern}\n aria-invalid={!!props.error}\n aria-describedby={props.error ? errorId() : undefined}\n class={baseInputClass()}\n />\n }\n >\n {/* Autocomplete-enabled input */}\n <div class=\"relative\">\n {/* Ghost text overlay (for completion type) */}\n <Show when={autocomplete.resultType() === 'completion'}>\n <GhostText\n inputValue={localValue()}\n ghostText={autocomplete.ghostText()}\n visible={autocomplete.isOpen()}\n hintText={autocomplete.ghostText() ? 'Tab to accept' : undefined}\n isLoading={autocomplete.isLoading()}\n />\n </Show>\n\n <input\n id={fieldId()}\n type={props.field.type}\n name={props.field.name}\n value={localValue()}\n onInput={(e) => handleInput(e.currentTarget.value)}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n // Delay dismiss to allow click on dropdown\n setTimeout(() => autocomplete.dismiss(), 150)\n }}\n onFocus={() => {\n if (localValue().length >= (props.field.autocomplete?.minChars || 1)) {\n autocomplete.open()\n }\n }}\n placeholder={props.field.placeholder}\n disabled={props.disabled}\n required={props.field.required}\n minLength={props.field.minLength}\n maxLength={props.field.maxLength}\n pattern={props.field.pattern}\n aria-invalid={!!props.error}\n aria-describedby={props.error ? errorId() : undefined}\n aria-autocomplete=\"list\"\n aria-expanded={autocomplete.isOpen()}\n aria-haspopup=\"listbox\"\n class={`${baseInputClass()} ${autocomplete.resultType() === 'completion' ? 'bg-transparent' : ''}`}\n style={{\n position: 'relative',\n 'z-index': '2'\n }}\n autocomplete=\"off\"\n />\n\n {/* Dropdown (for options type) */}\n <Show when={autocomplete.resultType() === 'options'}>\n <AutocompleteDropdown\n options={autocomplete.options()}\n selectedIndex={autocomplete.selectedIndex()}\n isOpen={autocomplete.isOpen()}\n isLoading={autocomplete.isLoading()}\n onSelect={(option) => {\n handleInput(option.value)\n autocomplete.dismiss()\n }}\n onHover={(_index) => {\n // Could add hover selection here\n }}\n highlightMatch={localValue()}\n loadingMessage={props.field.autocomplete?.loadingPlaceholder}\n />\n </Show>\n </div>\n </Show>\n </div>\n\n {/* Help text */}\n <Show when={props.field.helpText && !props.error}>\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\n {props.field.helpText}\n </p>\n </Show>\n\n {/* Error message */}\n <Show when={props.error}>\n <p id={errorId()} role=\"alert\" class=\"text-xs text-red-600 dark:text-red-400\">\n {props.error}\n </p>\n </Show>\n </div>\n </Show>\n )\n}\n\nexport default AutocompleteFormField\n"],"names":["AutocompleteFormField","props","autocompleteCtx","useAutocompleteContextSafe","isVisible","useConditionalField","condition","field","showWhen","formData","localValue","setLocalValue","createSignal","String","value","createEffect","on","newValue","autocompleteContext","createMemo","config","autocomplete","contextFields","length","fieldName","name","contextData","forEach","undefined","useAutocomplete","inputValue","pluginId","plugin","fieldConfig","context","enabled","minChars","debounceMs","onInputChange","onChange","handleInput","handleKeyDown","e","baseInputClass","error","fieldId","errorId","supportsAutocomplete","includes","type","showAutocomplete","_$createComponent","Show","when","children","_el$","_$getNextElement","_tmpl$6","_el$15","firstChild","_el$16","_co$5","_$getNextMarker","nextSibling","_el$8","_el$17","_el$18","_co$6","_el$19","_el$20","_co$7","_$insert","label","_el$2","_tmpl$2","_el$4","_el$5","_co$","_el$6","_el$7","_co$2","required","_tmpl$","_$effect","_$setAttribute","fallback","_el$21","_tmpl$7","$$input","currentTarget","_p$","_v$12","_v$13","_v$14","_v$15","placeholder","_v$16","disabled","_v$17","_v$18","minLength","_v$19","maxLength","_v$20","pattern","_v$21","_v$22","_v$23","t","a","o","i","_$setProperty","n","s","h","r","d","l","u","_$className","_$runHydrationEvents","_el$9","_tmpl$3","_el$1","_el$10","_co$3","_el$0","_el$11","_el$12","_co$4","resultType","GhostText","ghostText","visible","isOpen","hintText","isLoading","addEventListener","open","setTimeout","dismiss","$$keydown","AutocompleteDropdown","options","selectedIndex","onSelect","option","onHover","_index","highlightMatch","loadingMessage","loadingPlaceholder","_v$","_v$2","_v$3","_v$4","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","_v$11","c","_$memo","helpText","_el$13","_tmpl$4","_el$14","_tmpl$5","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const web = require("solid-js/web");
4
+ const solidJs = require("solid-js");
5
+ const ResizeHandle = require("./ResizeHandle.cjs");
6
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div class=mcp-drag-handle style="position:absolute;top:4px;left:50%;transform:translateX(-50%);width:40px;height:4px;background-color:rgba(0, 0, 0, 0.2);border-radius:2px;cursor:grab;opacity:0;transition:opacity 150ms ease;z-index:5">`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class=mcp-drop-indicator style=position:absolute;top:-2px;left:0;right:0;height:4px;background-color:#3b82f6;border-radius:2px;z-index:20>`), _tmpl$3 = /* @__PURE__ */ web.template(`<div><!$><!/><!$><!/><!$><!/><div class=mcp-grid-item-content style=position:relative;z-index:1>`);
7
+ function getGridStyle(position) {
8
+ return {
9
+ "grid-column": `${position.colStart} / span ${position.colSpan}`,
10
+ "grid-row": position.rowStart ? `${position.rowStart} / span ${position.rowSpan || 1}` : void 0
11
+ };
12
+ }
13
+ const DraggableGridItem = (props) => {
14
+ const merged = solidJs.mergeProps({
15
+ draggable: false,
16
+ resizable: false,
17
+ isDragging: false,
18
+ isDropTarget: false,
19
+ isResizing: false,
20
+ showGridOverlay: false
21
+ }, props);
22
+ const effectivePosition = solidJs.createMemo(() => merged.previewPosition || props.position);
23
+ const gridStyle = solidJs.createMemo(() => getGridStyle(effectivePosition()));
24
+ const combinedStyle = solidJs.createMemo(() => {
25
+ const base = {
26
+ ...gridStyle(),
27
+ position: "relative",
28
+ transition: merged.isResizing ? "none" : "all 200ms ease-out"
29
+ };
30
+ if (merged.isDragging) {
31
+ base.opacity = "0.5";
32
+ base.transform = "scale(1.02)";
33
+ base["z-index"] = "100";
34
+ }
35
+ if (merged.isDropTarget && !merged.isDragging) {
36
+ base["box-shadow"] = "0 0 0 2px #3b82f6";
37
+ base["border-radius"] = "4px";
38
+ }
39
+ if (merged.isResizing) {
40
+ base["z-index"] = "100";
41
+ }
42
+ if (props.style) {
43
+ Object.assign(base, props.style);
44
+ }
45
+ return base;
46
+ });
47
+ const classNames = solidJs.createMemo(() => {
48
+ const classes = ["mcp-draggable-grid-item"];
49
+ if (merged.draggable) classes.push("mcp-draggable");
50
+ if (merged.resizable) classes.push("mcp-resizable");
51
+ if (merged.isDragging) classes.push("mcp-dragging");
52
+ if (merged.isDropTarget) classes.push("mcp-drop-target");
53
+ if (merged.isResizing) classes.push("mcp-resizing");
54
+ if (props.class) classes.push(props.class);
55
+ return classes.join(" ");
56
+ });
57
+ const handleResizeStart = (edge) => {
58
+ var _a;
59
+ (_a = props.onResizeStart) == null ? void 0 : _a.call(props, edge);
60
+ };
61
+ return (() => {
62
+ var _el$ = web.getNextElement(_tmpl$3), _el$5 = _el$.firstChild, [_el$6, _co$] = web.getNextMarker(_el$5.nextSibling), _el$7 = _el$6.nextSibling, [_el$8, _co$2] = web.getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$3] = web.getNextMarker(_el$9.nextSibling), _el$4 = _el$0.nextSibling;
63
+ web.spread(_el$, web.mergeProps({
64
+ get ["class"]() {
65
+ return classNames();
66
+ },
67
+ get style() {
68
+ return combinedStyle();
69
+ },
70
+ get ["data-component-id"]() {
71
+ return props.id;
72
+ }
73
+ }, () => merged.draggable && props.dragProps ? props.dragProps : {}), false, true);
74
+ web.insert(_el$, web.createComponent(solidJs.Show, {
75
+ get when() {
76
+ return web.memo(() => !!merged.draggable)() && !merged.isResizing;
77
+ },
78
+ get children() {
79
+ return web.getNextElement(_tmpl$);
80
+ }
81
+ }), _el$6, _co$);
82
+ web.insert(_el$, web.createComponent(solidJs.Show, {
83
+ get when() {
84
+ return web.memo(() => !!merged.resizable)() && !merged.isDragging;
85
+ },
86
+ get children() {
87
+ return [web.createComponent(ResizeHandle.ResizeHandle, {
88
+ edge: "left",
89
+ onResizeStart: handleResizeStart,
90
+ get disabled() {
91
+ var _a;
92
+ return (_a = merged.constraints) == null ? void 0 : _a.lockHorizontal;
93
+ }
94
+ }), web.createComponent(ResizeHandle.ResizeHandle, {
95
+ edge: "right",
96
+ onResizeStart: handleResizeStart,
97
+ get disabled() {
98
+ var _a;
99
+ return (_a = merged.constraints) == null ? void 0 : _a.lockHorizontal;
100
+ }
101
+ }), web.createComponent(ResizeHandle.ResizeHandle, {
102
+ edge: "top",
103
+ onResizeStart: handleResizeStart,
104
+ get disabled() {
105
+ var _a;
106
+ return (_a = merged.constraints) == null ? void 0 : _a.lockVertical;
107
+ }
108
+ }), web.createComponent(ResizeHandle.ResizeHandle, {
109
+ edge: "bottom",
110
+ onResizeStart: handleResizeStart,
111
+ get disabled() {
112
+ var _a;
113
+ return (_a = merged.constraints) == null ? void 0 : _a.lockVertical;
114
+ }
115
+ })];
116
+ }
117
+ }), _el$8, _co$2);
118
+ web.insert(_el$, web.createComponent(solidJs.Show, {
119
+ get when() {
120
+ return web.memo(() => !!merged.isDropTarget)() && !merged.isDragging;
121
+ },
122
+ get children() {
123
+ return web.getNextElement(_tmpl$2);
124
+ }
125
+ }), _el$0, _co$3);
126
+ web.insert(_el$4, () => props.children);
127
+ web.runHydrationEvents();
128
+ return _el$;
129
+ })();
130
+ };
131
+ exports.DraggableGridItem = DraggableGridItem;
132
+ exports.default = DraggableGridItem;
133
+ //# sourceMappingURL=DraggableGridItem.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraggableGridItem.cjs","sources":["../../src/components/DraggableGridItem.tsx"],"sourcesContent":["/**\n * DraggableGridItem Component\n * Wrapper for grid items that enables drag-and-drop reordering and resizing\n *\n * Sprint Drag-Drop Feature\n */\n\nimport { Component, JSX, Show, createMemo, mergeProps } from 'solid-js'\nimport type { GridPosition, ResizeConstraints } from '../types'\nimport { ResizeHandle } from './ResizeHandle'\n\n/**\n * Props for DraggableGridItem\n */\nexport interface DraggableGridItemProps {\n /**\n * Component ID\n */\n id: string\n\n /**\n * Grid position\n */\n position: GridPosition\n\n /**\n * Whether dragging is enabled\n */\n draggable?: boolean\n\n /**\n * Whether resizing is enabled\n */\n resizable?: boolean\n\n /**\n * Resize constraints\n */\n constraints?: ResizeConstraints\n\n /**\n * Whether this item is currently being dragged\n */\n isDragging?: boolean\n\n /**\n * Whether this item is a drop target\n */\n isDropTarget?: boolean\n\n /**\n * Preview position during resize\n */\n previewPosition?: GridPosition | null\n\n /**\n * Drag props from useDragDrop\n */\n dragProps?: {\n draggable: boolean\n onDragStart: (e: DragEvent) => void\n onDragOver: (e: DragEvent) => void\n onDragEnter: (e: DragEvent) => void\n onDragLeave: (e: DragEvent) => void\n onDrop: (e: DragEvent) => void\n onDragEnd: (e: DragEvent) => void\n }\n\n /**\n * Callback when resize starts\n */\n onResizeStart?: (edge: 'left' | 'right' | 'top' | 'bottom') => void\n\n /**\n * Callback for resize preview\n */\n onResizePreview?: (position: GridPosition) => void\n\n /**\n * Callback when resize completes\n */\n onResize?: (position: GridPosition) => void\n\n /**\n * Whether resize is in progress\n */\n isResizing?: boolean\n\n /**\n * Show grid overlay during drag/resize\n */\n showGridOverlay?: boolean\n\n /**\n * Custom CSS class\n */\n class?: string\n\n /**\n * Custom styles\n */\n style?: JSX.CSSProperties\n\n /**\n * Children to render\n */\n children?: JSX.Element\n}\n\n/**\n * Generate CSS Grid style string from position\n */\nfunction getGridStyle(position: GridPosition): JSX.CSSProperties {\n return {\n 'grid-column': `${position.colStart} / span ${position.colSpan}`,\n 'grid-row': position.rowStart\n ? `${position.rowStart} / span ${position.rowSpan || 1}`\n : undefined\n }\n}\n\n/**\n * DraggableGridItem Component\n */\nexport const DraggableGridItem: Component<DraggableGridItemProps> = (props) => {\n const merged = mergeProps(\n {\n draggable: false,\n resizable: false,\n isDragging: false,\n isDropTarget: false,\n isResizing: false,\n showGridOverlay: false\n },\n props\n )\n\n // Use preview position during resize if available\n const effectivePosition = createMemo(() =>\n merged.previewPosition || props.position\n )\n\n // Compute grid style\n const gridStyle = createMemo(() => getGridStyle(effectivePosition()))\n\n // Compute combined style\n const combinedStyle = createMemo((): JSX.CSSProperties => {\n const base: JSX.CSSProperties = {\n ...gridStyle(),\n position: 'relative',\n transition: merged.isResizing ? 'none' : 'all 200ms ease-out'\n }\n\n // Add drag/drop visual feedback\n if (merged.isDragging) {\n base.opacity = '0.5'\n base.transform = 'scale(1.02)'\n base['z-index'] = '100'\n }\n\n if (merged.isDropTarget && !merged.isDragging) {\n base['box-shadow'] = '0 0 0 2px #3b82f6'\n base['border-radius'] = '4px'\n }\n\n if (merged.isResizing) {\n base['z-index'] = '100'\n }\n\n // Merge with custom styles\n if (props.style) {\n Object.assign(base, props.style)\n }\n\n return base\n })\n\n // Build class names\n const classNames = createMemo(() => {\n const classes = ['mcp-draggable-grid-item']\n\n if (merged.draggable) classes.push('mcp-draggable')\n if (merged.resizable) classes.push('mcp-resizable')\n if (merged.isDragging) classes.push('mcp-dragging')\n if (merged.isDropTarget) classes.push('mcp-drop-target')\n if (merged.isResizing) classes.push('mcp-resizing')\n if (props.class) classes.push(props.class)\n\n return classes.join(' ')\n })\n\n // Handle resize start\n const handleResizeStart = (edge: 'left' | 'right' | 'top' | 'bottom') => {\n props.onResizeStart?.(edge)\n }\n\n return (\n <div\n class={classNames()}\n style={combinedStyle()}\n data-component-id={props.id}\n {...(merged.draggable && props.dragProps ? props.dragProps : {})}\n >\n {/* Drag handle indicator */}\n <Show when={merged.draggable && !merged.isResizing}>\n <div\n class=\"mcp-drag-handle\"\n style={{\n position: 'absolute',\n top: '4px',\n left: '50%',\n transform: 'translateX(-50%)',\n width: '40px',\n height: '4px',\n 'background-color': 'rgba(0, 0, 0, 0.2)',\n 'border-radius': '2px',\n cursor: 'grab',\n opacity: '0',\n transition: 'opacity 150ms ease',\n 'z-index': '5'\n }}\n />\n </Show>\n\n {/* Resize handles */}\n <Show when={merged.resizable && !merged.isDragging}>\n <ResizeHandle\n edge=\"left\"\n onResizeStart={handleResizeStart}\n disabled={merged.constraints?.lockHorizontal}\n />\n <ResizeHandle\n edge=\"right\"\n onResizeStart={handleResizeStart}\n disabled={merged.constraints?.lockHorizontal}\n />\n <ResizeHandle\n edge=\"top\"\n onResizeStart={handleResizeStart}\n disabled={merged.constraints?.lockVertical}\n />\n <ResizeHandle\n edge=\"bottom\"\n onResizeStart={handleResizeStart}\n disabled={merged.constraints?.lockVertical}\n />\n </Show>\n\n {/* Drop indicator line */}\n <Show when={merged.isDropTarget && !merged.isDragging}>\n <div\n class=\"mcp-drop-indicator\"\n style={{\n position: 'absolute',\n top: '-2px',\n left: '0',\n right: '0',\n height: '4px',\n 'background-color': '#3b82f6',\n 'border-radius': '2px',\n 'z-index': '20'\n }}\n />\n </Show>\n\n {/* Content */}\n <div class=\"mcp-grid-item-content\" style={{ position: 'relative', 'z-index': '1' }}>\n {props.children}\n </div>\n </div>\n )\n}\n\nexport default DraggableGridItem\n"],"names":["getGridStyle","position","colStart","colSpan","rowStart","rowSpan","undefined","DraggableGridItem","props","merged","mergeProps","draggable","resizable","isDragging","isDropTarget","isResizing","showGridOverlay","effectivePosition","createMemo","previewPosition","gridStyle","combinedStyle","base","transition","opacity","transform","style","Object","assign","classNames","classes","push","class","join","handleResizeStart","edge","onResizeStart","_el$","_$getNextElement","_tmpl$3","_el$5","firstChild","_el$6","_co$","_$getNextMarker","nextSibling","_el$7","_el$8","_co$2","_el$9","_el$0","_co$3","_el$4","_$spread","_$mergeProps","id","dragProps","_$insert","_$createComponent","Show","when","_$memo","children","_tmpl$","ResizeHandle","disabled","constraints","lockHorizontal","lockVertical","_tmpl$2","_$runHydrationEvents"],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * DraggableGridItem Component
3
+ * Wrapper for grid items that enables drag-and-drop reordering and resizing
4
+ *
5
+ * Sprint Drag-Drop Feature
6
+ */
7
+ import { Component, JSX } from 'solid-js';
8
+ import type { GridPosition, ResizeConstraints } from '../types';
9
+ /**
10
+ * Props for DraggableGridItem
11
+ */
12
+ export interface DraggableGridItemProps {
13
+ /**
14
+ * Component ID
15
+ */
16
+ id: string;
17
+ /**
18
+ * Grid position
19
+ */
20
+ position: GridPosition;
21
+ /**
22
+ * Whether dragging is enabled
23
+ */
24
+ draggable?: boolean;
25
+ /**
26
+ * Whether resizing is enabled
27
+ */
28
+ resizable?: boolean;
29
+ /**
30
+ * Resize constraints
31
+ */
32
+ constraints?: ResizeConstraints;
33
+ /**
34
+ * Whether this item is currently being dragged
35
+ */
36
+ isDragging?: boolean;
37
+ /**
38
+ * Whether this item is a drop target
39
+ */
40
+ isDropTarget?: boolean;
41
+ /**
42
+ * Preview position during resize
43
+ */
44
+ previewPosition?: GridPosition | null;
45
+ /**
46
+ * Drag props from useDragDrop
47
+ */
48
+ dragProps?: {
49
+ draggable: boolean;
50
+ onDragStart: (e: DragEvent) => void;
51
+ onDragOver: (e: DragEvent) => void;
52
+ onDragEnter: (e: DragEvent) => void;
53
+ onDragLeave: (e: DragEvent) => void;
54
+ onDrop: (e: DragEvent) => void;
55
+ onDragEnd: (e: DragEvent) => void;
56
+ };
57
+ /**
58
+ * Callback when resize starts
59
+ */
60
+ onResizeStart?: (edge: 'left' | 'right' | 'top' | 'bottom') => void;
61
+ /**
62
+ * Callback for resize preview
63
+ */
64
+ onResizePreview?: (position: GridPosition) => void;
65
+ /**
66
+ * Callback when resize completes
67
+ */
68
+ onResize?: (position: GridPosition) => void;
69
+ /**
70
+ * Whether resize is in progress
71
+ */
72
+ isResizing?: boolean;
73
+ /**
74
+ * Show grid overlay during drag/resize
75
+ */
76
+ showGridOverlay?: boolean;
77
+ /**
78
+ * Custom CSS class
79
+ */
80
+ class?: string;
81
+ /**
82
+ * Custom styles
83
+ */
84
+ style?: JSX.CSSProperties;
85
+ /**
86
+ * Children to render
87
+ */
88
+ children?: JSX.Element;
89
+ }
90
+ /**
91
+ * DraggableGridItem Component
92
+ */
93
+ export declare const DraggableGridItem: Component<DraggableGridItemProps>;
94
+ export default DraggableGridItem;
95
+ //# sourceMappingURL=DraggableGridItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DraggableGridItem.d.ts","sourceRoot":"","sources":["../../src/components/DraggableGridItem.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,GAAG,EAAgC,MAAM,UAAU,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAG/D;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;IAEV;;OAEG;IACH,QAAQ,EAAE,YAAY,CAAA;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;OAEG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAA;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,YAAY,GAAG,IAAI,CAAA;IAErC;;OAEG;IACH,SAAS,CAAC,EAAE;QACV,SAAS,EAAE,OAAO,CAAA;QAClB,WAAW,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QACnC,UAAU,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QAClC,WAAW,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QACnC,WAAW,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QACnC,MAAM,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;QAC9B,SAAS,EAAE,CAAC,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;KAClC,CAAA;IAED;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,QAAQ,KAAK,IAAI,CAAA;IAEnE;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;IAElD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAA;IAE3C;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAA;IAEzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC,aAAa,CAAA;IAEzB;;OAEG;IACH,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB;AAcD;;GAEG;AACH,eAAO,MAAM,iBAAiB,EAAE,SAAS,CAAC,sBAAsB,CAmJ/D,CAAA;AAED,eAAe,iBAAiB,CAAA"}