hazo_chat 2.0.2 → 2.0.3
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/dist/api/index.d.ts +24 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +24 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/messages.d.ts +34 -0
- package/dist/api/messages.d.ts.map +1 -0
- package/dist/api/messages.js +210 -0
- package/dist/api/messages.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +8 -0
- package/dist/api/types.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat.d.ts +28 -0
- package/dist/components/hazo_chat/hazo_chat.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat.js +167 -0
- package/dist/components/hazo_chat/hazo_chat.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +17 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +60 -0
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_context.d.ts +42 -0
- package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_context.js +261 -0
- package/dist/components/hazo_chat/hazo_chat_context.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +15 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js +111 -0
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_header.d.ts +16 -0
- package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_header.js +24 -0
- package/dist/components/hazo_chat/hazo_chat_header.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_input.d.ts +18 -0
- package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_input.js +134 -0
- package/dist/components/hazo_chat/hazo_chat_input.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts +17 -0
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_messages.js +109 -0
- package/dist/components/hazo_chat/hazo_chat_messages.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +16 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.js +59 -0
- package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +18 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +1 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.js +72 -0
- package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +1 -0
- package/dist/components/hazo_chat/index.d.ts +16 -0
- package/dist/components/hazo_chat/index.d.ts.map +1 -0
- package/dist/components/hazo_chat/index.js +19 -0
- package/dist/components/hazo_chat/index.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +11 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +13 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +28 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +16 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +36 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.d.ts +18 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +47 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/chat_bubble.d.ts +19 -0
- package/dist/components/ui/chat_bubble.d.ts.map +1 -0
- package/dist/components/ui/chat_bubble.js +101 -0
- package/dist/components/ui/chat_bubble.js.map +1 -0
- package/dist/components/ui/index.d.ts +18 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +20 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/components/ui/input.d.ts +11 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +18 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/loading_skeleton.d.ts +19 -0
- package/dist/components/ui/loading_skeleton.d.ts.map +1 -0
- package/dist/components/ui/loading_skeleton.js +30 -0
- package/dist/components/ui/loading_skeleton.js.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +12 -0
- package/dist/components/ui/scroll-area.d.ts.map +1 -0
- package/dist/components/ui/scroll-area.js +25 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/separator.d.ts +11 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +18 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/skeleton.d.ts +9 -0
- package/dist/components/ui/skeleton.d.ts.map +1 -0
- package/dist/components/ui/skeleton.js +16 -0
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +11 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +18 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/tooltip.d.ts +14 -0
- package/dist/components/ui/tooltip.d.ts.map +1 -0
- package/dist/components/ui/tooltip.js +30 -0
- package/dist/components/ui/tooltip.js.map +1 -0
- package/dist/hooks/index.d.ts +10 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/use_chat_messages.d.ts +30 -0
- package/dist/hooks/use_chat_messages.d.ts.map +1 -0
- package/dist/hooks/use_chat_messages.js +432 -0
- package/dist/hooks/use_chat_messages.js.map +1 -0
- package/dist/hooks/use_chat_references.d.ts +17 -0
- package/dist/hooks/use_chat_references.d.ts.map +1 -0
- package/dist/hooks/use_chat_references.js +133 -0
- package/dist/hooks/use_chat_references.js.map +1 -0
- package/dist/hooks/use_file_upload.d.ts +23 -0
- package/dist/hooks/use_file_upload.d.ts.map +1 -0
- package/dist/hooks/use_file_upload.js +212 -0
- package/dist/hooks/use_file_upload.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +41 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +93 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/constants.d.ts +39 -0
- package/dist/lib/constants.d.ts.map +1 -0
- package/dist/lib/constants.js +70 -0
- package/dist/lib/constants.js.map +1 -0
- package/dist/lib/index.d.ts +9 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/utils.d.ts +17 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +20 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/types/index.d.ts +378 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +11 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
'use client';
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
|
+
import { useEffect, useCallback } from 'react';
|
|
16
|
+
import { IoClose } from 'react-icons/io5';
|
|
17
|
+
import { cn } from '../../lib/utils.js';
|
|
18
|
+
import { MOBILE_BREAKPOINT } from '../../lib/constants.js';
|
|
19
|
+
import { Button } from '../ui/button.js';
|
|
20
|
+
import { ScrollArea } from '../ui/scroll-area.js';
|
|
21
|
+
import { Separator } from '../ui/separator.js';
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Component
|
|
24
|
+
// ============================================================================
|
|
25
|
+
export function HazoChatSidebar({ is_open, on_close, className, children }) {
|
|
26
|
+
// Handle escape key to close sidebar
|
|
27
|
+
const handle_escape = useCallback((event) => {
|
|
28
|
+
if (event.key === 'Escape' && is_open) {
|
|
29
|
+
on_close();
|
|
30
|
+
}
|
|
31
|
+
}, [is_open, on_close]);
|
|
32
|
+
// Handle click outside to close (mobile)
|
|
33
|
+
const handle_backdrop_click = useCallback(() => {
|
|
34
|
+
on_close();
|
|
35
|
+
}, [on_close]);
|
|
36
|
+
// Add escape key listener
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
document.addEventListener('keydown', handle_escape);
|
|
39
|
+
return () => {
|
|
40
|
+
document.removeEventListener('keydown', handle_escape);
|
|
41
|
+
};
|
|
42
|
+
}, [handle_escape]);
|
|
43
|
+
// Prevent body scroll when sidebar is open on mobile
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (typeof window === 'undefined')
|
|
46
|
+
return;
|
|
47
|
+
const is_mobile = window.innerWidth < MOBILE_BREAKPOINT;
|
|
48
|
+
if (is_open && is_mobile) {
|
|
49
|
+
document.body.style.overflow = 'hidden';
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
document.body.style.overflow = '';
|
|
53
|
+
}
|
|
54
|
+
return () => {
|
|
55
|
+
document.body.style.overflow = '';
|
|
56
|
+
};
|
|
57
|
+
}, [is_open]);
|
|
58
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: cn('cls_sidebar_backdrop', 'fixed inset-0 bg-black/50 z-40', 'md:hidden', // Only on mobile
|
|
59
|
+
'transition-opacity duration-200', is_open ? 'opacity-100' : 'opacity-0 pointer-events-none'), onClick: handle_backdrop_click, "aria-hidden": "true" }), _jsxs("aside", { className: cn('cls_hazo_chat_sidebar',
|
|
60
|
+
// Mobile: fixed overlay
|
|
61
|
+
'fixed md:relative', 'top-0 left-0 h-full z-50',
|
|
62
|
+
// Sizing
|
|
63
|
+
'w-[280px] md:w-full',
|
|
64
|
+
// Background
|
|
65
|
+
'bg-background border-r',
|
|
66
|
+
// Transition
|
|
67
|
+
'transition-transform duration-200 ease-in-out',
|
|
68
|
+
// Mobile: slide in/out
|
|
69
|
+
is_open ? 'translate-x-0' : '-translate-x-full md:translate-x-0', className), "aria-label": "Chat sidebar", "aria-hidden": !is_open, children: [_jsxs("div", { className: "cls_sidebar_header flex items-center justify-between p-3 md:hidden", children: [_jsx("span", { className: "text-sm font-medium", children: "Documents & References" }), _jsx(Button, { variant: "ghost", size: "icon", onClick: on_close, className: "h-8 w-8", "aria-label": "Close sidebar", children: _jsx(IoClose, { className: "w-4 h-4" }) })] }), _jsx(Separator, { className: "md:hidden" }), _jsx(ScrollArea, { className: "cls_sidebar_content h-full flex flex-col", children: children })] })] }));
|
|
70
|
+
}
|
|
71
|
+
HazoChatSidebar.displayName = 'HazoChatSidebar';
|
|
72
|
+
//# sourceMappingURL=hazo_chat_sidebar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hazo_chat_sidebar.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/hazo_chat_sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChat components barrel export file
|
|
3
|
+
*
|
|
4
|
+
* Exports all HazoChat components from the hazo_chat package.
|
|
5
|
+
* All export paths use explicit .js extensions for ES module compatibility.
|
|
6
|
+
*/
|
|
7
|
+
export { HazoChat } from './hazo_chat.js';
|
|
8
|
+
export { HazoChatProvider, useHazoChatContext } from './hazo_chat_context.js';
|
|
9
|
+
export { HazoChatHeader } from './hazo_chat_header.js';
|
|
10
|
+
export { HazoChatSidebar } from './hazo_chat_sidebar.js';
|
|
11
|
+
export { HazoChatReferenceList } from './hazo_chat_reference_list.js';
|
|
12
|
+
export { HazoChatDocumentViewer } from './hazo_chat_document_viewer.js';
|
|
13
|
+
export { HazoChatMessages } from './hazo_chat_messages.js';
|
|
14
|
+
export { HazoChatInput } from './hazo_chat_input.js';
|
|
15
|
+
export { HazoChatAttachmentPreview } from './hazo_chat_attachment_preview.js';
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/hazo_chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAG9E,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HazoChat components barrel export file
|
|
3
|
+
*
|
|
4
|
+
* Exports all HazoChat components from the hazo_chat package.
|
|
5
|
+
* All export paths use explicit .js extensions for ES module compatibility.
|
|
6
|
+
*/
|
|
7
|
+
// Main component
|
|
8
|
+
export { HazoChat } from './hazo_chat.js';
|
|
9
|
+
// Context
|
|
10
|
+
export { HazoChatProvider, useHazoChatContext } from './hazo_chat_context.js';
|
|
11
|
+
// Sub-components (for custom layouts)
|
|
12
|
+
export { HazoChatHeader } from './hazo_chat_header.js';
|
|
13
|
+
export { HazoChatSidebar } from './hazo_chat_sidebar.js';
|
|
14
|
+
export { HazoChatReferenceList } from './hazo_chat_reference_list.js';
|
|
15
|
+
export { HazoChatDocumentViewer } from './hazo_chat_document_viewer.js';
|
|
16
|
+
export { HazoChatMessages } from './hazo_chat_messages.js';
|
|
17
|
+
export { HazoChatInput } from './hazo_chat_input.js';
|
|
18
|
+
export { HazoChatAttachmentPreview } from './hazo_chat_attachment_preview.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/hazo_chat/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iBAAiB;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE9E,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Components barrel export file
|
|
3
|
+
*
|
|
4
|
+
* Exports all components from the hazo_chat package.
|
|
5
|
+
* All export paths use explicit .js extensions for ES module compatibility.
|
|
6
|
+
*/
|
|
7
|
+
export * from './hazo_chat/index.js';
|
|
8
|
+
export * from './ui/index.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,cAAc,sBAAsB,CAAC;AAGrC,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Components barrel export file
|
|
3
|
+
*
|
|
4
|
+
* Exports all components from the hazo_chat package.
|
|
5
|
+
* All export paths use explicit .js extensions for ES module compatibility.
|
|
6
|
+
*/
|
|
7
|
+
// HazoChat components
|
|
8
|
+
export * from './hazo_chat/index.js';
|
|
9
|
+
// UI components
|
|
10
|
+
export * from './ui/index.js';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,sBAAsB;AACtB,cAAc,sBAAsB,CAAC;AAErC,gBAAgB;AAChB,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avatar Component (shadcn/ui style)
|
|
3
|
+
*
|
|
4
|
+
* A user avatar component with image and fallback support.
|
|
5
|
+
* Uses @radix-ui/react-avatar for accessibility.
|
|
6
|
+
*/
|
|
7
|
+
import * as React from 'react';
|
|
8
|
+
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
9
|
+
declare const Avatar: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
10
|
+
declare const AvatarImage: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarImageProps & React.RefAttributes<HTMLImageElement>, "ref"> & React.RefAttributes<HTMLImageElement>>;
|
|
11
|
+
declare const AvatarFallback: React.ForwardRefExoticComponent<Omit<AvatarPrimitive.AvatarFallbackProps & React.RefAttributes<HTMLSpanElement>, "ref"> & React.RefAttributes<HTMLSpanElement>>;
|
|
12
|
+
export { Avatar, AvatarImage, AvatarFallback };
|
|
13
|
+
//# sourceMappingURL=avatar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAO1D,QAAA,MAAM,MAAM,yJAYV,CAAC;AAQH,QAAA,MAAM,WAAW,gKASf,CAAC;AAQH,QAAA,MAAM,cAAc,iKAYlB,CAAC;AAIH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Avatar Component (shadcn/ui style)
|
|
3
|
+
*
|
|
4
|
+
* A user avatar component with image and fallback support.
|
|
5
|
+
* Uses @radix-ui/react-avatar for accessibility.
|
|
6
|
+
*/
|
|
7
|
+
'use client';
|
|
8
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
|
+
import * as React from 'react';
|
|
10
|
+
import * as AvatarPrimitive from '@radix-ui/react-avatar';
|
|
11
|
+
import { cn } from '../../lib/utils.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Avatar Root
|
|
14
|
+
// ============================================================================
|
|
15
|
+
const Avatar = React.forwardRef(({ className, ...props }, ref) => (_jsx(AvatarPrimitive.Root, { ref: ref, className: cn('relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full', className), ...props })));
|
|
16
|
+
Avatar.displayName = AvatarPrimitive.Root.displayName;
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Avatar Image
|
|
19
|
+
// ============================================================================
|
|
20
|
+
const AvatarImage = React.forwardRef(({ className, ...props }, ref) => (_jsx(AvatarPrimitive.Image, { ref: ref, className: cn('aspect-square h-full w-full', className), ...props })));
|
|
21
|
+
AvatarImage.displayName = AvatarPrimitive.Image.displayName;
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Avatar Fallback
|
|
24
|
+
// ============================================================================
|
|
25
|
+
const AvatarFallback = React.forwardRef(({ className, ...props }, ref) => (_jsx(AvatarPrimitive.Fallback, { ref: ref, className: cn('flex h-full w-full items-center justify-center rounded-full bg-muted', className), ...props })));
|
|
26
|
+
AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;
|
|
27
|
+
export { Avatar, AvatarImage, AvatarFallback };
|
|
28
|
+
//# sourceMappingURL=avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../src/components/ui/avatar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,eAAe,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,EAAE,EAAE,MAAM,oBAAoB,CAAC;AAExC,+EAA+E;AAC/E,cAAc;AACd,+EAA+E;AAE/E,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAG7B,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,eAAe,CAAC,IAAI,IACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AAEH,MAAM,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;AAEtD,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,CAGlC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,eAAe,CAAC,KAAK,IACpB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CAAC,6BAA6B,EAAE,SAAS,CAAC,KACnD,KAAK,GACT,CACH,CAAC,CAAC;AAEH,WAAW,CAAC,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC;AAE5D,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAGrC,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAClC,KAAC,eAAe,CAAC,QAAQ,IACvB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,EAAE,CACX,sEAAsE,EACtE,SAAS,CACV,KACG,KAAK,GACT,CACH,CAAC,CAAC;AAEH,cAAc,CAAC,WAAW,GAAG,eAAe,CAAC,QAAQ,CAAC,WAAW,CAAC;AAElE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC"}
|