@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 @@
1
+ {"version":3,"file":"EditableUIResourceRenderer.js","sources":["../../src/components/EditableUIResourceRenderer.tsx"],"sourcesContent":["/**\n * EditableUIResourceRenderer Component\n * Extends UIResourceRenderer with drag-and-drop reordering and resizing capabilities\n *\n * Sprint Drag-Drop Feature\n */\n\nimport {\n Component,\n For,\n Show,\n createSignal,\n createMemo,\n createEffect,\n on,\n JSX\n} from 'solid-js'\nimport type {\n UIComponent,\n UILayout,\n RendererError,\n GridPosition,\n DragDropConfig\n} from '../types'\nimport { useDragDrop } from '../hooks/useDragDrop'\nimport { useResize, ResizeEdge } from '../hooks/useResize'\nimport { DraggableGridItem } from './DraggableGridItem'\nimport { UIResourceRenderer } from './UIResourceRenderer'\n\n/**\n * Props for EditableUIResourceRenderer\n */\nexport interface EditableUIResourceRendererProps {\n /**\n * Layout to render (must be UILayout, not single component)\n */\n layout: UILayout\n\n /**\n * Drag-drop configuration\n */\n dragDrop?: DragDropConfig\n\n /**\n * Error callback\n */\n onError?: (error: RendererError) => void\n\n /**\n * Callback when layout changes (reorder or resize)\n */\n onLayoutChange?: (layout: UILayout) => void\n\n /**\n * Custom CSS class\n */\n class?: string\n\n /**\n * Show grid overlay during editing\n */\n showGridOverlay?: boolean\n}\n\n/**\n * Grid overlay component for visual feedback\n */\nconst GridOverlay: Component<{ columns: number; visible: boolean }> = (props) => {\n return (\n <Show when={props.visible}>\n <div\n class=\"mcp-grid-overlay\"\n style={{\n position: 'absolute',\n inset: '0',\n display: 'grid',\n 'grid-template-columns': `repeat(${props.columns}, 1fr)`,\n gap: '1rem',\n padding: '0',\n 'pointer-events': 'none',\n 'z-index': '0'\n }}\n >\n <For each={Array(props.columns).fill(0)}>\n {() => (\n <div\n class=\"mcp-grid-overlay-column\"\n style={{\n 'background-color': 'rgba(59, 130, 246, 0.05)',\n border: '1px dashed rgba(59, 130, 246, 0.2)',\n 'border-radius': '4px'\n }}\n />\n )}\n </For>\n </div>\n </Show>\n )\n}\n\n/**\n * EditableUIResourceRenderer Component\n */\nexport const EditableUIResourceRenderer: Component<EditableUIResourceRendererProps> = (props) => {\n // Internal state for components (allows editing)\n const [components, setComponents] = createSignal<UIComponent[]>(props.layout.components)\n const [activeResizeId, setActiveResizeId] = createSignal<string | null>(null)\n const [previewPositions, setPreviewPositions] = createSignal<Map<string, GridPosition>>(new Map())\n const [gridContainerRef, setGridContainerRef] = createSignal<HTMLElement | null>(null)\n\n // Sync with external layout changes\n createEffect(on(() => props.layout.components, (newComponents) => {\n setComponents(newComponents)\n }))\n\n // Drag-drop configuration\n const dragDropConfig = createMemo(() => ({\n enabled: props.dragDrop?.enabled ?? false,\n reorder: props.dragDrop?.reorder ?? true,\n resize: props.dragDrop?.resize ?? true,\n constraints: props.dragDrop?.constraints ?? {},\n showGridLines: props.dragDrop?.showGridLines ?? true,\n animationDuration: props.dragDrop?.animationDuration ?? 200\n }))\n\n // Handle reorder from drag-drop\n const handleReorder = (newComponents: UIComponent[]) => {\n setComponents(newComponents)\n\n const newLayout: UILayout = {\n ...props.layout,\n components: newComponents\n }\n\n props.dragDrop?.onReorder?.(newComponents)\n props.dragDrop?.onChange?.(newLayout)\n props.onLayoutChange?.(newLayout)\n }\n\n // Handle resize completion\n const handleResize = (componentId: string, newPosition: GridPosition) => {\n const updatedComponents = components().map(c =>\n c.id === componentId ? { ...c, position: newPosition } : c\n )\n\n setComponents(updatedComponents)\n setActiveResizeId(null)\n setPreviewPositions(new Map())\n\n const newLayout: UILayout = {\n ...props.layout,\n components: updatedComponents\n }\n\n props.dragDrop?.onResize?.(componentId, newPosition)\n props.dragDrop?.onChange?.(newLayout)\n props.onLayoutChange?.(newLayout)\n }\n\n // Handle resize preview\n const handleResizePreview = (componentId: string, previewPosition: GridPosition) => {\n setPreviewPositions(prev => {\n const next = new Map(prev)\n next.set(componentId, previewPosition)\n return next\n })\n }\n\n // Initialize drag-drop hook\n const dragDrop = useDragDrop({\n components,\n onReorder: handleReorder,\n enabled: dragDropConfig().enabled && dragDropConfig().reorder\n })\n\n // Grid container style\n const gridContainerStyle = createMemo((): JSX.CSSProperties => ({\n display: 'grid',\n 'grid-template-columns': `repeat(${props.layout.grid.columns}, 1fr)`,\n gap: props.layout.grid.gap,\n position: 'relative'\n }))\n\n // Check if we should show grid overlay\n const showOverlay = createMemo(() =>\n dragDropConfig().showGridLines && (dragDrop.isDragging() || activeResizeId() !== null)\n )\n\n // Get effective position for a component (preview if resizing, otherwise actual)\n const getEffectivePosition = (component: UIComponent): GridPosition => {\n const preview = previewPositions().get(component.id)\n return preview || component.position\n }\n\n // If drag-drop is not enabled, just render the standard UIResourceRenderer\n if (!props.dragDrop?.enabled) {\n return (\n <UIResourceRenderer\n content={props.layout}\n onError={props.onError}\n class={props.class}\n />\n )\n }\n\n return (\n <div class={`w-full editable-ui-renderer ${props.class || ''}`}>\n <div\n ref={setGridContainerRef}\n class=\"grid relative\"\n style={gridContainerStyle()}\n data-grid-container\n >\n {/* Grid overlay */}\n <GridOverlay\n columns={props.layout.grid.columns}\n visible={showOverlay()}\n />\n\n {/* Render components with drag-drop wrappers */}\n <For each={components()}>\n {(component) => {\n // Create resize hook for each component\n const resize = useResize({\n componentId: component.id,\n currentPosition: () => component.position,\n onResize: (pos) => handleResize(component.id, pos),\n onResizePreview: (pos) => handleResizePreview(component.id, pos),\n constraints: dragDropConfig().constraints,\n gridContainer: gridContainerRef,\n gridColumns: props.layout.grid.columns,\n enabled: dragDropConfig().enabled && dragDropConfig().resize\n })\n\n const effectivePosition = () => getEffectivePosition(component)\n\n return (\n <DraggableGridItem\n id={component.id}\n position={effectivePosition()}\n draggable={dragDropConfig().enabled && dragDropConfig().reorder}\n resizable={dragDropConfig().enabled && dragDropConfig().resize}\n constraints={dragDropConfig().constraints}\n isDragging={dragDrop.isComponentDragging(component.id)}\n isDropTarget={dragDrop.isDropTarget(component.id)}\n isResizing={activeResizeId() === component.id}\n previewPosition={previewPositions().get(component.id) || null}\n dragProps={dragDrop.getDragProps(component.id)}\n onResizeStart={(edge) => {\n setActiveResizeId(component.id)\n // Trigger resize with a synthetic event\n const syntheticEvent = new PointerEvent('pointerdown', {\n clientX: 0,\n clientY: 0\n })\n resize.handleResizeStart(syntheticEvent, edge as ResizeEdge)\n }}\n >\n {/* Render component using UIResourceRenderer for single component */}\n <UIResourceRenderer\n content={component}\n onError={props.onError}\n />\n </DraggableGridItem>\n )\n }}\n </For>\n </div>\n </div>\n )\n}\n\nexport default EditableUIResourceRenderer\n"],"names":["GridOverlay","props","_$createComponent","Show","when","visible","children","_el$","_$getNextElement","_tmpl$","_$insert","For","each","Array","columns","fill","_tmpl$2","_$effect","_$p","_$setStyleProperty","EditableUIResourceRenderer","components","setComponents","createSignal","layout","activeResizeId","setActiveResizeId","previewPositions","setPreviewPositions","Map","gridContainerRef","setGridContainerRef","createEffect","on","newComponents","dragDropConfig","createMemo","enabled","dragDrop","reorder","resize","constraints","showGridLines","animationDuration","handleReorder","newLayout","onReorder","onChange","onLayoutChange","handleResize","componentId","newPosition","updatedComponents","map","c","id","position","onResize","handleResizePreview","previewPosition","prev","next","set","useDragDrop","gridContainerStyle","display","grid","gap","showOverlay","isDragging","getEffectivePosition","component","preview","get","UIResourceRenderer","content","onError","class","_el$3","_tmpl$3","_el$4","firstChild","_el$5","_el$6","_co$","_$getNextMarker","nextSibling","_el$7","_el$8","_co$2","_$use","useResize","currentPosition","pos","onResizePreview","gridContainer","gridColumns","effectivePosition","DraggableGridItem","draggable","_$memo","resizable","isComponentDragging","isDropTarget","isResizing","dragProps","getDragProps","onResizeStart","edge","syntheticEvent","PointerEvent","clientX","clientY","handleResizeStart","_p$","_v$","_v$2","e","_$className","t","_$style","undefined"],"mappings":"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"}
@@ -0,0 +1,105 @@
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
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div class=mcp-ghost-text-overlay aria-hidden=true style=position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;white-space:pre;padding:inherit;font:inherit;line-height:inherit;letter-spacing:inherit><span style=visibility:hidden></span><span style=color:#9ca3af;opacity:0.7>`), _tmpl$2 = /* @__PURE__ */ web.template(`<div class=mcp-ghost-text-hint style="position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:0.75rem;color:#6b7280;background-color:rgba(255, 255, 255, 0.9);padding:2px 6px;border-radius:4px;pointer-events:none">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class=mcp-ghost-text-loading style=position:absolute;right:8px;top:50%;transform:translateY(-50%)><span style="display:inline-block;width:12px;height:12px;border:2px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:mcp-spin 0.6s linear infinite">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div style=position:relative;display:inline-block;width:100%><!$><!/><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class=mcp-ghost-text-input-wrapper style=position:relative><!$><!/><input style=position:relative;background-color:transparent;caret-color:inherit>`);
6
+ const GhostText = (props) => {
7
+ const shouldShow = solidJs.createMemo(() => props.visible !== false && props.ghostText && props.ghostText.length > 0);
8
+ return (() => {
9
+ var _el$ = web.getNextElement(_tmpl$4), _el$8 = _el$.firstChild, [_el$9, _co$] = web.getNextMarker(_el$8.nextSibling), _el$0 = _el$9.nextSibling, [_el$1, _co$2] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$1.nextSibling, [_el$11, _co$3] = web.getNextMarker(_el$10.nextSibling);
10
+ web.insert(_el$, web.createComponent(solidJs.Show, {
11
+ get when() {
12
+ return shouldShow();
13
+ },
14
+ get children() {
15
+ var _el$2 = web.getNextElement(_tmpl$), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
16
+ web.insert(_el$3, () => props.inputValue);
17
+ web.insert(_el$4, () => props.ghostText);
18
+ web.effect(() => web.className(_el$4, `mcp-ghost-text ${props.ghostClass || ""}`));
19
+ return _el$2;
20
+ }
21
+ }), _el$9, _co$);
22
+ web.insert(_el$, web.createComponent(solidJs.Show, {
23
+ get when() {
24
+ return web.memo(() => !!shouldShow())() && props.hintText;
25
+ },
26
+ get children() {
27
+ var _el$5 = web.getNextElement(_tmpl$2);
28
+ web.insert(_el$5, () => props.hintText);
29
+ return _el$5;
30
+ }
31
+ }), _el$1, _co$2);
32
+ web.insert(_el$, web.createComponent(solidJs.Show, {
33
+ get when() {
34
+ return props.isLoading;
35
+ },
36
+ get children() {
37
+ var _el$6 = web.getNextElement(_tmpl$3);
38
+ _el$6.firstChild;
39
+ return _el$6;
40
+ }
41
+ }), _el$11, _co$3);
42
+ web.effect(() => web.className(_el$, `mcp-ghost-text-container ${props.class || ""}`));
43
+ return _el$;
44
+ })();
45
+ };
46
+ const GhostTextInput = (props) => {
47
+ return (() => {
48
+ var _el$12 = web.getNextElement(_tmpl$5), _el$14 = _el$12.firstChild, [_el$15, _co$4] = web.getNextMarker(_el$14.nextSibling), _el$13 = _el$15.nextSibling;
49
+ web.insert(_el$12, web.createComponent(GhostText, {
50
+ get inputValue() {
51
+ return props.value;
52
+ },
53
+ get ghostText() {
54
+ return props.ghostText;
55
+ },
56
+ get visible() {
57
+ return props.showGhost;
58
+ },
59
+ get hintText() {
60
+ return props.hintText;
61
+ },
62
+ get isLoading() {
63
+ return props.isLoading;
64
+ }
65
+ }), _el$15, _co$4);
66
+ _el$13.$$keydown = (e) => {
67
+ var _a;
68
+ return (_a = props.onKeyDown) == null ? void 0 : _a.call(props, e);
69
+ };
70
+ _el$13.$$input = (e) => {
71
+ var _a;
72
+ return (_a = props.onInput) == null ? void 0 : _a.call(props, e.currentTarget.value);
73
+ };
74
+ web.spread(_el$13, web.mergeProps({
75
+ get type() {
76
+ return props.type || "text";
77
+ },
78
+ get id() {
79
+ return props.id;
80
+ },
81
+ get name() {
82
+ return props.name;
83
+ },
84
+ get value() {
85
+ return props.value;
86
+ },
87
+ get placeholder() {
88
+ return props.placeholder;
89
+ },
90
+ get disabled() {
91
+ return props.disabled;
92
+ },
93
+ get ["class"]() {
94
+ return `mcp-ghost-text-input ${props.class || ""}`;
95
+ }
96
+ }, () => props.inputProps || {}), false, false);
97
+ web.runHydrationEvents();
98
+ return _el$12;
99
+ })();
100
+ };
101
+ web.delegateEvents(["input", "keydown"]);
102
+ exports.GhostText = GhostText;
103
+ exports.GhostTextInput = GhostTextInput;
104
+ exports.default = GhostText;
105
+ //# sourceMappingURL=GhostText.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhostText.cjs","sources":["../../src/components/GhostText.tsx"],"sourcesContent":["/**\n * GhostText Component\n * Displays LLM-style ghost text completion overlay\n *\n * Sprint Autocomplete Feature\n */\n\nimport { Component, Show, JSX, createMemo } from 'solid-js'\n\n/**\n * Props for GhostText component\n */\nexport interface GhostTextProps {\n /**\n * Current input value\n */\n inputValue: string\n\n /**\n * Ghost text to show (the completion after input)\n */\n ghostText: string\n\n /**\n * Whether ghost text is visible\n */\n visible?: boolean\n\n /**\n * Custom class for the container\n */\n class?: string\n\n /**\n * Custom class for the ghost text\n */\n ghostClass?: string\n\n /**\n * Accept hint text (e.g., \"Tab to accept\")\n */\n hintText?: string\n\n /**\n * Whether loading\n */\n isLoading?: boolean\n}\n\n/**\n * GhostText Component\n * Overlays ghost text on an input field to show completion suggestions\n */\nexport const GhostText: Component<GhostTextProps> = (props) => {\n const shouldShow = createMemo(() =>\n props.visible !== false && props.ghostText && props.ghostText.length > 0\n )\n\n return (\n <div\n class={`mcp-ghost-text-container ${props.class || ''}`}\n style={{\n position: 'relative',\n display: 'inline-block',\n width: '100%'\n }}\n >\n {/* Ghost text overlay */}\n <Show when={shouldShow()}>\n <div\n class=\"mcp-ghost-text-overlay\"\n style={{\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n 'pointer-events': 'none',\n overflow: 'hidden',\n 'white-space': 'pre',\n padding: 'inherit',\n font: 'inherit',\n 'line-height': 'inherit',\n 'letter-spacing': 'inherit'\n }}\n aria-hidden=\"true\"\n >\n {/* Invisible placeholder for input text */}\n <span style={{ visibility: 'hidden' }}>{props.inputValue}</span>\n {/* Visible ghost text */}\n <span\n class={`mcp-ghost-text ${props.ghostClass || ''}`}\n style={{\n color: '#9ca3af',\n opacity: '0.7'\n }}\n >\n {props.ghostText}\n </span>\n </div>\n </Show>\n\n {/* Hint text */}\n <Show when={shouldShow() && props.hintText}>\n <div\n class=\"mcp-ghost-text-hint\"\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n 'font-size': '0.75rem',\n color: '#6b7280',\n 'background-color': 'rgba(255, 255, 255, 0.9)',\n padding: '2px 6px',\n 'border-radius': '4px',\n 'pointer-events': 'none'\n }}\n >\n {props.hintText}\n </div>\n </Show>\n\n {/* Loading indicator */}\n <Show when={props.isLoading}>\n <div\n class=\"mcp-ghost-text-loading\"\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)'\n }}\n >\n <span\n style={{\n display: 'inline-block',\n width: '12px',\n height: '12px',\n border: '2px solid #e5e7eb',\n 'border-top-color': '#3b82f6',\n 'border-radius': '50%',\n animation: 'mcp-spin 0.6s linear infinite'\n }}\n />\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Input wrapper that includes ghost text functionality\n */\nexport interface GhostTextInputProps {\n /**\n * Current input value\n */\n value: string\n\n /**\n * Ghost text to show\n */\n ghostText: string\n\n /**\n * onChange handler\n */\n onInput?: (value: string) => void\n\n /**\n * onKeyDown handler\n */\n onKeyDown?: (e: KeyboardEvent) => void\n\n /**\n * Placeholder text\n */\n placeholder?: string\n\n /**\n * Input type\n */\n type?: 'text' | 'email' | 'search'\n\n /**\n * Whether input is disabled\n */\n disabled?: boolean\n\n /**\n * Input name\n */\n name?: string\n\n /**\n * Input ID\n */\n id?: string\n\n /**\n * Custom class for input\n */\n class?: string\n\n /**\n * Accept hint\n */\n hintText?: string\n\n /**\n * Whether loading\n */\n isLoading?: boolean\n\n /**\n * Whether ghost text is visible\n */\n showGhost?: boolean\n\n /**\n * Additional input attributes\n */\n inputProps?: JSX.InputHTMLAttributes<HTMLInputElement>\n}\n\n/**\n * GhostTextInput Component\n * Input field with integrated ghost text overlay\n */\nexport const GhostTextInput: Component<GhostTextInputProps> = (props) => {\n return (\n <div class=\"mcp-ghost-text-input-wrapper\" style={{ position: 'relative' }}>\n <GhostText\n inputValue={props.value}\n ghostText={props.ghostText}\n visible={props.showGhost}\n hintText={props.hintText}\n isLoading={props.isLoading}\n />\n <input\n type={props.type || 'text'}\n id={props.id}\n name={props.name}\n value={props.value}\n placeholder={props.placeholder}\n disabled={props.disabled}\n class={`mcp-ghost-text-input ${props.class || ''}`}\n style={{\n position: 'relative',\n 'background-color': 'transparent',\n 'caret-color': 'inherit'\n }}\n onInput={(e) => props.onInput?.(e.currentTarget.value)}\n onKeyDown={(e) => props.onKeyDown?.(e)}\n {...(props.inputProps || {})}\n />\n </div>\n )\n}\n\nexport default GhostText\n"],"names":["GhostText","props","shouldShow","createMemo","visible","ghostText","length","_el$","_$getNextElement","_tmpl$4","_el$8","firstChild","_el$9","_co$","_$getNextMarker","nextSibling","_el$0","_el$1","_co$2","_el$10","_el$11","_co$3","_$insert","_$createComponent","Show","when","children","_el$2","_tmpl$","_el$3","_el$4","inputValue","_$effect","_$className","ghostClass","_$memo","hintText","_el$5","_tmpl$2","isLoading","_el$6","_tmpl$3","class","GhostTextInput","_el$12","_tmpl$5","_el$14","_el$15","_co$4","_el$13","value","showGhost","$$keydown","e","onKeyDown","$$input","onInput","currentTarget","_$spread","_$mergeProps","type","id","name","placeholder","disabled","inputProps","_$runHydrationEvents","_$delegateEvents"],"mappings":";;;;;AAqDO,MAAMA,YAAwCC,CAAAA,UAAU;AAC7D,QAAMC,aAAaC,QAAAA,WAAW,MAC5BF,MAAMG,YAAY,SAASH,MAAMI,aAAaJ,MAAMI,UAAUC,SAAS,CACzE;AAEA,UAAA,MAAA;AAAA,QAAAC,OAAAC,IAAAA,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAA,CAAAC,OAAAC,IAAA,IAAAC,IAAAA,cAAAJ,MAAAK,WAAA,GAAAC,QAAAJ,MAAAG,aAAA,CAAAE,OAAAC,KAAA,IAAAJ,IAAAA,cAAAE,MAAAD,WAAA,GAAAI,SAAAF,MAAAF,aAAA,CAAAK,QAAAC,KAAA,IAAAP,IAAAA,cAAAK,OAAAJ,WAAA;AAAAO,eAAAf,MAAAgB,IAAAA,gBAUKC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEvB,WAAAA;AAAAA,MAAY;AAAA,MAAA,IAAAwB,WAAA;AAAA,YAAAC,QAAAnB,mBAAAoB,MAAA,GAAAC,QAAAF,MAAAhB,YAAAmB,QAAAD,MAAAd;AAAAO,YAAAA,OAAAO,OAAA,MAoBoB5B,MAAM8B,UAAU;AAAAT,YAAAA,OAAAQ,OAAA,MASrD7B,MAAMI,SAAS;AAAA2B,mBAAA,MAAAC,cAAAH,OANT,kBAAkB7B,MAAMiC,cAAc,EAAE,EAAE,CAAA;AAAA,eAAAP;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAAf,OAAAC,IAAA;AAAAS,eAAAf,MAAAgB,IAAAA,gBAYtDC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEU,IAAAA,aAAAjC,YAAY,EAAA,KAAID,MAAMmC;AAAAA,MAAQ;AAAA,MAAA,IAAAV,WAAA;AAAA,YAAAW,QAAA7B,IAAAA,eAAA8B,OAAA;AAAAhB,YAAAA,OAAAe,OAAA,MAgBrCpC,MAAMmC,QAAQ;AAAA,eAAAC;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAApB,OAAAC,KAAA;AAAAI,eAAAf,MAAAgB,IAAAA,gBAKlBC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAExB,MAAMsC;AAAAA,MAAS;AAAA,MAAA,IAAAb,WAAA;AAAA,YAAAc,QAAAhC,IAAAA,eAAAiC,OAAA;AAAAD,cAAA7B;AAAA,eAAA6B;AAAAA,MAAA;AAAA,IAAA,CAAA,GAAApB,QAAAC,KAAA;AAAAW,eAAA,MAAAC,cAAA1B,MAhEpB,4BAA4BN,MAAMyC,SAAS,EAAE,EAAE,CAAA;AAAA,WAAAnC;AAAAA,EAAA,GAAA;AAyF5D;AAiFO,MAAMoC,iBAAkD1C,CAAAA,UAAU;AACvE,UAAA,MAAA;AAAA,QAAA2C,SAAApC,IAAAA,eAAAqC,OAAA,GAAAC,SAAAF,OAAAjC,YAAA,CAAAoC,QAAAC,KAAA,IAAAlC,IAAAA,cAAAgC,OAAA/B,WAAA,GAAAkC,SAAAF,OAAAhC;AAAAO,eAAAsB,QAAArB,IAAAA,gBAEKvB,WAAS;AAAA,MAAA,IACR+B,aAAU;AAAA,eAAE9B,MAAMiD;AAAAA,MAAK;AAAA,MAAA,IACvB7C,YAAS;AAAA,eAAEJ,MAAMI;AAAAA,MAAS;AAAA,MAAA,IAC1BD,UAAO;AAAA,eAAEH,MAAMkD;AAAAA,MAAS;AAAA,MAAA,IACxBf,WAAQ;AAAA,eAAEnC,MAAMmC;AAAAA,MAAQ;AAAA,MAAA,IACxBG,YAAS;AAAA,eAAEtC,MAAMsC;AAAAA,MAAS;AAAA,IAAA,CAAA,GAAAQ,QAAAC,KAAA;AAAAC,WAAAG,YAgBdC,CAAAA,MAAAA;;AAAMpD,yBAAMqD,cAANrD,+BAAkBoD;AAAAA;AAAEJ,WAAAM,UAD5BF,CAAAA,MAAAA;;AAAMpD,yBAAMuD,YAANvD,+BAAgBoD,EAAEI,cAAcP;AAAAA;AAAMQ,QAAAA,OAAAT,QAAAU,eAAA;AAAA,MAAA,IAZtDC,OAAI;AAAA,eAAE3D,MAAM2D,QAAQ;AAAA,MAAM;AAAA,MAAA,IAC1BC,KAAE;AAAA,eAAE5D,MAAM4D;AAAAA,MAAE;AAAA,MAAA,IACZC,OAAI;AAAA,eAAE7D,MAAM6D;AAAAA,MAAI;AAAA,MAAA,IAChBZ,QAAK;AAAA,eAAEjD,MAAMiD;AAAAA,MAAK;AAAA,MAAA,IAClBa,cAAW;AAAA,eAAE9D,MAAM8D;AAAAA,MAAW;AAAA,MAAA,IAC9BC,WAAQ;AAAA,eAAE/D,MAAM+D;AAAAA,MAAQ;AAAA,MAAA,KAAA,OAAA,IAAA;AAAA,eACjB,wBAAwB/D,MAAMyC,SAAS,EAAE;AAAA,MAAE;AAAA,IAAA,GAAA,MAQ7CzC,MAAMgE,cAAc,CAAA,CAAE,GAAA,OAAA,KAAA;AAAAC,2BAAAA;AAAA,WAAAtB;AAAAA,EAAA,GAAA;AAInC;AAEwBuB,IAAAA,eAAA,CAAA,SAAA,SAAA,CAAA;;;;"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * GhostText Component
3
+ * Displays LLM-style ghost text completion overlay
4
+ *
5
+ * Sprint Autocomplete Feature
6
+ */
7
+ import { Component, JSX } from 'solid-js';
8
+ /**
9
+ * Props for GhostText component
10
+ */
11
+ export interface GhostTextProps {
12
+ /**
13
+ * Current input value
14
+ */
15
+ inputValue: string;
16
+ /**
17
+ * Ghost text to show (the completion after input)
18
+ */
19
+ ghostText: string;
20
+ /**
21
+ * Whether ghost text is visible
22
+ */
23
+ visible?: boolean;
24
+ /**
25
+ * Custom class for the container
26
+ */
27
+ class?: string;
28
+ /**
29
+ * Custom class for the ghost text
30
+ */
31
+ ghostClass?: string;
32
+ /**
33
+ * Accept hint text (e.g., "Tab to accept")
34
+ */
35
+ hintText?: string;
36
+ /**
37
+ * Whether loading
38
+ */
39
+ isLoading?: boolean;
40
+ }
41
+ /**
42
+ * GhostText Component
43
+ * Overlays ghost text on an input field to show completion suggestions
44
+ */
45
+ export declare const GhostText: Component<GhostTextProps>;
46
+ /**
47
+ * Input wrapper that includes ghost text functionality
48
+ */
49
+ export interface GhostTextInputProps {
50
+ /**
51
+ * Current input value
52
+ */
53
+ value: string;
54
+ /**
55
+ * Ghost text to show
56
+ */
57
+ ghostText: string;
58
+ /**
59
+ * onChange handler
60
+ */
61
+ onInput?: (value: string) => void;
62
+ /**
63
+ * onKeyDown handler
64
+ */
65
+ onKeyDown?: (e: KeyboardEvent) => void;
66
+ /**
67
+ * Placeholder text
68
+ */
69
+ placeholder?: string;
70
+ /**
71
+ * Input type
72
+ */
73
+ type?: 'text' | 'email' | 'search';
74
+ /**
75
+ * Whether input is disabled
76
+ */
77
+ disabled?: boolean;
78
+ /**
79
+ * Input name
80
+ */
81
+ name?: string;
82
+ /**
83
+ * Input ID
84
+ */
85
+ id?: string;
86
+ /**
87
+ * Custom class for input
88
+ */
89
+ class?: string;
90
+ /**
91
+ * Accept hint
92
+ */
93
+ hintText?: string;
94
+ /**
95
+ * Whether loading
96
+ */
97
+ isLoading?: boolean;
98
+ /**
99
+ * Whether ghost text is visible
100
+ */
101
+ showGhost?: boolean;
102
+ /**
103
+ * Additional input attributes
104
+ */
105
+ inputProps?: JSX.InputHTMLAttributes<HTMLInputElement>;
106
+ }
107
+ /**
108
+ * GhostTextInput Component
109
+ * Input field with integrated ghost text overlay
110
+ */
111
+ export declare const GhostTextInput: Component<GhostTextInputProps>;
112
+ export default GhostText;
113
+ //# sourceMappingURL=GhostText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhostText.d.ts","sourceRoot":"","sources":["../../src/components/GhostText.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAQ,GAAG,EAAc,MAAM,UAAU,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,cAAc,CAgG/C,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAEjC;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,CAAA;IAEtC;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;IAElC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;IAElB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;OAEG;IACH,UAAU,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,CAAA;CACvD;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,mBAAmB,CA6BzD,CAAA;AAED,eAAe,SAAS,CAAA"}
@@ -0,0 +1,105 @@
1
+ import { delegateEvents, getNextElement, template, getNextMarker, insert, createComponent, effect, className, memo, spread, mergeProps, runHydrationEvents } from "solid-js/web";
2
+ import { createMemo, Show } from "solid-js";
3
+ var _tmpl$ = /* @__PURE__ */ template(`<div class=mcp-ghost-text-overlay aria-hidden=true style=position:absolute;top:0;left:0;right:0;bottom:0;pointer-events:none;overflow:hidden;white-space:pre;padding:inherit;font:inherit;line-height:inherit;letter-spacing:inherit><span style=visibility:hidden></span><span style=color:#9ca3af;opacity:0.7>`), _tmpl$2 = /* @__PURE__ */ template(`<div class=mcp-ghost-text-hint style="position:absolute;right:8px;top:50%;transform:translateY(-50%);font-size:0.75rem;color:#6b7280;background-color:rgba(255, 255, 255, 0.9);padding:2px 6px;border-radius:4px;pointer-events:none">`), _tmpl$3 = /* @__PURE__ */ template(`<div class=mcp-ghost-text-loading style=position:absolute;right:8px;top:50%;transform:translateY(-50%)><span style="display:inline-block;width:12px;height:12px;border:2px solid #e5e7eb;border-top-color:#3b82f6;border-radius:50%;animation:mcp-spin 0.6s linear infinite">`), _tmpl$4 = /* @__PURE__ */ template(`<div style=position:relative;display:inline-block;width:100%><!$><!/><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<div class=mcp-ghost-text-input-wrapper style=position:relative><!$><!/><input style=position:relative;background-color:transparent;caret-color:inherit>`);
4
+ const GhostText = (props) => {
5
+ const shouldShow = createMemo(() => props.visible !== false && props.ghostText && props.ghostText.length > 0);
6
+ return (() => {
7
+ var _el$ = getNextElement(_tmpl$4), _el$8 = _el$.firstChild, [_el$9, _co$] = getNextMarker(_el$8.nextSibling), _el$0 = _el$9.nextSibling, [_el$1, _co$2] = getNextMarker(_el$0.nextSibling), _el$10 = _el$1.nextSibling, [_el$11, _co$3] = getNextMarker(_el$10.nextSibling);
8
+ insert(_el$, createComponent(Show, {
9
+ get when() {
10
+ return shouldShow();
11
+ },
12
+ get children() {
13
+ var _el$2 = getNextElement(_tmpl$), _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling;
14
+ insert(_el$3, () => props.inputValue);
15
+ insert(_el$4, () => props.ghostText);
16
+ effect(() => className(_el$4, `mcp-ghost-text ${props.ghostClass || ""}`));
17
+ return _el$2;
18
+ }
19
+ }), _el$9, _co$);
20
+ insert(_el$, createComponent(Show, {
21
+ get when() {
22
+ return memo(() => !!shouldShow())() && props.hintText;
23
+ },
24
+ get children() {
25
+ var _el$5 = getNextElement(_tmpl$2);
26
+ insert(_el$5, () => props.hintText);
27
+ return _el$5;
28
+ }
29
+ }), _el$1, _co$2);
30
+ insert(_el$, createComponent(Show, {
31
+ get when() {
32
+ return props.isLoading;
33
+ },
34
+ get children() {
35
+ var _el$6 = getNextElement(_tmpl$3);
36
+ _el$6.firstChild;
37
+ return _el$6;
38
+ }
39
+ }), _el$11, _co$3);
40
+ effect(() => className(_el$, `mcp-ghost-text-container ${props.class || ""}`));
41
+ return _el$;
42
+ })();
43
+ };
44
+ const GhostTextInput = (props) => {
45
+ return (() => {
46
+ var _el$12 = getNextElement(_tmpl$5), _el$14 = _el$12.firstChild, [_el$15, _co$4] = getNextMarker(_el$14.nextSibling), _el$13 = _el$15.nextSibling;
47
+ insert(_el$12, createComponent(GhostText, {
48
+ get inputValue() {
49
+ return props.value;
50
+ },
51
+ get ghostText() {
52
+ return props.ghostText;
53
+ },
54
+ get visible() {
55
+ return props.showGhost;
56
+ },
57
+ get hintText() {
58
+ return props.hintText;
59
+ },
60
+ get isLoading() {
61
+ return props.isLoading;
62
+ }
63
+ }), _el$15, _co$4);
64
+ _el$13.$$keydown = (e) => {
65
+ var _a;
66
+ return (_a = props.onKeyDown) == null ? void 0 : _a.call(props, e);
67
+ };
68
+ _el$13.$$input = (e) => {
69
+ var _a;
70
+ return (_a = props.onInput) == null ? void 0 : _a.call(props, e.currentTarget.value);
71
+ };
72
+ spread(_el$13, mergeProps({
73
+ get type() {
74
+ return props.type || "text";
75
+ },
76
+ get id() {
77
+ return props.id;
78
+ },
79
+ get name() {
80
+ return props.name;
81
+ },
82
+ get value() {
83
+ return props.value;
84
+ },
85
+ get placeholder() {
86
+ return props.placeholder;
87
+ },
88
+ get disabled() {
89
+ return props.disabled;
90
+ },
91
+ get ["class"]() {
92
+ return `mcp-ghost-text-input ${props.class || ""}`;
93
+ }
94
+ }, () => props.inputProps || {}), false, false);
95
+ runHydrationEvents();
96
+ return _el$12;
97
+ })();
98
+ };
99
+ delegateEvents(["input", "keydown"]);
100
+ export {
101
+ GhostText,
102
+ GhostTextInput,
103
+ GhostText as default
104
+ };
105
+ //# sourceMappingURL=GhostText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GhostText.js","sources":["../../src/components/GhostText.tsx"],"sourcesContent":["/**\n * GhostText Component\n * Displays LLM-style ghost text completion overlay\n *\n * Sprint Autocomplete Feature\n */\n\nimport { Component, Show, JSX, createMemo } from 'solid-js'\n\n/**\n * Props for GhostText component\n */\nexport interface GhostTextProps {\n /**\n * Current input value\n */\n inputValue: string\n\n /**\n * Ghost text to show (the completion after input)\n */\n ghostText: string\n\n /**\n * Whether ghost text is visible\n */\n visible?: boolean\n\n /**\n * Custom class for the container\n */\n class?: string\n\n /**\n * Custom class for the ghost text\n */\n ghostClass?: string\n\n /**\n * Accept hint text (e.g., \"Tab to accept\")\n */\n hintText?: string\n\n /**\n * Whether loading\n */\n isLoading?: boolean\n}\n\n/**\n * GhostText Component\n * Overlays ghost text on an input field to show completion suggestions\n */\nexport const GhostText: Component<GhostTextProps> = (props) => {\n const shouldShow = createMemo(() =>\n props.visible !== false && props.ghostText && props.ghostText.length > 0\n )\n\n return (\n <div\n class={`mcp-ghost-text-container ${props.class || ''}`}\n style={{\n position: 'relative',\n display: 'inline-block',\n width: '100%'\n }}\n >\n {/* Ghost text overlay */}\n <Show when={shouldShow()}>\n <div\n class=\"mcp-ghost-text-overlay\"\n style={{\n position: 'absolute',\n top: '0',\n left: '0',\n right: '0',\n bottom: '0',\n 'pointer-events': 'none',\n overflow: 'hidden',\n 'white-space': 'pre',\n padding: 'inherit',\n font: 'inherit',\n 'line-height': 'inherit',\n 'letter-spacing': 'inherit'\n }}\n aria-hidden=\"true\"\n >\n {/* Invisible placeholder for input text */}\n <span style={{ visibility: 'hidden' }}>{props.inputValue}</span>\n {/* Visible ghost text */}\n <span\n class={`mcp-ghost-text ${props.ghostClass || ''}`}\n style={{\n color: '#9ca3af',\n opacity: '0.7'\n }}\n >\n {props.ghostText}\n </span>\n </div>\n </Show>\n\n {/* Hint text */}\n <Show when={shouldShow() && props.hintText}>\n <div\n class=\"mcp-ghost-text-hint\"\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)',\n 'font-size': '0.75rem',\n color: '#6b7280',\n 'background-color': 'rgba(255, 255, 255, 0.9)',\n padding: '2px 6px',\n 'border-radius': '4px',\n 'pointer-events': 'none'\n }}\n >\n {props.hintText}\n </div>\n </Show>\n\n {/* Loading indicator */}\n <Show when={props.isLoading}>\n <div\n class=\"mcp-ghost-text-loading\"\n style={{\n position: 'absolute',\n right: '8px',\n top: '50%',\n transform: 'translateY(-50%)'\n }}\n >\n <span\n style={{\n display: 'inline-block',\n width: '12px',\n height: '12px',\n border: '2px solid #e5e7eb',\n 'border-top-color': '#3b82f6',\n 'border-radius': '50%',\n animation: 'mcp-spin 0.6s linear infinite'\n }}\n />\n </div>\n </Show>\n </div>\n )\n}\n\n/**\n * Input wrapper that includes ghost text functionality\n */\nexport interface GhostTextInputProps {\n /**\n * Current input value\n */\n value: string\n\n /**\n * Ghost text to show\n */\n ghostText: string\n\n /**\n * onChange handler\n */\n onInput?: (value: string) => void\n\n /**\n * onKeyDown handler\n */\n onKeyDown?: (e: KeyboardEvent) => void\n\n /**\n * Placeholder text\n */\n placeholder?: string\n\n /**\n * Input type\n */\n type?: 'text' | 'email' | 'search'\n\n /**\n * Whether input is disabled\n */\n disabled?: boolean\n\n /**\n * Input name\n */\n name?: string\n\n /**\n * Input ID\n */\n id?: string\n\n /**\n * Custom class for input\n */\n class?: string\n\n /**\n * Accept hint\n */\n hintText?: string\n\n /**\n * Whether loading\n */\n isLoading?: boolean\n\n /**\n * Whether ghost text is visible\n */\n showGhost?: boolean\n\n /**\n * Additional input attributes\n */\n inputProps?: JSX.InputHTMLAttributes<HTMLInputElement>\n}\n\n/**\n * GhostTextInput Component\n * Input field with integrated ghost text overlay\n */\nexport const GhostTextInput: Component<GhostTextInputProps> = (props) => {\n return (\n <div class=\"mcp-ghost-text-input-wrapper\" style={{ position: 'relative' }}>\n <GhostText\n inputValue={props.value}\n ghostText={props.ghostText}\n visible={props.showGhost}\n hintText={props.hintText}\n isLoading={props.isLoading}\n />\n <input\n type={props.type || 'text'}\n id={props.id}\n name={props.name}\n value={props.value}\n placeholder={props.placeholder}\n disabled={props.disabled}\n class={`mcp-ghost-text-input ${props.class || ''}`}\n style={{\n position: 'relative',\n 'background-color': 'transparent',\n 'caret-color': 'inherit'\n }}\n onInput={(e) => props.onInput?.(e.currentTarget.value)}\n onKeyDown={(e) => props.onKeyDown?.(e)}\n {...(props.inputProps || {})}\n />\n </div>\n )\n}\n\nexport default GhostText\n"],"names":["GhostText","props","shouldShow","createMemo","visible","ghostText","length","_el$","_$getNextElement","_tmpl$4","_el$8","firstChild","_el$9","_co$","_$getNextMarker","nextSibling","_el$0","_el$1","_co$2","_el$10","_el$11","_co$3","_$insert","_$createComponent","Show","when","children","_el$2","_tmpl$","_el$3","_el$4","inputValue","_$effect","_$className","ghostClass","_$memo","hintText","_el$5","_tmpl$2","isLoading","_el$6","_tmpl$3","class","GhostTextInput","_el$12","_tmpl$5","_el$14","_el$15","_co$4","_el$13","value","showGhost","$$keydown","e","onKeyDown","$$input","onInput","currentTarget","_$spread","_$mergeProps","type","id","name","placeholder","disabled","inputProps","_$runHydrationEvents","_$delegateEvents"],"mappings":"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"}
@@ -0,0 +1,173 @@
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
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div role=separator><div class=mcp-resize-indicator>`);
6
+ function getCursor(edge) {
7
+ switch (edge) {
8
+ case "left":
9
+ case "right":
10
+ return "ew-resize";
11
+ case "top":
12
+ case "bottom":
13
+ return "ns-resize";
14
+ default:
15
+ return "default";
16
+ }
17
+ }
18
+ function getPositionStyle(edge, hitAreaSize) {
19
+ const halfSize = hitAreaSize / 2;
20
+ switch (edge) {
21
+ case "left":
22
+ return {
23
+ left: `-${halfSize}px`,
24
+ top: "0",
25
+ width: `${hitAreaSize}px`,
26
+ height: "100%"
27
+ };
28
+ case "right":
29
+ return {
30
+ right: `-${halfSize}px`,
31
+ top: "0",
32
+ width: `${hitAreaSize}px`,
33
+ height: "100%"
34
+ };
35
+ case "top":
36
+ return {
37
+ top: `-${halfSize}px`,
38
+ left: "0",
39
+ width: "100%",
40
+ height: `${hitAreaSize}px`
41
+ };
42
+ case "bottom":
43
+ return {
44
+ bottom: `-${halfSize}px`,
45
+ left: "0",
46
+ width: "100%",
47
+ height: `${hitAreaSize}px`
48
+ };
49
+ default:
50
+ return {};
51
+ }
52
+ }
53
+ function getIndicatorStyle(edge, size, isActive) {
54
+ const baseColor = isActive ? "#3b82f6" : "#9ca3af";
55
+ const common = {
56
+ position: "absolute",
57
+ "background-color": baseColor,
58
+ "border-radius": `${size / 2}px`,
59
+ transition: "background-color 150ms ease, opacity 150ms ease",
60
+ opacity: isActive ? "1" : "0"
61
+ };
62
+ switch (edge) {
63
+ case "left":
64
+ return {
65
+ ...common,
66
+ left: "50%",
67
+ top: "50%",
68
+ transform: "translate(-50%, -50%)",
69
+ width: `${size}px`,
70
+ height: "40px",
71
+ "max-height": "60%"
72
+ };
73
+ case "right":
74
+ return {
75
+ ...common,
76
+ right: "50%",
77
+ top: "50%",
78
+ transform: "translate(50%, -50%)",
79
+ width: `${size}px`,
80
+ height: "40px",
81
+ "max-height": "60%"
82
+ };
83
+ case "top":
84
+ return {
85
+ ...common,
86
+ top: "50%",
87
+ left: "50%",
88
+ transform: "translate(-50%, -50%)",
89
+ width: "40px",
90
+ "max-width": "60%",
91
+ height: `${size}px`
92
+ };
93
+ case "bottom":
94
+ return {
95
+ ...common,
96
+ bottom: "50%",
97
+ left: "50%",
98
+ transform: "translate(-50%, 50%)",
99
+ width: "40px",
100
+ "max-width": "60%",
101
+ height: `${size}px`
102
+ };
103
+ default:
104
+ return common;
105
+ }
106
+ }
107
+ const ResizeHandle = (props) => {
108
+ const merged = solidJs.mergeProps({
109
+ disabled: false,
110
+ isActive: false,
111
+ size: 4,
112
+ hitAreaSize: 12
113
+ }, props);
114
+ const handlePointerDown = (e) => {
115
+ var _a;
116
+ if (merged.disabled) return;
117
+ e.preventDefault();
118
+ e.stopPropagation();
119
+ (_a = props.onResizeStart) == null ? void 0 : _a.call(props, props.edge);
120
+ };
121
+ const containerStyle = solidJs.createMemo(() => ({
122
+ position: "absolute",
123
+ "z-index": "10",
124
+ cursor: merged.disabled ? "default" : getCursor(props.edge),
125
+ "user-select": "none",
126
+ "touch-action": "none",
127
+ ...getPositionStyle(props.edge, merged.hitAreaSize)
128
+ }));
129
+ const indicatorStyle = solidJs.createMemo(() => getIndicatorStyle(props.edge, merged.size, merged.isActive));
130
+ const classNames = solidJs.createMemo(() => {
131
+ const classes = ["mcp-resize-handle", `mcp-resize-handle-${props.edge}`];
132
+ if (merged.disabled) classes.push("mcp-resize-handle-disabled");
133
+ if (merged.isActive) classes.push("mcp-resize-handle-active");
134
+ if (props.class) classes.push(props.class);
135
+ return classes.join(" ");
136
+ });
137
+ return (() => {
138
+ var _el$ = web.getNextElement(_tmpl$), _el$2 = _el$.firstChild;
139
+ _el$.$$keydown = (e) => {
140
+ var _a;
141
+ if (merged.disabled) return;
142
+ if (e.key === "Enter" || e.key === " ") {
143
+ e.preventDefault();
144
+ (_a = props.onResizeStart) == null ? void 0 : _a.call(props, props.edge);
145
+ }
146
+ };
147
+ _el$.$$pointerdown = handlePointerDown;
148
+ web.setAttribute(_el$, "aria-valuenow", void 0);
149
+ web.effect((_p$) => {
150
+ var _v$ = classNames(), _v$2 = containerStyle(), _v$3 = props.edge, _v$4 = props.edge === "left" || props.edge === "right" ? "vertical" : "horizontal", _v$5 = merged.disabled ? -1 : 0, _v$6 = indicatorStyle();
151
+ _v$ !== _p$.e && web.className(_el$, _p$.e = _v$);
152
+ _p$.t = web.style(_el$, _v$2, _p$.t);
153
+ _v$3 !== _p$.a && web.setAttribute(_el$, "data-resize-edge", _p$.a = _v$3);
154
+ _v$4 !== _p$.o && web.setAttribute(_el$, "aria-orientation", _p$.o = _v$4);
155
+ _v$5 !== _p$.i && web.setAttribute(_el$, "tabindex", _p$.i = _v$5);
156
+ _p$.n = web.style(_el$2, _v$6, _p$.n);
157
+ return _p$;
158
+ }, {
159
+ e: void 0,
160
+ t: void 0,
161
+ a: void 0,
162
+ o: void 0,
163
+ i: void 0,
164
+ n: void 0
165
+ });
166
+ web.runHydrationEvents();
167
+ return _el$;
168
+ })();
169
+ };
170
+ web.delegateEvents(["pointerdown", "keydown"]);
171
+ exports.ResizeHandle = ResizeHandle;
172
+ exports.default = ResizeHandle;
173
+ //# sourceMappingURL=ResizeHandle.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizeHandle.cjs","sources":["../../src/components/ResizeHandle.tsx"],"sourcesContent":["/**\n * ResizeHandle Component\n * Visual handle for resizing grid components\n *\n * Sprint Drag-Drop Feature\n */\n\nimport { Component, JSX, createMemo, mergeProps } from 'solid-js'\n\n/**\n * Resize edge types\n */\nexport type ResizeEdge = 'left' | 'right' | 'top' | 'bottom'\n\n/**\n * Props for ResizeHandle\n */\nexport interface ResizeHandleProps {\n /**\n * Which edge this handle is on\n */\n edge: ResizeEdge\n\n /**\n * Callback when resize starts\n */\n onResizeStart?: (edge: ResizeEdge) => void\n\n /**\n * Whether the handle is disabled\n */\n disabled?: boolean\n\n /**\n * Whether resize is active\n */\n isActive?: boolean\n\n /**\n * Custom class\n */\n class?: string\n\n /**\n * Handle size in pixels\n */\n size?: number\n\n /**\n * Hit area size in pixels (larger than visible size for easier grabbing)\n */\n hitAreaSize?: number\n}\n\n/**\n * Get cursor style for edge\n */\nfunction getCursor(edge: ResizeEdge): string {\n switch (edge) {\n case 'left':\n case 'right':\n return 'ew-resize'\n case 'top':\n case 'bottom':\n return 'ns-resize'\n default:\n return 'default'\n }\n}\n\n/**\n * Get position styles for edge\n */\nfunction getPositionStyle(\n edge: ResizeEdge,\n hitAreaSize: number\n): JSX.CSSProperties {\n const halfSize = hitAreaSize / 2\n\n switch (edge) {\n case 'left':\n return {\n left: `-${halfSize}px`,\n top: '0',\n width: `${hitAreaSize}px`,\n height: '100%'\n }\n case 'right':\n return {\n right: `-${halfSize}px`,\n top: '0',\n width: `${hitAreaSize}px`,\n height: '100%'\n }\n case 'top':\n return {\n top: `-${halfSize}px`,\n left: '0',\n width: '100%',\n height: `${hitAreaSize}px`\n }\n case 'bottom':\n return {\n bottom: `-${halfSize}px`,\n left: '0',\n width: '100%',\n height: `${hitAreaSize}px`\n }\n default:\n return {}\n }\n}\n\n/**\n * Get visual indicator styles for edge\n */\nfunction getIndicatorStyle(\n edge: ResizeEdge,\n size: number,\n isActive: boolean\n): JSX.CSSProperties {\n const baseColor = isActive ? '#3b82f6' : '#9ca3af'\n\n const common: JSX.CSSProperties = {\n position: 'absolute',\n 'background-color': baseColor,\n 'border-radius': `${size / 2}px`,\n transition: 'background-color 150ms ease, opacity 150ms ease',\n opacity: isActive ? '1' : '0'\n }\n\n switch (edge) {\n case 'left':\n return {\n ...common,\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)',\n width: `${size}px`,\n height: '40px',\n 'max-height': '60%'\n }\n case 'right':\n return {\n ...common,\n right: '50%',\n top: '50%',\n transform: 'translate(50%, -50%)',\n width: `${size}px`,\n height: '40px',\n 'max-height': '60%'\n }\n case 'top':\n return {\n ...common,\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n width: '40px',\n 'max-width': '60%',\n height: `${size}px`\n }\n case 'bottom':\n return {\n ...common,\n bottom: '50%',\n left: '50%',\n transform: 'translate(-50%, 50%)',\n width: '40px',\n 'max-width': '60%',\n height: `${size}px`\n }\n default:\n return common\n }\n}\n\n/**\n * ResizeHandle Component\n */\nexport const ResizeHandle: Component<ResizeHandleProps> = (props) => {\n const merged = mergeProps(\n {\n disabled: false,\n isActive: false,\n size: 4,\n hitAreaSize: 12\n },\n props\n )\n\n const handlePointerDown = (e: PointerEvent) => {\n if (merged.disabled) return\n\n e.preventDefault()\n e.stopPropagation()\n\n props.onResizeStart?.(props.edge)\n }\n\n // Container styles\n const containerStyle = createMemo((): JSX.CSSProperties => ({\n position: 'absolute',\n 'z-index': '10',\n cursor: merged.disabled ? 'default' : getCursor(props.edge),\n 'user-select': 'none',\n 'touch-action': 'none',\n ...getPositionStyle(props.edge, merged.hitAreaSize)\n }))\n\n // Indicator styles\n const indicatorStyle = createMemo(() =>\n getIndicatorStyle(props.edge, merged.size, merged.isActive)\n )\n\n // Class names\n const classNames = createMemo(() => {\n const classes = [\n 'mcp-resize-handle',\n `mcp-resize-handle-${props.edge}`\n ]\n\n if (merged.disabled) classes.push('mcp-resize-handle-disabled')\n if (merged.isActive) classes.push('mcp-resize-handle-active')\n if (props.class) classes.push(props.class)\n\n return classes.join(' ')\n })\n\n return (\n <div\n class={classNames()}\n style={containerStyle()}\n onPointerDown={handlePointerDown}\n data-resize-edge={props.edge}\n role=\"separator\"\n aria-orientation={\n props.edge === 'left' || props.edge === 'right'\n ? 'vertical'\n : 'horizontal'\n }\n aria-valuenow={undefined}\n tabIndex={merged.disabled ? -1 : 0}\n onKeyDown={(e) => {\n // Allow keyboard resizing\n if (merged.disabled) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n props.onResizeStart?.(props.edge)\n }\n }}\n >\n {/* Visual indicator */}\n <div\n class=\"mcp-resize-indicator\"\n style={indicatorStyle()}\n />\n </div>\n )\n}\n\nexport default ResizeHandle\n"],"names":["getCursor","edge","getPositionStyle","hitAreaSize","halfSize","left","top","width","height","right","bottom","getIndicatorStyle","size","isActive","baseColor","common","position","transition","opacity","transform","ResizeHandle","props","merged","mergeProps","disabled","handlePointerDown","e","preventDefault","stopPropagation","onResizeStart","containerStyle","createMemo","cursor","indicatorStyle","classNames","classes","push","class","join","_el$","_$getNextElement","_tmpl$","_el$2","firstChild","$$keydown","key","$$pointerdown","_$setAttribute","undefined","_$effect","_p$","_v$","_v$2","_v$3","_v$4","_v$5","_v$6","_$className","t","_$style","a","o","i","n","_$runHydrationEvents","_$delegateEvents"],"mappings":"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"}