@moldable-ai/ui 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/dist/components/chat/chat-input.d.ts.map +1 -1
  2. package/dist/components/chat/chat-input.js +8 -6
  3. package/dist/components/chat/chat-panel.d.ts +5 -1
  4. package/dist/components/chat/chat-panel.d.ts.map +1 -1
  5. package/dist/components/chat/chat-panel.js +6 -2
  6. package/dist/components/chat/markdown.d.ts +9 -0
  7. package/dist/components/chat/markdown.d.ts.map +1 -0
  8. package/dist/components/chat/markdown.js +47 -0
  9. package/dist/components/chat/tool-handlers.d.ts.map +1 -1
  10. package/dist/components/chat/tool-handlers.js +21 -51
  11. package/dist/components/ui/accordion.d.ts +8 -0
  12. package/dist/components/ui/accordion.d.ts.map +1 -0
  13. package/dist/components/ui/accordion.js +17 -0
  14. package/dist/components/ui/alert-dialog.d.ts +4 -4
  15. package/dist/components/ui/alert-dialog.d.ts.map +1 -1
  16. package/dist/components/ui/alert-dialog.js +10 -10
  17. package/dist/components/ui/alert.d.ts +10 -0
  18. package/dist/components/ui/alert.d.ts.map +1 -0
  19. package/dist/components/ui/alert.js +24 -0
  20. package/dist/components/ui/aspect-ratio.d.ts +4 -0
  21. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  22. package/dist/components/ui/aspect-ratio.js +7 -0
  23. package/dist/components/ui/avatar.d.ts +7 -0
  24. package/dist/components/ui/avatar.d.ts.map +1 -0
  25. package/dist/components/ui/avatar.js +13 -0
  26. package/dist/components/ui/badge.d.ts +3 -3
  27. package/dist/components/ui/badge.d.ts.map +1 -1
  28. package/dist/components/ui/badge.js +10 -10
  29. package/dist/components/ui/breadcrumb.d.ts +12 -0
  30. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  31. package/dist/components/ui/breadcrumb.js +27 -0
  32. package/dist/components/ui/button-group.d.ts +12 -0
  33. package/dist/components/ui/button-group.d.ts.map +1 -0
  34. package/dist/components/ui/button-group.js +27 -0
  35. package/dist/components/ui/button.d.ts +4 -5
  36. package/dist/components/ui/button.d.ts.map +1 -1
  37. package/dist/components/ui/button.js +22 -24
  38. package/dist/components/ui/calendar.d.ts +9 -0
  39. package/dist/components/ui/calendar.d.ts.map +1 -0
  40. package/dist/components/ui/calendar.js +76 -0
  41. package/dist/components/ui/card.d.ts +9 -8
  42. package/dist/components/ui/card.d.ts.map +1 -1
  43. package/dist/components/ui/card.js +23 -15
  44. package/dist/components/ui/carousel.d.ts +20 -0
  45. package/dist/components/ui/carousel.d.ts.map +1 -0
  46. package/dist/components/ui/carousel.js +90 -0
  47. package/dist/components/ui/chart.d.ts +41 -0
  48. package/dist/components/ui/chart.d.ts.map +1 -0
  49. package/dist/components/ui/chart.js +132 -0
  50. package/dist/components/ui/checkbox.d.ts +2 -2
  51. package/dist/components/ui/checkbox.d.ts.map +1 -1
  52. package/dist/components/ui/checkbox.js +5 -5
  53. package/dist/components/ui/collapsible.d.ts +4 -4
  54. package/dist/components/ui/collapsible.d.ts.map +1 -1
  55. package/dist/components/ui/collapsible.js +11 -4
  56. package/dist/components/ui/command.d.ts +17 -17
  57. package/dist/components/ui/command.d.ts.map +1 -1
  58. package/dist/components/ui/command.js +31 -27
  59. package/dist/components/ui/context-menu.d.ts +26 -0
  60. package/dist/components/ui/context-menu.d.ts.map +1 -0
  61. package/dist/components/ui/context-menu.js +51 -0
  62. package/dist/components/ui/dialog.d.ts +15 -19
  63. package/dist/components/ui/dialog.d.ts.map +1 -1
  64. package/dist/components/ui/dialog.js +34 -22
  65. package/dist/components/ui/drawer.d.ts +14 -0
  66. package/dist/components/ui/drawer.d.ts.map +1 -0
  67. package/dist/components/ui/drawer.js +35 -0
  68. package/dist/components/ui/dropdown-menu.d.ts +4 -4
  69. package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
  70. package/dist/components/ui/dropdown-menu.js +13 -14
  71. package/dist/components/ui/empty.d.ts +12 -0
  72. package/dist/components/ui/empty.d.ts.map +1 -0
  73. package/dist/components/ui/empty.js +33 -0
  74. package/dist/components/ui/field.d.ts +25 -0
  75. package/dist/components/ui/field.d.ts.map +1 -0
  76. package/dist/components/ui/field.js +75 -0
  77. package/dist/components/ui/form.d.ts +25 -0
  78. package/dist/components/ui/form.d.ts.map +1 -0
  79. package/dist/components/ui/form.js +59 -0
  80. package/dist/components/ui/hover-card.d.ts +7 -0
  81. package/dist/components/ui/hover-card.d.ts.map +1 -0
  82. package/dist/components/ui/hover-card.js +14 -0
  83. package/dist/components/ui/index.d.ts +35 -0
  84. package/dist/components/ui/index.d.ts.map +1 -1
  85. package/dist/components/ui/index.js +35 -0
  86. package/dist/components/ui/input-group.d.ts +17 -0
  87. package/dist/components/ui/input-group.d.ts.map +1 -0
  88. package/dist/components/ui/input-group.js +63 -0
  89. package/dist/components/ui/input-otp.d.ts +12 -0
  90. package/dist/components/ui/input-otp.d.ts.map +1 -0
  91. package/dist/components/ui/input-otp.js +20 -0
  92. package/dist/components/ui/input.d.ts +2 -3
  93. package/dist/components/ui/input.d.ts.map +1 -1
  94. package/dist/components/ui/input.js +4 -6
  95. package/dist/components/ui/item.d.ts +24 -0
  96. package/dist/components/ui/item.d.ts.map +1 -0
  97. package/dist/components/ui/item.js +66 -0
  98. package/dist/components/ui/kbd.d.ts +4 -0
  99. package/dist/components/ui/kbd.d.ts.map +1 -0
  100. package/dist/components/ui/kbd.js +9 -0
  101. package/dist/components/ui/label.d.ts +3 -3
  102. package/dist/components/ui/label.d.ts.map +1 -1
  103. package/dist/components/ui/label.js +6 -6
  104. package/dist/components/ui/menubar.d.ts +27 -0
  105. package/dist/components/ui/menubar.d.ts.map +1 -0
  106. package/dist/components/ui/menubar.js +53 -0
  107. package/dist/components/ui/navigation-menu.d.ts +15 -0
  108. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  109. package/dist/components/ui/navigation-menu.js +31 -0
  110. package/dist/components/ui/pagination.d.ts +14 -0
  111. package/dist/components/ui/pagination.d.ts.map +1 -0
  112. package/dist/components/ui/pagination.js +29 -0
  113. package/dist/components/ui/popover.d.ts +2 -2
  114. package/dist/components/ui/popover.d.ts.map +1 -1
  115. package/dist/components/ui/popover.js +5 -4
  116. package/dist/components/ui/progress.d.ts +5 -0
  117. package/dist/components/ui/progress.d.ts.map +1 -0
  118. package/dist/components/ui/progress.js +7 -0
  119. package/dist/components/ui/radio-group.d.ts +6 -0
  120. package/dist/components/ui/radio-group.d.ts.map +1 -0
  121. package/dist/components/ui/radio-group.js +12 -0
  122. package/dist/components/ui/resizable.d.ts +8 -0
  123. package/dist/components/ui/resizable.d.ts.map +1 -0
  124. package/dist/components/ui/resizable.js +14 -0
  125. package/dist/components/ui/scroll-area.d.ts +4 -4
  126. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  127. package/dist/components/ui/scroll-area.js +11 -9
  128. package/dist/components/ui/select.d.ts +15 -13
  129. package/dist/components/ui/select.d.ts.map +1 -1
  130. package/dist/components/ui/select.js +36 -25
  131. package/dist/components/ui/separator.d.ts +5 -0
  132. package/dist/components/ui/separator.d.ts.map +1 -0
  133. package/dist/components/ui/separator.js +8 -0
  134. package/dist/components/ui/sheet.d.ts +14 -0
  135. package/dist/components/ui/sheet.d.ts.map +1 -0
  136. package/dist/components/ui/sheet.js +39 -0
  137. package/dist/components/ui/sidebar.d.ts +70 -0
  138. package/dist/components/ui/sidebar.d.ts.map +1 -0
  139. package/dist/components/ui/sidebar.js +212 -0
  140. package/dist/components/ui/skeleton.d.ts +3 -0
  141. package/dist/components/ui/skeleton.d.ts.map +1 -0
  142. package/dist/components/ui/skeleton.js +6 -0
  143. package/dist/components/ui/slider.d.ts +5 -0
  144. package/dist/components/ui/slider.d.ts.map +1 -0
  145. package/dist/components/ui/slider.js +14 -0
  146. package/dist/components/ui/sonner.d.ts +4 -0
  147. package/dist/components/ui/sonner.d.ts.map +1 -0
  148. package/dist/components/ui/sonner.js +20 -0
  149. package/dist/components/ui/spinner.d.ts +3 -0
  150. package/dist/components/ui/spinner.d.ts.map +1 -0
  151. package/dist/components/ui/spinner.js +7 -0
  152. package/dist/components/ui/switch.d.ts +3 -3
  153. package/dist/components/ui/switch.d.ts.map +1 -1
  154. package/dist/components/ui/switch.js +6 -6
  155. package/dist/components/ui/table.d.ts +11 -0
  156. package/dist/components/ui/table.d.ts.map +1 -0
  157. package/dist/components/ui/table.js +27 -0
  158. package/dist/components/ui/tabs.d.ts +2 -2
  159. package/dist/components/ui/tabs.d.ts.map +1 -1
  160. package/dist/components/ui/tabs.js +7 -6
  161. package/dist/components/ui/textarea.d.ts +2 -3
  162. package/dist/components/ui/textarea.d.ts.map +1 -1
  163. package/dist/components/ui/textarea.js +4 -6
  164. package/dist/components/ui/toggle-group.d.ts +10 -0
  165. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  166. package/dist/components/ui/toggle-group.js +21 -0
  167. package/dist/components/ui/toggle.d.ts +10 -0
  168. package/dist/components/ui/toggle.d.ts.map +1 -0
  169. package/dist/components/ui/toggle.js +25 -0
  170. package/dist/components/ui/tooltip.d.ts +2 -2
  171. package/dist/components/ui/tooltip.d.ts.map +1 -1
  172. package/dist/components/ui/tooltip.js +4 -4
  173. package/dist/hooks/use-mobile.d.ts +2 -0
  174. package/dist/hooks/use-mobile.d.ts.map +1 -0
  175. package/dist/hooks/use-mobile.js +15 -0
  176. package/dist/index.d.ts +1 -0
  177. package/dist/index.d.ts.map +1 -1
  178. package/dist/index.js +2 -0
  179. package/package.json +48 -24
@@ -1 +1 @@
1
- {"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAiB,SAAS,EAAE,MAAM,OAAO,CAAA;AAK7E,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAA;IAC5D,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACjD,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAA;IAChD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,WAA+B,EAC/B,QAAQ,EACR,MAAM,EACN,OAAe,GAChB,EAAE,cAAc,2CAoFhB"}
1
+ {"version":3,"file":"chat-input.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-input.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EAGT,SAAS,EACV,MAAM,OAAO,CAAA;AAKd,KAAK,cAAc,GAAG;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAA;IAC5D,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IACjD,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAA;IAChD,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,WAA+B,EAC/B,QAAQ,EACR,MAAM,EACN,OAAe,GAChB,EAAE,cAAc,2CAsFhB"}
@@ -23,14 +23,16 @@ export function ChatInput({ input, onInputChange, onSubmit, isResponding, placeh
23
23
  }
24
24
  }
25
25
  };
26
- const handleButtonClick = () => {
27
- if (isResponding && !hasInput) {
28
- // Stop button behavior: no input, just stop streaming
26
+ // Show stop button only when streaming AND no input
27
+ const showStopButton = isResponding && !hasInput;
28
+ const handleButtonClick = (e) => {
29
+ // When rendered as stop button (type="button"), always call onStop
30
+ // Don't re-check conditions - trust the render decision to avoid race conditions
31
+ if (e.currentTarget.type === 'button') {
32
+ e.preventDefault();
29
33
  onStop?.();
30
34
  }
31
- // If there's input, the button acts as submit (handled by form)
35
+ // If type="submit", form handles submission
32
36
  };
33
- // Show stop button only when streaming AND no input
34
- const showStopButton = isResponding && !hasInput;
35
37
  return (_jsx("div", { className: cn('isolate w-full p-2'), "data-chat-input-wrapper": true, children: _jsx("div", { className: "mx-auto max-w-5xl", children: _jsx("form", { onSubmit: onSubmit, children: _jsxs("div", { className: cn('bg-background relative flex w-full flex-col rounded-3xl border', compact && 'h-14'), children: [_jsx("div", { className: cn('w-full px-5', compact ? 'py-4' : 'py-4 pr-14'), children: _jsx(Textarea, { ref: inputRef, value: input, placeholder: placeholder, onChange: onInputChange, onKeyDown: handleKeyDown, className: cn('max-h-32 min-h-[24px] resize-none rounded-none border-0 bg-transparent p-0 text-sm shadow-none focus:outline-none focus-visible:ring-0 focus-visible:ring-offset-0', compact && 'max-h-6 min-h-6') }) }), !compact && (_jsx("div", { className: "absolute bottom-3 right-3", children: _jsxs(Button, { type: showStopButton ? 'button' : 'submit', size: "icon", className: "bg-primary text-primary-foreground size-8 cursor-pointer rounded-full hover:opacity-70 disabled:opacity-30", disabled: !hasInput && !isResponding, onClick: handleButtonClick, children: [showStopButton ? (_jsx(Square, { className: "fill-primary-foreground size-4 animate-pulse" })) : (_jsx(ArrowUp, { className: "size-4" })), _jsx("span", { className: "sr-only", children: showStopButton ? 'Stop generating' : 'Send message' })] }) }))] }) }) }) }));
36
38
  }
@@ -51,10 +51,14 @@ export interface ChatPanelProps {
51
51
  className?: string;
52
52
  /** Error from chat request */
53
53
  error?: Error | null;
54
+ /** Whether API keys are missing */
55
+ missingApiKey?: boolean;
56
+ /** Callback to trigger API key setup */
57
+ onAddApiKey?: () => void;
54
58
  }
55
59
  /**
56
60
  * Floating chat panel with model selector
57
61
  */
58
- export declare function ChatPanel({ messages, status, input, onInputChange, onSubmit, onStop, onNewChat, models, selectedModel, onModelChange, reasoningEffortOptions, selectedReasoningEffort, onReasoningEffortChange, conversations, currentConversationId, onSelectConversation, onDeleteConversation, placeholder, welcomeMessage, isExpanded, onExpandedChange, className, error, }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
62
+ export declare function ChatPanel({ messages, status, input, onInputChange, onSubmit, onStop, onNewChat, models, selectedModel, onModelChange, reasoningEffortOptions, selectedReasoningEffort, onReasoningEffortChange, conversations, currentConversationId, onSelectConversation, onDeleteConversation, placeholder, welcomeMessage, isExpanded, onExpandedChange, className, error, missingApiKey, onAddApiKey, }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
59
63
  export {};
60
64
  //# sourceMappingURL=chat-panel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-panel.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EAKf,MAAM,OAAO,CAAA;AAWd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,kBAAkB,CAAA;AAClE,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,6BAA6B,CAAA;AAGpC,KAAK,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,CAAA;AAE/D,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,aAAa,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAA;IAC5D,yBAAyB;IACzB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IAClD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,uBAAuB;IACvB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,0BAA0B;IAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,kEAAkE;IAClE,sBAAsB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAChD,gCAAgC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,2BAA2B;IAC3B,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAClC,8BAA8B;IAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,oCAAoC;IACpC,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAA;IACnB,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;CACrB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,MAAM,EACN,KAAK,EACL,aAAa,EACb,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,EACN,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,WAA+B,EAC/B,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,KAAK,GACN,EAAE,cAAc,2CAmRhB"}
1
+ {"version":3,"file":"chat-panel.d.ts","sourceRoot":"","sources":["../../../src/components/chat/chat-panel.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,SAAS,EAKf,MAAM,OAAO,CAAA;AAWd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAEjD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,kBAAkB,CAAA;AAClE,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,6BAA6B,CAAA;AAGpC,KAAK,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,OAAO,CAAA;AAE/D,MAAM,WAAW,cAAc;IAC7B,oBAAoB;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,0BAA0B;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAA;IACb,0BAA0B;IAC1B,aAAa,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAA;IAC5D,yBAAyB;IACzB,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;IAClD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAA;IACtB,uBAAuB;IACvB,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,0BAA0B;IAC1B,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,kEAAkE;IAClE,sBAAsB,CAAC,EAAE,qBAAqB,EAAE,CAAA;IAChD,gCAAgC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,qCAAqC;IACrC,uBAAuB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,2BAA2B;IAC3B,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAClC,8BAA8B;IAC9B,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,oCAAoC;IACpC,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,mCAAmC;IACnC,oBAAoB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAA;IAC3C,uBAAuB;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,SAAS,CAAA;IAC1B,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAA;IACnB,4BAA4B;IAC5B,gBAAgB,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAC7C,wBAAwB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8BAA8B;IAC9B,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI,CAAA;IACpB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,wCAAwC;IACxC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EACxB,QAAQ,EACR,MAAM,EACN,KAAK,EACL,aAAa,EACb,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,EACN,aAAa,EACb,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,WAA+B,EAC/B,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,aAAa,EACb,WAAW,GACZ,EAAE,cAAc,2CAgThB"}
@@ -15,7 +15,7 @@ import { AnimatePresence, motion } from 'framer-motion';
15
15
  /**
16
16
  * Floating chat panel with model selector
17
17
  */
18
- export function ChatPanel({ messages, status, input, onInputChange, onSubmit, onStop, onNewChat, models, selectedModel, onModelChange, reasoningEffortOptions, selectedReasoningEffort, onReasoningEffortChange, conversations, currentConversationId, onSelectConversation, onDeleteConversation, placeholder = 'Ask anything...', welcomeMessage, isExpanded, onExpandedChange, className, error, }) {
18
+ export function ChatPanel({ messages, status, input, onInputChange, onSubmit, onStop, onNewChat, models, selectedModel, onModelChange, reasoningEffortOptions, selectedReasoningEffort, onReasoningEffortChange, conversations, currentConversationId, onSelectConversation, onDeleteConversation, placeholder = 'Ask anything...', welcomeMessage, isExpanded, onExpandedChange, className, error, missingApiKey, onAddApiKey, }) {
19
19
  const inputRef = useRef(null);
20
20
  const messagesEndRef = useRef(null);
21
21
  const scrollAreaRef = useRef(null);
@@ -107,7 +107,11 @@ export function ChatPanel({ messages, status, input, onInputChange, onSubmit, on
107
107
  selectedReasoningEffort &&
108
108
  onReasoningEffortChange && (_jsx(ReasoningEffortSelector, { options: reasoningEffortOptions, selectedEffort: selectedReasoningEffort, onEffortChange: onReasoningEffortChange, disabled: isResponding }))] }), _jsxs("div", { className: "flex items-center gap-1", children: [conversations &&
109
109
  conversations.length > 0 &&
110
- onSelectConversation && (_jsx(ConversationHistory, { conversations: conversations, currentConversationId: currentConversationId, onSelect: onSelectConversation, onDelete: onDeleteConversation, disabled: isResponding })), _jsxs(TooltipProvider, { children: [messages.length > 0 && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: handleNewChat, disabled: isResponding, className: "text-muted-foreground hover:text-foreground", children: _jsx(Plus, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: _jsx("p", { children: "New chat" }) })] })), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: () => onExpandedChange(false), className: "text-muted-foreground hover:text-foreground", children: _jsx(Minimize2, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: _jsx("p", { children: "Minimize" }) })] })] })] })] }), _jsx(ScrollArea, { ref: scrollAreaRef, className: "min-w-0 flex-1 px-2", children: _jsxs("div", { className: "min-w-0 space-y-4 py-4", children: [messages.length === 0 && welcomeMessage && (_jsx("div", { className: "bg-muted/50 text-muted-foreground mx-2 rounded-2xl p-4 text-sm", children: welcomeMessage })), _jsx(Messages, { messages: messages, status: status }), error && status === 'error' && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 text-destructive mx-2 flex items-start gap-2 rounded-lg border p-3 text-sm", children: [_jsx(AlertCircle, { className: "mt-0.5 size-4 shrink-0" }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "font-medium", children: "Request failed" }), _jsx("p", { className: "text-destructive/80 mt-0.5 break-words", children: error.message || 'An unknown error occurred' })] })] })), _jsx("div", { ref: messagesEndRef })] }) })] }), _jsx("div", { className: "relative z-10", onClick: () => {
110
+ onSelectConversation && (_jsx(ConversationHistory, { conversations: conversations, currentConversationId: currentConversationId, onSelect: onSelectConversation, onDelete: onDeleteConversation, disabled: isResponding })), _jsxs(TooltipProvider, { children: [messages.length > 0 && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: handleNewChat, disabled: isResponding, className: "text-muted-foreground hover:text-foreground", children: _jsx(Plus, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: _jsx("p", { children: "New chat" }) })] })), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", onClick: () => onExpandedChange(false), className: "text-muted-foreground hover:text-foreground", children: _jsx(Minimize2, { className: "size-4" }) }) }), _jsx(TooltipContent, { side: "bottom", children: _jsx("p", { children: "Minimize" }) })] })] })] })] }), _jsx(ScrollArea, { ref: scrollAreaRef, className: "min-w-0 flex-1 px-2", children: _jsxs("div", { className: "min-w-0 space-y-4 py-4", children: [messages.length === 0 && welcomeMessage && (_jsx("div", { className: "bg-muted/50 text-muted-foreground mx-2 rounded-2xl p-4 text-sm", children: welcomeMessage })), _jsx(Messages, { messages: messages, status: status }), (missingApiKey ||
111
+ (error &&
112
+ error.message?.includes('API_KEY not configured'))) && (_jsxs("div", { className: "border-primary/30 bg-primary/5 mx-2 flex flex-col items-center gap-3 rounded-lg border p-4 text-center", children: [_jsx("div", { className: "bg-primary/10 flex size-10 items-center justify-center rounded-full", children: _jsx(AlertCircle, { className: "text-primary size-5" }) }), _jsxs("div", { children: [_jsx("p", { className: "text-foreground font-medium", children: "API key required" }), _jsx("p", { className: "text-muted-foreground mt-1 text-sm", children: "Add an API key to start chatting with AI" })] }), onAddApiKey && (_jsx(Button, { onClick: onAddApiKey, size: "sm", className: "cursor-pointer", children: "Add API key" }))] })), error &&
113
+ status === 'error' &&
114
+ !error.message?.includes('API_KEY not configured') && (_jsxs("div", { className: "border-destructive/30 bg-destructive/10 text-destructive mx-2 flex items-start gap-2 rounded-lg border p-3 text-sm", children: [_jsx(AlertCircle, { className: "mt-0.5 size-4 shrink-0" }), _jsxs("div", { className: "min-w-0", children: [_jsx("p", { className: "font-medium", children: "Request failed" }), _jsx("p", { className: "text-destructive/80 mt-0.5 break-words", children: error.message || 'An unknown error occurred' })] })] })), _jsx("div", { ref: messagesEndRef })] }) })] }), _jsx("div", { className: "relative z-10", onClick: () => {
111
115
  if (!isExpanded) {
112
116
  onExpandedChange(true);
113
117
  }
@@ -0,0 +1,9 @@
1
+ type MarkdownProps = {
2
+ markdown: string;
3
+ className?: string;
4
+ proseSize?: 'sm' | 'base' | 'lg';
5
+ };
6
+ declare function NonMemoizedMarkdown({ markdown, className, proseSize }: MarkdownProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare const Markdown: import("react").MemoExoticComponent<typeof NonMemoizedMarkdown>;
8
+ export {};
9
+ //# sourceMappingURL=markdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/components/chat/markdown.tsx"],"names":[],"mappings":"AAMA,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAAA;CACjC,CAAA;AAwFD,iBAAS,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAgB,EAAE,EAAE,aAAa,2CAyBpF;AAED,eAAO,MAAM,QAAQ,iEAMpB,CAAA"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { memo } from 'react';
3
+ import ReactMarkdown from 'react-markdown';
4
+ import { cn } from '../../lib/utils';
5
+ import rehypeRaw from 'rehype-raw';
6
+ import remarkGfm from 'remark-gfm';
7
+ const components = {
8
+ img({ src, alt }) {
9
+ if (!src)
10
+ return null;
11
+ return (_jsx("span", { className: "flex justify-center", children: _jsx("img", { src: src, alt: alt ?? '', className: "h-auto max-w-full rounded-lg" }) }));
12
+ },
13
+ table({ children }) {
14
+ return (_jsx("table", { className: "border-collapse border px-3 py-1", children: children }));
15
+ },
16
+ th({ children }) {
17
+ return (_jsx("th", { className: "bg-muted border px-3 py-1 break-words", children: children }));
18
+ },
19
+ td({ children }) {
20
+ return _jsx("td", { className: "border px-3 py-1 break-words", children: children });
21
+ },
22
+ ol: ({ children, ...props }) => (_jsx("ol", { className: "ml-4 list-outside list-decimal", ...props, children: children })),
23
+ ul: ({ children, ...props }) => (_jsx("ul", { className: "ml-4 list-outside list-disc", ...props, children: children })),
24
+ li: ({ children, ...props }) => (_jsx("li", { className: "py-1", ...props, children: children })),
25
+ strong: ({ children, ...props }) => (_jsx("span", { className: "font-semibold", ...props, children: children })),
26
+ a: ({ children, href, ...props }) => (_jsx("a", { className: "font-bold hover:underline", href: href ?? '#', target: "_blank", rel: "noreferrer", ...props, children: children })),
27
+ pre: ({ children, ...props }) => (_jsx("pre", { className: "overflow-x-auto rounded-lg bg-muted/50 p-3 text-sm", ...props, children: children })),
28
+ code: ({ children, className, ...props }) => {
29
+ // Check if this is an inline code block (no className means inline)
30
+ const isInline = !className;
31
+ if (isInline) {
32
+ return (_jsx("code", { className: "rounded bg-muted px-1.5 py-0.5 text-sm font-mono", ...props, children: children }));
33
+ }
34
+ return (_jsx("code", { className: cn('font-mono text-sm', className), ...props, children: children }));
35
+ },
36
+ };
37
+ function NonMemoizedMarkdown({ markdown, className, proseSize = 'sm' }) {
38
+ const proseSizeClass = {
39
+ sm: 'prose-sm',
40
+ base: 'prose-base',
41
+ lg: 'prose-lg',
42
+ }[proseSize];
43
+ return (_jsx("div", { className: cn('prose w-full max-w-none dark:prose-invert', proseSizeClass, 'text-foreground', className), children: _jsx(ReactMarkdown, { remarkPlugins: [remarkGfm], rehypePlugins: [rehypeRaw], components: components, children: markdown }) }));
44
+ }
45
+ export const Markdown = memo(NonMemoizedMarkdown, (prevProps, nextProps) => prevProps.markdown === nextProps.markdown &&
46
+ prevProps.className === nextProps.className &&
47
+ prevProps.proseSize === nextProps.proseSize);
@@ -1 +1 @@
1
- {"version":3,"file":"tool-handlers.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-handlers.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAOhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IAExB,YAAY,EAAE,MAAM,CAAA;IAEpB,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAE/B,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,SAAS,CAAA;IAGhE,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,SAAS,CAAA;CAC9C,CAAA;AAmND;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CA+nC7D,CAAA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAgC5D"}
1
+ {"version":3,"file":"tool-handlers.d.ts","sourceRoot":"","sources":["../../../src/components/chat/tool-handlers.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAA;AAEhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;AAE5D;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IAExB,YAAY,EAAE,MAAM,CAAA;IAEpB,MAAM,CAAC,EAAE,sBAAsB,CAAA;IAE/B,MAAM,CAAC,EAAE,OAAO,CAAA;IAEhB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,SAAS,CAAA;IAGhE,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,SAAS,CAAA;CAC9C,CAAA;AA0MD;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAm+B7D,CAAA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAgC5D"}
@@ -1,9 +1,8 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { BookOpen, Check, CheckCheck, ChevronDown, Copy, Download, ExternalLink, FileCode, FileText, FolderOpen, Globe, Plus, Search, Sparkles, Terminal, Trash2, X, } from 'lucide-react';
3
+ import { BookOpen, Check, CheckCheck, Copy, Download, FileCode, FileText, FolderOpen, Globe, Plus, Search, Sparkles, Terminal, Trash2, X, } from 'lucide-react';
4
4
  import { useState } from 'react';
5
5
  import { cn } from '../../lib/utils';
6
- import { Collapsible, CollapsibleContent, CollapsibleTrigger, } from '../ui/collapsible';
7
6
  import { ThinkingTimelineMarker } from './thinking-timeline';
8
7
  /**
9
8
  * Code block component for displaying command output or file contents
@@ -64,30 +63,17 @@ function FileOperation({ operation, path, success = true, children, }) {
64
63
  edit: 'Edited',
65
64
  };
66
65
  const Icon = icons[operation];
66
+ const fileName = getFileName(path);
67
67
  return (_jsxs("div", { className: "my-1 min-w-0", children: [_jsxs("div", { className: cn('inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs', success
68
68
  ? 'bg-muted text-muted-foreground'
69
- : 'bg-destructive/10 text-destructive'), children: [_jsx(Icon, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: labels[operation] }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: path }), success ? (_jsx(Check, { className: "size-3 shrink-0 text-green-600" })) : (_jsx(X, { className: "size-3 shrink-0" }))] }), children] }));
69
+ : 'bg-destructive/10 text-destructive'), children: [_jsx(Icon, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: labels[operation] }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", title: path, children: fileName }), success ? (_jsx(Check, { className: "size-3 shrink-0 text-green-600" })) : (_jsx(X, { className: "size-3 shrink-0" }))] }), children] }));
70
70
  }
71
71
  /**
72
- * Truncate a file path for display, keeping the filename visible
72
+ * Extract just the filename from a path
73
73
  */
74
- function truncatePath(path, maxLength = 50) {
75
- if (path.length <= maxLength)
76
- return path;
74
+ function getFileName(path) {
77
75
  const parts = path.split('/');
78
- const filename = parts.pop() || '';
79
- if (filename.length >= maxLength - 3) {
80
- return '...' + filename.slice(-(maxLength - 3));
81
- }
82
- let result = filename;
83
- for (let i = parts.length - 1; i >= 0; i--) {
84
- const next = parts[i] + '/' + result;
85
- if (next.length > maxLength - 3) {
86
- return '.../' + result;
87
- }
88
- result = next;
89
- }
90
- return result;
76
+ return parts[parts.length - 1] || path;
91
77
  }
92
78
  /**
93
79
  * Default tool handlers for Moldable tools
@@ -103,8 +89,8 @@ export const DEFAULT_TOOL_HANDLERS = {
103
89
  if (!result.success) {
104
90
  return (_jsx(FileOperation, { operation: "read", path: result.path || 'file', success: false }, toolCallId));
105
91
  }
106
- // For successful reads, show collapsible with content preview
107
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Read" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: result.path || 'file' }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs(CodeBlock, { maxHeight: 200, children: [result.content?.slice(0, 2000), (result.content?.length || 0) > 2000 && '\n... (truncated)'] }) })] }, toolCallId));
92
+ // Show simple indicator for successful reads
93
+ return (_jsx(FileOperation, { operation: "read", path: result.path || 'file', success: true }, toolCallId));
108
94
  },
109
95
  },
110
96
  writeFile: {
@@ -119,18 +105,18 @@ export const DEFAULT_TOOL_HANDLERS = {
119
105
  const previewLines = lines.slice(0, 20);
120
106
  const preview = previewLines.join('\n').slice(0, 1000);
121
107
  const lineCount = lines.length;
122
- return (_jsxs("div", { className: "my-1 min-w-0", children: [_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0 animate-pulse" }), _jsx("span", { className: "shrink-0 font-medium", children: "Writing" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: path ? truncatePath(path) : 'file' }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", lineCount, " line", lineCount !== 1 ? 's' : '', ")"] })] }), _jsx("div", { className: "mt-2", children: _jsx(CodeBlock, { maxHeight: 200, children: preview }) })] }));
108
+ return (_jsxs("div", { className: "my-1 min-w-0", children: [_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0 animate-pulse" }), _jsx("span", { className: "shrink-0 font-medium", children: "Writing" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: path ? getFileName(path) : 'file' }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", lineCount, " line", lineCount !== 1 ? 's' : '', ")"] })] }), _jsx("div", { className: "mt-2", children: _jsx(CodeBlock, { maxHeight: 200, children: preview }) })] }));
123
109
  }
124
110
  // Fallback when content hasn't started streaming yet
125
- return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Writing ", path ? truncatePath(path) : 'file', "..."] })] }));
111
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Writing ", path ? getFileName(path) : 'file', "..."] })] }));
126
112
  },
127
113
  renderOutput: (output, toolCallId) => {
128
114
  const result = (output ?? {});
129
115
  if (!result.success) {
130
116
  return (_jsx(FileOperation, { operation: "write", path: result.path || 'file', success: false }, toolCallId));
131
117
  }
132
- // Show collapsible with content preview
133
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileText, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Wrote" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: truncatePath(result.path || 'file') }), result.lineCount && (_jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", result.lineCount, " line", result.lineCount !== 1 ? 's' : '', ")"] })), _jsx(Check, { className: "size-3 shrink-0 text-green-600" }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs(CodeBlock, { maxHeight: 200, children: [result.preview, result.truncated && '\n... (truncated)'] }) })] }, toolCallId));
118
+ // Show simple indicator for successful writes
119
+ return (_jsx(FileOperation, { operation: "write", path: result.path || 'file', success: true }, toolCallId));
134
120
  },
135
121
  },
136
122
  listDirectory: {
@@ -147,7 +133,7 @@ export const DEFAULT_TOOL_HANDLERS = {
147
133
  const entries = result.items
148
134
  ? result.items.map((i) => `${i.type === 'directory' ? '📁' : '📄'} ${i.name}`)
149
135
  : result.entries || [];
150
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FolderOpen, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Listed" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", children: result.path || 'directory' }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", entries.length, " items)"] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsx(CodeBlock, { maxHeight: 200, children: entries.join('\n') }) })] }, toolCallId));
136
+ return (_jsxs("div", { className: cn('my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs', 'bg-muted text-muted-foreground'), children: [_jsx(FolderOpen, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Listed" }), _jsx("code", { className: "bg-background/50 min-w-0 truncate rounded px-1 font-mono", title: result.path, children: getFileName(result.path || 'directory') }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", entries.length, " items)"] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
151
137
  },
152
138
  },
153
139
  fileExists: {
@@ -205,7 +191,7 @@ export const DEFAULT_TOOL_HANDLERS = {
205
191
  inline: true,
206
192
  renderLoading: (args) => {
207
193
  const { path } = (args ?? {});
208
- return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Trash2, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Deleting ", path ? truncatePath(path) : 'file', "..."] })] }));
194
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Trash2, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Deleting ", path ? getFileName(path) : 'file', "..."] })] }));
209
195
  },
210
196
  renderOutput: (output, toolCallId) => {
211
197
  const result = (output ?? {});
@@ -218,7 +204,7 @@ export const DEFAULT_TOOL_HANDLERS = {
218
204
  inline: true,
219
205
  renderLoading: (args) => {
220
206
  const { path } = (args ?? {});
221
- return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileCode, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Editing ", path ? truncatePath(path) : 'file', "..."] })] }));
207
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(FileCode, { className: "size-3.5 shrink-0 animate-pulse" }), _jsxs("span", { className: "truncate", children: ["Editing ", path ? getFileName(path) : 'file', "..."] })] }));
222
208
  },
223
209
  renderOutput: (output, toolCallId) => {
224
210
  const result = (output ?? {});
@@ -243,7 +229,7 @@ export const DEFAULT_TOOL_HANDLERS = {
243
229
  // Handle raw content output (ripgrep format)
244
230
  if (result.content && !result.matches) {
245
231
  const lines = result.content.split('\n').filter(Boolean);
246
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Search results" }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", lines.length, " lines)"] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsx(CodeBlock, { maxHeight: 300, children: result.content }) })] }, toolCallId));
232
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Search results" }), _jsxs("span", { className: "text-muted-foreground/70 shrink-0", children: ["(", lines.length, " lines)"] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
247
233
  }
248
234
  if (result.success === false || !result.matches?.length) {
249
235
  return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: "No matches found" })] }, toolCallId));
@@ -257,13 +243,7 @@ export const DEFAULT_TOOL_HANDLERS = {
257
243
  }, {});
258
244
  const fileCount = Object.keys(byFile).length;
259
245
  const matchCount = result.totalMatches || result.matches.length;
260
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Found" }), _jsxs("span", { className: "shrink-0", children: [matchCount, " match", matchCount !== 1 ? 'es' : '', " in ", fileCount, ' ', "file", fileCount !== 1 ? 's' : ''] }), result.truncated && (_jsx("span", { className: "shrink-0 text-amber-500", children: "(truncated)" })), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs("div", { className: "space-y-2", children: [Object.entries(byFile)
261
- .slice(0, 10)
262
- .map(([file, matches]) => (_jsxs("div", { children: [_jsx("div", { className: "text-muted-foreground mb-1 font-mono text-xs", children: truncatePath(file, 60) }), _jsxs(CodeBlock, { maxHeight: 150, children: [matches
263
- .slice(0, 5)
264
- .map((m) => `${m.line}: ${m.content}`)
265
- .join('\n'), matches.length > 5 &&
266
- `\n... and ${matches.length - 5} more`] })] }, file))), Object.keys(byFile).length > 10 && (_jsxs("div", { className: "text-muted-foreground text-xs", children: ["... and ", Object.keys(byFile).length - 10, " more files"] }))] }) })] }, toolCallId));
246
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Found" }), _jsxs("span", { className: "shrink-0", children: [matchCount, " match", matchCount !== 1 ? 'es' : '', " in ", fileCount, " file", fileCount !== 1 ? 's' : ''] }), result.truncated && (_jsx("span", { className: "shrink-0 text-amber-500", children: "(truncated)" })), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
267
247
  },
268
248
  },
269
249
  globFileSearch: {
@@ -279,11 +259,7 @@ export const DEFAULT_TOOL_HANDLERS = {
279
259
  if (result.success === false || !result.files?.length) {
280
260
  return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: "No files found" })] }, toolCallId));
281
261
  }
282
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Found" }), _jsxs("span", { className: "shrink-0", children: [result.files.length, " file", result.files.length !== 1 ? 's' : ''] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs(CodeBlock, { maxHeight: 200, children: [result.files
283
- .slice(0, 50)
284
- .map((f) => `📄 ${f}`)
285
- .join('\n'), result.files.length > 50 &&
286
- `\n... and ${result.files.length - 50} more files`] }) })] }, toolCallId));
262
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Search, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Found" }), _jsxs("span", { className: "shrink-0", children: [result.files.length, " file", result.files.length !== 1 ? 's' : ''] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
287
263
  },
288
264
  },
289
265
  // ─────────────────────────────────────────────────────────────────────────────
@@ -304,7 +280,7 @@ export const DEFAULT_TOOL_HANDLERS = {
304
280
  if (result.success === false || !result.results?.length) {
305
281
  return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Globe, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: "No results found" })] }, toolCallId));
306
282
  }
307
- return (_jsxs(Collapsible, { className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Globe, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Web search" }), _jsxs("span", { className: "shrink-0", children: [result.results.length, " result", result.results.length !== 1 ? 's' : ''] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs("div", { className: "space-y-3", children: [result.results.slice(0, 5).map((r, idx) => (_jsxs("div", { className: "bg-muted/50 rounded-md p-2 text-xs", children: [_jsxs("a", { href: r.link, target: "_blank", rel: "noopener noreferrer", className: "text-primary inline-flex items-center gap-1 font-medium hover:underline", children: [r.title, _jsx(ExternalLink, { className: "size-3" })] }), _jsx("div", { className: "text-muted-foreground mt-1 line-clamp-2", children: r.snippet }), _jsx("div", { className: "text-muted-foreground/60 mt-1 truncate font-mono text-[10px]", children: r.link })] }, idx))), result.results.length > 5 && (_jsxs("div", { className: "text-muted-foreground text-xs", children: ["... and ", result.results.length - 5, " more results"] }))] }) })] }, toolCallId));
283
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Globe, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Web search" }), _jsxs("span", { className: "shrink-0", children: [result.results.length, " result", result.results.length !== 1 ? 's' : ''] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
308
284
  },
309
285
  },
310
286
  // ─────────────────────────────────────────────────────────────────────────────
@@ -320,8 +296,7 @@ export const DEFAULT_TOOL_HANDLERS = {
320
296
  if (result.success === false || !result.repositories?.length) {
321
297
  return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(BookOpen, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: result.error || 'No skill repositories configured' })] }, toolCallId));
322
298
  }
323
- return (_jsxs(Collapsible, { defaultOpen: true, className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(BookOpen, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Skill Repositories" }), _jsxs("span", { className: "shrink-0", children: ["(", result.repositories.length, " repo", result.repositories.length !== 1 ? 's' : '', ")"] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsx("div", { className: "space-y-2", children: result.repositories.map((repo, idx) => (_jsxs("div", { className: "bg-muted/50 rounded-md p-2.5 text-xs", children: [_jsxs("div", { className: "flex items-center gap-2", children: [repo.enabled ? (_jsx(Check, { className: "size-3.5 shrink-0 text-green-600" })) : (_jsx(X, { className: "text-muted-foreground size-3.5 shrink-0" })), _jsx("span", { className: "font-medium", children: repo.name }), _jsx("code", { className: "bg-background/50 text-muted-foreground rounded px-1 font-mono text-[10px]", children: repo.url })] }), _jsxs("div", { className: "text-muted-foreground mt-1.5 flex flex-wrap items-center gap-x-3 gap-y-1 text-[10px]", children: [_jsxs("span", { children: ["Mode:", ' ', _jsx("span", { className: "text-foreground font-medium", children: repo.mode })] }), repo.mode !== 'all' && repo.skills.length > 0 && (_jsxs("span", { children: ["Skills:", ' ', _jsxs("span", { className: "text-foreground font-medium", children: [repo.skills.slice(0, 5).join(', '), repo.skills.length > 5 &&
324
- ` +${repo.skills.length - 5} more`] })] })), repo.lastSync && (_jsxs("span", { children: ["Last sync:", ' ', new Date(repo.lastSync).toLocaleDateString()] }))] })] }, idx))) }) })] }, toolCallId));
299
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(BookOpen, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: "Skill Repositories" }), _jsxs("span", { className: "shrink-0", children: ["(", result.repositories.length, " repo", result.repositories.length !== 1 ? 's' : '', ")"] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
325
300
  },
326
301
  },
327
302
  listAvailableSkills: {
@@ -339,12 +314,7 @@ export const DEFAULT_TOOL_HANDLERS = {
339
314
  }
340
315
  const available = result.available || [];
341
316
  const selected = result.selected || [];
342
- return (_jsxs(Collapsible, { defaultOpen: true, className: "my-1 min-w-0", children: [_jsxs(CollapsibleTrigger, { className: "bg-muted text-muted-foreground hover:bg-accent group inline-flex max-w-full cursor-pointer items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Sparkles, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: result.repoName || 'Available Skills' }), _jsxs("span", { className: "shrink-0", children: ["(", selected.length, "/", available.length, " selected)"] }), _jsx(ChevronDown, { className: "size-3 shrink-0 transition-transform group-data-[state=open]:rotate-180" })] }), _jsx(CollapsibleContent, { className: "mt-2", children: _jsxs("div", { className: "bg-muted/50 rounded-md p-2", children: [_jsx("div", { className: "mb-2 flex flex-wrap gap-1.5", children: available.map((skill) => {
343
- const isSelected = selected.includes(skill);
344
- return (_jsxs("span", { className: cn('inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-medium', isSelected
345
- ? 'bg-primary/10 text-primary'
346
- : 'bg-muted text-muted-foreground'), children: [isSelected && _jsx(Check, { className: "size-2.5" }), skill] }, skill));
347
- }) }), result.mode && (_jsxs("div", { className: "text-muted-foreground text-[10px]", children: ["Selection mode:", ' ', _jsx("span", { className: "font-medium", children: result.mode })] }))] }) })] }, toolCallId));
317
+ return (_jsxs("div", { className: "bg-muted text-muted-foreground my-1 inline-flex max-w-full items-center gap-2 rounded-md px-2 py-1 text-xs", children: [_jsx(Sparkles, { className: "size-3.5 shrink-0" }), _jsx("span", { className: "shrink-0 font-medium", children: result.repoName || 'Available Skills' }), _jsxs("span", { className: "shrink-0", children: ["(", selected.length, "/", available.length, " selected)"] }), _jsx(Check, { className: "size-3 shrink-0 text-green-600" })] }, toolCallId));
348
318
  },
349
319
  },
350
320
  syncSkills: {
@@ -0,0 +1,8 @@
1
+ import * as React from "react";
2
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
+ declare function Accordion({ ...props }: React.ComponentProps<typeof AccordionPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function AccordionItem({ className, ...props }: React.ComponentProps<typeof AccordionPrimitive.Item>): import("react/jsx-runtime").JSX.Element;
5
+ declare function AccordionTrigger({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
6
+ declare function AccordionContent({ className, children, ...props }: React.ComponentProps<typeof AccordionPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
7
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
8
+ //# sourceMappingURL=accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion.d.ts","sourceRoot":"","sources":["../../../src/components/ui/accordion.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,kBAAkB,MAAM,2BAA2B,CAAA;AAK/D,iBAAS,SAAS,CAAC,EACjB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAEtD;AAED,iBAAS,aAAa,CAAC,EACrB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,IAAI,CAAC,2CAQtD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAgBzD;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,kBAAkB,CAAC,OAAO,CAAC,2CAUzD;AAED,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,17 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import * as AccordionPrimitive from "@radix-ui/react-accordion";
3
+ import { ChevronDownIcon } from "lucide-react";
4
+ import { cn } from "../../lib/utils";
5
+ function Accordion({ ...props }) {
6
+ return _jsx(AccordionPrimitive.Root, { "data-slot": "accordion", ...props });
7
+ }
8
+ function AccordionItem({ className, ...props }) {
9
+ return (_jsx(AccordionPrimitive.Item, { "data-slot": "accordion-item", className: cn("border-b last:border-b-0", className), ...props }));
10
+ }
11
+ function AccordionTrigger({ className, children, ...props }) {
12
+ return (_jsx(AccordionPrimitive.Header, { className: "flex", children: _jsxs(AccordionPrimitive.Trigger, { "data-slot": "accordion-trigger", className: cn("focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", className), ...props, children: [children, _jsx(ChevronDownIcon, { className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" })] }) }));
13
+ }
14
+ function AccordionContent({ className, children, ...props }) {
15
+ return (_jsx(AccordionPrimitive.Content, { "data-slot": "accordion-content", className: "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm", ...props, children: _jsx("div", { className: cn("pt-0 pb-4", className), children: children }) }));
16
+ }
17
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -1,12 +1,12 @@
1
- import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
2
- import * as React from 'react';
1
+ import * as React from "react";
2
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
3
3
  declare function AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
4
  declare function AlertDialogTrigger({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
5
5
  declare function AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>): import("react/jsx-runtime").JSX.Element;
6
6
  declare function AlertDialogOverlay({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>): import("react/jsx-runtime").JSX.Element;
7
7
  declare function AlertDialogContent({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content>): import("react/jsx-runtime").JSX.Element;
8
- declare function AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
9
- declare function AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
8
+ declare function AlertDialogHeader({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
+ declare function AlertDialogFooter({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
10
10
  declare function AlertDialogTitle({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Title>): import("react/jsx-runtime").JSX.Element;
11
11
  declare function AlertDialogDescription({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Description>): import("react/jsx-runtime").JSX.Element;
12
12
  declare function AlertDialogAction({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Action>): import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExD;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAI3D;AAED,iBAAS,iBAAiB,CAAC,EACzB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAI1D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAW3D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAc3D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ7B;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7B;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,2CAQzD;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,WAAW,CAAC,2CAQ/D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAO1D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAO1D;AAED,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,CAAA"}
1
+ {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AAKpE,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExD;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAI3D;AAED,iBAAS,iBAAiB,CAAC,EACzB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAI1D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAW3D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAc3D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAQ7B;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7B;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,2CAQzD;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,WAAW,CAAC,2CAQ/D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAO1D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAO1D;AAED,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,GAClB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
3
- import { cn } from '../../lib/utils';
4
- import { buttonVariants } from './button';
2
+ import * as AlertDialogPrimitive from "@radix-ui/react-alert-dialog";
3
+ import { cn } from "../../lib/utils";
4
+ import { buttonVariants } from "./button";
5
5
  function AlertDialog({ ...props }) {
6
6
  return _jsx(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
7
7
  }
@@ -12,27 +12,27 @@ function AlertDialogPortal({ ...props }) {
12
12
  return (_jsx(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props }));
13
13
  }
14
14
  function AlertDialogOverlay({ className, ...props }) {
15
- return (_jsx(AlertDialogPrimitive.Overlay, { "data-slot": "alert-dialog-overlay", className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50', className), ...props }));
15
+ return (_jsx(AlertDialogPrimitive.Overlay, { "data-slot": "alert-dialog-overlay", className: cn("data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50", className), ...props }));
16
16
  }
17
17
  function AlertDialogContent({ className, ...props }) {
18
- return (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { "data-slot": "alert-dialog-content", className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed left-[50%] top-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg', className), ...props })] }));
18
+ return (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { "data-slot": "alert-dialog-content", className: cn("bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 sm:max-w-lg", className), ...props })] }));
19
19
  }
20
20
  function AlertDialogHeader({ className, ...props }) {
21
- return (_jsx("div", { "data-slot": "alert-dialog-header", className: cn('flex flex-col gap-2 text-center sm:text-left', className), ...props }));
21
+ return (_jsx("div", { "data-slot": "alert-dialog-header", className: cn("flex flex-col gap-2 text-center sm:text-left", className), ...props }));
22
22
  }
23
23
  function AlertDialogFooter({ className, ...props }) {
24
- return (_jsx("div", { "data-slot": "alert-dialog-footer", className: cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className), ...props }));
24
+ return (_jsx("div", { "data-slot": "alert-dialog-footer", className: cn("flex flex-col-reverse gap-2 sm:flex-row sm:justify-end", className), ...props }));
25
25
  }
26
26
  function AlertDialogTitle({ className, ...props }) {
27
- return (_jsx(AlertDialogPrimitive.Title, { "data-slot": "alert-dialog-title", className: cn('text-lg font-semibold', className), ...props }));
27
+ return (_jsx(AlertDialogPrimitive.Title, { "data-slot": "alert-dialog-title", className: cn("text-lg font-semibold", className), ...props }));
28
28
  }
29
29
  function AlertDialogDescription({ className, ...props }) {
30
- return (_jsx(AlertDialogPrimitive.Description, { "data-slot": "alert-dialog-description", className: cn('text-muted-foreground text-sm', className), ...props }));
30
+ return (_jsx(AlertDialogPrimitive.Description, { "data-slot": "alert-dialog-description", className: cn("text-muted-foreground text-sm", className), ...props }));
31
31
  }
32
32
  function AlertDialogAction({ className, ...props }) {
33
33
  return (_jsx(AlertDialogPrimitive.Action, { className: cn(buttonVariants(), className), ...props }));
34
34
  }
35
35
  function AlertDialogCancel({ className, ...props }) {
36
- return (_jsx(AlertDialogPrimitive.Cancel, { className: cn(buttonVariants({ variant: 'outline' }), className), ...props }));
36
+ return (_jsx(AlertDialogPrimitive.Cancel, { className: cn(buttonVariants({ variant: "outline" }), className), ...props }));
37
37
  }
38
38
  export { AlertDialog, AlertDialogPortal, AlertDialogOverlay, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogFooter, AlertDialogTitle, AlertDialogDescription, AlertDialogAction, AlertDialogCancel, };
@@ -0,0 +1,10 @@
1
+ import * as React from "react";
2
+ import { type VariantProps } from "class-variance-authority";
3
+ declare const alertVariants: (props?: ({
4
+ variant?: "default" | "destructive" | null | undefined;
5
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
+ declare function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>): import("react/jsx-runtime").JSX.Element;
7
+ declare function AlertTitle({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
8
+ declare function AlertDescription({ className, ...props }: React.ComponentProps<"div">): import("react/jsx-runtime").JSX.Element;
9
+ export { Alert, AlertTitle, AlertDescription };
10
+ //# sourceMappingURL=alert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert.d.ts","sourceRoot":"","sources":["../../../src/components/ui/alert.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIjE,QAAA,MAAM,aAAa;;8EAclB,CAAA;AAED,iBAAS,KAAK,CAAC,EACb,SAAS,EACT,OAAO,EACP,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,YAAY,CAAC,OAAO,aAAa,CAAC,2CASlE;AAED,iBAAS,UAAU,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAWvE;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7B;AAED,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from "class-variance-authority";
3
+ import { cn } from "../../lib/utils";
4
+ const alertVariants = cva("relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", {
5
+ variants: {
6
+ variant: {
7
+ default: "bg-card text-card-foreground",
8
+ destructive: "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
9
+ },
10
+ },
11
+ defaultVariants: {
12
+ variant: "default",
13
+ },
14
+ });
15
+ function Alert({ className, variant, ...props }) {
16
+ return (_jsx("div", { "data-slot": "alert", role: "alert", className: cn(alertVariants({ variant }), className), ...props }));
17
+ }
18
+ function AlertTitle({ className, ...props }) {
19
+ return (_jsx("div", { "data-slot": "alert-title", className: cn("col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight", className), ...props }));
20
+ }
21
+ function AlertDescription({ className, ...props }) {
22
+ return (_jsx("div", { "data-slot": "alert-description", className: cn("text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed", className), ...props }));
23
+ }
24
+ export { Alert, AlertTitle, AlertDescription };
@@ -0,0 +1,4 @@
1
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
2
+ declare function AspectRatio({ ...props }: React.ComponentProps<typeof AspectRatioPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
3
+ export { AspectRatio };
4
+ //# sourceMappingURL=aspect-ratio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aspect-ratio.d.ts","sourceRoot":"","sources":["../../../src/components/ui/aspect-ratio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,oBAAoB,MAAM,8BAA8B,CAAA;AAEpE,iBAAS,WAAW,CAAC,EACnB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExD;AAED,OAAO,EAAE,WAAW,EAAE,CAAA"}
@@ -0,0 +1,7 @@
1
+ "use client";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio";
4
+ function AspectRatio({ ...props }) {
5
+ return _jsx(AspectRatioPrimitive.Root, { "data-slot": "aspect-ratio", ...props });
6
+ }
7
+ export { AspectRatio };
@@ -0,0 +1,7 @@
1
+ import * as React from "react";
2
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
+ declare function Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
4
+ declare function AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>): import("react/jsx-runtime").JSX.Element;
5
+ declare function AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>): import("react/jsx-runtime").JSX.Element;
6
+ export { Avatar, AvatarImage, AvatarFallback };
7
+ //# sourceMappingURL=avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAC9B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAA;AAIzD,iBAAS,MAAM,CAAC,EACd,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,IAAI,CAAC,2CAWnD;AAED,iBAAS,WAAW,CAAC,EACnB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,KAAK,CAAC,2CAQpD;AAED,iBAAS,cAAc,CAAC,EACtB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,eAAe,CAAC,QAAQ,CAAC,2CAWvD;AAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as AvatarPrimitive from "@radix-ui/react-avatar";
3
+ import { cn } from "../../lib/utils";
4
+ function Avatar({ className, ...props }) {
5
+ return (_jsx(AvatarPrimitive.Root, { "data-slot": "avatar", className: cn("relative flex size-8 shrink-0 overflow-hidden rounded-full", className), ...props }));
6
+ }
7
+ function AvatarImage({ className, ...props }) {
8
+ return (_jsx(AvatarPrimitive.Image, { "data-slot": "avatar-image", className: cn("aspect-square size-full", className), ...props }));
9
+ }
10
+ function AvatarFallback({ className, ...props }) {
11
+ return (_jsx(AvatarPrimitive.Fallback, { "data-slot": "avatar-fallback", className: cn("bg-muted flex size-full items-center justify-center rounded-full", className), ...props }));
12
+ }
13
+ export { Avatar, AvatarImage, AvatarFallback };