hazo_chat 4.0.2 → 4.0.5

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 (155) hide show
  1. package/README.md +46 -6
  2. package/SETUP_CHECKLIST.md +12 -2
  3. package/dist/api/index.d.ts +41 -0
  4. package/dist/api/index.d.ts.map +1 -0
  5. package/dist/api/index.js +40 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/messages.d.ts +85 -0
  8. package/dist/api/messages.d.ts.map +1 -0
  9. package/dist/api/messages.js +626 -0
  10. package/dist/api/messages.js.map +1 -0
  11. package/dist/api/types.d.ts +134 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +8 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/api/unread_count.d.ts +82 -0
  16. package/dist/api/unread_count.d.ts.map +1 -0
  17. package/dist/api/unread_count.js +111 -0
  18. package/dist/api/unread_count.js.map +1 -0
  19. package/dist/components/hazo_chat/hazo_chat.d.ts +28 -0
  20. package/dist/components/hazo_chat/hazo_chat.d.ts.map +1 -0
  21. package/dist/components/hazo_chat/hazo_chat.js +230 -0
  22. package/dist/components/hazo_chat/hazo_chat.js.map +1 -0
  23. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +17 -0
  24. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +1 -0
  25. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +60 -0
  26. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +1 -0
  27. package/dist/components/hazo_chat/hazo_chat_context.d.ts +46 -0
  28. package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +1 -0
  29. package/dist/components/hazo_chat/hazo_chat_context.js +277 -0
  30. package/dist/components/hazo_chat/hazo_chat_context.js.map +1 -0
  31. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +15 -0
  32. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +1 -0
  33. package/dist/components/hazo_chat/hazo_chat_document_viewer.js +140 -0
  34. package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +1 -0
  35. package/dist/components/hazo_chat/hazo_chat_header.d.ts +16 -0
  36. package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +1 -0
  37. package/dist/components/hazo_chat/hazo_chat_header.js +45 -0
  38. package/dist/components/hazo_chat/hazo_chat_header.js.map +1 -0
  39. package/dist/components/hazo_chat/hazo_chat_input.d.ts +16 -0
  40. package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +1 -0
  41. package/dist/components/hazo_chat/hazo_chat_input.js +75 -0
  42. package/dist/components/hazo_chat/hazo_chat_input.js.map +1 -0
  43. package/dist/components/hazo_chat/hazo_chat_messages.d.ts +18 -0
  44. package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +1 -0
  45. package/dist/components/hazo_chat/hazo_chat_messages.js +255 -0
  46. package/dist/components/hazo_chat/hazo_chat_messages.js.map +1 -0
  47. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +16 -0
  48. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +1 -0
  49. package/dist/components/hazo_chat/hazo_chat_reference_list.js +59 -0
  50. package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +1 -0
  51. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +18 -0
  52. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +1 -0
  53. package/dist/components/hazo_chat/hazo_chat_sidebar.js +72 -0
  54. package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +1 -0
  55. package/dist/components/hazo_chat/index.d.ts +16 -0
  56. package/dist/components/hazo_chat/index.d.ts.map +1 -0
  57. package/dist/components/hazo_chat/index.js +19 -0
  58. package/dist/components/hazo_chat/index.js.map +1 -0
  59. package/dist/components/index.d.ts +9 -0
  60. package/dist/components/index.d.ts.map +1 -0
  61. package/dist/components/index.js +11 -0
  62. package/dist/components/index.js.map +1 -0
  63. package/dist/components/ui/avatar.d.ts +13 -0
  64. package/dist/components/ui/avatar.d.ts.map +1 -0
  65. package/dist/components/ui/avatar.js +28 -0
  66. package/dist/components/ui/avatar.js.map +1 -0
  67. package/dist/components/ui/badge.d.ts +16 -0
  68. package/dist/components/ui/badge.d.ts.map +1 -0
  69. package/dist/components/ui/badge.js +36 -0
  70. package/dist/components/ui/badge.js.map +1 -0
  71. package/dist/components/ui/button.d.ts +18 -0
  72. package/dist/components/ui/button.d.ts.map +1 -0
  73. package/dist/components/ui/button.js +47 -0
  74. package/dist/components/ui/button.js.map +1 -0
  75. package/dist/components/ui/chat_bubble.d.ts +18 -0
  76. package/dist/components/ui/chat_bubble.d.ts.map +1 -0
  77. package/dist/components/ui/chat_bubble.js +130 -0
  78. package/dist/components/ui/chat_bubble.js.map +1 -0
  79. package/dist/components/ui/hover-card.d.ts +13 -0
  80. package/dist/components/ui/hover-card.d.ts.map +1 -0
  81. package/dist/components/ui/hover-card.js +17 -0
  82. package/dist/components/ui/hover-card.js.map +1 -0
  83. package/dist/components/ui/index.d.ts +19 -0
  84. package/dist/components/ui/index.d.ts.map +1 -0
  85. package/dist/components/ui/index.js +21 -0
  86. package/dist/components/ui/index.js.map +1 -0
  87. package/dist/components/ui/input.d.ts +11 -0
  88. package/dist/components/ui/input.d.ts.map +1 -0
  89. package/dist/components/ui/input.js +18 -0
  90. package/dist/components/ui/input.js.map +1 -0
  91. package/dist/components/ui/loading_skeleton.d.ts +19 -0
  92. package/dist/components/ui/loading_skeleton.d.ts.map +1 -0
  93. package/dist/components/ui/loading_skeleton.js +30 -0
  94. package/dist/components/ui/loading_skeleton.js.map +1 -0
  95. package/dist/components/ui/scroll-area.d.ts +12 -0
  96. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  97. package/dist/components/ui/scroll-area.js +25 -0
  98. package/dist/components/ui/scroll-area.js.map +1 -0
  99. package/dist/components/ui/separator.d.ts +11 -0
  100. package/dist/components/ui/separator.d.ts.map +1 -0
  101. package/dist/components/ui/separator.js +18 -0
  102. package/dist/components/ui/separator.js.map +1 -0
  103. package/dist/components/ui/skeleton.d.ts +9 -0
  104. package/dist/components/ui/skeleton.d.ts.map +1 -0
  105. package/dist/components/ui/skeleton.js +16 -0
  106. package/dist/components/ui/skeleton.js.map +1 -0
  107. package/dist/components/ui/textarea.d.ts +11 -0
  108. package/dist/components/ui/textarea.d.ts.map +1 -0
  109. package/dist/components/ui/textarea.js +18 -0
  110. package/dist/components/ui/textarea.js.map +1 -0
  111. package/dist/components/ui/tooltip.d.ts +14 -0
  112. package/dist/components/ui/tooltip.d.ts.map +1 -0
  113. package/dist/components/ui/tooltip.js +30 -0
  114. package/dist/components/ui/tooltip.js.map +1 -0
  115. package/dist/hooks/index.d.ts +10 -0
  116. package/dist/hooks/index.d.ts.map +1 -0
  117. package/dist/hooks/index.js +10 -0
  118. package/dist/hooks/index.js.map +1 -0
  119. package/dist/hooks/use_chat_messages.d.ts +38 -0
  120. package/dist/hooks/use_chat_messages.d.ts.map +1 -0
  121. package/dist/hooks/use_chat_messages.js +584 -0
  122. package/dist/hooks/use_chat_messages.js.map +1 -0
  123. package/dist/hooks/use_chat_references.d.ts +17 -0
  124. package/dist/hooks/use_chat_references.d.ts.map +1 -0
  125. package/dist/hooks/use_chat_references.js +133 -0
  126. package/dist/hooks/use_chat_references.js.map +1 -0
  127. package/dist/hooks/use_file_upload.d.ts +26 -0
  128. package/dist/hooks/use_file_upload.d.ts.map +1 -0
  129. package/dist/hooks/use_file_upload.js +216 -0
  130. package/dist/hooks/use_file_upload.js.map +1 -0
  131. package/dist/index.d.ts +13 -0
  132. package/dist/index.d.ts.map +1 -0
  133. package/dist/index.js +17 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/lib/config.d.ts +41 -0
  136. package/dist/lib/config.d.ts.map +1 -0
  137. package/dist/lib/config.js +93 -0
  138. package/dist/lib/config.js.map +1 -0
  139. package/dist/lib/constants.d.ts +41 -0
  140. package/dist/lib/constants.d.ts.map +1 -0
  141. package/dist/lib/constants.js +72 -0
  142. package/dist/lib/constants.js.map +1 -0
  143. package/dist/lib/index.d.ts +9 -0
  144. package/dist/lib/index.d.ts.map +1 -0
  145. package/dist/lib/index.js +9 -0
  146. package/dist/lib/index.js.map +1 -0
  147. package/dist/lib/utils.d.ts +17 -0
  148. package/dist/lib/utils.d.ts.map +1 -0
  149. package/dist/lib/utils.js +20 -0
  150. package/dist/lib/utils.js.map +1 -0
  151. package/dist/types/index.d.ts +572 -0
  152. package/dist/types/index.d.ts.map +1 -0
  153. package/dist/types/index.js +11 -0
  154. package/dist/types/index.js.map +1 -0
  155. package/package.json +2 -6
@@ -0,0 +1,45 @@
1
+ /**
2
+ * HazoChatHeader Component
3
+ *
4
+ * Header row for the chat window containing:
5
+ * - Sidebar toggle button (hamburger menu)
6
+ * - Title and subtitle
7
+ * - Close button
8
+ *
9
+ * Uses shadcn/ui Button and Tooltip components.
10
+ */
11
+ 'use client';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useCallback } from 'react';
14
+ import { IoClose, IoMenuOutline, IoRefresh } from 'react-icons/io5';
15
+ import { cn } from '../../lib/utils.js';
16
+ import { Button } from '../ui/button.js';
17
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip.js';
18
+ // ============================================================================
19
+ // Component
20
+ // ============================================================================
21
+ export function HazoChatHeader({ title, subtitle, on_close, on_refresh, is_refreshing, on_toggle_sidebar, is_sidebar_open, show_sidebar_toggle = false, className }) {
22
+ // Handle close button click - ensure event is properly handled
23
+ const handle_close_click = useCallback((e) => {
24
+ // Prevent any default behavior and stop propagation
25
+ e.preventDefault();
26
+ e.stopPropagation();
27
+ // Log for debugging
28
+ console.log('[HazoChatHeader] Close button clicked, on_close:', typeof on_close);
29
+ // Call the close handler if provided
30
+ if (typeof on_close === 'function') {
31
+ try {
32
+ on_close();
33
+ }
34
+ catch (err) {
35
+ console.error('[HazoChatHeader] Error calling on_close:', err);
36
+ }
37
+ }
38
+ }, [on_close]);
39
+ return (_jsxs("header", { className: cn('cls_hazo_chat_header', 'flex items-center justify-between', 'h-14 px-4', 'border-b border-border/40', 'bg-card/80 backdrop-blur-md', 'shadow-sm', className), children: [_jsxs("div", { className: "cls_header_left flex items-center gap-3", children: [show_sidebar_toggle && on_toggle_sidebar && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", onClick: on_toggle_sidebar, className: cn('cls_sidebar_toggle md:hidden', 'h-8 w-8 rounded-md', 'hover:bg-accent hover:text-accent-foreground', 'transition-colors'), "aria-label": is_sidebar_open ? 'Close sidebar' : 'Open sidebar', "aria-expanded": is_sidebar_open, children: _jsx(IoMenuOutline, { className: "h-5 w-5" }) }) }), _jsx(TooltipContent, { side: "bottom", className: "text-xs", children: is_sidebar_open ? 'Close sidebar' : 'Open sidebar' })] })), _jsxs("div", { className: "cls_header_titles flex flex-col gap-0.5", children: [title && (_jsx("h2", { className: "cls_header_title text-sm font-semibold tracking-tight text-foreground", children: title })), subtitle && (_jsx("p", { className: "cls_header_subtitle text-xs font-medium text-muted-foreground", children: subtitle }))] })] }), _jsxs("div", { className: "cls_header_right flex items-center gap-1", children: [on_refresh && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", onClick: on_refresh, disabled: is_refreshing, className: cn('cls_header_refresh', 'h-8 w-8 rounded-md', 'text-muted-foreground', 'hover:bg-accent hover:text-accent-foreground', 'transition-colors'), "aria-label": "Refresh chat history", children: _jsx(IoRefresh, { className: cn('h-4 w-4', is_refreshing && 'animate-spin') }) }) }), _jsx(TooltipContent, { side: "bottom", className: "text-xs", children: "Refresh chat" })] })), on_close && (_jsx(Button, { variant: "ghost", size: "icon", onClick: handle_close_click, onMouseDown: (e) => {
40
+ // Ensure the click is captured even if tooltip interferes
41
+ e.stopPropagation();
42
+ }, type: "button", className: cn('cls_header_close', 'h-8 w-8 rounded-md', 'text-muted-foreground', 'hover:bg-destructive/10 hover:text-destructive', 'transition-colors'), "aria-label": "Close chat", title: "Close chat", children: _jsx(IoClose, { className: "h-4 w-4" }) }))] })] }));
43
+ }
44
+ HazoChatHeader.displayName = 'HazoChatHeader';
45
+ //# sourceMappingURL=hazo_chat_header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_header.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_header.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,YAAY,CAAC;;AAEb,OAAc,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACpE,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EACL,OAAO,EACP,cAAc,EACd,cAAc,EACf,MAAM,kBAAkB,CAAC;AAE1B,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,mBAAmB,GAAG,KAAK,EAC3B,SAAS,EACW;IACpB,+DAA+D;IAC/D,MAAM,kBAAkB,GAAG,WAAW,CACpC,CAAC,CAAsC,EAAE,EAAE;QACzC,oDAAoD;QACpD,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC,eAAe,EAAE,CAAC;QAEpB,oBAAoB;QACpB,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE,OAAO,QAAQ,CAAC,CAAC;QAEjF,qCAAqC;QACrC,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,QAAQ,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,GAAG,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;IACH,CAAC,EACD,CAAC,QAAQ,CAAC,CACX,CAAC;IACF,OAAO,CACL,kBACE,SAAS,EAAE,EAAE,CACX,sBAAsB,EACtB,mCAAmC,EACnC,WAAW,EACX,2BAA2B,EAC3B,6BAA6B,EAC7B,WAAW,EACX,SAAS,CACV,aAGD,eAAK,SAAS,EAAC,yCAAyC,aAErD,mBAAmB,IAAI,iBAAiB,IAAI,CAC3C,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,EAAE,CACX,8BAA8B,EAC9B,oBAAoB,EACpB,8CAA8C,EAC9C,mBAAmB,CACpB,gBACW,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,mBAC/C,eAAe,YAE9B,KAAC,aAAa,IAAC,SAAS,EAAC,SAAS,GAAG,GAC9B,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,YAC9C,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,GACpC,IACT,CACX,EAGD,eAAK,SAAS,EAAC,yCAAyC,aACrD,KAAK,IAAI,CACR,aAAI,SAAS,EAAC,uEAAuE,YAClF,KAAK,GACH,CACN,EACA,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,+DAA+D,YACzE,QAAQ,GACP,CACL,IACG,IACF,EAGN,eAAK,SAAS,EAAC,0CAA0C,aAEtD,UAAU,IAAI,CACb,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,EAAE,CACX,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,8CAA8C,EAC9C,mBAAmB,CACpB,gBACU,sBAAsB,YAEjC,KAAC,SAAS,IAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,aAAa,IAAI,cAAc,CAAC,GAAI,GACjE,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,6BAEhC,IACT,CACX,EAGA,QAAQ,IAAI,CACX,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,kBAAkB,EAC3B,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;4BACjB,0DAA0D;4BAC1D,CAAC,CAAC,eAAe,EAAE,CAAC;wBACtB,CAAC,EACD,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,EAAE,CACX,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gDAAgD,EAChD,mBAAmB,CACpB,gBACU,YAAY,EACvB,KAAK,EAAC,YAAY,YAElB,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GACxB,CACV,IACG,IACC,CACV,CAAC;AACJ,CAAC;AAED,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * HazoChatInput Component
3
+ *
4
+ * Message input area with:
5
+ * - Text input (shadcn Input component)
6
+ * - Send button (shadcn Button component)
7
+ * - Attachment preview (when attachments exist)
8
+ *
9
+ * Uses shadcn/ui Input and Button components.
10
+ */
11
+ import type { HazoChatInputProps } from '../../types/index.js';
12
+ export declare function HazoChatInput({ on_send, pending_attachments, on_add_attachment, on_remove_attachment, is_disabled, placeholder, className }: HazoChatInputProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare namespace HazoChatInput {
14
+ var displayName: string;
15
+ }
16
+ //# sourceMappingURL=hazo_chat_input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_input.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_input.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAS/D,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,WAAmB,EACnB,WAAiC,EACjC,SAAS,EACV,EAAE,kBAAkB,2CA2GpB;yBAnHe,aAAa"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * HazoChatInput Component
3
+ *
4
+ * Message input area with:
5
+ * - Text input (shadcn Input component)
6
+ * - Send button (shadcn Button component)
7
+ * - Attachment preview (when attachments exist)
8
+ *
9
+ * Uses shadcn/ui Input and Button components.
10
+ */
11
+ 'use client';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useState, useRef, useCallback } from 'react';
14
+ import { IoSend } from 'react-icons/io5';
15
+ import { cn } from '../../lib/utils.js';
16
+ import { HazoChatAttachmentPreview } from './hazo_chat_attachment_preview.js';
17
+ import { Button } from '../ui/button.js';
18
+ import { Input } from '../ui/input.js';
19
+ // ============================================================================
20
+ // Component
21
+ // ============================================================================
22
+ export function HazoChatInput({ on_send, pending_attachments, on_add_attachment, on_remove_attachment, is_disabled = false, placeholder = 'Type a message...', className }) {
23
+ const [message, set_message] = useState('');
24
+ const input_ref = useRef(null);
25
+ // -------------------------------------------------------------------------
26
+ // Handle text change
27
+ // -------------------------------------------------------------------------
28
+ const handle_change = useCallback((e) => {
29
+ set_message(e.target.value);
30
+ }, []);
31
+ // -------------------------------------------------------------------------
32
+ // Handle send
33
+ // -------------------------------------------------------------------------
34
+ const handle_send = useCallback(() => {
35
+ const trimmed = message.trim();
36
+ const has_attachments = pending_attachments.length > 0;
37
+ if (!trimmed && !has_attachments)
38
+ return;
39
+ if (is_disabled)
40
+ return;
41
+ // Convert pending attachments to uploaded files format
42
+ const uploaded_files = pending_attachments
43
+ .filter((a) => a.upload_status === 'uploaded' || a.upload_status === 'pending')
44
+ .map((a) => ({
45
+ id: a.id,
46
+ name: a.file.name,
47
+ url: '', // Will be filled after upload
48
+ mime_type: a.file.type,
49
+ file_size: a.file.size
50
+ }));
51
+ on_send(trimmed, uploaded_files);
52
+ set_message('');
53
+ // Reset input
54
+ if (input_ref.current) {
55
+ input_ref.current.value = '';
56
+ }
57
+ }, [message, pending_attachments, is_disabled, on_send]);
58
+ // -------------------------------------------------------------------------
59
+ // Handle keyboard events
60
+ // -------------------------------------------------------------------------
61
+ const handle_key_down = useCallback((e) => {
62
+ // Send on Enter
63
+ if (e.key === 'Enter') {
64
+ e.preventDefault();
65
+ handle_send();
66
+ }
67
+ }, [handle_send]);
68
+ // -------------------------------------------------------------------------
69
+ // Check if can send
70
+ // -------------------------------------------------------------------------
71
+ const can_send = !is_disabled && (message.trim().length > 0 || pending_attachments.length > 0);
72
+ return (_jsxs("div", { className: cn('cls_hazo_chat_input', 'border-t bg-background p-4', className), children: [pending_attachments.length > 0 && (_jsx(HazoChatAttachmentPreview, { attachments: pending_attachments, on_remove: on_remove_attachment })), _jsxs("div", { className: "cls_input_row flex items-center gap-2", children: [_jsx(Input, { ref: input_ref, type: "text", value: message, onChange: handle_change, onKeyDown: handle_key_down, placeholder: placeholder, disabled: is_disabled, className: "cls_message_input flex-1", "aria-label": "Message input" }), _jsx(Button, { variant: "default", onClick: handle_send, disabled: !can_send, className: "cls_send_btn", "aria-label": "Send message", children: _jsx(IoSend, { className: "w-4 h-4" }) })] })] }));
73
+ }
74
+ HazoChatInput.displayName = 'HazoChatInput';
75
+ //# sourceMappingURL=hazo_chat_input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_input.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_input.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * HazoChatMessages Component
3
+ *
4
+ * Scrollable message list with:
5
+ * - Infinite scroll for older messages
6
+ * - Auto-scroll to new messages
7
+ * - Scroll to highlighted message
8
+ * - Empty and loading states
9
+ * - Memoization for performance
10
+ *
11
+ * Uses shadcn/ui ScrollArea component.
12
+ */
13
+ import React from 'react';
14
+ import type { HazoChatMessagesProps } from '../../types/index.js';
15
+ declare function HazoChatMessagesInner({ messages, current_user_id, timezone, is_loading, has_more, on_load_more, on_delete_message, on_mark_as_read, on_scroll_to_message, highlighted_message_id, show_delete_button, bubble_radius, className }: HazoChatMessagesProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare const HazoChatMessages: React.MemoExoticComponent<typeof HazoChatMessagesInner>;
17
+ export {};
18
+ //# sourceMappingURL=hazo_chat_messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_messages.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_messages.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAA+C,MAAM,OAAO,CAAC;AAEpE,OAAO,KAAK,EAAE,qBAAqB,EAAkC,MAAM,sBAAsB,CAAC;AAkElG,iBAAS,qBAAqB,CAAC,EAC7B,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,sBAAsB,EACtB,kBAAyB,EACzB,aAAyB,EACzB,SAAS,EACV,EAAE,qBAAqB,2CA2RvB;AAGD,eAAO,MAAM,gBAAgB,yDAwB3B,CAAC"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * HazoChatMessages Component
3
+ *
4
+ * Scrollable message list with:
5
+ * - Infinite scroll for older messages
6
+ * - Auto-scroll to new messages
7
+ * - Scroll to highlighted message
8
+ * - Empty and loading states
9
+ * - Memoization for performance
10
+ *
11
+ * Uses shadcn/ui ScrollArea component.
12
+ */
13
+ 'use client';
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ import { useRef, useEffect, useCallback, memo } from 'react';
16
+ import { cn } from '../../lib/utils.js';
17
+ import { ChatBubble } from '../ui/chat_bubble.js';
18
+ import { LoadingSkeleton } from '../ui/loading_skeleton.js';
19
+ import { ScrollArea } from '../ui/scroll-area.js';
20
+ import { EMPTY_CHAT_MESSAGE } from '../../lib/constants.js';
21
+ const MemoizedChatBubble = memo(function MemoizedChatBubble({ message, current_user_id, timezone, on_delete_message, on_reference_click, is_highlighted, show_delete_button, bubble_radius, }) {
22
+ const is_sender = message.sender_user_id === current_user_id;
23
+ return (_jsx(ChatBubble, { message: message, is_sender: is_sender, sender_profile: message.sender_profile, timezone: timezone, on_delete: is_sender ? () => on_delete_message(message.id) : undefined, on_reference_click: on_reference_click, is_highlighted: is_highlighted, show_delete_button: show_delete_button, bubble_radius: bubble_radius }));
24
+ }, (prevProps, nextProps) => {
25
+ // Only re-render if these specific props change
26
+ return (prevProps.message.id === nextProps.message.id &&
27
+ prevProps.message.read_at === nextProps.message.read_at &&
28
+ prevProps.message.deleted_at === nextProps.message.deleted_at &&
29
+ prevProps.message.send_status === nextProps.message.send_status &&
30
+ prevProps.is_highlighted === nextProps.is_highlighted &&
31
+ prevProps.show_delete_button === nextProps.show_delete_button &&
32
+ prevProps.bubble_radius === nextProps.bubble_radius);
33
+ });
34
+ // ============================================================================
35
+ // Component
36
+ // ============================================================================
37
+ function HazoChatMessagesInner({ messages, current_user_id, timezone, is_loading, has_more, on_load_more, on_delete_message, on_mark_as_read, on_scroll_to_message, highlighted_message_id, show_delete_button = true, bubble_radius = 'default', className }) {
38
+ const container_ref = useRef(null);
39
+ const load_more_trigger_ref = useRef(null);
40
+ const is_at_bottom_ref = useRef(true);
41
+ const previous_messages_length_ref = useRef(0);
42
+ const message_refs = useRef(new Map());
43
+ const marked_as_read_ref = useRef(new Set());
44
+ // -------------------------------------------------------------------------
45
+ // Intersection observer for infinite scroll
46
+ // -------------------------------------------------------------------------
47
+ useEffect(() => {
48
+ const trigger = load_more_trigger_ref.current;
49
+ if (!trigger || !has_more)
50
+ return;
51
+ const observer = new IntersectionObserver((entries) => {
52
+ if (entries[0].isIntersecting) {
53
+ on_load_more();
54
+ }
55
+ }, { threshold: 0.1 });
56
+ observer.observe(trigger);
57
+ return () => {
58
+ observer.disconnect();
59
+ };
60
+ }, [has_more, on_load_more]);
61
+ // -------------------------------------------------------------------------
62
+ // Track scroll position
63
+ // -------------------------------------------------------------------------
64
+ const handle_scroll = useCallback(() => {
65
+ const container = container_ref.current;
66
+ if (!container)
67
+ return;
68
+ // Check if scrolled to bottom
69
+ const threshold = 50;
70
+ is_at_bottom_ref.current =
71
+ container.scrollHeight - container.scrollTop - container.clientHeight < threshold;
72
+ }, []);
73
+ // -------------------------------------------------------------------------
74
+ // Auto-scroll to bottom on new messages (if already at bottom)
75
+ // -------------------------------------------------------------------------
76
+ useEffect(() => {
77
+ const container = container_ref.current;
78
+ if (!container)
79
+ return;
80
+ // On initial load, scroll to bottom (newest message)
81
+ if (previous_messages_length_ref.current === 0 && messages.length > 0) {
82
+ // Initial load - scroll to bottom after a short delay to ensure DOM is ready
83
+ setTimeout(() => {
84
+ if (container_ref.current) {
85
+ container_ref.current.scrollTop = container_ref.current.scrollHeight;
86
+ }
87
+ }, 100);
88
+ }
89
+ // Only auto-scroll if we were at the bottom and new messages arrived
90
+ else if (is_at_bottom_ref.current && messages.length > previous_messages_length_ref.current) {
91
+ container.scrollTop = container.scrollHeight;
92
+ }
93
+ previous_messages_length_ref.current = messages.length;
94
+ }, [messages.length]);
95
+ // -------------------------------------------------------------------------
96
+ // Scroll to highlighted message
97
+ // -------------------------------------------------------------------------
98
+ useEffect(() => {
99
+ if (!highlighted_message_id)
100
+ return;
101
+ const element = document.getElementById(`message-${highlighted_message_id}`);
102
+ if (element) {
103
+ element.scrollIntoView({ behavior: 'smooth', block: 'center' });
104
+ }
105
+ }, [highlighted_message_id]);
106
+ // -------------------------------------------------------------------------
107
+ // Handle reference click in message
108
+ // -------------------------------------------------------------------------
109
+ const handle_reference_click = useCallback((reference) => {
110
+ // This would be handled by parent via context
111
+ console.log('[HazoChatMessages] Reference clicked:', reference);
112
+ }, []);
113
+ // -------------------------------------------------------------------------
114
+ // Auto-mark messages as read when they become visible
115
+ // -------------------------------------------------------------------------
116
+ useEffect(() => {
117
+ console.log('[HazoChatMessages] Mark-as-read effect running:', {
118
+ has_on_mark_as_read: !!on_mark_as_read,
119
+ current_user_id,
120
+ total_messages: messages.length,
121
+ });
122
+ if (!on_mark_as_read) {
123
+ console.warn('[HazoChatMessages] on_mark_as_read not provided - cannot mark messages as read');
124
+ return;
125
+ }
126
+ // Filter to only unread messages not sent by current user
127
+ // In group chat, any message not sent by the current user can be marked as read
128
+ const unread_messages = messages.filter((msg) => msg.sender_user_id !== current_user_id &&
129
+ !msg.read_at &&
130
+ !marked_as_read_ref.current.has(msg.id));
131
+ console.log('[HazoChatMessages] Unread messages to observe:', {
132
+ count: unread_messages.length,
133
+ message_ids: unread_messages.map(m => m.id),
134
+ });
135
+ if (unread_messages.length === 0)
136
+ return;
137
+ // Find the ScrollArea viewport (the actual scrolling container)
138
+ // Radix UI ScrollArea creates a viewport element with data attribute
139
+ const scroll_viewport = container_ref.current?.closest('[data-radix-scroll-area-viewport]');
140
+ const root = scroll_viewport || null;
141
+ console.log('[HazoChatMessages] ScrollArea viewport found:', {
142
+ has_viewport: !!scroll_viewport,
143
+ viewport_tag: scroll_viewport?.tagName,
144
+ container_ref_set: !!container_ref.current,
145
+ });
146
+ // Create intersection observer for each unread message
147
+ const observers = [];
148
+ // Use a small delay to ensure refs are set after render
149
+ const timeout_id = setTimeout(() => {
150
+ console.log('[HazoChatMessages] Setting up observers for', unread_messages.length, 'unread messages');
151
+ unread_messages.forEach((message) => {
152
+ const element = message_refs.current.get(message.id);
153
+ if (!element) {
154
+ console.warn('[HazoChatMessages] Element not found for message:', message.id);
155
+ return;
156
+ }
157
+ console.log('[HazoChatMessages] Creating observer for message:', message.id);
158
+ const observer = new IntersectionObserver((entries) => {
159
+ entries.forEach((entry) => {
160
+ console.log('[HazoChatMessages] Observer callback for', message.id, ':', {
161
+ isIntersecting: entry.isIntersecting,
162
+ intersectionRatio: entry.intersectionRatio,
163
+ });
164
+ if (entry.isIntersecting && entry.intersectionRatio > 0.5) {
165
+ // Message is at least 50% visible, mark as read
166
+ if (!marked_as_read_ref.current.has(message.id)) {
167
+ marked_as_read_ref.current.add(message.id);
168
+ console.log('[HazoChatMessages] Marking message as read:', message.id);
169
+ on_mark_as_read(message.id);
170
+ observer.disconnect();
171
+ }
172
+ }
173
+ });
174
+ }, {
175
+ threshold: 0.5, // Mark as read when 50% visible
176
+ root: root, // Use ScrollArea viewport as root
177
+ rootMargin: '0px',
178
+ });
179
+ observer.observe(element);
180
+ observers.push(observer);
181
+ });
182
+ console.log('[HazoChatMessages] Total observers created:', observers.length);
183
+ }, 100); // Small delay to ensure DOM refs are ready
184
+ return () => {
185
+ clearTimeout(timeout_id);
186
+ observers.forEach((observer) => observer.disconnect());
187
+ };
188
+ }, [messages, current_user_id, on_mark_as_read]);
189
+ // -------------------------------------------------------------------------
190
+ // Clean up marked_as_read set when messages change significantly
191
+ // -------------------------------------------------------------------------
192
+ useEffect(() => {
193
+ // Remove IDs from marked_as_read set if message is no longer in messages
194
+ const current_message_ids = new Set(messages.map((m) => m.id));
195
+ marked_as_read_ref.current.forEach((id) => {
196
+ if (!current_message_ids.has(id)) {
197
+ marked_as_read_ref.current.delete(id);
198
+ }
199
+ });
200
+ }, [messages]);
201
+ // -------------------------------------------------------------------------
202
+ // Loading state
203
+ // -------------------------------------------------------------------------
204
+ if (is_loading && messages.length === 0) {
205
+ return (_jsx("div", { className: cn('cls_messages_loading p-4', className), children: _jsx(LoadingSkeleton, { variant: "message", count: 5 }) }));
206
+ }
207
+ // -------------------------------------------------------------------------
208
+ // Empty state
209
+ // -------------------------------------------------------------------------
210
+ if (!is_loading && messages.length === 0) {
211
+ return (_jsx("div", { className: cn('cls_messages_empty', 'flex items-center justify-center h-full', 'px-6 py-8', 'text-muted-foreground text-sm', className), children: EMPTY_CHAT_MESSAGE }));
212
+ }
213
+ // -------------------------------------------------------------------------
214
+ // Messages list
215
+ // -------------------------------------------------------------------------
216
+ return (_jsx(ScrollArea, { className: cn('cls_hazo_chat_messages flex-1', className), children: _jsxs("div", { ref: container_ref, onScroll: handle_scroll, className: cn('cls_messages_container', 'p-4', 'flex flex-col' // Normal order: oldest first, newest last (at bottom)
217
+ ), role: "log", "aria-label": "Chat messages", "aria-live": "polite", children: [has_more && (_jsx("div", { ref: load_more_trigger_ref, className: "cls_load_more_trigger py-4", children: _jsx(LoadingSkeleton, { variant: "message", count: 2 }) })), messages.map((message) => (_jsx("div", { id: `message-${message.id}`, ref: (el) => {
218
+ if (el) {
219
+ message_refs.current.set(message.id, el);
220
+ }
221
+ else {
222
+ message_refs.current.delete(message.id);
223
+ }
224
+ }, children: _jsx(MemoizedChatBubble, { message: message, current_user_id: current_user_id, timezone: timezone, on_delete_message: on_delete_message, on_reference_click: handle_reference_click, is_highlighted: highlighted_message_id === message.id, show_delete_button: show_delete_button, bubble_radius: bubble_radius }) }, message.id)))] }) }));
225
+ }
226
+ // Memoized export to prevent unnecessary re-renders
227
+ export const HazoChatMessages = memo(HazoChatMessagesInner, (prevProps, nextProps) => {
228
+ // Deep comparison for messages array by checking length and IDs
229
+ if (prevProps.messages.length !== nextProps.messages.length)
230
+ return false;
231
+ if (prevProps.is_loading !== nextProps.is_loading)
232
+ return false;
233
+ if (prevProps.has_more !== nextProps.has_more)
234
+ return false;
235
+ if (prevProps.highlighted_message_id !== nextProps.highlighted_message_id)
236
+ return false;
237
+ if (prevProps.show_delete_button !== nextProps.show_delete_button)
238
+ return false;
239
+ if (prevProps.bubble_radius !== nextProps.bubble_radius)
240
+ return false;
241
+ // Check if any message has changed (by comparing key fields)
242
+ for (let i = 0; i < prevProps.messages.length; i++) {
243
+ const prev = prevProps.messages[i];
244
+ const next = nextProps.messages[i];
245
+ if (prev.id !== next.id ||
246
+ prev.read_at !== next.read_at ||
247
+ prev.deleted_at !== next.deleted_at ||
248
+ prev.send_status !== next.send_status) {
249
+ return false;
250
+ }
251
+ }
252
+ return true;
253
+ });
254
+ HazoChatMessages.displayName = 'HazoChatMessages';
255
+ //# sourceMappingURL=hazo_chat_messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_messages.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_messages.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * HazoChatReferenceList Component
3
+ *
4
+ * Displays a list of document/field/URL references as text chips with:
5
+ * - File name display
6
+ * - Selection state (highlighted background)
7
+ * - Click to open in viewer + scroll to message
8
+ *
9
+ * Uses shadcn/ui Button and Tooltip components.
10
+ */
11
+ import type { HazoChatReferenceListProps } from '../../types/index.js';
12
+ export declare function HazoChatReferenceList({ references, selected_reference_id, on_select, className }: HazoChatReferenceListProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare namespace HazoChatReferenceList {
14
+ var displayName: string;
15
+ }
16
+ //# sourceMappingURL=hazo_chat_reference_list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_reference_list.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_reference_list.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,KAAK,EAAE,0BAA0B,EAAqB,MAAM,sBAAsB,CAAC;AAqF1F,wBAAgB,qBAAqB,CAAC,EACpC,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,SAAS,EACV,EAAE,0BAA0B,2CA2C5B;yBAhDe,qBAAqB"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * HazoChatReferenceList Component
3
+ *
4
+ * Displays a list of document/field/URL references as text chips with:
5
+ * - File name display
6
+ * - Selection state (highlighted background)
7
+ * - Click to open in viewer + scroll to message
8
+ *
9
+ * Uses shadcn/ui Button and Tooltip components.
10
+ */
11
+ 'use client';
12
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
13
+ import { useCallback } from 'react';
14
+ import { cn } from '../../lib/utils.js';
15
+ import { Button } from '../ui/button.js';
16
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip.js';
17
+ // ============================================================================
18
+ // Helper Functions
19
+ // ============================================================================
20
+ /**
21
+ * Get file extension from URL or name
22
+ */
23
+ function get_file_extension(reference) {
24
+ const name = reference.name || reference.url;
25
+ const parts = name.split('.');
26
+ return parts.length > 1 ? parts.pop()?.toUpperCase() || '' : '';
27
+ }
28
+ /**
29
+ * Get display name (truncated if needed)
30
+ */
31
+ function get_display_name(reference, max_length = 20) {
32
+ const name = reference.name || 'Untitled';
33
+ if (name.length <= max_length)
34
+ return name;
35
+ const ext = get_file_extension(reference);
36
+ const name_without_ext = ext ? name.slice(0, -(ext.length + 1)) : name;
37
+ const truncated = name_without_ext.slice(0, max_length - 3 - (ext ? ext.length + 1 : 0));
38
+ return ext ? `${truncated}...${ext.toLowerCase()}` : `${truncated}...`;
39
+ }
40
+ function ReferenceItem({ reference, is_selected, on_click }) {
41
+ const display_name = get_display_name(reference);
42
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: is_selected ? 'default' : 'outline', size: "sm", onClick: on_click, className: cn('cls_reference_item', 'h-7 px-2.5 text-xs font-medium', 'rounded-full', is_selected
43
+ ? 'bg-primary text-primary-foreground'
44
+ : 'bg-background hover:bg-accent'), "aria-label": `${reference.type}: ${reference.name}`, "aria-pressed": is_selected, children: display_name }) }), _jsxs(TooltipContent, { side: "bottom", className: "text-xs", children: [_jsx("p", { className: "font-medium", children: reference.name }), _jsxs("p", { className: "text-muted-foreground", children: [reference.type === 'document' ? 'Document' : reference.type === 'field' ? 'Field' : 'Link', ' • ', reference.scope === 'chat' ? 'Chat attachment' : 'Form reference'] })] })] }));
45
+ }
46
+ // ============================================================================
47
+ // Main Component
48
+ // ============================================================================
49
+ export function HazoChatReferenceList({ references, selected_reference_id, on_select, className }) {
50
+ const handle_select = useCallback((reference) => {
51
+ on_select(reference);
52
+ }, [on_select]);
53
+ if (references.length === 0) {
54
+ return (_jsx("div", { className: cn('cls_reference_list_empty', 'flex items-center justify-center py-1 px-2', 'text-xs text-muted-foreground italic', className), children: "No references" }));
55
+ }
56
+ return (_jsx("div", { className: cn('cls_hazo_chat_reference_list', 'flex flex-wrap items-center gap-1.5', className), role: "listbox", "aria-label": "Document references", children: references.map((reference) => (_jsx(ReferenceItem, { reference: reference, is_selected: selected_reference_id === reference.id, on_click: () => handle_select(reference) }, reference.id))) }));
57
+ }
58
+ HazoChatReferenceList.displayName = 'HazoChatReferenceList';
59
+ //# sourceMappingURL=hazo_chat_reference_list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_reference_list.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_reference_list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * HazoChatSidebar Component
3
+ *
4
+ * Collapsible sidebar containing:
5
+ * - Reference list
6
+ * - Document viewer
7
+ *
8
+ * On mobile: slides in from left as overlay
9
+ * On desktop: always visible as left column
10
+ *
11
+ * Uses shadcn/ui Button, ScrollArea, and Separator components.
12
+ */
13
+ import type { HazoChatSidebarProps } from '../../types/index.js';
14
+ export declare function HazoChatSidebar({ is_open, on_close, className, children }: HazoChatSidebarProps): import("react/jsx-runtime").JSX.Element;
15
+ export declare namespace HazoChatSidebar {
16
+ var displayName: string;
17
+ }
18
+ //# sourceMappingURL=hazo_chat_sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_sidebar.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAUjE,wBAAgB,eAAe,CAAC,EAC9B,OAAO,EACP,QAAQ,EACR,SAAS,EACT,QAAQ,EACT,EAAE,oBAAoB,2CAmGtB;yBAxGe,eAAe"}