@lssm/module.ai-chat 0.0.0-canary-20251217083314 → 0.0.0-canary-20251219202229
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/ai-chat.feature.d.ts +2 -1
- package/dist/ai-chat.feature.d.ts.map +1 -0
- package/dist/ai-chat.feature.js +2 -1
- package/dist/ai-chat.feature.js.map +1 -0
- package/dist/context/context-builder.d.ts +2 -1
- package/dist/context/context-builder.d.ts.map +1 -0
- package/dist/context/context-builder.js +2 -1
- package/dist/context/context-builder.js.map +1 -0
- package/dist/context/file-operations.d.ts +2 -1
- package/dist/context/file-operations.d.ts.map +1 -0
- package/dist/context/file-operations.js +2 -1
- package/dist/context/file-operations.js.map +1 -0
- package/dist/context/workspace-context.d.ts +2 -1
- package/dist/context/workspace-context.d.ts.map +1 -0
- package/dist/context/workspace-context.js +2 -1
- package/dist/context/workspace-context.js.map +1 -0
- package/dist/core/chat-service.d.ts +2 -1
- package/dist/core/chat-service.d.ts.map +1 -0
- package/dist/core/chat-service.js +2 -1
- package/dist/core/chat-service.js.map +1 -0
- package/dist/core/conversation-store.d.ts +2 -1
- package/dist/core/conversation-store.d.ts.map +1 -0
- package/dist/core/conversation-store.js +2 -1
- package/dist/core/conversation-store.js.map +1 -0
- package/dist/core/message-types.d.ts +2 -1
- package/dist/core/message-types.d.ts.map +1 -0
- package/dist/libs/ai-providers/dist/factory.js +23 -22
- package/dist/libs/ai-providers/dist/factory.js.map +1 -0
- package/dist/libs/ai-providers/dist/models.js +2 -1
- package/dist/libs/ai-providers/dist/models.js.map +1 -0
- package/dist/libs/ai-providers/dist/validation.js +2 -1
- package/dist/libs/ai-providers/dist/validation.js.map +1 -0
- package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js +2 -1
- package/dist/libs/design-system/dist/_virtual/rolldown_runtime.js.map +1 -0
- package/dist/libs/design-system/dist/components/atoms/Button.js +5 -4
- package/dist/libs/design-system/dist/components/atoms/Button.js.map +1 -0
- package/dist/libs/design-system/dist/components/atoms/Textarea.js +5 -4
- package/dist/libs/design-system/dist/components/atoms/Textarea.js.map +1 -0
- package/dist/libs/design-system/dist/lib/keyboard.js +2 -1
- package/dist/libs/design-system/dist/lib/keyboard.js.map +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js +2 -1
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/button.js.map +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/textarea.js +2 -1
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui/textarea.js.map +1 -0
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js +2 -1
- package/dist/libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/avatar.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/avatar.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/badge.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/badge.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/scroll-area.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/scroll-area.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/select.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/select.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/skeleton.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/skeleton.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/tooltip.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/tooltip.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui/utils.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui/utils.js.map +1 -0
- package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js +2 -1
- package/dist/libs/ui-kit-web/dist/ui-kit-core/dist/utils.js.map +1 -0
- package/dist/presentation/components/ChatContainer.d.ts +2 -1
- package/dist/presentation/components/ChatContainer.d.ts.map +1 -0
- package/dist/presentation/components/ChatContainer.js +2 -1
- package/dist/presentation/components/ChatContainer.js.map +1 -0
- package/dist/presentation/components/ChatInput.d.ts +4 -3
- package/dist/presentation/components/ChatInput.d.ts.map +1 -0
- package/dist/presentation/components/ChatInput.js +8 -7
- package/dist/presentation/components/ChatInput.js.map +1 -0
- package/dist/presentation/components/ChatMessage.d.ts +7 -6
- package/dist/presentation/components/ChatMessage.d.ts.map +1 -0
- package/dist/presentation/components/ChatMessage.js +4 -3
- package/dist/presentation/components/ChatMessage.js.map +1 -0
- package/dist/presentation/components/CodePreview.d.ts +4 -3
- package/dist/presentation/components/CodePreview.d.ts.map +1 -0
- package/dist/presentation/components/CodePreview.js +8 -7
- package/dist/presentation/components/CodePreview.js.map +1 -0
- package/dist/presentation/components/ContextIndicator.d.ts +2 -1
- package/dist/presentation/components/ContextIndicator.d.ts.map +1 -0
- package/dist/presentation/components/ContextIndicator.js +2 -1
- package/dist/presentation/components/ContextIndicator.js.map +1 -0
- package/dist/presentation/components/ModelPicker.d.ts +6 -5
- package/dist/presentation/components/ModelPicker.d.ts.map +1 -0
- package/dist/presentation/components/ModelPicker.js +4 -3
- package/dist/presentation/components/ModelPicker.js.map +1 -0
- package/dist/presentation/hooks/useChat.d.ts +2 -1
- package/dist/presentation/hooks/useChat.d.ts.map +1 -0
- package/dist/presentation/hooks/useChat.js +2 -1
- package/dist/presentation/hooks/useChat.js.map +1 -0
- package/dist/presentation/hooks/useProviders.d.ts +2 -1
- package/dist/presentation/hooks/useProviders.d.ts.map +1 -0
- package/dist/presentation/hooks/useProviders.js +2 -1
- package/dist/presentation/hooks/useProviders.js.map +1 -0
- package/dist/providers/chat-utilities.d.ts +2 -1
- package/dist/providers/chat-utilities.d.ts.map +1 -0
- package/dist/providers/chat-utilities.js +2 -1
- package/dist/providers/chat-utilities.js.map +1 -0
- package/package.json +13 -12
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button.js","names":[],"sources":["../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui/button.js"],"sourcesContent":["import { cn, init_utils } from \"../ui-kit-core/dist/utils.js\";\nimport * as React$1 from \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { cva } from \"class-variance-authority\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\n//#region ../ui-kit-web/dist/ui/button.js\ninit_utils();\nconst buttonVariants = cva(\"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-hidden focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\", {\n\tvariants: {\n\t\tvariant: {\n\t\t\tdefault: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n\t\t\tdestructive: \"bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\t\toutline: \"border bg-background shadow-2xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50\",\n\t\t\tsecondary: \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n\t\t\tghost: \"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50\",\n\t\t\tlink: \"text-primary underline-offset-4 hover:underline\"\n\t\t},\n\t\tsize: {\n\t\t\tdefault: \"h-9 px-4 py-2 has-[>svg]:px-3\",\n\t\t\tsm: \"h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5\",\n\t\t\tlg: \"h-10 rounded-md px-6 has-[>svg]:px-4\",\n\t\t\ticon: \"size-9\"\n\t\t}\n\t},\n\tdefaultVariants: {\n\t\tvariant: \"default\",\n\t\tsize: \"default\"\n\t}\n});\nconst Button = React$1.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {\n\tif (asChild) return /* @__PURE__ */ jsx(Slot, {\n\t\t\"data-slot\": \"button\",\n\t\tclassName: cn(buttonVariants({\n\t\t\tvariant,\n\t\t\tsize,\n\t\t\tclassName\n\t\t})),\n\t\t...props\n\t});\n\treturn /* @__PURE__ */ jsx(\"button\", {\n\t\tref,\n\t\t\"data-slot\": \"button\",\n\t\tclassName: cn(buttonVariants({\n\t\t\tvariant,\n\t\t\tsize,\n\t\t\tclassName\n\t\t})),\n\t\t...props\n\t});\n});\nButton.displayName = \"Button\";\n\n//#endregion\nexport { Button, buttonVariants };\n//# sourceMappingURL=button.js.map"],"mappings":";;;;;;;AAOA,YAAY;AACZ,MAAM,iBAAiB,IAAI,icAAic;CAC3d,UAAU;EACT,SAAS;GACR,SAAS;GACT,aAAa;GACb,SAAS;GACT,WAAW;GACX,OAAO;GACP,MAAM;GACN;EACD,MAAM;GACL,SAAS;GACT,IAAI;GACJ,IAAI;GACJ,MAAM;GACN;EACD;CACD,iBAAiB;EAChB,SAAS;EACT,MAAM;EACN;CACD,CAAC;AACF,MAAM,SAAS,QAAQ,YAAY,EAAE,WAAW,SAAS,MAAM,UAAU,OAAO,GAAG,SAAS,QAAQ;AACnG,KAAI,QAAS,QAAuB,oBAAI,MAAM;EAC7C,aAAa;EACb,WAAW,GAAG,eAAe;GAC5B;GACA;GACA;GACA,CAAC,CAAC;EACH,GAAG;EACH,CAAC;AACF,QAAuB,oBAAI,UAAU;EACpC;EACA,aAAa;EACb,WAAW,GAAG,eAAe;GAC5B;GACA;GACA;GACA,CAAC,CAAC;EACH,GAAG;EACH,CAAC;EACD;AACF,OAAO,cAAc"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"textarea.js","names":[],"sources":["../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui/textarea.js"],"sourcesContent":["import { cn, init_utils } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\n\n//#region ../ui-kit-web/dist/ui/textarea.js\ninit_utils();\nfunction Textarea({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"textarea\", {\n\t\t\"data-slot\": \"textarea\",\n\t\tclassName: cn(\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-ring/50 dark:bg-input/30 flex field-sizing-content min-h-16 w-full rounded-md border bg-transparent px-3 py-2 text-base shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Textarea };\n//# sourceMappingURL=textarea.js.map"],"mappings":";;;;;AAKA,YAAY;AACZ,SAAS,SAAS,EAAE,WAAW,GAAG,SAAS;AAC1C,QAAuB,oBAAI,YAAY;EACtC,aAAa;EACb,WAAW,GAAG,0cAA0c,UAAU;EACle,GAAG;EACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../../../../libs/design-system/dist/ui-kit-web/dist/ui-kit-core/dist/utils.js"],"sourcesContent":["import { __esmMin } from \"../../../../_virtual/rolldown_runtime.js\";\nimport { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ../ui-kit-web/dist/ui-kit-core/dist/utils.js\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\nvar init_utils = __esmMin((() => {}));\n\n//#endregion\ninit_utils();\nexport { cn, init_utils };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;;AAKA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC;;AAE7B,IAAI,aAAa,gBAAgB,IAAI;AAGrC,YAAY"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/avatar.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"./utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\n\n//#region ui/avatar.tsx\nfunction Avatar({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Root, {\n\t\t\"data-slot\": \"avatar\",\n\t\tclassName: cn(\"relative flex size-8 shrink-0 overflow-hidden rounded-full\", className),\n\t\t...props\n\t});\n}\nfunction AvatarImage({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Image, {\n\t\t\"data-slot\": \"avatar-image\",\n\t\tclassName: cn(\"aspect-square size-full\", className),\n\t\t...props\n\t});\n}\nfunction AvatarFallback({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(AvatarPrimitive.Fallback, {\n\t\t\"data-slot\": \"avatar-fallback\",\n\t\tclassName: cn(\"bg-muted flex size-full items-center justify-center rounded-full\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Avatar, AvatarFallback, AvatarImage };\n//# sourceMappingURL=avatar.js.map"],"mappings":";;;;;;;;AAQA,SAAS,OAAO,EAAE,WAAW,GAAG,SAAS;AACxC,QAAuB,oBAAI,gBAAgB,MAAM;EAChD,aAAa;EACb,WAAW,GAAG,8DAA8D,UAAU;EACtF,GAAG;EACH,CAAC;;AASH,SAAS,eAAe,EAAE,WAAW,GAAG,SAAS;AAChD,QAAuB,oBAAI,gBAAgB,UAAU;EACpD,aAAa;EACb,WAAW,GAAG,oEAAoE,UAAU;EAC5F,GAAG;EACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/badge.js"],"sourcesContent":["import { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx } from \"react/jsx-runtime\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva } from \"class-variance-authority\";\n\n//#region ui/badge.tsx\nconst badgeVariants = cva(\"inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden\", {\n\tvariants: { variant: {\n\t\tdefault: \"border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90\",\n\t\tsecondary: \"border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90\",\n\t\tdestructive: \"border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60\",\n\t\toutline: \"text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground\"\n\t} },\n\tdefaultVariants: { variant: \"default\" }\n});\nfunction Badge({ className, variant, asChild = false, ...props }) {\n\treturn /* @__PURE__ */ jsx(asChild ? Slot : \"span\", {\n\t\t\"data-slot\": \"badge\",\n\t\tclassName: cn(badgeVariants({ variant }), className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Badge, badgeVariants };\n//# sourceMappingURL=badge.js.map"],"mappings":";;;;;;;AAOA,MAAM,gBAAgB,IAAI,kZAAkZ;CAC3a,UAAU,EAAE,SAAS;EACpB,SAAS;EACT,WAAW;EACX,aAAa;EACb,SAAS;EACT,EAAE;CACH,iBAAiB,EAAE,SAAS,WAAW;CACvC,CAAC;AACF,SAAS,MAAM,EAAE,WAAW,SAAS,UAAU,OAAO,GAAG,SAAS;AACjE,QAAuB,oBAAI,UAAU,OAAO,QAAQ;EACnD,aAAa;EACb,WAAW,GAAG,cAAc,EAAE,SAAS,CAAC,EAAE,UAAU;EACpD,GAAG;EACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scroll-area.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/scroll-area.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\n\n//#region ui/scroll-area.tsx\nfunction ScrollArea({ className, children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {\n\t\t\"data-slot\": \"scroll-area\",\n\t\tclassName: cn(\"relative\", className),\n\t\t...props,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {\n\t\t\t\t\"data-slot\": \"scroll-area-viewport\",\n\t\t\t\tclassName: \"focus-visible:ring-ring/50 size-full rounded-[inherit] outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1\",\n\t\t\t\tchildren\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(ScrollBar, {}),\n\t\t\t/* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})\n\t\t]\n\t});\n}\nfunction ScrollBar({ className, orientation = \"vertical\", ...props }) {\n\treturn /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, {\n\t\t\"data-slot\": \"scroll-area-scrollbar\",\n\t\torientation,\n\t\tclassName: cn(\"flex touch-none p-px transition-colors select-none\", orientation === \"vertical\" && \"h-full w-2.5 border-l border-l-transparent\", orientation === \"horizontal\" && \"h-2.5 flex-col border-t border-t-transparent\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, {\n\t\t\t\"data-slot\": \"scroll-area-thumb\",\n\t\t\tclassName: \"bg-border relative flex-1 rounded-full\"\n\t\t})\n\t});\n}\n\n//#endregion\nexport { ScrollArea, ScrollBar };\n//# sourceMappingURL=scroll-area.js.map"],"mappings":";;;;;;;;AAQA,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAS;AACtD,QAAuB,qBAAK,oBAAoB,MAAM;EACrD,aAAa;EACb,WAAW,GAAG,YAAY,UAAU;EACpC,GAAG;EACH,UAAU;GACO,oBAAI,oBAAoB,UAAU;IACjD,aAAa;IACb,WAAW;IACX;IACA,CAAC;GACc,oBAAI,WAAW,EAAE,CAAC;GAClB,oBAAI,oBAAoB,QAAQ,EAAE,CAAC;GACnD;EACD,CAAC;;AAEH,SAAS,UAAU,EAAE,WAAW,cAAc,YAAY,GAAG,SAAS;AACrE,QAAuB,oBAAI,oBAAoB,qBAAqB;EACnE,aAAa;EACb;EACA,WAAW,GAAG,sDAAsD,gBAAgB,cAAc,8CAA8C,gBAAgB,gBAAgB,gDAAgD,UAAU;EAC1O,GAAG;EACH,UAA0B,oBAAI,oBAAoB,iBAAiB;GAClE,aAAa;GACb,WAAW;GACX,CAAC;EACF,CAAC"}
|
|
@@ -76,4 +76,5 @@ function SelectScrollDownButton({ className, ...props }) {
|
|
|
76
76
|
}
|
|
77
77
|
|
|
78
78
|
//#endregion
|
|
79
|
-
export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
|
|
79
|
+
export { Select, SelectContent, SelectItem, SelectTrigger, SelectValue };
|
|
80
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/select.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { CheckIcon, ChevronDownIcon, ChevronUpIcon } from \"lucide-react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as SelectPrimitive from \"@radix-ui/react-select\";\n\n//#region ui/select.tsx\nfunction Select({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Root, {\n\t\t\"data-slot\": \"select\",\n\t\t...props\n\t});\n}\nfunction SelectGroup({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Group, {\n\t\t\"data-slot\": \"select-group\",\n\t\t...props\n\t});\n}\nfunction SelectValue({ ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Value, {\n\t\t\"data-slot\": \"select-value\",\n\t\t...props\n\t});\n}\nfunction SelectTrigger({ className, size = \"default\", children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(SelectPrimitive.Trigger, {\n\t\t\"data-slot\": \"select-trigger\",\n\t\t\"data-size\": size,\n\t\tclassName: cn(\"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive border-input focus-visible:border-ring focus-visible:ring-ring/50 data-placeholder:text-muted-foreground dark:bg-input/30 dark:hover:bg-input/50 [&_svg:not([class*='text-'])]:text-muted-foreground flex w-fit items-center justify-between gap-2 rounded-md border bg-transparent px-3 py-2 text-sm whitespace-nowrap shadow-2xs outline-hidden transition-[color,box-shadow] focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50 data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=select-value]:line-clamp-1 *:data-[slot=select-value]:flex *:data-[slot=select-value]:items-center *:data-[slot=select-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\", className),\n\t\t...props,\n\t\tchildren: [children, /* @__PURE__ */ jsx(SelectPrimitive.Icon, {\n\t\t\tasChild: true,\n\t\t\tchildren: /* @__PURE__ */ jsx(ChevronDownIcon, { className: \"size-4 opacity-50\" })\n\t\t})]\n\t});\n}\nfunction SelectContent({ className, children, position = \"popper\", ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Portal, { children: /* @__PURE__ */ jsxs(SelectPrimitive.Content, {\n\t\t\"data-slot\": \"select-content\",\n\t\tclassName: cn(\"bg-popover text-popover-foreground 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 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 relative z-50 max-h-(--radix-select-content-available-height) min-w-32 origin-(--radix-select-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border shadow-md\", position === \"popper\" && \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\", className),\n\t\tposition,\n\t\t...props,\n\t\tchildren: [\n\t\t\t/* @__PURE__ */ jsx(SelectScrollUpButton, {}),\n\t\t\t/* @__PURE__ */ jsx(SelectPrimitive.Viewport, {\n\t\t\t\tclassName: cn(\"p-1\", position === \"popper\" && \"h-(--radix-select-trigger-height) w-full min-w-(--radix-select-trigger-width) scroll-my-1\"),\n\t\t\t\tchildren\n\t\t\t}),\n\t\t\t/* @__PURE__ */ jsx(SelectScrollDownButton, {})\n\t\t]\n\t}) });\n}\nfunction SelectLabel({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Label, {\n\t\t\"data-slot\": \"select-label\",\n\t\tclassName: cn(\"text-muted-foreground px-2 py-1.5 text-xs\", className),\n\t\t...props\n\t});\n}\nfunction SelectItem({ className, children, ...props }) {\n\treturn /* @__PURE__ */ jsxs(SelectPrimitive.Item, {\n\t\t\"data-slot\": \"select-item\",\n\t\tclassName: cn(\"focus:bg-accent focus:text-accent-foreground [&_svg:not([class*='text-'])]:text-muted-foreground relative flex w-full cursor-default items-center gap-2 rounded-xs py-1.5 pr-8 pl-2 text-sm outline-hidden select-none data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2\", className),\n\t\t...props,\n\t\tchildren: [/* @__PURE__ */ jsx(\"span\", {\n\t\t\tclassName: \"absolute right-2 flex size-3.5 items-center justify-center\",\n\t\t\tchildren: /* @__PURE__ */ jsx(SelectPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx(CheckIcon, { className: \"size-4\" }) })\n\t\t}), /* @__PURE__ */ jsx(SelectPrimitive.ItemText, { children })]\n\t});\n}\nfunction SelectSeparator({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.Separator, {\n\t\t\"data-slot\": \"select-separator\",\n\t\tclassName: cn(\"bg-border pointer-events-none -mx-1 my-1 h-px\", className),\n\t\t...props\n\t});\n}\nfunction SelectScrollUpButton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.ScrollUpButton, {\n\t\t\"data-slot\": \"select-scroll-up-button\",\n\t\tclassName: cn(\"flex cursor-default items-center justify-center py-1\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ChevronUpIcon, { className: \"size-4\" })\n\t});\n}\nfunction SelectScrollDownButton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(SelectPrimitive.ScrollDownButton, {\n\t\t\"data-slot\": \"select-scroll-down-button\",\n\t\tclassName: cn(\"flex cursor-default items-center justify-center py-1\", className),\n\t\t...props,\n\t\tchildren: /* @__PURE__ */ jsx(ChevronDownIcon, { className: \"size-4\" })\n\t});\n}\n\n//#endregion\nexport { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue };\n//# sourceMappingURL=select.js.map"],"mappings":";;;;;;;;;AASA,SAAS,OAAO,EAAE,GAAG,SAAS;AAC7B,QAAuB,oBAAI,gBAAgB,MAAM;EAChD,aAAa;EACb,GAAG;EACH,CAAC;;AAQH,SAAS,YAAY,EAAE,GAAG,SAAS;AAClC,QAAuB,oBAAI,gBAAgB,OAAO;EACjD,aAAa;EACb,GAAG;EACH,CAAC;;AAEH,SAAS,cAAc,EAAE,WAAW,OAAO,WAAW,UAAU,GAAG,SAAS;AAC3E,QAAuB,qBAAK,gBAAgB,SAAS;EACpD,aAAa;EACb,aAAa;EACb,WAAW,GAAG,izBAAizB,UAAU;EACz0B,GAAG;EACH,UAAU,CAAC,UAA0B,oBAAI,gBAAgB,MAAM;GAC9D,SAAS;GACT,UAA0B,oBAAI,iBAAiB,EAAE,WAAW,qBAAqB,CAAC;GAClF,CAAC,CAAC;EACH,CAAC;;AAEH,SAAS,cAAc,EAAE,WAAW,UAAU,WAAW,UAAU,GAAG,SAAS;AAC9E,QAAuB,oBAAI,gBAAgB,QAAQ,EAAE,UAA0B,qBAAK,gBAAgB,SAAS;EAC5G,aAAa;EACb,WAAW,GAAG,6iBAA6iB,aAAa,YAAY,mIAAmI,UAAU;EACjuB;EACA,GAAG;EACH,UAAU;GACO,oBAAI,sBAAsB,EAAE,CAAC;GAC7B,oBAAI,gBAAgB,UAAU;IAC7C,WAAW,GAAG,OAAO,aAAa,YAAY,4FAA4F;IAC1I;IACA,CAAC;GACc,oBAAI,wBAAwB,EAAE,CAAC;GAC/C;EACD,CAAC,EAAE,CAAC;;AASN,SAAS,WAAW,EAAE,WAAW,UAAU,GAAG,SAAS;AACtD,QAAuB,qBAAK,gBAAgB,MAAM;EACjD,aAAa;EACb,WAAW,GAAG,yaAAya,UAAU;EACjc,GAAG;EACH,UAAU,CAAiB,oBAAI,QAAQ;GACtC,WAAW;GACX,UAA0B,oBAAI,gBAAgB,eAAe,EAAE,UAA0B,oBAAI,WAAW,EAAE,WAAW,UAAU,CAAC,EAAE,CAAC;GACnI,CAAC,EAAkB,oBAAI,gBAAgB,UAAU,EAAE,UAAU,CAAC,CAAC;EAChE,CAAC;;AASH,SAAS,qBAAqB,EAAE,WAAW,GAAG,SAAS;AACtD,QAAuB,oBAAI,gBAAgB,gBAAgB;EAC1D,aAAa;EACb,WAAW,GAAG,wDAAwD,UAAU;EAChF,GAAG;EACH,UAA0B,oBAAI,eAAe,EAAE,WAAW,UAAU,CAAC;EACrE,CAAC;;AAEH,SAAS,uBAAuB,EAAE,WAAW,GAAG,SAAS;AACxD,QAAuB,oBAAI,gBAAgB,kBAAkB;EAC5D,aAAa;EACb,WAAW,GAAG,wDAAwD,UAAU;EAChF,GAAG;EACH,UAA0B,oBAAI,iBAAiB,EAAE,WAAW,UAAU,CAAC;EACvE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/skeleton.js"],"sourcesContent":["import { cn } from \"./utils.js\";\nimport { jsx } from \"react/jsx-runtime\";\n\n//#region ui/skeleton.tsx\nfunction Skeleton({ className, ...props }) {\n\treturn /* @__PURE__ */ jsx(\"div\", {\n\t\t\"data-slot\": \"skeleton\",\n\t\tclassName: cn(\"bg-accent animate-pulse rounded-md\", className),\n\t\t...props\n\t});\n}\n\n//#endregion\nexport { Skeleton };\n//# sourceMappingURL=skeleton.js.map"],"mappings":";;;;AAIA,SAAS,SAAS,EAAE,WAAW,GAAG,SAAS;AAC1C,QAAuB,oBAAI,OAAO;EACjC,aAAa;EACb,WAAW,GAAG,sCAAsC,UAAU;EAC9D,GAAG;EACH,CAAC"}
|
|
@@ -36,4 +36,5 @@ function TooltipContent({ className, sideOffset = 0, children, ...props }) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
//#endregion
|
|
39
|
-
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
39
|
+
export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };
|
|
40
|
+
//# sourceMappingURL=tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tooltip.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/tooltip.js"],"sourcesContent":["'use client';\n\nimport { cn } from \"../ui-kit-core/dist/utils.js\";\nimport \"react\";\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\n\n//#region ui/tooltip.tsx\nfunction TooltipProvider({ delayDuration = 0, ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Provider, {\n\t\t\"data-slot\": \"tooltip-provider\",\n\t\tdelayDuration,\n\t\t...props\n\t});\n}\nfunction Tooltip({ ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, {\n\t\t\"data-slot\": \"tooltip\",\n\t\t...props\n\t}) });\n}\nfunction TooltipTrigger({ ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Trigger, {\n\t\t\"data-slot\": \"tooltip-trigger\",\n\t\t...props\n\t});\n}\nfunction TooltipContent({ className, sideOffset = 0, children, ...props }) {\n\treturn /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(TooltipPrimitive.Content, {\n\t\t\"data-slot\": \"tooltip-content\",\n\t\tsideOffset,\n\t\tclassName: cn(\"bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance\", className),\n\t\t...props,\n\t\tchildren: [children, /* @__PURE__ */ jsx(TooltipPrimitive.Arrow, { className: \"bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%-2px)] rotate-45 rounded-[2px]\" })]\n\t}) });\n}\n\n//#endregion\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n//# sourceMappingURL=tooltip.js.map"],"mappings":";;;;;;;;AAQA,SAAS,gBAAgB,EAAE,gBAAgB,GAAG,GAAG,SAAS;AACzD,QAAuB,oBAAI,iBAAiB,UAAU;EACrD,aAAa;EACb;EACA,GAAG;EACH,CAAC;;AAEH,SAAS,QAAQ,EAAE,GAAG,SAAS;AAC9B,QAAuB,oBAAI,iBAAiB,EAAE,UAA0B,oBAAI,iBAAiB,MAAM;EAClG,aAAa;EACb,GAAG;EACH,CAAC,EAAE,CAAC;;AAEN,SAAS,eAAe,EAAE,GAAG,SAAS;AACrC,QAAuB,oBAAI,iBAAiB,SAAS;EACpD,aAAa;EACb,GAAG;EACH,CAAC;;AAEH,SAAS,eAAe,EAAE,WAAW,aAAa,GAAG,UAAU,GAAG,SAAS;AAC1E,QAAuB,oBAAI,iBAAiB,QAAQ,EAAE,UAA0B,qBAAK,iBAAiB,SAAS;EAC9G,aAAa;EACb;EACA,WAAW,GAAG,qaAAqa,UAAU;EAC7b,GAAG;EACH,UAAU,CAAC,UAA0B,oBAAI,iBAAiB,OAAO,EAAE,WAAW,oGAAoG,CAAC,CAAC;EACpL,CAAC,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../libs/ui-kit-web/dist/ui/utils.js"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ui/utils.ts\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n\n//#endregion\nexport { cn };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;AAIA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","names":[],"sources":["../../../../../../../../libs/ui-kit-web/dist/ui-kit-core/dist/utils.js"],"sourcesContent":["import { clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n//#region ../ui-kit-core/dist/utils.js\nfunction cn(...inputs) {\n\treturn twMerge(clsx(inputs));\n}\n\n//#endregion\nexport { cn };\n//# sourceMappingURL=utils.js.map"],"mappings":";;;;AAIA,SAAS,GAAG,GAAG,QAAQ;AACtB,QAAO,QAAQ,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatContainer.d.ts","names":[],"sources":["../../../src/presentation/components/ChatContainer.tsx"],"sourcesContent":[],"mappings":";;;;UAMiB,kBAAA;YACL,KAAA,CAAM;;EADD;EAUD,gBAAa,CAAA,EAAA,OAAA;;;;;AAIR,iBAJL,aAAA,CAIK;EAAA,QAAA;EAAA,SAAA;EAAA;AAAA,CAAA,EAAlB,kBAAkB,CAAA,EAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatContainer.js","names":[],"sources":["../../../src/presentation/components/ChatContainer.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ScrollArea } from '@lssm/lib.ui-kit-web/ui/scroll-area';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\n\nexport interface ChatContainerProps {\n children: React.ReactNode;\n className?: string;\n /** Show scroll-to-bottom button when scrolled up */\n showScrollButton?: boolean;\n}\n\n/**\n * Container component for chat messages with scrolling\n */\nexport function ChatContainer({\n children,\n className,\n showScrollButton = true,\n}: ChatContainerProps) {\n const scrollRef = React.useRef<HTMLDivElement>(null);\n const [showScrollDown, setShowScrollDown] = React.useState(false);\n\n // Auto-scroll to bottom when children change\n React.useEffect(() => {\n const container = scrollRef.current;\n if (!container) return;\n\n // Check if user has scrolled up\n const isAtBottom =\n container.scrollHeight - container.scrollTop <=\n container.clientHeight + 100;\n\n if (isAtBottom) {\n container.scrollTop = container.scrollHeight;\n }\n }, [children]);\n\n // Track scroll position for scroll-to-bottom button\n const handleScroll = React.useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n const container = event.currentTarget;\n const isAtBottom =\n container.scrollHeight - container.scrollTop <=\n container.clientHeight + 100;\n setShowScrollDown(!isAtBottom);\n },\n []\n );\n\n const scrollToBottom = React.useCallback(() => {\n const container = scrollRef.current;\n if (container) {\n container.scrollTo({\n top: container.scrollHeight,\n behavior: 'smooth',\n });\n }\n }, []);\n\n return (\n <div className={cn('relative flex flex-1 flex-col', className)}>\n <ScrollArea ref={scrollRef} className=\"flex-1\" onScroll={handleScroll}>\n <div className=\"flex flex-col gap-4 p-4\">{children}</div>\n </ScrollArea>\n\n {showScrollButton && showScrollDown && (\n <button\n onClick={scrollToBottom}\n className={cn(\n 'absolute bottom-4 left-1/2 -translate-x-1/2',\n 'bg-primary text-primary-foreground',\n 'rounded-full px-3 py-1.5 text-sm font-medium shadow-lg',\n 'hover:bg-primary/90 transition-colors',\n 'flex items-center gap-1.5'\n )}\n aria-label=\"Scroll to bottom\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n New messages\n </button>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAgB,cAAc,EAC5B,UACA,WACA,mBAAmB,QACE;CACrB,MAAM,YAAY,MAAM,OAAuB,KAAK;CACpD,MAAM,CAAC,gBAAgB,qBAAqB,MAAM,SAAS,MAAM;AAGjE,OAAM,gBAAgB;EACpB,MAAM,YAAY,UAAU;AAC5B,MAAI,CAAC,UAAW;AAOhB,MAHE,UAAU,eAAe,UAAU,aACnC,UAAU,eAAe,IAGzB,WAAU,YAAY,UAAU;IAEjC,CAAC,SAAS,CAAC;CAGd,MAAM,eAAe,MAAM,aACxB,UAAyC;EACxC,MAAM,YAAY,MAAM;AAIxB,oBAAkB,EAFhB,UAAU,eAAe,UAAU,aACnC,UAAU,eAAe,KACG;IAEhC,EAAE,CACH;CAED,MAAM,iBAAiB,MAAM,kBAAkB;EAC7C,MAAM,YAAY,UAAU;AAC5B,MAAI,UACF,WAAU,SAAS;GACjB,KAAK,UAAU;GACf,UAAU;GACX,CAAC;IAEH,EAAE,CAAC;AAEN,QACE,qBAAC;EAAI,WAAW,GAAG,iCAAiC,UAAU;aAC5D,oBAAC;GAAW,KAAK;GAAW,WAAU;GAAS,UAAU;aACvD,oBAAC;IAAI,WAAU;IAA2B;KAAe;IAC9C,EAEZ,oBAAoB,kBACnB,qBAAC;GACC,SAAS;GACT,WAAW,GACT,+CACA,sCACA,0DACA,yCACA,4BACD;GACD,cAAW;cAEX,oBAAC;IACC,OAAM;IACN,OAAM;IACN,QAAO;IACP,SAAQ;IACR,MAAK;IACL,QAAO;IACP,aAAY;IACZ,eAAc;IACd,gBAAe;cAEf,oBAAC,UAAK,GAAE,iBAAiB;KACrB;IAEC;GAEP"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ChatAttachment } from "../../core/message-types.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime2 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ChatInput.d.ts
|
|
5
5
|
interface ChatInputProps {
|
|
@@ -29,6 +29,7 @@ declare function ChatInput({
|
|
|
29
29
|
className,
|
|
30
30
|
showAttachments,
|
|
31
31
|
maxAttachments
|
|
32
|
-
}: ChatInputProps):
|
|
32
|
+
}: ChatInputProps): react_jsx_runtime2.JSX.Element;
|
|
33
33
|
//#endregion
|
|
34
|
-
export { ChatInput };
|
|
34
|
+
export { ChatInput };
|
|
35
|
+
//# sourceMappingURL=ChatInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.d.ts","names":[],"sources":["../../../src/presentation/components/ChatInput.tsx"],"sourcesContent":[],"mappings":";;;;UASiB,cAAA;;0CAEyB;EAFzB;EAoBD,QAAA,CAAA,EAAA,OAAS;EACvB;EACA,SAAA,CAAA,EAAA,OAAA;EACA;EACA,WAAA,CAAA,EAAA,MAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACC,eAAA,CAAA,EAAA,OAAA;EAAc;EAAA,cAAA,CAAA,EAAA,MAAA;;;;;iBARD,SAAA;;;;;;;;GAQb,iBAAc,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
|
|
4
|
-
import { Button
|
|
5
|
-
import { Textarea
|
|
4
|
+
import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
|
|
5
|
+
import { Textarea } from "../../libs/design-system/dist/components/atoms/Textarea.js";
|
|
6
6
|
import * as React from "react";
|
|
7
7
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import { Code, FileText, Loader2, Paperclip, Send, X } from "lucide-react";
|
|
@@ -106,7 +106,7 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
|
|
|
106
106
|
onChange: handleFileSelect,
|
|
107
107
|
className: "hidden",
|
|
108
108
|
"aria-label": "Attach files"
|
|
109
|
-
}), /* @__PURE__ */ jsx(Button
|
|
109
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
110
110
|
type: "button",
|
|
111
111
|
variant: "ghost",
|
|
112
112
|
size: "sm",
|
|
@@ -117,18 +117,18 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
|
|
|
117
117
|
})] }),
|
|
118
118
|
/* @__PURE__ */ jsx("div", {
|
|
119
119
|
className: "relative flex-1",
|
|
120
|
-
children: /* @__PURE__ */ jsx(Textarea
|
|
120
|
+
children: /* @__PURE__ */ jsx(Textarea, {
|
|
121
121
|
value: content,
|
|
122
122
|
onChange: (e) => setContent(e.target.value),
|
|
123
123
|
onKeyDown: handleKeyDown,
|
|
124
124
|
placeholder,
|
|
125
125
|
disabled,
|
|
126
|
-
className: cn("
|
|
126
|
+
className: cn("max-h-[200px] min-h-[44px] resize-none pr-12", "focus-visible:ring-1"),
|
|
127
127
|
rows: 1,
|
|
128
128
|
"aria-label": "Chat message"
|
|
129
129
|
})
|
|
130
130
|
}),
|
|
131
|
-
/* @__PURE__ */ jsx(Button
|
|
131
|
+
/* @__PURE__ */ jsx(Button, {
|
|
132
132
|
type: "submit",
|
|
133
133
|
disabled: !canSend || disabled || isLoading,
|
|
134
134
|
size: "sm",
|
|
@@ -146,4 +146,5 @@ function ChatInput({ onSend, disabled = false, isLoading = false, placeholder =
|
|
|
146
146
|
}
|
|
147
147
|
|
|
148
148
|
//#endregion
|
|
149
|
-
export { ChatInput };
|
|
149
|
+
export { ChatInput };
|
|
150
|
+
//# sourceMappingURL=ChatInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.js","names":["newAttachments: ChatAttachment[]","content"],"sources":["../../../src/presentation/components/ChatInput.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Textarea } from '@lssm/lib.design-system';\nimport { Button } from '@lssm/lib.design-system';\nimport { Send, Paperclip, X, Loader2, FileText, Code } from 'lucide-react';\nimport type { ChatAttachment } from '../../core/message-types';\n\nexport interface ChatInputProps {\n /** Called when a message is sent */\n onSend: (content: string, attachments?: ChatAttachment[]) => void;\n /** Whether input is disabled (e.g., during streaming) */\n disabled?: boolean;\n /** Whether currently loading/streaming */\n isLoading?: boolean;\n /** Placeholder text */\n placeholder?: string;\n /** Additional class name */\n className?: string;\n /** Show attachment button */\n showAttachments?: boolean;\n /** Max attachments allowed */\n maxAttachments?: number;\n}\n\n/**\n * Chat input component with attachment support\n */\nexport function ChatInput({\n onSend,\n disabled = false,\n isLoading = false,\n placeholder = 'Type a message...',\n className,\n showAttachments = true,\n maxAttachments = 5,\n}: ChatInputProps) {\n const [content, setContent] = React.useState('');\n const [attachments, setAttachments] = React.useState<ChatAttachment[]>([]);\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n\n const canSend = content.trim().length > 0 || attachments.length > 0;\n\n const handleSubmit = React.useCallback(\n (e?: React.FormEvent) => {\n e?.preventDefault();\n if (!canSend || disabled || isLoading) return;\n\n onSend(content.trim(), attachments.length > 0 ? attachments : undefined);\n setContent('');\n setAttachments([]);\n\n // Focus back on textarea\n textareaRef.current?.focus();\n },\n [canSend, content, attachments, disabled, isLoading, onSend]\n );\n\n const handleKeyDown = React.useCallback(\n (e: React.KeyboardEvent) => {\n // Submit on Enter (without Shift)\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault();\n handleSubmit();\n }\n },\n [handleSubmit]\n );\n\n const handleFileSelect = React.useCallback(\n async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (!files) return;\n\n const newAttachments: ChatAttachment[] = [];\n\n for (const file of Array.from(files)) {\n if (attachments.length + newAttachments.length >= maxAttachments) break;\n\n const content = await file.text();\n const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n const isCode = [\n 'ts',\n 'tsx',\n 'js',\n 'jsx',\n 'py',\n 'go',\n 'rs',\n 'java',\n ].includes(extension);\n\n newAttachments.push({\n id: `att_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`,\n type: isCode ? 'code' : 'file',\n name: file.name,\n content,\n mimeType: file.type,\n size: file.size,\n });\n }\n\n setAttachments((prev) => [...prev, ...newAttachments]);\n\n // Reset file input\n e.target.value = '';\n },\n [attachments.length, maxAttachments]\n );\n\n const removeAttachment = React.useCallback((id: string) => {\n setAttachments((prev) => prev.filter((a) => a.id !== id));\n }, []);\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n {/* Attachments preview */}\n {attachments.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {attachments.map((attachment) => (\n <div\n key={attachment.id}\n className={cn(\n 'flex items-center gap-1.5 rounded-md px-2 py-1',\n 'bg-muted text-muted-foreground text-sm'\n )}\n >\n {attachment.type === 'code' ? (\n <Code className=\"h-3.5 w-3.5\" />\n ) : (\n <FileText className=\"h-3.5 w-3.5\" />\n )}\n <span className=\"max-w-[150px] truncate\">{attachment.name}</span>\n <button\n type=\"button\"\n onClick={() => removeAttachment(attachment.id)}\n className=\"hover:text-foreground\"\n aria-label={`Remove ${attachment.name}`}\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Input form */}\n <form onSubmit={handleSubmit} className=\"flex items-end gap-2\">\n {/* Attachment button */}\n {showAttachments && (\n <>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept=\".ts,.tsx,.js,.jsx,.json,.md,.txt,.py,.go,.rs,.java,.yaml,.yml\"\n onChange={handleFileSelect}\n className=\"hidden\"\n aria-label=\"Attach files\"\n />\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => fileInputRef.current?.click()}\n disabled={disabled || attachments.length >= maxAttachments}\n aria-label=\"Attach files\"\n >\n <Paperclip className=\"h-4 w-4\" />\n </Button>\n </>\n )}\n\n {/* Text input */}\n <div className=\"relative flex-1\">\n <Textarea\n value={content}\n onChange={(e) => setContent(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n disabled={disabled}\n className={cn(\n 'max-h-[200px] min-h-[44px] resize-none pr-12',\n 'focus-visible:ring-1'\n )}\n rows={1}\n aria-label=\"Chat message\"\n />\n </div>\n\n {/* Send button */}\n <Button\n type=\"submit\"\n disabled={!canSend || disabled || isLoading}\n size=\"sm\"\n aria-label={isLoading ? 'Sending...' : 'Send message'}\n >\n {isLoading ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n <Send className=\"h-4 w-4\" />\n )}\n </Button>\n </form>\n\n {/* Helper text */}\n <p className=\"text-muted-foreground text-xs\">\n Press Enter to send, Shift+Enter for new line\n </p>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { ChatMessage } from "../../core/message-types.js";
|
|
2
|
-
import * as
|
|
1
|
+
import { ChatMessage as ChatMessage$1 } from "../../core/message-types.js";
|
|
2
|
+
import * as react_jsx_runtime1 from "react/jsx-runtime";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ChatMessage.d.ts
|
|
5
5
|
interface ChatMessageProps {
|
|
6
|
-
message: ChatMessage;
|
|
6
|
+
message: ChatMessage$1;
|
|
7
7
|
className?: string;
|
|
8
8
|
/** Show copy button */
|
|
9
9
|
showCopy?: boolean;
|
|
@@ -13,11 +13,12 @@ interface ChatMessageProps {
|
|
|
13
13
|
/**
|
|
14
14
|
* Chat message component
|
|
15
15
|
*/
|
|
16
|
-
declare function ChatMessage
|
|
16
|
+
declare function ChatMessage({
|
|
17
17
|
message,
|
|
18
18
|
className,
|
|
19
19
|
showCopy,
|
|
20
20
|
showAvatar
|
|
21
|
-
}: ChatMessageProps):
|
|
21
|
+
}: ChatMessageProps): react_jsx_runtime1.JSX.Element;
|
|
22
22
|
//#endregion
|
|
23
|
-
export { ChatMessage
|
|
23
|
+
export { ChatMessage };
|
|
24
|
+
//# sourceMappingURL=ChatMessage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.d.ts","names":[],"sources":["../../../src/presentation/components/ChatMessage.tsx"],"sourcesContent":[],"mappings":";;;;UAWiB,gBAAA;WACN;;EADM;EA+ED,QAAA,CAAA,EAAA,OAAW;EACzB;EACA,UAAA,CAAA,EAAA,OAAA;;;;;AAGiB,iBALH,WAAA,CAKG;EAAA,OAAA;EAAA,SAAA;EAAA,QAAA;EAAA;AAAA,CAAA,EAAhB,gBAAgB,CAAA,EAAA,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
|
|
4
4
|
import { Avatar, AvatarFallback } from "../../libs/ui-kit-web/dist/ui/avatar.js";
|
|
5
5
|
import { Skeleton } from "../../libs/ui-kit-web/dist/ui/skeleton.js";
|
|
6
|
-
import { Button
|
|
6
|
+
import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
|
|
7
7
|
import { CodePreview } from "./CodePreview.js";
|
|
8
8
|
import * as React from "react";
|
|
9
9
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -103,7 +103,7 @@ function ChatMessage({ message, className, showCopy = true, showAvatar = true })
|
|
|
103
103
|
minute: "2-digit"
|
|
104
104
|
}) }),
|
|
105
105
|
message.usage && /* @__PURE__ */ jsxs("span", { children: [message.usage.inputTokens + message.usage.outputTokens, " tokens"] }),
|
|
106
|
-
showCopy && !isUser && message.content && /* @__PURE__ */ jsx(Button
|
|
106
|
+
showCopy && !isUser && message.content && /* @__PURE__ */ jsx(Button, {
|
|
107
107
|
variant: "ghost",
|
|
108
108
|
size: "sm",
|
|
109
109
|
className: "h-6 w-6 p-0",
|
|
@@ -132,4 +132,5 @@ function ChatMessage({ message, className, showCopy = true, showAvatar = true })
|
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
//#endregion
|
|
135
|
-
export { ChatMessage };
|
|
135
|
+
export { ChatMessage };
|
|
136
|
+
//# sourceMappingURL=ChatMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatMessage.js","names":["blocks: { language: string; code: string; raw: string }[]","parts: React.ReactNode[]"],"sources":["../../../src/presentation/components/ChatMessage.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Avatar, AvatarFallback } from '@lssm/lib.ui-kit-web/ui/avatar';\nimport { Skeleton } from '@lssm/lib.ui-kit-web/ui/skeleton';\nimport { Bot, User, AlertCircle, Copy, Check } from 'lucide-react';\nimport { Button } from '@lssm/lib.design-system';\nimport type { ChatMessage as ChatMessageType } from '../../core/message-types';\nimport { CodePreview } from './CodePreview';\n\nexport interface ChatMessageProps {\n message: ChatMessageType;\n className?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Show avatar */\n showAvatar?: boolean;\n}\n\n/**\n * Extract code blocks from message content\n */\nfunction extractCodeBlocks(\n content: string\n): { language: string; code: string; raw: string }[] {\n const codeBlockRegex = /```(\\w+)?\\n([\\s\\S]*?)```/g;\n const blocks: { language: string; code: string; raw: string }[] = [];\n let match;\n\n while ((match = codeBlockRegex.exec(content)) !== null) {\n blocks.push({\n language: match[1] ?? 'text',\n code: match[2] ?? '',\n raw: match[0],\n });\n }\n\n return blocks;\n}\n\n/**\n * Render message content with code blocks\n */\nfunction MessageContent({ content }: { content: string }) {\n const codeBlocks = extractCodeBlocks(content);\n\n if (codeBlocks.length === 0) {\n return <p className=\"whitespace-pre-wrap\">{content}</p>;\n }\n\n // Split content by code blocks and render\n let remaining = content;\n const parts: React.ReactNode[] = [];\n let key = 0;\n\n for (const block of codeBlocks) {\n const [before, after] = remaining.split(block.raw);\n if (before) {\n parts.push(\n <p key={key++} className=\"whitespace-pre-wrap\">\n {before.trim()}\n </p>\n );\n }\n parts.push(\n <CodePreview\n key={key++}\n code={block.code}\n language={block.language}\n className=\"my-2\"\n />\n );\n remaining = after ?? '';\n }\n\n if (remaining.trim()) {\n parts.push(\n <p key={key++} className=\"whitespace-pre-wrap\">\n {remaining.trim()}\n </p>\n );\n }\n\n return <>{parts}</>;\n}\n\n/**\n * Chat message component\n */\nexport function ChatMessage({\n message,\n className,\n showCopy = true,\n showAvatar = true,\n}: ChatMessageProps) {\n const [copied, setCopied] = React.useState(false);\n\n const isUser = message.role === 'user';\n const isError = message.status === 'error';\n const isStreaming = message.status === 'streaming';\n\n const handleCopy = React.useCallback(async () => {\n await navigator.clipboard.writeText(message.content);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [message.content]);\n\n return (\n <div\n className={cn(\n 'group flex gap-3',\n isUser && 'flex-row-reverse',\n className\n )}\n >\n {showAvatar && (\n <Avatar className=\"h-8 w-8 shrink-0\">\n <AvatarFallback\n className={cn(\n isUser ? 'bg-primary text-primary-foreground' : 'bg-muted'\n )}\n >\n {isUser ? (\n <User className=\"h-4 w-4\" />\n ) : (\n <Bot className=\"h-4 w-4\" />\n )}\n </AvatarFallback>\n </Avatar>\n )}\n\n <div\n className={cn('flex max-w-[80%] flex-col gap-1', isUser && 'items-end')}\n >\n <div\n className={cn(\n 'rounded-2xl px-4 py-2',\n isUser\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-foreground',\n isError && 'border-destructive bg-destructive/10 border'\n )}\n >\n {isError && message.error ? (\n <div className=\"flex items-start gap-2\">\n <AlertCircle className=\"text-destructive mt-0.5 h-4 w-4 shrink-0\" />\n <div>\n <p className=\"text-destructive font-medium\">\n {message.error.code}\n </p>\n <p className=\"text-muted-foreground text-sm\">\n {message.error.message}\n </p>\n </div>\n </div>\n ) : isStreaming && !message.content ? (\n <div className=\"flex flex-col gap-2\">\n <Skeleton className=\"h-4 w-48\" />\n <Skeleton className=\"h-4 w-32\" />\n </div>\n ) : (\n <MessageContent content={message.content} />\n )}\n </div>\n\n {/* Message meta */}\n <div\n className={cn(\n 'flex items-center gap-2 text-xs',\n 'text-muted-foreground opacity-0 transition-opacity',\n 'group-hover:opacity-100'\n )}\n >\n <span>\n {new Date(message.createdAt).toLocaleTimeString([], {\n hour: '2-digit',\n minute: '2-digit',\n })}\n </span>\n\n {message.usage && (\n <span>\n {message.usage.inputTokens + message.usage.outputTokens} tokens\n </span>\n )}\n\n {showCopy && !isUser && message.content && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-6 w-6 p-0\"\n onPress={handleCopy}\n aria-label={copied ? 'Copied' : 'Copy message'}\n >\n {copied ? (\n <Check className=\"h-3 w-3\" />\n ) : (\n <Copy className=\"h-3 w-3\" />\n )}\n </Button>\n )}\n </div>\n\n {/* Reasoning (for models that support it) */}\n {message.reasoning && (\n <details className=\"text-muted-foreground mt-2 text-sm\">\n <summary className=\"cursor-pointer hover:underline\">\n View reasoning\n </summary>\n <div className=\"bg-muted mt-1 rounded-md p-2\">\n <p className=\"whitespace-pre-wrap\">{message.reasoning}</p>\n </div>\n </details>\n )}\n </div>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
2
|
|
|
3
3
|
//#region src/presentation/components/CodePreview.d.ts
|
|
4
4
|
interface CodePreviewProps {
|
|
@@ -34,6 +34,7 @@ declare function CodePreview({
|
|
|
34
34
|
onExecute,
|
|
35
35
|
showDownload,
|
|
36
36
|
maxHeight
|
|
37
|
-
}: CodePreviewProps):
|
|
37
|
+
}: CodePreviewProps): react_jsx_runtime0.JSX.Element;
|
|
38
38
|
//#endregion
|
|
39
|
-
export { CodePreview };
|
|
39
|
+
export { CodePreview };
|
|
40
|
+
//# sourceMappingURL=CodePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodePreview.d.ts","names":[],"sources":["../../../src/presentation/components/CodePreview.tsx"],"sourcesContent":[],"mappings":";;;UAOiB,gBAAA;;;EAAA;EAgDD,QAAA,CAAA,EAAA,MAAW;EACzB;EACA,QAAA,CAAA,EAAA,MAAA;EACA;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACA,QAAA,CAAA,EAAA,OAAA;EACA;EACA,WAAA,CAAA,EAAA,OAAA;EACA;EACC,SAAA,CAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,IAAA;EAAgB;EAAA,YAAA,CAAA,EAAA,OAAA;;;;;;;iBAVH,WAAA;;;;;;;;;;GAUb,mBAAgB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
|
|
4
|
-
import { Button
|
|
4
|
+
import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
|
|
5
5
|
import * as React from "react";
|
|
6
6
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { Check, Copy, Download, Play } from "lucide-react";
|
|
@@ -60,7 +60,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
60
60
|
return /* @__PURE__ */ jsxs("div", {
|
|
61
61
|
className: cn("overflow-hidden rounded-lg border", "bg-muted/50", className),
|
|
62
62
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
63
|
-
className: cn("flex items-center justify-between px-3 py-1.5", "
|
|
63
|
+
className: cn("flex items-center justify-between px-3 py-1.5", "bg-muted/80 border-b"),
|
|
64
64
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
65
65
|
className: "flex items-center gap-2 text-sm",
|
|
66
66
|
children: [filename && /* @__PURE__ */ jsx("span", {
|
|
@@ -73,7 +73,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
73
73
|
}), /* @__PURE__ */ jsxs("div", {
|
|
74
74
|
className: "flex items-center gap-1",
|
|
75
75
|
children: [
|
|
76
|
-
showExecute && onExecute && /* @__PURE__ */ jsx(Button
|
|
76
|
+
showExecute && onExecute && /* @__PURE__ */ jsx(Button, {
|
|
77
77
|
variant: "ghost",
|
|
78
78
|
size: "sm",
|
|
79
79
|
onPress: () => onExecute(code),
|
|
@@ -81,7 +81,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
81
81
|
"aria-label": "Execute code",
|
|
82
82
|
children: /* @__PURE__ */ jsx(Play, { className: "h-3.5 w-3.5" })
|
|
83
83
|
}),
|
|
84
|
-
showDownload && /* @__PURE__ */ jsx(Button
|
|
84
|
+
showDownload && /* @__PURE__ */ jsx(Button, {
|
|
85
85
|
variant: "ghost",
|
|
86
86
|
size: "sm",
|
|
87
87
|
onPress: handleDownload,
|
|
@@ -89,7 +89,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
89
89
|
"aria-label": "Download code",
|
|
90
90
|
children: /* @__PURE__ */ jsx(Download, { className: "h-3.5 w-3.5" })
|
|
91
91
|
}),
|
|
92
|
-
showCopy && /* @__PURE__ */ jsx(Button
|
|
92
|
+
showCopy && /* @__PURE__ */ jsx(Button, {
|
|
93
93
|
variant: "ghost",
|
|
94
94
|
size: "sm",
|
|
95
95
|
onPress: handleCopy,
|
|
@@ -109,7 +109,7 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
109
109
|
children: lines.map((line, i) => /* @__PURE__ */ jsxs("div", {
|
|
110
110
|
className: "flex",
|
|
111
111
|
children: [/* @__PURE__ */ jsx("span", {
|
|
112
|
-
className: "text-muted-foreground mr-4
|
|
112
|
+
className: "text-muted-foreground mr-4 w-8 text-right select-none",
|
|
113
113
|
children: i + 1
|
|
114
114
|
}), /* @__PURE__ */ jsx("span", {
|
|
115
115
|
className: "flex-1",
|
|
@@ -123,4 +123,5 @@ function CodePreview({ code, language = "text", filename, className, showCopy =
|
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
//#endregion
|
|
126
|
-
export { CodePreview };
|
|
126
|
+
export { CodePreview };
|
|
127
|
+
//# sourceMappingURL=CodePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodePreview.js","names":["LANGUAGE_NAMES: Record<string, string>"],"sources":["../../../src/presentation/components/CodePreview.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Button } from '@lssm/lib.design-system';\nimport { Copy, Check, Play, Download } from 'lucide-react';\n\nexport interface CodePreviewProps {\n /** Code content */\n code: string;\n /** Programming language */\n language?: string;\n /** File name */\n filename?: string;\n /** Additional class name */\n className?: string;\n /** Show copy button */\n showCopy?: boolean;\n /** Show execute button (for applicable languages) */\n showExecute?: boolean;\n /** Called when execute is clicked */\n onExecute?: (code: string) => void;\n /** Show download button */\n showDownload?: boolean;\n /** Max height before scroll */\n maxHeight?: number;\n}\n\n/**\n * Language display names\n */\nconst LANGUAGE_NAMES: Record<string, string> = {\n ts: 'TypeScript',\n tsx: 'TypeScript (React)',\n typescript: 'TypeScript',\n js: 'JavaScript',\n jsx: 'JavaScript (React)',\n javascript: 'JavaScript',\n json: 'JSON',\n md: 'Markdown',\n yaml: 'YAML',\n yml: 'YAML',\n bash: 'Bash',\n sh: 'Shell',\n sql: 'SQL',\n py: 'Python',\n python: 'Python',\n go: 'Go',\n rust: 'Rust',\n rs: 'Rust',\n};\n\n/**\n * Code preview component with syntax highlighting placeholder\n */\nexport function CodePreview({\n code,\n language = 'text',\n filename,\n className,\n showCopy = true,\n showExecute = false,\n onExecute,\n showDownload = false,\n maxHeight = 400,\n}: CodePreviewProps) {\n const [copied, setCopied] = React.useState(false);\n\n const displayLanguage = LANGUAGE_NAMES[language.toLowerCase()] ?? language;\n const lines = code.split('\\n');\n\n const handleCopy = React.useCallback(async () => {\n await navigator.clipboard.writeText(code);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }, [code]);\n\n const handleDownload = React.useCallback(() => {\n const blob = new Blob([code], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename ?? `code.${language}`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, [code, filename, language]);\n\n return (\n <div\n className={cn(\n 'overflow-hidden rounded-lg border',\n 'bg-muted/50',\n className\n )}\n >\n {/* Header */}\n <div\n className={cn(\n 'flex items-center justify-between px-3 py-1.5',\n 'bg-muted/80 border-b'\n )}\n >\n <div className=\"flex items-center gap-2 text-sm\">\n {filename && (\n <span className=\"text-foreground font-mono\">{filename}</span>\n )}\n <span className=\"text-muted-foreground\">{displayLanguage}</span>\n </div>\n\n <div className=\"flex items-center gap-1\">\n {showExecute && onExecute && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={() => onExecute(code)}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Execute code\"\n >\n <Play className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n\n {showDownload && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={handleDownload}\n className=\"h-7 w-7 p-0\"\n aria-label=\"Download code\"\n >\n <Download className=\"h-3.5 w-3.5\" />\n </Button>\n )}\n\n {showCopy && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onPress={handleCopy}\n className=\"h-7 w-7 p-0\"\n aria-label={copied ? 'Copied' : 'Copy code'}\n >\n {copied ? (\n <Check className=\"h-3.5 w-3.5 text-green-500\" />\n ) : (\n <Copy className=\"h-3.5 w-3.5\" />\n )}\n </Button>\n )}\n </div>\n </div>\n\n {/* Code content */}\n <div className=\"overflow-auto\" style={{ maxHeight }}>\n <pre className=\"p-3\">\n <code className=\"text-sm\">\n {lines.map((line, i) => (\n <div key={i} className=\"flex\">\n <span className=\"text-muted-foreground mr-4 w-8 text-right select-none\">\n {i + 1}\n </span>\n <span className=\"flex-1\">{line || ' '}</span>\n </div>\n ))}\n </code>\n </pre>\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AA+BA,MAAMA,iBAAyC;CAC7C,IAAI;CACJ,KAAK;CACL,YAAY;CACZ,IAAI;CACJ,KAAK;CACL,YAAY;CACZ,MAAM;CACN,IAAI;CACJ,MAAM;CACN,KAAK;CACL,MAAM;CACN,IAAI;CACJ,KAAK;CACL,IAAI;CACJ,QAAQ;CACR,IAAI;CACJ,MAAM;CACN,IAAI;CACL;;;;AAKD,SAAgB,YAAY,EAC1B,MACA,WAAW,QACX,UACA,WACA,WAAW,MACX,cAAc,OACd,WACA,eAAe,OACf,YAAY,OACO;CACnB,MAAM,CAAC,QAAQ,aAAa,MAAM,SAAS,MAAM;CAEjD,MAAM,kBAAkB,eAAe,SAAS,aAAa,KAAK;CAClE,MAAM,QAAQ,KAAK,MAAM,KAAK;CAE9B,MAAM,aAAa,MAAM,YAAY,YAAY;AAC/C,QAAM,UAAU,UAAU,UAAU,KAAK;AACzC,YAAU,KAAK;AACf,mBAAiB,UAAU,MAAM,EAAE,IAAK;IACvC,CAAC,KAAK,CAAC;CAEV,MAAM,iBAAiB,MAAM,kBAAkB;EAC7C,MAAM,OAAO,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,cAAc,CAAC;EACrD,MAAM,MAAM,IAAI,gBAAgB,KAAK;EACrC,MAAM,IAAI,SAAS,cAAc,IAAI;AACrC,IAAE,OAAO;AACT,IAAE,WAAW,YAAY,QAAQ;AACjC,WAAS,KAAK,YAAY,EAAE;AAC5B,IAAE,OAAO;AACT,WAAS,KAAK,YAAY,EAAE;AAC5B,MAAI,gBAAgB,IAAI;IACvB;EAAC;EAAM;EAAU;EAAS,CAAC;AAE9B,QACE,qBAAC;EACC,WAAW,GACT,qCACA,eACA,UACD;aAGD,qBAAC;GACC,WAAW,GACT,iDACA,uBACD;cAED,qBAAC;IAAI,WAAU;eACZ,YACC,oBAAC;KAAK,WAAU;eAA6B;MAAgB,EAE/D,oBAAC;KAAK,WAAU;eAAyB;MAAuB;KAC5D,EAEN,qBAAC;IAAI,WAAU;;KACZ,eAAe,aACd,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,eAAe,UAAU,KAAK;MAC9B,WAAU;MACV,cAAW;gBAEX,oBAAC,QAAK,WAAU,gBAAgB;OACzB;KAGV,gBACC,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;MACV,cAAW;gBAEX,oBAAC,YAAS,WAAU,gBAAgB;OAC7B;KAGV,YACC,oBAAC;MACC,SAAQ;MACR,MAAK;MACL,SAAS;MACT,WAAU;MACV,cAAY,SAAS,WAAW;gBAE/B,SACC,oBAAC,SAAM,WAAU,+BAA+B,GAEhD,oBAAC,QAAK,WAAU,gBAAgB;OAE3B;;KAEP;IACF,EAGN,oBAAC;GAAI,WAAU;GAAgB,OAAO,EAAE,WAAW;aACjD,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAK,WAAU;eACb,MAAM,KAAK,MAAM,MAChB,qBAAC;MAAY,WAAU;iBACrB,oBAAC;OAAK,WAAU;iBACb,IAAI;QACA,EACP,oBAAC;OAAK,WAAU;iBAAU,QAAQ;QAAW;QAJrC,EAKJ,CACN;MACG;KACH;IACF;GACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextIndicator.d.ts","names":[],"sources":["../../../src/presentation/components/ContextIndicator.tsx"],"sourcesContent":[],"mappings":";;;;UAciB,qBAAA;;YAEL;EAFK;EAcD,MAAA,CAAA,EAAA,OAAA;EACd;EACA,SAAA,CAAA,EAAA,MAAA;EACA;EACA,WAAA,CAAA,EAAA,OAAA;;;;;iBAJc,gBAAA;;;;;GAKb,wBAAqB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContextIndicator.js","names":[],"sources":["../../../src/presentation/components/ContextIndicator.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { cn } from '@lssm/lib.ui-kit-web/ui/utils';\nimport { Badge } from '@lssm/lib.ui-kit-web/ui/badge';\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from '@lssm/lib.ui-kit-web/ui/tooltip';\nimport { FolderOpen, FileCode, Zap, Info } from 'lucide-react';\nimport type { WorkspaceSummary } from '../../context/workspace-context';\n\nexport interface ContextIndicatorProps {\n /** Workspace summary */\n summary?: WorkspaceSummary;\n /** Whether context is active */\n active?: boolean;\n /** Additional class name */\n className?: string;\n /** Show details */\n showDetails?: boolean;\n}\n\n/**\n * Indicator showing active workspace context\n */\nexport function ContextIndicator({\n summary,\n active = false,\n className,\n showDetails = true,\n}: ContextIndicatorProps) {\n if (!summary && !active) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-sm',\n 'text-muted-foreground',\n className\n )}\n >\n <Info className=\"h-4 w-4\" />\n <span>No workspace context</span>\n </div>\n );\n }\n\n const content = (\n <div\n className={cn(\n 'flex items-center gap-2',\n active ? 'text-foreground' : 'text-muted-foreground',\n className\n )}\n >\n <Badge\n variant={active ? 'default' : 'secondary'}\n className=\"flex items-center gap-1\"\n >\n <Zap className=\"h-3 w-3\" />\n Context\n </Badge>\n\n {summary && showDetails && (\n <>\n <div className=\"flex items-center gap-1 text-xs\">\n <FolderOpen className=\"h-3.5 w-3.5\" />\n <span>{summary.name}</span>\n </div>\n\n <div className=\"flex items-center gap-1 text-xs\">\n <FileCode className=\"h-3.5 w-3.5\" />\n <span>{summary.specs.total} specs</span>\n </div>\n </>\n )}\n </div>\n );\n\n if (!summary) {\n return content;\n }\n\n return (\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>{content}</TooltipTrigger>\n <TooltipContent side=\"bottom\" className=\"max-w-[300px]\">\n <div className=\"flex flex-col gap-2 text-sm\">\n <div className=\"font-medium\">{summary.name}</div>\n <div className=\"text-muted-foreground text-xs\">{summary.path}</div>\n\n <div className=\"border-t pt-2\">\n <div className=\"grid grid-cols-2 gap-1 text-xs\">\n <span>Commands:</span>\n <span className=\"text-right\">{summary.specs.commands}</span>\n <span>Queries:</span>\n <span className=\"text-right\">{summary.specs.queries}</span>\n <span>Events:</span>\n <span className=\"text-right\">{summary.specs.events}</span>\n <span>Presentations:</span>\n <span className=\"text-right\">\n {summary.specs.presentations}\n </span>\n </div>\n </div>\n\n <div className=\"border-t pt-2 text-xs\">\n <span>{summary.files.total} files</span>\n <span className=\"mx-1\">•</span>\n <span>{summary.files.specFiles} spec files</span>\n </div>\n </div>\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4BA,SAAgB,iBAAiB,EAC/B,SACA,SAAS,OACT,WACA,cAAc,QACU;AACxB,KAAI,CAAC,WAAW,CAAC,OACf,QACE,qBAAC;EACC,WAAW,GACT,qCACA,yBACA,UACD;aAED,oBAAC,QAAK,WAAU,YAAY,EAC5B,oBAAC,oBAAK,yBAA2B;GAC7B;CAIV,MAAM,UACJ,qBAAC;EACC,WAAW,GACT,2BACA,SAAS,oBAAoB,yBAC7B,UACD;aAED,qBAAC;GACC,SAAS,SAAS,YAAY;GAC9B,WAAU;cAEV,oBAAC,OAAI,WAAU,YAAY;IAErB,EAEP,WAAW,eACV,4CACE,qBAAC;GAAI,WAAU;cACb,oBAAC,cAAW,WAAU,gBAAgB,EACtC,oBAAC,oBAAM,QAAQ,OAAY;IACvB,EAEN,qBAAC;GAAI,WAAU;cACb,oBAAC,YAAS,WAAU,gBAAgB,EACpC,qBAAC,qBAAM,QAAQ,MAAM,OAAM,YAAa;IACpC,IACL;GAED;AAGR,KAAI,CAAC,QACH,QAAO;AAGT,QACE,oBAAC,6BACC,qBAAC,sBACC,oBAAC;EAAe;YAAS;GAAyB,EAClD,oBAAC;EAAe,MAAK;EAAS,WAAU;YACtC,qBAAC;GAAI,WAAU;;IACb,oBAAC;KAAI,WAAU;eAAe,QAAQ;MAAW;IACjD,oBAAC;KAAI,WAAU;eAAiC,QAAQ;MAAW;IAEnE,oBAAC;KAAI,WAAU;eACb,qBAAC;MAAI,WAAU;;OACb,oBAAC,oBAAK,cAAgB;OACtB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAgB;OAC5D,oBAAC,oBAAK,aAAe;OACrB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAe;OAC3D,oBAAC,oBAAK,YAAc;OACpB,oBAAC;QAAK,WAAU;kBAAc,QAAQ,MAAM;SAAc;OAC1D,oBAAC,oBAAK,mBAAqB;OAC3B,oBAAC;QAAK,WAAU;kBACb,QAAQ,MAAM;SACV;;OACH;MACF;IAEN,qBAAC;KAAI,WAAU;;MACb,qBAAC,qBAAM,QAAQ,MAAM,OAAM,YAAa;MACxC,oBAAC;OAAK,WAAU;iBAAO;QAAQ;MAC/B,qBAAC,qBAAM,QAAQ,MAAM,WAAU,iBAAkB;;MAC7C;;IACF;GACS,IACT,GACM"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as react_jsx_runtime3 from "react/jsx-runtime";
|
|
2
2
|
import { ProviderMode, ProviderName } from "@lssm/lib.ai-providers";
|
|
3
3
|
|
|
4
4
|
//#region src/presentation/components/ModelPicker.d.ts
|
|
@@ -13,12 +13,12 @@ interface ModelPickerProps {
|
|
|
13
13
|
/** Called when selection changes */
|
|
14
14
|
onChange: (value: ModelSelection) => void;
|
|
15
15
|
/** Available providers (with availability info) */
|
|
16
|
-
availableProviders?:
|
|
16
|
+
availableProviders?: {
|
|
17
17
|
provider: ProviderName;
|
|
18
18
|
available: boolean;
|
|
19
19
|
mode: ProviderMode;
|
|
20
20
|
reason?: string;
|
|
21
|
-
}
|
|
21
|
+
}[];
|
|
22
22
|
/** Additional class name */
|
|
23
23
|
className?: string;
|
|
24
24
|
/** Compact mode (smaller) */
|
|
@@ -33,6 +33,7 @@ declare function ModelPicker({
|
|
|
33
33
|
availableProviders,
|
|
34
34
|
className,
|
|
35
35
|
compact
|
|
36
|
-
}: ModelPickerProps):
|
|
36
|
+
}: ModelPickerProps): react_jsx_runtime3.JSX.Element;
|
|
37
37
|
//#endregion
|
|
38
|
-
export { ModelPicker };
|
|
38
|
+
export { ModelPicker };
|
|
39
|
+
//# sourceMappingURL=ModelPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelPicker.d.ts","names":[],"sources":["../../../src/presentation/components/ModelPicker.tsx"],"sourcesContent":[],"mappings":";;;;UAqBiB,cAAA;YACL;;EADK,IAAA,EAGT,YAHuB;AAM/B;AAES,UAFQ,gBAAA,CAER;EAEW;EAGN,KAAA,EALL,cAKK;EAEJ;EAAY,QAAA,EAAA,CAAA,KAAA,EALF,cAKE,EAAA,GAAA,IAAA;EAqCN;EACd,kBAAA,CAAA,EAAA;IACA,QAAA,EAzCY,YAyCZ;IACA,SAAA,EAAA,OAAA;IACA,IAAA,EAzCQ,YAyCR;IACA,MAAA,CAAA,EAAA,MAAA;EACC,CAAA,EAAA;EAAgB;EAAA,SAAA,CAAA,EAAA,MAAA;;;;;;;iBANH,WAAA;;;;;;GAMb,mBAAgB,kBAAA,CAAA,GAAA,CAAA"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { getModelsForProvider } from "../../libs/ai-providers/dist/models.js";
|
|
4
4
|
import "../../libs/ai-providers/dist/index.js";
|
|
5
5
|
import { cn } from "../../libs/ui-kit-web/dist/ui/utils.js";
|
|
6
|
-
import { Button
|
|
6
|
+
import { Button } from "../../libs/design-system/dist/components/atoms/Button.js";
|
|
7
7
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../../libs/ui-kit-web/dist/ui/select.js";
|
|
8
8
|
import { Badge } from "../../libs/ui-kit-web/dist/ui/badge.js";
|
|
9
9
|
import * as React from "react";
|
|
@@ -125,7 +125,7 @@ function ModelPicker({ value, onChange, availableProviders, className, compact =
|
|
|
125
125
|
children: "Provider"
|
|
126
126
|
}), /* @__PURE__ */ jsx("div", {
|
|
127
127
|
className: "flex flex-wrap gap-2",
|
|
128
|
-
children: providers.map((p) => /* @__PURE__ */ jsxs(Button
|
|
128
|
+
children: providers.map((p) => /* @__PURE__ */ jsxs(Button, {
|
|
129
129
|
variant: value.provider === p.provider ? "default" : "outline",
|
|
130
130
|
size: "sm",
|
|
131
131
|
onPress: () => p.available && handleProviderChange(p.provider),
|
|
@@ -194,4 +194,5 @@ function ModelPicker({ value, onChange, availableProviders, className, compact =
|
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
//#endregion
|
|
197
|
-
export { ModelPicker };
|
|
197
|
+
export { ModelPicker };
|
|
198
|
+
//# sourceMappingURL=ModelPicker.js.map
|