hazo_chat 2.0.13 → 2.0.15
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/README.md +104 -7
- package/SETUP_CHECKLIST.md +73 -0
- package/package.json +1 -1
- package/dist/api/index.d.ts +0 -26
- package/dist/api/index.d.ts.map +0 -1
- package/dist/api/index.js +0 -25
- package/dist/api/index.js.map +0 -1
- package/dist/api/messages.d.ts +0 -34
- package/dist/api/messages.d.ts.map +0 -1
- package/dist/api/messages.js +0 -214
- package/dist/api/messages.js.map +0 -1
- package/dist/api/types.d.ts +0 -69
- package/dist/api/types.d.ts.map +0 -1
- package/dist/api/types.js +0 -8
- package/dist/api/types.js.map +0 -1
- package/dist/api/unread_count.d.ts +0 -57
- package/dist/api/unread_count.d.ts.map +0 -1
- package/dist/api/unread_count.js +0 -86
- package/dist/api/unread_count.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat.d.ts +0 -28
- package/dist/components/hazo_chat/hazo_chat.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat.js +0 -201
- package/dist/components/hazo_chat/hazo_chat.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts +0 -17
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js +0 -60
- package/dist/components/hazo_chat/hazo_chat_attachment_preview.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_context.d.ts +0 -42
- package/dist/components/hazo_chat/hazo_chat_context.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_context.js +0 -273
- package/dist/components/hazo_chat/hazo_chat_context.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts +0 -15
- package/dist/components/hazo_chat/hazo_chat_document_viewer.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js +0 -111
- package/dist/components/hazo_chat/hazo_chat_document_viewer.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_header.d.ts +0 -16
- package/dist/components/hazo_chat/hazo_chat_header.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_header.js +0 -24
- package/dist/components/hazo_chat/hazo_chat_header.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_input.d.ts +0 -16
- package/dist/components/hazo_chat/hazo_chat_input.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_input.js +0 -75
- package/dist/components/hazo_chat/hazo_chat_input.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts +0 -17
- package/dist/components/hazo_chat/hazo_chat_messages.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_messages.js +0 -109
- package/dist/components/hazo_chat/hazo_chat_messages.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts +0 -16
- package/dist/components/hazo_chat/hazo_chat_reference_list.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_reference_list.js +0 -59
- package/dist/components/hazo_chat/hazo_chat_reference_list.js.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts +0 -18
- package/dist/components/hazo_chat/hazo_chat_sidebar.d.ts.map +0 -1
- package/dist/components/hazo_chat/hazo_chat_sidebar.js +0 -72
- package/dist/components/hazo_chat/hazo_chat_sidebar.js.map +0 -1
- package/dist/components/hazo_chat/index.d.ts +0 -16
- package/dist/components/hazo_chat/index.d.ts.map +0 -1
- package/dist/components/hazo_chat/index.js +0 -19
- package/dist/components/hazo_chat/index.js.map +0 -1
- package/dist/components/index.d.ts +0 -9
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -11
- package/dist/components/index.js.map +0 -1
- package/dist/components/ui/avatar.d.ts +0 -13
- package/dist/components/ui/avatar.d.ts.map +0 -1
- package/dist/components/ui/avatar.js +0 -28
- package/dist/components/ui/avatar.js.map +0 -1
- package/dist/components/ui/badge.d.ts +0 -16
- package/dist/components/ui/badge.d.ts.map +0 -1
- package/dist/components/ui/badge.js +0 -36
- package/dist/components/ui/badge.js.map +0 -1
- package/dist/components/ui/button.d.ts +0 -18
- package/dist/components/ui/button.d.ts.map +0 -1
- package/dist/components/ui/button.js +0 -47
- package/dist/components/ui/button.js.map +0 -1
- package/dist/components/ui/chat_bubble.d.ts +0 -18
- package/dist/components/ui/chat_bubble.d.ts.map +0 -1
- package/dist/components/ui/chat_bubble.js +0 -107
- package/dist/components/ui/chat_bubble.js.map +0 -1
- package/dist/components/ui/hover-card.d.ts +0 -13
- package/dist/components/ui/hover-card.d.ts.map +0 -1
- package/dist/components/ui/hover-card.js +0 -17
- package/dist/components/ui/hover-card.js.map +0 -1
- package/dist/components/ui/index.d.ts +0 -19
- package/dist/components/ui/index.d.ts.map +0 -1
- package/dist/components/ui/index.js +0 -21
- package/dist/components/ui/index.js.map +0 -1
- package/dist/components/ui/input.d.ts +0 -11
- package/dist/components/ui/input.d.ts.map +0 -1
- package/dist/components/ui/input.js +0 -18
- package/dist/components/ui/input.js.map +0 -1
- package/dist/components/ui/loading_skeleton.d.ts +0 -19
- package/dist/components/ui/loading_skeleton.d.ts.map +0 -1
- package/dist/components/ui/loading_skeleton.js +0 -30
- package/dist/components/ui/loading_skeleton.js.map +0 -1
- package/dist/components/ui/scroll-area.d.ts +0 -12
- package/dist/components/ui/scroll-area.d.ts.map +0 -1
- package/dist/components/ui/scroll-area.js +0 -25
- package/dist/components/ui/scroll-area.js.map +0 -1
- package/dist/components/ui/separator.d.ts +0 -11
- package/dist/components/ui/separator.d.ts.map +0 -1
- package/dist/components/ui/separator.js +0 -18
- package/dist/components/ui/separator.js.map +0 -1
- package/dist/components/ui/skeleton.d.ts +0 -9
- package/dist/components/ui/skeleton.d.ts.map +0 -1
- package/dist/components/ui/skeleton.js +0 -16
- package/dist/components/ui/skeleton.js.map +0 -1
- package/dist/components/ui/textarea.d.ts +0 -11
- package/dist/components/ui/textarea.d.ts.map +0 -1
- package/dist/components/ui/textarea.js +0 -18
- package/dist/components/ui/textarea.js.map +0 -1
- package/dist/components/ui/tooltip.d.ts +0 -14
- package/dist/components/ui/tooltip.d.ts.map +0 -1
- package/dist/components/ui/tooltip.js +0 -30
- package/dist/components/ui/tooltip.js.map +0 -1
- package/dist/hooks/index.d.ts +0 -10
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/index.js +0 -10
- package/dist/hooks/index.js.map +0 -1
- package/dist/hooks/use_chat_messages.d.ts +0 -33
- package/dist/hooks/use_chat_messages.d.ts.map +0 -1
- package/dist/hooks/use_chat_messages.js +0 -466
- package/dist/hooks/use_chat_messages.js.map +0 -1
- package/dist/hooks/use_chat_references.d.ts +0 -17
- package/dist/hooks/use_chat_references.d.ts.map +0 -1
- package/dist/hooks/use_chat_references.js +0 -133
- package/dist/hooks/use_chat_references.js.map +0 -1
- package/dist/hooks/use_file_upload.d.ts +0 -23
- package/dist/hooks/use_file_upload.d.ts.map +0 -1
- package/dist/hooks/use_file_upload.js +0 -212
- package/dist/hooks/use_file_upload.js.map +0 -1
- package/dist/index.d.ts +0 -13
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -17
- package/dist/index.js.map +0 -1
- package/dist/lib/config.d.ts +0 -41
- package/dist/lib/config.d.ts.map +0 -1
- package/dist/lib/config.js +0 -93
- package/dist/lib/config.js.map +0 -1
- package/dist/lib/constants.d.ts +0 -41
- package/dist/lib/constants.d.ts.map +0 -1
- package/dist/lib/constants.js +0 -72
- package/dist/lib/constants.js.map +0 -1
- package/dist/lib/index.d.ts +0 -9
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/index.js +0 -9
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/utils.d.ts +0 -17
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/utils.js +0 -20
- package/dist/lib/utils.js.map +0 -1
- package/dist/types/index.d.ts +0 -404
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -11
- package/dist/types/index.js.map +0 -1
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useChatReferences Hook
|
|
3
|
-
*
|
|
4
|
-
* Manages chat references with:
|
|
5
|
-
* - Aggregating references from messages and props
|
|
6
|
-
* - Selection state management
|
|
7
|
-
* - Finding source message for a reference
|
|
8
|
-
*/
|
|
9
|
-
'use client';
|
|
10
|
-
import { useState, useCallback, useMemo, useEffect } from 'react';
|
|
11
|
-
// ============================================================================
|
|
12
|
-
// Hook Implementation
|
|
13
|
-
// ============================================================================
|
|
14
|
-
export function useChatReferences({ messages, initial_references = [], on_selection_change }) {
|
|
15
|
-
// -------------------------------------------------------------------------
|
|
16
|
-
// State
|
|
17
|
-
// -------------------------------------------------------------------------
|
|
18
|
-
const [selected_reference, set_selected_reference_state] = useState(null);
|
|
19
|
-
// -------------------------------------------------------------------------
|
|
20
|
-
// Aggregate all references
|
|
21
|
-
// -------------------------------------------------------------------------
|
|
22
|
-
const references = useMemo(() => {
|
|
23
|
-
const reference_map = new Map();
|
|
24
|
-
// Add initial references (from props)
|
|
25
|
-
initial_references.forEach((ref) => {
|
|
26
|
-
const chat_ref = {
|
|
27
|
-
...ref,
|
|
28
|
-
scope: ref.scope || 'field'
|
|
29
|
-
};
|
|
30
|
-
reference_map.set(ref.id, chat_ref);
|
|
31
|
-
});
|
|
32
|
-
// Add references from messages
|
|
33
|
-
messages.forEach((message) => {
|
|
34
|
-
if (message.reference_list && Array.isArray(message.reference_list)) {
|
|
35
|
-
message.reference_list.forEach((ref) => {
|
|
36
|
-
// Update scope to 'chat' and add message_id
|
|
37
|
-
const existing = reference_map.get(ref.id);
|
|
38
|
-
if (existing) {
|
|
39
|
-
// If reference already exists, it's now in both chat and field
|
|
40
|
-
reference_map.set(ref.id, {
|
|
41
|
-
...existing,
|
|
42
|
-
message_id: message.id
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
else {
|
|
46
|
-
reference_map.set(ref.id, {
|
|
47
|
-
...ref,
|
|
48
|
-
scope: 'chat',
|
|
49
|
-
message_id: message.id
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
return Array.from(reference_map.values());
|
|
56
|
-
}, [messages, initial_references]);
|
|
57
|
-
// -------------------------------------------------------------------------
|
|
58
|
-
// Message lookup for references
|
|
59
|
-
// -------------------------------------------------------------------------
|
|
60
|
-
const reference_to_message_map = useMemo(() => {
|
|
61
|
-
const map = new Map();
|
|
62
|
-
messages.forEach((message) => {
|
|
63
|
-
if (message.reference_list && Array.isArray(message.reference_list)) {
|
|
64
|
-
message.reference_list.forEach((ref) => {
|
|
65
|
-
// Store the first message that contains this reference
|
|
66
|
-
if (!map.has(ref.id)) {
|
|
67
|
-
map.set(ref.id, message.id);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
return map;
|
|
73
|
-
}, [messages]);
|
|
74
|
-
// -------------------------------------------------------------------------
|
|
75
|
-
// Select reference
|
|
76
|
-
// -------------------------------------------------------------------------
|
|
77
|
-
const select_reference = useCallback((reference) => {
|
|
78
|
-
// If same reference, toggle off
|
|
79
|
-
if (selected_reference?.id === reference.id) {
|
|
80
|
-
set_selected_reference_state(null);
|
|
81
|
-
on_selection_change?.(null);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
// Ensure message_id is set if available
|
|
85
|
-
const ref_with_message = {
|
|
86
|
-
...reference,
|
|
87
|
-
message_id: reference.message_id || reference_to_message_map.get(reference.id)
|
|
88
|
-
};
|
|
89
|
-
set_selected_reference_state(ref_with_message);
|
|
90
|
-
on_selection_change?.(ref_with_message);
|
|
91
|
-
}, [selected_reference, reference_to_message_map, on_selection_change]);
|
|
92
|
-
// -------------------------------------------------------------------------
|
|
93
|
-
// Clear selection
|
|
94
|
-
// -------------------------------------------------------------------------
|
|
95
|
-
const clear_selection = useCallback(() => {
|
|
96
|
-
set_selected_reference_state(null);
|
|
97
|
-
on_selection_change?.(null);
|
|
98
|
-
}, [on_selection_change]);
|
|
99
|
-
// -------------------------------------------------------------------------
|
|
100
|
-
// Add new reference
|
|
101
|
-
// -------------------------------------------------------------------------
|
|
102
|
-
const add_reference = useCallback((reference) => {
|
|
103
|
-
// This is typically handled by the context or parent component
|
|
104
|
-
// Here we just select the newly added reference
|
|
105
|
-
select_reference(reference);
|
|
106
|
-
}, [select_reference]);
|
|
107
|
-
// -------------------------------------------------------------------------
|
|
108
|
-
// Get message ID for reference
|
|
109
|
-
// -------------------------------------------------------------------------
|
|
110
|
-
const get_message_for_reference = useCallback((reference_id) => {
|
|
111
|
-
return reference_to_message_map.get(reference_id) || null;
|
|
112
|
-
}, [reference_to_message_map]);
|
|
113
|
-
// -------------------------------------------------------------------------
|
|
114
|
-
// Clear selection if selected reference is removed
|
|
115
|
-
// -------------------------------------------------------------------------
|
|
116
|
-
useEffect(() => {
|
|
117
|
-
if (selected_reference && !references.some((r) => r.id === selected_reference.id)) {
|
|
118
|
-
set_selected_reference_state(null);
|
|
119
|
-
}
|
|
120
|
-
}, [references, selected_reference]);
|
|
121
|
-
// -------------------------------------------------------------------------
|
|
122
|
-
// Return
|
|
123
|
-
// -------------------------------------------------------------------------
|
|
124
|
-
return {
|
|
125
|
-
references,
|
|
126
|
-
selected_reference,
|
|
127
|
-
select_reference,
|
|
128
|
-
clear_selection,
|
|
129
|
-
add_reference,
|
|
130
|
-
get_message_for_reference
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=use_chat_references.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_chat_references.js","sourceRoot":"","sources":["../../src/hooks/use_chat_references.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useFileUpload Hook
|
|
3
|
-
*
|
|
4
|
-
* Manages file uploads with:
|
|
5
|
-
* - File validation (size, type)
|
|
6
|
-
* - Preview generation for images
|
|
7
|
-
* - Upload progress tracking
|
|
8
|
-
* - Batch upload support
|
|
9
|
-
*/
|
|
10
|
-
import type { UploadedFile, UseFileUploadReturn } from '../types/index.js';
|
|
11
|
-
interface UseFileUploadParams {
|
|
12
|
-
/** Path/bucket for uploaded files */
|
|
13
|
-
upload_location: string;
|
|
14
|
-
/** Maximum file size in MB */
|
|
15
|
-
max_file_size_mb?: number;
|
|
16
|
-
/** Allowed file extensions */
|
|
17
|
-
allowed_types?: string[];
|
|
18
|
-
/** Upload function to call for each file */
|
|
19
|
-
upload_function?: (file: File, location: string) => Promise<UploadedFile>;
|
|
20
|
-
}
|
|
21
|
-
export declare function useFileUpload({ upload_location, max_file_size_mb, allowed_types, upload_function }: UseFileUploadParams): UseFileUploadReturn;
|
|
22
|
-
export {};
|
|
23
|
-
//# sourceMappingURL=use_file_upload.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_file_upload.d.ts","sourceRoot":"","sources":["../../src/hooks/use_file_upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAEV,YAAY,EAEZ,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAW3B,UAAU,mBAAmB;IAC3B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,4CAA4C;IAC5C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAC3E;AA4DD,wBAAgB,aAAa,CAAC,EAC5B,eAAe,EACf,gBAA2C,EAC3C,aAAqC,EACrC,eAAyC,EAC1C,EAAE,mBAAmB,GAAG,mBAAmB,CA+M3C"}
|
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* useFileUpload Hook
|
|
3
|
-
*
|
|
4
|
-
* Manages file uploads with:
|
|
5
|
-
* - File validation (size, type)
|
|
6
|
-
* - Preview generation for images
|
|
7
|
-
* - Upload progress tracking
|
|
8
|
-
* - Batch upload support
|
|
9
|
-
*/
|
|
10
|
-
'use client';
|
|
11
|
-
import { useState, useCallback, useRef } from 'react';
|
|
12
|
-
import { DEFAULT_MAX_FILE_SIZE_MB, DEFAULT_ALLOWED_TYPES } from '../lib/constants.js';
|
|
13
|
-
// ============================================================================
|
|
14
|
-
// Helper Functions
|
|
15
|
-
// ============================================================================
|
|
16
|
-
/**
|
|
17
|
-
* Get file extension from filename
|
|
18
|
-
*/
|
|
19
|
-
function get_file_extension(filename) {
|
|
20
|
-
const parts = filename.split('.');
|
|
21
|
-
return parts.length > 1 ? parts.pop()?.toLowerCase() || '' : '';
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Generate unique ID for attachment
|
|
25
|
-
*/
|
|
26
|
-
function generate_attachment_id() {
|
|
27
|
-
return `attachment-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Create preview URL for image files
|
|
31
|
-
*/
|
|
32
|
-
function create_preview_url(file) {
|
|
33
|
-
if (file.type.startsWith('image/')) {
|
|
34
|
-
return URL.createObjectURL(file);
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Default upload function (placeholder - should be overridden)
|
|
40
|
-
*/
|
|
41
|
-
async function default_upload_function(file, location) {
|
|
42
|
-
// This is a placeholder implementation
|
|
43
|
-
// In real usage, this would upload to cloud storage (e.g., Supabase Storage)
|
|
44
|
-
console.warn('[useFileUpload] Using default upload function. Override with upload_function prop.');
|
|
45
|
-
// Simulate upload delay
|
|
46
|
-
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
47
|
-
return {
|
|
48
|
-
id: generate_attachment_id(),
|
|
49
|
-
name: file.name,
|
|
50
|
-
url: `${location}/${file.name}`,
|
|
51
|
-
mime_type: file.type,
|
|
52
|
-
file_size: file.size
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
// ============================================================================
|
|
56
|
-
// Hook Implementation
|
|
57
|
-
// ============================================================================
|
|
58
|
-
export function useFileUpload({ upload_location, max_file_size_mb = DEFAULT_MAX_FILE_SIZE_MB, allowed_types = DEFAULT_ALLOWED_TYPES, upload_function = default_upload_function }) {
|
|
59
|
-
// -------------------------------------------------------------------------
|
|
60
|
-
// State
|
|
61
|
-
// -------------------------------------------------------------------------
|
|
62
|
-
const [pending_attachments, set_pending_attachments] = useState([]);
|
|
63
|
-
const [is_uploading, set_is_uploading] = useState(false);
|
|
64
|
-
const [validation_errors, set_validation_errors] = useState([]);
|
|
65
|
-
// -------------------------------------------------------------------------
|
|
66
|
-
// Refs
|
|
67
|
-
// -------------------------------------------------------------------------
|
|
68
|
-
const is_mounted_ref = useRef(true);
|
|
69
|
-
// -------------------------------------------------------------------------
|
|
70
|
-
// Validation
|
|
71
|
-
// -------------------------------------------------------------------------
|
|
72
|
-
const validate_file = useCallback((file) => {
|
|
73
|
-
// Check file size
|
|
74
|
-
const max_size_bytes = max_file_size_mb * 1024 * 1024;
|
|
75
|
-
if (file.size > max_size_bytes) {
|
|
76
|
-
return {
|
|
77
|
-
valid: false,
|
|
78
|
-
error: `File "${file.name}" exceeds maximum size of ${max_file_size_mb}MB`
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
// Check file type
|
|
82
|
-
const extension = get_file_extension(file.name);
|
|
83
|
-
if (!allowed_types.includes(extension)) {
|
|
84
|
-
return {
|
|
85
|
-
valid: false,
|
|
86
|
-
error: `File type "${extension}" is not allowed. Allowed types: ${allowed_types.join(', ')}`
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
return { valid: true };
|
|
90
|
-
}, [max_file_size_mb, allowed_types]);
|
|
91
|
-
// -------------------------------------------------------------------------
|
|
92
|
-
// Add files
|
|
93
|
-
// -------------------------------------------------------------------------
|
|
94
|
-
const add_files = useCallback((files) => {
|
|
95
|
-
const new_errors = [];
|
|
96
|
-
const valid_attachments = [];
|
|
97
|
-
files.forEach((file) => {
|
|
98
|
-
const validation = validate_file(file);
|
|
99
|
-
if (!validation.valid && validation.error) {
|
|
100
|
-
new_errors.push(validation.error);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
const attachment = {
|
|
104
|
-
id: generate_attachment_id(),
|
|
105
|
-
file,
|
|
106
|
-
preview_url: create_preview_url(file),
|
|
107
|
-
upload_status: 'pending'
|
|
108
|
-
};
|
|
109
|
-
valid_attachments.push(attachment);
|
|
110
|
-
});
|
|
111
|
-
if (new_errors.length > 0) {
|
|
112
|
-
set_validation_errors((prev) => [...prev, ...new_errors]);
|
|
113
|
-
}
|
|
114
|
-
if (valid_attachments.length > 0) {
|
|
115
|
-
set_pending_attachments((prev) => [...prev, ...valid_attachments]);
|
|
116
|
-
}
|
|
117
|
-
}, [validate_file]);
|
|
118
|
-
// -------------------------------------------------------------------------
|
|
119
|
-
// Remove file
|
|
120
|
-
// -------------------------------------------------------------------------
|
|
121
|
-
const remove_file = useCallback((attachment_id) => {
|
|
122
|
-
set_pending_attachments((prev) => {
|
|
123
|
-
const attachment = prev.find((a) => a.id === attachment_id);
|
|
124
|
-
// Revoke object URL to prevent memory leaks
|
|
125
|
-
if (attachment?.preview_url) {
|
|
126
|
-
URL.revokeObjectURL(attachment.preview_url);
|
|
127
|
-
}
|
|
128
|
-
return prev.filter((a) => a.id !== attachment_id);
|
|
129
|
-
});
|
|
130
|
-
}, []);
|
|
131
|
-
// -------------------------------------------------------------------------
|
|
132
|
-
// Upload single file
|
|
133
|
-
// -------------------------------------------------------------------------
|
|
134
|
-
const upload_single_file = useCallback(async (attachment) => {
|
|
135
|
-
// Update status to uploading
|
|
136
|
-
set_pending_attachments((prev) => prev.map((a) => a.id === attachment.id
|
|
137
|
-
? { ...a, upload_status: 'uploading' }
|
|
138
|
-
: a));
|
|
139
|
-
try {
|
|
140
|
-
const result = await upload_function(attachment.file, upload_location);
|
|
141
|
-
// Update status to uploaded
|
|
142
|
-
if (is_mounted_ref.current) {
|
|
143
|
-
set_pending_attachments((prev) => prev.map((a) => a.id === attachment.id
|
|
144
|
-
? { ...a, upload_status: 'uploaded' }
|
|
145
|
-
: a));
|
|
146
|
-
}
|
|
147
|
-
return result;
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
console.error('[useFileUpload] Upload error:', error);
|
|
151
|
-
// Update status to failed
|
|
152
|
-
if (is_mounted_ref.current) {
|
|
153
|
-
set_pending_attachments((prev) => prev.map((a) => a.id === attachment.id
|
|
154
|
-
? {
|
|
155
|
-
...a,
|
|
156
|
-
upload_status: 'failed',
|
|
157
|
-
error_message: error instanceof Error ? error.message : 'Upload failed'
|
|
158
|
-
}
|
|
159
|
-
: a));
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
162
|
-
}
|
|
163
|
-
}, [upload_function, upload_location]);
|
|
164
|
-
// -------------------------------------------------------------------------
|
|
165
|
-
// Upload all pending files
|
|
166
|
-
// -------------------------------------------------------------------------
|
|
167
|
-
const upload_all = useCallback(async () => {
|
|
168
|
-
const pending = pending_attachments.filter((a) => a.upload_status === 'pending' || a.upload_status === 'failed');
|
|
169
|
-
if (pending.length === 0) {
|
|
170
|
-
return [];
|
|
171
|
-
}
|
|
172
|
-
set_is_uploading(true);
|
|
173
|
-
set_validation_errors([]);
|
|
174
|
-
try {
|
|
175
|
-
const results = await Promise.all(pending.map((attachment) => upload_single_file(attachment)));
|
|
176
|
-
// Filter out failed uploads
|
|
177
|
-
const successful = results.filter((result) => result !== null);
|
|
178
|
-
return successful;
|
|
179
|
-
}
|
|
180
|
-
finally {
|
|
181
|
-
if (is_mounted_ref.current) {
|
|
182
|
-
set_is_uploading(false);
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
}, [pending_attachments, upload_single_file]);
|
|
186
|
-
// -------------------------------------------------------------------------
|
|
187
|
-
// Clear all
|
|
188
|
-
// -------------------------------------------------------------------------
|
|
189
|
-
const clear_all = useCallback(() => {
|
|
190
|
-
// Revoke all object URLs
|
|
191
|
-
pending_attachments.forEach((attachment) => {
|
|
192
|
-
if (attachment.preview_url) {
|
|
193
|
-
URL.revokeObjectURL(attachment.preview_url);
|
|
194
|
-
}
|
|
195
|
-
});
|
|
196
|
-
set_pending_attachments([]);
|
|
197
|
-
set_validation_errors([]);
|
|
198
|
-
}, [pending_attachments]);
|
|
199
|
-
// -------------------------------------------------------------------------
|
|
200
|
-
// Return
|
|
201
|
-
// -------------------------------------------------------------------------
|
|
202
|
-
return {
|
|
203
|
-
pending_attachments,
|
|
204
|
-
add_files,
|
|
205
|
-
remove_file,
|
|
206
|
-
upload_all,
|
|
207
|
-
clear_all,
|
|
208
|
-
is_uploading,
|
|
209
|
-
validation_errors
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=use_file_upload.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use_file_upload.js","sourceRoot":"","sources":["../../src/hooks/use_file_upload.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hazo_chat - Main package entry point
|
|
3
|
-
*
|
|
4
|
-
* This is the main entry file for the hazo_chat npm package.
|
|
5
|
-
* It exports all components, hooks, utilities, and types.
|
|
6
|
-
*
|
|
7
|
-
* IMPORTANT: All export paths must use explicit .js extensions for ES module compatibility.
|
|
8
|
-
*/
|
|
9
|
-
export * from './components/index.js';
|
|
10
|
-
export * from './hooks/index.js';
|
|
11
|
-
export * from './lib/index.js';
|
|
12
|
-
export * from './types/index.js';
|
|
13
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,cAAc,uBAAuB,CAAC;AAGtC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hazo_chat - Main package entry point
|
|
3
|
-
*
|
|
4
|
-
* This is the main entry file for the hazo_chat npm package.
|
|
5
|
-
* It exports all components, hooks, utilities, and types.
|
|
6
|
-
*
|
|
7
|
-
* IMPORTANT: All export paths must use explicit .js extensions for ES module compatibility.
|
|
8
|
-
*/
|
|
9
|
-
// Components
|
|
10
|
-
export * from './components/index.js';
|
|
11
|
-
// Hooks
|
|
12
|
-
export * from './hooks/index.js';
|
|
13
|
-
// Library utilities
|
|
14
|
-
export * from './lib/index.js';
|
|
15
|
-
// Types
|
|
16
|
-
export * from './types/index.js';
|
|
17
|
-
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,aAAa;AACb,cAAc,uBAAuB,CAAC;AAEtC,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,gBAAgB,CAAC;AAE/B,QAAQ;AACR,cAAc,kBAAkB,CAAC"}
|
package/dist/lib/config.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration utilities for the hazo_chat package
|
|
3
|
-
*
|
|
4
|
-
* Browser-compatible configuration management.
|
|
5
|
-
* Configuration can be set via environment variables or passed directly.
|
|
6
|
-
*/
|
|
7
|
-
/**
|
|
8
|
-
* Get chat-specific configuration
|
|
9
|
-
*
|
|
10
|
-
* Returns the chat configuration with defaults.
|
|
11
|
-
* Values can be overridden via environment variables:
|
|
12
|
-
* - NEXT_PUBLIC_CHAT_MAX_MESSAGE_LENGTH
|
|
13
|
-
* - NEXT_PUBLIC_CHAT_ENABLE_TIMESTAMPS
|
|
14
|
-
* - NEXT_PUBLIC_CHAT_ENABLE_AVATARS
|
|
15
|
-
* - NEXT_PUBLIC_CHAT_DATE_FORMAT
|
|
16
|
-
*
|
|
17
|
-
* @returns Chat configuration object
|
|
18
|
-
*/
|
|
19
|
-
export declare function get_chat_config(): ChatConfig;
|
|
20
|
-
/**
|
|
21
|
-
* Set chat configuration programmatically
|
|
22
|
-
*
|
|
23
|
-
* Allows overriding configuration values directly in code.
|
|
24
|
-
*
|
|
25
|
-
* @param config - Partial configuration to merge with defaults
|
|
26
|
-
*/
|
|
27
|
-
export declare function set_chat_config(config: Partial<ChatConfig>): void;
|
|
28
|
-
/**
|
|
29
|
-
* Reset configuration to defaults
|
|
30
|
-
*/
|
|
31
|
-
export declare function reset_chat_config(): void;
|
|
32
|
-
/**
|
|
33
|
-
* Chat configuration interface
|
|
34
|
-
*/
|
|
35
|
-
export interface ChatConfig {
|
|
36
|
-
max_message_length: number;
|
|
37
|
-
enable_timestamps: boolean;
|
|
38
|
-
enable_avatars: boolean;
|
|
39
|
-
date_format: string;
|
|
40
|
-
}
|
|
41
|
-
//# sourceMappingURL=config.d.ts.map
|
package/dist/lib/config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH;;;;;;;;;;;GAWG;AACH,wBAAgB,eAAe,IAAI,UAAU,CAU5C;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAKjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB"}
|
package/dist/lib/config.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Configuration utilities for the hazo_chat package
|
|
3
|
-
*
|
|
4
|
-
* Browser-compatible configuration management.
|
|
5
|
-
* Configuration can be set via environment variables or passed directly.
|
|
6
|
-
*/
|
|
7
|
-
// Default configuration values
|
|
8
|
-
const DEFAULT_CONFIG = {
|
|
9
|
-
max_message_length: 1000,
|
|
10
|
-
enable_timestamps: true,
|
|
11
|
-
enable_avatars: true,
|
|
12
|
-
date_format: 'short'
|
|
13
|
-
};
|
|
14
|
-
// Cached configuration
|
|
15
|
-
let cached_config = null;
|
|
16
|
-
/**
|
|
17
|
-
* Get chat-specific configuration
|
|
18
|
-
*
|
|
19
|
-
* Returns the chat configuration with defaults.
|
|
20
|
-
* Values can be overridden via environment variables:
|
|
21
|
-
* - NEXT_PUBLIC_CHAT_MAX_MESSAGE_LENGTH
|
|
22
|
-
* - NEXT_PUBLIC_CHAT_ENABLE_TIMESTAMPS
|
|
23
|
-
* - NEXT_PUBLIC_CHAT_ENABLE_AVATARS
|
|
24
|
-
* - NEXT_PUBLIC_CHAT_DATE_FORMAT
|
|
25
|
-
*
|
|
26
|
-
* @returns Chat configuration object
|
|
27
|
-
*/
|
|
28
|
-
export function get_chat_config() {
|
|
29
|
-
if (!cached_config) {
|
|
30
|
-
cached_config = {
|
|
31
|
-
max_message_length: get_env_number('NEXT_PUBLIC_CHAT_MAX_MESSAGE_LENGTH', DEFAULT_CONFIG.max_message_length),
|
|
32
|
-
enable_timestamps: get_env_boolean('NEXT_PUBLIC_CHAT_ENABLE_TIMESTAMPS', DEFAULT_CONFIG.enable_timestamps),
|
|
33
|
-
enable_avatars: get_env_boolean('NEXT_PUBLIC_CHAT_ENABLE_AVATARS', DEFAULT_CONFIG.enable_avatars),
|
|
34
|
-
date_format: get_env_string('NEXT_PUBLIC_CHAT_DATE_FORMAT', DEFAULT_CONFIG.date_format)
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
return cached_config;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Set chat configuration programmatically
|
|
41
|
-
*
|
|
42
|
-
* Allows overriding configuration values directly in code.
|
|
43
|
-
*
|
|
44
|
-
* @param config - Partial configuration to merge with defaults
|
|
45
|
-
*/
|
|
46
|
-
export function set_chat_config(config) {
|
|
47
|
-
cached_config = {
|
|
48
|
-
...get_chat_config(),
|
|
49
|
-
...config
|
|
50
|
-
};
|
|
51
|
-
}
|
|
52
|
-
/**
|
|
53
|
-
* Reset configuration to defaults
|
|
54
|
-
*/
|
|
55
|
-
export function reset_chat_config() {
|
|
56
|
-
cached_config = null;
|
|
57
|
-
}
|
|
58
|
-
// ============================================================================
|
|
59
|
-
// Helper Functions
|
|
60
|
-
// ============================================================================
|
|
61
|
-
/**
|
|
62
|
-
* Get environment variable as string with fallback
|
|
63
|
-
*/
|
|
64
|
-
function get_env_string(key, fallback) {
|
|
65
|
-
if (typeof process !== 'undefined' && process.env && process.env[key]) {
|
|
66
|
-
return process.env[key];
|
|
67
|
-
}
|
|
68
|
-
return fallback;
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Get environment variable as number with fallback
|
|
72
|
-
*/
|
|
73
|
-
function get_env_number(key, fallback) {
|
|
74
|
-
const value = get_env_string(key, '');
|
|
75
|
-
if (value) {
|
|
76
|
-
const parsed = parseInt(value, 10);
|
|
77
|
-
if (!isNaN(parsed)) {
|
|
78
|
-
return parsed;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
return fallback;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Get environment variable as boolean with fallback
|
|
85
|
-
*/
|
|
86
|
-
function get_env_boolean(key, fallback) {
|
|
87
|
-
const value = get_env_string(key, '');
|
|
88
|
-
if (value) {
|
|
89
|
-
return value.toLowerCase() === 'true';
|
|
90
|
-
}
|
|
91
|
-
return fallback;
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=config.js.map
|
package/dist/lib/config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,+BAA+B;AAC/B,MAAM,cAAc,GAAe;IACjC,kBAAkB,EAAE,IAAI;IACxB,iBAAiB,EAAE,IAAI;IACvB,cAAc,EAAE,IAAI;IACpB,WAAW,EAAE,OAAO;CACrB,CAAC;AAEF,uBAAuB;AACvB,IAAI,aAAa,GAAsB,IAAI,CAAC;AAE5C;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG;YACd,kBAAkB,EAAE,cAAc,CAAC,qCAAqC,EAAE,cAAc,CAAC,kBAAkB,CAAC;YAC5G,iBAAiB,EAAE,eAAe,CAAC,oCAAoC,EAAE,cAAc,CAAC,iBAAiB,CAAC;YAC1G,cAAc,EAAE,eAAe,CAAC,iCAAiC,EAAE,cAAc,CAAC,cAAc,CAAC;YACjG,WAAW,EAAE,cAAc,CAAC,8BAA8B,EAAE,cAAc,CAAC,WAAW,CAAC;SACxF,CAAC;IACJ,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,aAAa,GAAG;QACd,GAAG,eAAe,EAAE;QACpB,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAYD,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,QAAgB;IACnD,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QACtE,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC;IACpC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,QAAgB;IACnD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAAW,EAAE,QAAiB;IACrD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;IACxC,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/dist/lib/constants.d.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Default constants and configuration values for hazo_chat
|
|
3
|
-
*
|
|
4
|
-
* These values are used as fallbacks when config file is not available
|
|
5
|
-
* or specific values are not set.
|
|
6
|
-
*/
|
|
7
|
-
/** Default real-time update mode: 'polling' or 'manual' */
|
|
8
|
-
export declare const DEFAULT_REALTIME_MODE: "polling";
|
|
9
|
-
/** Default polling interval in milliseconds */
|
|
10
|
-
export declare const DEFAULT_POLLING_INTERVAL = 5000;
|
|
11
|
-
/** Default number of messages to load per page */
|
|
12
|
-
export declare const DEFAULT_MESSAGES_PER_PAGE = 20;
|
|
13
|
-
/** Default maximum file size in MB */
|
|
14
|
-
export declare const DEFAULT_MAX_FILE_SIZE_MB = 10;
|
|
15
|
-
/** Default allowed file types for upload */
|
|
16
|
-
export declare const DEFAULT_ALLOWED_TYPES: string[];
|
|
17
|
-
/** Default timezone */
|
|
18
|
-
export declare const DEFAULT_TIMEZONE = "GMT+10";
|
|
19
|
-
/** Map file extensions to MIME types */
|
|
20
|
-
export declare const MIME_TYPE_MAP: Record<string, string>;
|
|
21
|
-
/** File types that can be previewed in the document viewer */
|
|
22
|
-
export declare const PREVIEWABLE_TYPES: {
|
|
23
|
-
pdf: string[];
|
|
24
|
-
image: string[];
|
|
25
|
-
text: string[];
|
|
26
|
-
};
|
|
27
|
-
/** Breakpoint for mobile/desktop layout switch */
|
|
28
|
-
export declare const MOBILE_BREAKPOINT = 768;
|
|
29
|
-
/** Maximum retry attempts for failed operations */
|
|
30
|
-
export declare const MAX_RETRY_ATTEMPTS = 3;
|
|
31
|
-
/** Base delay for exponential backoff (ms) */
|
|
32
|
-
export declare const RETRY_BASE_DELAY = 1000;
|
|
33
|
-
/** Animation duration for UI transitions (ms) */
|
|
34
|
-
export declare const ANIMATION_DURATION = 200;
|
|
35
|
-
/** Placeholder text for deleted messages */
|
|
36
|
-
export declare const DELETED_MESSAGE_PLACEHOLDER = "This message has been deleted";
|
|
37
|
-
/** Text shown when no messages exist */
|
|
38
|
-
export declare const EMPTY_CHAT_MESSAGE = "No messages yet. Start the conversation!";
|
|
39
|
-
/** Text shown when loading messages */
|
|
40
|
-
export declare const LOADING_MESSAGES_TEXT = "Loading messages...";
|
|
41
|
-
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/lib/constants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,2DAA2D;AAC3D,eAAO,MAAM,qBAAqB,EAAG,SAAkB,CAAC;AAExD,+CAA+C;AAC/C,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAE7C,kDAAkD;AAClD,eAAO,MAAM,yBAAyB,KAAK,CAAC;AAE5C,sCAAsC;AACtC,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAE3C,4CAA4C;AAC5C,eAAO,MAAM,qBAAqB,UASjC,CAAC;AAEF,uBAAuB;AACvB,eAAO,MAAM,gBAAgB,WAAW,CAAC;AAMzC,wCAAwC;AACxC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAUhD,CAAC;AAEF,8DAA8D;AAC9D,eAAO,MAAM,iBAAiB;;;;CAI7B,CAAC;AAMF,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,MAAM,CAAC;AAErC,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,iDAAiD;AACjD,eAAO,MAAM,kBAAkB,MAAM,CAAC;AAMtC,4CAA4C;AAC5C,eAAO,MAAM,2BAA2B,kCAAkC,CAAC;AAE3E,wCAAwC;AACxC,eAAO,MAAM,kBAAkB,6CAA6C,CAAC;AAE7E,uCAAuC;AACvC,eAAO,MAAM,qBAAqB,wBAAwB,CAAC"}
|