hazo_chat 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/README.md +437 -0
  2. package/SETUP_CHECKLIST.md +858 -0
  3. package/dist/components/hazo_chat/hazo_chat.d.ts +16 -0
  4. package/dist/components/hazo_chat/hazo_chat.d.ts.map +1 -0
  5. package/dist/components/hazo_chat/hazo_chat.js +155 -0
  6. package/dist/components/hazo_chat/hazo_chat.js.map +1 -0
  7. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +17 -0
  8. package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +1 -0
  9. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +60 -0
  10. package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +1 -0
  11. package/dist/components/hazo_chat/hazo_chat_context.d.ts +36 -0
  12. package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +1 -0
  13. package/dist/components/hazo_chat/hazo_chat_context.js +249 -0
  14. package/dist/components/hazo_chat/hazo_chat_context.js.map +1 -0
  15. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +15 -0
  16. package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +1 -0
  17. package/dist/components/hazo_chat/hazo_chat_document_viewer.js +111 -0
  18. package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +1 -0
  19. package/dist/components/hazo_chat/hazo_chat_header.d.ts +16 -0
  20. package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +1 -0
  21. package/dist/components/hazo_chat/hazo_chat_header.js +24 -0
  22. package/dist/components/hazo_chat/hazo_chat_header.js.map +1 -0
  23. package/dist/components/hazo_chat/hazo_chat_input.d.ts +18 -0
  24. package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +1 -0
  25. package/dist/components/hazo_chat/hazo_chat_input.js +134 -0
  26. package/dist/components/hazo_chat/hazo_chat_input.js.map +1 -0
  27. package/dist/components/hazo_chat/hazo_chat_messages.d.ts +17 -0
  28. package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +1 -0
  29. package/dist/components/hazo_chat/hazo_chat_messages.js +109 -0
  30. package/dist/components/hazo_chat/hazo_chat_messages.js.map +1 -0
  31. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +16 -0
  32. package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +1 -0
  33. package/dist/components/hazo_chat/hazo_chat_reference_list.js +59 -0
  34. package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +1 -0
  35. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +18 -0
  36. package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +1 -0
  37. package/dist/components/hazo_chat/hazo_chat_sidebar.js +72 -0
  38. package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +1 -0
  39. package/dist/components/hazo_chat/index.d.ts +16 -0
  40. package/dist/components/hazo_chat/index.d.ts.map +1 -0
  41. package/dist/components/hazo_chat/index.js +19 -0
  42. package/dist/components/hazo_chat/index.js.map +1 -0
  43. package/dist/components/index.d.ts +9 -0
  44. package/dist/components/index.d.ts.map +1 -0
  45. package/dist/components/index.js +11 -0
  46. package/dist/components/index.js.map +1 -0
  47. package/dist/components/ui/avatar.d.ts +13 -0
  48. package/dist/components/ui/avatar.d.ts.map +1 -0
  49. package/dist/components/ui/avatar.js +28 -0
  50. package/dist/components/ui/avatar.js.map +1 -0
  51. package/dist/components/ui/badge.d.ts +16 -0
  52. package/dist/components/ui/badge.d.ts.map +1 -0
  53. package/dist/components/ui/badge.js +36 -0
  54. package/dist/components/ui/badge.js.map +1 -0
  55. package/dist/components/ui/button.d.ts +18 -0
  56. package/dist/components/ui/button.d.ts.map +1 -0
  57. package/dist/components/ui/button.js +47 -0
  58. package/dist/components/ui/button.js.map +1 -0
  59. package/dist/components/ui/chat_bubble.d.ts +19 -0
  60. package/dist/components/ui/chat_bubble.d.ts.map +1 -0
  61. package/dist/components/ui/chat_bubble.js +101 -0
  62. package/dist/components/ui/chat_bubble.js.map +1 -0
  63. package/dist/components/ui/index.d.ts +18 -0
  64. package/dist/components/ui/index.d.ts.map +1 -0
  65. package/dist/components/ui/index.js +20 -0
  66. package/dist/components/ui/index.js.map +1 -0
  67. package/dist/components/ui/input.d.ts +11 -0
  68. package/dist/components/ui/input.d.ts.map +1 -0
  69. package/dist/components/ui/input.js +18 -0
  70. package/dist/components/ui/input.js.map +1 -0
  71. package/dist/components/ui/loading_skeleton.d.ts +19 -0
  72. package/dist/components/ui/loading_skeleton.d.ts.map +1 -0
  73. package/dist/components/ui/loading_skeleton.js +30 -0
  74. package/dist/components/ui/loading_skeleton.js.map +1 -0
  75. package/dist/components/ui/scroll-area.d.ts +12 -0
  76. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  77. package/dist/components/ui/scroll-area.js +25 -0
  78. package/dist/components/ui/scroll-area.js.map +1 -0
  79. package/dist/components/ui/separator.d.ts +11 -0
  80. package/dist/components/ui/separator.d.ts.map +1 -0
  81. package/dist/components/ui/separator.js +18 -0
  82. package/dist/components/ui/separator.js.map +1 -0
  83. package/dist/components/ui/skeleton.d.ts +9 -0
  84. package/dist/components/ui/skeleton.d.ts.map +1 -0
  85. package/dist/components/ui/skeleton.js +16 -0
  86. package/dist/components/ui/skeleton.js.map +1 -0
  87. package/dist/components/ui/textarea.d.ts +11 -0
  88. package/dist/components/ui/textarea.d.ts.map +1 -0
  89. package/dist/components/ui/textarea.js +18 -0
  90. package/dist/components/ui/textarea.js.map +1 -0
  91. package/dist/components/ui/tooltip.d.ts +14 -0
  92. package/dist/components/ui/tooltip.d.ts.map +1 -0
  93. package/dist/components/ui/tooltip.js +30 -0
  94. package/dist/components/ui/tooltip.js.map +1 -0
  95. package/dist/hooks/index.d.ts +10 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/hooks/index.js +10 -0
  98. package/dist/hooks/index.js.map +1 -0
  99. package/dist/hooks/use_chat_messages.d.ts +25 -0
  100. package/dist/hooks/use_chat_messages.d.ts.map +1 -0
  101. package/dist/hooks/use_chat_messages.js +430 -0
  102. package/dist/hooks/use_chat_messages.js.map +1 -0
  103. package/dist/hooks/use_chat_references.d.ts +17 -0
  104. package/dist/hooks/use_chat_references.d.ts.map +1 -0
  105. package/dist/hooks/use_chat_references.js +133 -0
  106. package/dist/hooks/use_chat_references.js.map +1 -0
  107. package/dist/hooks/use_file_upload.d.ts +23 -0
  108. package/dist/hooks/use_file_upload.d.ts.map +1 -0
  109. package/dist/hooks/use_file_upload.js +212 -0
  110. package/dist/hooks/use_file_upload.js.map +1 -0
  111. package/dist/index.d.ts +13 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +17 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/lib/config.d.ts +41 -0
  116. package/dist/lib/config.d.ts.map +1 -0
  117. package/dist/lib/config.js +93 -0
  118. package/dist/lib/config.js.map +1 -0
  119. package/dist/lib/constants.d.ts +39 -0
  120. package/dist/lib/constants.d.ts.map +1 -0
  121. package/dist/lib/constants.js +70 -0
  122. package/dist/lib/constants.js.map +1 -0
  123. package/dist/lib/index.d.ts +9 -0
  124. package/dist/lib/index.d.ts.map +1 -0
  125. package/dist/lib/index.js +9 -0
  126. package/dist/lib/index.js.map +1 -0
  127. package/dist/lib/utils.d.ts +17 -0
  128. package/dist/lib/utils.d.ts.map +1 -0
  129. package/dist/lib/utils.js +20 -0
  130. package/dist/lib/utils.js.map +1 -0
  131. package/dist/types/index.d.ts +367 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +8 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/package.json +93 -0
@@ -0,0 +1,111 @@
1
+ /**
2
+ * HazoChatDocumentViewer Component
3
+ *
4
+ * Document preview area supporting:
5
+ * - PDF viewing via hazo_pdf
6
+ * - Image preview (png, jpg, gif, webp)
7
+ * - Text file preview
8
+ * - Download link for unsupported types
9
+ */
10
+ 'use client';
11
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
+ import React, { useMemo } from 'react';
13
+ import { IoDocumentOutline, IoDownloadOutline, IoImageOutline } from 'react-icons/io5';
14
+ import { cn } from '../../lib/utils.js';
15
+ import { PREVIEWABLE_TYPES } from '../../lib/constants.js';
16
+ import { LoadingSkeleton } from '../ui/loading_skeleton.js';
17
+ // ============================================================================
18
+ // Helper Functions
19
+ // ============================================================================
20
+ /**
21
+ * Check if file is previewable as image
22
+ */
23
+ function is_image(mime_type) {
24
+ if (!mime_type)
25
+ return false;
26
+ return PREVIEWABLE_TYPES.image.includes(mime_type);
27
+ }
28
+ /**
29
+ * Check if file is previewable as PDF
30
+ */
31
+ function is_pdf(mime_type) {
32
+ if (!mime_type)
33
+ return false;
34
+ return PREVIEWABLE_TYPES.pdf.includes(mime_type);
35
+ }
36
+ /**
37
+ * Check if file is previewable as text
38
+ */
39
+ function is_text(mime_type) {
40
+ if (!mime_type)
41
+ return false;
42
+ return PREVIEWABLE_TYPES.text.includes(mime_type);
43
+ }
44
+ function PdfViewer({ url, name }) {
45
+ // Note: In production, this would use hazo_pdf component
46
+ // For now, we use an iframe fallback
47
+ return (_jsx("div", { className: "cls_pdf_viewer w-full h-full flex flex-col", children: _jsx("iframe", { src: `${url}#view=FitH`, title: name, className: "w-full flex-1 border-0 rounded-lg", "aria-label": `PDF document: ${name}` }) }));
48
+ }
49
+ function ImageViewer({ url, name }) {
50
+ return (_jsx("div", { className: "cls_image_viewer w-full h-full flex items-center justify-center p-4 overflow-auto", children: _jsx("img", { src: url, alt: name, className: "max-w-full max-h-full object-contain rounded-lg shadow-sm" }) }));
51
+ }
52
+ function TextViewer({ url, name }) {
53
+ const [content, set_content] = React.useState(null);
54
+ const [is_loading, set_is_loading] = React.useState(true);
55
+ const [error, set_error] = React.useState(null);
56
+ React.useEffect(() => {
57
+ async function fetch_content() {
58
+ try {
59
+ set_is_loading(true);
60
+ const response = await fetch(url);
61
+ if (!response.ok)
62
+ throw new Error('Failed to fetch');
63
+ const text = await response.text();
64
+ set_content(text);
65
+ }
66
+ catch (err) {
67
+ set_error('Failed to load text content');
68
+ }
69
+ finally {
70
+ set_is_loading(false);
71
+ }
72
+ }
73
+ fetch_content();
74
+ }, [url]);
75
+ if (is_loading) {
76
+ return _jsx(LoadingSkeleton, { variant: "reference", count: 5 });
77
+ }
78
+ if (error) {
79
+ return (_jsx("div", { className: "cls_text_viewer_error flex items-center justify-center h-full text-muted-foreground", children: error }));
80
+ }
81
+ return (_jsx("div", { className: "cls_text_viewer w-full h-full overflow-auto p-4", children: _jsx("pre", { className: "text-sm font-mono bg-muted p-4 rounded-lg whitespace-pre-wrap break-words", "aria-label": `Text file: ${name}`, children: content }) }));
82
+ }
83
+ function DownloadFallback({ url, name, mime_type }) {
84
+ return (_jsxs("div", { className: "cls_download_fallback flex flex-col items-center justify-center h-full gap-4 p-4", children: [_jsx(IoDocumentOutline, { className: "w-16 h-16 text-muted-foreground" }), _jsxs("div", { className: "text-center", children: [_jsx("p", { className: "font-medium text-foreground", children: name }), mime_type && (_jsx("p", { className: "text-sm text-muted-foreground mt-1", children: mime_type }))] }), _jsxs("a", { href: url, download: name, className: cn('cls_download_btn', 'flex items-center gap-2 px-4 py-2 rounded-lg', 'bg-primary text-primary-foreground', 'hover:bg-primary/90 transition-colors'), children: [_jsx(IoDownloadOutline, { className: "w-4 h-4" }), "Download"] })] }));
85
+ }
86
+ // ============================================================================
87
+ // Empty State Component
88
+ // ============================================================================
89
+ function EmptyState() {
90
+ return (_jsxs("div", { className: "cls_viewer_empty flex flex-col items-center justify-center h-full gap-2 p-4 text-muted-foreground", children: [_jsx(IoImageOutline, { className: "w-12 h-12 opacity-50" }), _jsx("p", { className: "text-sm", children: "Select a document to preview" })] }));
91
+ }
92
+ // ============================================================================
93
+ // Main Component
94
+ // ============================================================================
95
+ export function HazoChatDocumentViewer({ reference, className }) {
96
+ // Determine viewer type based on mime_type
97
+ const viewer_type = useMemo(() => {
98
+ if (!reference)
99
+ return 'empty';
100
+ if (is_pdf(reference.mime_type))
101
+ return 'pdf';
102
+ if (is_image(reference.mime_type))
103
+ return 'image';
104
+ if (is_text(reference.mime_type))
105
+ return 'text';
106
+ return 'download';
107
+ }, [reference]);
108
+ return (_jsxs("div", { className: cn('cls_hazo_chat_document_viewer', 'flex-1 bg-muted/30 rounded-lg overflow-hidden', className), role: "region", "aria-label": "Document viewer", children: [viewer_type === 'empty' && _jsx(EmptyState, {}), viewer_type === 'pdf' && reference && (_jsx(PdfViewer, { url: reference.url, name: reference.name })), viewer_type === 'image' && reference && (_jsx(ImageViewer, { url: reference.url, name: reference.name })), viewer_type === 'text' && reference && (_jsx(TextViewer, { url: reference.url, name: reference.name })), viewer_type === 'download' && reference && (_jsx(DownloadFallback, { url: reference.url, name: reference.name, mime_type: reference.mime_type }))] }));
109
+ }
110
+ HazoChatDocumentViewer.displayName = 'HazoChatDocumentViewer';
111
+ //# sourceMappingURL=hazo_chat_document_viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_document_viewer.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_document_viewer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
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
+ import type { HazoChatHeaderProps } from '../../types/index.js';
12
+ export declare function HazoChatHeader({ title, subtitle, on_close, on_toggle_sidebar, is_sidebar_open, className }: HazoChatHeaderProps): import("react/jsx-runtime").JSX.Element;
13
+ export declare namespace HazoChatHeader {
14
+ var displayName: string;
15
+ }
16
+ //# sourceMappingURL=hazo_chat_header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hazo_chat_header.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_header.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAYhE,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,SAAS,EACV,EAAE,mBAAmB,2CAmFrB;yBA1Fe,cAAc"}
@@ -0,0 +1,24 @@
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 { IoClose, IoMenuOutline } from 'react-icons/io5';
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
+ // Component
19
+ // ============================================================================
20
+ export function HazoChatHeader({ title, subtitle, on_close, on_toggle_sidebar, is_sidebar_open, className }) {
21
+ 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: [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 }))] })] }), on_close && (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", onClick: on_close, 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", children: _jsx(IoClose, { className: "h-4 w-4" }) }) }), _jsx(TooltipContent, { side: "bottom", className: "text-xs", children: "Close chat" })] }))] }));
22
+ }
23
+ HazoChatHeader.displayName = 'HazoChatHeader';
24
+ //# 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;;AAGb,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACzD,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,iBAAiB,EACjB,eAAe,EACf,SAAS,EACW;IACpB,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,iBAAiB,IAAI,CACpB,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,EAGL,QAAQ,IAAI,CACX,MAAC,OAAO,eACN,KAAC,cAAc,IAAC,OAAO,kBACrB,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,MAAM,EACX,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAE,EAAE,CACX,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gDAAgD,EAChD,mBAAmB,CACpB,gBACU,YAAY,YAEvB,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GACxB,GACM,EACjB,KAAC,cAAc,IAAC,IAAI,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,2BAEhC,IACT,CACX,IACM,CACV,CAAC;AACJ,CAAC;AAED,cAAc,CAAC,WAAW,GAAG,gBAAgB,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * HazoChatInput Component
3
+ *
4
+ * Message input area with:
5
+ * - Text input (auto-resizing textarea)
6
+ * - File attachment buttons
7
+ * - Drag-and-drop support
8
+ * - Send button
9
+ * - Attachment preview
10
+ *
11
+ * Uses shadcn/ui Textarea, Button, and Tooltip components.
12
+ */
13
+ import type { HazoChatInputProps } from '../../types/index.js';
14
+ 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;
15
+ export declare namespace HazoChatInput {
16
+ var displayName: string;
17
+ }
18
+ //# 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;;;;;;;;;;;GAWG;AAcH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAc/D,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,WAAmB,EACnB,WAAiC,EACjC,SAAS,EACV,EAAE,kBAAkB,2CAyPpB;yBAjQe,aAAa"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * HazoChatInput Component
3
+ *
4
+ * Message input area with:
5
+ * - Text input (auto-resizing textarea)
6
+ * - File attachment buttons
7
+ * - Drag-and-drop support
8
+ * - Send button
9
+ * - Attachment preview
10
+ *
11
+ * Uses shadcn/ui Textarea, Button, and Tooltip components.
12
+ */
13
+ 'use client';
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ import { useState, useRef, useCallback } from 'react';
16
+ import { IoSend, IoAttach, IoImageOutline } from 'react-icons/io5';
17
+ import { cn } from '../../lib/utils.js';
18
+ import { HazoChatAttachmentPreview } from './hazo_chat_attachment_preview.js';
19
+ import { Button } from '../ui/button.js';
20
+ import { Textarea } from '../ui/textarea.js';
21
+ import { Tooltip, TooltipContent, TooltipTrigger } from '../ui/tooltip.js';
22
+ // ============================================================================
23
+ // Component
24
+ // ============================================================================
25
+ export function HazoChatInput({ on_send, pending_attachments, on_add_attachment, on_remove_attachment, is_disabled = false, placeholder = 'Type a message...', className }) {
26
+ const [message, set_message] = useState('');
27
+ const [is_dragging, set_is_dragging] = useState(false);
28
+ const textarea_ref = useRef(null);
29
+ const file_input_ref = useRef(null);
30
+ const image_input_ref = useRef(null);
31
+ // -------------------------------------------------------------------------
32
+ // Auto-resize textarea
33
+ // -------------------------------------------------------------------------
34
+ const resize_textarea = useCallback(() => {
35
+ const textarea = textarea_ref.current;
36
+ if (!textarea)
37
+ return;
38
+ textarea.style.height = 'auto';
39
+ textarea.style.height = `${Math.min(textarea.scrollHeight, 120)}px`;
40
+ }, []);
41
+ // -------------------------------------------------------------------------
42
+ // Handle text change
43
+ // -------------------------------------------------------------------------
44
+ const handle_change = useCallback((e) => {
45
+ set_message(e.target.value);
46
+ resize_textarea();
47
+ }, [resize_textarea]);
48
+ // -------------------------------------------------------------------------
49
+ // Handle send
50
+ // -------------------------------------------------------------------------
51
+ const handle_send = useCallback(() => {
52
+ const trimmed = message.trim();
53
+ const has_attachments = pending_attachments.length > 0;
54
+ if (!trimmed && !has_attachments)
55
+ return;
56
+ if (is_disabled)
57
+ return;
58
+ // Convert pending attachments to uploaded files format
59
+ const uploaded_files = pending_attachments
60
+ .filter((a) => a.upload_status === 'uploaded' || a.upload_status === 'pending')
61
+ .map((a) => ({
62
+ id: a.id,
63
+ name: a.file.name,
64
+ url: '', // Will be filled after upload
65
+ mime_type: a.file.type,
66
+ file_size: a.file.size
67
+ }));
68
+ on_send(trimmed, uploaded_files);
69
+ set_message('');
70
+ // Reset textarea height
71
+ if (textarea_ref.current) {
72
+ textarea_ref.current.style.height = 'auto';
73
+ }
74
+ }, [message, pending_attachments, is_disabled, on_send]);
75
+ // -------------------------------------------------------------------------
76
+ // Handle keyboard events
77
+ // -------------------------------------------------------------------------
78
+ const handle_key_down = useCallback((e) => {
79
+ // Send on Enter without Shift
80
+ if (e.key === 'Enter' && !e.shiftKey) {
81
+ e.preventDefault();
82
+ handle_send();
83
+ }
84
+ }, [handle_send]);
85
+ // -------------------------------------------------------------------------
86
+ // Handle file selection
87
+ // -------------------------------------------------------------------------
88
+ const handle_file_change = useCallback((e) => {
89
+ const files = Array.from(e.target.files || []);
90
+ if (files.length > 0) {
91
+ on_add_attachment(files);
92
+ }
93
+ // Reset input
94
+ e.target.value = '';
95
+ }, [on_add_attachment]);
96
+ // -------------------------------------------------------------------------
97
+ // Handle drag events
98
+ // -------------------------------------------------------------------------
99
+ const handle_drag_over = useCallback((e) => {
100
+ e.preventDefault();
101
+ e.stopPropagation();
102
+ set_is_dragging(true);
103
+ }, []);
104
+ const handle_drag_leave = useCallback((e) => {
105
+ e.preventDefault();
106
+ e.stopPropagation();
107
+ set_is_dragging(false);
108
+ }, []);
109
+ const handle_drop = useCallback((e) => {
110
+ e.preventDefault();
111
+ e.stopPropagation();
112
+ set_is_dragging(false);
113
+ const files = Array.from(e.dataTransfer.files);
114
+ if (files.length > 0) {
115
+ on_add_attachment(files);
116
+ }
117
+ }, [on_add_attachment]);
118
+ // -------------------------------------------------------------------------
119
+ // Trigger file inputs
120
+ // -------------------------------------------------------------------------
121
+ const handle_attach_click = useCallback(() => {
122
+ file_input_ref.current?.click();
123
+ }, []);
124
+ const handle_image_click = useCallback(() => {
125
+ image_input_ref.current?.click();
126
+ }, []);
127
+ // -------------------------------------------------------------------------
128
+ // Check if can send
129
+ // -------------------------------------------------------------------------
130
+ const can_send = !is_disabled && (message.trim().length > 0 || pending_attachments.length > 0);
131
+ return (_jsxs("div", { className: cn('cls_hazo_chat_input', 'flex flex-col border-t bg-background', is_dragging && 'ring-2 ring-primary ring-inset', className), onDragOver: handle_drag_over, onDragLeave: handle_drag_leave, onDrop: handle_drop, children: [_jsx(HazoChatAttachmentPreview, { attachments: pending_attachments, on_remove: on_remove_attachment }), _jsxs("div", { className: "cls_input_row flex items-end gap-2 p-3", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", onClick: handle_attach_click, disabled: is_disabled, className: "cls_attach_btn h-12 w-12 text-muted-foreground hover:text-foreground", "aria-label": "Attach file", children: _jsx(IoAttach, { className: "w-8 h-8" }) }) }), _jsx(TooltipContent, { children: "Attach file" })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", onClick: handle_image_click, disabled: is_disabled, className: "cls_image_btn h-12 w-12 text-muted-foreground hover:text-foreground", "aria-label": "Attach image", children: _jsx(IoImageOutline, { className: "w-8 h-8" }) }) }), _jsx(TooltipContent, { children: "Attach image" })] }), _jsx("input", { ref: file_input_ref, type: "file", multiple: true, onChange: handle_file_change, className: "hidden", "aria-hidden": "true" }), _jsx("input", { ref: image_input_ref, type: "file", accept: "image/*", multiple: true, onChange: handle_file_change, className: "hidden", "aria-hidden": "true" }), _jsx(Textarea, { ref: textarea_ref, value: message, onChange: handle_change, onKeyDown: handle_key_down, placeholder: placeholder, disabled: is_disabled, rows: 1, className: cn('cls_message_textarea', 'flex-1 resize-none', 'min-h-[40px] max-h-[120px]'), "aria-label": "Message input" }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "default", size: "icon", onClick: handle_send, disabled: !can_send, className: "cls_send_btn", "aria-label": "Send message", children: _jsx(IoSend, { className: "w-4 h-4" }) }) }), _jsx(TooltipContent, { children: "Send message (Enter)" })] })] }), is_dragging && (_jsx("div", { className: "absolute inset-0 bg-primary/10 flex items-center justify-center pointer-events-none", children: _jsx("p", { className: "text-primary font-medium", children: "Drop files here" }) }))] }));
132
+ }
133
+ HazoChatInput.displayName = 'HazoChatInput';
134
+ //# 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,17 @@
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
+ *
10
+ * Uses shadcn/ui ScrollArea component.
11
+ */
12
+ import type { HazoChatMessagesProps } from '../../types/index.js';
13
+ export declare function HazoChatMessages({ messages, current_user_id, timezone, is_loading, has_more, on_load_more, on_delete_message, on_scroll_to_message, highlighted_message_id, className }: HazoChatMessagesProps): import("react/jsx-runtime").JSX.Element;
14
+ export declare namespace HazoChatMessages {
15
+ var displayName: string;
16
+ }
17
+ //# 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;;;;;;;;;;GAUG;AAMH,OAAO,KAAK,EAAE,qBAAqB,EAAqB,MAAM,sBAAsB,CAAC;AAUrF,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,eAAe,EACf,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACV,EAAE,qBAAqB,2CA0JvB;yBArKe,gBAAgB"}
@@ -0,0 +1,109 @@
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
+ *
10
+ * Uses shadcn/ui ScrollArea component.
11
+ */
12
+ 'use client';
13
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
14
+ import { useRef, useEffect, useCallback } from 'react';
15
+ import { cn } from '../../lib/utils.js';
16
+ import { ChatBubble } from '../ui/chat_bubble.js';
17
+ import { LoadingSkeleton } from '../ui/loading_skeleton.js';
18
+ import { ScrollArea } from '../ui/scroll-area.js';
19
+ import { EMPTY_CHAT_MESSAGE } from '../../lib/constants.js';
20
+ // ============================================================================
21
+ // Component
22
+ // ============================================================================
23
+ export function HazoChatMessages({ messages, current_user_id, timezone, is_loading, has_more, on_load_more, on_delete_message, on_scroll_to_message, highlighted_message_id, className }) {
24
+ const container_ref = useRef(null);
25
+ const load_more_trigger_ref = useRef(null);
26
+ const is_at_bottom_ref = useRef(true);
27
+ const previous_messages_length_ref = useRef(0);
28
+ // -------------------------------------------------------------------------
29
+ // Intersection observer for infinite scroll
30
+ // -------------------------------------------------------------------------
31
+ useEffect(() => {
32
+ const trigger = load_more_trigger_ref.current;
33
+ if (!trigger || !has_more)
34
+ return;
35
+ const observer = new IntersectionObserver((entries) => {
36
+ if (entries[0].isIntersecting) {
37
+ on_load_more();
38
+ }
39
+ }, { threshold: 0.1 });
40
+ observer.observe(trigger);
41
+ return () => {
42
+ observer.disconnect();
43
+ };
44
+ }, [has_more, on_load_more]);
45
+ // -------------------------------------------------------------------------
46
+ // Track scroll position
47
+ // -------------------------------------------------------------------------
48
+ const handle_scroll = useCallback(() => {
49
+ const container = container_ref.current;
50
+ if (!container)
51
+ return;
52
+ // Check if scrolled to bottom
53
+ const threshold = 50;
54
+ is_at_bottom_ref.current =
55
+ container.scrollHeight - container.scrollTop - container.clientHeight < threshold;
56
+ }, []);
57
+ // -------------------------------------------------------------------------
58
+ // Auto-scroll to bottom on new messages (if already at bottom)
59
+ // -------------------------------------------------------------------------
60
+ useEffect(() => {
61
+ const container = container_ref.current;
62
+ if (!container)
63
+ return;
64
+ // Only auto-scroll if we were at the bottom and new messages arrived
65
+ if (is_at_bottom_ref.current && messages.length > previous_messages_length_ref.current) {
66
+ container.scrollTop = container.scrollHeight;
67
+ }
68
+ previous_messages_length_ref.current = messages.length;
69
+ }, [messages.length]);
70
+ // -------------------------------------------------------------------------
71
+ // Scroll to highlighted message
72
+ // -------------------------------------------------------------------------
73
+ useEffect(() => {
74
+ if (!highlighted_message_id)
75
+ return;
76
+ const element = document.getElementById(`message-${highlighted_message_id}`);
77
+ if (element) {
78
+ element.scrollIntoView({ behavior: 'smooth', block: 'center' });
79
+ }
80
+ }, [highlighted_message_id]);
81
+ // -------------------------------------------------------------------------
82
+ // Handle reference click in message
83
+ // -------------------------------------------------------------------------
84
+ const handle_reference_click = useCallback((reference) => {
85
+ // This would be handled by parent via context
86
+ console.log('[HazoChatMessages] Reference clicked:', reference);
87
+ }, []);
88
+ // -------------------------------------------------------------------------
89
+ // Loading state
90
+ // -------------------------------------------------------------------------
91
+ if (is_loading && messages.length === 0) {
92
+ return (_jsx("div", { className: cn('cls_messages_loading p-4', className), children: _jsx(LoadingSkeleton, { variant: "message", count: 5 }) }));
93
+ }
94
+ // -------------------------------------------------------------------------
95
+ // Empty state
96
+ // -------------------------------------------------------------------------
97
+ if (!is_loading && messages.length === 0) {
98
+ 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 }));
99
+ }
100
+ // -------------------------------------------------------------------------
101
+ // Messages list
102
+ // -------------------------------------------------------------------------
103
+ 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-reverse' // Reverse order for bottom-up display
104
+ ), role: "log", "aria-label": "Chat messages", "aria-live": "polite", children: [messages.map((message) => (_jsx(ChatBubble, { message: message, is_sender: message.sender_user_id === current_user_id, sender_profile: message.sender_profile, timezone: timezone, on_delete: message.sender_user_id === current_user_id
105
+ ? () => on_delete_message(message.id)
106
+ : undefined, on_reference_click: handle_reference_click, is_highlighted: highlighted_message_id === message.id }, message.id))), has_more && (_jsx("div", { ref: load_more_trigger_ref, className: "cls_load_more_trigger py-4", children: _jsx(LoadingSkeleton, { variant: "message", count: 2 }) }))] }) }));
107
+ }
108
+ HazoChatMessages.displayName = 'HazoChatMessages';
109
+ //# 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"}